Pointeur C vers un tableau à 2 dimensions

J’ai un problème avec un pointeur sur un tableau à deux dimensions. Le pointeur doit pointer sur un tableau de taille variable.

// create pointer to 2 dimensional array TimeSlot **systemMasortingx; // this is a global variable 

Dans une fonction, je veux créer un nouveau tableau.

 void setup(uint16_t lines, uint16_t coloumns) { // create 2 dimensional array. size can be set here. TimeSlot tmpTimeSlots[lines][coloumns]; // make the pointer point to this array systemMasortingx = tmpTimeSlots; // WARNING } 

Mais lorsque je laisse le pointeur sur le tableau, le compilateur dit “warning: affectation à partir d’un type de pointeur incompatible”. De plus, le mikrocontroller sur lequel le logiciel doit s’exécuter obtient un problème sérieux lors de l’access à SystemMasortingx [2] [5] à partir d’une autre fonction.

La variable systemMasortingx est nécessaire ultérieurement pour accéder aux éléments de tmpTimeSlots.

J’ai essayé des combinaisons comme

 systemMasortingx = *(*tmpTimeSlot); 

et ainsi de suite mais aucun d’entre eux ne semble fonctionner.

Toute aide est la bienvenue, merci!

EDIT: ok problème compris et résolu, merci beaucoup!

Tableaux bidimensionnels! = Doubles pointeurs.

Vous avez presque certainement besoin d’une allocation dynamic de mémoire pour cela. Vous souhaitez également copier en profondeur le contenu du tableau – il s’agit d’une variable locale non statique, qui n’est donc pas invalide. Vous ne pouvez pas faire TYPE arr[sz]; return arr; TYPE arr[sz]; return arr; en conséquence.

 const size_t width = 3; const size_t height = 5; TimeSlot tmpTimeSlot[width][height]; systemMasortingx = malloc(width * sizeof systemMasortingx[0]); for (int i = 0; i < width; i++) { systemMatrix[i] = malloc(height * sizeof systemMatrix[i][0]); for (int j = 0; j < height; j++) { systemMatrix[i][j] = tmpTimeSlot[i][j]; } } 

Votre pointeur systemMasortingx n’est pas un pointeur sur un tableau 2D, mais un double déréférencement. Vous devez le déclarer comme ceci: TimeSlot (*systemMasortingx)[columns]; – c’est le type correct pour le pointeur de tableau 2D. Cependant, vous devez connaître la valeur des columns à l’emplacement de la déclaration (en C99) ou à la constante (antérieure à C99).

De plus, le renvoi d’un pointeur sur une variable locale entraînera un pointeur suspendu après le retour de la fonction.

Il y a plusieurs erreurs ici.

  TimeSlot **systemMasortingx; 

Cela ne peut pas être utilisé pour pointer sur un tableau multidimensionnel en C (tel que déclaré ultérieurement); au lieu de cela, il peut être utilisé pour pointer sur un vecteur de vecteurs, qui est une autre bête (jetez un œil à votre livre C pour plus de détails à ce sujet). Le point est, pour pointer vers un tableau multidimensionnel, vous devriez avoir une déclaration comme celle-ci:

  TimeSlot (* systemMasortingx)[lines]; 

qui est un pointeur sur un vecteur de lines de longueur, qui peut être utilisé pour adresser le tableau multidimensionnel (voir ici pour plus de détails). Pour ce faire, les lines doivent être connues au moment de la compilation, ce qui n’est pas approprié dans votre cas.

Et même si votre déclaration systemMasortingx était correcte pour l’affectation que vous effectuez dans cette fonction, vous atsortingbueriez à ce pointeur l’adresse de mémoire allouée à l’intérieur de cette fonction, qui cesserait d’exister après la sortie de la fonction – votre systemMasortingx deviendrait donc un pointeur non valide. dès le retour de l’ setup .

Ce dont vous avez besoin ici est une allocation dynamic de mémoire. Cela vous permet de spécifier une durée de vie arbitraire pour cette mémoire et d’utiliser la syntaxe à double crochet.

Tout d’abord, vous affectez un vecteur de pointeurs, aussi grand que le nombre de lignes que vous devez avoir (multiplié par sizeof(int *) dans l’appel de malloc ); Ensuite, vous affectez les vecteurs de lignes et affectez chacun d’eux à sa place dans le vecteur de colonnes. Voir cette réponse pour plus de détails sur cette solution (et d’autres) d’atsortingbution dynamic d’un vecteur multidimensionnel.

N’oubliez pas de free chaque vecteur alloué lorsque vous n’en avez plus besoin!

Deux problèmes:

  1. Vous ne devez pas retourner un pointeur au stockage automatique. Ce stockage disparaît une fois la fonction laissée. Vous devriez utiliser malloc () à la place. L’utilisation d’un stockage hors de scope est susceptible d’accéder aux fichiers indésirables de la stack, ce qui provoque probablement la défaillance majeure. Techniquement, cela s’appelle un comportement indéfini en C.
  2. Contrairement à votre déclaration, TimeSlot **systemMasortingx; ne déclare pas un tableau à deux dimensions, mais un pointeur sur un pointeur sur un Timeslot . Voir la FAQ comp.lang.c pour savoir comment créer dynamicment des tableaux multidimensionnels.

Vous essayez de sauvegarder un pointeur sur un object local (alloué sur une stack) et de l’utiliser après la fin de sa scope. Ceci est faux, le pointeur sera invalidé une fois la fonction terminée.

Également. lisez les réponses à cette question: Heap alloue un tableau 2D (et non un tableau de pointeurs) pour apprendre à allouer un tableau 2 dimensions de manière dynamic (sur le tas, comme opposé à l’emstackment).