Accueil > Forum > > > > Pointeur int dans fonction récursive
Pointeur int dans fonction récursive
jeudi 29 mai 2008 à 03:47:49 |
Pointeur int dans fonction récursive

sudoku1983
|
J'ai un problème pour récupérer un entier qui est paramètre d'une fonction récursive. Cette fonction me renvoie une liste chainée et la valeur de l'entier doit être modifiée à chaque appel de fonction et me sert dans des boucles de la fonction; c'est pour ça que j'utilise un pointeur sur cet entier. Mon problème est que le programme me renvoie dans ma liste chainée un entier qui n'a rien à voir (-81265478 ou quelque chose du genre au lieu de 0 ou 1). Voici mon code complet. J'espère qu'il n'est pas trop long. Avec N=1, ça déconne et avec N>1, ça plante.
#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<string.h> #include<math.h> constint N=3; typedefstruct antichaine{ int tab[N]; struct antichaine *prec; struct antichaine *suiv; }chaine; double fact(int n); chaine chainer(int n, int c, int val[], int *max, chaine *debinf); void affichage(chaine ch[], int n, int nb_ch); void main(){ int n=N; int taille_esp=(int)pow((double)2,(double)n); int m=(int)n/2; int nb_ch=fact(n)/(fact(n-m)*fact(m)); //nombre de chaînes n=N; chaine *temp=NULL; temp=(chaine*)malloc(sizeof(struct antichaine));
int val[2]={0,1}; int i=0, j=0, k=0, c=n, max=2;
chaine *ch=(chaine*)calloc(nb_ch,sizeof(struct antichaine)); chaine *debinf=NULL; for(i=0;i<nb_ch;i++){ ch[i]=chainer(n,c,val,&max,debinf); } affichage(ch,n,nb_ch); } double fact(int n){ if(n<0){ exit (EXIT_FAILURE); } elseif(n==1 || n==0){ return1; }return n*fact(n-1); } chaine chainer (int n,int c, int val[], int *max, chaine *debinf){ int k,l; chaine *deb=(chaine*)malloc(sizeof(struct antichaine)); chaine *parcours; chaine *parcoursinf; chaine *tmp; deb->prec=NULL; deb->suiv=NULL; parcours=deb; if(debinf==NULL || (*max)<0){ (*max)=2; if(n>1){ debinf=(chaine*)malloc(sizeof(struct antichaine)); *debinf=chainer(n-1,c,val,max,debinf); } elseif(n=1){ for(k=0;k<2;k++){ tmp=(chaine*)malloc(sizeof(struct antichaine)); tmp->prec=NULL; tmp->suiv=NULL; tmp->tab[n-1]=val[k]; parcours->suiv=tmp; tmp->prec=parcours; tmp->suiv=NULL; parcours=parcours->suiv; } while(parcours->prec!=NULL){ parcours=parcours->prec; } return *parcours; } elseif(n==0){ exit (EXIT_FAILURE); } } elseif(debinf!=NULL){ parcoursinf=debinf; for(k=0;k<(*max);k++){ tmp=(chaine*)malloc(sizeof(struct antichaine)); tmp->prec=NULL; tmp->suiv=NULL; for(l=0;l<n-1;l++){ tmp->tab[l]=parcoursinf->tab[l]; } tmp->tab[n-1]=val[k]; parcours->suiv=tmp; tmp->prec=parcours; tmp->suiv=NULL; parcours=parcours->suiv; } parcoursinf=parcoursinf->suiv; while(parcoursinf!=NULL){ tmp=(chaine*)malloc(sizeof(struct antichaine)); tmp->prec=NULL; tmp->suiv=NULL; for(l=0;l<n-1;l++){ tmp->tab[l]=parcoursinf->tab[l]; } tmp->tab[n-1]=val[(*max)]; parcours->suiv=tmp; tmp->prec=parcours; tmp->suiv=NULL; parcours=parcours->suiv; parcoursinf=parcoursinf->suiv; } debinf=debinf->suiv; free(debinf->prec); (*max)=(*max)-1; } while(parcours->prec!=NULL){ parcours=parcours->prec; } return *parcours; } void affichage(chaine ch[], int n, int nb_ch){ int i,j; for(i=0;i<nb_ch;i++){ while(ch[i].suiv!=NULL){ for(j=0;j<n;j++){ printf("%d",ch[i].tab[j]); } ch[i]=*ch[i].suiv; printf(" "); } printf("\n"); } }
|
|
jeudi 29 mai 2008 à 09:57:21 |
Re : Pointeur int dans fonction récursive

jfrancois
|
Bonjour, Un petit point qui ne règle pas le problème mais qui existe ! elseif(n=1){ <--- (n == 1) for(k=0;k<2;k++){
Jean-François
|
|
jeudi 29 mai 2008 à 11:41:40 |
Re : Pointeur int dans fonction récursive

jfrancois
|
Je ne sais pas ce que ce code fait, ou est sensé faire, car c'est incompréhensible et ça plante dès le début. Si c'est une gestion de liste chaînée (les pointeurs "prec" et "suiv" le laisse penser) alors il ne doit pas y avoir d'allocation mémoire de l'ensemble de la chaîne ("calloc" dans "main"), ça c'est pour un tableau pas pour une liste ! Et il ne devrait y avoir qu'une seule allocation mémoire, quand on ajoute un élément à la liste, pas 6 comme ici (sans compter l'allocation de "temp" dans "main" qui n'est pas utilisé). Ce programme est sensé faire quoi au juste ? Un exemple de liste ? Jean-François
|
|
jeudi 29 mai 2008 à 14:36:01 |
Re : Pointeur int dans fonction récursive

sudoku1983
|
En fait, il s'agit d'un tableau de listes doublement chainées. Chaque élément de la liste contient un tableau. Pour que le travail à faire par le programme soit plus clair, je vais donner un exemple (c'est un problème mathématique) après une courte présentation. L'espace est une combinaison de plusieurs vecteurs de taille 2 dont les valeurs possibles sont 0 ou 1. Le nombre de vecteur est N. Le but étant de trouver un nombre minimum d'antichaine pour représenter l'espace. Une antichaine se compose de combinaisons des vecteurs de départ. Chaque antichaine est représentée par une liste doublement chainée et l'ensemble de l'espace sera le tableau qui contiendra les listes doublement chainées.
Exemple: si N=2, il existe 2 antichaines (nb_ch dans le code) qui seront * 00-01-11 * 10 si N=3, il existe 3 antichaines qui seront * 000-001-011-111 * 010-110 * 100-101
si N=4, il existe 6 antichaines
si N=5, il existe 10 antichaines, puis ça augmente de plus en plus avec N (mais ça ne peut pas être multiplier par plus que 2 quand on passe de N à N+1)
|
|
jeudi 29 mai 2008 à 21:30:51 |
Re : Pointeur int dans fonction récursive

jfrancois
|
Un tableau de listes chaînées ok je comprends mieux comme ça, par contre je ne vois pas la logique de la construction de chacune des listes chaînées ! Je découvre ce sujet des "antichaînes" et j'ai rien trouvé de clair sur Google ! Jean-François
|
|
vendredi 30 mai 2008 à 02:20:04 |
Re : Pointeur int dans fonction récursive

sudoku1983
|
Merci pour ton intérêt, Jean-François. J'ai déjà réussi à régler une partie du problème qui était l'affichage de -8452368664 (un truc du genre mais je pense que c'était toujours la même valeur). Pour cela, j'ai mis le deuxième élément de la liste chainée en première position et j'ai bien le résultat escompté, c'est-à-dire 0 et 1 pour N=1. Mais je ne comprend pas pourquoi le premier élément de ma liste avait une valeur aléatoire car je pensais y affecter la bonne valeur directement et je vois pas d'où peut venir ce premier élément aléatoire. Mais bon, c'est réglé, donc je ne vais pas trop me plaindre. Le plus gros problème, c'est que ça plante pour N>1, or pour N=1, le résultat est immédiat et le programme est donc inutile. C'est bien les N plus grands que 1 qu'il y a un intérêt au programme.
Pour ce qui est des antichaines, je peux te dire que c'est un domaine assez étroit des mathématiques et que peu de gens travaillent dessus. En conséquence, il n'y a pas grand chose sur internet et il n'y a que les mathématiciens qui ont des travaux là-dessus qui s'échangent des informations sur le sujet lors de séminaires ou de rencontre de travail. Si tu veux, je peux te donner le lien du site où se trouve l'article scientifique traitant des antichaines et qui contient l'algorithme que j'essaye d'implémenter. Ça se trouve sur Numdam, un site d'articles mathématiques et un des auteurs a pour nom Lenca.
|
|
Cette discussion est classée dans : int, chaine, tmp, parcours, suiv
Répondre à ce message
Sujets en rapport avec ce message
Pointeur dans fonction récursive [ par sudoku1983 ]
Bonjour. J'ai un problème avec mon programme, il plante tout le temps. Je vous ai mis le code ci-dessous. Le problème se situe dans la fonction "cha
liste doublement chainée [ par sudoku1983 ]
Je suis débutant et j'ai un problème avec ma liste doublement chainée. Quand j'essaie de créer plus de 2 éléments, ça plante. Je n'ai aucune erreur de
Gestion de plusieurs ports RS232 [ par dissezfr ]
Bonjour à tous d'abordJ'ai récupéré un code sur le site permettant de géré un port série, j'aimerai piloter 8 (voir +) ports série avec un seul ordina
algorithme de tri [ par chegue02 ]
Bonjour, svp vous pouvez mé corrigé ce code concernant l'algorithme de tri merci d'avance #include #include // fonction qui permet de trier tab en
Error LNK2019 [ par issam000000 ]
bonjour ,je suis débutant en programmation , je arrive pas a résoudre cette erreur , quand je compile tout ce passe bien , 0 erreur 0 avertissement ,
affichache d'un document en c [ par godar8 ]
j'ai fait un programe d'editeur de texte en c pour cretion document , ajout , supprimer etcmais j'ai un petit mon document ne s'affiche pas pour
formattage en C algorithme [ par develdelphi ]
Bonjour,Je souhaiterai savoir à quoi sert exactement ce code:il me emblerai qu'on retourne un tableau de int ?#define unsigned char Byteunsigned int
Decouper un gos bmp en plusieur petit (par rapport au handle) ???? [ par SnOOpss ]
Bonjour tout le monde !!Voila en fait pr un RPG mon moteur 2d utilise le procedure suivantefichierbmp[0] = LoadABitmap("wall.bmp");avec HBITMAP LoadAB
regler la taille d'une chaine de caractere en fontion d'une int [ par shadow1779 ]
Bonjour, je cherche a faire un ptit systeme pour mettre un gros fichiers en partie, pour cela j'utilise une chaine de caractere qui me sert de tampon
insertion d'un int dans une chaine de caractère (string) [ par Apache_31 ]
Bonjour j'ai un problème avec ma requête MYSQL.en effet j'utilise la fonction mysql_query(Connection,"insert into table values (valeur 1, valeur 2) ")
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|