Bonjour,
Quel est le principe de ce sous-forum ?
Le 1er défi est-il de le deviner ? ;)
Le suivant en est-il un ?
Amicalement,Citation:
Comment swapper 2 entiers sans utiliser une autre variable ?
Philippe
Version imprimable
Bonjour,
Quel est le principe de ce sous-forum ?
Le 1er défi est-il de le deviner ? ;)
Le suivant en est-il un ?
Amicalement,Citation:
Comment swapper 2 entiers sans utiliser une autre variable ?
Philippe
Le principe de ce sous-forum est de proposer des défis à ceux qui ont envie de les relever.
L'équipe Office est en train de vous en préparer un.
Afin que ce sous forum ne devienne pas un gros ****** sans nom, si vous avez des défis à proposer, il faudra que ce soit selon les règles que nous finissons d'élaborer.
Cordialement,
c'est juste pour le funCode:
1
2
3
4
5
6
7
8
9
10
11 Sub swap() Dim a As Variant Dim b As Variant a = 10 b = 20 a = a + b b = a - b a = a - b MsgBox ("a" & a & "b" & b) End Sub
à l'utilisation c'est moins rapide
amicalement
Bonjour Random,
Une solution alternative pour des entiers (ne pas utiliser en production !):
A bientôt, je pense...;)Code:
1
2
3
4
5
6
7
8
9
10
11 Sub swap() Dim a As Variant Dim b As Variant a = 10 b = 20 a = a Xor b b = a Xor b a = a Xor b MsgBox ("a" & a & "b" & b) End Sub
Amicalement,
Philippe
bravo, effectivement c'est mieux que l'addition qui pose le pb du débordement.
d'un autre côté le débordement sur des variants c'est assez rare
oui tu as raison random, mais rare n'est pas impossible :lol:
ta proposition reste encore de toute facon la meilleur. :lol:
moi j'aurais encore proposé un truc du genre:
ben je met a dans une table, b dans a puis récupérer a de ma table pour le mettre dans b.
puisque a dans la table n'est pas une variable mais un champ! lol
Citation:
Envoyé par vodiem
sauf que pour récupérer a tu seras obliger d'utiliser un recordset, donc une variable !:mouarf:
es tu sur que c'est le seul moyen? :mouarf:
remarque je me demandais, avec mes idées tordues:
philben parle d'entier et vous utilisez des variants, dans ce cas:
un entier Long occupant 4 octect et un Variant 16 (si je me souviens bien du quizz tofalu) il reste de la place dans le Variant... :lol:
voici ma question:
il est pas possible d'obtenir @ mémoire d'un variant? avoir un pointeur, lire, copier directement en mémoire dans access? je parle de ca pour les manipulations de tableau.
?
Allez hop !
Je fais mon bourrin !
Code:
1
2
3
4
5 SaveSetting "MySwap", "Swapping", "Key_A", CStr(a) SaveSetting "MySwap", "Swapping", "Key_B", CStr(b) a = CLng(Trim(GetSetting("MySwap", "Swapping", "Key_B"))) b = CLng(Trim(GetSetting("MySwap", "Swapping", "Key_A"))) DeleteSetting "MySwap"
Ben, si on a droit aux variant, trop fastoche.
Allez, encore moins efficace :
Code:
1
2
3
4
5
6
7
8
9
10 Sub swap() Dim a As Variant Dim b As Variant a = 10 b = 20 a = a & "|" & b b = Val(a) a = Val(Mid(a, InStr(1, a, "|") + 1)) MsgBox ("a" & a & "b" & b) End Sub
si on définit a et b comme des integer, et non comme le contenu de variant
la seule solution que je trouve est celle de philben qui reste la plus élégante
ceci me semble un bon exemple de la difficulté à trouver un énoncé non équivoque des défis
Euh... il a parlé d'entier, pas d'integer !Citation:
Envoyé par random
Ca pourrait être des Long ou des Byte !
:lol:
Kwâââââ !Citation:
Envoyé par random
t'aimes pas ma méthode !!!???
:lol: :lol: :lol:
j'adore ta méthode
mais elle utilise 10 variables dont 8 ne sont pas en mémoire vive
10 "variables pas en mémoire vive" ????
Ca veut pas dire grand chose ça !
:lol: :lol:
:lol: :lol:
:lol: :lol:
:lol: :lol:
tu dis ça non seulement parceque c'est vrai:oops:
mais parceque je n'ai pas accordé à la beauté de ta solution incomparable
l'émerveillement qui lui était du^.:D :D :D
ben oui quoi !
C'est moi le roi !
où est l'horreur qui m'est dû (non non ! je n'ai pas fait de faute de frappe :lol:)
Bon, allez, ca tourne au troll !
La solution de Philben est très intéressante.
:bravo:
Je pense qu'on peut sans conteste lui attribuer la palme pour cette solution.
merci, mais le coup du <savesetting>, il fallait aller le chercher celui-là !:king:
Amicalement,
Philippe
Pour sûr qu'il fallait aller la chercher !
C'est sûr que si tu ne cherches pas la performance, c'est le bon choix !
Tiens, pour rigoler, essaye ce code :
Tu verras les resultats !Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 Option Explicit Sub testeur() Dim n0 As Double Dim n1 As Double Dim i As Long n0 = Timer For i = 0 To 1000 swapphilben Next n1 = Timer Debug.Print "Philben : " & n1 - n0 n0 = Timer For i = 0 To 1000 swapmaxence Next n1 = Timer Debug.Print "Maxence : " & n1 - n0 n0 = Timer For i = 0 To 1000 swappapy Next n1 = Timer Debug.Print "Papy : " & n1 - n0 End Sub Sub swapphilben() Dim a As Variant Dim b As Variant a = 10 b = 20 a = a Xor b b = a Xor b a = a Xor b End Sub Sub swapmaxence() Dim a As Variant Dim b As Variant a = 10 b = 20 SaveSetting "MySwap", "Swapping", "Key_A", CStr(a) SaveSetting "MySwap", "Swapping", "Key_B", CStr(b) a = CLng(Trim(GetSetting("MySwap", "Swapping", "Key_B"))) b = CLng(Trim(GetSetting("MySwap", "Swapping", "Key_A"))) DeleteSetting "MySwap" End Sub Sub swappapy() Dim a As Variant Dim b As Variant a = 10 b = 20 a = a & "|" & b b = Val(a) a = Val(Mid(a, InStr(1, a, "|") + 1)) 'MsgBox ("a" & a & "b" & b) End Sub
Chez moi, ca donne :
tu comprends le côté "bourrin" du code !Citation:
Philben : 0
Maxence : 5,671875
Papy : 0,0078125
:lol: :lol: :lol:
allez, la palme t'es dûe !
fais pas de chichis !
:lol: