problem mit error(int,...)

Post Reply
Message
Author
dwax
Posts: 65
Joined: 14. Jun 2001 15:30

problem mit error(int,...)

#1 Post by dwax »

hallo,

wollte eine generelle fehlerbehandlung für ein kleines programm schreiben:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
void error(int need_to_exit, ... ){
va_list ap;
va_start(ap,need_to_exit);

for(;;){
char *next_msg = va_arg(ap,char *);
if(next_msg)
cerr << next_msg;
else
break;
}

va_end(ap);

cerr << endl;

if(need_to_exit)
exit(need_to_exit);
}
</font><hr></pre></blockquote>

beim folgende aufruf error(1,"Usage: ",argv[0]," <start_file>");
kommt aber leider nicht "Usage: prog <start_file>" sondern
Usage: ./bla <start_file>ZY‡$¸üÿ¿AU
@ŒO@Pè¡ùÿÿ‹$ÃU‰åƒì
WVSèîÿÿÿÃ&Segmentation fault

müßte nicht nach dem letzten parameter char *next_msg = va_arg(ap,char *) == 0 sein und dann bei
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
void error(int need_to_exit, ... ){
va_list ap;
va_start(ap,need_to_exit);

for(;;){
char *next_msg = va_arg(ap,char *);
if(next_msg)
cerr << next_msg;
else
break;
}

va_end(ap);

cerr << endl;

if(need_to_exit)
exit(need_to_exit);
}
</font><hr></pre></blockquote>
der else zweig ausgeführt werden, der die schleife beendet?

greets Dirk

dwax
Posts: 65
Joined: 14. Jun 2001 15:30

Re: problem mit error(int,...)

#2 Post by dwax »

habs!

wenn der aufruf so aussieht
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
error(0,"a","b",NULL);
</font><hr></pre></blockquote>
gehts <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

greets Dirk

Krümelkacker

Re: problem mit error(int,...)

#3 Post by Krümelkacker »

...
if(next_msg)
...

Unsauberes C! NULL ist nicht auf allen Systemen 0!!!
(Anderwo heißt es deshalb auch besser NIL.)

Jochen

Re: problem mit error(int,...)

#4 Post by Jochen »

*bzzzzzt* Wrong! <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Siehe C-FAQ, Punkt 5.3 (leider nur auf Englisch): <a href="http://www.eskimo.com/~scs/C-faq/q5.3.html" target="_blank"><!--auto-->http://www.eskimo.com/~scs/C-faq/q5.3.h ... <!--auto-->

Kurz auf deutsch zusammengefasst:

"if (p)" ist nur eine Kurzschreibweise für "if (p != 0)". Aus dem Vergleichskontext erkennt der Compiler einwandfrei, dass der Vergleich mit dem Null-Pointer geschieht. Egal, wie die Architektur aussieht: 0 an einen Pointer zugewiesen (oder damit verglichen) ist immer der NULL-Pointer, auch wenn die interne Repräsentation ungleich "alle Bits gleich 0" ist!

Ob das nun guter Stil oder schlechter Stil ist, steht allerdings zur Debatte frei.

Jochen

Krümelkacker

Re: problem mit error(int,...)

#5 Post by Krümelkacker »

Ist halt nicht ganz sauber, das C. Wie bekomme ich nun einen Pointer auf die Adresse 0 hin?
etwa
P = 1;
--P;
???

dwax
Posts: 65
Joined: 14. Jun 2001 15:30

Re: problem mit error(int,...)

#6 Post by dwax »

if(next_msg) ist auf jedem system gleich if(next_msg != 0).
ein pointer auf 0 (0x0) ist auf jedem (mir bekannten) system gleich NULL/NIL/null oder wie es auch immer heißt ...

über den stil läßt sich aber streiten <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

BTW P=1;P--; ergibt P==0, nicht &P == 0!

greets Dirk

IchBins

Re: problem mit error(int,...)

#7 Post by IchBins »

> beim folgende aufruf error(1,"Usage:
> ",argv[0]," <start_file>");
> kommt aber leider nicht "Usage: prog
> <start_file>" sondern
> Usage: ./bla <start_file>ZY‡$¸üÿ¿AU
> @ŒO@Pè¡ùÿÿ?????????‹$ÃU‰åƒì
> WVSèîÿÿÿ?Ã&?Segmentation fault

Um mal auf das ursprüngliche Problem zurück zu kommen: Ich vermute, die Ursache für den SegFault ist dieses argv[0] in error(). Was ist in dem Dingens denn drin, wenn das Programm ohne Parameter aufgerufen wird? <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

dwax
Posts: 65
Joined: 14. Jun 2001 15:30

Re: problem mit error(int,...)

#8 Post by dwax »

argv[0] ist der name des programms, zb ./prog oder /home/otto/prog, jenachdem, wie du es aufrufst ...

hab aber in der glibc doku die antwort gefunden, siehe post vom 25 jan.
ich war nur halt immer der meinung, dass va_args NULL liefern würde, wenn alle parameter übergeben sind.

greets Dirk

Post Reply