"We are back" « oc.at

[C] return - zeiger

lama007 08.02.2009 - 19:31 6764 52 Thread rating
Posts

semteX

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14699
ich würd das buch nehmen und verbrennen...

das mit MAX-1 war mein fehler, die fputs funktion macht das eh für dich..

das ganze konstrukt kann doch nur funktioniern, wenn zwischendurch am stack ned herumgeschrieben wird... und das ist, gelinde gesagt, einfach wahnsinn.

entweder bin ich komplett daneben oder das buch ist mist..
Bearbeitet von semteX am 09.02.2009, 19:50

DirtyHarry

aka robobimbo
Avatar
Registered: Apr 2001
Location: outer space
Posts: 464
Wenn das Beispiel so 1 : 1 aus dem Buch ist, schmeiss das Buch weg - bin da mit semteX einer Meinung

Timmää

Big d00d
Avatar
Registered: Nov 2007
Location: linz
Posts: 222
@lama: bist sicher dass das nicht ein negativbeispiel ist?
Bearbeitet von Timmää am 09.02.2009, 20:46

lama007

OC Addicted
Avatar
Registered: Mar 2002
Location: Austria
Posts: 851
guter Rat - das Buch werde ich wegschmeißen und es mit der 2. Auflage versuchen; dort sieht das Kapitel anders aus.

that

Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11342
Zitat von semteX
return( 0 );

Dein Code ist zwar prinzipiell korrekt, aber return ist keine Funktion, deshalb kannst du dir die Klammern sparen und einfach return 0; schreiben.

DirtyHarry

aka robobimbo
Avatar
Registered: Apr 2001
Location: outer space
Posts: 464
So kriegst das Beispiel aus dem komischen Buch ohne Warnings gecodet:
Code:
#include <stdio.h>
#include <string.h>
#define MAX 255

int eingabe(char* output, char* input) {
	printf("Bitte \"%s\" eingeben: ", output);
	if (fgets(input, MAX, stdin) == NULL) return -1;  // FEHLER
	return 0; // KEIN FEHLER		
}

int main() {
	char text[MAX];
	int result = 0;
	result = eingabe("Vorname", text);
	printf("Hallo %s\n", text);
	result = eingabe("Nachnamename", text);
	printf("%s, interessanter Nachname\n", text);	
	return 0;
}

lama007

OC Addicted
Avatar
Registered: Mar 2002
Location: Austria
Posts: 851
Zitat von Timmää
@lama: bist sicher dass das nicht ein negativbeispiel ist?

Zitat
Oder sind Sie gar nicht daran interessiert, das Newline-Zeichen zu entfernen? Dann könnte die Funktion auch so aussehen:

char *eingabe(char *str)
{
char input[MAX];
char *ptr=input;
printf("Bitte \"%s\" eingeben: ",str);
fgets(input, MAX, stdin);

return ptr;
}

"C von A bis Z", Kapitel 15.6.1 "Zeiger als Rückgabewert" - erste Ausgabe

lama007

OC Addicted
Avatar
Registered: Mar 2002
Location: Austria
Posts: 851
Code:
char *string = "Hallo Welt";
printf("Anfangsadresse auf die *string zeigt = %p\n",*string);

Wenn das so nicht stimmt, dann ist auch die zweite Auflage nicht ohne Fehler.

Kann mir jemand bestätigen, dass es nicht
Zitat
...%p\n", *string);
sondern
Zitat
...%p\n", string);
heißen sollte?

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
müssts nicht &string sein, wenn du die adresse ausgeben willst?

Bowser

Addicted
Avatar
Registered: Aug 2004
Location: Austria, 1050
Posts: 492
Ja, es sollte nur string heißen. Ein C String ist ja ein einfacher Array aus chars und wenn man einen Arraynamen angibt bekommt man den Pointer auf das erste Element zurück. Also gibt *string den ersten Buchstaben aus der bei deiner Ausgabe irgendwie in eine Adresse umgewandelt wird...

that

Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11342
Zitat von lama007
Code:
char *string = "Hallo Welt";
printf("Anfangsadresse auf die *string zeigt = %p\n",*string);

Wenn das so nicht stimmt, dann ist auch die zweite Auflage nicht ohne Fehler.

"My hovercraft is full of eels" fällt mir dazu ein. :p

*string zeigt gar nirgends hin, weil das ist ein char:

char x; // x ist ein char
char *y; // *y ist ein char, auf welches y zeigt

Also sollte klar sein, dass "string" die Adresse des Zeichens 'H' ist (was hier gleichbedeutend ist mit dem Anfang des Strings "Hallo Welt"), "*string" das erste Zeichen selbst (und daher vom Typ char), und "&string" ist die Adresse des Zeigers, also vom Typ char**.

semteX

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14699
Zitat von that
Dein Code ist zwar prinzipiell korrekt, aber return ist keine Funktion, deshalb kannst du dir die Klammern sparen und einfach return 0; schreiben.
ich wusste ja, dass da noch was schief aussieht ;)

wie gesagt, ich würd eher das buch wechseln. es gibt zum thema c / c++ echt ein paar ausgezeichnete bücher...

DirtyHarry

aka robobimbo
Avatar
Registered: Apr 2001
Location: outer space
Posts: 464
ist es das buch?

http://www.amazon.de/von-bis-umfass...0360&sr=8-1

Dann hat die Rezessionen wohl der Autor selbst geschrieben :D

Neo-=IuE=-

Here to stay
Registered: Jun 2002
Location: Berndorf, NÖ
Posts: 3232
Zitat von lama007
"gcc --version" gibt bei mir das aus:
"gcc (SUSE Linux) 4.3.2 [gcc-4_3-branch revision 141291]"
...

mit welchen optionen kompilierst du? also wie rufst du es auf?

weil vielleicht bekommst du deshalb nicht die warnings die du kriegen solltest ;)

DirtyHarry

aka robobimbo
Avatar
Registered: Apr 2001
Location: outer space
Posts: 464
am besten mit den optionen

-Wall -pedantic -ansi

:)

[edit] Aber im Prinzip tuts -Wall auch :)
Bearbeitet von DirtyHarry am 10.02.2009, 10:15
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz