====== C++ Crashkurs / Übung 2 ======
Beispiele für einige "Fallen", die durch unachtsame Programmierung (in C) entstehen können. Später - mit darauf folgenden Beispielen wird gezeigt, wie man solche Fallen mit C++-Mittel aus dem Weg räumen kann.
**Ueb2a.h:**
// File : Ueb2a.h
//
#include "..\stdafx.h"
#include "Ueb2a.VerketteteListe.h"
int _ueb (int argc, _TCHAR* argv[])
{
// Liste von ints anlegen
// Positiv-Fall: alles richtig gemacht
LISTE* pListe = ErzeugeListe();
InitialisiereListe(pListe);
ElementAnhaengen(pListe, 4711);
ElementAnhaengen(pListe, 815);
ElementAnhaengen(pListe, 42);
std::cout << "Liste 1:" << std::endl;
for (LISTEN_ELEMENT* iter = pListe->pStart; iter != NULL; iter = iter->pNaechster)
{
std::cout << " " << iter->nInhalt << std::endl;
}
ListeFreigeben(pListe);
free(pListe);
// Böse 1: Liste nicht initialisiert
LISTE* pListe2 = (LISTE*) malloc(sizeof(LISTE));
ElementAnhaengen(pListe2, 4711);
// Böse 2: Liste ist NULL
LISTE* pListe3 = NULL;
ElementAnhaengen(pListe3, 4711);
// Böse 3: Listenelemente werden manipuliert
LISTE* pListe4 = ErzeugeListe();
InitialisiereListe(pListe4);
ElementAnhaengen(pListe4, 4711);
ElementAnhaengen(pListe4, 815);
ElementAnhaengen(pListe4, 42);
std::cout << "Liste 1 manipuliert:" << std::endl;
for (LISTEN_ELEMENT* iter = pListe4->pStart; iter != NULL; iter = iter->pNaechster)
{
iter->nInhalt += 9999;
iter->pNaechster = pListe4->pStart;
std::cout << " " << iter->nInhalt << std::endl;
}
return 0;
}
// EOF
**Ueb2a.VerketteteListe.h:**
// File : Ueb2a.VerketteteListe.h
//
struct LISTEN_ELEMENT
{
int nInhalt;
LISTEN_ELEMENT* pNaechster;
};
struct LISTE
{
LISTEN_ELEMENT* pStart;
};
LISTE* ErzeugeListe ()
{
LISTE* pListe = (LISTE*) malloc(sizeof(LISTE));
pListe->pStart = NULL;
return pListe;
}
void InitialisiereListe (LISTE* pListe)
{
pListe->pStart = NULL;
}
void ElementAnhaengen (LISTE* pListe, int nInhalt)
{
LISTEN_ELEMENT* pNeu = (LISTEN_ELEMENT*) malloc(sizeof(LISTEN_ELEMENT));
pNeu->pNaechster = NULL;
pNeu->nInhalt = nInhalt;
if (pListe->pStart == NULL)
{
pListe->pStart = pNeu;
}
else
{
LISTEN_ELEMENT* pLetztes = pListe->pStart;
while (pLetztes->pNaechster != NULL) pLetztes = pLetztes->pNaechster;
pLetztes->pNaechster = pNeu;
}
}
void ElementFreigeben (LISTEN_ELEMENT* pElement)
{
if (pElement->pNaechster != NULL) ElementFreigeben(pElement->pNaechster);
free(pElement);
}
void ListeFreigeben (LISTE* pListe)
{
ElementFreigeben(pListe->pStart);
}
// EOF
**Programm.cpp:** - Der Einstiegspunkt
// Programm.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "Ueb2a.h"
int _tmain (int argc, _TCHAR* argv[])
{
return _ueb(argc, argv);
}
// EOF
**stdafx.h:**
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#include "targetver.h"
#include
#include
// TODO: reference additional headers your program requires here
#include
#include
// EOF
**targetver.h:**
// Including SDKDDKVer.h defines the highest available Windows platform.
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
#pragma once
#include
----
Stand: 19.09.2014
--- //[[feedback.jk-wiki@kreick.de|: Jürgen Kreick]]//
EOF