Forum: PC-Programmierung C: STRUCT als Parameter für Funktion


von Daniel (Gast)


Lesenswert?

Hallo zusammen,
ich erhalte folgende Fehlermeldung beim Kompilieren von struct.c

Fehlermeldung:
1
struct.c: In function 'printAdresse':
2
struct.c:6:34: error: request for member 'ort' in something not a structure or union


Hier der C-Code

C-Code:
1
#include <stdio.h>
2
//Programm soll eigentlich zwei Threads starten, die etwas ausgeben, zur Einfachheit habe ich aber "einfache" Funktionen verwendet
3
//#include <pthread.h> 
4
5
void printAdresse(void *a){
6
   char ort[] = (struct adresse *)a.ort;
7
   print("%s\n",ort);
8
}
9
10
int main(void){
11
   struct adresse{
12
      char strasse[20];
13
      char ort[20]
14
      unsigned long tel;
15
   };
16
 
17
   struct adresse krankenhaus = {
18
      "Musterstrasse 12",
19
      "Musterort",
20
      012345
21
   };
22
23
   printAdresse((void *)&krankenhaus);
24
   return 0;
25
}

Anmerkung: die erwarteten unspezifschen Datentypen sind bewusst gewählt, 
da das ganze als Thread-Aufruf realisiert werden soll.

Das grundlegende was also nicht funktioniert ist die Übergabe eines 
STRUCTS an pthread_create().

Danke für Hilfe

von peterguy (Gast)


Lesenswert?

Semikolon vergessen?

Versuchs mal mit char ort[20];

von Peter II (Gast)


Lesenswert?

bin mir nicht sicher, aber hier könnte eine klammer fehlen:

> char ort[] = (struct adresse *)a.ort;

char ort[] = ((struct adresse *)a)->ort;

von Daniel (Gast)


Lesenswert?

Hallo,

Danke für den Hinweis,

beim Verfassen des Posts habe ich wohl das Semikolon vergessen (arbeite 
an einem anderen PC deshalb kein copy&paste des Sourcecodes).

von Daniel (Gast)


Lesenswert?

Hallo Peter II,
1
char ort[] = ((struct adresse *)a)->ort;

liefert beim Kompilieren
1
struct.c: In function 'printAdresse':
2
struct.c:6:34: error: dereferencing pointer to incomplete type

von not registered (Gast)


Lesenswert?

printAdresse kennt die Struktur doch gar nicht.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

not registered schrieb:
> printAdresse kennt die Struktur doch gar nicht.

So isses. Das wird ihm der Compiler auch gesagt haben ...

von Karl H. (kbuchegg)


Lesenswert?

Punkt 1

Was sollen die ganzen Casts in deinem Code?
Willst du dir mit Gewalt Probleme einhandeln?

Punkt 2

Um auf einen Strukturmember zuzugreifen, benutzt man die . Schreibweise

   struct adresse adr;
   adr.tel = 1234;

Aber: Du hast in der Funktion kein Objekt vom Typ struct adresse.
Du hast einen Pointer darauf!
Und wie immer muss man den Pointer dereferenzieren, wenn man an das 
Objekt selber über den Pointer rankommen will

   struct adresse * adr;
   (*adr).tel = 1234;

Die Klammern rund um die Dereferenzierung sind notwendig, weil die 
Operatoren Reihenfolge sonst falsch wäre

   *adr.tel

würde vom Compiler gelesen als

   adr                    nimm adr
   adr.tel                von diesem adr den tel member
   *adr.tel               und diesen Member derferenzierst du jetzt

Das ist aber Quatsch. Denn adr ist ja ein Pointer. Und ein Pointer hat 
keine Member. Also muss es lauten

   adr                    nimm adr
   *adr                   dereferenzier den Pointer. Geh also
                          zum Objekt, auf welches adr zeigt

   (*adr).tel             und von diesem Objekt nimmst du den
                          tel member


Da aber diese Schreibweise mit den Klammern lästig zu schreiben ist, 
gibt es in C eine Kurzform dafür

    adr->tel

das macht genau dasselbe und sieht auch optisch schon mehr nach dem aus, 
was da passiert

    adr                   nimm adr
    adr->                 verfolge den Pointer bis zum Objekt, auf
                          welches adr zeigt
    adr->tel              und von diesem Objekt nimmst du den tel
                          Member

von Karl H. (kbuchegg)


Lesenswert?

Daniel schrieb:
> Hallo Peter II,
>
>
1
> char ort[] = ((struct adresse *)a)->ort;
2
>
>
> liefert beim Kompilieren
>
>
1
> struct.c: In function 'printAdresse':
2
> struct.c:6:34: error: dereferencing pointer to incomplete type
3
>


Lies dein Programm von oben nach unten. Lies es nur ein einziges mal.
Wo wird das erste mal ein 'struct adresse' verwendet und wo wird 
definiert, was das überhaupt ist.

Wenn die Verwendung vor der Definition erfolgt, hast du ein Problem.
Denn wie gesagt: Der Compiler liest den Text von oben nach unten. Und er 
tut das nur ein einziges mal. Und verwenden kannst du nur Dinge, die du 
vorher definiert hast.

Was der Compiler nicht tut: Sich die Einzelteile aus dem Programmtext 
kreuz und quer zusammensuchen.

von Rolf M. (rmagnus)


Lesenswert?

Das ist das eine Problem. Das andere ist, daß der Typ lokal definiert 
wurde. Genau wie Variablendefinitionen haben auch Typdefinitionen einen 
Gültigkeitsbereich. Ein Typ, der nur lokal in einer Funktion definiert 
ist, ist auch nur in der Funktion verfügbar.

Karl Heinz Buchegger schrieb:
> Punkt 1
>
> Was sollen die ganzen Casts in deinem Code?
> Willst du dir mit Gewalt Probleme einhandeln?

Hat er doch geschrieben:

Daniel schrieb:
> //Programm soll eigentlich zwei Threads starten, die etwas ausgeben, zur
> Einfachheit habe ich aber "einfache" Funktionen verwendet

Den Thread-Einstiegsfunktionen kann man ja in der Regel bei 
Thread-Erstellung irgendwas übergebn, aber halt nur per Zeiger auf void.

von Florian (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> [...]

Sehr geehrter Herr Buchegger!

Bitte beachten Sie, daß Sie nur noch elf Postings übrig haben, bevor der 
Postingcounter überläuft und dieses Forum explodiert.

Wählen Sie daher die Themen, zu denen Sie etwas beizutragen wünschen, 
sorgfältig aus und schreiben Sie dann weiterhin exzellente Beiträge.

Mit tiefem Bedauern über Ihr schweres Einzelschicksal verbleibe ich,
Ihr Florian

;-)

von Klaus W. (mfgkw)


Lesenswert?

Wenigstens schreibt zu mind. 99% sinnvolle Sachen, was man nicht von 
jedem Florian behaupten kann, ebensowenig wie vom durchschnittlichen 
Gast.

PS: ich finde manchmal auch, daß er zuviel schreibt - aber nicht, weil 
es mich stören würde, sondern weil er manchmal den Leuten noch etwas 
hinterherträgt, wo ich schon Hopfen und Malz verloren sehe.

von MWS (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> PS: ich finde manchmal auch, daß er zuviel schreibt - aber nicht, weil
> es mich stören würde, sondern weil er manchmal den Leuten noch etwas
> hinterherträgt, wo ich schon Hopfen und Malz verloren sehe.

Jeder Leser kann daraus lernen kann, selbst wenn's gerade der TE nicht 
ist, und das dürfte auch sein Motiv sein.

von Klaus W. (mfgkw)


Lesenswert?

Ja (und ich finde es auch wirklich ehrenwert!), aber ein Großteil davon 
steht in jedem besseren C-Buch und könnte mit wenig Mühe von jedem auch 
dort gelesen werden (oder hier im Forum, weil sich das Meiste ja auch 
hier schon mehrfach wiederholt).
Dann tut es mir schon manchmal weh, wenn man für die Suchfaulen alles 
zum Hundertsten Mal mit viel Aufewand erklärt. Schließlich steckt da ja 
acuh einige Zeit drin.

Mein Unbehagen geht also nicht gegen nicht gegen KHB, sondern gegen die 
grassierende Dumpfheit vieler anderer.

von Udo S. (urschmitt)


Lesenswert?

Der kleine Florian,
hat selbst wahrscheinlich schon dutzend mal von Karl-Heinz profitiert 
und weil es ihm peinlich ist selbst nichts beitragen zu können versucht 
er sich mal als feiger Heckenschütze.
Na ja wenns für mehr nicht reicht...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Udo Schmitt schrieb:
> Der kleine Florian,

Hat einen dicken Smiley hinter sein Posting gesetzt.  Genügt der denn
nicht?

Wer sich Karl-Heinz' Postingzahl mal ansieht, weiß dann auch, was
er da scherzhaft andeuten will: falls die Postingzahl dummerweise
ein int16_t ist, dann wird sie in wenigen Postings negativ werden. :)

von Klaus W. (mfgkw)


Lesenswert?

Tja, aber dann kann man einen Artikel schreiben, warum eine unsigned 
sinnvoller für eine Anzahl ist als eine signed :-)

von Udo S. (urschmitt)


Lesenswert?

Jörg Wunsch schrieb:
> Hat einen dicken Smiley hinter sein Posting gesetzt.  Genügt der denn
> nicht?

Hallo Jörg,
Sorry, aber ich habe das trotz Smiley anders verstanden, speziell der 
letzte Satz. Zumal Florian vorher nicht in Erscheinung getreten ist und 
anonym gepostet hat. Im Zweifel lösche einfach meinen Beitrag, trägt eh 
nichts zur Diskussion bei.
Gruß, Udo

von MWS (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Dann tut es mir schon manchmal weh, wenn man für die Suchfaulen alles
> zum Hundertsten Mal mit viel Aufewand erklärt. Schließlich steckt da ja
> acuh einige Zeit drin.
>
> Mein Unbehagen geht also nicht gegen nicht gegen KHB, sondern gegen die
> grassierende Dumpfheit vieler anderer.

Wenn bekannt ist, wo 'ne Antwort kommt, dann ist's einfacher zu fragen 
als zu suchen. Was sich schwierig gestaltet ist oft das "Richtige" im 
Sinne von "korrekt" zu finden.

Die Natur eines Forums ist, dass jeder beiträgt. Aus der Masse der 
falschen Beiträge dann die Richtigen zu filtern, müsste man bereits 
wissen was richtig ist. Ein Henne-Ei Paradoxon.

Wenn Karl Heinz in dieser Ausführlichkeit schreibt, obwohl er das 
Geschäft ja nun lang genug kennt, dann kannst Du davon ausgehen, dass 
dies sein Bedürfnis und kein Versehen ist.

von Klaus W. (mfgkw)


Lesenswert?

ICH HABE DOCH GAR NICHTS GEGEN IHN! :-)

von MWS (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> ICH HABE DOCH GAR NICHTS GEGEN IHN! :-)

Ja, hab' ich verstanden.

von Karl H. (kbuchegg)


Lesenswert?

MWS schrieb:

> Wenn Karl Heinz in dieser Ausführlichkeit schreibt, obwohl er das
> Geschäft ja nun lang genug kennt, dann kannst Du davon ausgehen, dass
> dies sein Bedürfnis und kein Versehen ist.

Die Sache ist oft auch die.
Ich hab mir im Lauf der Jahre ein paar Gedankenmodelle zurecht gelegt, 
die ich so in keiner Literatur gefunden habe. Durch Versuch und Irrtum 
hab ich rausgefunden, dass diese Modelle auch anderen helfen gewisse 
Sachverhalte zu verstehen (zb meine 'berühmten' Zeichnungen sobald es um 
Pointer und dynamische Strukturen geht). Oft sind es auch einfach nur 
'Faustregeln' die überraschend gut funktionieren.

Denke ich so an meine Anfänge zurück, dann war ich oft froh, wenn ich 
denselben Sachverhalt von 2.ter oder 3.ter Seite nochmal in seinen 
eigenen Worten gehört habe. Hand aufs Herz, wer war noch nie in der 
Situation, dass er sich in der Literatur ein Kapitel durchgelesen hat 
und sich dann als aller erstes gefragt hat: Hä, was will mir der Autor 
sagen?
Und dann liest du dasselbe bei einem anderen Autor und plötzlich fangen 
die Einzelteile an, wie Puzzlestücke ineinanderzufallen. Geht man dann 
zurück zum ersten Autor, stellt man plötzlich fest: Ja klar, jetzt macht 
alles Sinn; jetzt versteh ich plötzlich wovon der redet und warum er 
manchmal auf einem Detail rumreitet, das ich vorher nicht verstanden 
habe. Es war nur ein klitzekleines Puzzelstück, eine Formulierung, die 
den Stein ins Rollen gebracht hat.

> falls die Postingzahl dummerweise ein int16_t ist, dann wird
> sie in wenigen Postings negativ werden. :)

Ooops. Schon so viele :-)

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Denke ich so an meine Anfänge zurück, dann war ich oft froh, wenn ich
> denselben Sachverhalt von 2.ter oder 3.ter Seite nochmal in seinen
> eigenen Worten gehört habe. Hand aufs Herz, wer war noch nie in der
> Situation, dass er sich in der Literatur ein Kapitel durchgelesen hat
> und sich dann als aller erstes gefragt hat: Hä, was will mir der Autor
> sagen?
> Und dann liest du dasselbe bei einem anderen Autor und plötzlich fangen
> die Einzelteile an, wie Puzzlestücke ineinanderzufallen. Geht man dann
> zurück zum ersten Autor, stellt man plötzlich fest: Ja klar, jetzt macht
> alles Sinn; jetzt versteh ich plötzlich wovon der redet und warum er
> manchmal auf einem Detail rumreitet, das ich vorher nicht verstanden
> habe. Es war nur ein klitzekleines Puzzelstück, eine Formulierung, die
> den Stein ins Rollen gebracht hat.

Jepp.

Man merkt dann eigentlich auch ob der Autor das Thema verstanden
oder nur "übernommen" hat. Es ist nicht einfach, einen Sachverhalt
anschaulich und gleichzeitig sachlich korrekt darzustellen.

Da gibt es Schwarten ... ;)

von Florian (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Udo Schmitt schrieb:
>> Der kleine Florian,
>
> Hat einen dicken Smiley hinter sein Posting gesetzt.  Genügt der denn
> nicht?
>
> Wer sich Karl-Heinz' Postingzahl mal ansieht, weiß dann auch, was
> er da scherzhaft andeuten will: falls die Postingzahl dummerweise
> ein int16_t ist, dann wird sie in wenigen Postings negativ werden. :)

So wars gemeint.

Und falls es nicht klar rüberkam: ich habe allergrößten Respekt vor 
Karl-Heinz.

Leider sieht man hier aber auch wieder schön das Beißverhalten der 
Alteingesessenen. Und ebenso sieht man, daß wir bösen Pseudonymnutzer 
eher nicht diejenigen sind, die den Umgangston im Forum vermiesen.

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.