Forum: PC-Programmierung Zeiger auf Struct (bei Funktionsübergabe)


von Mark M. (mom-jovi)


Lesenswert?

Hallo,
kann man keine Zeiger auf Strukturen an Funktionen übergeben?
Ich möchte ein einfaches Vokabelprogramm schreiben und bekomme den 
Fehler im Kommentar:
1
struct vokabel
2
{
3
    char* hauptsprache[512];
4
    char* wort[512];
5
    char* fremdsprache[512];
6
    char* bed_1[512]; // Übersetzung(en)
7
    char* bed_2[512];
8
    char* bed_3[512];
9
    char* bed_4[512];
10
    char* bed_5[512];
11
};
12
13
void vokabel_eingabe(struct vokabel *neu_)
14
{
15
    strcpy(*neu_.wort,wort_einlesen(0));  // Fehler: Requesting member in something not a structure or a union
16
                     // wort_einlesen gibt einen char* aus
17
}
18
19
// --- jetzt kommt mein Funktionsaufruf:
20
21
void neue_vokabel()
22
{
23
    struct vokabel neu;
24
    vokabel_eingabe(&neu);
25
}

Wie verhält sich das ganze mit verschachtelten Strukturen? Ich hatte 
zuerst vor, die Bedeutungen als ein Array aus mehreren solchen 
Strukturen anzulegen. Das würde die Indizierung vereinfachen:
1
struct bedeutung
2
{
3
   char* bed;
4
};
5
6
// und dann: 
7
8
struct vokabel
9
{
10
    char* hauptsprache[512];
11
    char* wort[512];
12
    char* fremdsprache[512];
13
    struct bedeutung bed_[5]; // Übersetzung(en)
14
};

Geht das auch?

von Peter (Gast)


Lesenswert?

*neu_.wort   ->       neu_->wort

von 230V (Gast)


Lesenswert?

>char* hauptsprache[512];
Willst du wirklich ein Array aus 512 Pointern auf char? Lass die 
Sterne am Himmel, in deiner Struktur sind sie falsch.

>strcpy(*neu_.wort,wort_einlesen(0));
Tu da mal ein paar Klammern hin: (*neu_).wort, oder wie vorgeschlagen 
neu_->wort (andere Schreibweise, gleicher Effekt).

>// wort_einlesen gibt einen char* aus
Ich ahne Schlimmes, Code dieser Funktion?

von Klaus W. (mfgkw)


Lesenswert?

Mark M. schrieb:
> Geht das auch?

Ja, klar.

z.B. neu_->bed_...

---

Aber bist du sicher, daß du jeweils Felder von char-Zeigern haben
willst?

von Karl H. (kbuchegg)


Lesenswert?

Und bist du sicher, dass du wirklich bei jedem Wort den Namen der 
Hochsprache (ich nehme an das sollte eigentlich Quellsprache heißen) und 
den Namen der Fremdsprache (ich gehe davon aus, dass das die Zielsprache 
der Übersetzung sein soll) haben willst?

Bei 10000 Vokablen geht das ganz schon in den Speicher. Vor allen 
Dingen, weil man normalerweise ja nicht mehr als 2 oder 3 verschiedene 
Sprachen haben wird.

Eine Zahl für eine Sprache würde es doch auch tun. Zusammen mit einem 
weiteren Array, in dem man diese Zahl dann als Index nehmen kann und den 
Namen der Sprache im Klartext heraus bekommt.

Sofern man zum Vokabeln lernen überhaupt die Namen der Sprachen wissen 
muss. Eine Markierung für 'Hinübersetzung' und eine für 
'Rückübersetzung' oder überhaupt gleich 2 getrennte Tabellen für Hin und 
Zurück würde es auch tun.

von Karl H. (kbuchegg)


Lesenswert?

230V schrieb:

>>// wort_einlesen gibt einen char* aus
> Ich ahne Schlimmes, Code dieser Funktion?


Nicht nur du.


Ich ahne auch, dass hier wieder mal ohne C-Buch und lernen der 
Grundlagen operiert wird.

von Mark M. (mom-jovi)


Lesenswert?

230V schrieb:
>>char* hauptsprache[512];
> Willst du wirklich ein Array aus 512 Pointern auf char? Lass die
> Sterne am Himmel, in deiner Struktur sind sie falsch.

So deklariert man doch einen String, oder nicht? Oder lese ich aus euern 
Antworten richtig, dass es auch ohne Zeiger geht?
Ist dann nach
1
char wort[10];
wort ein Zeiger auf das erste Stringelement, oder einfach ein char?

Ja das mit Quell- und Fremdsprache muss ich anders lösen, hab ich mir 
auch schon überlegt.

Karl heinz Buchegger schrieb:
> 230 V schrieb:
>>>// wort_einlesen gibt einen char* aus
>> Ich ahne Schlimmes, Code dieser Funktion?
>
> Nicht nur du.

So sieht sie aus, meine Funktion (ich geh schon mal in Deckung):
1
char* wort_einlesen()
2
{
3
        char* wort[512];
4
        fgets(wort,sizeof(wort),stdin);
5
        fflush(stdin);
6
        //wort[strlen(wort)-1]='\0'; // Zeilenumbruch entfernen, der durch fgets entsteht
7
        return wort;
8
}

von Klaus W. (mfgkw)


Lesenswert?

Mark M. schrieb:
> 230V schrieb:
>>>char* hauptsprache[512];
>> Willst du wirklich ein Array aus 512 Pointern auf char? Lass die
>> Sterne am Himmel, in deiner Struktur sind sie falsch.
>
> So deklariert man doch einen String, oder nicht?

Nein.
Hast du schon mal in ein C-Buch reingesehen? Das würde vieles 
vereinfachen.

> Ist dann nachchar wort[10];wort ein Zeiger auf das erste
> Stringelement, oder einfach ein char?

wort ist erstmal ein Feld von 10 char (das kann ein C-String sein,
muß aber nicht zwingend).

Wird wort in einem Ausdruck verwendet, dann ist es ein konstanter
Zeiger auf wort[0].
wort[0] ist ein char, wort[1] ebenso etc..

von Klaus W. (mfgkw)


Lesenswert?

Mark M. schrieb:
> So sieht sie aus, meine Funktion (ich geh schon mal in Deckung):char* 
wort_einlesen()
> {
>         char* wort[512];
>         fgets(wort,sizeof(wort),stdin);
>         fflush(stdin);
>         //wort[strlen(wort)-1]='\0'; // Zeilenumbruch entfernen, der durch fgets 
entsteht
>         return wort;
> }

Tu dir doch selbst einen Gefallen und lerne erstmal C.
Hier gibst du einen Zeiger auf ein lokales Feld zurück - klassischer
Fehler.
Nebenbei würde dir der gcc zumindest mit -Wall hier eine Warnung
ausgeben, und zwar zu Recht. Hast du die ignoriert?

Abgesehen davon, daß dein vermeintlicher String wieder keiner ist.

von Mark M. (mom-jovi)


Lesenswert?

Klaus Wachtler schrieb:
> Nein.
> Hast du schon mal in ein C-Buch reingesehen? Das würde vieles
> vereinfachen.

Schön, dass ich hier HILFE finde :)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dennoch:

Dringender Literaturhinweis (und vielleicht noch ein Tip für ein 
Last-Minute-Weihnachtsgeschenk):

Brian Kernighan & Dennis Ritchie: "Programmieren in C", 2. Auflage, 
Hanser-Verlag.

Das Buch sollte man haben. Nicht nur ausleihen, mal drin rumblättern, 
sondern haben. Und lesen. Und nochmal lesen. Und wieder ...

von 230V (Gast)


Lesenswert?

Mark M. schrieb:
> Klaus Wachtler schrieb:
>> Nein.
>> Hast du schon mal in ein C-Buch reingesehen? Das würde vieles
>> vereinfachen.
>
> Schön, dass ich hier HILFE finde :)

Wenn ich sowas lese platzt mir der Kragen!

@Mark M.:
Diese Forum dient dazu Hilfestellung bei speziellen Problemen zu geben 
wenn man selber nicht weiter kommt. ES IST NICHT DAZU DA DIR DIE 
GRUNDLAGEN ZU ERKLÄREN. Dazu gibt es Bücher und sicherlich auch einige 
gute Tutorials.

@Rufus T. Firefly
Bei Amazon findet sich folgende Kritik, kannst du bestätigen dass das in 
der *2. Auflage* der Fall ist?

>Es handelt sich im Original sicher um ein Referenzhandbuch für die C
>Programmierung, leider erinnert die Übersetzung eher an eine
>Gebrauchsanleitung, die vom Japanischen ins Englische und dann in
>Deutsche übersetzt wurde. Es ist einfach verständlicher und klingt
>gefälliger, wenn die allgemein gebräuchlichen Fachwörter nicht "künstlich
>eingedeutscht" sondern beibehalten werden. --->Ein Compiler ist ein
>"Compiler" und nicht ein "Übersetzer", und "linken" ist gebräuchlicher
>als "montieren".<--- Entwder hatte der Übersetzer des Buches von der
>Materie keine Ahnung oder er wollte jedes Wort gnadenlos eindeutschen,
>was nicht zur Verständlichkeit des Buches beiträgt.

von Klaus W. (mfgkw)


Lesenswert?

Mark M. schrieb:
> Schön, dass ich hier HILFE finde :)

Was soll so ein Forum deiner Erwartung nach leisten?
Jedem, der mit 0 Ahnung anfängt, alles vorlesen, was in Tausend
Büchern steht, nur damit noch der Faulste ohne Lesen auskommt?

Oder vielleicht nicht doch eher das Wissen vermitteln, das man
eben nicht mit einfachem Nachschlagen selber findet?

Wenn du dich schon darüber mokierst, daß man dich für
elementarste Grundlagen auf Bücher oder Tutorials verweist,
bekomme ich langsam einen ziemlich dicken Hals.
Mach deine Hausaufgaben selber oder auch nicht, ist mir egal.

Das hier ist kein Platz, wo man ohne Denken alles Wissen der
Welt irgendwo reingeschoben bekommt.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

230V schrieb:
> @Rufus T. Firefly
> Bei Amazon findet sich folgende Kritik, kannst du bestätigen dass das in
> der *2. Auflage* der Fall ist?

Die erste Auflage (die irgendwann noch in den 80ern erschien) war 
grauenerregend übersetzt, mit konsequenter Auseinander schreibung, von 
z.B. Zeiger Variablen, und Codebeispiele wurden in einer 
Proportionalschrift abgedruckt, was sehr ungünstig zu lesen ist.

Die zweite ist durchaus lesbar, deswegen beziehe ich mich ja auch auf 
die.

Es ist zwar schon ein paar Jährchen her, daß ich das letzte Mal in 
meinen K&R 'reingesehen habe (habe ihn seit Anfang der 90er Jahre), 
gewiss sind dort ein paar etwas schwerfällig wirkende Formulierungen 
nicht auszuschließen - so ist z.B. Übersetzer ein in der 
deutschsprachigen Informatik durchaus gebräuchlicher Begriff für 
"Compiler".

Die Kritik klingt mir ein bisschen nach "wenn mir inhaltlich nichts 
anderes einfällt, dann ziehe ich mich an ein paar Begriffen hoch".

Klar, das Buch ist 20 Jahre alt (es beschreibt C-89/"ANSI-C"), und eine 
dritte Auflage, die C99 beschreibt, wird sehnsüchtig vermisst, aber es 
ist trotzdem eine lesens- und habenswerte Grundlage.

An den Grundlagen von C hat sich nichts verändert, es sind nur ein paar 
recht harmlose Erweiterungen mit C99 hinzugekommen, die aber bei weitem 
nicht jeder Compiler kennt. Der C-Compiler in Microsofts ansonsten 
exzellentem Visual C++ kennt nach wie vor kein C99.

O-Ton: "Now, the Visual C++ compiler team receives the occasionally 
question as to why we haven’t implemented C99.  It’s really based on 
interest from our users.  Where we’ve received many requests for certain 
C99 features, we’ve tried to implement them (or analogues)."

von Mark M. (mom-jovi)


Lesenswert?

Frohe Weihnachten :)

von 230V (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Es ist zwar schon ein paar Jährchen her, daß ich das letzte Mal in
> meinen K&R 'reingesehen habe (habe ihn seit Anfang der 90er Jahre),
> gewiss sind dort ein paar etwas schwerfällig wirkende Formulierungen
> nicht auszuschließen - so ist z.B. Übersetzer ein in der
> deutschsprachigen Informatik durchaus gebräuchlicher Begriff für
> "Compiler".
Urghh... Auf "Übersetzer" reagiere ich allergisch, das heisst Compiler 
und Punkt. **schmoll**

> Die Kritik klingt mir ein bisschen nach "wenn mir inhaltlich nichts
> anderes einfällt, dann ziehe ich mich an ein paar Begriffen hoch".
Gut möglich, ich kenne das Buch (noch?) nicht. Mal nebenbei bemerkt, der 
Preis ist für ein 20 Jahre altes Buch ganz schön happig wie ich finde.

Danke für die Auskunft.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

230V schrieb:
> Mal nebenbei bemerkt, der Preis ist für ein 20 Jahre altes
> Buch ganz schön happig wie ich finde.

Dann kauf's Dir halt gebraucht.

von Rolf M. (rmagnus)


Lesenswert?

Rufus Τ. Firefly schrieb:
> O-Ton: "Now, the Visual C++ compiler team receives the occasionally
> question as to why we haven’t implemented C99.  It’s really based on
> interest from our users.  Where we’ve received many requests for certain
> C99 features, we’ve tried to implement them (or analogues)."

Schön formuliert für: "Wenn genug Leute explizit nach einem bestimmten 
Feature fragen, murksen wir das irgendwie rein, aber abgesehen davon 
sind uns ISO-Normen ziemlich egal".

230V schrieb:
> Rufus Τ. Firefly schrieb:
>> Es ist zwar schon ein paar Jährchen her, daß ich das letzte Mal in
>> meinen K&R 'reingesehen habe (habe ihn seit Anfang der 90er Jahre),
>> gewiss sind dort ein paar etwas schwerfällig wirkende Formulierungen
>> nicht auszuschließen - so ist z.B. Übersetzer ein in der
>> deutschsprachigen Informatik durchaus gebräuchlicher Begriff für
>> "Compiler".
> Urghh... Auf "Übersetzer" reagiere ich allergisch, das heisst Compiler
> und Punkt. **schmoll**

Ich habe "Übersetzer" auch ehrlich gesagt im normalen Sprachgebrauch, 
also z.B. bei Diskussionen mit Kollegen, noch nie als Ersatz für 
"Compiler" gehört. Der Übersetzer ist da eher die Person, die die 
Programmausgaben z.B. von englisch nach deutsch übersetzt.
Das einzige, wo mir "Übersetzer" für den Compiler je begegnet ist, sind 
eben solche Bücher, bei denen zwanghaft jeder Begriff eingedeutscht 
werden mußte. Deshalb kaufe ich schon seit 15 Jahren kein 
deutschsprachiges Computer-Buch mehr.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Rolf Magnus schrieb:
> Deshalb kaufe ich schon seit 15 Jahren kein
> deutschsprachiges Computer-Buch mehr.

Mach ich ja auch nicht, wie ich schon schrieb, ist mein K&R knapp 20.

Ich empfehle das Buch dennoch, weil es schlicht und einfach die 
Referenz zu C ist und alles relevante brauchbar darin erklärt ist.

Immerhin ist die Übersetzung nicht so grauenhaft, daß sie den Begriff 
"Kellerzeiger" verwendet, und es wird im Gegensatz zur ersten Ausgabe 
auch nicht alles zwanghaft und möglichst schwerfällig eingedeutscht.

von 230V (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> 230V schrieb:
>> Mal nebenbei bemerkt, der Preis ist für ein 20 Jahre altes
>> Buch ganz schön happig wie ich finde.
>
> Dann kauf's Dir halt gebraucht.

Das ist durchaus eine Überlegung wert...

Rufus Τ. Firefly schrieb:
> "Kellerzeiger"
ist gut! :-) (Was soll das sein, Stackpointer?)

von Rolf M. (rmagnus)


Lesenswert?

Ja. Der Stack wird auf Deusch manchmal als "Kellerspeicher" bezeichet. 
Ich frage mich da immer, ob tatsächlich jeder seinen Keller so 
vollstapelt, daß er sein Gerümpel nur in umgekherter Reihenfolge wieder 
rauskriegt.
Als ich noch zur Schule ging, nannte es mein Computertechnik-Leher den 
"Pfannkuchenspeicher", weil man eben bei einem Stapel Pfannkuchen auf 
dem Teller diese auch nur in umgekehrter Reihenfolger ihrer Produktion 
essen kann. Das klingt zwar etwas salopper, daür paßt es aber 
wenigstens.

von 230V (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Ich frage mich da immer, ob tatsächlich jeder seinen Keller so
> vollstapelt, daß er sein Gerümpel nur in umgekherter Reihenfolge wieder
> rauskriegt.
:-)

Pfannkuchenzeiger, es wird immer besser! Hm, und wenn der Stapel zu 
hoch ist und umfällt, spricht man dann von Stackoverflow?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nein, der Overflow hat mit der auf den Pfannkuchenstapel gegossenen 
Sirupmenge zu tun.

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.