mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C variablen in dateien aufteilen


Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)
struct spi_raw_data
{
  unsigned int data0;
  unsigned int data1;
  unsigned int data2;
};

struct spi
{
  struct spi_raw_data RX;
  struct spi_raw_data TX;
};

in der dazugehörigen main.c mach ich mir nen feld von den structs:
struct spi data_field[10];
static struct spi_raw_data tx_test[] = 
{
  {0xF00F, 0x5050, 0xC0F3},
  {0xCF03, 0x5555, 0x0550},
  {0xF00F, 0x5050, 0xC0F3}
};
in der main.h habe ich noch folgendes stehen:
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
void copy_data(struct spi_raw_data* tx)
{
  char loop = 0;
  
  used_data = sizeof(tx);
  
  for(loop = 0; loop <= used_data; loop++)
  {
    data_field[loop].TX = tx[loop];
  }
  return;
}

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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 ...
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.

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.