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 :

D�claration tableau de chaine de caract�res


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    F�vrier 2024
    Messages
    28
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2024
    Messages : 28
    Par d�faut D�claration tableau de chaine de caract�res
    Bonjour,

    Je voudrai vous demander des �claircissements pourquoi un tableau de chaine de caract�res (=matrice) char string[][50] fonctinne (avec l'utilisation directe d'une constante) en revanche char string[][M] ne fonctionne pas dans le cas ou on a la d�claration const int M=50;

    Par avance merci.

  2. #2
    Expert confirm�
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 084
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activit� : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 084
    Par d�faut
    Bonjour,

    � premi�re vue, cette d�claration semble �quivalente � la premi�re. Cependant, en C, bien que M soit d�clar� comme une constante, il est consid�r� comme une constante "variable" au moment de la compilation. Cela signifie que sa valeur n'est pas int�gr�e dans le code � la compilation comme une constante litt�rale (comme le serait 50 directement dans le code). Par cons�quent, utiliser M de cette mani�re dans la d�finition d'une taille de tableau n'est pas permis par la norme C pour la d�claration de tableaux � taille fixe au niveau global ou dans le contexte d'une fonction o� la taille doit �tre connue au moment de la compilation.

    Le langage C a �t� con�u pour �tre proche de la machine et tr�s efficace, ce qui implique que certaines d�cisions doivent �tre prises au moment de la compilation. La taille des tableaux � allocation statique en fait partie, car elle d�termine comment l'espace m�moire est allou� et comment les acc�s � cet espace sont calcul�s.

    Les solutions possibles :

    Utiliser des macros : Contrairement aux variables const, les macros sont remplac�es par leur valeur au moment de la pr�compilation, ce qui les rend utilisables pour d�clarer la taille d'un tableau.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    #define M 50
    char string[][M];
    Allocation dynamique : Si vous avez besoin d'une taille variable pour vos tableaux, envisagez d'utiliser l'allocation dynamique avec malloc ou calloc. Cela vous permet d'utiliser des variables pour d�finir la taille du tableau, mais cela implique aussi que vous devrez g�rer manuellement la m�moire (allocation et lib�ration).

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    const int M = 50;
    char (*string)[M] = malloc(N * sizeof(*string));
    O� N est le nombre de cha�nes que vous souhaitez allouer. Cette m�thode offre plus de flexibilit� mais n�cessite une gestion attentive de la m�moire pour �viter les fuites.

  3. #3
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    F�vrier 2024
    Messages
    28
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2024
    Messages : 28
    Par d�faut
    Re-bonjour,

    Merci beaucoup pour la r�ponse, c'est claire et nette.

    Juste un petit point l'�criture (cas allocation dynamique) si j'ai bien compris : char (*string)[M] = char* string[M] => c.�.d (*string) est un pointeur sur un tableau de char de taille M.

    En revanche quand j'essaye de compiler : char (*string)[M] = malloc(N * sizeof(*string));

    J'obtiens le message suivant : [Error] invalide conversion from 'void' to 'char(*)[50]' .

    Donc, il doit y avoir une conversion de type (cast) que je n'aarive pas � r�soudre.

    Merci.

  4. #4
    Expert confirm�
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 084
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activit� : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 084
    Par d�faut
    Vous compilez avec ?

    Vous souhaitez allouer dynamiquement un tableau de N �l�ments, o� chaque �l�ment est un tableau de M caract�res. Le type de votre pointeur string est donc un pointeur sur un tableau de M caract�res, c'est-�-dire char (*)[M].
    Essayez cette ligne avec le cast :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    char (*string)[M] = (char (*)[M])malloc(N * sizeof(*string));
    Le standard C permet l'affectation d'un pointeur void* � n'importe quel autre type de pointeur sans cast. Cependant, certains compilateurs ou certaines configurations de compilateurs (par exemple, avec des avertissements stricts activ�s) peuvent �mettre un avertissement ou une erreur si le cast est omis.

  5. #5
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    Bonjour,

    La ligne char (*string)[M] = malloc(N * sizeof(*string)); est valide en C et doit compiler.
    Par contre un compilateur C++, lui la refuserait en indiquant qu'il manque un cast. Es-tu s�r de compiler en C?
    Si la ligne suivante char (*string)[M] = static_cast<char(*)[M]>(malloc(N * sizeof(*string))); est accept�e, c'est du C++!!

  6. #6
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 773
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 773
    Par d�faut
    Citation Envoy� par hogar Voir le message
    En revanche quand j'essaye de compiler : char (*string)[M] = malloc(N * sizeof(*string));
    Reste � la bonne vieille syntaxe

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define G_STR_LENGTH 50 // global
     
    #define G_ARRAY_GET_ELT(ARRAY, X) (ARRAY + ((G_STR_LENGTH + 1) * X))
     
    // ...
     
        size_t nb_str = 30;
     
        char* tab_strs = malloc(nb_str * ((G_STR_LENGTH + 1) /* * sizeof(char) */)); // +1 with '\0' and sizeof(char) is always 1
     
        if (tab_strs != NULL) {
            strcpy(tab_strs,                     "To be");
            strcpy(G_ARRAY_GET_ELT(tab_strs, 1), "or not");
            strcpy(G_ARRAY_GET_ELT(tab_strs, 2), "to be");
     
            printf("str1: %s, str2: %s, str3: %s\n", tab_strs, G_ARRAY_GET_ELT(tab_strs, 1), G_ARRAY_GET_ELT(tab_strs, 2));
     
            char* tmp_tab[30] = {tab_strs, G_ARRAY_GET_ELT(tab_strs, 1), G_ARRAY_GET_ELT(tab_strs, 2)};
     
            printf("str1: %s, str2: %s, str3: %s\n", tmp_tab[0], tmp_tab[1], tmp_tab[2]);
     
            free(tab_strs); // don't forget free(tab_strs)
        } else {
    //      Allocation failed
        }
    �dit: ici tu alloues 1 gros bloc. Mais tu peux faire 1 tableau de pointeurs char* tab_strs[30] et allouer chaque cha�ne de caract�res s�par�ment (par contre niveau gestion m�moire c'est long, et si tu utilises 1 variable pour d�finir la taille de ton tableau, c'est 1 VLA)

    documentation de stdlib.h, la partie "Dynamic memory management" avec essentiellement malloc et realloc (<- cstdlib, c'est la biblioth�que C en C++, on retire l'extension et on pr�fixe 1 c: cXXX)

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 10
    Dernier message: 31/05/2007, 15h10
  2. [C] tableau de chaines de caract�res
    Par kitsune dans le forum C
    R�ponses: 18
    Dernier message: 01/04/2006, 18h18
  3. tableau de chaine
    Par florantine dans le forum C++
    R�ponses: 1
    Dernier message: 18/01/2006, 15h17
  4. Tableau de cha�nes de caract�res
    Par mac1 dans le forum Langage
    R�ponses: 3
    Dernier message: 15/01/2006, 13h18
  5. R�ponses: 11
    Dernier message: 31/12/2005, 13h00

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