IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[Débutant]Structure et listes chainées


Sujet :

C

  1. #21
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kamouminator
    je sais plus où j'avais lu qu'il fallais absolument caster malloc parcequ'il renvoyais toujours un void...
    Ben non. La conversion void* <-> T* est implicite en C depuis 1989.

    Si tu lis des textes antiques, ça peut être différent, comme je l'ai expliqué dans mon article...

  2. #22
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Voici le fichier .txt si je me suis pas gourré :p Tout le monde va voir mes superbes fautes chichic au moins ca profite à tout le monde :p
    Fichiers attachés Fichiers attachés

  3. #23
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    P.S. Dahmer, c'est OpenVMS ?
    Oui c'est tout à fait çà!

  4. #24
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par plagia
    Voici le fichier .txt si je me suis pas gourré :p Tout le monde va voir mes superbes fautes chichic au moins ca profite à tout le monde :p
    Euh, t'es sûr que c'est la version compilable ?
    Project : Forums
    Compiler : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    Linking console executable: C:\dev\forums2\console.exe
    Switching to target: default
    Compiling: main.c
    main.c:51: error: syntax error before "else"
    <...>
    Process terminated with status 1 (0 minutes, 8 seconds)
    44 errors, 31 warnings
    Ca fait beaucoup quand même... Je suppose que tu as recopié le code à la main, c'est ça ?

    Installe Code::Blocks sur ton PC et développe ton code dessus. Ensuite, fait le portage sur VMS. Je veux bien admettre que sur la machine VMS il n'y ait pas de port USB, mais tu dois pouvoir faire un transfert de fichier entre ton PC et ta machine VMS par FTP, non ?

    En fait, il manquait une {. Ca en fait des dégats !

    J'ai déplacé les variables en local de main(), et ça m'a révélé quelque chose d'interessant :
    Compiling: main.c
    main.c: In function `main':
    main.c:44: warning: 'nombre_noeud' might be used uninitialized in this function
    Une des raisons pour lesquelles les globales c'est le diable, c'est qu'elles sont initialisées par défaut et que ce genre de bug potentiel échappe au contrôle.

    Ton programme utilise la ligne de commande. Il est d'usage, lorsque la ligne de commande requise est incorrecte, d'afficher le 'mode d'emploi'...

    Alors je mets quoi en paramètres ?

    J'ai trouvé un bug :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    message.contenu = malloc (strlen (argv[POSITION_MESSAGE]));
    est faux. Il maque une place pour le 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    message.contenu = malloc (strlen (argv[POSITION_MESSAGE]) + 1);

    En attendant, je mets ça :

    fic.txt aaa bbb ccc

    et ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Fichier donnee : fic.txt
    Emetteur : aaa
    Destinataire : bbb
    Message : ccc
    Fichier introuvable
     
    Press ENTER to continue.
    Visiblement, il faut fournir un fichier. Il faut quoi dedans ?

    Je dois m'absenter. Voici où j'en suis (P.J.)
    Fichiers attachés Fichiers attachés
    • Type de fichier : c main.c (5,5 Ko, 44 affichages)

  5. #25
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Donc la commande de lancement c :
    mc []tp2 fichier_description_reseau noeud_emetter noeud_destinataire message

    Donc le fichier decrit le reseau exemple n1 --- n2 ---- n3

    On crée le fichier comme ca

    n1 n2
    n2 n1 n3
    n3 n2

    De cette façon on détermine le réseau.

  6. #26
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par plagia
    Donc la commande de lancement c :
    mc []tp2 fichier_description_reseau noeud_emetter noeud_destinataire message

    Donc le fichier decrit le reseau exemple n1 --- n2 ---- n3

    On crée le fichier comme ca

    n1 n2
    n2 n1 n3
    n3 n2

    De cette façon on détermine le réseau.
    BUGS detectés :
    • Après la comptage des lignes, on est erreur ou en fin de fichier. Il faut un revenir au début avec rewind().
    • Le fichier n'ayant pas été fermé, une ouverture provoque un comportement indéterminé. A supprimer. Le rewind() suffit.
    • Après sa création, le tableau 'tableau_noeud' n'est pas initialisé. Il contient n'importe quoi. Le premier appel de strcmp() suivant est donc voué à l'échec (comportement indéfini).
    • tableau_noeud[ligne_noeud].nom est un pointeur (valant NULL, maintenant). On ne peut pas l'utiliser pour faire une copie, car il ne pointe pas sur un espace valide. Le comportement est indéfini. Je recommande la fonction POSIX.1 strdup(). Libérer avec free().

    Ca a l'air d'aller mieux...
    Fichier donnee : 'data.txt'
    Emetteur : 'aaa'
    Destinataire : 'bbb'
    Message : 'ccc'
    Nombre de lignes lues : 3
    Nom noeud : n1Noeud unique

    Nom noeud : n2Noeud unique

    Nom noeud : n3Noeud unique

    Nombre noeud : 3
    Press ENTER to continue.
    Je te laisse terminer, libérer ce qu'il faut, fermer le fichier, bref ecrire tout ça correctement.

    A vue de nez, ton algorithme est un peu compliqué, je pense qu'on doit pouvoir faire plus simple.

  7. #27
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Encore merci pour toutes ces infos néanmoins j rencontre un pb sur l initialisation de tableau noeud j procède de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    tableau_noeud=malloc(nombre_lignes_lues*sizeof(struct noeud));
    for (compteur_init=0; compteur_init <= nombre_lignes_lues;compteur_init++)
    {
    	tableau_noeud[compteur_init]=NULL;
    }
    tableau_noeud[compteur_init]=NULL;
    ........................^
    %CC-E-NOCONVERT, In this statement, "((void ...)0)" is of type "pointer to void", and cannot be converted to "struct noeud".
    at line number 116 in file MANSON$DKA100:[USERS.PLAGIACAPRA.TP2C]TP2BIS.C;4

    Je pense que j dois faire une erreur de débutant :p

  8. #28
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par plagia
    pb sur l initialisation de tableau noeud j procède de cette manière :
    tableau_noeud[compteur_init]=NULL;
    ........................^
    %CC-E-NOCONVERT, In this statement, "((void ...)0)" is of type "pointer to void", and cannot be converted to "struct noeud".
    at line number 116 in file MANSON$DKA100:[USERS.PLAGIACAPRA.TP2C]TP2BIS.C;4
    Je pense que j dois faire une erreur de débutant :p
    Ben oui. Tu essayes de donner la valeur NULL à une structure. Ca n'a aucun sens.

    Ce que je fais dans ces cas là, je définis une structure locale statique initialisée à 0 et constante (lecture seule) qui sert à initialiser chaque structure par simple copie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       for (compteur_init = 0; compteur_init < nombre_lignes_lues; compteur_init++)
       {
          static const struct noeud z = {0};
          tableau_noeud[compteur_init] = z;
       }
    Et attention, c'est < et non <=, sinon, tu vas trop loin. Je rappelle que les indices valides d'un tableau de N vont de 0 à N-1.

  9. #29
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    En fait j ai l impression que mon code ne reflète pas ce que je veux faire.
    Dans mon idée je voulais faire un tableau de pointeur qui contienne les pointeurs de tous mes noeuds et que ces pointeurs pointent vers la structure du nom correspondant. Et j'ai l'impression que je déclare mal et je remplis mal.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct noeud {
            char  nom;
            struct noeud *noeud_liaison[NOMBRE_LIAISON_MAX];
    }noeud
    struct  noeud *tableau_noeud;
    Je voulais savoir en plus quand j alloue une structure noeud est ce possible d'incérer un pointeur dans cette structure qui ait l'adresse de cette même structure ?

Discussions similaires

  1. structures ou listes chainées polymorphes
    Par tom31 dans le forum C
    Réponses: 1
    Dernier message: 24/03/2008, 11h14
  2. aide pour structure et liste chainée
    Par monsieur77 dans le forum C
    Réponses: 8
    Dernier message: 20/11/2007, 17h25
  3. [Débutant] Pointeur sur liste chainée
    Par HaTnuX dans le forum C
    Réponses: 2
    Dernier message: 02/12/2006, 17h53
  4. [ Débutant ] trier une liste chainée
    Par sablito dans le forum C
    Réponses: 3
    Dernier message: 01/11/2006, 23h27
  5. [débutante] Liste chainée/système expert
    Par zoune dans le forum Langage
    Réponses: 2
    Dernier message: 09/01/2006, 14h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo