XL 2016 VBA - Convertir 2 Long en LongLong

Dudu2

XLDnaute Barbatruc
Bonjour,

J'ai des fonctions qui savent convertir une structure POINTAPI en LongLong.
Mais j'aimerais convertir directement 2 Long en 1 LongLong (le premier sur les 32 premiers bits, le deuxième sur le 32 derniers).
Par quoi multiplier le 1er ? 2 ** 32 ? Avant d'ajouter le 2ème. Ça ne marche pas !
Merci par avance.
 
Dernière édition:
Solution
Sinon je mets dans ce post-solution cette conversion simple qui fonctionne... jusqu'à preuve du contraire !
VB:
#If Win64 Then    
    Function TwoLongToLongLong(X As Long, Y As Long) As LongLong
        TwoLongToLongLong = Y * 2 ^ 32 + X
    End Function
#End If

Ou encore:
Code:
Private Type POINTAPI
    X As Long
    Y As Long
End Type

#If Win64 Then
    Function POINTAPIToLongLong(Pt As POINTAPI) As LongLong
        POINTAPIToLongLong = Pt.Y * 2 ^ 32 + Pt.X
    End Function
#End If

Dudu2

XLDnaute Barbatruc
Oui mais il faut déclarer un POINTAPI et un POINTAPI_AsLongLong ou utiliser un CopyMemory.
Je trouve ça un peu lourd !

Par exemple:
VB:
#If Win64 Then 
    Private Type POINTAPI
        X As Long
        Y As Long
    End Type

    Private Type POINTAPI_AsLongLong
        Value As LongLong
    End Type
#End If

#If Win64 Then
    '----------------------------
    'Convert two Long to LongLong
    '----------------------------
    Function TwoLongToLonLong(x1 As Long, x2 As Long) As LongLong
        Dim Pt As POINTAPI
        Dim t As POINTAPI_AsLongLong
      
        Pt.X = x1
        Pt.Y = x2
        LSet t = Pt
       
        'Return value
        TwoLongToLonLong = t.Value
    End Function
#End If
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
tu obtiens combien avec x1=2 et x2=4
1699105283187.png
 

Dudu2

XLDnaute Barbatruc
A priori ça semble vrai, mais est-ce TOUJOURS vrai en fonction du processeur ?
Je ne comprends pas pourquoi c'est x2 qui doit prendre la puissance 32 !
A moins que le LongLong soit stocké comme ça.

VB:
Sub a()
    Dim x1 As Long
    Dim x2 As Long
    Dim LL As LongLong
  
    x1 = 1
    x2 = 2
  
    [A1].Value = TwoLongToLonLong(x1, x2)
    LL = x2 * (2 ^ 32) + x1
    [A2].Value = LL
End Sub
 

Dudu2

XLDnaute Barbatruc
Sinon je mets dans ce post-solution cette conversion simple qui fonctionne... jusqu'à preuve du contraire !
VB:
#If Win64 Then    
    Function TwoLongToLongLong(X As Long, Y As Long) As LongLong
        TwoLongToLongLong = Y * 2 ^ 32 + X
    End Function
#End If

Ou encore:
Code:
Private Type POINTAPI
    X As Long
    Y As Long
End Type

#If Win64 Then
    Function POINTAPIToLongLong(Pt As POINTAPI) As LongLong
        POINTAPIToLongLong = Pt.Y * 2 ^ 32 + Pt.X
    End Function
#End If
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Mais ça fonctionne sur 2 et donc sur N car il n'y a pas de test sur 2.

je me demande alors pourquoi tu do/loop

tu dis que ça peut marcher su N perso j'en suis pas sur
tu ne fait que visiter la gauche avec le monitorfrompoint(negatif )
qui sait on peut en avoir 1 de chaque coté du point(0,0) ;)
un au point(-1,1)'donc à gauche
un au point(1,1)'au milieu
un au point(1+Mi.rcmonitor.right de l'ecran du milieu,1) 'donc à droite
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
tu dis que ça peut marcher su N perso j'en suis pas sur
Tu mets en doute mon code ?
1699112115278.gif


Eh bé, tu as raison !
Et ce n'est pas parce que je pars de la gauche à -10**6.
C'est parce que je ne pars pas aussi du haut à -10**6

Car 2 écrans (ou plus) peuvent être juxtaposés en vertical. Et ça je n'y avais pas pensé
1699112238487.gif
.
Mais du coup, je suis plus tout à fait sûr du scan
1699112369133.gif
. Je pense qu'il faut y réfléchir.
 

Discussions similaires

Réponses
12
Affichages
319

Statistiques des forums

Discussions
312 216
Messages
2 086 351
Membres
103 195
dernier inscrit
martel.jg