expertenaustausch > comp.lang.* > comp.lang.c

Helmut Schellong (13.09.2018, 16:30)
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?
Thomas Koenig (13.09.2018, 19:32)
Helmut Schellong <rip> schrieb:
> Durch eine hinzugefügte Option (256) ist ein Fehler hineingekommen:


> 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 (13.09.2018, 20:27)
On 09/13/2018 19:32, Thomas Koenig wrote:
> Helmut Schellong <rip> schrieb:
>> Durch eine hinzugefügte Option (256) ist ein Fehler hineingekommen:
>> 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.

> #include <context.h>, bitte.


Der Fehler ist in der letzten Zeile und hat etwas mit lw zu tun.
Thomas Koenig (13.09.2018, 22:30)
Helmut Schellong <rip> schrieb:

>> #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 (14.09.2018, 00:38)
On 09/13/2018 22:30, Thomas Koenig wrote:
> Helmut Schellong <rip> schrieb:
>>> #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.
Ralf Damaschke (14.09.2018, 00:59)
Helmut Schellong schrieb:

> Durch eine hinzugefügte Option (256) ist ein Fehler hineingekommen:
> ================================================== =================
> #define NL "\r\n"
> //...
> #define NL "\n" [...]
> 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 (14.09.2018, 01:23)
On 09/14/2018 00:59, Ralf Damaschke wrote:
> Helmut Schellong schrieb:
> [...]
> 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.
Ralf Damaschke (15.09.2018, 19:17)
Helmut Schellong schrieb:

> On 09/14/2018 00:59, Ralf Damaschke wrote:
>> Helmut Schellong schrieb:


>>> #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 (15.09.2018, 19:33)
On 09/15/2018 19:17, Ralf Damaschke wrote:
> Helmut Schellong schrieb:
> 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.
Ähnliche Themen