0
votes

Comment passer un tableau 2D complet à une fonction en C

J'ai besoin d'utiliser un tableau 2D complet dans une fonction. Je ne peux pas utiliser pendant, pendant ou pendant un certain temps. J'utilise CodeBlocks pour Windows (langage C) Voici un exemple de code (ce n'est pas le vrai code, juste un exemple):

#include <stdio.h>
void reload(char* reload[2][6])
{
    printf(" _________________\n");
    printf("|%c|%c|%c|%c|%c|%c|\n", array[0][0], array[0][1], array[0][2], array[0][3], array[0][4], array[0][5]);
    printf("|%c|%c|%c|%c|%c|%c|\n", array[1][0], array[1][1], array[1][2], array[1][3], array[1][4], array[1][5]);
    printf(" -----------------\n");
}
int main()
{
    char* array[2][6];
    printf(" _________________\n");
    printf("|%c|%c|%c|%c|%c|%c|\n", array[0][0], array[0][1], array[0][2], array[0][3], array[0][4], array[0][5]);
    printf("|%c|%c|%c|%c|%c|%c|\n", array[1][0], array[1][1], array[1][2], array[1][3], array[1][4], array[1][5]);
    printf(" -----------------\n");
    reload(array);
    return 0;
}


18 commentaires

vous avez donc un tableau à 2 dimensions de char *, donc techniquement un char ***. Dans ce cas, un tableau de taille fixe fonctionne (il suffit de vérifier la réponse de Jayram) sinon concidez malloc et n'oubliez pas de vérifier vos paramètres.


@Platypus: Un tableau bidimensionnel de char * n'est pas char *** . Les tableaux ne sont pas des pointeurs.


@EricPostpischil Alors dites-moi comment vous malloceriez un tableau à 2 dimensions de char *?


@Platypus: char * (* x) [Rows] [Columns] = malloc (sizeof * x); ou char * (* x) [Columns] = malloc (Rows * sizeof * x); .


@NickOlder: ne modifiez pas les questions de manière à rendre les réponses invalides ou à annuler la question d'origine. Lorsque vous modifiez le code pour qu'il soit «correct», cela n'a plus de sens pour les lecteurs qu'une question demande ce qui ne va pas avec le code correct. Si la question que vous vouliez poser ne concernait pas l'erreur dans le nom du paramètre, saisissez une nouvelle question au lieu de modifier celle-ci.


@EricPostpischil alors que faire si vous voulez le passer en paramètre sans connaître les lignes et les colonnes?


char * array [2] [6]; est un tableau 2D de pointeurs et non de caractères. Et vous n'initialisez même pas le tableau, alors qu'espérez-vous que cela imprime?


@Platypus: Ensuite, vous avez besoin d'autre chose qu'un tableau à deux dimensions.


@Lundin Un char * est techniquement un pointeur vers le premier caractère d'un tableau, donc même s'il n'est pas optimal, cela fonctionne.


@Platypus Cela fonctionne si vous voulez 2x6 chaînes oui, pas si vous voulez 2 chaînes de 6 caractères chacune. Ce qui n'est pas clair ...


@EricPostpischil Pourquoi? un char *** si vous le malaxez correctement, est un pointeur vers un tableau de tableau de char *. Tu peux me dire que ce n'est pas joli. Vous ne pouvez pas me dire que c'est faux.


@Platypus Un char * est techniquement un pointeur vers le premier caractère d'un tableau, donc même s'il n'est pas optimal, cela fonctionne. Comment définir l'impression d'un char * avec < code>% c comme "fonctionne"? L'utilisation d'un spécificateur de format incorrect dans un appel printf () n'est pas définie.


@Platypus: Non. Un char *** peut être utilisé avec trois indices pour obtenir un char ou deux indices pour obtenir un char * , mais c'est un pointeur vers un pointeur vers un pointeur; ce n'est pas un tableau de tableaux ou un tableau de tableaux de tableaux. Beaucoup de gens les confondent parce que les tableaux sont automatiquement convertis en pointeurs dans de nombreuses expressions, mais ils sont différents parce que les tableaux ne sont pas convertis en pointeurs dans certaines expressions. Des différences surviennent dans sizeof et en prenant l'adresse et dans les déclarations.


@Platypus un char *** si vous le malaxez correctement, est un pointeur vers un tableau de tableau de char *. Non, ce n'est pas un pointeur vers un tableau de char * C'est un pointeur vers un tableau de pointeurs vers des tableaux de pointeurs vers des tableaux de char .


@Platypus Voir Allouer correctement les tableaux multidimensionnels , il explique le sujet du pointeur vers -pointer vs array et pourquoi le premier peut être inapproprié et lent dans de nombreux cas.


@AndrewHenle Mb je l'ai mal dit, quand je dis pointeur vers un tableau de tableau, cela signifie dans ma tête un pointeur vers un tableau de pointeurs vers un tableau de pointeurs, puisque tout est des adresses, je suppose juste qu'à partir du moment où vous malloc, c'est un tableau une robe.


@Lundin Je vais vérifier ça merci.


remplacez void reload (char * reload [2] [6]) par void reload (char reload [2] [6])


3 Réponses :


1
votes

Vous avez une erreur dans le nom du paramètre de la fonction recharger ; il doit s'agir de array , pas de reload:

#include <stdio.h>
void reload(char* array[2][6])
{
    printf(" _________________\n");
    printf("|%c|%c|%c|%c|%c|%c|\n", array[0][0], array[0][1], array[0][2], array[0][3], array[0][4], array[0][5]);
    printf("|%c|%c|%c|%c|%c|%c|\n", array[1][0], array[1][1], array[1][2], array[1][3], array[1][4], array[1][5]);
    printf(" -----------------\n");
}
int main()
{
    char* array[2][6];
    printf(" _________________\n");
    printf("|%c|%c|%c|%c|%c|%c|\n", array[0][0], array[0][1], array[0][2], array[0][3], array[0][4], array[0][5]);
    printf("|%c|%c|%c|%c|%c|%c|\n", array[1][0], array[1][1], array[1][2], array[1][3], array[1][4], array[1][5]);
    printf(" -----------------\n");
    reload(array);
    return 0;
}


2 commentaires

@EricPostpischil le post original a été édité avec cette réponse, vérifiez la version non éditée du post original, vous verrez qu'il y a un problème avec les paramètres.


Cette réponse n'est pas utile et n'a plus de sens: vous imprimez le contenu d'un pointeur comme s'il s'agissait d'un caractère. Autrement dit, si j'écris char * array [2] [6] = {(void *) 0x00000041}; il commence à imprimer A quand je l'exécute sur mon petit boutien PC.



0
votes

Vous avez également un autre problème ici: vous passez le tableau de pointeurs et vous imprimez les caractères.


0 commentaires

1
votes
  • Si vous voulez un tableau 2D réel de caractères (c'est-à-dire 2 chaînes), alors c'est simplement: char array [2] [6]; . li>
  • Initialisez ce tableau avant de l'utiliser. Par exemple: char array [2] [6] = {"hello", "world"};
  • Modifiez la fonction en conséquence et supprimez le nom du paramètre absurde:
    void reload (char array [2] [6]) .
  • Il imprimera alors:

     _________________
    |h|e|l|l|o| |
    |w|o|r|l|d| |
     -----------------
    

    En supposant que la présentation des caractères du terminateur nul est "n'imprimer rien" sur votre système.


1 commentaires

OP indique que le code dans la question est un «exemple», pas leur vrai code, et n'indique pas le problème sur lequel ils se posent. Nous ne savons donc pas s'ils posent des questions sur un message d'erreur du compilateur causé par le nom du paramètre reload ou un message d'erreur du compilateur causé par des types incompatibles ou si l'un ou les deux sont causés par leur construction défectueuse de un «exemple» et la vraie question qu'ils voulaient poser est autre chose. La question a déjà reçu une réponse basée sur la première prémisse et devrait être close. Le PO devrait saisir une nouvelle question mieux composée.