Discussion:
Fehler entdeckt : Finde ihn
(zu alt für eine Antwort)
Helmut Schellong
2018-09-13 14:30:09 UTC
Permalink
Durch eine hinzugefügte Option (256) ist ein Fehler hineingekommen:
===================================================================
#define NL "\r\n"
//...
#define NL "\n"
//...
writeE(1, dir, l+((o&256)?(dirl[0]=0,1):CatS(dirl, NL, NULL)) );
//...
if (!(o&256)) lw+= CatS(dirl+lw, NL, NULL);
else dirl[lw++]=0;
//...
n+= list_l(dir, (o&256)?lw:lw-sizeof(NL)+1, lmax, o);
===================================================================
Neu hier ist eine Ausgabe von '\0' statt Newline.
Wer sieht den Fehler?
--
Mit freundlichen Grüßen
Helmut Schellong ***@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
Thomas Koenig
2018-09-13 17:32:14 UTC
Permalink
Post by Helmut Schellong
writeE(1, dir, l+((o&256)?(dirl[0]=0,1):CatS(dirl, NL, NULL)) );
CatS müsste DogS heißen, damit es funktioniert?

#include <context.h>, bitte.
Helmut Schellong
2018-09-13 18:27:54 UTC
Permalink
Post by Thomas Koenig
Post by Helmut Schellong
writeE(1, dir, l+((o&256)?(dirl[0]=0,1):CatS(dirl, NL, NULL)) );
CatS müsste DogS heißen, damit es funktioniert?
Nein, so etwas ist nicht verkehrt.
Post by Thomas Koenig
#include <context.h>, bitte.
Der Fehler ist in der letzten Zeile und hat etwas mit lw zu tun.
--
Mit freundlichen Grüßen
Helmut Schellong ***@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
Thomas Koenig
2018-09-13 20:30:17 UTC
Permalink
Post by Helmut Schellong
Post by Thomas Koenig
#include <context.h>, bitte.
Der Fehler ist in der letzten Zeile und hat etwas mit lw zu tun.
Es fehlt mal mindestens

- Die Beschreibung, was der Code tun soll

- Die Definition der Makros oder Funktionen, die verwendet werden
Helmut Schellong
2018-09-13 22:38:58 UTC
Permalink
Post by Thomas Koenig
Post by Helmut Schellong
Post by Thomas Koenig
#include <context.h>, bitte.
Der Fehler ist in der letzten Zeile und hat etwas mit lw zu tun.
Es fehlt mal mindestens
- Die Beschreibung, was der Code tun soll
- Die Definition der Makros oder Funktionen, die verwendet werden
Der Fehler ist auch ohne weitere Informationen erkennbar, zumal
ich mitteilte, daß er in der letzten Zeile ist und mit 'lw'
zu tun hat.

Durch eine hinzugefügte Option (256) ist ein Fehler hineingekommen:
===================================================================
#define NL "\r\n"
//...
#define NL "\n"
//...
writeE(1, dir, l+((o&256)?(dirl[0]=0,1):CatS(dirl, NL, NULL)) );
//...
if (!(o&256)) lw+= CatS(dirl+lw, NL, NULL);
else dirl[lw++]=0;
//...
n+= list_l(dir, (o&256)?lw:lw-sizeof(NL)+1, lmax, o);
===================================================================

*** Neu hier ist eine Ausgabe von '\0' statt NL. ***


Vorher:
-----------------------------------------------------------------
writeE(1, dir, l+CatS(dirl, NL, NULL) );
//...
lw+= CatS(dirl+lw, NL, NULL);
//...
n+= list_l(dir, lw-sizeof(NL)+1, lmax, o);
-----------------------------------------------------------------
Nachher:
-----------------------------------------------------------------
writeE(1, dir, l+((o&256)?(dirl[0]=0,1):CatS(dirl, NL, NULL)) );
//...
if (!(o&256)) lw+= CatS(dirl+lw, NL, NULL);
else dirl[lw++]=0;
//...
n+= list_l(dir, (o&256)?lw :lw-sizeof(NL)+1, lmax, o);
/// n+= list_l(dir, (o&256)?lw-1:lw-sizeof(NL)+1, lmax, o); <<<
-----------------------------------------------------------------

Die letzte Zeile ist die Korrektur.

Die Kommando-Option o|= 256; wurde hastig hinzugefügt.
Dabei wurde -sizeof(NL)+1 == 0 angenommen ("\n")
und daher 'lw+0' => 'lw' eingesetzt.

Jedoch sizeof("\n") == 2, weil die terminierende '\0' mitzählt!
Diese \0 wird durch )+1 eliminiert.

Es muß gleichsinnig sein!
Wenn ich \0 oder \n in 'dirl' eintrage, habe ich je 1 Zeichen
eingetragen, und diese Anzahl muß von lw wieder weggenommen werden.
Bei \0 und \r\n habe ich 1 und 2 Zeichen eingetragen.

Durch den Fehler waren die Werte nicht 1,8,16 1,8,16, ..., sondern
akkumulierten auf bis 1330, wo eine Fehlermeldung wegen
Erreichen des Puffer-Endes abbrach.

Das Kommando ist ein rekursives List-Kommando, wie ein
abgespecktes DIR oder ls, das nur Pfadnamen liefert.
CatS() ist strcat() ähnlich.
--
Mit freundlichen Grüßen
Helmut Schellong ***@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
Ralf Damaschke
2018-09-13 22:59:16 UTC
Permalink
Post by Helmut Schellong
===================================================================
#define NL "\r\n"
//...
#define NL "\n"
[...]
Post by Helmut Schellong
Wer sieht den Fehler?
Die #define-Kombination ist nicht zulässig. Wenn trotzdem was
ausführbares erzeugt wird, kann nichts mehr über die Ausgabe
angenommen werden (insbesondere wenn sie in irgendeiner Weise
von NL abhängt).
Helmut Schellong
2018-09-13 23:23:11 UTC
Permalink
Post by Ralf Damaschke
Post by Helmut Schellong
===================================================================
#define NL "\r\n"
//...
#define NL "\n"
[...]
Post by Helmut Schellong
Wer sieht den Fehler?
Die #define-Kombination ist nicht zulässig. Wenn trotzdem was
ausführbares erzeugt wird, kann nichts mehr über die Ausgabe
angenommen werden (insbesondere wenn sie in irgendeiner Weise
von NL abhängt).
NL ist zur gleichen Zeit nur einmal definiert.
Je nach Betriebssytem.
--
Mit freundlichen Grüßen
Helmut Schellong ***@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
Ralf Damaschke
2018-09-15 17:17:04 UTC
Permalink
Post by Helmut Schellong
Post by Helmut Schellong
#define NL "\r\n"
//...
#define NL "\n"
Die #define-Kombination ist nicht zulässig. [...]
NL ist zur gleichen Zeit nur einmal definiert.
Je nach Betriebssytem.
Dann sollten die Definitionen entweder mit der Bedingungs-Richtlinie
oder eben nur eine von ihnen genannt werden.
Helmut Schellong
2018-09-15 17:33:44 UTC
Permalink
Post by Ralf Damaschke
Post by Helmut Schellong
Post by Helmut Schellong
#define NL "\r\n"
//...
#define NL "\n"
Die #define-Kombination ist nicht zulässig. [...]
NL ist zur gleichen Zeit nur einmal definiert.
Je nach Betriebssytem.
Dann sollten die Definitionen entweder mit der Bedingungs-Richtlinie
oder eben nur eine von ihnen genannt werden.
Nur eine zu nennen, ist nicht möglich, weil deutlich gemacht
sein muß, daß sizeof(NL) verschiedene Werte haben kann.

#if defined(UNIX)
# define NL "\n"
#endif
#if defined(WIN) || defined(DOS)
# define NL "\r\n"
#endif

"Je nach Betriebssytem."
Wie oben bereits genannt.

Die nun volle Definition wird kaum dabei helfen, den mittlerweile
bekannten Fehler zu finden.
--
Mit freundlichen Grüßen
Helmut Schellong ***@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
Loading...