Forum: Mikrocontroller und Digitale Elektronik Compilerfehlermeldung - Probleme mit Zeiger


von Leo78 (Gast)


Lesenswert?

Guten Morgen,

ich habe folgendes Problem mit einer Compilerfehlermeldung:
>>argument of type "obCan *" is incompatible with parameter of type "void *"
1
obCan   CanPort;
2
3
4
int main(void)
5
{
6
 ...
7
 while(1)
8
 {
9
  CanPort->Send(&CanPort,&Message,1);
10
 }
11
}

Header Datei Can.h:
//Can Sendefunktionen
1
int (*Send)(void*, stCanMessage*);

Funktion Datei Can.c:
1
int obCan_Send(obCan* pInstance, stCanMessage* Message)

Die Can Funktionen wurden in Ansi-C programmiert. Im Hauptprogramm wird 
die Headerdatei Can.h mit extern eingebunden. Der Grund dafür ist, dass 
das Hauptprogramm eine C++ Datei ist. Wie kann ich den Zeiger korrekt 
casten, damit diese Fehlermeldung nicht mehr erscheint?

von Karl H. (kbuchegg)


Lesenswert?

Leo78 schrieb:

> das Hauptprogramm eine C++ Datei ist. Wie kann ich den Zeiger korrekt
> casten, damit diese Fehlermeldung nicht mehr erscheint?

Wenn die Funktion einen void Pointer haben will, dann gib ihr einen


  CanPort->Send( (void*)&CanPort, &Message, 1);

von Leo78 (Gast)


Lesenswert?

Danke für die Antworten. Das mit void* habe ich bereits getestet. Die 
Funktion wird zwar ausgeführt, aber ich kann auf der PC-Seite keine CAN 
Botschaft empfangen. Wenn ich in ANSI-C bleibe, dann funktioniert diese 
Methode auch korrekt.

von Karl H. (kbuchegg)


Lesenswert?

Leo78 schrieb:
> Danke für die Antworten. Das mit void* habe ich bereits getestet. Die
> Funktion wird zwar ausgeführt, aber ich kann auf der PC-Seite keine CAN
> Botschaft empfangen. Wenn ich in ANSI-C bleibe, dann funktioniert diese
> Methode auch korrekt.

Dann hast du noch ein anderes Problem.

Wo hast du denn das CanPort Objekt her?

(Derartige void Pointer fallen normalerweise nicht aus der Luft, sondern 
man bekommt das Objekt, in dem man die Library um ein derartiges Objekt 
bittet. Daher auch der void Pointer, um anzudeuten, dass es den 
Verwender nicht zu interessieren hat, wie genau so ein Istance Objekt 
aussieht. Mit einem void Pointer kann man das verstecken)

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.