wulfgang Geschrieben 4. Februar 2009 Teilen Geschrieben 4. Februar 2009 Hallo, ich bekomme bei der Anwendung von catch auf einmal lauter Fehler. D try { //Servername wird aus INI-Datei gelesen int laenge; //Ist nur eine Hilfsvariable um den Rückgabewert zu pruefen GetPrivateProfileString(szSectionName, szKeyName_s, DefaultValue, servername, (sizeof(servername))/(sizeof(wchar_t)), szFilename); cout << GetLastError()<<"\n"; wcout << servername << "\n"; } catch (CException *error_read) { TCHAR szCause[1024]; error_read->GetErrorMessage(szCause,1024); printf_s("ERROR! %S\n", szCause); error_read->Delete(); } syntax error : identifier 'CException' 'error_read' : undeclared identifier Das ist nur ein Teil der Fehlermeldungen. ich verstehe hier einfach nicht warum undeclared identifier-ich error_read doch definiert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. Februar 2009 Teilen Geschrieben 4. Februar 2009 Das ist nur ein Teil der Fehlermeldungen.Ist der Syntax Error denn sicher die erste? ich verstehe hier einfach nicht warum undeclared identifier-ich error_read doch definiert.In diesem Codefragment kann ich keinen Fehler erkennen. Es scheint am weiteren Umfeld zu liegen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 4. Februar 2009 Autor Teilen Geschrieben 4. Februar 2009 Ist der Syntax Error denn sicher die erste? ja Hier alle Meldungen aufgelistet error C2310: catch handlers must specify one type error C2065: 'error' : undeclared identifier error C2227: left of '->GetErrorMessage' must point to class/struct/union/generic type error C2227: left of '->Delete' must point to class/struct/union/generic typeerror C2317: 'try' block starting on line '22' has no catch handlers error C2065: 'laenge' : undeclared identifier Es scheint am weiteren Umfeld zu liegen. Bevor ich versucht habe, das Exception-Handling einzubauen, hatte ich keine Fehler. Die Variablen wie nameserver, login_user, password habe ich als wchar_t in der Headerdatei definiert. #include "StdAfx.h" #include "read_serverlist.h" #include <windows.h> #include <fstream> #include <wchar.h> #include <wctype.h> #include <iostream> using namespace std; wchar_t DefaultValue[50] = L"DefaultValue"; wchar_t* read_serverlist::servername; read_serverlist::read_serverlist(void) { wchar_t szSectionName[] = L"name"; wchar_t szKeyName_s[] = L"server"; wchar_t szFilename[] = L"C:/Dokumente und Einstellungen/user/Eigene Dateien/Visual Studio 2005/Projects/automatic_transfer.sln/serverlist.ini"; //Hier den pfad der ini eintragen wchar_t nameserver[256]; try { //Servername wird aus INI-Datei gelesen int laenge; //Ist nur eine Hilfsvariable um den Rückgabewert zu pruefen GetPrivateProfileString(szSectionName, szKeyName_s, DefaultValue, nameserver, (sizeof(nameserver))/(sizeof(wchar_t)), szFilename); cout << GetLastError()<<"\n"; wcout << nameserver << "\n"; servername=nameserver; wcout << servername; } catch(CException* error) { TCHAR szCause[1024]; error->GetErrorMessage(szCause,1024); printf_s("ERROR! %S\n", szCause); error->Delete(); } //User wird aus INI-Datei gelesen wchar_t szKeyName_u[] = L"login_user"; laenge=GetPrivateProfileString(szSectionName, szKeyName_u, DefaultValue, login_user, (sizeof(login_user))/(sizeof(wchar_t)), szFilename); wcout << login_user; cout << laenge << "\n"; //Passwort wird aus INI-Datei gelesen wchar_t szKeyName_p[] = L"password"; laenge=GetPrivateProfileString(szSectionName, szKeyName_p, DefaultValue, password, (sizeof(password))/(sizeof(wchar_t)), szFilename); wcout << password ; cout << laenge << "\n"; //Herkunft der Textdatei wird aus INI-Datei gelesen wchar_t szKeyName_t_s[] = L"source_txt"; laenge=GetPrivateProfileString(szSectionName, szKeyName_t_s, DefaultValue, source_txt, (sizeof(source_txt))/(sizeof(wchar_t)), szFilename); wcout << source_txt ; cout << laenge << "\n"; //Ziel der Textdatei wird aus INI-Datei gelesen wchar_t szKeyName_t_d[] = L"destination_txt"; laenge=GetPrivateProfileString(szSectionName, szKeyName_t_d, DefaultValue, destination_txt, (sizeof(destination_txt))/(sizeof(wchar_t)), szFilename); wcout << destination_txt ; cout << laenge << "\n"; //Ziel der zu übertragenden Daten wird gelesen wchar_t szKeyName_f_d[] = L"destination_folder"; laenge=GetPrivateProfileString(szSectionName, szKeyName_f_d, DefaultValue, destination_folder, (sizeof(destination_folder))/(sizeof(wchar_t)), szFilename); wcout << destination_folder ; cout << laenge << "\n"; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. Februar 2009 Teilen Geschrieben 4. Februar 2009 GetPrivateProfileString ist eine WinAPI-Funktion, die wirft keine Exception, erst recht keine Instanz einer MFC-Exceptionklasse. Ist das überhaupt ein MFC-Projekt? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 4. Februar 2009 Autor Teilen Geschrieben 4. Februar 2009 GetPrivateProfileString ist eine WinAPI-Funktion, die wirft keine Exception Okay, das wußte ich nicht. Ist das überhaupt ein MFC-Projekt? Ja ich benutze ja in anderen Klassen zum Beispiel auch CInternetSession. Wie kann ich denn sonst einen Fehler abfangen, wenn keine Exceptions ausgeworfen werden? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. Februar 2009 Teilen Geschrieben 4. Februar 2009 Okay, das wußte ich nicht.Dafür gibt's die MSDN Library, da steht so was drin. Da steht auch drin, was die Funktion tut, wenn sie den gesuchten Eintrag nicht finden kann: Sie kopiert den Defaultstring in den Ergebnispuffer. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 5. Februar 2009 Autor Teilen Geschrieben 5. Februar 2009 Funktion tut, wenn sie den gesuchten Eintrag nicht finden kann: Sie kopiert den Defaultstring in den Ergebnispuffer. In meinem Fall leider nicht. Deswegen hatte ich auf catch gehofft. Während der Ausführung des Programms erhalte ich: First-chance exception at 0x7c920aa8 in automatic_transfer.exe: 0xC0000005: Access violation writing location 0x00000000. Unhandled exception at 0x7c920aa8 in automatic_transfer.exe: 0xC0000005: Access violation writing location 0x00000000. wchar_t* read_serverlist::servername; read_serverlist::read_serverlist(void) { GetPrivateProfileString(szSectionName, szKeyName_s, DefaultValue, servername,//vom Compiler markiert (sizeof(servername))/(sizeof(wchar_t)), szFilename);//vom Compiler markiert cout << GetLastError()<<"\n"; wcout << servername << "\n";//vom Compiler markiert } In read_serverlist.h #pragma once class read_serverlist { public: read_serverlist(void); static wchar_t *read_serverlist::give_data(void); static wchar_t *servername; wchar_t login_user[50]; wchar_t password[50]; wchar_t source_txt[50]; wchar_t destination_txt[50]; wchar_t destination_folder[50]; public: ~read_serverlist(void); }; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 5. Februar 2009 Teilen Geschrieben 5. Februar 2009 In meinem Fall leider nicht. Deswegen hatte ich auf catch gehofft. Du hast da eine Access violation, die kannst du laut Standard sowieso nicht mit try/catch fangen (obwohl MSVC das trotzdem kann). Aber das solltest du nicht tun. Statt dessen solltest du rausfinden, wo du da einen Nullzeiger benutzt. Denn genau das ist das Problem: Access violation writing location 0x00000000. Vielleicht wäre es mal an der Zeit, den Debugger anzuwerfen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 5. Februar 2009 Autor Teilen Geschrieben 5. Februar 2009 Hallo, ich hatte in der Zwischenzeit noch eine andere Lösung probiert.Ich erzeuge ein Objekt und greife anschließend auf die Eigenschaft zu. Dann brauche ich ja nicht mit static und so weiter tricksen. Wenn ich statt wchar_t int verwende funktioniert es auch. Bei wchar_t wird wird jedoch nichts ausgegeben. read_serverlist::read_serverlist(void) { GetPrivateProfileString(szSectionName, szKeyName_s, DefaultValue, servername, (sizeof(servername))/(sizeof(wchar_t)), szFilename); cout << GetLastError()<<"\n"; wcout << servername << "\n"; //Hier wird noch richtig ausgegeben } wchar_t read_serverlist::give_data(void) { cout << "test"; //ausgegeben return servername[250]; } Aufrudende Umgebung read_serverlist LeseListe; wcout << LeseListe.give_data();//Hier wird nichts ausgegeben, bei int als Rückgabe funktioniert es jedoch In read_serverlist.h #pragma once class read_serverlist { public: read_serverlist(void); wchar_t read_serverlist::give_data(void); wchar_t servername[250]; //bei Eigenschaft als int funktioniert wchar_t login_user[250]; wchar_t password[150]; wchar_t source_txt[150]; wchar_t destination_txt[250]; wchar_t destination_folder[250]; public: ~read_serverlist(void); }; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 5. Februar 2009 Teilen Geschrieben 5. Februar 2009 wchar_t ist nur ein einzelnes Zeichen. Und servername[250] ist die Speicherstelle hinter dem Array. Der gültige Index geht nur bis 249. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 5. Februar 2009 Autor Teilen Geschrieben 5. Februar 2009 (bearbeitet) Also ich habe jetzt eine Lösung gefunden. Wußte gar nicht, dass ich bei öffentlichen Eigenschaften auch direkt zugreifen kann. aufrufende Umgebung: wcout << LeseListe.servername; Dann nrauche ich ja überhaupt keine extra Funktion zum ausgeben. Auch wenn mich interessieren würde, wie ich hier ein gesamtes Array übergeben kann. Muss ja irgendwie die Adresse eines Zeiger auf die entsprechende Eigeschaft sein, oder? Bearbeitet 5. Februar 2009 von wulfgang Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 5. Februar 2009 Teilen Geschrieben 5. Februar 2009 Also ich habe jetzt eine Lösung gefunden. Wußte gar nicht, dass ich bei öffentlichen Eigenschaften auch direkt zugreifen kann.Public Member sind keine Lösung, sondern ein Bruch der Kapselung. Dann nrauche ich ja überhaupt keine extra Funktion zum ausgeben.Und auch keine zum Ändern Jede Klasse kann darin rumwurschteln, wie sie will. Dann kannst du auch gleich globale Variablen benutzen. Auch wenn mich interessieren würde, wie ich hier ein gesamtes Array übergeben kann.Was meinst du jetzt mit "hier"? Eine Funktion kann kein Array zurückgeben. Vielleicht solltest du mal von char-Arrays weg hin zu Stringklassen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 5. Februar 2009 Teilen Geschrieben 5. Februar 2009 Dann kannst du auch gleich globale Variablen benutzen. Bring ihn nicht auf Ideen... Eine Funktion kann kein Array zurückgeben Aber einen Zeiger. Wobei, Stringklassen sind hier wirklich besser. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 5. Februar 2009 Autor Teilen Geschrieben 5. Februar 2009 Ich lasse das mit den Stringklassen glaube ich erst mal lieber sein. Wird sonst noch komplöizierter:confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.