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 :

Comment stocker chaque ligne d'un fichier dans un tableau


Sujet :

C

  1. #41
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 568
    Points
    41 568
    Par défaut
    Dans return "bonjour", la chaîne "bonjour" est en mémoire statique (comme les variables globales), typiquement dans une zone en lecture seule.
    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.

  2. #42
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 89
    Points : 29
    Points
    29
    Par défaut
    Bon encore une nouvelle question lool et oui et ouii, c'est toujours au sujet de créer une fonction qui renvoit une chaine mais pour cette fonction je vois pas comment faire:
    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
     
    char *creer(int L, int C, char **conj)
    {
    	int i, j;
    	char **new;
    	new=malloc(sizeof(*new) * C);
    	for(i=0; i<C; i++) 
    		new[i] = malloc(sizeof(**new) * L);
     
    	for(i=0; i<C; i++) 
    		for(j=0; j<L; j++)
    			new[i][j]=conj[i][j];
     
    	char** Buffer = malloc(sizeof(*Buffer)*C);
    	for(i=0; i<C; i++) 
    		Buffer[i] = malloc(sizeof(**Buffer) * L);
     
    	for(i=0;i<C;i++)
    	{
    		if(Buffer != NULL)
    			strcpy(Buffer[i],new[i]);
    	}
    	return Buffer;	
     
    }
    Donc en fait je veux copier l'intégralité de Conjonction dans le nouveau tableau à deux dimensions new et je veux renvoyer new.
    Donc j'aimerais savoir comment ça marche dans ce cas précis vu que ce n'est pas un char * mais un char **

    Merki

  3. #43
    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 bartmanb Voir le message
    Donc en fait je veux copier l'intégralité de Conjonction dans le nouveau tableau à deux dimensions new et je veux renvoyer new.
    Donc j'aimerais savoir comment ça marche dans ce cas précis vu que ce n'est pas un char * mais un char **
    Alors tu retournes un char **. C'est pas évident ?

    Attention, je ne sais pas trop ce que tu cherches à faire, mais ça me parit compliqué et surtout tu ne libères pas le premier tableau dynamique (new).

    Pourquoi tu fais une copie ? Le premier tableau (new) ne suffit pas ?

    En relisant ton code, je pense plutôt qu'il est inutile.

    Pour copier les chaines, utlise strdup(), c'est fait pour et c'est POSIX.1, donc très portable... (de plus, c'est facile à reproduire).

    Je verrais ça comme ça :
    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
     
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
     
    char **copy_dyn (int L, char const **conj)
    {
       char **Buffer = malloc (sizeof *Buffer * L);
     
       if (Buffer != NULL)
       {
          int i;
          for (i = 0; i < L; i++)
          {
             Buffer[i] = strdup (conj[i]);
          }
       }
       return Buffer;
     
    }
     
    int main (void)
    {
       char  const *as[] = {
          "hello",
          "world",
       };
     
       int nb_lin = sizeof as / sizeof *as;
     
       char **pp = copy_dyn (nb_lin, as);
     
       if (pp != NULL)
       {
          int i;
     
          for (i = 0; i < nb_lin; i++)
          {
             printf ("'%s'\n", pp[i]);
          }
     
          for (i = 0; i < nb_lin; i++)
          {
             free (pp[i]), pp[i] = NULL;
          }
          free (pp), pp = NULL;
       }
       return 0;
    }
    Pose des questions si tu ne comprends pas.
    Pas de Wi-Fi à la maison : CPL

  4. #44
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Dans return "bonjour", la chaîne "bonjour" est en mémoire statique (comme les variables globales), typiquement dans une zone en lecture seule.
    Ok merci, je ne connaissais pas les chaînes en lecture seule en mémoire statique.
    L'espace mémoire réservé est-il valide pendant toute l'exécution du programme ? Si oui, c'est donc une pratique à éviter dans des structures itératives (mémorisation inutile de plusieurs chaînes qui ne seraient ni copiées dans des variables, ni réutilisées plus tard) ?
    <3 Debian
    [ C | C++ | PHP | Python ]

  5. #45
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 568
    Points
    41 568
    Par défaut
    Oui, cette mémoire est valide pendant toute la durée du programme.

    Et en lecture seule aussi. C'est pourquoi il est recommandé d'utiliser un const char * à la place d'un char *. Si tu compiles avec gcc, l'option -Wwrite-strings t'y aidera.
    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.

  6. #46
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par Haze
    @Melem : Je ne comprends pas pourquoi ce code est bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char * bonjour()
    {
        return "bonjour";
    }
    La fonction retourne juste un pointeur : alors où est stockée la chaîne de caractères lorsque la fonction se termine ?
    "bonjour" est une constante chaîne de caractères, elle est "prête" avant même l'exécution du programme (comme toutes les autres expressions constantes).

  7. #47
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Merci à vous deux pour ces précisions.
    <3 Debian
    [ C | C++ | PHP | Python ]

  8. #48
    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 Melem Voir le message
    "bonjour" est une constante chaîne de caractères, elle est "prête" avant même l'exécution du programme (comme toutes les autres expressions constantes).
    Une chaine de caractères littérale n'est pas une 'expression constante'. C'est un tableau (non-modifiable L-value) de caractères initialisé. Par contre, il a une adresse qui est une expression constante. C'est cette valeur qui est retournée par la fonction. (En fait, c'est l'adresse du premier élément du tableau, mais c'est la même valeur, c'est garanti par le langage)
    Pas de Wi-Fi à la maison : CPL

  9. #49
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Une chaine de caractères littérale n'est pas une 'expression constante'. C'est un tableau (non-modifiable L-value) de caractères initialisé. Par contre, il a une adresse qui est une expression constante. C'est cette valeur qui est retournée par la fonction. (En fait, c'est l'adresse du premier élément du tableau, mais c'est la même valeur, c'est garanti par le langage)
    Tout à fait.

  10. #50
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 89
    Points : 29
    Points
    29
    Par défaut
    Alors j'ai fais une fonction pour copier qui ressemble plutôt à ça finalement:
    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
     
    char **creer(int L, int C, char **conj)
    {
    	int i, j;
    	char **new;
    	new=malloc(sizeof(*new) * C);
     
    	for(i=0; i<C; i++) 
    		new[i] = malloc(sizeof(**new) * L);
     
    	for(i=0; i<C; i++) 
    		for(j=0; j<L; j++)
    			new[i][j]=conj[i][j];
     
    	return new;
    }
    Mais le return ne renvoit rien de bon, alors que quand je fais afficher le tableau new[i][j] pour tout i,j la copie s'est bien déroulé.

    D'où peut venir ce soucis ?

  11. #51
    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 bartmanb Voir le message
    Mais le return ne renvoit rien de bon, alors que quand je fais afficher le tableau new[i][j] pour tout i,j la copie s'est bien déroulé.

    D'où peut venir ce soucis ?
    Tu fais n'importe quoi (Tu inverses C et L ...). J'ai donné le bon code.
    Pas de Wi-Fi à la maison : CPL

  12. #52
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 89
    Points : 29
    Points
    29
    Par défaut
    Non en fait je faisais pas un bon printf dans le main pour tester,sinon ma fonction comme la tienne est bonne ...

    MerKi !

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/04/2008, 00h38
  2. comment stocker les données d'une hashtable dans un fichier?
    Par mokh7 dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 02/04/2008, 02h31
  3. Réponses: 13
    Dernier message: 20/11/2006, 17h46
  4. Comment mettre les lignes d'un fichier dans un tableau en shell
    Par Ombrius dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 23/10/2006, 12h34
  5. Réponses: 14
    Dernier message: 19/11/2005, 18h56

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