Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1170 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[Débutant] Incrémeter une chaine unsigned char

n°1377009
Sve@r
Posté le 29-05-2006 à 21:03:47  profilanswer
 

Reprise du message précédent :

Joel F a écrit :

et genre le code de Trap D c'est pas du recursif ? [:pingouino]


Je parlais de sa fonction postée le 28 mai...

Code :
  1. void inc(unsigned char *chaine, int taille)
  2. {
  3.     int t= 0;
  4.     while (t < taille)
  5.     {
  6.         printf("%d %d %d\n", chaine[0], chaine[1], chaine[2]);
  7.         t = 0;
  8.         while (t < taille && ++chaine[t] == 0xFF)
  9.         {
  10.             chaine[t] = 0;
  11.             t++;
  12.         }
  13.     }
  14. }


Message édité par Sve@r le 29-05-2006 à 21:06:30

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
mood
Publicité
Posté le 29-05-2006 à 21:03:47  profilanswer
 

n°1377012
Taz
bisounours-codeur
Posté le 29-05-2006 à 21:17:08  profilanswer
 

Emmanuel Delahaye a écrit :

:ouch:  Tu parles du Pascal ? Je parle du C...


non je sais, pas je ne comprends pas trop ce précept. ça me rappelle le pascal. Et je n'aime pas ta manière de structurer : ça donne des dizaines de if imbriqués parce que tu préfères tout à un return. question de goût.

n°1377013
Taz
bisounours-codeur
Posté le 29-05-2006 à 21:20:48  profilanswer
 

0x90 a écrit :

Les compilos C arrivent à reconnaitre une récursion terminale et à "l'applatir" ?


bof. ici il faut respecteur l'ordre d'appel. seulement c'est facile de faire le free avant le free_list et ça devient terminal.

n°1377063
Emmanuel D​elahaye
C is a sharp tool
Posté le 29-05-2006 à 22:20:54  profilanswer
 

Taz a écrit :

bof. ici il faut respecteur l'ordre d'appel. seulement c'est facile de faire le free avant le free_list et ça devient terminal.


Ben oui, mais ça ne fonctionne plus. (histoire de branche, de scie...)
 
Si j'ai donnée cet exemple c'est qu'à ma connaissance (faible en Théorie de l'Information), cette fonction n'est pas récursive terminale. Elle fonctionne justement sur le principe de l'empilage et de l'exécution inverse. On descend très profond pour atteindre la fin de la liste en empilalnt les adresses à libérer, et lors des returns implicites, tous les free() sont appelés dans l'ordre inverse. Mais pour ça, il faut obligatoirement de la pile (mémoire auto). Comme elle est incontrôlable de manière portable (oui, il existe des extensions), risque de décès prématuré par explosion de la mémoire automatique...
 
Mais je serais heureux qu'on me prouve que je me trompe.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1377068
Emmanuel D​elahaye
C is a sharp tool
Posté le 29-05-2006 à 22:24:30  profilanswer
 

Taz a écrit :

non je sais, pas je ne comprends pas trop ce précept. ça me rappelle le pascal. Et je n'aime pas ta manière de structurer : ça donne des dizaines de if imbriqués parce que tu préfères tout à un return. question de goût.


En ce qui me concerne, ça m'a toujours permi d'écrire du code robuste, lisible et maintenable. Ca me suffit.
 
Par contre quasiment à chaque fois que je suis tombé sur du code non structuré, j'ai trouvé des bugs (ressources non libérées ou libérées 2 fois, valeur de retour non initialisées...), ou des redondances...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1377070
Emmanuel D​elahaye
C is a sharp tool
Posté le 29-05-2006 à 22:26:28  profilanswer
 

0x90 a écrit :

Les compilos C arrivent à reconnaitre une récursion terminale et à "l'applatir" ?

Avec un appel de fonction après l'appel récursif ? Tu peux le prouver ? J'ai cru comprendre que seule la récursion terminale était 'aplatissable' ?
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1377074
0x90
Posté le 29-05-2006 à 22:29:42  profilanswer
 

Emmanuel Delahaye a écrit :

Avec un appel de fonction après l'appel récursif ? Tu peux le prouver ? J'ai cru comprendre que seule la récursion terminale était 'aplatissable' ?


 
Arf ma question était de savoir s'ils savaient le faire pour de la terminale justement ;)
 
Effectivement la fonction que t'as posé en dessous ne l'est pas. (Ca me fait bizarre de parler de ca en C, des souvenirs de Scheme qui remontent à la surface :/) et dans tout les cas il ne pourra pas l'applatir.


Message édité par 0x90 le 29-05-2006 à 22:30:19

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1377087
Taz
bisounours-codeur
Posté le 29-05-2006 à 22:37:43  profilanswer
 

Code :
  1. void free_list (struct node *p)
  2. {
  3.    struct node *next = p->next;
  4.    free(p);
  5.    if (next != NULL)
  6.       free_list (next);
  7. }

euh ça fonctionne pas ça ?

n°1377091
0x90
Posté le 29-05-2006 à 22:49:44  profilanswer
 

Taz a écrit :

Code :
  1. void free_list (struct node *p)
  2. {
  3.    struct node *next = p->next;
  4.    free(p);
  5.    if (next != NULL)
  6.       free_list (next);
  7. }

euh ça fonctionne pas ça ?


 
Bha la c'est une récursive terminale.
Dans un cas comme ca, le compilo arrive à générer du code qui fasse pas péter la pile ou il reste sur l'implémentation naive ?


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1377099
Emmanuel D​elahaye
C is a sharp tool
Posté le 29-05-2006 à 23:03:18  profilanswer
 

Taz a écrit :

Code :
  1. void free_list (struct node *p)
  2. {
  3.    struct node *next = p->next;
  4.    free(p);
  5.    if (next != NULL)
  6.       free_list (next);
  7. }

euh ça fonctionne pas ça ?

Ben si, mais ça doit être laid, autant écrire directement la version itérative...

Code :
  1. void free_list (struct node *p)
  2. {
  3.    while (p != NULL)
  4.    {
  5.       struct node *next = p->next;
  6.       free(p);
  7.       p = next;
  8.    }
  9. }


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le 29-05-2006 à 23:03:18  profilanswer
 

n°1377186
Joel F
Real men use unique_ptr
Posté le 30-05-2006 à 09:12:08  profilanswer
 

On est tous d'accord pour dire que la récursivité caipalapanacai... Il faut néanmoisn ne pas se voiler la face, ca rends des services dans des domaines et des applications bien DEFINIS !  
 
Voial, loin de moi l'idée d'en mettre partout :o mais quand ca :
1/ simplifie l'ecriture
2/ ne pete pas la pile
3/ reste compréhensible vis à vis du probleme.
Ca me va.  
 
Un probleme naturellement récursif, autant l'ecrire comme telle (parcours d'arbre etc ... par exemple). Par contre si les perfs (vitesse OU memoire) deviennent mauvaise, alors faudra penser à reecrire ça  "à plat". Le compilo il sait pas faire :s

n°1377227
Trap D
Posté le 30-05-2006 à 09:58:32  profilanswer
 

De toute façon, si lers perfs deviennent mauvaises, en dérécursivant (si c'est un véritable programme récursif, pas un de ceux qui se résolvent par une simple itération), souvent on aura besoin de piles ou de files, avec gestion mémoire, cà ralentira quand même, la seule différence c'est qu'on fera appel à la mémoire globale, plus à la pile, donc moins de risque.
 
Et pis la récursivité c'est beau, c'est élégant  :kaola:  
 
J'attends qu'on dérécursive la fonction d'Ackermann.

n°1377651
Sve@r
Posté le 30-05-2006 à 16:11:36  profilanswer
 

Joel F a écrit :

On est tous d'accord pour dire que la récursivité caipalapanacai... Il faut néanmoisn ne pas se voiler la face, ca rends des services dans des domaines et des applications bien DEFINIS !  
 
Voial, loin de moi l'idée d'en mettre partout :o mais quand ca :
1/ simplifie l'ecriture
2/ ne pete pas la pile
3/ reste compréhensible vis à vis du probleme.
Ca me va.  
 
Un probleme naturellement récursif, autant l'ecrire comme telle (parcours d'arbre etc ... par exemple). Par contre si les perfs (vitesse OU memoire) deviennent mauvaise, alors faudra penser à reecrire ça  "à plat". Le compilo il sait pas faire :s


 
Personnellement, je suis d'avis d'éviter la récursivité chaque fois qu'on peut. Bon, évidemment, pour un parcours d'arbre c'est impossible (ou alors on simule la récursivité en gérant nous-même l'empilement des variables mais il ne s'agit là que d'un couche de peinture pour masquer la crasse).
 
Certes, une fonction récursive apparaît souvent comme très élégante à écrire "return f(n - 1)" et hop, en 2 lignes c'est torché mais derrière, faut voir ce qu'il se passe. Surtout que quand tu parles de récursivité, tu sous entend probablement "récursivité simple" comme "factorielle" ou "arbre". Mais faut pas oublier qu'on peut avoir aussi des récursivités doubles et là, c'est la cata...
Regarde Fibonacci...
En récursif

Code :
  1. unsigned long fib(unsigned short n)
  2. {
  3.     switch (n)
  4.     {
  5.           case 0:   // Cas U0
  6.               return 1;
  7.           case 1:  // Cas U1
  8.               return 2;
  9.           default: // Cas classique
  10.               return fib(n - 2) + fib(n - 1);
  11.     }
  12. }


 
En itératif

Code :
  1. unsigned long fib(unsigned short n)
  2. {
  3. unsigned long U[3]={1, 2};
  4. unsigned short i;
  5. if (n == 0 || n == 1)
  6.  return U[n];
  7. // Boucle de Fibonacci
  8. for (i=2; i <= n; i++)
  9. {
  10.  // Calcul valeur finale
  11.  U[2]=U[0] + U[1];
  12.  // Décalage pour l'itération suivante
  13.  U[0]=U[1];
  14.  U[1]=U[2];
  15. }
  16. // Renvoi du résultat (dernier U2)
  17. return U[2];
  18. }


 
En récursif, le simple calcul de "fib(6)" nécessitera l'empilement de

  • 1 fois fib(5)
  • 2 fois fib(4)
  • 3 fois fib(3)
  • 5 fois fib(2)
  • 8 fois fib(1)
  • 13 fois fib(0)


Alors qu'en itératif, le calcul de "fib(6)" se fera dans une simple boucle avec 2 décalages et une addition par tour de boucle.
Essaye de calculer "fib(24)" avec les 2 méthodes et tu comprendras ta douleur...  :D
 
PS: je viens de regarder Ackerman et là, c'est moi qui contemple ma propre douleur  :pt1cable:


Message édité par Sve@r le 30-05-2006 à 16:38:40

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1377671
Taz
bisounours-codeur
Posté le 30-05-2006 à 16:49:25  profilanswer
 

euh complité ta version itérative :o

n°1377674
Taz
bisounours-codeur
Posté le 30-05-2006 à 16:50:04  profilanswer
 

ou alors c'est juste ton tableau et son joli nom qui embrouille pour rien.

n°1377724
Sve@r
Posté le 30-05-2006 à 17:54:58  profilanswer
 

Taz a écrit :

ou alors c'est juste ton tableau et son joli nom qui embrouille pour rien.


Boaf... pourquoi pas un tableau puisque j'ai 3 valeurs à gérer qui appartiennent à un même ensemble ??? J'ai mis "U" juste en référence aux maths qui parlent souvent de "suite de Fibonacci" et dont les termes sont nommés "Un", Un+1" et "Un+2"
Tu peux évidemment utiliser "a, b et c" si t'as du mal avec les tableaux....  :D
 
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Comment connaitre le nombre de char dans une fichier texte.txtRécupération de l'adresse ip avec recvfrom() [Débutant]
[Access] requete SQL, comment connaitre la taille d'une chaine ?suppression d'une partie de chaine de caractère
débutant en java scripttout sauf une chaîne dans un egexp
[JAVA Débutant] KeyListerner sur JFrame OK, mais sur un JPanel ?[débutant][java]convertir html en xml
[débutant]convertir html en xml[JAVA Débutant] JPanel, JFrame et Paint() --> Help :(
Plus de sujets relatifs à : [Débutant] Incrémeter une chaine unsigned char


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR