Frage zu dem C4309-Fehler
-
Hallo,
in einer Liste möchte ich gerne die Listenelemente bereits beim 'einfuegen' schon alphabetisch sortiert haben und habe mir folgendes überlegt:
kopf->name[0] = 0; /* kleiner als jedes ASCII-Zeichen */ ende->name[0] = 255; /* groesser als jedes ASCII-Zeichen */ ende->name[1] = 0;anschließend vergleiche ich mit strcmp mit einem bestehenden Lietenelement und fuege es davor oder dahinter ein.
Manchmal kommt der C4309-Fehler und manchmal nicht, was mich schon recht verwirrt. Aber die wesentliche frage die mich beschaeftigt ist?
Wie beuge ich der Warnung vor, bzw. kann sie beheben?
Laut MSDN ist bei der Typkonvertierung der Speicherplatz der Konstanten ueberschirtten worden.
Als Empfehlung ist ein größerer Typ für die Konstante zu verwenden.
Ich habe schwierigkeiten das zu verstehen.
Die Konstante wäre das durch die Integer dargestellte Zeichen. Dabei wurde der Speicherplatz von char name[0] überschritten?
-
Ich würde dir ja "unsigned char" empfehlen
Da passen die Werte mit Sicherheit rein.(btw, 255 ist auch ein legales ASCII-Zeichen - auch wenn's in normalen Texten nicht vorkommt)
-
Was für einen Datentyp hat denn die Variable 'name'? Wenn der Typ
char name[0]ist, dass ist es ein leerer Typ. Die Zahl in den eckigen Klammern gibt ja an, wieviele chars da reinpassen, bei 0 passt eben gar nix rein. Eventuell dann char ..[2] oder so verwenden, je nachdem, wieviel da rein soll.
Und das mit dem sortieren.. Kannst du mal deine Routine zeigen?
-
Also wenn ich es auf unsigned char setze, nölt fgets rum, da muss ich sicherlich die eingaben noch umschreiben.
Die Sortierung hab ich mir ungefähr so überlegt.
if (strcmp(name, kopf->nachfolger->name) == 0) current = kopf; else if (strcmp(name, ende->nachfolger->name) > 0) current = ende->vorgaenger; else{ int vergleich = strcmp(name, current->name); if (vergleich > 0) while (strcmp(name, momentan->nachfolger->name) > 0) { momentan = momentan->nachfolger; } else if(vergleich < 0) while (strcmp(name, current->name) < 0) { momentan = momentan->vorgaenger; } else { while (strcmp(name, current->name) == 0) { momentan = momentan->vorgaenger; } } }