Incrémeter une chaine unsigned char [Débutant] - C - Programmation
Marsh Posté le 28-05-2006 à 14:34:32
strikenet a écrit : Google est pas trés bavard sur le sujet... |
C'est comme si tu demandais à google comment boucler de 1 à 10. Il y a des trucs que personne n'écrit car il suffit d'un peu de réflexion...
strikenet a écrit : unsigned char chaine[]={0x00,0x00,0x00,...,0x00}; |
Sois tu utilises une fonction récursive, sois tu fais des boucles imbriquées
for (chaine[10]=0; chaine[10] < 0xff; chaine[10]++) |
Au fait, tu pourras jamais aller jusqu'à 0xff car si tu écris
for (chaine[x]=0; chaine[x] <= 0xff; chaine[x]++) |
Ben une fois que la chaine[x] atteint 0xff et qu'elle est incrémentée, elle repasse à 0 (hé oui, elle ne fait qu'un char) => boucle infinie !!!
Marsh Posté le 28-05-2006 à 15:46:13
Pourquoi tu parles d'utiliser des fonctions récursives alors que ce n'est pas un problème récursif ?
Sinon moi je ferai un truc du genre :
Code :
|
Marsh Posté le 28-05-2006 à 18:42:00
Tarabiscote a écrit : Pourquoi tu parles d'utiliser des fonctions récursives alors que ce n'est pas un problème récursif ? |
tout est récursif :
Code :
|
Je suis d'accord avec toi que ça ne présente aucun intérêt; mais bon.
Marsh Posté le 28-05-2006 à 19:29:38
Enfin ce nest pas ce que j'appelle du récursif.
Pour moi faire quelque chose de récursif, c'est (en très gros) réutiliser les valeurs précédentes afin de résoudre le problème.
Par exemple avec les tours de Hanoi (je sais exemple très connu) si on connais l'ensemble des coups précédents on peut trouver immédiatement le coup suivant, en itératif (on connais uniquement la situation actuel) c'est tout de suite plus dur (quand je dit dur c'est pas seulement écrire l'algorithme mais surtout la complexité du calcul).
Sinon quand on dit que les fonctions en C sont récursives c'est parce qu'elles recopient les valeurs hors ici seul les pointeurs sont recopié donc ce nest pas vraiment récursif (a moins que les anciens pointeurs te servent à quelque chose ?), tu aurais du plutôt recopier les tableaux à chaque appel (enfin je suis daccord cest inutile de faire du récursif donc on sen passera).
Marsh Posté le 28-05-2006 à 19:33:50
ReplyMarsh Posté le 28-05-2006 à 19:35:12
Trap D a écrit : tout est récursif :
Je suis d'accord avec toi que ça ne présente aucun intérêt; mais bon. |
Ca ne serait pas plutôt:
Code :
|
Marsh Posté le 28-05-2006 à 20:38:00
Sve@r a écrit : |
ouai, enfin tout overflow arithmetique entraine un comportement indefini (ca peut revenir à 0 ou rester bloqué au max ou autre). Il vaut mieux repasser explicitement à 0
Marsh Posté le 28-05-2006 à 20:59:14
KangOl a écrit : non ce que tu décris c'est le terme "incrémental" |
Quest ce que tu veux dire par incrémental ?
Sinon je n'arrive toujours pas à voir où est le récursif quand on empile des paramètres juste pour le plaisir de dépiler après que le calcul ne soit terminé.
L'intérêt c'est quand même bien d'utiliser ce que l'on a empilé non ?
Bien sûr le programme est récursif mais cette petite partie récursive ne fait absolument rien enfin ce n'est que mon point de vu.
Marsh Posté le 28-05-2006 à 21:11:59
http://fr.wikipedia.org/wiki/Fonction_r%C3%A9cursive
c'est clairement le cas ici !
par incrémental, je veux juste dire qu'on se base sur ce qui a été calculé avant pour faire le calcul courant
la plupart du temps pour résoudre ce genre de problème de manière fonctionnel, on utilise la récursivité
Marsh Posté le 28-05-2006 à 21:15:48
simple_stupid a écrit : Ca ne serait pas plutôt:
|
Ben non
Programme testé
Marsh Posté le 28-05-2006 à 21:28:20
Code :
|
m'enfin ...
Marsh Posté le 28-05-2006 à 21:49:54
Taz a écrit :
m'enfin ... |
Je suis fatigué où c'est vous, le but du jeu c'est d'obtenir 0xFF partout, pas 1 2 (simple_stupid) ou 1 0 (Taz) ...
Tu voulais sans doute écrire
Code :
|
Marsh Posté le 28-05-2006 à 22:00:50
Sinon y'a ça aussi en stock
Code :
|
Marsh Posté le 28-05-2006 à 22:07:17
skelter a écrit : enfin tout overflow arithmetique entraine un comportement indefini (ca peut revenir à 0 ou rester bloqué au max ou autre). |
Pas en C !!!
Tarabiscote a écrit : Enfin ce nest pas ce que j'appelle du récursif. |
Faire qqchose de récursif c'est s'appeler soi-même. Et t'es pas obligé de renvoyer une valeur calculée lors de l'appel infèrieur. Tu peux très bien avoir des fonctions récursives de type "void"
Regarde cet exemple
Code :
|
Tu passes à "affich" un nombre (par exemple 250) et une base (par exemple 7) et il t'affiche le nombre "250" en base "7" (en l'ocurrence 505)...
Oui, je sais, strtoul() le fait aussi mais c'était pour donner un exemple de récursivité sans récupération de valeur...
Marsh Posté le 28-05-2006 à 22:31:56
Trap D a écrit : Sinon y'a ça aussi en stock
|
T'as pas compris ce qu'il voulait faire.
Il veut toutes les valeurs de
{0, 0, ..., 0}
à
{0xff, 0xff, ..., 0xff}
en passant par exemple par:
{0,1, 18, 0xf}
Ton code donne pas toutes ces possibilités.
D'ailleurs, c'est stupide, parce que si c'est juste pour arriver à ton résultat, un memset suffit.
Marsh Posté le 28-05-2006 à 22:33:30
Taz a écrit : ??? |
Je crois qu'il veut aussi un affichage de chaque valeur intermédiaire (enfin c'est mon avis)
Si strikenet lit tout ce qu'on a écrit, il va vraiment nous prendre pour des foldingos
Marsh Posté le 28-05-2006 à 23:18:07
Bon, j'espère que j'ai compris maintenant :
Code :
|
, j'ai testé l'affichage sur 3 caractères et seulement jusqu'à 3, sinon j'y suis encore à 2 heures du matin.
Marsh Posté le 28-05-2006 à 23:29:59
Trap D a écrit : Bon, j'espère que j'ai compris maintenant :
|
On peut rendre l'affichage indépendant de la taille de la chaîne
Code :
|
Trap D a écrit : j'ai testé l'affichage sur 3 caractères et seulement jusqu'à 3, sinon j'y suis encore à 2 heures du matin. |
Tu peux réduire la plage de valeurs possibles en remplaçant "0xff" par "0x05"
PS: Ca sent bizarrement le "brute force hack" cet algo...
Marsh Posté le 28-05-2006 à 23:30:34
KangOl a écrit : http://fr.wikipedia.org/wiki/Fonction_r%C3%A9cursive |
Je remet pas en cause le fait que le programme soit bien récursif mais juste le fait que ça na aucun rapport avec le problème présent autrement dit dans le code généré il suffit (grosso modo) de remplacer le call par un jmp et ça fait le même chose si ce nest que ça supprime la récursivité qui ne fait absolument rien ici à part empiler et dépilé inutilement un pointeur et un entier dont on ne réutilisera jamais la valeur.
Donc oui on peut toujours écrire des fonctions récursives et non le problème ci-dessus nest pas récursif.
Voila jespère que je suis plus clair cette fois.
Marsh Posté le 29-05-2006 à 00:44:43
tout est recursif. Et la meilleur maniere d'ecrire ce genre de cochonenrie c'ets un algo recursif.
Marsh Posté le 29-05-2006 à 01:27:53
Joel F a écrit : tout est recursif. Et la meilleur maniere d'ecrire ce genre de cochonenrie c'ets un algo recursif. |
Si c'est une cochonerie de force 8, pas de problèmes :
http://mapage.noos.fr/emdel/goret.htm
Marsh Posté le 29-05-2006 à 08:20:58
Sve@r a écrit : Tu peux réduire la plage de valeurs possibles en remplaçant "0xff" par "0x05" |
C'est ce que j'avais fait
Pour ce qui est du hack, tout à fait d'accord.
Marsh Posté le 29-05-2006 à 10:00:12
Emmanuel Delahaye a écrit : |
Je ne vois pas pourquoi , on ets plus en 1980 et les compilo gére correctement ce genre de code ...
Marsh Posté le 29-05-2006 à 10:28:11
ReplyMarsh Posté le 29-05-2006 à 11:31:24
Joel F a écrit : Je ne vois pas pourquoi , on ets plus en 1980 et les compilo gére correctement ce genre de code ... |
La récursion terminale (tail recursion), oui. Mais si il faut de la pile, tout peut arriver...
Code :
|
C'est joli, mais ça peut fumer...
Marsh Posté le 29-05-2006 à 11:33:10
Taz a écrit : # Plus d'un return par fonction |
Tu parles du Pascal ? Je parle du C...
Marsh Posté le 29-05-2006 à 11:36:20
Emmanuel Delahaye a écrit : La récursion terminale (tail recursion), oui. Mais si il faut de la pile, tout peut arriver. |
C'est clairement le cas du probléme ...
Marsh Posté le 29-05-2006 à 11:45:50
Joel F a écrit : C'est clairement le cas du probléme ... |
Quel problème ?
Marsh Posté le 29-05-2006 à 12:24:05
Comme on parlait de récursif, voilà une méthode :
Code :
|
Marsh Posté le 29-05-2006 à 18:42:39
Salut,
Maintenant j'ai le choix. Merci à tous !
Il ne me reste plus qu'à étudier vos codes. Je retourne sur Dev C++.
Merci encore.
Marsh Posté le 29-05-2006 à 19:15:48
strikenet a écrit : Salut, |
T'as pas tellement le choix. Le seul code potable est celui de Trap D qui est simple et élégant. Tous les autres c'est que du délire sur la récursivité (qu'il faut éviter chaque fois qu'on peut)...
Marsh Posté le 29-05-2006 à 19:20:48
ReplyMarsh Posté le 29-05-2006 à 20:31:48
Emmanuel Delahaye a écrit : Si c'est une cochonerie de force 8, pas de problèmes : |
Heureusement que je ne programme pas en C, sinon mon code serai probablement inclassable, ou obligerait l'ajout d'une onzième force qui inclurait les dix précédentes. Enfin, je crois qu'il y a un peu de parti pris, et c'est normal, c'est ta page
Marsh Posté le 29-05-2006 à 20:34:36
++fab a écrit : Heureusement que je ne programme pas en C, sinon mon code serai probablement inclassable, ou obligerait l'ajout d'une onzième force qui inclurait les dix précédentes. Enfin, je crois qu'il y a un peu de parti pris, et c'est normal, c'est ta page |
Tu as tout compris.
Marsh Posté le 29-05-2006 à 20:54:36
Emmanuel Delahaye a écrit : La récursion terminale (tail recursion), oui. Mais si il faut de la pile, tout peut arriver...
|
Les compilos C arrivent à reconnaitre une récursion terminale et à "l'applatir" ?
Marsh Posté le 29-05-2006 à 21:03:47
Joel F a écrit : et genre le code de Trap D c'est pas du recursif ? |
Je parlais de sa fonction postée le 28 mai...
Code :
|
Marsh Posté le 28-05-2006 à 14:22:26
Salut,
J'ai un variable :
unsigned char chaine[]={0x00,0x00,0x00,...,0x00};
Je souhaites l'incrémenter :
{0x01,0x00,0x00,...,0x00};
{0x02,0x00,0x00,...,0x00};
....
jusqu'à
{0xFF,0xFF,0xFF,...,0xFF};
Google est pas trés bavard sur le sujet...
Merci d'avance