nicht initialisierte lokale Variable
-
CStoll schrieb:
Nunja, viele Funktionen der WinAPI und Standardbibliotheken sagen ganz einfach "gib mir eine Adresse und ich schreibe die Daten dorthin" - also mußt du vor dem Aufruf sicherstellen, daß du genug Platz hast.
Arg, ja klar.
Sorry, das war mein Fehler, da hatte ich nicht dran gedacht.
PS: Was passiert, wenn du die Releaseversion debugst?

-
Eine Frage hab ich doch noch, eine variable wird doch ausserhalb der funktion in der sie erzeugt wurde Ungültig wenn ich das richtig verstehe.
Muss ich die Pointer jetzt am schluss Löschen oder gehen die von allein in die ewigen jagtgründe ein
Ich meine um den Speicher wieder frei zu geben.
-
Den Speicher hinter dem Pointer mußt du selber wieder löschen (rechtzeitig bevor er aus dem Scope rausfällt), da C++ per Default keinen Garbage Collector hat. Eine Alterantive wäre es, anstelle nackter Zeiger Smart-Pointer zu verwenden, die sich von Hand um den richtigen delete[]-Aufruf kümmern (oder ein ausreichend großes lokales Array).
-
CStoll schrieb:
LPTSTR meinzeiger = new TCHAR[bufsize]; GetPrivateProfileString(...,meinzeiger,bufsize,...);Ist in diesem Fall
// Edit: Ursprünglich TCHAR meinbuffer = TCHAR[VORGEGEBENEGROESSE]; // ich meinte natürlich: TCHAR meinbuffer[VORGEGEBENEGROESSE]; GetPrivateProfileString(...,meinbuffer,_countof(meinbuffer),...);nicht die bessere Variante? Just my 2 cents!
new/delete würde ich für solche Aufgaben vermeiden!
-
Wenn du eine fest vorgegebene Maximalgröße hast, womöglich(1). Aber spätestens wenn du darüber stolperst, daß das Array zu klein wird, müsstest du dynamisch Speicher anfordern (in dem Fall bedeutet das: wenn der geholte Registry-Wert zu lang ist, mußt du mehr Speicher anfordern und GetPrivateProfileString() nochmal neu aufrufen).
PS: Bist du sicher, daß dein Code so funktioniert? Ich hab noch nie gesehen, daß man einen einzelnen TCHAR-Wert mit einem Array initialisieren kann.
PPS: Die beste Lösung wäre es imho sowieso, solche WinAPI-Aufrufe in einer eigenen Funktion zu kapseln und nach außen über C++ Container bzw. std::string zu kommunizieren. Aber so weit ist MS bei der MFC ja nicht gegangen.
(1) deswegen habe ich in meinem letzten Beitrag auch den Hinweis auf ein Array gebracht.
-
CStoll schrieb:
PS: Bist du sicher, daß dein Code so funktioniert? Ich hab noch nie gesehen, daß man einen einzelnen TCHAR-Wert mit einem Array initialisieren kann.
Das ist ein Typo! Ich editiere den mal... Danke für den Hinweis!CStoll schrieb:
PPS: Die beste Lösung wäre es imho sowieso, solche WinAPI-Aufrufe in einer eigenen Funktion zu kapseln und nach außen über C++ Container bzw. std::string zu kommunizieren. Aber so weit ist MS bei der MFC ja nicht gegangen.
(1) deswegen habe ich in meinem letzten Beitrag auch den Hinweis auf ein Array gebracht.
Sowas meinst Du?

CString CMyApp::GetLocalSettingsString(PCTSTR pszSection, PCTSTR pszEntry, PCTSTR pszDefault) { if (pszDefault == NULL) pszDefault = _T(""); // don't pass in NULL // Up to a maximum of 4kb! TCHAR szBuff[4096]; DWORD dw = ::GetPrivateProfileString(pszSection, pszEntry, pszDefault, szBuff, MfxCountOf(szBuff), m_strLocalSettingsIniFile); ASSERT(dw < 4095); UNUSED_ALWAYS(dw); return szBuff; } BOOL CMyApp::WriteLocalSettingsString(PCTSTR pszSection, PCTSTR pszEntry, PCTSTR pszValue) { return ::WritePrivateProfileString(pszSection, pszEntry, pszValue, m_strLocalSettingsIniFile); }
-
Ja jetzt verwirt mich doch mal

Ich habe nur eine kleine .ini in der ich zum grössten Teil zahlenwerte ablege, also alles vorhersehbar in der benötigten Grösse.Hey noch mal Danke, seit dem ich das einigermasen begriffen habe fällt mir das "Konvertieren" doch sofort viel leichter

-
fmotto schrieb:
Ja jetzt verwirt mich doch mal

Immer wieder gerne

(aber für dein Problem sind die letzten Zeilen auch nicht mehr relevant - da haben wir das Problem nur etwas weitergesponnen)@Martin: Ja, an sowas habe ich gedacht, wobei ich diese Wrapper-Funktionen vermutlich nicht in meine App-Klasse integriert hätte (und mit std::string arbeiten würde, aber das ist letztendlich Geschmackssache).
Ich habe nur eine kleine .ini in der ich zum grössten Teil zahlenwerte ablege, also alles vorhersehbar in der benötigten Grösse.
Wenn du abschätzen kannst, wie groß deine Werte werden können, reicht es auch aus, ein entsprechend großes Array bereitzustellen (siehe Martins oberer Eintrag) - und für Zahlenwerte gibt es afaik auch GetPrivateProfileInt(), das die Werte gleich in ein int umrechnet.
-
CStoll schrieb:
@Martin: Ja, an sowas habe ich gedacht, wobei ich diese Wrapper-Funktionen vermutlich nicht in meine App-Klasse integriert hätte (und mit std::string arbeiten würde, aber das ist letztendlich Geschmackssache).
Die Anwednung hier, aus der ich es kopiert habe nutzt eine INI Datei in einem bestimmten Verzeichnis. Insofern ist das natürlich kein gutes Beispiel für einen allgemeinen Wrapper. Aber dadurch kann ich sowohl die Registry mit HKCU verwenden, als auch eine INI Datei um Konfigurationen über eine Datei tauschen zu können!
Zum std::string Versus CString. Warum soll ich std::string nehmen wenn ich sowieso eine MFC Applikaiton habe. Zudem ist CString flexibler :-)!
Edit. Quote gefixt!
-
CStoll schrieb:
PPS: Die beste Lösung wäre es imho sowieso, solche WinAPI-Aufrufe in einer eigenen Funktion zu kapseln und nach außen über C++ Container bzw. std::string zu kommunizieren. Aber so weit ist MS bei der MFC ja nicht gegangen.
Martin Richter schrieb:
Zum std::string Versus CString. Warum soll ich std::string nehmen wenn ich sowieso eine MFC Applikaiton habe.
So, jetzt bin ich vollauf Eurer Meinung!

Die anderen Datentypen sind jedes Mal mein persönlicher Kampf, wenns an die Api-Sachen geht.