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 :

[C] Initialiser un tableau à deux dimensions


Sujet :

C

  1. #1
    Membre régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    Par défaut [C] Initialiser un tableau à deux dimensions
    Re à toutes et à tous.

    Dans mon code, je suis amené dans l'une de mes fonctions à remplir un tableau à deux dimensions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char tszMonTableau[LONGUEUR1][LONGUEUR2];
    Cependant, comme j'utilise ce tableau dans une boucle, j'aimerais pouvoir faire les choses proprement et être capable de le réinitialiser.

    Mais à ce niveau, je vous avoue ne pas trop savoir comment faire. J'ai pensé à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memset(tszMonTableau, '\0', sizeof(tszMonTableau));
    Mais je me demande si mes paramètres sont bons. C'est pour cela que je me permets de vous demander : comment bien initialiser un tableau à plusieurs dimensions ?

    Merci d'avance.

    Bahan

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    sizeof ne peut pas marcher, tu le fais sur un pointeur, il va donc te renvoyer la grandeur d'un pointeur... Faut mettre LONGUEURX * LONGUEURY

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Peut-être avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char tszMonTableau[LONGUEUR1][LONGUEUR2] = {0};

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par Franck.H
    Peut-être avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char tszMonTableau[LONGUEUR1][LONGUEUR2] = {0};

    Un int au lieu d'un char, ça ne risque pas de passer.

    De plus, si les longueurs ne sont pas définies d'avance (genre si c'est pas un #define), le compilateur n'y arrivera pas car c'est une tableau de taille variable (et donc initialisation direct comme ça impossible).

  5. #5
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Je vote le memset, et pour la taille, effectivement c'est LONGUEUR1 * LONGUEUR2
    Sinon, on peut creer un type pour le tableau et on ferait sizeof de ce type là.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef char tableau_bi[LONGUEUR1][LONGUEUR2];
     
    /* ... */
    tableau_bi tszMonTableau;
    /*...*/
     
    memset(tszMonTableau, '\0', sizeof(tszMonTableau));

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par millie
    Un int au lieu d'un char, ça ne risque pas de passer.
    Revois un peu ton C dans ce cas

    Citation Envoyé par millie
    De plus, si les longueurs ne sont pas définies d'avance (genre si c'est pas un #define), le compilateur n'y arrivera pas car c'est une tableau de taille variable (et donc initialisation direct comme ça impossible).
    Ici je vois un tableau dont la taille ne varie pas à l'exécution étant donné que c'est un tableau static !

  7. #7
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par Franck.H
    Revois un peu ton C dans ce cas


    Ici je vois un tableau dont la taille ne varie pas à l'exécution étant donné que c'est un tableau static !

    Il faut mettre un (char) pour forcer le type sinon il y a des warnings (du moins sur mon compilateur).

    Ensuite, certes la taille ne varie pas ds l'appelle de la fonction, mais il peut se produire ce cas ci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void f (int LONGUEUR1, int LONGUEUR2)
    {
      char cc[LONGUEUR1][LONGUEUR2] = {0};
     
    }
    Qui d'après toi marche ! Ce qui ne peut pas être possible car LONGUEUR1 et LONGUEUR2 ne sont pas définis lors de la compilation...

  8. #8
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par millie
    Il faut mettre un (char) pour forcer le type sinon il y a des warnings.
    '\0' a le type int en C, comme 'a', '1', '-', etc. En C++, ces constantes ont le type char. Un cast explicite n'est pas necessaire, cependant, car leurs valeurs sont garanties comme entrant dans la gamme d'un char.

    Ensuite, certes la taille ne varie pas ds l'appelle de la fonction, mais il peut se produire ce cas ci
    C'est exact, mais les VLAs (norme C99) ne sont pas encore correctement implementes par la plupart des compilateurs. Leur utilisation est deconseillee (notamment dans un cas pareil, ou la taille du tableau peut etre consequente et que la creation du tableau echoue (ce qui represente la grosse difficulte de leur implementation...).

  9. #9
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void f (int LONGUEUR1, int LONGUEUR2)
    {
      char cc[LONGUEUR1][LONGUEUR2] = {0};
     
    }
    Faut faire attention à cette forme, je crois que C90 n'accepte pas de créer un tableau static avec des données variables !
    Mais sinon oui tu as raison cela ne peut fonctionner dans ce cas

  10. #10
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par DaZumba
    '\0' a le type int en C
    Si c'est du type int, le caractère '\0' devrait prendre sizeof(int) taille en mémoire et pas sizeof(char) ?

  11. #11
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par millie
    Si c'est du type int, le caractère '\0' devrait prendre sizeof(int) taille en mémoire et pas sizeof(char) ?
    Un type char ne prend pas la même place qu'un type int, il faut utiliser le type char pour le sizeof, le tableau étant de ce type.

  12. #12
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Faut faire attention à cette forme, je crois que C90 n'accepte pas de créer un tableau static avec des données variables !
    oui justement, mais rien n'interdisait bahan de faire comme ça !

    Tu avais dit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ici je vois un tableau dont la taille ne varie pas à l'exécution étant donné que c'est un tableau static !
    Dans ce cas, ça ne marche pas, rien ne pouvait laisser penser que ce cas ne se produirait pas

  13. #13
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Un type char ne prend pas la même place qu'un type int

    Justement, c'est ce que je dis, alors pourquoi daZumba dit que '\0' est un int.

  14. #14
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par millie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Un type char ne prend pas la même place qu'un type int

    Justement, c'est ce que je dis, alors pourquoi daZumba dit que '\0' est un int.
    Tout caractère est représenté pas un entier en interne (ou tout du moins par une valeur numérique)

  15. #15
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    A cause des alignements mémoires, c'est vrai la taille est toujours un multiple de la taille d'un entier.

    Mais si on initialise une case de 4 octets (si c'est en 32 bits) par \0, je ne sais pas si les 4 octets sont initialisés, ou seulement 1. A priori, cela devrait être les 4.


    Tout caractère est représenté pas un entier en interne
    C'est juste une suite de bit, il n'y a même pas la notion d'entier

  16. #16
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Tout caractère est représenté pas un entier en interne (ou tout du moins par une valeur numérique)
    Pour raison d'optimisation?

    A cause des alignements mémoires, c'est vrai la taille est toujours un multiple de la taille d'un entier.
    En C tout est multiple du type "char" qui tient sur un "byte".

  17. #17
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par seriousme
    En C tout est multiple du type "char" qui tient sur un "byte".

    Avec sizeof oui, mais en mémoire, c'est des multiples du type int (les bus sont fait pour cette taille).

  18. #18
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Citation Envoyé par millie
    sizeof ne peut pas marcher, tu le fais sur un pointeur, il va donc te renvoyer la grandeur d'un pointeur... Faut mettre LONGUEURX * LONGUEURY
    tszMonTableau est un tableau.

    sizeof(tszMonTableau) renvoie bien LONGUEURX * LONGUEURY.

  19. #19
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Aaah
    mais c'est bizarre ça, ça marche effectivement dans certains cas, si le tableau est défini dans la même fonction (et surement d'une longueur constante).

  20. #20
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Mayti4
    tszMonTableau est un tableau.

    sizeof(tszMonTableau) renvoie bien LONGUEURX * LONGUEURY.
    Oui mais pas en donnant le tableau à traiter à une fonction qui n'a accés qu'à l'adresse du premier élément du tableau.

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/06/2012, 13h17
  2. initialiser un tableau à deux dimensions
    Par adel25 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 09/12/2011, 12h39
  3. initialiser un tableau à deux dimensions
    Par bandit_debutant dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 10/06/2008, 12h55
  4. tri alphabétique dans un tableau deux dimensions
    Par *!!cocco!!* dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 06/12/2004, 21h38
  5. Passage d'un tableau à deux dimensions
    Par karl3i dans le forum C
    Réponses: 3
    Dernier message: 20/10/2003, 14h50

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