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 :

[Debutant]Probleme avec un realloc


Sujet :

C

  1. #1
    Membre chevronné Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Par défaut [Debutant]Probleme avec un realloc
    Bonjour,
    Tout dabord bonne année.
    Ensuite :
    Alors, jai un problème avec un realloc dans une procédure.
    J'explique le début dans un 1er temps.
    Je dois faire une saisie dans un tableau dynamique, cette saisie ce fait dans une procédure.
    Ce que je ne comprend pas, c'est que la première saisie marche bien, ensuite dès je relance une saisie, ja saisie précédent est affacée, la saisie courante est bien enregistré dans le bon indexe ( i+1).
    En début de procédure, j'incrémente un compteur et fait un realloc.
    > Je vous met le code :

    Appels dans la procédure dans le main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    saisie_auteur(tab_auteur, &nbEleA);
    procédure
    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
    void saisie_auteur(st_aut *tab_auteur, int *nbElA) {
     
    char saisie[150]="";
    int tmp=0;
    int i=0;
     
    	*nbElA=*nbElA+1;
    	//tmp=*nbElA;
     
    tab_auteur = (st_aut*)realloc(tab_auteur, (*nbElA)*sizeof(st_aut));
     
    	if(tab_auteur==NULL)                      
    {                                   
    	puts("Memoire insuffisante !");   
    	exit(-1);                         
    }                                   
     
     
     
    	printf("Saisissez le nom de l'auteur %d : ",*nbElA);
    	fflush(stdin);
    	gets(tab_auteur[*nbElA].nom);	
     
    	printf("Saisissez le prenom de l auteur %d : ",*nbElA);
    	fflush(stdin);
    	gets(tab_auteur[*nbElA].prenom);
     
    	printf("Saisissez la nationnalite de l auteur %d : ",*nbElA);
    	fflush(stdin);
    	gets(tab_auteur[*nbElA].nationalite);
     
    	fflush(stdin);
    	tab_auteur[*nbElA].auteurID=*nbElA;
     
    	for (i=0;i<=*nbElA;i++){
    		printf("[%d].id = %d\t[%d].nom = %s\t[%d].prenom = %s\t[%d].natio = %s\t\n"
    			,i,tab_auteur[i].auteurID,i,tab_auteur[i].nom,i,tab_auteur[i].prenom,i,tab_auteur[i].nationalite);	
    	}
     
    }
    voilà, merci d'avance pour votre aide, parce que là je séche completement, je pense que j'ai un pb de realloc, car si je met mon realloc dans le main, ca marche bien.

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Très méchant ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    tab_auteur = (st_aut*)realloc(tab_auteur, (*nbElA)*sizeof(st_aut)); 
    ...
    si ton realloc echoue, tab_auteur est NULL donc tu perd l'adresse et tu ne peut plus liberer. Utilises plutot un pointeur temporaire style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
    tab_temp = (st_aut*)realloc(tab_auteur, (*nbElA)*sizeof(st_aut)); 
     
    if (tab_temp)
    {
       /* Mise a jour du pointeur. */
       tab_auteur = tab_temp;
    }
    ...
    Normalement là ca devrait fonctionner un peu mieux
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre chevronné Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Par défaut
    erf oui exact, pas tres intelligent de faire comme cà.

    Cependant, mon problème est toujours là.

    J'ai l'impression de perde l'information sur l'index -1 demon tableau à la deuxième saisie.
    C'est comme si il etait à null.

    Je comprend pas pourqoi ca intervient à la deuxième saisie, et non directement à la 1ere. Je charge mon tableau à partir d'un fichier binaire au préalable, j'ai déjà remplit 7 lignes et je les récupère sans pb.

    Là je dois dire que je ne comprend pas, surtout le fait que si je met mon realloc dans le main cà marche au poil.

    Merci déjà pour ton aide et d'avoir répondus aussi vite.

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Humm je pense que passer l'adresse de ton tableau serais mieux, surtout si tu y ajoutes des données:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void saisie_auteur(st_aut **tab_auteur, int *nbElA)
    donc ton appel se fera:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    saisie_auteur(&tab_auteur, &nbEleA);
    A voir si ca resoud le problème ! Pour l'instant c'est tout ce que je vois, a moins que je suis trop fatigué

    Ha oui c'est vrai, j'avais oublié de dire qu'il ne faut plus utiliser gets mais plutot fgets ou autre ! voir saisie
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre chevronné Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Par défaut
    euh question bete on fait la saisie comme 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
    void saisie_auteur(st_aut **tab_auteur, int *nbElA) {
     
    char saisie[150]="";
    int tmp=0;
    int i=0;
    st_aut *tab_temp;
     
    	*nbElA=*nbElA+1;
    	//tmp=*nbElA;
     
    tab_temp = (st_aut*)realloc(*tab_auteur, (*nbElA)*sizeof(st_aut));
     
    if (tab_temp)
    {
       /* Mise a jour du pointeur. */
       *tab_auteur = tab_temp;
       printf("test\n");
    }                     
     
     
     
    	printf("Saisissez le nom de l'auteur %d : ",*nbElA);
    	fflush(stdin);
    	gets(*tab_auteur[*nbElA]->nom);
    Sinon si j'ai bien compris les deux étoiles (**) ca sert à pointé sur l'adresse du tableau, ce que je ne comprend pas, c'est que notre prof nous a dit que justement dans le cas des tableau, il n'y a avait pas besoin de poiteur, car le nom du tableau indique son adresse de départ ( si je me rappels bien ). Donc pourquoi doit on utiliser un pointeur ?

    Snon à la saisie, j'ai une erreur :
    La mémoire ne peut etre "read"
    Merci en tout cas.

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Hum moi je fait toujours de cette maniere:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gets((*tab_auteur[*nbElA])->nom);
    mais il parait que l'autre (la tiennes) fonctionne aussi.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Jabbal'H
    Sinon si j'ai bien compris les deux étoiles (**) ca sert à pointé sur l'adresse du tableau, ce que je ne comprend pas, c'est que notre prof nous a dit que justement dans le cas des tableau, il n'y a avait pas besoin de poiteur, car le nom du tableau indique son adresse de départ ( si je me rappels bien ). Donc pourquoi doit on utiliser un pointeur ?
    Exemple (si mes souvenirs sont exacts): tab fournit l'adresse de ton tableau ou du moins du premier indice alors que &tab fournit l'adresse où est stocké ton tableau. Le but est de fournir donc l'adresse du tableau, ce qui a pour but de pouvoir le modifier directement, alors que dans l'autre cas, c'est comme si tu créé une copie locale ... là encore je pense qu'il est possible de faire autrement mais je n'en suis pas sûr !

    Le 2° cas (*) suffit pour parcourir ton tableau mais peut être pas pour le modifier ! Moi je procède toujours de la sorte et celà fonctionne très bien !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    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 CSoldier
    Hum moi je fait toujours de cette maniere:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gets((*tab_auteur[*nbElA])->nom);

  9. #9
    Membre chevronné Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Par défaut
    a priori la methode "gets" est deprecated, ca m'étonne que mon prof nous l'ais présenté, et surtout parlé de "fgets" que pour les fichiers.

  10. #10
    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 Jabbal'H
    a priori la methode "gets" est deprecated, ca m'étonne que mon prof nous l'ais présenté, et surtout parlé de "fgets" que pour les fichiers.
    • Il n'y a pas de 'méthode' en C, mais des fonctions.
    • L'expérience montre qu'un prof technique qui n'est pas issu de l'industrie ne fait que reproduire ce qu'il a appris sans jamais le remettre en cause...
    • stdin est un flux comme un autre (la notion de 'fichier' en C est un peu vague)...

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

  11. #11
    Membre chevronné Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Par défaut
    pardon pour les termes utilisées, c'est vrai que ce n'est pas tres précis.

    J'entendais fichiers pour la technique employée pour y écrire.

    Concernant mon prof, c'est justement un professionnel issu de l'industrie, qui y travail encore. Mais peut etre qu'il n'utilise plus le C, je ne sais pas.

  12. #12
    Membre chevronné Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Par défaut
    Alors là je comprend plus.
    J'ai supprimer mon bug en faisant un truc qui me parait incohérent.
    J'ai enlevé le realloc, et ca marche.

    Le tableau se redimensionne quand meme, par quel miracle j'aimerais bien comprendre, si quelqu'un peut m'expliquer cà ????

    Bon ca en fait non ca me rassure ca marche plus, probablement du tampon ou je ne sais quoi qui se cachait

  13. #13
    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 Jabbal'H
    Alors là je comprend plus.
    J'ai supprimer mon bug en faisant un truc qui me parait incohérent.
    J'ai enlevé le realloc, et ca marche.
    Euh, c'est pas très clair là... Montre ton code...

  14. #14
    Membre chevronné Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Par défaut
    Hum désolé je me suis trompé, je comprend pas tres bien ce qu'il s'est passé, mais après quelques autre essais, ca ne marchait plus, enfin disons plutot que cela avait de nouveau un comportement logique.

    Je pense que mon problème vient de mon realloc, j'ai essayé avec un tableau non dynamique et ca marche.
    Donc je cherche toujours ...

  15. #15
    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 Jabbal'H
    Je pense que mon problème vient de mon realloc, j'ai essayé avec un tableau non dynamique et ca marche.
    Donc je cherche toujours ...
    POSTE TON CODE!

  16. #16
    Membre chevronné Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Par défaut
    Euh oui pardon :
    Voici dans un 1er temps la procedure de saisie
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <string.h>
    #include "livre.h"
    #include "../menu/menuprot.h"
    #include "../init/init.h"
     
     
     
    void saisie_auteur(st_aut *tab_auteur, int *nbElA) {
     
    char saisie[150]="";
    int tmp=0;
    int i=0;
     
    st_aut *tab_temp;
     
     
     
    	*nbElA=*nbElA+1;
    	tmp=*nbElA;
     
    		tab_temp = (st_aut*)realloc(tab_auteur, (*nbElA+1)*sizeof(st_aut));
     
    if (tab_temp)
    {
       /* Mise a jour du pointeur. */
       tab_auteur = tab_temp;
    }                     
     
     
     
    	printf("Saisissez le nom de l'auteur %d : ",*nbElA);
    	fflush(stdin);		
    	fgets(saisie,sizeof(strlen(saisie)),stdin);
    	strcpy(tab_auteur[*nbElA].nom,saisie);
     
    	printf("Saisissez le prenom de l auteur %d : ",*nbElA);
    	fflush(stdin);
    	fgets(saisie,sizeof(strlen(saisie)),stdin);
    	strcpy(tab_auteur[*nbElA].prenom,saisie);
     
    	printf("Saisissez la nationnalite de l auteur %d : ",*nbElA);
    	fflush(stdin);
    	fgets(saisie,sizeof(strlen(saisie)),stdin);
    	strcpy(tab_auteur[*nbElA].nationalite,saisie);
     
    	fflush(stdin);
    	tab_auteur[*nbElA].auteurID=*nbElA;
     
    	for (i=0;i<=*nbElA;i++){
    		printf("[%d].id = %d\t[%d].nom = %s\t[%d].prenom = %s\t[%d].natio = %s\t\n"
    			,i,tab_auteur[i].auteurID,i,tab_auteur[i].nom,i,tab_auteur[i].prenom,i,tab_auteur[i].nationalite);	
    	}
     
    }
    Ensuite le main
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <string.h>
    #include <windows.h>
    #include "init/init.h"
    #include "saisie/livre.h"
    #include "saisie/auteur.h"
    #include "saisie/editeur.h"
    #include "menu/menuprot.h"
    #include "save/save.h"
     
    void main(void) {
    	// declaration des tableaux lies aux fichiers
    	// les differentes structures sont declarees dans init.h
    	st_aut *tab_auteur=NULL;
    	st_livre *tab_livre;
    	st_genre *tab_genre;
    	st_editeur *tab_editeur;
    	int test=10;
    	FILE * fic_auteur;
     
    	int nbEleA=-1;
    	int nbEleL=-1;
    	int nbEleG=-1;
    	int nbEleE=-1;
    	int vartmp=-1;
    	int retour_menu=0;
    	int i=0;
     
    char saisie[150]="";
    int tmp=0;
    char chemin[255]="";
    char chA[255]="";
     
     
    	// chemin ou est lance le processus
    	GetCurrentDirectory (255, chemin);	
     
    	//chemin du fichier auteur
    	strncat(chA,chemin,strlen(chemin));
    	strcat(chA,"\\auteur.bin");
     
     
    	// initialisation des tableaux
    		tab_auteur = (st_aut*)malloc(sizeof(st_aut));
    		tab_livre = (st_livre*)malloc(sizeof(st_livre));
    		tab_genre = (st_genre*)malloc(sizeof(st_genre));
    		tab_editeur = (st_editeur*)malloc(sizeof(st_editeur));	
     
    /*#####################################################
    #  INITIALISATION DES NBS D ENREGISTREMENTS           #
    #####################################################*/
    	init_nb(&nbEleA,&nbEleL,&nbEleG,&nbEleE);
    /*#####################################################
    #  REDIMENTIONNEMENT DES TABLEAUX                     #
    #####################################################*/
    	tab_auteur = (st_aut*)realloc(tab_auteur, (nbEleA+1)*sizeof(st_aut));
    	tab_livre = (st_livre*)realloc(tab_livre, (nbEleL+1)*sizeof(st_livre));
    	tab_genre = (st_genre*)realloc(tab_genre, (nbEleG+1)*sizeof(st_genre));
    	tab_editeur = (st_editeur*)realloc(tab_editeur, (nbEleE+1)*sizeof(st_editeur));
     
    /*#####################################################
    #  INITIALISATION DES TABLEAUX                        #
    #####################################################*/	
    	init( tab_auteur,tab_livre,tab_genre,tab_editeur,nbEleA, nbEleL,nbEleG, nbEleE) ;
     
     
    /*-------------- FIN DES INITIALISATIONS -------------*/
     
    for (i=0;i<=nbEleA;i++){
    		printf("auteur[%d].nom = %s\n",i,tab_auteur[i].nom);
    	}
     
     
    	do {
    printf("main.nbElA = %d\n",nbEleA);
     
    //printf("main.tab_auteur[0].nom = %s\n",tab_auteur[0].nom);
    retour_menu=menuA();
     
     
    switch (retour_menu) {
    case 1: save_auteur(tab_auteur, nbEleA);break;
    case 2: saisie_editeur(tab_editeur,&nbEleE);  break;
    case 3: 
    //tab_auteur = (st_aut*)realloc(tab_auteur, (nbEleA+2)*sizeof(st_aut));
    	saisie_auteur(tab_auteur, &nbEleA); break;
    A priori les procedure d'initialisation sont bonne étant donné que je récupère bien mes donnée, et la sauvegarde se faire bien.

    Dans le main si je fais le realloc je n'ai plus de bug, par contre si je le fais dans la procedure, mon enregistrement index-1 semble etre effacé

  17. #17
    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 Jabbal'H
    Euh oui pardon :
    C'est pour un concours ?
    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
     
    Compiling: main.c
    main.c:10:19: livre.h: No such file or directory
    main.c:11:30: ../menu/menuprot.h: No such file or directory
    main.c:12:26: ../init/init.h: No such file or directory
    main.c:14: error: syntax error before '*' token
    main.c:14: warning: function declaration isn't a prototype
    main.c: In function `saisie_auteur':
    main.c:20: error: `st_aut' undeclared (first use in this function)
    main.c:20: error: (Each undeclared identifier is reported only once
    main.c:20: error: for each function it appears in.)
    main.c:20: error: `tab_temp' undeclared (first use in this function)
    main.c:24: error: `nbElA' undeclared (first use in this function)
    main.c:27: error: syntax error before ')' token
    main.c:32: error: `tab_auteur' undeclared (first use in this function)
    main.c:68:23: init/init.h: No such file or directory
    main.c:69:26: saisie/livre.h: No such file or directory
    main.c:70:27: saisie/auteur.h: No such file or directory
    main.c:71:28: saisie/editeur.h: No such file or directory
    main.c:72:27: menu/menuprot.h: No such file or directory
    main.c:73:23: save/save.h: No such file or directory
    main.c: At top level:
    main.c:75: error: conflicting types for 'main_'
    C:/clib/frmwrk/inc/main.h:34: error: previous declaration of 'main_' was here
    main.c:75: error: conflicting types for 'main_'
    C:/clib/frmwrk/inc/main.h:34: error: previous declaration of 'main_' was here
    main.c: In function `main_':
    main.c:78: error: `st_aut' undeclared (first use in this function)
    main.c:78: error: `tab_auteur' undeclared (first use in this function)
    main.c:79: error: `st_livre' undeclared (first use in this function)
    main.c:79: error: `tab_livre' undeclared (first use in this function)
    main.c:80: error: `st_genre' undeclared (first use in this function)
    main.c:80: error: `tab_genre' undeclared (first use in this function)
    main.c:81: error: `st_editeur' undeclared (first use in this function)
    main.c:81: error: `tab_editeur' undeclared (first use in this function)
    main.c:108: error: syntax error before ')' token
    main.c:109: error: syntax error before ')' token
    main.c:110: error: syntax error before ')' token
    main.c:111: error: syntax error before ')' token
    main.c:116: error: implicit declaration of function `init_nb'
    main.c:116: warning: nested extern declaration of `init_nb'
    main.c:120: error: syntax error before ')' token
    main.c:121: error: syntax error before ')' token
    main.c:122: error: syntax error before ')' token
    main.c:123: error: syntax error before ')' token
    main.c:128: error: implicit declaration of function `init'
    main.c:128: warning: nested extern declaration of `init'
    main.c:142: error: implicit declaration of function `menuA'
    main.c:142: warning: nested extern declaration of `menuA'
    main.c:146: error: implicit declaration of function `save_auteur'
    main.c:146: warning: nested extern declaration of `save_auteur'
    main.c:147: error: implicit declaration of function `saisie_editeur'
    main.c:147: warning: nested extern declaration of `saisie_editeur'
    main.c:150:46: warning: no newline at end of file
    main.c:150: error: syntax error at end of input
    main.c:82: warning: unused variable `test'
    main.c:83: warning: unused variable `fic_auteur'
    main.c:89: warning: unused variable `vartmp'
    main.c:93: warning: unused variable `saisie'
    main.c:94: warning: unused variable `tmp'
    Process terminated with status 1 (0 minutes, 1 seconds)
    Merci de poster une version réduite au minimum compilable qui montre le défaut.

  18. #18
    Membre chevronné Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Par défaut
    Erf autant pour moi : voilà je poste cà corectement :

    auteur.h
    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
    #ifndef AUTEUR_SAISIE_H
    #define AUTEUR_SAISIE_H
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <string.h>
    #include <windows.h>
     
    typedef struct auteur{
    	int auteurID;
    	char nom[50];
    	char prenom[150];
    	char nationalite[150];
    }st_aut;
     
    void saisie_auteur(st_aut *tab_auteur,int *nbE) ;
     
    #endif
    auteur.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
    47
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <string.h>
    #include "auteur.h"
     
    void saisie_auteur(st_aut *tab_auteur, int *nbElA) {
     
    char saisie[150]="";
    int i=0;
     
    st_aut *tab_temp;
     
    	*nbElA=*nbElA+1;
     
     
    		tab_temp = (st_aut*)realloc(tab_auteur, (*nbElA+1)*sizeof(st_aut));
     
    if (tab_temp)
    {
       /* Mise a jour du pointeur. */
       tab_auteur = tab_temp;
    }                     
     
    	printf("Saisissez le nom de l'auteur %d : ",*nbElA);
    	fflush(stdin);		
    	fgets(saisie,sizeof(strlen(saisie)),stdin);
    	strcpy(tab_auteur[*nbElA].nom,saisie);
     
    	printf("Saisissez le prenom de l auteur %d : ",*nbElA);
    	fflush(stdin);
    	fgets(saisie,sizeof(strlen(saisie)),stdin);
    	strcpy(tab_auteur[*nbElA].prenom,saisie);
     
    	printf("Saisissez la nationnalite de l auteur %d : ",*nbElA);
    	fflush(stdin);
    	fgets(saisie,sizeof(strlen(saisie)),stdin);
    	strcpy(tab_auteur[*nbElA].nationalite,saisie);
     
    	fflush(stdin);
    	tab_auteur[*nbElA].auteurID=*nbElA;
     
    	for (i=0;i<=*nbElA;i++){
    		printf("[%d].id = %d\t[%d].nom = %s\t[%d].prenom = %s\t[%d].natio = %s\t\n"
    			,i,tab_auteur[i].auteurID,i,tab_auteur[i].nom,i,tab_auteur[i].prenom,i,tab_auteur[i].nationalite);	
    	}
    }
    main.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
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <string.h>
    #include <windows.h>
    #include "auteur.h"
     
     
     
    void main(void) {
    	st_aut *tab_auteur;
    	int nbE=-1;
    	int i=0;
    	int choix=0;
     
     
    tab_auteur=(st_aut*) malloc (sizeof(st_aut));
     
     
     
    	do {
     
    		puts("1 : saisie");
    		puts("2 : Quitter");
    		fflush(stdin);
    		scanf("%d",&choix);
     
     
    		switch (choix) {
     
    		case 1:saisie_auteur(tab_auteur,&nbE); break;;
    		case 2:break;
     
    		}
    	} while (choix!=2);
    }
    Donc là le bug qui m'arrive :
    Le 7eme redimmensionnement cà plante.
    A priori l'autre bug que j'avais devait venir de ma procédure d'init, en faisant cette version, étant donné que j'ai viré cette procédure et que cà marche ( + ou - ), cela devait venir d'elle.

    Logiquement cette version se compile bien, encore désolé.

  19. #19
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Je voudrais pas insister, mais il doit en manquer ...

  20. #20
    Membre chevronné Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Par défaut
    euh non je viens de creer un nouveau projet en copiant collant le code que jai posté, et ca compile et s'éxécute corectement.

    Qu'est ce qu'il te semble manquer ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Debutant] Probleme avec BevelBorder
    Par devil26 dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 09/05/2005, 09h41
  2. [debutant]probleme avec wxwidgets
    Par iwky dans le forum wxWidgets
    Réponses: 11
    Dernier message: 23/01/2005, 20h23
  3. [DEBUTANT] Probleme avec glortho
    Par barthelv dans le forum OpenGL
    Réponses: 12
    Dernier message: 23/11/2004, 14h21
  4. [DEBUTANT] probleme avec split ?
    Par matN59 dans le forum ASP
    Réponses: 6
    Dernier message: 23/10/2004, 15h47
  5. Réponses: 2
    Dernier message: 31/08/2004, 11h45

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