Probleme mit sizeof in Kombination mit Benutzerdefinierten Typen
-
Hi.
Ich habe einen Benutzerdefinierten Dateitypen erstellt:
typedef struct { double x, y, z; int number; } TNode;
In einer Function erstelle ich ein Array dieses Typen und fülle es:
int main() { TNode * Node, gNode; int nNode; //...nNode wird bestimmt... Node = (TNode *) calloc(nNode, sizeof(TNode)); for (i=0;i<=nNode;i++) { //...es werden 231 Einträge geschrieben... Node[i].number = i; Node[i].x = 1; Node[i].y = 2; Node[i].z = 3; } printf("Groesse des Datentypen TNode: %i\n",sizeof(TNode)); //Liefert 32 printf("Groesse des Arrays Node: %i\n", sizeof(Node)); //Liefer 4 ??? printf("Anzahl der Einträge: %i\n",sizeof(Node)/sizeof(TNode)); //Liefert 0 return 0; }
Eigentlich habe ich erwartet, dass mit sizeof(Node)/sizeof(TNode) die Anzahl der Einträge im Array liefert.
Stellt bitte den Sinn der Funktion nicht infrage, denn die Anzahl der Einträge ist ja in nNode gespeichert - ist nur ein Beispiel
Sieht jemand, wo es hackt?
Oder gibt es eine andere Möglichkeit, die Anzahl der Einträge eines Arrays zuverlässig zu bestimmen?Vielen Dank für Eure Mühe,
CJens
-
CJens schrieb:
Eigentlich habe ich erwartet, dass mit sizeof(Node)/sizeof(TNode) die Anzahl der Einträge im Array liefert.
In welchem Array? Node ist ein Zeiger, also ist sizeof(Node) die Größe eines Zeigers in Byte.
Falls du nachträglich rauskriegen willst, wieviele Bytes calloc alloziert hat -- das geht nicht, jedenfalls nicht mit Standard-Mitteln.
-
hi,
CJens schrieb:
Sieht jemand, wo es hackt?
du meinst wohl hakt! das hier ist kein holzfäller-/ koch-/ hacker-/ gartenforum!
*SCNR*CJens schrieb:
printf("Groesse des Datentypen TNode: %i\n",sizeof(TNode)); //Liefert 32
printf("Groesse des Arrays Node: %i\n", sizeof(Node)); //Liefer 4 ???
printf("Anzahl der Einträge: %i\n",sizeof(Node)/sizeof(TNode)); //Liefert 032 == sizeof(double)+sizeof(double)+sizeof(double)+sizeof(int)+ alignment-füllbytes.
4 == sizeof(Node), ja, standard-größe eines zeigers in bytes auf einem 32-bit system.
0 = 4/32, jepp, iteger-division.CJens schrieb:
Oder gibt es eine andere Möglichkeit, die Anzahl der Einträge eines Arrays zuverlässig zu bestimmen?
ja, indem du die anzahl beim erzeugen/löschen irgendwo speicherst, z.b.
typedef struct { TNode* ptn; int n; // <--- hier }TNodeArray; typedef struct { TNode* first, *next; int n; // <--- oder dort }TNodeList; typedef struct { ? // <--- oder an einem ganz anderen ort ... }...
-
...ich wollte nur verhindern, dass ich bei weiteren Unterfunktionen stets den Pointer auf das Array und die Anzahl der Einträge übergeben muss.
Auf das Array Node werde ich immer wieder zugreifen müssen.
Aber wenn es nicht anders geht, dann ist das auch nicht so schlimm...Vielen Dank für Eure Gedanken,
CJens
-
Andere Lösung für das Problem ist es ein Ende-Symbol zu definieren. Das ist nichts anderes als eine Konstante vom Typ TNode, mit einem Wert der idealerweise sonst nicht verwendet wird. Dieser markiert das Ende des Arrays, indem du ihn auf das letzte Element setzt.
-
Mit dem Endezeichen weiß man wie viele Element im "Array" sind, aber nicht wie viele rein passen.
Schlepp die Größe in einer zweiten Variablen mit.
Du brauchst das auch bei Strings. Da ist es dasselbe Problem.
-
http://www.programmieren-online.de/programmieren_fortgeschritten_arraysuchen.html
hier findest du ein beispiel zu deinem problem.
-
kaluuu schrieb:
hier findest du ein beispiel zu deinem problem.
Das ist nicht sein Problem, das hat er sogar erwartet.
Lagere mal die Suche (nur die Suche) in eine Funktion aus.
Dann hast du ein Beispiel für sein Problem.
-
for (i=0;i<=nNode;i++) {
Es hakt auch bei der Abbruchbedingung der for-Schleife.
Sollte wohl "<" statt "<=" sein.