Beräkningar från länkad lista C.

Permalänk
Medlem

Beräkningar från länkad lista C.

Hej.

Låt oss säga att vi har en länkad lista av structer i C och varje struct vill utföra beräkningar med hjälp av datat som finns i de andra structerna, utan att då räkna med sitt eget data(!).

Finns det något enkelt sätt att utföra denna iteration, att få den att skippa sig själv i iterationen, typ som this som finns i bl.a. c#.? Eller blir man tvungen att lägga till ett unikt ID i varje struct för att få det att fungera?

MVH

Permalänk

Hmmm du har ju redan ett unikt id i länken som pekar på den struct som utför beräkningarna.

Visa signatur

Bärbar: Dell G7 17-7790, i7-9750H, RTX2060, 144Hz ips
Mobil: Samsung Galaxy A71
Mediaspelare: Apple TV 4K 32GB

Permalänk
Medlem
Skrivet av Stefanp67:

Hmmm du har ju redan ett unikt id i länken som pekar på den struct som utför beräkningarna.

Hur menar du? Hur kommer jag åt det ID:t?

Det jag menar är att den structen som ska utföra beräkningar är även den en struct i listan, ifall nu detta var oklart.

det jag vill åstadkomma är alltså något i stil med:

myStruct *it; it = head; while(it->next != NULL) { if(/*Structen som utför beräkningarna*/) /*Gör inget*/ else /*Beräkna m.h.a datat i structen*/

Det är alltså det som ska stå i if-statsen jag behöver hjälp med att lösa på ett smidigt sätt.

Permalänk
Medlem

Vad menar du egentligen med "Structen som utför beräkningarna"?
Finns ju inte riktigt objekt på det sättet i C...

Med det sagt så har ju it en adress som går att spara undan och jämföra med.

Permalänk
Medlem
Skrivet av jaqob:

Vad menar du egentligen med "Structen som utför beräkningarna"?
Finns ju inte riktigt objekt på det sättet i C...

Med det sagt så har ju it en adress som går att spara undan och jämföra med.

Det är svårt att förklara hur jag menar känner jag =/. Beräkningarna sker inte i själva structen, men de lagras i structen som vill få beräkningarna gjorda.

Men är det alltså möjligt att jämföra pekare med varandra? Likt:

if(it == ptrStruct)

Där ptrStruct är structen som vill få beräkningarna gjorda.

Pekare är ett helvete imo, men förmodar att det blir så när man är van med C#..

Permalänk
Skrivet av Mempatch:

Hur menar du? Hur kommer jag åt det ID:t?

Det jag menar är att den structen som ska utföra beräkningar är även den en struct i listan, ifall nu detta var oklart.

det jag vill åstadkomma är alltså något i stil med:

myStruct *it; it = head; while(it->next != NULL) { if(/*Structen som utför beräkningarna*/) /*Gör inget*/ else /*Beräkna m.h.a datat i structen*/

Det är alltså det som ska stå i if-statsen jag behöver hjälp med att lösa på ett smidigt sätt.

Gissar på att du vill åstadkomma något sådant här...

myStruct *ref; // Structen som utför beräkningarna? myStruct *it; ref = head->next; // Bara för att ge den ett värde. // Ödet får avgöra om objekten exciterar // eller om det blir haveri. it = head; while(it != NULL) { // Eftersom varje objekt i listan bör vara unikt så // kommer alla pekare som pekar på samma objekt ha exakt // samma adress. Det innebär att när båda pekarna pekar // på, i detta fall, det andra objektet i listan så // har de samma värde och if-satsen kommer i det // ögonblicket att evaluera till falskt och hoppas över. if (it != ref) ; /*Beräkna m.h.a datat i structen*/ it = it->next; }


Edit: Mindre förbättringar.

Permalänk
Medlem
Skrivet av Korkskruv:

Gissar på att du vill åstadkomma något sådant här...

myStruct *ref; // Structen som utför beräkningarna? myStruct *it; ref = head->next; // Bara för att ge den ett värde. // Ödet får avgöra om objekten exciterar // eller om det blir haveri. it = head; while(it != NULL) { // Eftersom varje objekt i listan bör vara unikt så // kommer alla pekare som pekar på samma objekt ha exakt // samma adress. Det innebär att när båda pekarna pekar // på, i detta fall, det andra objektet i listan så // har de samma värde och if-satsen kommer i det // ögonblicket att evaluera till falskt och hoppas över. if (it != ref) ; /*Beräkna m.h.a datat i structen*/ it = it->next; }


Edit: Mindre förbättringar.

Hmm.. Ja, det där ser ju ut och kunna vara något. Dvs. det är möjligt att jämföra pekare med varandra och kolla om de pekar på samma struct?

Permalänk
Skrivet av Mempatch:

Hmm.. Ja, det där ser ju ut och kunna vara något. Dvs. det är möjligt att jämföra pekare med varandra och kolla om de pekar på samma struct?

Ja. En pekare är en vanlig variabel. Enda är att man inte kan jämföra den mot andra typer av variabler än pekare. I en länkad lista så kan man använda både "lika med" och "skiljt från". I en array så ligger alla element bredvid varandra i minnet så då går det bra med till exempel "större än", "mindre än" osv.

Permalänk
Hedersmedlem
Skrivet av Korkskruv:

Ja. En pekare är en vanlig variabel. Enda är att man inte kan jämföra den mot andra typer av variabler än pekare.

Kan kan man väl, men vanligen har man inte så mycket glädje av det. De innehåller ju som sagt minnesadresser, så "större än"-jämförelser och liknande svarar på huruvida det man jämför med till exempel är större än den aktuella adressen. En annan vanlig fallgrop, om än kanske åt andra hållet, är att två pekare är lika då de pekar på samma adress (då det ju är vad de innehåller) och inte annars (även om objekten de hör till annars råkar ha samma värde); två likadana textsträngar anses till exempel inte vara lika om de inte är lagrade på samma adress.

Permalänk
Medlem

Mycket bra info, tackar! Nu ska man bara försöka få ihop resten av programmet också :).

Skickades från m.sweclockers.com