Character

hallo,

warum geht das nicht??? es geht um das lesen und parsen einer textdatei.

const int LINE_LENGTH = 3100;
char buffer[LINE_LENGTH];
if (buffer[0] == „|“) /// ERROR HERE! CHAR AND CHAR*

ich will wissen, ob an einem zeilenanfang ein „|“ steht.
später will ich das nächste „|“ suchen und die zeichenkette dazwischen interpretieren.

danke schön!
chris

Hallo Chris,

der Fehler ist, na sagen wir einmal - klein und gemein.

if (buffer[0] == "|")

Die eine Seite passt ja schon buffer[0] zeigt auf das erste Element des Arrays. Aber alles was in doppelten Anführungszeichen steht ( " ) wird in C als String (also char*) interpretiert.
Wenn du charakterweise vergleichen willst, brauchst du die einfachen Anführungszeichen ( ’ auf der dt. Tastatur über dem #).

Erlaube mir die Frage, auch wenn ich jetzt den Rest deines Programms nicht kenne, aber warum definierst du die char Länge nicht über #define bzw. allokierst dynamisch per calloc() abhängig von der Dateigröße der zu buffernden Datei?

Gruss
Martin

Erlaube mir die Frage, auch wenn ich jetzt den Rest deines
Programms nicht kenne, aber warum definierst du die char Länge
nicht über #define

Hi Martin!

Zum Thema #define: Ich versuche defines nach Möglichkeit zu vermeiden, weil der Compiler keine Typprüfung durchführen kann (eh klar, weil er ja davon gar nix mehr mitkriegt). Den Speicherplatz für einen int ist es mir allemal wert, daß ich damit keine (oft recht schwierig zu findenden) Probleme krieg.

Gruß,
TheBeast

Zum Thema #define: Ich versuche defines nach Möglichkeit zu
vermeiden, weil der Compiler keine Typprüfung durchführen kann
(eh klar, weil er ja davon gar nix mehr mitkriegt). Den
Speicherplatz für einen int ist es mir allemal wert, daß ich
damit keine (oft recht schwierig zu findenden) Probleme krieg.

Hi „Beast“ (netter nick),

ehrlich? gcc unter linux fängt da schon an zu meckern:

#define LENGTH 100.123
...
char str[LENGTH];

findet der nun überhaupt nicht lustig und meint nur

size of array `str' has non-integer type

Muss das glatt mal unter Windows ausprobieren. Aber von der Seite hatte ich’s noch nie gesehen - könnte tatsächlich von Compiler zu Compiler unterschiedlich sein - danke für den Hinweis.

Gruss
Martin

Hallo BigRed!

Hi „Beast“ (netter nick),

Danke!

ehrlich? gcc unter linux fängt da schon an zu meckern:
#define LENGTH 100.123

char str[LENGTH];

Logisch, da: #define’s werden vom Präprozessor ersetzt (stures find & replace), in Deinem Fall kriegt der Compiler also hier von LENGTH gar nix mit, sondern regt sich (zu recht) über char str[100.123] auf.
Die Sache mit der Typprüfung meinte ich auch nicht so sehr für das konkrete Beispiel, sondern eher so als generellen Hint. Mit ein bisschen Mühe läßt sich da aber schon ein Beispiel finden, wo Du definitiv ungewollt comiplierbaren Code generierst.

Wenn man nämlich z.B. mit Konstanten zu rechnen beginnt, dann bringt Dich die automatische Typumwandlung von C ziemlich bald um.

Ganz extremen Spaß hatte ich schon mit Makro-defines, weil nämlich in irgendeiner dämlichen Windows-Header Datei ein #define FindWindow FindWindowA drinnen steht. DEN unresolved external hab’ ich lange gesucht *g*.

Gruß,
TheBeast (der übrigens auch Martin heißt)