kostenloser Webspace werbefrei: lima-city


Funktion mit char- Array

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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
  4. 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
  5. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    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. :slant:
  6. Huh? ' ' statt 0x20 zu benutzten führt zu einem Fehler? Das ist seltsam. Bist du sicher, dass du auch einfache Anführunszeichen genommen hast?
  7. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    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
  8. So, ich habe deinen Quellcode mal getestet und der Compiler hat mir sofort einen Warning gespuckt, der alles erklären sollte: Du gibst eine lokale Variable zurück ;) unf ist außerhalb von __DATUM__ nicht mehr definitert.
  9. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    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?
  10. 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.
  11. 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++.
  12. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Mittlerweile glaube ich nicht mehr daran, dass der Fehler durch die Rückgabe eines lokalen Wertes entstand. Der Quelltext sieht jetzt so aus:
    #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
    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...

    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
  13. 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.
  14. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!