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 :

affichage vraiment étonnant


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 37
    Par défaut affichage vraiment étonnant
    Salut,
    J'ai crée un fichier de "contatcs" j'ai sauvegardé 3 contacts.Je charge le contenu du fichier dans une liste chainée.Lors de l'affichage de toute la liste j'ai remarqué qu'il y a un passage d'une cellule à une autre mais le contact affiché est le même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
     
    typedef struct adresse
    	{	int numr;
    		char nomr[20];
    		char nomv[20];
    }ADR;
     
    typedef struct contact
    {
    	int ref;
    	char nom[20];
    	char prenom[20];
    	char sexe;
    	char date[10];
    	char lieu[20];
    	ADR adresse;
    	char pays[20];
    int numerof;
    	int numerom;
    }Contact;
     
    FILE* fp;
    typedef struct Cellule_Contact
    {
    	Contact * c;
    	struct Cellule_Contact * suivant;
    }Cellule;
    //*************************************
    Cellule * Creer_Cellule(Contact * Cont)
    {
    Cellule * N=NULL;
    N=(Cellule*)malloc(sizeof(Cellule));
    N->c=Cont;
    N->suivant=NULL;
    return N;
    }
     
    //*************************************
    Cellule * Inserer_Contact_tete(Cellule * CL,Contact * Cont)
    {Cellule * nouv=NULL;
    nouv=Creer_Cellule(Cont);
    if(CL==NULL)
    return nouv;
    else
    nouv->suivant=CL;
    return nouv;
     
    }
    Cellule * Charger_Contact_Dans_Liste(Cellule* LC,Contact * temp,FILE *fp)
    {
    fp=fopen("Contacts.txt","r");
    if(fp==NULL)
    printf("Ouverture impossible");
    else
    {while(fread((temp),sizeof(Contact),1,fp) && !feof(fp))
    {
    LC=Inserer_Contact_tete(LC,temp);
    printf("%s",LC->c->nom);
     
    }
    fclose(fp);
    }
    return LC;}
     
    void main()
    {int N;Cellule * L=NULL;
    printf("\n Bienvenue sur notre programme\n");
    Contact  temp;
    int test;
    //printf("\n\nEntrer le nombre de contacts que vous voulez saisir");
    //scanf("%d",&N);
    //Saisie_Carnet(N,temp);
    L=Charger_Contact_Dans_Liste(L,&temp,fp);
     
    //Afficher_Contacts_Liste(L);
    printf("\n%d",L);
    printf("%s",L->c->nom);
    printf("\nL'adresse suivante est:%d",L->suivant);
    L=L->suivant;
    printf("\n%d",L);
    printf("%s",L->c->nom);
    printf("\nL'adresse suivante est:%d",L->suivant);
    L=L->suivant;
    printf("\n%d",L);
    printf("\nL'adresse suivante est:%d",L->suivant);
    L=L->suivant;
    printf("\n%d",L);
     
    printf("\n Le nom:%s",L->c->nom);
     
     
     
     
    printf("Merci pour votre visite");
     
    }
    Merci d'avance
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Ton code est particulièrement illisible.
    Ce qui t'arrive est tout à fait normal car tu copies une adresse pour les contacts (temp)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Cellule * Creer_Cellule(Contact * Cont)
    {
      Cellule * N=NULL;
      N=(Cellule*)malloc(sizeof(Cellule));
     
     
      N->c=Cont; <====
     
     
      N->suivant=NULL;
      return N;
    }
    donc tous les contacts font référence à la même adresse qui contient les dernières données lues.
    Au passage,
    1) il faut tester les retours de malloc
    2) En C le cast du malloc est déconseillé (si le compilo t'oblige au cast tu fais du C++ (ton fichier à l'extension .cpp).
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par melek_net Voir le message
    Salut,
    J'ai crée un fichier de "contatcs" j'ai sauvegardé 3 contacts.Je charge le contenu du fichier dans une liste chainée.Lors de l'affichage de toute la liste j'ai remarqué qu'il y a un passage d'une cellule à une autre mais le contact affiché est le même.
    Pas du C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:23: error: syntax error before '*' token
    main.c:23: warning: type defaults to `int' in declaration of `fp'
    main.c:23: warning: data definition has no type or storage class
    main.c: In function `Creer_Cellule':
    main.c:32: error: `NULL' undeclared (first use in this function)
    main.c:32: error: (Each undeclared identifier is reported only once
    main.c:32: error: for each function it appears in.)
    main.c:33: warning: implicit declaration of function `malloc'
    main.c: In function `Inserer_Contact_tete':
    main.c:41: error: `NULL' undeclared (first use in this function)
    main.c: At top level:
    main.c:50: error: syntax error before "FILE"
    main.c:51: warning: function declaration isn't a prototype
    main.c: In function `Charger_Contact_Dans_Liste':
    main.c:52: warning: implicit declaration of function `fopen'
    main.c:52: warning: assignment makes pointer from integer without a cast
    main.c:53: error: `NULL' undeclared (first use in this function)
    main.c:54: warning: implicit declaration of function `printf'
    main.c:56: warning: implicit declaration of function `fread'
    main.c:56: error: `temp' undeclared (first use in this function)
    main.c:56: warning: implicit declaration of function `feof'
    main.c:58: error: `LC' undeclared (first use in this function)
    main.c:62: warning: implicit declaration of function `fclose'
    main.c: At top level:
    main.c:67: warning: function declaration isn't a prototype
    main.c:67: warning: return type of 'main' is not `int'
    main.c: In function `main':
    main.c:67: error: `NULL' undeclared (first use in this function)
    main.c:77: warning: int format, pointer arg (arg 2)
    main.c:79: warning: int format, pointer arg (arg 2)
    main.c:81: warning: int format, pointer arg (arg 2)
    main.c:83: warning: int format, pointer arg (arg 2)
    main.c:85: warning: int format, pointer arg (arg 2)
    main.c:86: warning: int format, pointer arg (arg 2)
    main.c:88: warning: int format, pointer arg (arg 2)
    main.c:67: warning: unused variable `N'
    main.c:70: warning: unused variable `test'
    Process terminated with status 1 (0 minutes, 2 seconds)
    10 errors, 21 warnings
    • Il manque des headers.
    • Il y a des globales. C'est horrible !
    • main() retourne int. Toujours.
    • L est un pointeur. "%d" attend un int. Les types sont incompatibles... Pour afficher une adresse, on utilise "%p" qui attend un void *. On met donc le cast qui va bien (void*).
    • Code : Sélectionner tout - Visualiser dans une fenêtre à part
         printf ("%p\n", (void *) L);
    • Les lignes se terminent par un '\n'...

    Ton code remis en forme, un peu corrigé. Je n'ai pas corrigé l'erreur de logique déjà signalée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct adresse
    {
       int numr;
       char nomr[20];
       char nomv[20];
    }
    ADR;
     
    typedef struct contact
    {
       int ref;
       char nom[20];
       char prenom[20];
       char sexe;
       char date[10];
       char lieu[20];
       ADR adresse;
       char pays[20];
       int numerof;
       int numerom;
    }
    Contact;
     
    typedef struct Cellule_Contact
    {
       Contact *c;
       struct Cellule_Contact *suivant;
    }
    Cellule;
     
    /* ************************************* */
    Cellule *Creer_Cellule (Contact * Cont)
    {
       Cellule *N = malloc (sizeof *N);
       if (N != NULL)
       {
          N->c = Cont;
          N->suivant = NULL;
       }
       return N;
    }
     
    /* ************************************* */
    Cellule *Inserer_Contact_tete (Cellule * CL, Contact * Cont)
    {
       Cellule *nouv = Creer_Cellule (Cont);
       if (CL == NULL)
          return nouv;
       else
          nouv->suivant = CL;
       return nouv;
     
    }
     
    Cellule *Charger_Contact_Dans_Liste (Cellule * LC, Contact * temp)
    {
       FILE *fp = fopen ("Contacts.txt", "r");
       if (fp == NULL)
          printf ("Ouverture impossible\n");
       else
       {
          while (fread ((temp), sizeof (Contact), 1, fp) && !feof (fp))
          {
             LC = Inserer_Contact_tete (LC, temp);
             printf ("%s\n", LC->c->nom);
     
          }
          fclose (fp);
       }
       return LC;
    }
     
    int main (void)
    {
       Cellule *L = NULL;
       printf ("\n Bienvenue sur notre programme\n");
       Contact temp;
    #if 0
       int N;
       int test;
       printf ("\n\nEntrer le nombre de contacts que vous voulez saisir\n");
       scanf ("%d", &N);
       Saisie_Carnet (N, temp);
    #endif
       L = Charger_Contact_Dans_Liste (L, &temp);
     
    /* Afficher_Contacts_Liste(L); */
       printf ("%p\n", (void *) L);
       if (L != NULL)
       {
          printf ("%s\n", L->c->nom);
          printf ("L'adresse suivante est:%p\n", (void *) L->suivant);
          L = L->suivant;
          printf ("%p\n", (void *) L);
     
          if (L != NULL)
          {
             printf ("%s\n", L->c->nom);
             printf ("L'adresse suivante est:%p\n", (void *) L->suivant);
             L = L->suivant;
             printf ("%p\n", (void *) L);
             if (L != NULL)
             {
                printf ("L'adresse suivante est:%p\n", (void *) L->suivant);
                L = L->suivant;
                printf ("\n%p", (void *) L);
     
                if (L != NULL)
                {
                   printf ("Le nom:%s\n", L->c->nom);
     
                }
             }
          }
       }
       printf ("Merci pour votre visite\n");
       return 0;
    }

  4. #4
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 37
    Par défaut si j'ai bien compris
    Mais avec cette instruction j'ai trouvé que tout va bien et il m'affiche les 3 noms des contacts
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Cellule * Charger_Contact_Dans_Liste(Cellule* LC,Contact * temp,FILE *fp)
    {
    fp=fopen("Contacts.txt","r");
    if(fp==NULL)
    printf("Ouverture impossible");
    else
    {while(fread((temp),sizeof(Contact),1,fp) && !feof(fp))
    {
    LC=Inserer_Contact_tete(LC,temp);
    printf("%s",LC->c->nom);<============
    
    }
    fclose(fp);
    }
    return LC;}

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Par défaut
    Citation Envoyé par melek_net Voir le message
    Mais avec cette instruction j'ai trouvé que tout va bien et il m'affiche les 3 noms des contacts
    C'est normal : à chaque lecture, tu copies le contact lu dans temp. LC->c pointe sur temp, donc LC->c->nom est bien égal au dernier nom lu.

    Après la lecture suivante, le contenu de temp varie, mais toutes les cellules pointent sur le même endroit.

    Comme tu les affiches au fur et à mesure, tu ne vois pas le problème à ce moment là.

    Dans la deuxième partie de ton programme, quand tu parcours ta liste, tu affiches toujours le contenu de temp.nom.

  6. #6
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 37
    Par défaut SVP encore pas résolu
    J'ai changé la structure comme vous l'avez dit et voici les autres fonctions modifiées mais pas de solution .L'affichage génére 2 erreurs que je ne parviens pas à comprendre .SVP écrivez moi la possibilité de réponse..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    typedef struct Cellule_Contact
    {
    	Contact c;
    	struct Cellule_Contact * suivant;
    }Cellule;
    //*************************************
    Cellule * Creer_Cellule(Contact Cont)
    {
    Cellule * N=NULL;
    N=(Cellule*)malloc(sizeof(Cellule));
    N->c=Cont;
    N->suivant=NULL;
    return N;
    }
    
    //*************************************
    Cellule * Inserer_Contact_tete(Cellule * CL,Contact Cont)
    {Cellule * nouv=NULL;
    nouv=Creer_Cellule(Cont);
    if(CL==NULL)
    return nouv;
    else
    nouv->suivant=CL;
    return nouv;
    
    }
    Cellule * Charger_Contact_Dans_Liste(Cellule* LC,Contact temp,FILE *fp)
    {
    fp=fopen("Contacts.txt","r");
    if(fp==NULL)
    printf("Ouverture impossible");
    else
    {while(fread((&temp),sizeof(Contact),1,fp) && !feof(fp))
    {
    printf("%s",temp.nom);
    LC=Inserer_Contact_tete(LC,temp);
    //printf("%s",LC->c->nom);
    
    }
    fclose(fp);
    }
    return LC;}
    void main()
    {int N;Cellule * L=NULL;
    printf("\n Bienvenue sur notre programme\n");
    Contact temp;
    int test;
    L=Charger_Contact_Dans_Liste(L,temp,fp);
    printf("%d",L->c->ref);
    
    
    
    
    
    }
    
    Les erreurs sont;
    C:\Users\Melek\Desktop\C_Project_2008\Melek_Project\Projet\Contenu.cpp(275) : error C2819: type 'contact' does not have an overloaded member 'operator ->'
            C:\Users\Melek\Desktop\C_Project_2008\Melek_Project\Projet\Contenu.cpp(14) : see declaration of 'contact'
    C:\Users\Melek\Desktop\C_Project_2008\Melek_Project\Projet\Contenu.cpp(275) : error C2227: left of '->ref' must point to class/struct/union
    Error executing cl.exe.
    
                                                     Merci pour votre patience avec moi:oops:

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Par défaut
    Pour référencer un composant d'une structure, l'opérateur est "."

  8. #8
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 37
    Par défaut Merci à tous
    Merci à tous et surtout à Fremen pour sa patience..

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Par défaut
    Salut,

    Tu as un problème dans la définition de ta structure. Essaye ça (avec les modifs de code associées), ça va mieux marcher car ton malloc allouera de la mémoire pour plus qu'un simple pointeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct Cellule_Contact
    {
    	Contact c;
    	struct Cellule_Contact * suivant;
    }Cellule;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#][NPOI] Affichage vraiment trop long
    Par corail01 dans le forum C#
    Réponses: 2
    Dernier message: 14/10/2014, 16h27
  2. [safari-JQuery] affichage étonnant de javascript
    Par elvan49 dans le forum jQuery
    Réponses: 5
    Dernier message: 22/01/2008, 14h29
  3. affichage d'une fenetre vraiment lent
    Par Pol63 dans le forum VB.NET
    Réponses: 1
    Dernier message: 14/06/2007, 09h54
  4. Pb affichage avec un PaintBox (pour eviter scintillement)
    Par juan64 dans le forum C++Builder
    Réponses: 7
    Dernier message: 08/04/2004, 09h21
  5. Affichage en passant par un buffer...
    Par Sirotilc dans le forum MFC
    Réponses: 5
    Dernier message: 27/05/2002, 21h00

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