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 :

Nombre d'�l�ments dans un tableau de "string"


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair�
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par d�faut Nombre d'�l�ments dans un tableau de "string"
    Bonjour � tous

    j'ai un tableau de caract�res d�fini ainsi:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    const char *st[]={"Contact","NRJ","Evasion","Nostalgie","Chante France","Mercure","Orient","Skyrock","Voltage","Rire&Chansons","M Radio","Nova","Fun","RMC",
                      "Virgin","RFM","RTL","EUROPE 1","France Info","RTL2"};
    Comment puis-je conna�tre par programme le nombre de stations d�finis dans mon tableau?
    La question est peut-�tre ridicule puisque c'est un tableau de constantes, mais je voudrais utiliser ce nombre plusieurs fois dans mon programme.
    Merci

  2. #2
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    Par d�faut
    C'est 1 question C

    En C++, tu as std::vector ou std::array (<- 2 liens cplusplus.com en anglais)

    Pour r�pondre en C, il faut toujours "trimbaler" la taille du tableau avec le tableau. Peut-�tre encapsuler la taille et le tableau dans 1 structure.

    1 autres solution, c'est de mettre 1 sentinelle en dernier �l�ment, par exemple 1 cha�ne vide.
    Et avec 1 boucle for tu comptes les cha�nes de caract�res jusqu'� la longueur soit 0 (strlen() == 0)

    C'est comme fonctionne la fonction strlen.

  3. #3
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    D�cembre 2019
    Messages
    679
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 95
    Localisation : Autre

    Informations professionnelles :
    Activit� : ..

    Informations forums :
    Inscription : D�cembre 2019
    Messages : 679
    Par d�faut
    Salut,

    Ou simplement const size_t st_size= sizeof st / sizeof *st;

  4. #4
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    Par d�faut
    Citation Envoy� par kaitlyn Voir le message
    Ou simplement const size_t st_size= sizeof st / sizeof *st;
    Je suis 1 peu rouill� mais il me semble que cela ne fonctionne seulement dans la fonction o� se trouve le tableau.
    S�rement qu'en variable globale, c'est valide pour l'entieret� du source

  5. #5
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    D�cembre 2019
    Messages
    679
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 95
    Localisation : Autre

    Informations professionnelles :
    Activit� : ..

    Informations forums :
    Inscription : D�cembre 2019
    Messages : 679
    Par d�faut
    Tu peux aussi les mettre en static dans une fonction et interroger cette derni�re si tu souhaites partager ces variables mais que tu ne veux pas de globales.

  6. #6
    Membre exp�riment�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juillet 2018
    Messages
    104
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyr�n�es)

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

    Informations forums :
    Inscription : Juillet 2018
    Messages : 104
    Par d�faut
    Pour �claircir certains points:
    • Ecrire type a[] = {v1, v2, ..., vN} est �quivalent � �crire type a[N] = {v1, v2, ..., vN} . C'est juste que le compilateur sait compter, et te permet de ne pas mettre explicitement le nombre pour �viter la redondance.
    • Un tel tableau est alou� "statiquement", dans la stack. Le compilateur est donc oblig� de conna�tre la taille du tableau, mais seulement au niveau de la fonction (stack frame), ce qui rejoint ce que dit foetus. J'avoue que je ne sais pas comment �a se comporte pour des variables globales (qui de toute fa�on doivent �tre �vit�e ).
    • Le compilateur ne donne pas directement l'acc�s � la dimension d'un "C-style array". Mais il donne la taille d'un type quelconque avec sizeof. Sachant que si type est un type (dans ton cas char*), alors on peut voir type[N] comme un autre type, de taille N fois plus grande. D'o� "l'astuce" commune pr�sent�e par kaitlyn de r�cup�rer le nb d'�l�ments d'un tableau par la taille du tableau divis�e par la taille d'un �l�ment : st_size = sizeof st / sizeof *st;
    • Les compilateurs qui supportent la syntaxe des Range-base for loops (C++11) permettent d'it�rer sur les �l�ments d'un tel tableau plus proprement, sans avoir � expliciter la taille:
      Code : S�lectionner tout - Visualiser dans une fen�tre � part
      1
      2
      3
      for (const char* st_element : st) {
        std::cout << st_element << std::endl;
      }
    • Peut-�tre un peu hors-sujet, mais pour passer un tableau en param�tre d'une autre fonction, il faut passer en param�tre:
      • Soit un pointeur sur le premier �l�ment du tableau et la taille du tableau: (const char** st, size_t st_size)
      • Soit le pointeur sur le premier �l�ment, et un pointeur de fin (dernier �l�ment + 1): (const char** st_start, const char** st_end). On se rapproche l� plus du principe des it�rateurs, comme utilis�s en masse par les fonction de la stl, comme std::find, mais il faut aborder l� les it�rateurs/templates, ce qui est beaucoup trop pour ce sujet
      • Soit une r�f�rence sur un tableau du m�me type: (const char* (&st)[N]). Ca sous-entend que tu explicites la taille du tableau � cette autre fonction � la compilation.
    • Et pour finir, tous les points pr�c�dents ne sont que pour la th�orie, puisqu'en pratique, il vaut mieux utiliser les structures C++ si tu es en C++, comme dit par foetus lors de son 1er message.

  7. #7
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    D�cembre 2019
    Messages
    679
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 95
    Localisation : Autre

    Informations professionnelles :
    Activit� : ..

    Informations forums :
    Inscription : D�cembre 2019
    Messages : 679
    Par d�faut
    Avec la compilation s�par�e, quand le compilateur rencontre un range for loop ou un sizeof, il faut que le tableau soit d�j� d�fini, � la port�e, et ce dans la m�me unit� de compilation.

    J'ajoute quand m�me une r�f�rence � std::to_array au cas o�: https://en.cppreference.com/w/cpp/co...array/to_array

  8. #8
    Membre �clair�
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par d�faut
    Ou simplement const size_t st_size= sizeof st / sizeof *st;
    J'ai �crit cela:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    const size_t nbStations = sizeof st / sizeof *st;
    et le r�sultat est: nbStations =20
    Cela fonctionne donc bien et je vous en remercie.
    Par contre je n'ai pas vraiment compris le calcul.

  9. #9
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    Par d�faut
    Citation Envoy� par mormic Voir le message
    Par contre je n'ai pas vraiment compris le calcul.
    Tu divises la taille totale du tableau sizeof st par la taille du premier �l�ment sizeof *st (ou sizeof st[0])

    Et justement il est l� le probl�me : pour que sizeof st fonctionne il faut que st soit consid�r� comme 1 tableau.
    Parce qu'en C, lorsqu'on passe en param�tre 1 tableau, il est d�grad� en pointeur (et donc sizeof te retourne soit 4 (en 32 bits) soit 8 (en 64 bits))

  10. #10
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    D�cembre 2019
    Messages
    679
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 95
    Localisation : Autre

    Informations professionnelles :
    Activit� : ..

    Informations forums :
    Inscription : D�cembre 2019
    Messages : 679
    Par d�faut
    Citation Envoy� par dalfab Voir le message
    Attention, la formule qui t'a �t� donn�e est � utiliser en C.
    Effectivement, la r�ponse faisait suite au

    Citation Envoy� par foetus Voir le message
    Pour r�pondre en C

    Citation Envoy� par mormic Voir le message
    Ce que je n'avais pas compris c'�tait que mes �l�ments n'ayant pas tous la m�me longueur, c'est un coup de chance de tomber sur une valeur juste?
    Ton tableau stocke des pointeurs, toutes les cases ont la m�me taille. Aussi sur arduino il y a un attribut de variable (PROGMEM il me semble), qui force � conserver les chaines de caract�res dans la m�moire flash. Pose ta question dans le forum appropri� pour savoir comment l'utiliser.

    Edit;

    https://www.arduino.cc/reference/en/...ities/progmem/

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

Discussions similaires

  1. R�ponses: 5
    Dernier message: 13/08/2018, 22h55
  2. Nombre d'�l�ments dans un tableau
    Par BioKore dans le forum D�buter
    R�ponses: 4
    Dernier message: 14/11/2017, 22h58
  3. [PHP 5.3] compter nombre d'�l�ments dans un tableau
    Par Loubard21 dans le forum Langage
    R�ponses: 2
    Dernier message: 28/12/2010, 16h12
  4. Compter le nombre d'�l�ment dans un tableau
    Par cryptorchild dans le forum Langage
    R�ponses: 6
    Dernier message: 08/07/2005, 13h01
  5. Comparaison de base et calculs du nombre d'�l�ments dans Bas
    Par BXDSPORT dans le forum Bases de donn�es
    R�ponses: 3
    Dernier message: 19/07/2004, 08h00

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