1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2013
    Messages : 26
    Points : 15
    Points
    15

    Par défaut Lecture stdin et tableau dynamique

    Bonjour,

    Dans ce bout de code, je crée un tableau dynamique pour y stocker la chaine de caractère entrée par l'utilisateur.

    J'ai des consignes d'exercices qui sont celle ci:

    Écrire une fonction capable de lire au clavier une chaîne de caractères de taille quelconque.
    Tant que l’utilisateur introduit des caractères, il faudra les stocker dans la chaîne de caractères.
    La fin de lecture étant signalée par l’utilisateur au moyen de la touche <enter>.
    Le programme appelant ne réserve pas de place mémoire. Il se contente de faire appel à la
    fonction et d’afficher le résultat.
    Le code fonctionne a plusieurs reprise, mais plante au bout d'un certains nombre d'essais en m'affichant cette fenêtre

    Nom : erreur.PNG
Affichages : 78
Taille : 14,0 Ko

    Si je relance de suite après, j'ai le plantage qui revient quasi systématiquement plusieurs fois d'affilée.. puis le code refonctionne pour qlq essais..
    Bizarrement, ca affiche tjrs le même nombre de caractères (4) avant de planter..

    le code :

    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
    int main(int argc, char *argv[])
    {
     
    	// =======================================================================================================
    	// VARIABLE(S) LOCALE
    	// =======================================================================================================
    	int i = 0;
    	int j = 1;
    	char cTemp;
    	char *tTabChaine = NULL;
     
     
    	// =======================================================================================================
    	//  CODE
    	// =======================================================================================================
     
    	printf("Entrer une chaine de caractere : ");
     
    	tTabChaine = malloc(sizeof(char));
    	if (tTabChaine == NULL)
    	{
    		exit(0);
    		printf("Erreur malloc!!!");
    	}
     
    	do
    	{
     
    		cTemp = fgetc(stdin);
     
     
    		realloc(tTabChaine, j + 1);
    		if (tTabChaine == NULL)
    		{
    			exit(0);
    			printf("Erreur realloc!!!");
    		}
     
    		tTabChaine[i] = cTemp;
    		printf("%c", tTabChaine[i]);
    		j++;
    		i++;
    	}
    	while (cTemp != '\n');
     
    	realloc(tTabChaine, j + 1 * sizeof(char));
    	if (tTabChaine == NULL)
    	{
    		exit(0);
    		printf("Erreur realloc!!!");
    	}
     
    	tTabChaine[i] = '\0';
    	printf("%s\n", tTabChaine);
     
     
    	free(tTabChaine);
     
    	return 0;
    }

    Est ce qlq'un a une idée de pq ca me fait cette erreur de temps en temps, mais pas à chaque fois??
    Je sais que le code est un peu brut de décoffrage, mais je l’affinerais après que je sois sur qu'il fonctionne..

    Merci d'avance a ceux qui prendront le temps de réponde

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    4 935
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 4 935
    Points : 16 360
    Points
    16 360

    Par défaut

    Il faut toujours réaffecter la variable avec réalloc.
    réalloc peut déplacer le bloc mémoire, donc il faut mettre a jour la variable donnée en argument.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ptr = realloc(ptr, ...);
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2013
    Messages : 26
    Points : 15
    Points
    15

    Par défaut

    Citation Envoyé par ternel Voir le message
    Il faut toujours réaffecter la variable avec réalloc.
    réalloc peut déplacer le bloc mémoire, donc il faut mettre a jour la variable donnée en argument.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ptr = realloc(ptr, ...);

    un tout grand merci

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 451
    Points : 38 112
    Points
    38 112

    Par défaut

    Citation Envoyé par ternel Voir le message
    Il faut toujours réaffecter la variable avec réalloc.
    réalloc peut déplacer le bloc mémoire, donc il faut mettre a jour la variable donnée en argument.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ptr = realloc(ptr, ...);
    Tu oublies que realloc() retourne NULL en cas d'échec, et là tu as droit à une fuite de mémoire (et ce juste au moment où tu n'en as déjà plus assez).
    Personnellement, je gère ça avec des wrappers:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    _Bool realloc_char(char** pp, size_t newSize)
    {
    	char* pNew = realloc(*pp, newSize);
    	if(pNew != NULL)
    		*pp = pNew;
    	return (pNew != NULL);
    }
    Ce qui permet de l'utiliser ainsi:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(realloc_char(&tTabChaine, j+1)) {
    	...
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    4 935
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 4 935
    Points : 16 360
    Points
    16 360

    Par défaut

    J'approuve totalement ton approche medinoc.
    Note: en cas d'échec, le pointeur source n'est pas libéré par realloc, l'utilisateur doit en faire quelque chose.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2013
    Messages : 26
    Points : 15
    Points
    15

    Par défaut

    Merci pour ton conseil Ternel.

    On peut tout de suite voir que c'est une très bonne façon de faire.. ca évite plein d’écueil.


    Par contre, étant vraiment novice, j'aurais aimer savoir ce que tu aurais mis dans les braquet du if??
    Pq je ne comprend pas le pourquoi le test sur la fonction..


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(realloc_char(&tTabChaine, j+1)) {
    	...
    }

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    4 935
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 4 935
    Points : 16 360
    Points
    16 360

    Par défaut

    La fonction realloc peut échouer.
    C'est spécifié dans la documentation, et les cas possibles sont un problème dans la nouvelle taille, et un manque de mémoire disponible pour l'opération (qui peut inclure une copie du bloc mémoire)

    Comme elle peut le faire, il faut considérer qu'elle va le faire. Donc, il faut en tenir compte et définir que faire à ce moment là.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2013
    Messages : 26
    Points : 15
    Points
    15

    Par défaut

    ah ok,

    donc ca correspond a ce que je faisais ??!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (tTabChaine == NULL)
    	{
    		exit(0);
    		printf("Erreur malloc!!!");
    	}

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    4 935
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 4 935
    Points : 16 360
    Points
    16 360

    Par défaut

    presque, sauf qu'il faudrait le faire dans l'autre ordre, exit terminant le programme, et la, le problème est plus complexe, parce qu'on parle de realloc
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/03/2014, 13h31
  2. Tableau dynamique et lecture de fichier
    Par Nemesis007 dans le forum Débuter
    Réponses: 1
    Dernier message: 25/02/2010, 21h55
  3. tableau dynamique lecture des données d'un userform à un autre
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 02/10/2009, 17h40
  4. Delphi: Lecture d'un fichier avec un tableau dynamique
    Par grégoire2 dans le forum Langage
    Réponses: 8
    Dernier message: 10/02/2006, 18h50
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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