De ce primesc „warning: assignment from incompatible pointer type”? Listă dublă legată într-o matrice structurală (Programare, C, Array-Uri, Structuri De Date, Avertismente, Listă Legată)

FILIaS a intrebat.

Încerc să fac o implementare a unei liste dublu legate care se conectează la o matrice. Struct care face array-ul conține pointerul Head și Tail al listei.

typedef struct myStruct{
 int code;
 struct myStruct *Head;
 struct myStruct *Tail;
}myStruct;

myStruct MyArray[10];

Iată lista mea dublu legată:

struct myList
{
 int data;
 struct myList *previous;
 struct myList *next;
}head;

struct myList *start =NULL;

Pe următoarea bucată de cod primesc avertismentul pe care l-am scris în titlul postării

warning: assignment from incompatible pointer type

void add_neighbor_to_neighborList(struct neighborList *start,int code,int Data)
{ 
 struct myList *newNode = (struct myList *) malloc (sizeof(struct myList ));   /* creates a new node of the correct data size */
 newNode->data = Data;

 if (start == NULL) { /*WARNING!checks to see if the pointer points somewhere in space*/
  MyArray[code].Head=newNode; //WARNING
  newNode->previous=MyArray[code].Head;
 }
 else
 {
  MyArray[code].Tail->next=newNode; /*error: ‘struct myStruct’ has no member named ‘next’*/
  newNode->previous=MyArray[code].Tail; //WARNING
 }
 /*if (newNode == NULL){ 
  return NULL;
  }*/
 MyArray[code].Tail=newNode; //WARNING
 newNode->next=MyArray[code].Tail;  //WARNING

 //return *start;
}

Mă uit de atâta timp dar tot nu reușesc să găsesc ce nu este în regulă și ce ar trebui să corectez. dacă aveți vreo idee, v-aș fi recunoscător! Mulțumesc oricum/în avans! 😉

3 răspunsuri
Bertrand Marron
MyArray[code].Head=newNode; //WARNING

MyArray[code].Headeste struct myStruct *.

newNodeTipul lui este struct myList *.

struct myStruct * și struct myList * sunt pointeri la două tipuri diferite, sunt incompatibile, asta vă spune compilatorul dumneavoastră.


Probabil că ați dorit ca struct myStruct să fie definit astfel:

typedef struct myStruct{
 int code;
 struct myList *Head;
 struct myList *Tail;
} myStruct;

V-aș sugera să folosiți nume de tip mai explicite, astfel încât să nu se mai producă erori de acest gen.

Ați putea redenumi struct myStruct în struct myList și să redenumiți struct myList la struct myNode. Pentru că așa sunt, sau așa par a fi.

Comentarii

  • Wow. Mă simt prost! Ceva atât de simplu și simplu și nu am putut să văd! Mulțumesc foarte mult Bertrand Marron! și mulțumesc pentru pont! 😉 –  > Por FILIaS.
Jeff Mercado

Aveți două tipuri diferite, myStruct și struct myList. Ele nu sunt același tip (deși conțin același tip de tipuri în aceeași ordine). Folosiți unul sau celălalt.

Matricea, MyArray este de myStructs care conține pointeri la struct myStruct. Încercați să atribuiți un pointer la un fișier struct myList la acești pointeri. Acestea nu sunt identice, de unde și avertismentul.

Comentarii

  • hm, poate că nu am fost clar (îmi voi edita mesajul). myStruct este pentru struct, dar vreau încă unul pentru lista mea dublu legată (myList). Toate elementele tabloului (MyArray) sunt din acest struct myStruct. Fiecare dintre ele ar trebui să aibă o referință la lista sa. Deci cred că nu pot face acest lucru cu un singur struct :/ –  > Por FILIaS.
  • @FILIaS: Bertrand are cu siguranță o are atunci. Ați definit tipurile schimbate, deci nu este ceea ce ați intenționat. –  > Por Jeff Mercado.
EboMike

Încercați să atribuiți un pointer myList la ceva care așteaptă un pointer myStruct. Nu poți face asta.

A* pA;
B *pB;

pB = pA; // Can't do this without casting