Runtimefehler MS Visual C++ Runtime Libray

Hallo an alle.
Ich habe hier ein Problem, das ich auch nach suchem im Internet nicht lösen kann.

Ich bin gerade dabei ein Programm zu entwerfen, das PersonenDaten speichert (Name, Geschlecht, Adresse, Emailadresse, Telefonnummer, Kommentar).

Die ganze Zeit(während ich andere Fehler behoben habe) ist dieser Fehler nicht gekommen.
Wenn ich es nun aber starte kommt dieser Fehler:
„This application has requested the Runtime to terminate it in an unusal way.“

Auf meinem PC habe ich Vista. Wenn ich das Programm unter XP starte, dann passiert gar nichts

Ich benutze Code::Blocks und MinGW

Hier ist der komplette Quellcode:

/*

Diese Programm dient zur Verwaltung von Personendaten.

Autor: Max Ploner
Max.Ploner-da.de

Version: alpha

*/

#include

#include

#include
#include
#include

#include
#include

#include

#define DATEINAME „PersonenDaten.dat“

using namespace std;

bool PersonenAnsicht = false;
int Index = -1;

static HWND hwnd, // Fenster
hwndCombo, // Listbox
hwndEdit, // Editfeld
hwndButtons[5]; // Buttons

// Personen

class tName
{
public:

tName()
{}

tName(char *name, char *vorname)
{
strncpy(Name, name, sizeof(Name));
strncpy(Vorname, vorname, sizeof(Vorname));
}
void set_Name(char *name, char *vorname)
{
strncpy(Name, name, sizeof(Name));
strncpy(Vorname, vorname, sizeof(Vorname));
}

void set_Name(char *name) {strncpy(Name, name, sizeof(Name));}

void set_Vorname(char *vorname) {strncpy(Vorname, vorname, sizeof(Vorname));}

char* get_name()
{
char *name;
strncpy(name, Name, sizeof(Name));
return name;
}
char* get_vorname()
{
char *name;
strncpy(name, Vorname, sizeof(Vorname));
return name;
}
char* get_full_name()
{
char buffer[65];
char *buffer_str;
sprintf(buffer, „%s %s“, Vorname, Name);
buffer_str=strdup(buffer);
return buffer_str;
}
void save(fstream *f)
{
f->write(Name, sizeof(Name));
f->write(Vorname, sizeof(Vorname));

}
bool load(fstream *f)
{
f->read(Name, sizeof(Name));
if (f->eof()) {return false;}
f->read(Vorname, sizeof(Vorname));
if (f->eof()) {return false;}
return true;
}

private:
char Vorname[32];
char Name[32];
};

class tAdresse
{
public :
tAdresse()
{
Hausnummer=0;
PLZ=0;
}

tAdresse(int hausnummer, char *strasse, char *stadt, int plz)
{
Hausnummer=hausnummer;
strncpy(Strasse, strasse, sizeof(Strasse));
strncpy(Stadt, stadt, sizeof(Stadt));
PLZ=plz;
}

void set_Adresse(int hausnummer, char *strasse, char *stadt, int plz)
{
Hausnummer=hausnummer;
strncpy(Strasse, strasse, sizeof(Strasse));
strncpy(Stadt, stadt, sizeof(Stadt));
PLZ=plz;
}

int get_Hausnummer() {return Hausnummer;}

char* get_Strasse() {
char *strasse;
strncpy(strasse, Strasse, sizeof(Strasse));
return strasse;
}

char* get_Stadt() {
char *stadt;
strncpy(stadt, Stadt, sizeof(Stadt));
return stadt;
}

int get_PLZ() {return PLZ;}

char* get_Adresse()
{
char buffer[76];
char *buffer_str;
sprintf(buffer, „%s %i\n%i %s“, Strasse, Hausnummer, PLZ, Stadt);
buffer_str=strdup(buffer);
return buffer_str;
}
void save(fstream *f)
{
char hn[2];
char plz[2];
hn[1]=(char) (Hausnummer & 0xFF);
hn[0]=(char) (Hausnummer write(hn, sizeof(hn));
f->write(Strasse, sizeof(Strasse));
f->write(Stadt, sizeof(Stadt));
f->write(plz, sizeof(plz));
}
bool load(fstream *f)
{
char hn[2];
char plz[2];

f->read(hn, sizeof(hn));
if (f->eof()) {return false;}
f->read(Strasse, sizeof(Strasse));
if (f->eof()) {return false;}
f->read(Stadt, sizeof(Stadt));
if (f->eof()) {return false;}
f->read(plz, sizeof(plz));
if (f->eof()) {return false;}

Hausnummer = (int) hn[1];
Hausnummer = (int) hn[0] >> 8;
PLZ = (int) plz[1];
PLZ = (int) plz[0] >> 8;
return true;
}

private:
int Hausnummer;
char Strasse[32];
char Stadt[32];
int PLZ;
};

class tPerson
{
public:

tPerson() {
Name = new tName();
Mutter = new tName("","");
Vater = new tName("","");
Adresse = new tAdresse(0,"","",0);
}

tPerson(char g, char *name, char *vorname) {
Name = new tName (name, vorname);
*Geschlecht = g;
Mutter = new tName("","");
Vater = new tName("","");
Adresse = new tAdresse(0,"","",0);
}

~tPerson() {delete Name;}

void set_name(char *name, char *vorname) {Name->set_Name(name, vorname);}

tName* get_Name() {return Name;}
tName* get_Mutter() {return Mutter;}
tName* get_Vater() {return Vater;}

void set_sex(char g) {*Geschlecht = g;}
char get_sex() {return *Geschlecht;}

void set_TelefonNummer(char *telefon) {
strncpy(TelefonNummer, telefon, sizeof(TelefonNummer));
}

char* get_TelefonNummer() {
char *telefon;
strcpy(telefon, TelefonNummer);
return telefon;
}

void set_email(char *email) {
strncpy(EmailAdresse,email,sizeof(EmailAdresse));
}

char* get_mail() {
char *email;
strcpy(email,EmailAdresse);
return email;
}

void set_Kommentar(char *kommentar) {
strncpy(Kommentar,kommentar,sizeof(Kommentar));
}

char* get_Kommentar() {
char *kommentar;
strcpy(kommentar,Kommentar);
return kommentar;
}

tAdresse *get_Adresse() {return Adresse;}

void show()
{
char *addr;
addr = Adresse->get_Adresse();
char *name=Name->get_full_name();
printf(„Name: %s\n\n“, name);
printf(„Geschlecht: %c\n\n“, *Geschlecht);
printf(„Adresse:\n%s\n\n“, addr);
printf(„Mutter: %s\n\n“, Mutter->get_full_name());
printf(„Vater: %s\n\n“, Vater->get_full_name());
printf(„Telefonnummer: %s\n\n“, TelefonNummer);
printf(„Email: %s\n\n“, EmailAdresse);
printf(„Kommentar: %s\n\n“, Kommentar);
}

void save(fstream *f)
{
Name->save(f);
f->write(Geschlecht, 1);
Adresse->save(f);
Mutter->save(f);
Vater->save(f);
f->write(TelefonNummer, sizeof(TelefonNummer));
f->write(EmailAdresse, sizeof(EmailAdresse));
f->write(Kommentar, sizeof(Kommentar));
}
bool load(fstream *f)
{
if (!(Name->load(f))) {return false;}
if (!(f->read(Geschlecht, 1))) {return false;}
if (!(Adresse->load(f))) {return false;}
if (!(Mutter->load(f))) {return false;}
if (!(Vater->load(f))) {return false;}
f->read(TelefonNummer, sizeof(TelefonNummer));
if (f->eof()) {return false;}
f->read(EmailAdresse, sizeof(EmailAdresse));
if (f->eof()) {return false;}
f->read(Kommentar, sizeof(Kommentar));
return true;
}

bool find(char *str)
{
string such_string = str;
transform(such_string.begin(), such_string.end(), such_string.begin(), ::tolower);
string test_string;

test_string = Name->get_full_name();
transform(test_string.begin(), test_string.end(), test_string.begin(), ::tolower);
if ((test_string.find(such_string)!=-1)) {return true;} // Name

test_string = Geschlecht;
transform(test_string.begin(), test_string.end(), test_string.begin(), ::tolower);
if ((test_string.find(such_string)!=-1)) {return true;} // Geschlecht

test_string = Adresse->get_Adresse(); // Adresse
transform(test_string.begin(), test_string.end(), test_string.begin(), ::tolower);
if ((test_string.find(such_string)!=-1)) {return true;}

test_string = Mutter->get_full_name(); // Mutter
transform(test_string.begin(), test_string.end(), test_string.begin(), ::tolower);
if ((test_string.find(such_string)!=-1)) {return true;}

test_string = Vater->get_full_name(); // Vater
transform(test_string.begin(), test_string.end(), test_string.begin(), ::tolower);
if ((test_string.find(such_string)!=-1)) {return true;}

test_string = TelefonNummer; // TelefonNummer
transform(test_string.begin(), test_string.end(), test_string.begin(), ::tolower);
if ((test_string.find(such_string)!=-1)) {return true;}

test_string = EmailAdresse; // EmailAdresse
transform(test_string.begin(), test_string.end(), test_string.begin(), ::tolower);
if ((test_string.find(such_string)!=-1)) {return true;}

test_string = Kommentar; // Kommentar
transform(test_string.begin(), test_string.end(), test_string.begin(), ::tolower);
if ((test_string.find(such_string)!=-1)) {return true;}

return false;
}

private:
tName *Name;
char *Geschlecht;
tName *Mutter;
tName *Vater;
tAdresse *Adresse;
char TelefonNummer[16];
char EmailAdresse[256];
char Kommentar[1024];
};

typedef list PersonList;
typedef PersonList::iterator PersonListIterator;
//typedef PersonList::reverse_iterator PersonListReverseIterator;

typedef list IteratorList;
typedef IteratorList::iterator IteratorListIterator;
//typedef IteratorList::reverse_iterator IteratorListReverseIterator;

PersonList PL;
IteratorList IL;

void Datei_auslesen()
{
printf(„Funktion ‚Datei_auslese()‘ aufgerufen.\n“);
fstream f(DATEINAME, ios::binary|ios::in);
if (f)
{
if (!(f.tellg()>0))
{
while(!f.eof())
{
tPerson *newPerson = new tPerson();
if (newPerson->load(&f)) {PL.push_back(newPerson);}
delete newPerson;
}
}
}
else {printf(„Fehler beim öffnen der Datei.\n“);}
f.close();
}

void Datei_speichern()
{
fstream f(DATEINAME, ios::out|ios::binary);
if (f)
{
for (PersonListIterator cur = PL.begin(); cur!=PL.end(); cur++)
{
(*cur)->save(&f);
}
}
f.close();
}

int suchen(char *suchstr, IteratorList *TrefferListe)
{
int anzahl=0;
for (PersonListIterator cur = PL.begin(); cur != PL.end(); cur++)
{
if ((*cur)->find(suchstr))
{
TrefferListe->push_back(cur);
anzahl++;
}
}
return anzahl;
}

// ---------------------------------------------

// Windows procedure deklarieren
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

// Unterfunktionen deklarieren
void suchen();

void anzeigen();
void bearbeiten();

void loeschen();

void neu();
void zurueck();

// Make the class name into a global variable
char szClassName[] = „App“;

int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)

{
printf(„Programm gestartet.\n“);
Datei_auslesen();

MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */

/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_VREDRAW | CS_HREDRAW; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);

/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
/* Use Windows’s default colour as the background of the window */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
return 0;

/* The class is registered, let’s create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
„Verwaltungs-Programm“, /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
640, /* The programs width */
480, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);

/* Make the window visible on the screen */
ShowWindow (hwnd, nCmdShow);

/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}

/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}

/* This function is called by the Windows function DispatchMessage() */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) // Nachrichten Auswertung
{
case WM_CREATE :

hwndCombo = CreateWindowEx (WS_EX_CLIENTEDGE,
„Listbox“, NULL,
WS_CHILD | WS_VISIBLE | LBS_STANDARD,
16, 24+16+24+8, 640-48, 256,
hwnd, (HMENU)1,((LPCREATESTRUCT) lParam)->hInstance, NULL);

hwndEdit = CreateWindowEx (WS_EX_CLIENTEDGE,
„Edit“, NULL,
WS_CHILD | WS_VISIBLE,
16, 16, 640-48, 24, hwnd, (HMENU)2,
(HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL);
char *Buttons[5];

Buttons[0]=„Suche“;
Buttons[1]=„Anzeigen“;
Buttons[2]=„Löschen“;
Buttons[3]=„Neuer Eintrag“;
Buttons[4]=„Beenden“;

for (int i=0; i hInstance, NULL);

}

SendMessage(hwndCombo, CB_SETCURSEL, 0, 0);

return 0 ;
case WM_DESTROY:
PostQuitMessage (0); // Programm beenden
break;
case WM_COMMAND:
{
if(LOWORD(wParam) == 1)
{
if (HIWORD(wParam) == LBN_DBLCLK)
{
if (PersonenAnsicht)
{
bearbeiten();
}
else
{
anzeigen();
}
}
}
else if(LOWORD(wParam) == 3)
{
suchen();
}
else if(LOWORD(wParam) == 4)
{
if (PersonenAnsicht)
{
bearbeiten();
}
else
{
anzeigen();
}
}
else if(LOWORD(wParam) == 5)
{
loeschen();
}
else if(LOWORD(wParam) == 6)
{
if (PersonenAnsicht)
{
zurueck();
}
else
{
neu();
}
}
else if(LOWORD(wParam) == 7)
{
PostQuitMessage (0); // Programm beenden
break;
}

return 0;
}
default: // Unbekannte / nicht behandelte Nachricht
return DefWindowProc (hwnd, message, wParam, lParam);
}

return 0;
}

void anzeigen()
{

int index;
char str[128];
index = SendMessage(hwndCombo, LB_GETCURSEL, 0, 0 );
if (index!=-1)
{
sprintf(str, „Ausgewählt: %i“,index);
MessageBox(hwnd,str,"",MB_OK | MB_ICONINFORMATION );
PersonenAnsicht = true;
SetWindowText(hwndButtons[1], „Bearbeiten“);
SetWindowText(hwndButtons[3], „Zurück“);
}

Index = index;
}

void bearbeiten()
{
int eintrag;
eintrag = SendMessage(hwndCombo, LB_GETCURSEL, 0, 0 );

if (eintrag!=-1)
{
char str[512];
char buffer[256];
GetWindowText(hwndEdit,buffer,sizeof(buffer));
sprintf(str, „Eintrag %i wird geändert nach %s.“, eintrag, buffer);
MessageBox(hwnd, str, „Bearbeiten“, MB_OK);
}
}

void loeschen()
{
if (!PersonenAnsicht)
{
int index;
char str[128];
index = SendMessage(hwndCombo, LB_GETCURSEL, 0, 0 );
if (index!=-1)
{
sprintf(str, „Ausgewählt: %i“,index);
MessageBox(hwnd,„Der Eintrag wird gelöscht“, „Löschen“, MB_OK);
MessageBox(hwnd,str,"",MB_OK | MB_ICONINFORMATION );
}
}
else
{
char str[128];
sprintf(str, „Ausgewählt: %i“,Index);
MessageBox(hwnd,„Der Eintrag wird gelöscht“, „Löschen“, MB_OK);
MessageBox(hwnd,str,"",MB_OK | MB_ICONINFORMATION );
}
}

void suchen()
{
char buffer[256];
GetWindowText(hwndEdit,buffer,sizeof(buffer));
printf(„Suche nach: %s\n“, buffer);
SendMessage(hwndCombo, LB_RESETCONTENT, 0, 0);
}

void neu()
{
MessageBox(hwnd,„Ein neuer Eintrag wird erstellt“, „Neuer Eintrag“, MB_OK);
tPerson *newPerson = new tPerson();
PL.push_back(newPerson);
Datei_speichern();
}

void zurueck()
{
PersonenAnsicht = false;
SetWindowText(hwndButtons[1], „Anzeigen“);
SetWindowText(hwndButtons[3], „Neuer Eintrag“);
Index = -1;
}>

Ja ich weiß, dass das Programm unübersichtlich ist, aber ich habe gerade erst mit Winapi angefangen.

Ich hoffe ihr könnt mir helfen.

Viele Grüße, MAX

Bei mir (Win 7 Ultimate x64, Code::Blocks, MinGW) läuft das Programm ohne Fehler. Ich kenne diesen Fehler ebenfalls von diversen eigenen Projekten, besonders dadurch, dass dieser Fehler während des Debuggens nicht auftritt, du ihn also selbst suchen musst. Bei mir lag es aber bisher immer noch an Arrayzugriffen über den reservierten Speicher hinaus. Ich hab mir deinen Quellcode zwar nicht genauer angesehen, aber überprüfe einmal alle Stellen, an denen du mit Zeigern oder dynamisch allokierten Speicher arbeitest. Gib dir vor solchen Befehlen mit printf irgendetwas in die Console aus (z.B. Zeilennummer, etc.) und versuche dadurch, die Zeile zu finden, in der der Fehler auftritt. Mehr kann ich dir leider nicht helfen =(

mfg dixxi

Naja, schade das es da keinen generellen Lösungsweg gibt, aber der Tipp (mit Arrays…) war nicht schlecht! Tatsächlich habe ich den Fehler relativ schnell gefunden. Ich braucht nochnichtmal Zeilennummern anzeigen lassen.

Der Fehler:

In der load-Funktion von tAdresse müssen die Arrays hn und plz freigegeben werden:

delete hn;
delete plz;

Nun klappt das prima.

Vielen Dank nochmal für deine Antwort, Max