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 :

Probleme avec tableau de char


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Bio-informaticienne
    Inscrit en
    Septembre 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Bio-informaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2009
    Messages : 97
    Par défaut Probleme avec tableau de char
    Je suis entrain de faire un devoir et je me perd un peu car je n'ai pas trop l'habitude du c.
    Voila mon 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
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
     
    using namespace std;
     
    static void purger(void) {
        int c;
     
        while ((c = getchar()) != '\n' && c != EOF){}
    }
     
    int ChooseACat () {
        int n = 3;
    	// Si char = * exit
        while (n > 2){
           printf ("%s","\nchoisisez parmie les categories suivantes:\n0 sports\n1 musique\n2 pays\n");
           scanf ("%d",&n);
           purger();
        }
        return n;
    }
     
    int ChooseRandomNumber (int row) {
        int index = 0;
     
        /* initialize random seed: */
    	srand ( time(NULL) );
     
    	/* generate secret number: */
    	index = rand() % row;
     
    	return index;
    }
     
    char ChooseALetter() {
        char letter;
    	printf ("%s","\nQuel lettre voulez vous tester:\n");
        scanf ("%c",&letter);
        purger();
    	return letter;
    }
     
    int main (void) {
    	// Intialisation des tableaux
    	const int row = 10; 
    	const int col = 25;
    	char sports  [ row ][ col ] = {"soccer","tennis","course","musculation","patin","escalade","natation","ski","gym","escrime"};
    	char musique [ row ][ col ] = {"classique","saoul","reggae","jazz","rock","gospel","house","techno","punk","hardcore"};
        char pays    [ row ][ col ] = {"France","Canada","Argentine","Chili","Allemagne","Australie","Japon","Chine","Maroc","Iran"};
     
    	// Choix de la categorie 
    	int categorie = ChooseACat();
    	printf("La categorie choisie est la suivante %d\n",categorie);
     
    	// Choix de l'indice du nom a deviner
    	int index = ChooseRandomNumber(row);
    	printf("random number : %d\n",index);
     
    	char *mot;// = sports[index];
    	// Creation du tableau contenant le nom a deviner
    	if (index == 0) {
    	    mot = sports[index];
    	}
    	else if (index == 1) {
    	    mot = musique[index];
    	}
    	else if (index == 2) {
    	    mot = pays[index];
    	}
     
     
    	int len = sizeof(*mot);
    	printf("%d\n",len);
     
    	// Creation du tableau contenant le mot decouvert.
    	char decouvert[col];
     
    	int j = 0;
        while (mot[j] != NULL ) {
    		decouvert[j] = '-';
    		char letter = decouvert[j];
    		j++;
    	}
    	char letterToTest = ChooseALetter();
    	printf("la lettre a teste est %c\n",letterToTest);
     
        return 0;
    }

    Avec le code si dessous je n'ai pas de probleme de compilation met par contre j ai un Segmentation fault lors de l'execution alors quand remplacant la ligne de code suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *mot;// = sports[index];
    au lieu de celle ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *mot = sports[index];
    Je n'ai pas de probleme je ne comprend pas pourquoi !!!
    Une idée...

  2. #2
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    En fait si j'ai bien compris ce que vous voulez faire, vous voulez mettre une "ligne" dans mot car vous avez dans la tête le schéma tableau à deux dimensions= tableau de tableaux.
    Or ce n'est pas comme ça qu'est codé un tableau statique.
    En réalité un tableau[n1][n2] est codé en mémoire comme un tableau[n1*n2], il n'y a donc pas de tableau de pointeurs qui pointe vers d'autres tableaux vous ne pouvez donc pas faire l'affectation que vous avez en tête.

  3. #3
    Membre confirmé
    Femme Profil pro
    Bio-informaticienne
    Inscrit en
    Septembre 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Bio-informaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2009
    Messages : 97
    Par défaut
    en fait ce que je souhaiterais faire la chose suivante :

    J'ai les tableaux a 2 dimensions suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char sport [3][25]     = {"aaa","bbb","ccc"};
    char musique [3][25] = {"aaa","bbb","ccc"};
    char pays [3][25]      = {"aaa","bbb","ccc"};


    Et je voudrais recuperer un tableau a une dimension avec une entree par exemple l'entrée 2 du tableau sport, d'où mon idée de faire la chose suivante :

    ...

    Mais definitivement ca semple pas fonctionner correctement. Je ne comprend pas vraiment pourquoi...

  4. #4
    Membre confirmé
    Femme Profil pro
    Bio-informaticienne
    Inscrit en
    Septembre 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Bio-informaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2009
    Messages : 97
    Par défaut
    J'ai aussi tester ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char mot[25] = sports[index];
    du coup j'ai le message suivant :

    devinette.cpp:93: erreur: array must be initialized with a brace-enclosed initializer
    et si je fait ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char mot[25] = {sports[index]};
    et la j'ai le message suivant :

    devinette.cpp:93: erreur: invalid conversion from ‘char*’ to ‘char’
    Voila pour l'avancement de mon probleme, enfin le non avancement...

  5. #5
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Une solution(non testée donc peut-être pas valide) pourrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *mot=&(sport[index][0]);
    Sinon le mixage déclarations de variables, instructions est déconseillé je crois.

  6. #6
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Comme je viens de vous le dire les tableaux à deux dimensions déclarés statiquement ne sont pas vraiment à deux dimensions, ce sont simplement des tableaux d'une dimension, ainsi lorsque vous tapez:
    char tab[dim1][dim2];
    puis
    tab[i][j] en fait le compilateur interprête tab[i*dim2+j]

  7. #7
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    En fait votre raisonnement marcherait si vous aviez réservez dynamiquement les tableaux de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char** tab;
    tab=malloc(row*sizeof(char*));
    for(k=0;k<row;k++)
         tab[k]=malloc(col*sizeof(char));

  8. #8
    Membre confirmé
    Femme Profil pro
    Bio-informaticienne
    Inscrit en
    Septembre 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Bio-informaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2009
    Messages : 97
    Par défaut
    Je vais tester ca merci.

  9. #9
    Membre confirmé
    Femme Profil pro
    Bio-informaticienne
    Inscrit en
    Septembre 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Bio-informaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2009
    Messages : 97
    Par défaut
    En testant votre solution j'ai l'erreur suivante lors de la compilation :

    invalid conversion from ‘void*’ to ‘char**’

    J'ai essayer de chercher sur le net mais j' ai rien trouvé de pertinant, a part le fait que beaucoup de gens dise d,utiliser un compilateur c plutot qu'un compilateur c++ j'ai tester les deux et rien a faire .

    Je desespere, en tous cas merci pour votre aide.

  10. #10
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Pouvez-vous poster votre code et mettre les ou l'erreur?

  11. #11
    Membre confirmé
    Femme Profil pro
    Bio-informaticienne
    Inscrit en
    Septembre 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Bio-informaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2009
    Messages : 97
    Par défaut
    Sans probleme :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
     
    using namespace std;
     
    int main (void) {
    	// Initialisation des tableaux
    	const int row = 10; 
    	const int col = 25;
     
    	char **sports;
    	sports = malloc(sizeof(char *) * 10);
    	for(int row = 0; row < 10; row ++) {
    		sports[row] = malloc(sizeof(int) * 25);
    	}
        return 0;
    }
    A la compilation :
    gcc -o test test.cpp
    test.cpp: In function ‘int main()’:
    test.cpp:14: erreur: invalid conversion from ‘void*’ to ‘char**’
    test.cpp:16: erreur: invalid conversion from ‘void*’ to ‘char*’

  12. #12
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Ce doit être du au fait que c'est du c++
    Donc essayez ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char** tab;
    tab=(char**)malloc(row*sizeof(char*));
    for(k=0;k<row;k++)
         tab[k]=(char*)malloc(col*sizeof(char));

  13. #13
    Membre confirmé
    Femme Profil pro
    Bio-informaticienne
    Inscrit en
    Septembre 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Bio-informaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2009
    Messages : 97
    Par défaut
    Plus de probleme de compilation . Au risque de paraitre... pas tres douees en C++, ce que je suis vraiment, comment remplir ce tableau...

    comment remplir ce tableau avec les entree suivante : "soccer","tennis","course","musculation","patin","escalade","natation","ski","gym","escrime"

    avec quelques chose du type :

    sports[0] = "soccer";
    sports[1] = "tennis";

    ...

    Ou autrement ?

  14. #14
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Et attention à la ligne:
    sports[row] = malloc(sizeof(int) * 25);
    Vous avez mis int mais c'est char qu'il faut mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sports[row] = malloc(sizeof(char) * 25);

  15. #15
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    En C(je ne sais pas en C++) faire chaine1=chaine2 ne copie pas chaine 2 dans chaine1, pour pouvoir copier une chaine dans une autre, il faut utiliser la fonction strcpy ( char * destination, const char * source );.

  16. #16
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Pourquoi coder un code C avec un compilateur C++ ? Je ne vois pas l'intérêt.

  17. #17
    Membre confirmé
    Femme Profil pro
    Bio-informaticienne
    Inscrit en
    Septembre 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Bio-informaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2009
    Messages : 97
    Par défaut
    Merci mille fois.

    J'ai finalement le code suivant :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
     
    using namespace std;
     
    int main (void) {
    	// Intialisation des tableaux
    	const int row = 10; 
    	const int col = 25;
     
        char** sports;
        sports=(char**)malloc(row*sizeof(char*));
        for(int k=0;k<row;k++) {
            sports[k]=(char*)malloc(col*sizeof(char));
        }
    	strcpy (sports[0],"soccer");
    	int i = 0;
    	while (sports[0][i] != NULL ) {
    	    char lettre = sports[0][i];
    		printf("La lettre est %c\n",lettre);
    		i++;
    	}
    	return 0;
    }
    Et pas de probleme avec celui ca va juste etre fastidieux de remplir les 3 tableaux avec 10 entree chacun mais je vais deja commencer comme ca .

  18. #18
    Membre confirmé
    Femme Profil pro
    Bio-informaticienne
    Inscrit en
    Septembre 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Bio-informaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2009
    Messages : 97
    Par défaut
    Le compilateur c me donné la meme erreur !!! a vrai dire...

  19. #19
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Citation Envoyé par loula427 Voir le message
    Le compilateur c me donné la meme erreur !!! a vrai dire...
    Celles-ci ?
    test.cpp:14: erreur: invalid conversion from ‘void*’ to ‘char**’
    test.cpp:16: erreur: invalid conversion from ‘void*’ to ‘char*’
    C'est absolument impossible ! La conversion type*->void* ou void*->type* est implicite en C. Elle ne peut pas donner d'erreur.

    Par contre, tout compilateur C digne de ce nom donnera un beau message d'erreur sur :
    Car ceci n'existe pas en C.

  20. #20
    Membre confirmé
    Femme Profil pro
    Bio-informaticienne
    Inscrit en
    Septembre 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Bio-informaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2009
    Messages : 97
    Par défaut
    Hmm oki je viens de comprendre mon erreur...

    Je compiler avec gcc et j'ai laisser l'extension .cpp a mon fichier... d'ou mon erreur... j'etait persuadé de compiler en C .

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

Discussions similaires

  1. problème dllImport avec tableau de char[] en paramètre E/S
    Par moulefrite dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/12/2008, 10h07
  2. Probleme avec Tableau sous Word
    Par gilles06 dans le forum VBA Word
    Réponses: 8
    Dernier message: 26/02/2008, 23h03
  3. Probleme avec tableau
    Par kika18 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 06/12/2007, 13h06
  4. Pb avec tableau de char
    Par tintin72 dans le forum C++
    Réponses: 2
    Dernier message: 09/11/2007, 13h13
  5. [Tableaux] probleme avec tableau a recupere
    Par twixster dans le forum Langage
    Réponses: 14
    Dernier message: 16/02/2006, 17h50

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