Forum: Mikrocontroller und Digitale Elektronik C variablen in dateien aufteilen


von Marcel (Gast)


Lesenswert?

hi zusammen

ich schreib gerade nen kleines c prog auf dem msp430 in CCE 3. Dabeui 
habe ich folgendes Problem:

ich habe mir 2 structs gebaut die wie folgt aussehen (stehen in spi.h)
1
struct spi_raw_data
2
{
3
  unsigned int data0;
4
  unsigned int data1;
5
  unsigned int data2;
6
};
7
8
struct spi
9
{
10
  struct spi_raw_data RX;
11
  struct spi_raw_data TX;
12
};

in der dazugehörigen main.c mach ich mir nen feld von den structs:
1
struct spi data_field[10];
2
static struct spi_raw_data tx_test[] = 
3
{
4
  {0xF00F, 0x5050, 0xC0F3},
5
  {0xCF03, 0x5555, 0x0550},
6
  {0xF00F, 0x5050, 0xC0F3}
7
};
in der main.h habe ich noch folgendes stehen:
1
extern struct spi data_field[10];

so das geht, jetzt hab ich mir ne funktion gebaut (in spi.c), die 
tx_test nach data_field.TX kopieren soll
1
void copy_data(struct spi_raw_data* tx)
2
{
3
  char loop = 0;
4
  
5
  used_data = sizeof(tx);
6
  
7
  for(loop = 0; loop <= used_data; loop++)
8
  {
9
    data_field[loop].TX = tx[loop];
10
  }
11
  return;
12
}

so und nun krachts...... CCE sagt mir folgendes:
expression must be a pointer to a complete object type spi spi_drv.c

ich versteh nur bahnhof...... was mach ich falsch?

Danke und Gruß
Marcel

von Stefan E. (sternst)


Lesenswert?

Anscheinend ist dem Compiler der genaue Aufbau der Struktur zu diesem
Zeitpunkt nicht bekannt. Du hast vermutlich vergessen spi.h dort
einzubinden.

Aber auch wenn ihm die Struktur dann bekannt ist, wird es nicht
funktionieren, denn ...
1
used_data = sizeof(tx);
.. used_data enthält hier nur die Größe eines Pointers, nicht die Größe
der Struktur, und schon gar nicht die Anzahl der Array-Elemente.

von Marcel (Gast)


Lesenswert?

hi stefan

also du hattest recht gehabt ... hatte das include vergessen!

das mit dem sizeof stimmt auch... nur wie gehts? in main kann ich ja 
sizeof(data_field)/sizeof(struct spi) machen und bekomme dann das 
richtige zurück. aber in der fkt krieg ich nur die länge des ptr... muss 
ich die länge jetzt als parameter aufnehmen oder gehts auch anders?

gruß

von Stefan E. (sternst)


Lesenswert?

Du hast in der Funktion keine Chance über den Pointer an die Länge des 
Arrays zu kommen. Du musst sie also als Parameter mit übergeben.

von Marcel (Gast)


Lesenswert?

ok

danke stefan! hab noch eine frage.... wenn ich die variable 
spi_data_field auch static machen (um paltz auf dem stack zu sparen) 
mussich diese auch als parameter übergeben oder gibts da nen anderen 
trick?

danke und gruß

von Stefan E. (sternst)


Lesenswert?

Ich verstehe nicht ganz, was du meinst. Wo willst du die Variable static 
machen, und warum sollte das Platz sparen?

von Marcel (Gast)


Lesenswert?

hi

also ich dachte mir das so:
die variablen nicht ins ram zu schreiben sondern ins flash, da ich nicht 
besonders viel ram habe.
geht aber net so, weil wenn ich sie mit const ablege kann ich sie nur im 
sourcecode ändern, die frage ist ob es mgl. ist dies mit einem anderen 
befehl zu tun. static schreib ja leider auch ins ram und reserviert im 
gegensatz zu auto den bereich fest.

mfg

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.