Forum: Compiler & IDEs dynamische struct im C


von milan (Gast)


Lesenswert?

Hallo zusammen,
ich habe folgenden code:
1
struct person
2
{
3
  unsigned long int nr;
4
  char name[50];
5
  uint16_t id;
6
  char test[50];
7
  char test1[20];
8
  bool NS;
9
};
10
11
int main (void)
12
{
13
  uint16_t test4=1;
14
  while(1) {
15
    
16
    struct spots person[test4];
17
    test4++;
18
    sizeof(person);
19
  }
20
}

wenn ich den struct so definiere kommt nur müll raus.
wenn ich es aber normal definiere anstelle von test4 z.B: 10 
funktioniert alles bestens.

Das Problem ist ich muss die Daten in den struct von einer SD Karte 
lessen und ich weiss nicht wieviele es sind. also muss es dynamisch 
sein.

Mache ich etwas falsch da oder muss ich eine andere funktion anstelle 
von sizeof() aufrufen???

Danke im Voraus
Milan

von milan (Gast)


Lesenswert?

falscher code:
1
struct person
2
{
3
  unsigned long int nr;
4
  char name[50];
5
  uint16_t id;
6
  char test[50];
7
  char test1[20];
8
  bool NS;
9
};
10
11
int main (void)
12
{
13
  uint16_t test4=1;
14
15
  struct person eins[test4];
16
  
17
  while(1) {
18
    
19
    test4++;
20
    sizeof(eins);
21
  }
22
}

von goldeneyes1987 (Gast)


Lesenswert?

milan schrieb:
> test4++;

was soll dieser Schritt bringen??


milan schrieb:
>sizeof(eins);

das geht so einfach nicht, da musst du dier was überlegen

von jgdo (Gast)


Lesenswert?

Also bei mir auf dem Rechner geht es, das Programm
1
#include <stdio.h>
2
3
struct Struct {
4
  int foo;
5
  float bar;
6
};
7
8
int main(void) {
9
  int i;
10
  
11
  for(i = 5; i < 10; i++) {
12
    struct Struct s[i];
13
    int size = sizeof(s);
14
    printf("sizeof = %d\n", size);
15
  }
16
}

gibt die werte 40, 48, 56, 64, 72 aus.

- jgdo -

von fdssd (Gast)


Lesenswert?

milan schrieb:
> Das Problem ist ich muss die Daten in den struct von einer SD Karte
> lessen und ich weiss nicht wieviele es sind. also muss es dynamisch
> sein.


geneau deswegen schreibt man eine parser der  die passenden daten 
raussucht
wenn mal blödsinn drinsteht schriebt er sonst gnadenlos ins nirvana

von milan (Gast)


Lesenswert?

Hallo zusammen,
danke für die Antworten.

Also das rainschreiben von Daten ist nicht das Problem.

NUR DIE DEKLARATION VON STRUCT!

weil es eben dynamisch ist.
1
struct person
2
{
3
  unsigned long int nr;
4
  char name[50];
5
  uint16_t id;
6
  char test[50];
7
  char test1[20];
8
  bool NS;
9
};
10
11
int main (void)
12
{
13
  uint16_t test4=1;
14
15
  struct person eins[test4];
16
  
17
    eins[test4-1].nr = test4-1;
18
    strcpy(eins[test4-1].name, "name");
19
    eins[test4-1].id = test4+20;
20
    strcpy(eins[test4-1].test, "test");
21
    strcpy(eins[test4-1].test1, "test1");
22
    eins[test4-1].NS = TRUE;
23
  while(test4<=10) {
24
  test4++;
25
  struct person eins[test4];
26
  
27
    eins[test4-1].nr = test4-1;
28
    strcpy(eins[test4-1].name, "name");
29
    eins[test4-1].id = test4+20;
30
    strcpy(eins[test4-1].test, "test");
31
    strcpy(eins[test4-1].test1, "test1");
32
    eins[test4-1].NS = TRUE;
33
  }
34
  //ausgabe
35
}

so wenn ich jetzt die daten ausgeben will kommt zB: bei 
eins[test4-1].name
"nast1"  also name + test1 halb/halb ich weiss aber nicht warum.
wenn ich es aber ohne while schleife mache und 10 struckts von hand 
einschreibe dan geht es ohne probleme!

Gruss
Milan

von Karl H. (kbuchegg)


Lesenswert?

milan schrieb:
> Hallo zusammen,
> danke für die Antworten.
>
> Also das rainschreiben von Daten ist nicht das Problem.
>
> NUR DIE DEKLARATION VON STRUCT!

Nein.
Dein ganzer Ansatz ist Blödsinn. Du erwartest da etwas zuviel davon, 
dass du Arrays seit C99 auch dynamisch zur Laufzeit mit erinem 
Maximalindex festlegen kannst.

>  while(test4<=10) {

ein neuer Block beginnt

>    struct person eins[test4];

eine neue Variable namens 'eins' wird innerhalb des Blocks erzeugt. 
Datentyp 'Array von struct person', Größe des Arrays: soviele wie in 
test4

> .....
>  }

der Block endet. Die innerhalb der Blocks erzeugte Variable namens 
'eins' wird zerstört.


Wenn du Daten global aufheben willst, dann musst du entweder dynamisch 
mittels malloc reservieren bzw vergrößern (was auf einem kleinen AVR aus 
verschiedenen Gründen nicht sinnvoll ist) oder du einigst dich mit dir 
selbst auf eine maximale Arraygröße und lebst mit der.


> int main (void)
> {
>  ....
>  struct person eins[test4];
>
>  ....
>  while(test4<=10) {
>    ....
>    struct person eins[test4];

Die zweite Variable 'eins' istr NICHT identisch mit der ersten. Das ist 
eine davon völlig unabhängige Variable. Du kannst ein einmal auf diese 
Art erzeugtes Array nicht nachträglich in der Größe ändern. Egal wie oft 
du C-Regeln verletzt und in Arrays 'Out of Bounds' zugreifst.

von milan (Gast)


Lesenswert?

Hallo Karl,
danke für deine Antwort.

ok, jetzt habe ich es kapiert.

Was würdest du mir empfehlen, bei der Aufgabenstellung:

ich habe daten auf einer SD Karte die ich einlessen muss, und aufteilen.
Die Daten auf der Karte sehen so aus.
Name1,12345,test,test1,TRUE
Name2,67890,rot,blau,FALSE
.....

ich muss permanent auf die Daten zugreifen können ohne jedes mahl die 
karte auszulessen.

Gruss
Milan

von Karl H. (kbuchegg)


Lesenswert?

milan schrieb:
> Hallo Karl,
> danke für deine Antwort.
>
> ok, jetzt habe ich es kapiert.
>
> Was würdest du mir empfehlen, bei der Aufgabenstellung:

Auf einem kleinen µC, wie zb den Megas?

Array mit einer Maximalgröße festlegen und damit leben. Je nachdem, 
weiviel SRAM dann am Ende noch übrig bleibt, die Arraygröße entsprechend 
hochschrauben, so dass das SRAM ausgenutzt wird.
Mehr geht sowieso nicht: Wenn das SRAM voll ist, dann ist es voll.

Auf einem PC: nicht päpstlicher als der Papst sein und Speicher mittels 
malloc allokieren bzw. mittels realloc vergrößern.

von milan (Gast)


Lesenswert?

ich benutze einen XMEGA128A1!

kann man den SRAM vergrössern?? Wenn ja, wo kann man es kaufen?

von smoerre (Gast)


Lesenswert?

milan schrieb:
> kann man den SRAM vergrössern?? Wenn ja, wo kann man es kaufen?

Warum willst du es vergrößern? Du bist doch vom Anfang an davon 
ausgegangen, dass die Daten ins RAM passen. Warum passen sie jetzt 
plötzlich nicht mehr?

von milan (Gast)


Lesenswert?

smoerre schrieb:
> milan schrieb:
>> kann man den SRAM vergrössern?? Wenn ja, wo kann man es kaufen?
>
> Warum willst du es vergrößern? Du bist doch vom Anfang an davon
> ausgegangen, dass die Daten ins RAM passen. Warum passen sie jetzt
> plötzlich nicht mehr?


Weil ich für test nur 5 structs von hand geschrieben habe und in der 
wirklichkeit könnten es 100-te sein.

von smoerre (Gast)


Lesenswert?

Du verfolgst einen komplett falschen Ansatz. Überdenke dein Konzept.

von milan (Gast)


Lesenswert?

smoerre schrieb:
> Du verfolgst einen komplett falschen Ansatz. Überdenke dein Konzept.

hehe da bin ich gerade dabei. leider war das ganze programm fertig und 
jetzt kann ich alles von vorne anfangen. SUPER!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.