Quelqu'un veut bien m'aider? - C - Programmation
Marsh Posté le 08-01-2006 à 15:26:22
N3mo a écrit : In function `contexte': |
grave
Citation : 49 [Warning] function returns address of local variable |
Très grave
Citation : In function `main': |
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 :
|
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.
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.
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 ?
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
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
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
Marsh Posté le 08-01-2006 à 15:57:28
N3mo a écrit : Le "je suis quand meme content était ironique"
|
Citation : int |
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 :
|
qui est très moche il faudra préférer un
Code :
|
ce que ca fait, ca alloue une zone mémoire commençant à l'adresse c, et permettant de stocker longueur éléments int.
Marsh Posté le 08-01-2006 à 16:04:43
Code :
|
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.
Marsh Posté le 08-01-2006 à 16:05:14
caddie 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>
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
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. |
Merci pour la précision !
Marsh Posté le 08-01-2006 à 15:08: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.