fopen geht nicht nach 2. wcscpy !!!



  • Hallo ,

    kann mir jemand Bitte helfen seit ich das zweitemal wcscpy() aufrufe ist der Aufruf mit fpopen =! Null

    hier der Code

    VARIANT vValue0;
    	VariantInit(&vValue0);
    	variables[0]->GetValue(&vValue0);
    	BSTR sPapier = V_BSTR(&vValue0);
    	VariantClear(&vValue0);
    	size_t j = SysStringLen(sPapier);
    	dat1.Papier=new wchar_t(j);
    	wcscpy(dat1.Papier,sPapier);
    	SysFreeString(sPapier);
    
    	char str[256];			
    	for(int i=0;i<4;i++){
    		str[i]=*(dat1.Papier + i);
    	}
    	str[4]= '\0'; 	
    
    //---Notiz  //hier fehler !!!!!!
    	VARIANT vValue8;
    	VariantInit(&vValue8);
    	variables[8]->GetValue(&vValue8);
    	BSTR sNotiz = V_BSTR(&vValue8);
    	VariantClear(&vValue8);
    	size_t k = SysStringLen(sNotiz);
    	dat1.Notiz=new wchar_t(k);
    	wcscpy(dat1.Notiz,sNotiz); //Hier problem mit wcscpy!!!!!  :confused: 
    	SysFreeString(sNotiz);
    
    	//------------------------------open File
    	codefile = fopen(str,"a+");
    	if (codefile == NULL) {	
    		printf("codefile-error at file %s\n", "test.txt");
    		exit(1);
    	}
    


  • Ziemlich interessanter Programmierstil.
    Du solltest dringend nochmal nachlesen, wie new benutzt wird. Du legst Speicherplatz für ein einziges Zeichen an und willst da ganze Zeichenketten reinkopieren. Das kann nicht funktionieren.

    Ich empfehle ein Grundlagentutorial, und vielleicht eine Entscheidung, ob du nun C oder C++ programmieren willst.



  • hi das Interesante ist dass es ja oben funktioniert und unten auch nur dann kann ich fopen nciht mehr aufrufen
    🙂



  • Registrierter Troll schrieb:

    Ziemlich interessanter Programmierstil.
    Du solltest dringend nochmal nachlesen, wie new benutzt wird. Du legst Speicherplatz für ein einziges Zeichen an und willst da ganze Zeichenketten reinkopieren. Das kann nicht funktionieren.

    Ich empfehle ein Grundlagentutorial, und vielleicht eine Entscheidung, ob du nun C oder C++ programmieren willst.

    Das Problem liegt wo anres ? aber wo ? 😕



  • Prüf mal, ob in "str" das drin steht, was drin stehen soll (z.B. "test**.txt**").



  • hinweis schrieb:

    Prüf mal, ob in "str" das drin steht, was drin stehen soll (z.B. "test**.txt**").

    das Problehm liegt nicht im str oder in irgendwas das nicht compilierbar ist

    alles ist Richitg nur wenn der zweite wcscpy aufgerufen wird. Geht nacher

    fopen in die error schleife rein ohne Fehlermeldung . 😕



  • Du reservierst nicht genug Speicher. SysStringLen liefert dir die Länge ohne Nullterminierung, wcscpy hängt aber eine dran. Den Fehler machst du übrigens zweimal im gezeigten Code.



  • Hallo .

    Ich habe das Problem glaube ich nicht deutlich besrieben 🙂

    wenn ich wcscpy()auskomentire

    //wcscpy(dat1.Notiz,sNotiz); //Hier problem mit wcscpy!!!!!

    funktioniert alles wunderbar ich kann fopen benuzen.

    Wenn ich so lasse

    wcscpy(dat1.Notiz,sNotiz); //Hier problem mit wcscpy!!!!!

    geht auch alles wunderbar nur
    funktioniert fopen nicht mehr 😕



  • miky03 schrieb:

    Wenn ich so lasse

    wcscpy(dat1.Notiz,sNotiz); //Hier problem mit wcscpy!!!!!

    geht auch alles wunderbar nur
    funktioniert fopen nicht mehr 😕

    Du kopierst in deine Arrays mehr rein als reinpasst. Das erzeugt undefiniertes Verhalten, da kann alles passieren. Im ersten Fall passiert vielleicht nichts, im zweiten Fall schlägt der nachfolgende fopen-Aufruf fehl. Wenn du das nochmal so einbaust, wird vielleicht deine Festplatte formatiert.

    Also, machs einfach richtig.



  • MFK schrieb:

    miky03 schrieb:

    Wenn ich so lasse

    wcscpy(dat1.Notiz,sNotiz); //Hier problem mit wcscpy!!!!!

    geht auch alles wunderbar nur
    funktioniert fopen nicht mehr 😕

    Du kopierst in deine Arrays mehr rein als reinpasst. Das erzeugt undefiniertes Verhalten, da kann alles passieren. Im ersten Fall passiert vielleicht nichts, im zweiten Fall schlägt der nachfolgende fopen-Aufruf fehl. Wenn du das nochmal so einbaust, wird vielleicht deine Festplatte formatiert.

    Also, machs einfach richtig.

    habe jetzt so probiert

    size_t k = SysStringLen(sNotiz);
    	dat1.Notiz=new wchar_t(k+1);
    	wcscpy(dat1.Notiz,sNotiz);
    

    Hilft nicht aber trozdem danke 🙄



  • miky03 schrieb:

    Hilft nicht aber trozdem danke 🙄

    Möglicherweise hast du noch mehr solche Fehler in deinem Code. Jeder davon kann dieses Verhalten auslösen.

    Dass du nach dem VariantClear noch auf den BSTR zugreifst, ist übrigens auch nicht sauber. Der BSTR ist im Prinzip nur ein Zeiger, das V_BSTR-Makro fertigt auch keine Kopie an, d.h. dein Zeiger zeigt nur auf den Speicher, der dem VARIANT "gehört". Wenn du dem Zeiger den Variant unter dem Hintern weglöschst, wird er ungültig.



  • miky03 schrieb:

    MFK schrieb:

    miky03 schrieb:

    Wenn ich so lasse

    wcscpy(dat1.Notiz,sNotiz); //Hier problem mit wcscpy!!!!!

    geht auch alles wunderbar nur
    funktioniert fopen nicht mehr 😕

    Du kopierst in deine Arrays mehr rein als reinpasst. Das erzeugt undefiniertes Verhalten, da kann alles passieren. Im ersten Fall passiert vielleicht nichts, im zweiten Fall schlägt der nachfolgende fopen-Aufruf fehl. Wenn du das nochmal so einbaust, wird vielleicht deine Festplatte formatiert.

    Also, machs einfach richtig.

    habe jetzt so probiert

    size_t k = SysStringLen(sNotiz);
    	dat1.Notiz=new wchar_t(k+1);
    	wcscpy(dat1.Notiz,sNotiz);
    

    Hilft nicht aber trozdem danke 🙄

    Ersetz einfach mal die runden Klammern durch eckige.

    // dat1.Notiz=new wchar_t(k+1);
    dat1.Notiz=new wchar_t[k+1];
    

    Manche Compiler mögen eckige Klammern einfach lieber, vielleicht geht's dann. Hab mal gehört dass eckige Klammern manchmal auch ne andere Bedeutung haben als runde...
    Aber ich glaub das is dummes Geschwätz, da muss man nix drauf geben.



  • hustbaer schrieb:

    Hab mal gehört dass eckige Klammern manchmal auch ne andere Bedeutung haben als runde...

    Dass ich das nicht gesehen habe... Ich geh ins Bett. :p



  • Wobei deine Einwände ja auch richtig sind. Er muss alle drei Sachen korrigieren, wenn er möchte dass das Programm zuverlässig läuft.



  • hustbaer schrieb:

    miky03 schrieb:

    MFK schrieb:

    miky03 schrieb:

    Wenn ich so lasse

    wcscpy(dat1.Notiz,sNotiz); //Hier problem mit wcscpy!!!!!

    geht auch alles wunderbar nur
    funktioniert fopen nicht mehr 😕

    Du kopierst in deine Arrays mehr rein als reinpasst. Das erzeugt undefiniertes Verhalten, da kann alles passieren. Im ersten Fall passiert vielleicht nichts, im zweiten Fall schlägt der nachfolgende fopen-Aufruf fehl. Wenn du das nochmal so einbaust, wird vielleicht deine Festplatte formatiert.

    Also, machs einfach richtig.

    habe jetzt so probiert

    size_t k = SysStringLen(sNotiz);
    	dat1.Notiz=new wchar_t(k+1);
    	wcscpy(dat1.Notiz,sNotiz);
    

    Hilft nicht aber trozdem danke 🙄

    Ersetz einfach mal die runden Klammern durch eckige.

    // dat1.Notiz=new wchar_t(k+1);
    dat1.Notiz=new wchar_t[k+1];
    

    Manche Compiler mögen eckige Klammern einfach lieber, vielleicht geht's dann. Hab mal gehört dass eckige Klammern manchmal auch ne andere Bedeutung haben als runde...
    Aber ich glaub das is dummes Geschwätz, da muss man nix drauf geben.

    Danke an Alle supper Support hier 😃
    das Problem lag in [] und k+1
    hier der korigierter Code

    //---Notiz
    	VARIANT vValue8;
    	VariantInit(&vValue8);
    	variables[8]->GetValue(&vValue8);
    	BSTR sNotiz = V_BSTR(&vValue8);
    	size_t k = SysStringLen(sNotiz);
    	dat1.Notiz=new wchar_t[k+1];
    	wcscpy(dat1.Notiz,sNotiz); 
    	SysFreeString(sNotiz);
    	VariantClear(&vValue8);
    
    	//------------------------------open File
    	codefile = fopen(str,"a+");
    	if (codefile == NULL) {
    		printf("codefile-error at file %s\n", "test.txt");
    		exit(1);
    	}
    

    Nochmal vielen Dank 😃



  • Registrierter Troll schrieb:

    Du legst Speicherplatz für ein einziges Zeichen an und willst da ganze Zeichenketten reinkopieren.

    Das war offensichtlich zu subtil.

    hustbaer schrieb:

    Hab mal gehört dass eckige Klammern manchmal auch ne andere Bedeutung haben als runde...
    Aber ich glaub das is dummes Geschwätz, da muss man nix drauf geben.

    So kann mans natürlich auch sagen.


Anmelden zum Antworten