Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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.

Geschrieben
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.
Geschrieben
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";

}

Geschrieben
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?

Geschrieben
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.

Geschrieben
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);

};

Geschrieben
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.

Geschrieben

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);

};

Geschrieben (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 von wulfgang
Geschrieben
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.

Geschrieben
Dann kannst du auch gleich globale Variablen benutzen.

Bring ihn nicht auf Ideen... :rolleyes:

Eine Funktion kann kein Array zurückgeben

Aber einen Zeiger.

Wobei, Stringklassen sind hier wirklich besser.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...