Funktion mit char- Array
lima-city → Forum → Programmiersprachen → C/C++ und D
aktuelle datum
anhieb
aufruf
ausgabe
ausgegeben code
benutzen
code
compiler
enden
fehler
funktion
glauben
jeweiligen zeichen
monat
quellcode
sorge
tabelle
tag
verzweifeln
warnmeldung
-
Ich möchte ein inline- Makro schreiben, dass mir beim tag/aufruf">Aufruf von __DATUM__ das formatierte aktuelle Datum zurückgibt. Die Funktion nimmt als Wert den Inhalt aus __DATE__, schreibt den Tag vor den Monat und benennt die Monate auf deutsch. Jedoch erhalte ich als Ausgabe für den heutigen Tag "00411172". __DATE__ gibt aber den richtigen Tag aus, also muss es an meiner Funktion liegen:
#ifdef __DATE__ inline char* __DATUM__ (void) { char unf[12] = __DATE__; char tag[2] = {unf[4], unf[5]}; if (unf[0] == 0x44) { unf[2] = 0x7A; } else if (unf[0] == 0x4D) { if (unf[2] == 0x72) { unf[1] = 0x72; unf[2] = 0x7A; } else { unf[2] = 0x69; } } else if (unf[0] == 0x4F) { unf[1] = 0x6B; } unf[3] = unf[0]; unf[4] = unf[1]; unf[5] = unf[2]; unf[0] = tag[0]; unf[1] = tag[1]; unf[2] = 0x20; return unf; } #endif
Was mache ich falsch?
Edit: Ich habe die Funktion falsch aufgerufen, aber dennoch ist ein Fehler darin. Die Ausgabe lautet jetzt: "\ !!"
Beitrag zuletzt geändert: 13.7.2010 15:03:29 von toolz -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
hey, kenn mir nur ein klein wenig mit C (++) aus..
aber mmuss ein string (Array mit char) nicht immer mit '/0' im letzen Element enden ?
gruß
Robi -
toolz, könntest du bitte statt Hex die jeweiligen Zeichen benutzen? Nicht jeder kennt die ASCII-Code Tabelle auswendig.
Ansonsten erkenne ich aber auch Anhieb keinen Fehler :(
Beitrag zuletzt geändert: 13.7.2010 15:45:05 von nikic -
nikic schrieb: toolz, könntest du bitte statt Hex die jeweiligen Zeichen benutzen? Nicht jeder kennt die ASCII-Code Tabelle auswendig.
Ansonsten erkenne ich aber auch Anhieb keinen Fehler :(
Würde ich gerne, aber das führt zu einem Fehler. -
Huh? ' ' statt 0x20 zu benutzten führt zu einem Fehler? Das ist seltsam. Bist du sicher, dass du auch einfache Anführunszeichen genommen hast?
-
Ups! Ich hatte die normalen Anführungszeichen verwendet. Allerdings funktioniert der Code auch so noch nicht:
#ifdef __DATE__ inline char* __DATUM__ (void) { char unf[12] = __DATE__; char tag[2] = {unf[4], unf[5]}; if (unf[0] == 'D') { unf[2] = 'z'; } else if (unf[0] == 'M') { if (unf[2] == 'r') { unf[1] = 'r'; unf[2] = 'z'; } else { unf[2] = 'i'; } } else if (unf[0] == 'O') { unf[1] = 'k'; } unf[3] = unf[0]; unf[4] = unf[1]; unf[5] = unf[2]; unf[0] = tag[0]; unf[1] = tag[1]; unf[2] = ' '; return unf; } #define __DATUM__ __DATUM__() #endif
-
Ja, daran liegt es. Die Warnmeldung bekomme ich jetzt auch. Aber ich weiß leider nicht, wie ich ihn umgehen soll. Wenn ich die Variable außerhalb deklariere erhalte ich in der Funktion eine Zugriffsverletzung, wenn ich unf[] ändern möchte.
Hat jemand eine Lösung parat? -
Der "typische" Ansatz, ist, dass du der Datumsfunktion schon einen char* übergibst, in das diese dann schreibt. Statt also einen Wert zurückzugeben, änderst du einen dir übergebenen Wert.
-
Du könntest den Speicherplatz für unf dynamisch allokieren. Allerdings musst du dann nach der Verwendung dafür sorge tragen, dass er wieder freigegeben wird, sonst müllst du dir den Speicher voll.
Wenn dich das interessiert versuch es mal mit malloc()/free() unter C bzw. new/delete unter C++. -
Mittlerweile glaube ich nicht mehr daran, dass der Fehler durch die Rückgabe eines lokalen Wertes entstand. Der Quelltext sieht jetzt so aus:
Der Wert ist nicht mehr lokal, dennoch unterbricht der Kompilierer das Programm bei der ersten Zuweisung (dtm[3] = dtm[0]). Als Grund nennt er eine unbehandelte Zugriffsverletzung beim Schreiben. Ich bin schon am Verzweifeln...#ifdef __DATE__ inline char* DINan (char dtm[12]) { char tag[2] = {dtm[4], dtm[5]}; if (dtm[0] == 0x44) { dtm[2] = 0x7A; } else if (dtm[0] == 0x4D) { if (dtm[2] == 0x72) { dtm[1] = 0x72; dtm[2] = 0x7A; } else { dtm[2] = 0x69; } } else if (dtm[0] == 0x4F) { dtm[1] = 0x6B; } dtm[3] = dtm[0]; dtm[4] = dtm[1]; dtm[5] = dtm[2]; dtm[0] = tag[0]; dtm[1] = tag[1]; dtm[2] = 0x20; return dtm; } #define __DATUM__ DINan(__DATE__) #endif
EDIT:
Wenn ich den Zeiger von dtm (oder unf) wie folgt zurückgebe, bekomme ich den ersten CHAR ausgegeben:return *dtm;
Beitrag zuletzt geändert: 22.7.2010 18:28:16 von toolz -
Wenn die Variable nicht mehr lokal ist, dann solltest du angeben, wo sie herkommt.
Da du aber im Kopf der Funktion char[12] stehen hast glaube ich, dass die Variable immernoch lokal ist.
Eventuell mag dein System es nicht, wenn du auf dem Stack rumschreibst(halte ich für unwahrscheinlich).
Übergib am besten deine Variable, in die geschrieben werden sollte, per char*
Es ergibt keinen Sinn, wenn du *dtm zurück gibst. Das sollte garnicht durch die Typprüfung kommen, da der Rückgabetyp char* ist und *dtm vom Typ char. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage