[C] Triple - Zeiger , aber Wert Addition falsch

mc_gulasch

Erfahrenes Mitglied
Moin zusammen,

ich hab mir folgendes Konstrukt gebastelt:
C:
unsigned int*** TABLE[Mgk][256];
Es ist ein 3-dim Array, das in seiner 3. Dimension eine Adresse gespeichert hat in der wiederum eine Lösung in Array-Form steht. Diese Lösung ist eben die Lösung zu einem der 256 Probleme zu jeder Möglichkeit.
Beispiel (abstrakt):
Mgk entspricht Jahr
256 entspricht einem Monat
dann steht im dritten Feld ein "Link" zu den optimalen 6 Lottozahlen


Wenn ich nun auf einen Inhalt zugreife
C:
printf("%i\n",*(TABLE[mgk][(unsigned int)'-'][0]));
erhalte ich diesen einwandfrei. Mit
C:
printf("%i\n",*(TABLE[mgk][(unsigned int)'-'][0+j]));
kann ich die einzelnen Lösungen durchschalten und mit
C:
printf("%i\n",*(TABLE[mgk][(unsigned int)'-'][0+j]+k));
die einzelnen Felder in den Lösungen.
Wenn ich mir also ein best. Feld (eine best. Lottozahl) ausgeben lasse via printf() klappt das wunderbar. Allerdings wenn ich nun zu dieser Zahl etwas dazuaddiere:
C:
printf("%i\n",*(TABLE[mgk][(unsigned int)'-'][0+j]+k)+5);
dann addiert er zwar tatsächlich zu dieser Zahl etwas dazu, aber nicht '5' sondern '5x4'. Zwar erhalte ich mit '+5/4' mein gewünschtes Ergebnis, aber das ist
a) unsauber
b) für mich total unverständlich warum das so läuft.

Hat jemand ne Idee? Wenn was unklar formuliert ist, bitte sofort fragen.

Danke sagt das Gulasch


[NACHTRAG]
Komisch ist allerdings, wenn ich nun eine vorherige Zuweisung mache und dann addiere, funktioniert es
C:
int laenge = *(TABLE[mgk][(unsigned int)'-'][0+j]+k);
printf("%i\n",laenge+5);
:confused:
[/NACHTRAG]
 
Zuletzt bearbeitet:
Hi.

Also so ganz kann ich nicht nachvollziehen was du dort machst, aber wenn du auf die Variable TABLE so zugreifst:
C:
TABLE[mgk][(unsigned int)'-'][0+j]+k
dann hast du ja einen Zeiger auf einen Zeiger auf einen unsigned int. Wenn du das nochmal dereferenzierst hast du einen Zeiger auf unsigned int.

Wenn du da jetzt was addierst dann wird natürlich Zeiger-Arithmetik verwendet, denn der Typ den du da hast ist ein Zeiger. Wenn du zu einem Zeiger 5 dazu addierst, dann erhälst du die Adresse des 5. Elementes ab dieser Adresse.

Wenn also dein Zeiger auf die Adress 50 zeigt und das Objekt auf was der Zeiger zeigt 4 Byte groß ist (was zufällig die übliche Größe eines unsigned int auf einer 32bit Architektur ist), dann befindet sich das fünft-nächste Element natürlich bei Adresse 50+(4*5) = 70.

Du kannst natürlich verhindern das dort Zeiger-Arithmetik verwendet wird indem du castest:
C:
((unsigned int)*(TABLE[mgk][(unsigned int)'-'][0+j]+k))+5

Das Gleiche passiert natürlich auch wenn du den Zeiger an einen int zuweist (was eigentlich eine Warnung des Compilers hervorrufen sollte).

Vermutlich hast du einfach ein Sternchen zuviel bei der Typdeklaration gemacht, denn du scheinst da nicht wirklich einen Zeiger zu erwarten.

Gruß

Gruß
 

Neue Beiträge

Zurück