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 :

Tableaux de "string"


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 25
    Par défaut Tableaux de "string"
    Bonjour à tous,

    J'ai un problème avec un tableau de chaînes de caractères à l'intérieur d'une structure. Voilà l'opération que j'aimerais 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
    26
     
    typedef struct
    {
    	char *treatmentDatTab[100][11];
    	char *progName[100][16];
    } DataToInsert;
     
    int main()
    {
    	DataToInsert insertData;
    	int i = 0;	
     
    	for(i = 0; i < 100; i++)
    	{
    		getIncidentData(&insertData, i);
    	}
    }
     
    int getIncidentData(DataToInsert *insertData, int index)
    {
    	char treatmentDat[11] = "04-01-2012";
    	char prog_name[16] = "CreateIncidence"; 
     
    	insertData->treatmentDatTab[index] = treatmentDat;
    	insertData->progNameTab[index] = prog_name;
    }
    Mais bien entendu il n'en veut pas. Comment peut-on faire pour remplir un tableau de chaîne de caractère à l'aide d'une chaîne "constante" qui se trouve à l'intérieur d'une structure?

    J'ai essayé avec strcpy mais il n'en veut pas non plus.. Je suppose qu'une certaine notion doit me manquer cruellement.. Mais je vois pas du tout comment m'en sortir.

    Merci beaucoup de votre aide et de votre temps,
    Albin.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Par défaut
    Que représente ta structure ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct
    {
    	char treatmentDatTab[100][11];
    	char progName[100][16];
    } DataToInsert;
    Ca, c'est 2 tableaux de 100 chaines de caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct
    {
    	char *treatmentDatTab[100][11];
    	char *progName[100][16];
    } DataToInsert;
    (ton code)Ca, c'est 2 pointeur sur 2 tableaux de 100 chaines de caractères.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 25
    Par défaut
    *sifflote*

    Merci beaucoup....

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Je pensais à la même explication que mala92. Ton compilateur doit t'afficher une erreur ou un warning (d'ailleurs "il n'en veut pas" signifie quoi exactement ?) te disant que les types sont incompatibles.

    Remarque, j'essaye de compiler chez moi et j'ai cette erreur :
    Description Resource Path Location Type
    Field 'progNameTab' could not be resolved main.c /TestC/src line 53 Semantic Error
    Il y a aussi des warning sur les retours de tes fonctions.

    Une fois ces problèmes réglés , j'ai bien l'erreur dont je parlais :
    Description Resource Path Location Type
    incompatible types when assigning to type 'char *[11]' from type 'char *' main.c /TestC/src line 52 C/C++ Problem

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par mala92 Voir le message
    Que représente ta structure ?
    ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct
    {
    	char *treatmentDatTab[100][11];
    	char *progName[100][16];
    } DataToInsert;
    (ton code)Ca, c'est 2 pointeur sur 2 tableaux de 100 chaines de caractères.
    Non, ce sont deux tableaux de 100 tableaux de 11 ou 16 pointeurs sur char.
    Ce ne sont pas des pointeurs sur tableaux qui s'écriraient char (*treatmentDatTab)[100][11]; : pointeur sur un tableau de 100 tableaux de 11 char

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Par défaut
    Citation Envoyé par diogene Voir le message
    Non, ce sont deux tableaux de 100 tableaux de 11 ou 16 pointeurs sur char.
    En effet, maintenant, je sais pourquoi je n'utilise pas ce genre de déclaration.

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int getIncidentData(DataToInsert *insertData, int index)
    {
    	char treatmentDat[11] = "04-01-2012";
    	char prog_name[16] = "CreateIncidence"; 
     
    	insertData->treatmentDatTab[index] = treatmentDat;
    	insertData->progNameTab[index] = prog_name;
    }
    Ceci n'est pas possible pour deux raisons :

    1- insertData->treatmentDatTab[index] est un tableau (de 11 pointeurs sur char). Or il est impossible d'écrire tableau = quelque chose.
    Par contre, on pourrait écrire (mais ce n'est visiblement pas ce qui est souhaité) insertData->treatmentDatTab[index][0] = treatmentDat;.

    2- Si c'était possible, alors on stockerait l'adresse du premier élément du tableau local treatmentDat. En sortie de fonction cette adresse deviendrait invalide puisque les variables locales sont détruites.
    C'est différent d'écrire insertData->treatmentDatTab[index][0] = treatmentDat; et insertData->treatmentDatTab[index][0] = "04-01-2012";.

    Naturellement, idem pour l'autre tableau

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Merci pour la subtile précision diogene

    C'est différent d'écrire insertData->treatmentDatTab[index][0] = treatmentDat; et insertData->treatmentDatTab[index][0] = "04-01-2012";
    Tu fais une copie d'adresse dans les 2 cas non ? Dans le second cas, le pointeur est toujours valide en sortie de fonction car défini dans la zone de mémoire constante. C'est bien ça ?

    Je pense que ce que voulait faire AlbinOSG est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef struct
    {
    	char treatmentDatTab[100][11];
    	char progNameTab[100][16];
    } DataToInsert;
     
    ...
     
    	strcpy(insertData->treatmentDatTab[index], treatmentDat);
    	strcpy(insertData->progNameTab[index], prog_name);

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

Discussions similaires

  1. quoted string not properly terminated & autres
    Par gRRosminet dans le forum SQL
    Réponses: 14
    Dernier message: 17/01/2013, 14h17
  2. Réponses: 2
    Dernier message: 10/11/2009, 15h14
  3. ORA-01756: quoted string not properly terminated
    Par hottnikks_79 dans le forum SQL
    Réponses: 14
    Dernier message: 22/05/2007, 12h02

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