PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Peinliche Fragen zu einem C- Codefragment


Dr.Doom
2003-09-15, 17:26:52
Bin beim C-Programmieren irgendwie sowas von aus der Übung, dass ich so einen peinlichen Thread öffnen muss :schäm: (blödes Java *g*)

Siehe angehängtes Bild.

In der fscanf-Funktion steht 'person-geschlecht' mit einem vorangestellten &.
Warum?
Warum haben 'person.name 'und 'person.vorname' nicht auch ein &?

In der fprintf-Funktion steht nirgendwo ein & vor einer Variablen. Warum?


Mögliche Erklärungen, die mir mal ausgedacht habe ;) :

Hat das alles etwas mit Call-by-Value und Call-by-Reference zu tun?

fprintf bekommt nur Werte, die ausgegeben werden sollen. Call-by-Reference ist nicht nötig, da nichts an den Variablen geändert werden soll.

Die fscanf-Funktion soll etwas in ausserhalb der Funktion deklarierte Variablen schreiben, daher bekommt 'person.geschlecht' ein & spendiert.
'person.name' und 'person.vorname' sind aber Arrays (char name[15]) und 'zeigen' eh schon auf die Adresse des ersten Elements.

Ja, nein?
Falls Humbug, bitte erklären! Danke.

Naja, ich ducke mich schon mal vor den Schlägen. *g*

zeckensack
2003-09-15, 21:21:25
Jo.
fscanf schreibt in Objekte, braucht also die Zeiger.

person.name und person.vorname sind char-Arrays, können also direkt als Zeiger verwandt werden.
person.geschlecht ist ein einzelnes Char, deswegen das &.

fprintf erwartet für %s ein char-Array (CBR), für %c aber ein char (CBV).
Für die ersten beiden variablen gilt das gleiche wie oben: Hier sind Zeiger gefragt, und da Arrays und Zeiger in C mehr oder weniger austauschbar sind, kann der &-Operator entfallen.
Für person.geschlecht muß direkt der Wert übergeben werden, nicht der Zeiger.

Dr.Doom
2003-09-16, 11:36:10
Danke vielmals! =)

Dr.Doom
2003-09-16, 13:51:53
Ähm *schwitz*

Siehe Bild.

1.
Ist i in der Prozedur überhaupt zugreifbar? Ich denke nicht! Die Zeile sollte wohl j = 3 * a[j]; heissen, oder!?
EDIT: Öhm, selbst das Array a[..] dürfte innerhalb der Prozedur doch unbekannt sein!?
Waaah, ich stehe total auf dem Schlauch :...(

EDIT2:Ja, das ist wirklich peinlich. :/
i und a[] sind globale Variablen und somit auch in der Prozedur zugreifbar. Man möge mich bitte steinigen!

2.
Falls j = 3 * a[j]; korrekt ist, ist das Ergebnis (vgl Tabelle im Bild) doch trotzdem falsch:

Vor dem Prozeduraufruf ist i = 1 und a[i] ist folglich 2, der Prozeduraufruf ist somit test(1,2); .

Innerhalb der Prozedur ist k zunächst gleich 1 und wird dann um 1 inkrementiert. Da die Parameterübergabe per CBV stattfand, wird i nicht manipuliert.

Zu Beginn der Pozedur ist j = 2 (a[1]=2). Durch die Zeile j = 3 * a[j]; wird j auf 6 gesetzt.
Da auch j seinen Wert per CBV erhalten hat, dürfte das Ergebnis flasch sein, da sich eigentlich nichts geändert hat.

Also, nach Abarbeitung des Programms sollte eine Ausgabe wiefolgt lauten:
i = 1
a[0] = 1
a[1] = 2
a[2] = 3

Korrekt?

Gast
2003-09-16, 15:01:11
Jo, richtig.
Die angehängte ergebnisstabelle käme raus, wenn j und k refenzvariablen wären, was sie aber net sind, laut dem bild.

Dr.Doom
2003-09-18, 22:12:57
@gast: jo, danke.

Was ist hier falsch?
feld[i] *= 2;
Kann man bei C diese '*='-Abkürzung nicht benutzen?

'+=' würde funktionieren. ???

zeckensack
2003-09-19, 02:48:42
Original geschrieben von Dr.Doom
@gast: jo, danke.

Was ist hier falsch?
feld[i] *= 2;
Kann man bei C diese '*='-Abkürzung nicht benutzen?

'+=' würde funktionieren. ??? Da ist nichts falsch. Das ist gültiger Code :|

Dr.Doom
2003-09-19, 12:17:37
...
void verdopple(int feld[5]) {
int i;
for(i=4; i> -1; i--) {
feld[ i] *= 2;
}//end loop
}//end proc verdopple
...

g:\pr\c\verdopple.c: line 6: Parse Error, expecting `','' or `SEP'
'{ feld[ i] *= 2'
aborting compile
???

EDIT: Aber feld[ i] = feld[ i] * 2; wird erfolgreich kompiliert. Genauso, wie feld[ i] += 2;. :(

zeckensack
2003-09-19, 12:43:28
Compiler kaputt???
Sorry, ich wiederhole mich, aber das ist wirklich gültiger Code.

Gast
2003-09-19, 13:04:35
ne, der code ist ungültig

zeckensack
2003-09-19, 13:09:35
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccelng/htm/expre_38.asp

Opera-Nutzer müssen für diese Seite kurz auf "Identify as MSIE5.0" umschalten :eyes:

micki
2003-09-19, 13:11:48
es kann sein, dass du mit copy&paste ein falsches zeichen drinne hast, dass zwar wie ein leerzeichen dargestellt wird aber was anderes ist, versuch einfach die leerzeichen wegzumachen in der zeile (und eventuell neue hinzusetzen), dann könnte es gehen...

naja, ich hatte den bug deswegen mal, muss bei dir nicht das selbe sein.

MfG
micki

Dr.Doom
2003-09-19, 14:01:24
Nein, das mit den Leerzeichen kann nicht sein, da ich das Multiplikationszeichen einfach gegen ein + austauschen kann. Das Programm wird dann korrekt übersetzt. Trotzdem danke. ;)

Ich glaube 'z-bag' und der M$ND-Seite einfach mal und werfe den C-Compiler (Miracle C) auf den Müll. Muss ich doch in den Keller latschen und meine 'Borland C'-Disks suchen. :/
Oder kann mir jemand einen anderen (funktionierenden, kostenlosen und downloadbaren) C-Compiler empfehlen? Muss nichts grossartiges sein und nur beim Wiedererlernen der Grundlagen unterstützen.

Gast
2003-09-19, 16:03:36
Einmal GCC http://gcc.gnu.org/

und falls die nicht unbedingt Win32 verwenden willst, hol den Intelcompiler (www.intel.com)
Für Linux gibts den für Privatzwecke kostenlos....

zeckensack
2003-09-19, 16:17:24
GCC gibt's auf für Windows :)
Nennt sich MinGW. Wer in unseren Progger-Sticky schaut, der findet auch eine schicke IDE dazu.

Dr.Doom
2003-09-19, 16:57:42
Aaaah, das ist fein. =)
Ich habe mir mal 'Dev C++ 4' genommen und gleich ausprobiert (der Compiler beanstandet schonmal *= nicht, gut ;) ).

Das Problem ist nur, dass ich vorhandene Ausgaben eines Programms auf die Konsole nicht sehen kann, da ein Fenster nach 'Run&Execute' zwar kurz zu sehen ist, aber gleich wieder geschlossen wird.

zeckensack
2003-09-19, 17:10:00
system("PAUSE");

oder

getch();

Dr.Doom
2003-09-19, 17:31:03
k, so hatte ich's bsiher auch.
ich dachte, man kann's irgendwie einstellen, dass..blah, egal.

danke nochmal!
bis zur nächsten blöden frage ;)