Forum: Compiler & IDEs Problem: Struct->call by reference->verschiedene Quellen


von Andreas (Gast)


Lesenswert?

Folgendes Problem:
Ich habe ein Struct für 3 Messwerte (x,y,z) in adxl345.h deklariert. In 
main.c erstelle ich einen Zeiger auf einen solchen Typ und übergebe 
diesen an die Funktion get_acc_adxl345(&adxl345_messwert). Diese 
Funktion befindet sich in adxl345.c und ist der main.c auch bekannt über 
die eingebundene Headerdatei.


Compilerfehler:
expected '=', ',', ';', 'asm' or '__attribute__' before 
'adxl345_messwert'  ADXL345.h (Zeile: extern adxl345 adxl345_messwert)

expected ')' before '*' token  ADXL345.h (Zeile: extern void 
get_acc_adxl345(adxl345 *)

expected ')' before '*' token  ADXL345.c (Zeile: void 
get_acc_adxl345(adxl345 *messwert)




[c]
//main.c
#include <ADXL345.h>

volatile adxl345 *adxl345_messwert;

...

void main()
{
...
get_acc_adxl345(&adxl345_messwert);
...
}


//adxl345.h
#include <inttypes.h>

typedef struct adxl345{
  uint8_t x;
  uint8_t y;
  uint8_t z;
};

extern adxl345 adxl345_messwert;

extern void get_acc_adxl345(adxl345 *);

//adxl345.c
#include <ADXL345.h>
void get_acc_adxl345(adxl345 *messwert)
{
...
  messwert->x = (((int)_buff[1]) << 8) | _buff[0];
  messwert->y = (((int)_buff[3]) << 8) | _buff[2];
  messwert->z = (((int)_buff[5]) << 8) | _buff[4];
}
[\c]

Danke im Vorraus!

von Oliver (Gast)


Lesenswert?

Lies nochmal in deinem C-Buch die Syntax zu typedef struct nach - da 
stimmt was nicht.

Oliver

von Andreas (Gast)


Lesenswert?

Das war das erste was ich gemacht habe.

typedef struct adxl345{
  uint8_t x;
  uint8_t y;
  uint8_t z;
};

Deklariert neuen Typ adxl345.

Definition des Typs dann in der main.c

Oder liege ich da falsch?

von (prx) A. K. (prx)


Lesenswert?

Andreas schrieb:
> Deklariert neuen Typ adxl345.

Nein.

Ein C-Statement wie
  typedef struct S { ... };
ist identisch mit
  struct S { ... };
und definiert zwar eine struct, aber keinen Typnamen (weil leer).

Im Grund ist das sowas wie
  typedef int;
und das ist zwar zulässig, aber sinnlos.

von Papa (Gast)


Lesenswert?

Andreas schrieb:
> typedef struct adxl345{
>   uint8_t x;
>   uint8_t y;
>   uint8_t z;
> };

muss glaub ich so heißen:

typedef struct struct_adxl345{
  uint8_t x;
  uint8_t y;
  uint8_t z;
} adxl345;

"struct_adxl345" kann auch weggelassen werden.

von Andreas (Gast)


Lesenswert?

Danke habe es gerade gesehen!

von (prx) A. K. (prx)


Lesenswert?

Papa schrieb:
> "struct_adxl345" kann auch weggelassen werden.

Oder darf ebenfalls adxl345 heissen.

von Andreas (Gast)


Lesenswert?

Jedoch gibt es immer noch Probleme bei dem Funktionsaufruf...

von (prx) A. K. (prx)


Lesenswert?

Yep, und zwar diesmal beim volatile.

von Andreas (Gast)


Lesenswert?

Ok Problem gelöst:

extern adxl345 adxl345_messwert;
Ist Unsinn in der adxl345.h

Danke!

von Andreas (Gast)


Lesenswert?

Genau und natürlich keinen Zeiger anlegen!

von (prx) A. K. (prx)


Lesenswert?

Es würde mich übrigens auch interessieren, wie du zweimal 8 Bits in eine 
8-Bit Variable zu quetschen gedachtest.

von Andreas (Gast)


Lesenswert?

Mich auch ;-)

von Pako (Gast)


Lesenswert?

Andreas schrieb:
> get_acc_adxl345(&adxl345_messwert);

Und mich würd interessieren, warum Du die Adresse des Zeigers übergeben 
willst und nicht den Inhalt des Zeigers...

von Papa (Gast)


Lesenswert?

Was ist das denn für ein Projekt?

von Andreas (Gast)


Lesenswert?

ADXL345 ist ein Accelerometer.
Ich will mit der Funktion get_acc_adxl345(&adxl345_messwert); die 
Messwerte des Sensors erhalten.
Dachte mir das ist die beste Möglichkeit oder irre ich mich da?
D.h. ich übergebe der Funktion den Zeiger und die Funktion schreibt die 
Werte.
Gibt es eine bessere/ geschicktere Möglichkeit?

Projekt: Sensorboard mit Gyro und Acc (RoboBee 6 DOF), zum Einstieg in 
die µC Programmierung

von Papa (Gast)


Lesenswert?

Andreas schrieb:
> ADXL345 ist ein Accelerometer
Genau deswegen habe ich gefragt. Hatte kurz danach gegoogelt..
Dachte dann, dass du evtl. etwas für den Modellbau oder sowas machst.
Hast du dann noch irgendwas konkretes damit vor?
Hast du einen LCD zum Darstellen der Werte?

Andreas schrieb:
> Gibt es eine bessere/ geschicktere Möglichkeit?
Kann man meiner Meinung nach schon so machen...

von Andreas (Gast)


Lesenswert?

In ferner Zukunft will ich damit einen einachsigen Roboter Regeln. 
(Inverses Pendel).

Wäre aber auch sicherlich für einen Quadrokopter o.ä. interessant, bzw. 
Segway Klon...

Mal schauen was die zukunft bringt und wie groß das Budget ist.

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.