Partage
  • Partager sur Facebook
  • Partager sur Twitter

Accessibilité tableau à 2 dimensions

Modifier un tableau à 2 dimensions dans une fonction sans le retourner

Sujet résolu
    25 août 2019 à 17:45:01

    Bonjour, j'ai un petit soucis de compréhension avec l'accessibilité des tableaux à 2 dimensions dans une fonction. Je m'explique, j'ai un tableau de plusieurs chaînes de caractères, et mon but serait de créer des fonctions pour les gérer, comme une fonction pour ajouter une ligne, ou fusionner 2 tableaux. J'ai donc fait cela (pour l'ajout d'une ligne) :

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void ArrayStringFree(char *array[], const int nb_lines) // Libère la mémoire d'un tableau de strings
    {
    	int i = 0;
    	for(i; i < nb_lines; i++)
    		free(array[i]);
    	free(array);
    }
    
    char **ArrayStringMalloc(const int nb_lines, const int line_len) // Crée un tableau de strings et le retourne
    {
    	int i = 0;
    	char **array = (char**)malloc(sizeof(char*) * nb_lines);
    
    	for(i; i < nb_lines; i++)
    		array[i] = (char*)malloc(sizeof(char) * (line_len + 1));
    
    	return array;
    }
    
    char **ArrayStringAppend(char *destination[], const char *source, const int destination_nb_lines, const int line_len) // Ajoute une ligne dans un tableau de strings
    {
    	int i = 0;
    	char **result = ArrayStringMalloc(destination_nb_lines + 1, line_len);
    	
    	for(i; i < destination_nb_lines + 1; i++)
    	{
    		if(i < destination_nb_lines) 
    			strcpy(result[i], destination[i]);
    		else
    			strcpy(result[i], source);
    	}
    
    	ArrayStringFree(destination, destination_nb_lines);
    	return result;
    }
    
    int main()
    {
        int i = 0;
        char **var = ArrayStringMalloc(10, 256);
        var = ArrayStringAppend(var, "test", 10, 256);
        
        for(i; i < 11; i++) printf("%s\n", var[i]);
    }

    Ici la fonction fait ce que je veux, mais au lieu de retourner le tableau, je voudrais qu'il soit directement modifié à l'intérieur de la fonction sans avoir à le retourner, ce qui serait selon moi bien plus logique. J'ai fait plusieurs tests non concluants, j'en déduis donc que je n'ai pas compris le fonctionnement des pointeurs dans ce cas de figure (j'ai relu la partie sur les pointeurs du cours de C, et fait beaucoup de recherches, mais je n'ai toujours pas compris le problème).

    De plus, je me pose aussi des questions sur les fonctions que j'ai créées pour allouer et libérer la mémoire, sont-elles efficaces ? Ou est-ce qu'elles sont aussi inefficaces à cause d'une possible mauvaise utilisation des pointeurs ?

    Pour résumer, je n'arrive pas à faire en sorte de modifier un tableau à 2 dimensions sans avoir à utiliser une valeur de retours dans une fonction (j'ai aussi fait des tests avec des tableaux d'entiers à 2 dimensions, et j'ai eu le même souci évidemment).

    Voilà, j'espère avoir été clair :).

    • Partager sur Facebook
    • Partager sur Twitter
    ~(‾▿‾~)
      25 août 2019 à 18:33:15

      - Pour modifier une variable passée en paramètre à une fonction dans la fonction, il faut envoyer l'adresse de la variable à la fonction (scanf en est un exemple). Il faut bien sur mettre le type du paramètre en conséquence. 

      - Pourquoi ne pas utiliser realloc pour agrandir ton tableau ?

      • Partager sur Facebook
      • Partager sur Twitter
        25 août 2019 à 19:17:57

        rouloude a écrit:

        - Pourquoi ne pas utiliser realloc pour agrandir ton tableau ?

        Merci beaucoup pour ta réponse ! Cela peut paraître idiot, mais comme je fais peu de C je ne connaissais pas cette fonction ^^'. J'ai donc changé le code en utilisation cette fonction :

        void ArrayStringAppend(char **destination[], const char *source, const int destination_nb_lines, const int line_len)
        {
        	destination = (char**)realloc(*destination, sizeof(char*) * (destination_nb_lines + 1));
        	destination[destination_nb_lines] = (char*)malloc(sizeof(char) * line_len);
        	strcpy(destination[destination_nb_lines], source);
        }

        rouloude a écrit:

        - Pour modifier une variable passée en paramètre à une fonction dans la fonction, il faut envoyer l'adresse de la variable à la fonction (scanf en est un exemple). Il faut bien sur mettre le type du paramètre en conséquence. 

        J'avais effectivement compris cela, je m'étais juste embrouillé et je pensais que comme la variable était un tableau (donc un pointeur), il n'y aurait pas besoin de mettre l'adresse ^^'...

        Voici donc le résultat final :

        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        
        char **ArrayStringMalloc(const int nb_lines, const int line_len) // Crée un tableau de strings et le retourne
        {
            int i = 0;
            char **array = (char**)malloc(sizeof(char*) * nb_lines);
         
            for(i; i < nb_lines; i++)
                array[i] = (char*)malloc(sizeof(char) * (line_len + 1));
         
            return array;
        }
        
        void ArrayStringAppend(char **destination[], const char *source, const int destination_nb_lines, const int line_len)
        {
        	destination = (char**)realloc(*destination, sizeof(char*) * (destination_nb_lines + 1));
        	destination[destination_nb_lines] = (char*)malloc(sizeof(char) * line_len);
        	strcpy(destination[destination_nb_lines], source);
        }
         
        int main()
        {
            int i = 0;
            char **var = ArrayStringMalloc(10, 256);
            ArrayStringAppend(&var, "test", 10, 256);
             
            for(i; i < 11; i++) printf("%s\n", var[i]);
        
            return 0;
        }


        Et ça fonctionne EXACTEMENT comme je voulais !!! Merci beaucoup encore pour ton aide je n'en pouvais plus !!!

        • Partager sur Facebook
        • Partager sur Twitter
        ~(‾▿‾~)

        Accessibilité tableau à 2 dimensions

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown