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 :

Donner un tableau 2D de char* en parametre


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 15
    Par défaut Donner un tableau 2D de char* en parametre
    Bonjour à tous,

    Je cherche à créer une fonction d'initialisation d'un tableau à deux dimensions de char*. Le prototype de la fonction est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void init_array(char** my_array, /* Pointeur vers le tableau à initialiser */
    		int nb_of_lines, /* Nombre de lignes du tableau */
    		int nb_of_rows, /* Nombre de colonnes du tableau */
    		int size_of_pointer, /* Nombre d'octets pour la taille du pointeur */
    		char* init_char /* Caractère d'initialisation */
    );
    Et son utilisation dans un programme se ferait ainsi :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <tchar.h>
    #include <string.h>
     
    #define NB_OF_LINES	10
    #define NB_OF_ROWS	20
    #define SIZE_MAX_FUNCTION_NAME 5
     
    void init_array(char** my_array, int nb_of_lines, int nb_of_rows, int size_of_pointer, char* init_char);
     
    int main (void)
    {
    	char *tableau[NB_OF_LINES][NB_OF_ROWS];
     
    	init_array(*tableau,NB_OF_LINES,NB_OF_ROWS,SIZE_MAX_FUNCTION_NAME,"*");
     
    	return 1;
    }
     
    void init_array(char** my_array, int nb_of_lines, int nb_of_rows, int size_of_pointer, char* init_char)
    {
    	int temp_index_i = 0;
    	int temp_index_j = 0;
     
    	for(temp_index_i=0;temp_index_i<nb_of_lines;temp_index_i++)
    	{
    		for(temp_index_j=0;temp_index_j<nb_of_rows;temp_index_j++)
    		{
    			my_array[temp_index_i][temp_index_j] = (char*)malloc(size_of_pointer*sizeof(char));
    			memcpy(&my_array[temp_index_i][temp_index_j],init_char,size_of_pointer);
    		}
    	}
    }
    Cependant à la compilation (Microsoft Visual C++ 2008), on me renvoie une erreur sur la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my_array[temp_index_i][temp_index_j] = (char*)malloc(size_of_pointer*sizeof(char));
    disant error C2440: '=' : cannot convert from 'char *' to 'char'.
    Je comprends ce qu'il me dit mais je ne vois pas en quoi ce que je fais est une erreur et surtout comment le résoudre. Une solution pour m'aider à initialiser mes pointeurs s'il vous plait ?

    Merci d'avance !

  2. #2
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Par défaut
    disant error C2440: '=' : cannot convert from 'char *' to 'char'.
    Ne voudrait justement pas dire que tu tentes de caster un char en char* avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (char*)malloc(size_of_pointer*sizeof(char));
    Moi je n'ai jamais rien mis entre un = et un malloc. Puis comme tu veux mallocer un char :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my_array[temp_index_i][temp_index_j]
    Je ne vois pas à quoi sert ce fameux (char*)
    Essaye sans peut-être (je ne dis pas que c'est ça ^^ mais je le trouve louche)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 15
    Par défaut
    malloc renvoie un void* donc je caste le résultat en char* car je veux que chaque élément de mon tableau soit un char*.

    En le supprimant, j'obtiens le message error C2440: '=' : cannot convert from 'void *' to 'char'.

    Ce qui m'étonne, c'est qu'il a l'air d'attendre que j'affecte le résultat du malloc dans un char alors qu'une telle affectation est réservée aux pointeurs donc dans mon cas à un char* !

    Si je remplace le cast (char*) par (char), je n'ai plus d'erreur à la compilation mais le programme crash à cette instruction quand je l'exécute...

  4. #4
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Par défaut
    mmhh je vois mieux.

    En gros tu veux faire un tableau de chaine de caractère ?

    EDIT :
    my_array[temp_index_i][temp_index_j] est un char
    my_array[temp_index_i] est un char*
    my_array est un char **

    Donc là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my_array[temp_index_i][temp_index_j] = malloc(size_of_pointer*sizeof(char*));
    tu demandes à mallocer un char mais comme si c'était un char* si je ne me trompe pas

    Donc il faut mallocer my_array[temp_index_i] à la place je pense.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 15
    Par défaut
    Je m'y attendais un peu car j'étais dubitatif avec votre malloc(n*sizeof(char*)) mais votre proposition me donne la même erreur que précédemment soit error C2440: '=' : cannot convert from 'void *' to 'char'.

    Sinon c'est exactement ça, je veux faire un tableau à deux dimensions de chaines de caractères.

    J'ai déjà testé mes lignes de codes sans passer par une sous-fonction ; si j'écris mes instructions dans le main, cela donne :

    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 <tchar.h>
    #include <string.h>
     
    #define NB_OF_LINES	10
    #define NB_OF_ROWS	20
    #define SIZE_MAX_FUNCTION_NAME 5
     
    int main (void)
    {
    	int i,j;
    	char *tableau[NB_OF_LINES][NB_OF_ROWS];
     
    	for(i=0;i<NB_OF_LINES;i++)
    	{
    		for(j=0;j<NB_OF_ROWS;j++)
    		{
    			tableau[i][j] = (char*)malloc(SIZE_MAX_FUNCTION_NAME*sizeof(char));
    			memcpy(tableau[i][j],"*",SIZE_MAX_FUNCTION_NAME);
    		}
    	}
     
    	return 1;
    }
    Cela fonctionne tout à fait, mais j'ai besoin de faire de ces quelques lignes une sous-fonction et j'ai le sentiment que quelque chose m'échappe quand il s'agit de passer un tableau en paramètre et/ou de le déréférencer...

  6. #6
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Par défaut
    Donc si c'est un tableau de chaine de caractère qu'il faut :
    il est nécessaire de :
    => mallocer le tableau pour le nombre de mot (ou char*) qu'il pourra contenir.
    => mallocer chaque mot (ou char*) pour le nombre de caractere ou char qu'il pourra contenir.

    Mettons que je veuille un tableau qui contienne 15 mots au plus de 50 char chacun.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char **my_tab;
     
    my_tab = malloc(15*sizeof(char**));
     
    for (int i = 0; i <= 14; i++)
    {
        my_tab[i] = malloc(50*sizeof(char*));
        for (int j = 0;j < 50; j++)
        {
           // on peut mettre le caractère du mot [i] à l'indice [j] car la mémoire est bien allouée soit, par exemple :
            my_tab[i][j] = 'a';
        }
    }
    Si j'ai bien compris c'est le principe à appliquer.

  7. #7
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void init_array(char*** my_array, ....

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 15
    Par défaut
    Huuum ça devient un peu kabbalistique pour moi... Pourquoi un char*** ? Parce qu'en argument de fonction, je n'ai rien de tel à lui fournir... Je n'ai effectivement plus d'erreur sur la ligne de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my_array[temp_index_i][temp_index_j] = (char*)malloc(size_of_pointer*sizeof(char));
    mais du coup je ne sais plus quoi lui donner comme paramètre lors de l'appel de fonction. Merci.

  9. #9
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par Lucien63 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void init_array(char*** my_array, ....
    Absolument pas. Le tableau n'est pas un tableau de char**


    @ ikaruga.jun :

    1- Il n'y a aucune raison de passer *tableau à init_array(). L'appel devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    init_array(tableau,NB_OF_LINES,NB_OF_ROWS,SIZE_MAX_FUNCTION_NAME,"*");
    2- Le paramètre correspondant pour init_array() doit être du type "adresse d'un élément du tableau". Les éléments du tableau sont des tableaux de NB_OF_ROWS pointeurs sur char. on doit alors avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void init_array(char* (*my_array)[NB_OF_ROWS], int nb_of_lines, int nb_of_rows, int size_of_pointer, char* init_char)
    3- Dans init_array(), le memcpy() doit être à l'adresse allouée par le malloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcpy(my_array[temp_index_i][temp_index_j],init_char,size_of_pointer);
    Le cast (char*) devant le malloc() est inutile en C

    Au final :
    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
    int main (void)
    {
    	char *tableau[NB_OF_LINES][NB_OF_ROWS];
    	init_array(tableau,NB_OF_LINES,NB_OF_ROWS,SIZE_MAX_FUNCTION_NAME,"*");
    	return 1;
    }
     
    void init_array(char* (*my_array)[NB_OF_ROWS], int nb_of_lines, int nb_of_rows, int size_of_pointer, char* init_char)
    {
    	int temp_index_i = 0;
    	int temp_index_j = 0;
     
    	for(temp_index_i=0;temp_index_i<nb_of_lines;temp_index_i++)
    	{
    		for(temp_index_j=0;temp_index_j<nb_of_rows;temp_index_j++)
    		{
    			my_array[temp_index_i][temp_index_j] = malloc(size_of_pointer*sizeof(char));
    			memcpy(my_array[temp_index_i][temp_index_j],init_char,size_of_pointer);
    		}
    	}
    }

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 15
    Par défaut
    Citation Envoyé par zouuc Voir le message

    EDIT :
    my_array[temp_index_i][temp_index_j] est un char
    my_array[temp_index_i] est un char*
    my_array est un char **
    C'est là où on ne s'est pas compris. Chez moi, my_array[temp_index_i][temp_index_j] est un char* !

    Merci pour vos réponses à tous les deux mais je n'ai toujours rien de satisfaisant pour l'instant malheureusement...

  11. #11
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Je me suis trompé le bon prototype c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void init_array(char* my_array[][NB_OF_ROWS],...

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

Discussions similaires

  1. tableau de 7x8 char dynamique
    Par exe2bin dans le forum C++
    Réponses: 3
    Dernier message: 22/01/2011, 12h44
  2. passer un tableau a deux dimension en parametre
    Par sliders_alpha dans le forum Langage
    Réponses: 4
    Dernier message: 08/10/2010, 17h31
  3. Convertir tableau string en char
    Par Emcy dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 15/06/2009, 17h37
  4. Allocation tableau 2D de Char *
    Par johnnydepp dans le forum C
    Réponses: 11
    Dernier message: 27/02/2007, 12h23
  5. [Debutant]Tableau de pointeur char (char *)
    Par nephhh dans le forum Débuter
    Réponses: 8
    Dernier message: 03/11/2006, 00h48

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