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 :

malloc pour un tableau 2D


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 58
    Points : 33
    Points
    33
    Par défaut malloc pour un tableau 2D
    Salut,

    Je suis sur un truc simple pour ne pas dire bête, mais je ne trouve pas la solution

    J'ai un fichier.txt sous la forme suivante :
    L01V01|L01VO2|L01VO3
    L02V01|L01VO2|L01VO3
    L03V02|L03VO2|L03VO3
    L04V01|L04VO2|L04VO3

    Le but c'est de récupérer les valeurs séparé par "|" puis l'exploiter

    Tout d'abord j'ai pas utilisé le fichier pour valider le principe,
    Voici mon bout de code, mais il me semble que il y a des erreurs :
    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
     
    char **tab = NULL;
    int i = 0;
     
    tab = (char**)malloc ( sizeof(char*) * 4); // 4 Lignes mais dépend du fichier je cherche un truc dynamique ...
     
    for(i = 0; i < 3; i++) // 3 colonnes
        tab[i] = (char*) malloc( sizeof(char) * 100 );
     
    for(i = 0; i < 5; i++) 
    {
    		 strcpy(tab[i][0],"01");
    		 strcpy(tab[i][1],"02");
    		 strcpy(tab[i][2],"03");
    		 strcpy(tab[i][3],"04");
    		 strcpy(tab[i][4],"05");
    		 strcpy(tab[i][5],"06");
    }
     
     
    for(i = 0; i < 5; i++) 
    {
    printf("%s|%s|%s|%s|%s|%s",tab[i][0],tab[i][1],tab[i][2],tab[i][3],tab[i][4],tab[i][5]);
    }
     
     
    free(tab);
    Pouvez-vous regarder d’où vient le problème ?

    Merci d'avance

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Qu'appelles-tu "une valeur" : la chaine" L01V01", les chaines "01" et "01" ou les entiers 1 et 1 ?

    je cherche un truc dynamique
    Tu peux aussi parcourir le fichier et compter le nombre de lignes (si le fichier n'est pas trop long), tu peux faire une liste chainée et rajouter un nouvel élément à chaque lecture, il te reste encore realloc().

    Voici mon bout de code, mais il me semble que il y a des erreurs :
    Ce serait bien de préciser quelles sont les erreurs, surtout s'il te "semble" !
    Moi, j'obtiens des :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    D:\...\main.c|54|warning: passing argument 1 of 'strcpy' makes pointer from integer without a cast [enabled by default]|
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\..\include\string.h|45|note: expected 'char *' but argument is of type 'char'|
    Note que tab[i][0] est un char et que tu dois passer un char* à strcpy(), ce qu'indique les messages du compilateur. Tu as "trop déréférencé", il faut enlever quelques []. Globalement, tu ne sembles pas au point de la différence entre %c et %s, entre char et char* / char[].

    Tu utilises plusieurs tailles, il faudrait peut-être se mettre d'accord, par exemple avec une constante telle que #define NOMBRE_LIGNES 5 pour être homogène.

  3. #3
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Tu peux aussi utiliser les regexp pour faire ça. Sinon si tu veux t'en passer, je te conseillerai de stocker l'intégralité dans une chaîne de caractère que tu parserais ensuite.

    Si tu veux le faire en un seul read (pour éviter de réallouer ton buffer), regarde du côté des fonctions stat qui te remplisse une structure stat qui contient notamment le champs st_size qui est la taille du fichier. Je ne sais pas si ça fonctionne sur windows par contre... Il doit bien y avoir un équivalent.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 58
    Points : 33
    Points
    33
    Par défaut
    Salut,

    Merci pour les réponses !

    Le but est de passer une chaine de caractères à tab[i][0]

    Bref,


    Je cherche à faire char *Tableau[xligne][xcolonne] mais avec un pointeur double (char **)


    Pouvez-vous m'aider ?

    Merci

  5. #5
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Citation Envoyé par TANITE Voir le message
    Salut,

    Merci pour les réponses !

    Le but est de passer une chaine de caractères à tab[i][0]

    Bref,


    Je cherche à faire char *Tableau[xligne][xcolonne] mais avec un pointeur double (char **)


    Pouvez-vous m'aider ?

    Merci
    ... Tu te moquerais pas un peu de nous ?

  6. #6
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    bonjour,

    tu veux un «tableau à deux dimensions contenant des char *»/ Pour construire ce type, et c'est une façon très informelle de faire, tu commences par écrire le type du contenu (ici des char *) :
    ensuite tu ajoutes une * par dimension (ici 2):
    et tu finis en donnant le nom de ta variable :
    Cela va représenter «un tableau de xligne éléments, chaque élément pointant un tableau de xcolonne éléments, chaque éléments étant des char *)
    Ensuite pour allouer l'espace pointé il va falloir passer par malloc. On commence par allouer la place pour stocker les xligne éléments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab = malloc( xligne * sizeof *tab )
    Ensuite on fait pareil pour chaque éléments, comme il y en a xligne cela implique l'utilisation d'une boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(lig=0; lig<xligne; ++lig)
      tab[lig]=malloc( xcolonne * sizeof *tab[lig] );
    Imaginons ensuite que tu souhaites que chaque case de ton tableau puisse contenir une chaine d'au moins xcar caractères, il faut deux boucles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(lig=0; lig<xligne; ++lig)
      for(col=0; col<xcolonne; ++col)
        tab[lig][col] = malloc( xcar * sizeof *tab[lig][col] );
    Évidemment il ne faudra pas oublier la règle d'or : à chaque malloc doit correspondre un free et un seul. Il faudra penser à libérer toute la mémoire ainsi allouée, l'ordre étant l'ordre inverse des allocation ; ici, tu libères tes chaines (si besoin), puis les lignes, puis le tableau.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 58
    Points : 33
    Points
    33
    Par défaut
    @kwariz

    Merci infiniment, votre réponse est très sympa

    Mais je suis dans un cas un peu spécifique ...

    J'ai une DLL en C#, dans cette DLL il y a une fonction nomé Test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int Test(string[,] tab);
    Dans mon code en c j'utilise un wrapper .NET assembly, l'image de la fonction C# devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int Test (char ** tab, int __tabLength1,int __tabLength2);
    Mon but c'est de passer un tableau à ma fonction, donc pas possible de passer le type char *** => Paramètres incorrecte ...

    Avez-vous un piste ?

    Merci d'avance

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est la différence entre un tableau à deux dimensions, et un tableau de tableaux.

    Tu dois allouer un seul tableau de __tabLength1 * __tabLength2 char*.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 58
    Points : 33
    Points
    33
    Par défaut
    Merci à tous pour l'aide !

    Mon problème est résolu

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

Discussions similaires

  1. [MySQL] Probleme d'exploitation d'une vue (VIEW) pour un tableau
    Par nico4731 dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 03/02/2006, 14h26
  2. overflow pour un tableau
    Par crampouz dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 08/10/2005, 16h15
  3. boucle for n fois pour n tableau...
    Par toyyo dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/08/2005, 16h01
  4. pointeur pour un tableau 2d
    Par olive14 dans le forum C
    Réponses: 6
    Dernier message: 07/05/2005, 15h02
  5. [VB6] utilisation de Property LET / GET pour un tableau
    Par titounne dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 18/10/2004, 22h06

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