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
problem mit error(int,...)
Re: problem mit error(int,...)
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
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
Re: problem mit error(int,...)
...
if(next_msg)
...
Unsauberes C! NULL ist nicht auf allen Systemen 0!!!
(Anderwo heißt es deshalb auch besser NIL.)
if(next_msg)
...
Unsauberes C! NULL ist nicht auf allen Systemen 0!!!
(Anderwo heißt es deshalb auch besser NIL.)
Re: problem mit error(int,...)
*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
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
Re: problem mit error(int,...)
Ist halt nicht ganz sauber, das C. Wie bekomme ich nun einen Pointer auf die Adresse 0 hin?
etwa
P = 1;
--P;
???
etwa
P = 1;
--P;
???
Re: problem mit error(int,...)
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
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
Re: problem mit error(int,...)
> 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">
> ",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">
Re: problem mit error(int,...)
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
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