mikrocontroller.net

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


Autor: Alfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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'
// 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;
};

// Array von Structs erstellen
struct CAN_Bus_Structure CAN_Bus[MAX_CAN_BUS_NO];

//Prototyp
int Init_CAN_Device(struct CAN_Bus_Structure *CAN_Bus)
{
  Vstatus vErr;
  int i, ChIndex= 0;
  int AC2_Channel_found = 0, CANCASEXL_Channel_found = 0;
  // ... CODE
  CAN_Bus[i].Handle = INVALID_PORTHANDLE;
  //..... noch viel code
  if ( AC2_Channel_found >= 2 || CANCASEXL_Channel_found >= 2)
           return OK;
  else
    return NOK;
}

// main()
int main (int argc, char *argv[])
{
// ... CODE
  Init_CAN_Device(CAN_Bus);   // HIER KOMMT DER FEHLER!!!
               
//..... noch viel code
}

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Flo (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Hat er doch
// Array von Structs erstellen
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)

Autor: Grrrr (Gast)
Datum:

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

Autor: Alfred (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Grrrr (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Grrrr (Gast)
Datum:

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

Autor: Arc Net (arc)
Datum:

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

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.