Permuter 2 variables a et b ... [DETENTE][ALGO] - Programmation
Marsh Posté le 19-11-2001 à 14:00:35
tu me dis si je me trompe, mais la bidouille sans 3ième variable ne marche que sur des nombres, non?
Marsh Posté le 19-11-2001 à 14:12:11
dropsy: non, pkoi que avec des nombres?
je crois pas que ca existe pas sans troisieme var...
[edtdd]--Message édité par TheJackal--[/edtdd]
Marsh Posté le 19-11-2001 à 14:14:54
push a
push b
pop a
pop b
autre chose ? sinon y'a un bidouille à coups de xor je crois ...
Marsh Posté le 19-11-2001 à 14:23:01
TheJackal a écrit a écrit : dropsy: non, pkoi que avec des nombres? ca existe pas sans troisieme var |
bon, alors g pas la bonne méthode
moi je fais:
a=a+b;
b=a-b;
a=a-b;
mais c pas jolie pr une string
Marsh Posté le 19-11-2001 à 14:26:47
pour un char* non pas du tout
[edtdd]--Message édité par TheJackal--[/edtdd]
Marsh Posté le 19-11-2001 à 14:55:25
TheJackal a écrit a écrit : pour un char* non pas du tout |
caste le en long pour faire l'operation
Marsh Posté le 19-11-2001 à 15:19:54
BENB a écrit a écrit : caste le en long pour faire l'operation |
Marsh Posté le 19-11-2001 à 16:07:03
moi je dit avec ce coup la HelloWorld a droit a une promotion
ct quoi le deuxieme mot qu'ils ont dit
sinon dropsy il etait pas loin
Marsh Posté le 19-11-2001 à 16:23:29
Bien joue dropsy !
Donc je confirme :
a = a+b;
b = a-b;
a = a-b;
youdontcare>
push a
push b
pop a
pop b
t'utilises non pas une variable intermediaire mais carement deux ...
he! la pile, ca prend de la place !
Marsh Posté le 19-11-2001 à 16:25:45
bon, ben g bon ms se pose toujours le pbm des strings, non??
Marsh Posté le 19-11-2001 à 16:31:39
hum, c'est pas faux.
j'y avais pas pense a ca.
mais, attend voire ...
Code :
|
sattisfait ?
Marsh Posté le 19-11-2001 à 16:52:56
échange moi les valeurs,
a = (2^32)-1;
b = (2^32)-2;
avec a et b en unsigned long.
Marsh Posté le 19-11-2001 à 16:55:19
Problème connu en ASM pour échanger 2 valeurs quelconques :
a = a xor b
b = a xor b
a = a xor b
difficile de faire plus rapide en terme de cycle : 3 XOR au lieu de 3 MOV et une variable supplémentaire.
[edtdd]--Message édité par n0mad--[/edtdd]
Marsh Posté le 19-11-2001 à 17:13:06
BENB a écrit a écrit : caste le en long pour faire l'operation |
note que ça doit marcher, on ne fait qu'échanger des pointeurs, c'est des entiers
d'ailleurs char* est un entier, puisque pointeur vers une chaîne de caractère... (non ? je sais plus )
Marsh Posté le 19-11-2001 à 17:16:33
antp a écrit a écrit : note que ça doit marcher, on ne fait qu'échanger des pointeurs, c'est des entiers d'ailleurs char* est un entier, puisque pointeur vers une chaîne de caractère... (non ? je sais plus ) |
Oui ca marche.... mais c'est pas beau
Marsh Posté le 19-11-2001 à 17:31:55
HelloWorld a écrit a écrit : hum, c'est pas faux. j'y avais pas pense a ca. mais, attend voire ...
|
oui mais ................. i c bien une variable, non
alors ca compte qd même ou pas
Marsh Posté le 19-11-2001 à 17:34:12
BENB a écrit a écrit : Oui ca marche.... mais c'est pas beau |
pas beau ? on ne fait qu'échanger des pointeurs !!
c'est nettement plus beau que la solution de recopier caractère par caractère (quel est l'intérêt de bouger toute la mémoire quand il suffit de bouger les références)
Marsh Posté le 19-11-2001 à 19:02:43
tu prends, tu vires,
ca marche que sous certaines conditions. Puis alors, le coup des additions et soustractions de pointeur, faut pas déconner.
A = adresse X
B = X+1
A = A + B donne adresse de A = indéterminé = peut correspondre a une adresse d'un autre process ou thread. Il va apprécier le SE, s'il te jette pas avec un truc du genre ' A effectuer une opératon non conforme' de temps en temps je mange un balai
Vous vous entrainez pour postuler a un post chez Microsoft ou quoi ?
[edtdd]--Message édité par Barbarella--[/edtdd]
Marsh Posté le 19-11-2001 à 20:34:33
a=2
b=5
b=a+b // a=2, b=7
a=b-a // a=5, b=7
b=a-b // a=5, b=2
voila je crois que ca marche bien !!!
Marsh Posté le 19-11-2001 à 21:09:55
c plus lent que le premier ex, et puis essaye avec des pointeurs comme dropsy voulait faire
Marsh Posté le 20-11-2001 à 10:46:45
ah bon? je voulais faire ca avec des pointeurs?
non, ce que je dis, c que la solution que je donne marche pour ce qui est des nombres (et encore, à condition de pas dépasser les limites de ces nombres)
après, pour des pointeurs... c un autre pbm
Marsh Posté le 20-11-2001 à 10:52:37
je ne vois pas pourquoi la solution xor ne marcherait pas tout le temps et sur tous types de variables (flottants, entiers, pointeurs ...)
Marsh Posté le 20-11-2001 à 10:55:14
antp a écrit a écrit : pas beau ? on ne fait qu'échanger des pointeurs !! c'est nettement plus beau que la solution de recopier caractère par caractère (quel est l'intérêt de bouger toute la mémoire quand il suffit de bouger les références) |
c'est le cast qui n'est pas beau... et comme le dis Barbarella
le ponteur qui a recu a+b il pointe n'importe ou...
et il y a le Pb des limites sur les station HP sur lequelles je travaillais il n'y a pas si longtemps les adresse memoire commecaient toutes par 0x8.....
Marsh Posté le 20-11-2001 à 11:37:31
BENB a écrit a écrit : c'est le cast qui n'est pas beau... et comme le dis Barbarella le ponteur qui a recu a+b il pointe n'importe ou... et il y a le Pb des limites sur les station HP sur lequelles je travaillais il n'y a pas si longtemps les adresse memoire commecaient toutes par 0x8..... |
C'est pour ça que ma méthode avec XOR (un peu plus haut dans le thread) est bien plus soft car il n'y a pas de risque de dépassement.
Marsh Posté le 20-11-2001 à 12:56:32
C' est connu:
a^=b;
b^=a;
a^=b;
Mais c'est un artifice d'ecriture: a un moment donne, il y a un registre temporaire d'utilise.
A+,
Marsh Posté le 19-11-2001 à 13:59:24
bah c'est facile ...
c = a;
a = b;
b = c;
oui, mais savez vous que c'est possible sans troisieme varible !
Sans aucune variable intermediaire (et sans bidouille du genre l'instruction XCHG du processeur)
Alors, qui a une idee ?
---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite