Liste chainée - C - Programmation
Marsh Posté le 23-12-2005 à 16:37:40
duranton a écrit : |
deja rajotue un ; a la fin de tes declarations de structures
ca devraient enlever pas mal de messages d'erreur
Marsh Posté le 23-12-2005 à 16:38:10
t'es marrant, t'as qu'à utilise exactement le même nom pour tous tes types, variables, fonctions et paramètres.
Marsh Posté le 23-12-2005 à 16:42:53
duranton a écrit : Bonjour, |
NULL ?
Marsh Posté le 23-12-2005 à 18:11:34
J' ai essayer de reprendre mon code avec vos différentes remarques et j' ai tjs des erreurs, je pense qu'elles viennent essentiellement de la déclaration des types ou je sais pas bien comment mis prendre.
Voila le nouveau code :
Code :
|
et voici les erreurs :
c:11: field `valeur' has incomplete type
c:17: parameter `val' has incomplete type
c: In function `nouveau_maillon':
c:22: request for member `suivant' in something not a structure or union
c:24: request for member `valeur' in something not a structure or union
c:26: warning: `return' with a value, in function returning void
c: At top level:
c:30: parse error before `*'
c: In function `insertion_fin':
c:34: `liste' undeclared (first use in this function)
c:34: (Each undeclared identifier is reported only once
c:34: for each function it appears in.)
c:43: `maillon' undeclared (first use in this function)
c: At top level:
c:47: parse error before `liste'
c: In function `afficher_liste':
c:52: `argc' undeclared (first use in this function)
c: In function `main':
c:67: type of formal parameter 1 is incomplete
c:67: void value not ignored as it ought to be
Marsh Posté le 23-12-2005 à 18:49:44
Code :
|
Tvaleur est une variable de type int. Ce n'est pas une structure, tu ne peux donc pas déclarer "valeur" de type "struct Tvaleur".
Code :
|
Les variables globales, c'est mal (sauf cas particulier, quand on sait vraiment ce que l'on fait).
Code :
|
Encore une fois, Tvaleur est une variable de type int, ce n'est pas un type et encore moins une structure.
Code :
|
L est de type "struct Tmaillon *", et non de type "int".
Ton malloc() devrait plutôt s'écrire :
L = malloc(2 * sizeof(struct Tmaillon));
De plus, malloc() peut éventuellement échouer. Avant d'utiliser "L", il faut vérifier que l'appel à malloc() s'est bien déroulé (vérifier que L != NULL après le malloc).
Code :
|
L.suivant est de type "struct Tmaillon*". Le déréférencement du pointeur est inutile (et ce n'est pas ce que tu veux faire).
Ce que tu veux faire, c'est :
L.suivant = NULL;
Bon je m'arrête là mais le reste est de la même facture, il te faut revoir la base du C, à savoir les types de données, les pointeurs et les structures. Ce n'est pas une critique..
Par contre tu tentes du code au hasard en espérant que ça passe ; il n'y a pas de problème à ne pas saisir un concept, et dans ce cas-là il y a un réflexe que tu dois acquérir très vite, essentiel à la programmation : rechercher la documentation correspondante.
Tu peux par exemple lire ceci : http://mapage.noos.fr/emdel/init_c.htm
(et plus généralement les différents articles de ce site)
Marsh Posté le 23-12-2005 à 18:50:27
int Tvaleur;
typedef struct Tmaillon{
struct Tmaillon * suivant;
struct Tvaleur valeur;
}Tmaillon;
y a rien qui te choqeu o_O
tu definis une VARIABLE TValeur de type int puis tu definie un champ de TYPE TValeur ....
EDIT : grillaid
Marsh Posté le 24-12-2005 à 00:47:02
Tous d'abord merci pour les différentes remarques et conseils que vous m'avez donner,en effet j' ai d'énorme difficulté à programmer et le site ma bien aider à comprendre ce que je fesai.
Ensuite mon code n' a plus aucune erreurs lors de la compilation mais ne fonctionne pas lors que je le lance.
Je dois garder les types car ils sont donné dans l' énoncer.
Voici le code final :
Code :
|
Joyeux Noel
Marsh Posté le 24-12-2005 à 01:21:21
wow ! alors là je suis pas spécialiste en programmation mais ton code est pas tip top
pour la fonction afficher, tel quel tu va avoir un dépassement de tableau (EDIT : non en fait tu va te déplacer d'un cran cf. gocho) et donc un segmentation fault, ta fonction je l'écrirai comme ca (ton printf a l'air juste mais compliqué..) :
Code :
|
et pour le reste ...je comprend pas le trip des **liste ..enfin si ...mais c'est hachement compliqué!! et puis pourquoi tu utilises des
Code :
|
alors que tu définis des type Tmaillon en début de programme avec des
Code :
|
..tu devrais utiliser des Tmaillon puisque tu définis ces types avec le typedef...pas la peine de remettre les struct Tmaillon, ou alors enlève le typedef. D'ailleurs tu l'a très bien fait avec le Tvaleur.
Le nom de variable Tliste prete un peu a confusion, non ? à cause de ca t'es obligé de te palucher des doubles pointeurs de partout ...pourquoi pas faire un Tmaillon *monmaillon, et puis c'est tout se débrouiller avec ? (comme ca t'acced a monmaillon->valeur au lieu de faire des (**liste).valeur)
....maintenant je suis pas spécialiste....
geoyeux n'ohël
Marsh Posté le 24-12-2005 à 01:42:05
duranton a écrit :
-->Tu le cree avec la taille qu'il va avoir lorsque tu l'auras cree? a moins que tu demandes de le creer avec la taille d'un pointeur? (j'ai du mal en cette veille de noel moi )je pense que ca va poser des problemes.
|
edit : Joyeux Noel a tous aussi hein !
edit2 : oue ben j'l'aime bien ce vert alors je vous .....
Marsh Posté le 24-12-2005 à 01:43:31
Déjà, tu pourrais commencer par utiliser ton compilateur correctement :
% gcc -Wall -ansi -pedantic maillon.c -o maillon |
Donc quand tu vois ça, tu regardes dans insertion_fin. Et là, tu vois que tu assignes liste (de type pointeur sur une Tliste, c'est à dire un pointeur sur un pointeur sur Tmaillon) à curseur (de type pointeur sur Tmaillon). C'est mauvais signe pour la suite
Ensuites tu regardes la ligne juste en dessous, et là tu t'aperçois que tu testes si le pointeur sur l'élément suivant du maillon pointé par liste est nul. S'il ne l'est pas tu modifies curseur ! liste ne change pas, tu boucleras indéfiniment s'il y a plus d'un élément dans ta liste...
(le deuxième warning est facile à résoudre, il suffit de rajouter un EXIT_SUCCESS à la fin du main).
Il y a deuxième problème. Intéresse toi de près à la valeur de liste dans ton main, en particulier lors du premier tour de boucle...
Marsh Posté le 24-12-2005 à 01:48:23
P'tain mais dans tous les sens la....ca craint!
Pillow a écrit : Déjà, tu pourrais commencer par utiliser ton compilateur correctement :
|
skoi toutes ces options de compilation ? Tous le monde ne les utilise pas hein
Marsh Posté le 24-12-2005 à 03:17:21
gocho a écrit : skoi toutes ces options de compilation ? Tous le monde ne les utilise pas hein |
Ceux qui ne les utilisent pas ont tort
Par ailleurs, le warning important (le type incompatible) est affiché même sans aucune de ces options
Marsh Posté le 24-12-2005 à 09:42:38
gocho a écrit : |
hors de -Wall -pedantic pas de salut, certain barbus utilisent même -Werror
Marsh Posté le 24-12-2005 à 11:42:07
gocho a écrit : skoi toutes ces options de compilation ? Tous le monde ne les utilise pas hein |
Euh, si.
Parce que généralement lorsqu'il y a un warning, c'est qu'il y a une bonne raison.
J'ajoute également "-ansi", sauf quand je dois utiliser des fonctions POSIX (forcément... )
Joel F a écrit : hors de -Wall -pedantic pas de salut, certain barbus utilisent même -Werror |
-Werror bof par contre, je ne sais pas si ça a été résolu depuis, mais -Wall -Werror fait que certains warnings n'apparaissent plus du tout, un bug de gcc
Marsh Posté le 24-12-2005 à 15:53:36
Dans la suite de mon Tp on me demande de créer une routine permettant d'inserer un élément à la k ième position.
Sachant que l' entête est donnée.
Code :
|
Une boucle est créer, je n' arrive pas à trouver pourquoi.
Marsh Posté le 24-12-2005 à 17:09:07
duranton a écrit : Dans la suite de mon Tp on me demande de créer une routine permettant d'inserer un élément à la k ième position.
|
bah ... tu verra si t'utilises abondamment des formules genre "Merci les gars pour votre aide", ou juste "merci" ou ecore "super de faire le boulot a ma place parce que j'ai trop la flemme d'allumer mon cerveau" et même pourquoi pas "merci par avance" si t'es vraiment chaud bouillant, a mon avis ca devrait compiler
Marsh Posté le 24-12-2005 à 17:12:00
Code :
|
Autant l'écrire sur une seule ligne, c'est plus lisible :
struct Tmaillon * curseur = *liste;
Code :
|
Il se passe quoi si "pos" dépasse le nombre de maillons disponibles dans la liste ?
Réponse : ça plante.
Code :
|
Tu n'as pas l'impression que quelque chose cloche ?
Citation : Une boucle est créer, je n' arrive pas à trouver pourquoi. |
Marsh Posté le 24-12-2005 à 21:41:30
je demande une explication sur ces options (pour noel que je vais m'empresser d'aller feter!!) ?
(oui j'ai la flemme de chercher et alors???)
Marsh Posté le 25-12-2005 à 01:14:20
gocho a écrit : je demande une explication sur ces options (pour noel que je vais m'empresser d'aller feter!!) ? |
Les options de gcc ?
Rien de sorcier : -Wall affiche tous les warnings (sans cette option, les warnings sont "silencieux" ), tandis que -pedantic demande une plus stricte compatibilité avec la norme ANSI (généralement on l'accompagne de -ansi, d'ailleurs).
Personnellement je retire -pedantic sur certains modules uniquement destinés à être utilisés sur Unix (par exemple un programme avec gestion des signaux), autrement je la mets, notamment pour ma bibliothèque personnelle de fonctions standards.
Marsh Posté le 25-12-2005 à 02:16:57
cool ca, moi la seule option de gcc que je lui mets c'est -o
Marsh Posté le 25-12-2005 à 02:19:04
Y a des tonnes d'autres options utiles, hein.
En vrac : -g, -pg, -O..., -c, -l, -I, -L, etc.
Marsh Posté le 25-12-2005 à 02:19:34
pis jsuis sur que si je reprends n'importe quel prog que j'ai fais (autre que le hello hein ) ben en mettant ne serait ce que -Wall a gcc je en voyant ce qu'il me renvoie dans le tronche
Marsh Posté le 25-12-2005 à 02:20:24
bon a tout hasard t'orais pas une page ou je peux avoir un detail de tout ca? (oue j'ai toujours la flemme de chercher )
Marsh Posté le 25-12-2005 à 02:21:18
Raison de plus pour mettre cette option.
A quelques exceptions prêt, tous les warnings levés pointent sur des bugs ou des comportements douteux.
EDIT :
gocho a écrit : bon a tout hasard t'orais pas une page ou je peux avoir un detail de tout ca? (oue j'ai toujours la flemme de chercher ) |
man gcc
Marsh Posté le 25-12-2005 à 02:24:24
Elmoricq a écrit : Raison de plus pour mettre cette option. |
erf va falloir je reinstall linux en pensant a ca moi...
M'a foutu un kernel panic violent l'autre jour alors j'l'ai delaisse
Marsh Posté le 25-12-2005 à 11:12:35
Elmoricq a écrit : |
corrigé avec la 4.0 si je ne m'abuse
Marsh Posté le 25-12-2005 à 13:19:40
Cool ça =)
De toute façon ce n'est pas une option très importante, je trouve (pour celui pour qui le warning est autre chose que décorative, j'entends )
Marsh Posté le 25-12-2005 à 16:02:05
Elmoricq a écrit : Cool ça =) |
Perso je m'en sers parce que je script toutes mes compil et que je parse la sortie de gcc pour toutes erreurs ou warning pour faire du post traitement dessus et etant feignant, -Werror m'a pris moins de temps a implenté que de rajouter une ligne dans le parser
Marsh Posté le 23-12-2005 à 16:35:26
Bonjour,
Je doit réaliser une liste chainée, créer un nouveau maillon, l' insérer en fin de liste, afficher à l'écran la valeur du maillon , son adresse et l' adresse du maillon suivant.
Sachant que les types sont prédéfinis, et que je doit utiliser les arguments entrer au clavier lors de l'execution.
Voici mon code, plusieurs erreurs interviennent lors de la compilation :
Voici les différentes erreurs qui me sont donner leurs de la compilation :
parse error before `Tvaleur'
.c:10: warning: no semicolon at end of struct or union
c:12: parse error before `}'
c:12: warning: data definition has no type or storage class
c:14: parse error before `*'
c:14: warning: data definition has no type or storage class
c:16: parse error before `val'
c: In function `nouveau_maillon':
c:18: `L' undeclared (first use in this function)
c:18: (Each undeclared identifier is reported only once
c:18: for each function it appears in.)
.c:24: `val' undeclared (first use in this function)
c:26: warning: `return' with a value, in function returning void
c: At top level:
c:30: parse error before `*'
c: In function `insertion_fin':
c:33: `curseur' undeclared (first use in this function)
c:34: `liste' undeclared (first use in this function)
c:36: parse error before `!='
c: At top level:
c:43: parse error before `->'
c:47: parse error before `liste'
c: In function `afficher_liste':
c:52: `argc' undeclared (first use in this function)
c:58: parse error before `int'
c:66: `n' undeclared (first use in this function)
c:66: `argv' undeclared (first use in this function)
c:67: parse error before `@'
c:68: `L' undeclared (first use in this function)