mikrocontroller.net

Forum: Compiler & IDEs Problem bei der Übergabe eines structs


Autor: Icke Muster (Firma: my-solution) (hendi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,
ich hab mal wieder ein Problem mit einem Programmfragment. Ich möchte 
einen Pointer auf eine Struct übergeben und diese dann entsprechend 
nutzen.
int main(void){
struct soap soap;
soapInit(&soap);
soap_begin(&soap);
return 0;
}

int soapInit(struct soap *mysoap){
soap_init(mysoap);
//struct soap mysoap;
mysoap.fsend=customizedSend;
mysoap.frecv=customizedRcv;
return SOAP_OK;
}
Bei dem soap struct handelt es sich um die Soap Runtime aus der gsoap 
API, was aber mit dem Problem nichts zu tun hat. Die Fkt. fsend und 
frecv sind Teile dieser Struktur. Wenn ich die auskommentierte Zeile 
benutze funktioniert alles wunderbar, aber wenn ich so wie hier den 
Zeiger benutzen möchte, sagt  mir der gcc, dass ich auf einen member 
eines Typs zuzugreifen versuche, der weder struct noch union ist. Was 
mach ich da falsch? Kann man structs nicht so behandeln?
Danke schon mal für eure Hilfe!!

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei einem Zeiger greift man mit -> auf die Elemente des structs zu

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

Bewertung
0 lesenswert
nicht lesenswert
Icke Muster wrote:
> benutze funktioniert alles wunderbar, aber wenn ich so wie hier den
> Zeiger benutzen möchte, sagt  mir der gcc, dass ich auf einen member
> eines Typs zuzugreifen versuche, der weder struct noch union ist.

und recht hat er damit.

mysoap ist weder eine union noch eine struct.
mysoap ist ein Pointer.

Und ein Pointer hat nun mal keine Member. Er ist einfach nur
ein Pointer, so wie ein int einfach nur ein int ist.

Aber das, worauf der Pointer zeigt, ist ein struct. Und die hat
die entsprechenden Member. Also muss man den Pointer dereferenzieren,
damit man an die struct kommt

   (*mysoap).fsend = ...

Da diese Schreibweise mit Klammern und * aber umständlich zu
tippen ist, und diese Operation relativ häufig vorkommt, gibt
es in C eine alternative Syntax

   mysoap->fsend = ....

> Was
> mach ich da falsch?

Du liest kein C-Buch. Da würde das alles drinnenstehen.

Autor: Icke Muster (Firma: my-solution) (hendi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Walter: Danke für deine schnelle Antwort
@Karl Heinz: Danke wieder einmal für deine ausführliche Antwort. Den 
Vorwurf mit dem Buch muss ich zumindest teilweise zurückweisen. Ich habe 
im Kernighan/Richie danach gesucht und bin nach deinem Hinweis mit 
dem"->" jetzt auch fündig geworden. Also hab ich scheinbar falsch 
nachgeschaut, bin nach dem Post ins Bett, mein Blick war schon etwas 
schwammig... .

Also nochmals danke und sorry für den Boardoverhead!

P.S.: Es funktioniert jetzt natürlich, so wie ihr es vorgeschlagen habt!

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.