Quelqu'un veut bien m'aider?

Quelqu'un veut bien m'aider? - C - Programmation

Marsh Posté le 08-01-2006 à 15:08:53    

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void affiche(int t[],int n)
  4. {
  5.   int i;
  6.  
  7.   printf("Voici le tableau \n" );
  8.   for(i=0;i<n;i++)
  9.     printf("Element %d : %d \n",i,t[i]);
  10. }
  11. int contexte( char *t) //tri contexte
  12. {
  13.     int p,q;
  14.     int longueur=strlen(t);
  15.     int i;
  16.    
  17.    
  18.      int c[longueur];
  19.    
  20. for(i=0;i<longueur;i=i+1) //création du tableau avec les indices de contextes
  21. c[i]=i;
  22. int perm;
  23. int temp;
  24.   do
  25.   {
  26.          int limit=longueur-2;
  27.     perm=0;
  28.     for (i=0; i<=limit; i++)
  29.       if (t[c[i]]>t[c[i+1]])
  30.       {   /* permutation */
  31.           temp=c[i];
  32.           c[i]=c[i+1];
  33.           c[i+1]=temp;
  34.           /* il y a eu permutation */
  35.           perm=1;
  36.       }; /* fin du if et du for ! */
  37.      limit--; /* le plus grand est a la fin donc on
  38.                  peut s'arreter au precedent */
  39.   }
  40.   /* si il a eu permutation on n'est pas trie donc on continue */
  41.   while (perm);
  42.  
  43. return c;
  44. }
  45. int main(int argc, char *argv[])
  46. {char *t="abracad";
  47. int n=strlen(t);
  48. int p=contexte(t);
  49. affiche(p,n);
  50.  
  51.   system("PAUSE" );
  52.   return 0;
  53. }


 
 
In function `contexte':  
49 [Warning] return makes integer from pointer without a cast  
49 [Warning] function returns address of local variable


In function `main':  
58[Warning] passing arg 1 of `affiche' makes pointer from integer without a cast

 
je suis quand meme content parce que mon programme compile mais au moment de l'executer: Oh malheur... il me renvoie n'importe quoi.
Son but en fait est pour un mot (ici abracad) de me renvoyer trié par ordre alphabétique pour chaque lettre ce qu'il y a avant la lettre donnée:
ainsi on peut diviser abracad comme ca:
 
 
1 a -> \0                                                                    a->\0
2 b -> a                                                                     b->a
3 r -> ba                                                                    d->acarba
4 a -> rba          et renvoyer un liste triée ainsi                 c->arba
5 c -> arba                                                                 r->ba
6 a -> carba                                                               a->carba
7 d -> acarba                                                              a->rba
 
plutot que de trier directement les ce qui serait très gourmand en mémoire je prefère utiliser les indices d'où la création du tableau c que j'essaye de trier en fonction de l'ordre lexicographique de mon mot t.
Je pense que mon erreur vien du fait que j'aurais du faire un malloc quelque part mais le problème c'est que je ne sais pas ou ni comment (j'ai vraiment du mal avec malloc)
donc si quelqu'un pouvait m'aider à faire marcher ce programme (et en bonus en m'expliquant ce qui ne va pas) je lui en serais super reconnaissant.

Reply

Marsh Posté le 08-01-2006 à 15:08:53   

Reply

Marsh Posté le 08-01-2006 à 15:26:22    

N3mo a écrit :

In function `contexte':
49 [Warning] return makes integer from pointer without a cast  


grave

Citation :

49 [Warning] function returns address of local variable


Très grave

Citation :

In function `main':  
58[Warning] passing arg 1 of `affiche' makes pointer from integer without a cast


grave

Citation :

je suis quand meme content parce que mon programme compile


Il n'y a pas de quoi. Il y a 3 warnings graves qu'il faut absolument expliquer et corriger.
 
Quelques éléments de réponses (-ed-). /!\ Le code n'est pas corrigé./!\  

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. /* -ed- manquait pour strlen() */
  5. #include <string.h>
  6.  
  7. void affiche(int t[], int n)
  8. {
  9.   int i;
  10.  
  11.   printf("Voici le tableau \n" );
  12.   for (i = 0;i < n;i++)
  13.      printf("Element %d : %d \n", i, t[i]);
  14. }
  15.  
  16. /* -ed-
  17. int contexte( char *t) //tri contexte
  18.  
  19. la fonction ne modifiant pas le tableau entre, on peut ajouter le qualificateur const.
  20. */
  21. int contexte( char const *t) //tri contexte
  22. {
  23.   /* -ed-
  24.   int p, q;
  25.  
  26.   variables non utilisees.
  27.   */
  28.   int longueur = strlen(t);
  29.   int i;
  30.  
  31.   /* -ed-
  32.  
  33.      Ceci est un tableau local. Son adresse est inutilisable en dehors de la
  34.      fonction.
  35.  
  36.      De plus il a ete alloue automatiquement selon la specification VLA de C99
  37.      qui n'est officiellement pas au point sur gcc.
  38.   */
  39.   int c[longueur];
  40.  
  41.   for (i = 0;i < longueur;i = i + 1) //création du tableau avec les indices de contextes
  42.   {
  43.      c[i] = i;
  44.   }
  45.  
  46.   int perm;
  47.   int temp;
  48.   do
  49.   {
  50.      int limit = longueur - 2;
  51.      perm = 0;
  52.      for (i = 0; i <= limit; i++)
  53.         if (t[c[i]] > t[c[i + 1]])
  54.         {   /* permutation */
  55.            temp = c[i];
  56.            c[i] = c[i + 1];
  57.            c[i + 1] = temp;
  58.            /* il y a eu permutation */
  59.            perm = 1;
  60.         }
  61.      ; /* fin du if et du for ! */
  62.      limit--; /* le plus grand est a la fin donc on
  63.                                         peut s'arreter au precedent */
  64.   }
  65.   /* si il a eu permutation on n'est pas trie donc on continue */
  66.   while (perm);
  67.  
  68.   /* -ed-
  69.      Le type retourne' est int. Il devrait etre int *.
  70.      Mais meme en admettant que le type de retour soit int*,
  71.      retourner l'adresse d'un tableau local n'a aucun sens,
  72.      car cette adresse n'est plus valable apres execution de la fonction.
  73.  
  74.      Il y a donc un grave probleme de conception.
  75.  
  76.      Soit on passe l'adresse d'un tableau alloue par l'appelant, soit on
  77.      retourne l'adresse d'un bloc alloue dynamiquement que l'appelant doit
  78.      ensuite liberer.
  79.  
  80.    */
  81.   return c;
  82. }
  83.  
  84. int main(int argc, char *argv[])
  85. {
  86.   char const *t = "abracad";
  87.   int n = strlen(t);
  88.   int p = contexte(t);
  89.  
  90.   affiche(p, n);
  91.  
  92.   system("PAUSE" );
  93.   return 0;
  94. }


Message édité par Emmanuel Delahaye le 08-01-2006 à 15:52:49

---------------
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/
Reply

Marsh Posté le 08-01-2006 à 15:31:03    

Il y a en effet quelques problèmes importants. ne confond pas adresse et valeur, tes retours de fonctions renvoient forcément un peu n'importe quoi. De plus ta définition de c[longueur] n'est pas très classe et ca m'étonne que ca compile. Utilise plutot une définition avec un malloc.
Quand tu utilise strlen utilise le type size_t (qui est en unsigned int et non en int) ca t'évitera bien des warnings mais sache qu'il va falloir changer pas mal de trucs dans ton code.

Reply

Marsh Posté le 08-01-2006 à 15:34:04    

Le "je suis quand meme content était ironique"
que dois-je changer?
qu'est ce qui ne va pas c'est justement pour ca que j'aurais besoin d'aide:  
le malloc c'est encore du chinois pour moi je n'arrive jamais à savoir où quand et comment l'utiliser.
 

Citation :

Quand tu utilise strlen utilise le type size_t (qui est en unsigned int et non en int) ca t'évitera bien des warnings mais sache qu'il va falloir changer pas mal de trucs dans ton code.


je n'ai pas très bien compris la différence entre unsigned int et int.
 

Message cité 1 fois
Message édité par N3mo le 08-01-2006 à 15:38:10
Reply

Marsh Posté le 08-01-2006 à 15:35:48    

bin je sais pas moi, lis ton code ?
 
ta fonction renvoie un int et toi tu lui demande renvoie un int[], tu vois pas qu'il y a une couille dans le gigot ?

Reply

Marsh Posté le 08-01-2006 à 15:40:36    

Sans moquerie, fait tu la différence entre int * et int ?
Si ce n'est pas le cas alors reprend un bouquin avant de continuer

Reply

Marsh Posté le 08-01-2006 à 15:43:22    

oui int * designe un pointeur et int un simple entier jusque là ca va à peu près ;)

Reply

Marsh Posté le 08-01-2006 à 15:45:58    

bon alors en relisant ton code on voit bien que quand tu renvoie c de ta fonction contexte tu renvoie une adresse car c est un pointeur.donc la définition de ta fonction est mauvaise et la façon dont tu récupere le retour de ta fonction l'est aussi

Reply

Marsh Posté le 08-01-2006 à 15:57:28    

N3mo a écrit :

Le "je suis quand meme content était ironique"
que dois-je changer?
qu'est ce qui ne va pas c'est justement pour ca que j'aurais besoin d'aide:  
le malloc c'est encore du chinois pour moi je n'arrive jamais à savoir où quand et comment l'utiliser.
 

Citation :

Quand tu utilise strlen utilise le type size_t (qui est en unsigned int et non en int) ca t'évitera bien des warnings mais sache qu'il va falloir changer pas mal de trucs dans ton code.


je n'ai pas très bien compris la différence entre unsigned int et int.


 

Citation :

int
 
The int type represents a signed integer comprised of 2 bytes.  It has a range of -32768 to 32767.
 
unsigned int
 
The unsigned int type represents an unsigned integer comprised of 2 bytes.  It has a range of 0 to 65535.


 
 
En gros la taille d'une string sera toujours supérieure ou égale à 0, donc ca sert a rien d'avoir un entier signé. Ainsi le type size_t donne un entier non signé qui offre une plus grande taille positive et évite d'avoir un bit inutile sur le codage de la taille.
 
 
De plus au lieu de faire ton

Code :
  1. int c[longueur];

 qui est très moche il faudra préférer un  

Code :
  1. int *c;
  2. c = (int *) malloc(longueur*sizeof(int));


ce que ca fait, ca alloue une zone mémoire commençant à l'adresse c, et permettant de stocker longueur éléments int.

Message cité 1 fois
Message édité par caddie le 08-01-2006 à 16:11:49
Reply

Marsh Posté le 08-01-2006 à 16:04:43    

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void affiche(int t[],int n)
  4. {
  5.   int i;
  6.  
  7.   printf("Voici le tableau \n" );
  8.   for(i=0;i<n;i++)
  9.     printf("Element %d : %d \n",i,t[i]);
  10. }
  11. int* contexte( char *t) //tri contexte
  12. {
  13.     int p,q;
  14.     int longueur=strlen(t);
  15.     int i;
  16.    
  17.    
  18.      int *c=(int *)malloc(longueur);
  19.    
  20. for(i=0;i<longueur;i=i+1) //création du tableau avec les indices de contextes
  21. c[i]=i;
  22. int perm;
  23. int temp;
  24.   do
  25.   {
  26.          int limit=longueur-2;
  27.     perm=0;
  28.     for (i=0; i<=limit; i++)
  29.       if (*(t+c[i])>*(t+c[i+1]))
  30.       {   /* permutation */
  31.           temp=c[i];
  32.           c[i]=c[i+1];
  33.           c[i+1]=temp;
  34.           affiche(c,longueur);
  35.           /* il y a eu permutation */
  36.           perm=1;
  37.       }; /* fin du if et du for ! */
  38.      limit--; /* le plus grand est a la fin donc on
  39.                  peut s'arreter au precedent */
  40.   }
  41.   /* si il a eu permutation on n'est pas trie donc on continue */
  42.   while (perm);
  43.  
  44.   return c;
  45.  
  46.  
  47. }
  48. int main(int argc, char *argv[])
  49. {char *t="abracad";
  50. int n=strlen(t);
  51.   affiche(contexte(t),n);
  52.  
  53.   system("PAUSE" );
  54.   return 0;
  55. }


 
en modifiant mon code ainsi je n'ai plus de [Warning]
j'ai juste un problème avec l'algorithme de tri mais je pense que j'aurais moins de mal à le modifier.
Merci de votre aide qui m'a aider à y voir plus clair.
 
EDIT: je n'avais pas vu ton message caddie, je vais essayer egalement de faire les modification que tu me conseille ca m'aidera je suis sur à mieux comprendre.


Message édité par N3mo le 08-01-2006 à 16:06:46
Reply

Marsh Posté le 08-01-2006 à 16:04:43   

Reply

Marsh Posté le 08-01-2006 à 16:05:14    

caddie a écrit :

Citation :

int
 
The int type represents a signed integer comprised of 2 bytes.  It has a range of -32768 to 32767.
 
unsigned int
 
The unsigned int type represents an unsigned integer comprised of 2 bytes.  It has a range of 0 to 65535.




Attention. Ce genre de citation est dangereuse lorsque le contexte n'est pas précisé. Ce n'est absolument pas un texte officiel ou généraliste, mais ce qui se passe pour une implémentation donnée.
 
Le langage C dit qu'un int a une plage minimale garantie de -32767 à 32767, alors que pour un unsigned int , elle est de 0 à 65535. En réalité, pour un implémentation donnée, les plages sont respectivement
 
INT_MIN à INT_MAX et 0 à UINT_MAX. Ces valeurs sont définies dans <limits.h>

Message cité 1 fois
Message édité par Emmanuel Delahaye le 08-01-2006 à 16:06:56

---------------
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/
Reply

Marsh Posté le 08-01-2006 à 16:10:24    

Ce n'est toujours pas bon.  
Tu ne fais pas de free après ton malloc. Ce qui est grave c'est de ne pas en prendre l'habitude. Une fois que tu as fini d'utiliser les données stockées dans l'espace réservées par malloc il faut restituer l'espace mémoire au système.
à l'aide d'un free

Reply

Marsh Posté le 08-01-2006 à 16:13:08    

Emmanuel Delahaye a écrit :

Attention. Ce genre de citation est dangereuse lorsque le contexte n'est pas précisé. Ce n'est absolument pas un texte officiel ou généraliste, mais ce qui se passe pour une implémentation donnée.
 
Le langage C dit qu'un int a une plage minimale garantie de -32767 à 32767, alors que pour un unsigned int , elle est de 0 à 65535. En réalité, pour un implémentation donnée, les plages sont respectivement
 
INT_MIN à INT_MAX et 0 à UINT_MAX. Ces valeurs sont définies dans <limits.h>


 
Merci pour la précision !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed