Forum: PC-Programmierung Array von Structs als Referenz übergeben


von Alfred (Gast)


Lesenswert?

Hallo Leute,

ich habe das verzwickte Problem, dass ich einer Funktion ein Array von 
Structs übergeben will, aber leider nicht weis wie.

Die Fehlermeldung lautet:
Type error in argument 1 to 'Init_CAN_Device'; "found 'pointer to struct 
CAN_Bus_Structure' expected 'pointer to incomplete struct 
CAN_Bus_Structure'
1
// Deklarationen
2
int Init_CAN_Device(struct CAN_Bus_Structure *CAN_Bus);
3
4
struct CAN_Bus_Structure 
5
{
6
  long Handle;
7
  unsigned long gChannelMask;
8
  unsigned int Bus_No;
9
  unsigned int Status;
10
  unsigned int BaudRate;
11
  unsigned int TraceCounter;
12
};
13
14
// Array von Structs erstellen
15
struct CAN_Bus_Structure CAN_Bus[MAX_CAN_BUS_NO];
16
17
//Prototyp
18
int Init_CAN_Device(struct CAN_Bus_Structure *CAN_Bus)
19
{
20
  Vstatus vErr;
21
  int i, ChIndex= 0;
22
  int AC2_Channel_found = 0, CANCASEXL_Channel_found = 0;
23
  // ... CODE
24
  CAN_Bus[i].Handle = INVALID_PORTHANDLE;
25
  //..... noch viel code
26
  if ( AC2_Channel_found >= 2 || CANCASEXL_Channel_found >= 2)
27
           return OK;
28
  else
29
    return NOK;
30
}
31
32
// main()
33
int main (int argc, char *argv[])
34
{
35
// ... CODE
36
  Init_CAN_Device(CAN_Bus);   // HIER KOMMT DER FEHLER!!!
37
               
38
//..... noch viel code
39
}

Wer weis Rat?

Wie übergebe ich die Referenz richtig?

Probiert habe ich:
Init_CAN_Device(CAN_Bus);
Init_CAN_Device(&CAN_Bus);
Init_CAN_Device(CAN_Bus[]);
....
nicht ging.

Kann mir jemand weiterhelfen?

Grüße,

Alfred

von Karl H. (kbuchegg)


Lesenswert?

Alfred schrieb:

> Die Fehlermeldung lautet:
> Type error in argument 1 to 'Init_CAN_Device'; "found 'pointer to struct
> CAN_Bus_Structure' expected 'pointer to incomplete struct
> CAN_Bus_Structure'

Na, die Fehlermeldung ist ja mal lustig


>
> // Deklarationen
> int Init_CAN_Device(struct CAN_Bus_Structure *CAN_Bus);
>
> struct CAN_Bus_Structure
> {
>   long Handle;
>   unsigned long gChannelMask;
>   unsigned int Bus_No;
>   unsigned int Status;
>   unsigned int BaudRate;
>   unsigned int TraceCounter;
> };

Dreh hier mal die Reihenfolge um.
Zuerst die struct definieren und sie erst dann verwenden, zb im Prototyp 
zu Init_CAN_Device

von Flo (Gast)


Lesenswert?

Du musst erst mal eine Instanz der Struktur machen, bevor du sie 
übergeben kannst. Die Strukturbeschreibung gibt nur den "Bauplan" an, 
reserviert aber noch keinen Speicher.

z.B in der main


CAN_Bus_Structure TestCAN;  //CAN erzeugen

Init_CAN_Device(TestCAN);  //initialisieren


übrigends sollte in der Deklaration und der Definition von
"int Init_CAN_Device(struct CAN_Bus_Structure *CAN_Bus)" das struct 
raus, da der Datentyp durch die structdefinition schon vorhanden ist.

Hoffe das hilft

von Karl H. (kbuchegg)


Lesenswert?

Flo schrieb:
> Du musst erst mal eine Instanz der Struktur machen, bevor du sie
> übergeben kannst.

Hat er doch
1
// Array von Structs erstellen
2
struct CAN_Bus_Structure CAN_Bus[MAX_CAN_BUS_NO];

> übrigends sollte in der Deklaration und der Definition von
> "int Init_CAN_Device(struct CAN_Bus_Structure *CAN_Bus)" das struct
> raus, da der Datentyp durch die structdefinition schon vorhanden ist.

Du redest von C++.
In C ist das schon richtig und muss auch so sein.
(und in C++ ist das struct zwar überflüssig aber auch nicht falsch)

von Grrrr (Gast)


Lesenswert?

Flo schrieb:
> Du musst erst mal eine Instanz der Struktur machen, bevor du sie
> übergeben kannst.

Flo schrieb:
> übrigends sollte in der Deklaration und der Definition von
> "int Init_CAN_Device(struct CAN_Bus_Structure *CAN_Bus)" das struct
> raus, da der Datentyp durch die structdefinition schon vorhanden ist.

Flo schrieb:
> Hoffe das hilft

Das halte ich für eher unwahrscheinlich.

von Alfred (Gast)


Lesenswert?

Hi Leute,

Wow, soviele Antoworten innerhalb knapp 10min!!!
Das nenn ich mal ein aktives Forum.

Das Problem hat sich gelöst:

Karl heinz Buchegger hat natürlich recht, die Reihenfolge muss beachtet 
werden, habe ich auch beachtet nur in meinem Posting hab ichs umgedreht.

Auch nicht erzählt habe ich, dass die Deklaration des structs in 
"Global_Declarations.h" gemacht ist, die instanzierung aber im 
hauptprogramm.

Nach vertauschen der Reihenfolge meiner #includes funzt alles 
einwandfrei:

vorher:
#include "cancount.h"   // cancount.c hat funktion "Init_CAN_Device"
#include "VCanD.h"
#include "Global_Declarations.h" // deklariert den struct
#include "Defines.h"

nachher:
#include "Global_Declarations.h" // deklariert den struct
#include "Defines.h"
#include "cancount.h"   // cancount.c hat funktion "Init_CAN_Device"
#include "VCanD.h"

Vielen Dank für eure schnellen Antworten!!!!

Grüße,

Alfred

von Karl H. (kbuchegg)


Lesenswert?

Alfred schrieb:

> Vielen Dank für eure schnellen Antworten!!!!

Nur der Vollständigkeit halber.
Welcher Compiler ist das?
Nur damit ich in Zukunft einen großen Bogen um ihn machen kann.

von Grrrr (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Nur damit ich in Zukunft einen großen Bogen um ihn machen kann.

Witzig. Sollten mal eine Anti-Liste anfangen. Gestern CCS und nun...

von Karl H. (kbuchegg)


Lesenswert?

Grrrr schrieb:
> Karl heinz Buchegger schrieb:
>> Nur damit ich in Zukunft einen großen Bogen um ihn machen kann.
>
> Witzig. Sollten mal eine Anti-Liste anfangen. Gestern CCS und nun...

Wobei ich für den CCS sogar Verständnis habe. Der muss (musste) auf 
technologische Beschränkungen eingehen.

Eine Fehlermeldung ala "Du bist mir zu genau, gib mir lieber was 
ungefähres" ist mir allerdings dann doch zu abstrus, als das ich mit 
diesem Compiler Bekanntschaft machen möchte. Fälle, die sich dann nur 
noch mit einer Forward-Deklaration lösen lassen, werden dann zum 
interessanten Albtraum.

von Grrrr (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Wobei ich für den CCS sogar Verständnis habe. Der muss (musste) auf
> technologische Beschränkungen eingehen.

Hmmm. Schon, aber das sollte in der Fehlermeldung auch irgendwie erwähnt 
sein. Z.B. "Deviating from Standard-C". Jedenfalls würde ich mir das 
wünschen. Sonst fängt man vielleicht an, an seinem Verstand zu zweifeln.

von Arc N. (arc)


Lesenswert?

Karl heinz Buchegger schrieb:
> Alfred schrieb:
>
>> Vielen Dank für eure schnellen Antworten!!!!
>
> Nur der Vollständigkeit halber.
> Welcher Compiler ist das?
> Nur damit ich in Zukunft einen großen Bogen um ihn machen kann.

Sucht man nach "expected 'pointer to incomplete struct" gibt's das wohl 
nur in Kombination mit dem Matlab-Compiler...

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.