7.3 Dynamische Speicherverwaltung
Das nun folgende Programmbeispiel unterscheidet sich ganz grundlegend von den bisherigen: Es besitzt ein "Graphical User Interface" (GUI), also eine grafische Benutzeroberfläche.
Mit dem Aufruf anwendung.exe erscheint diese und es können im Feld mit der Beschriftung a0..an Koeffizienten eines Polynoms eingegeben werden. dieses Polynom wird nach Betätigen des Knopfes "anzeigen!" dann in dem Bereich xmin bis xmax grafisch dargestellt.
Hie ein Screen-Shot:
Bild 7.3-1: Screenshot von anwendung.exe
Das Auslesen der Eingabefelder und die Berechnung der Funktionswerte, erfolgt in einer Funktion
void verarbeiten(std::string* texte,Doublevektor* xwerte, Doublevektor* ywerte) {...}
Diese befindet sich in der Datei "anwendung.cpp" und wird von dem Programmteil mit der GUI (minimal.cpp) aufgerufen, sobald der Schalter "anzeigen!" betätigt wird. Hier kann auch ein Programmierer Anpassungen vornehmen, der noch keine Ahnung von der Programmierung von Oberflächen hat, also auch jemand im ersten Semester der Informatik ;-)
Nach einer Modifikation des Programmteils "anwendung.cpp", kann dieser getrennt vom Rest compiliert werden und eine
so genannte Objekt-Datei anwendung.o mit dem Befehl "g++ -c anwendung.cpp" erzeugt werden. Diese
wird dann mit dem schon vorcompilierten Programmteil "minimal.o" verbunden, d.h. "dazu gelinkt".
Der Befehl hierfür lautet "g++.exe minimal.o minimal_private.res anwendung.o -o anwendung.exe usw. usw. usw. usw."
- vergleiche 002_linke_anwendung_dazu.bat. Damit das Linken funktioniert muss das Zusatzpaket
wxWidgets über den Package Manager in Bloodshed hinzu instaslliert worden sein.
Zum Programm:
Der Inhalt der Textfelder wird über einen Zeiger auf ein Array von strings übergeben, das den Namen "texte" hat. Die einzelnen Textfelder können damit ausgelesen und auch beschrieben werden.
Die 1000 X-Werte und Y-Werte zur Darstellung der Kurve, werden jeweils über einen Zeiger auf ein vector-Element vom Typ double übergeben. Da es sich nicht um ein vector-Element, sondern um einen Zeiger auf ein Vektor-Element handelt, kann der erste x-Wert z.B. nicht mit xwerte.at(0) angesprochen werden, sondern wird mit xwerte->at(0) oder mit (*xwerte).at(0) erreicht.
Hier nun das Listing von anwendung.cpp:
#include<string>
#include<vector>
#include <iostream>
#include <fstream>
#include <sstream>
#include "gemeinsamgenutzt.h"
#include "hilfsmethoden.h"
void verarbeiten(std::string* texte,Doublevektor* xwerte, Doublevektor* ywerte)
{
double xmin = atof(texte[0].data());
double xmax = atof(texte[1].data());
Doublevektor koeff;
Stringvektor skoeff = splitText(texte[4],' ');
for(int i=0;i<skoeff.size();i++)
koeff.push_back(atof(skoeff.at(i).data()));
//x-Werte im verlangten Definitionsbereich:
int anzahl = xwerte->size();
double danz = (double)anzahl;
for(int i=0;i<anzahl;i++)
xwerte->at(i) = xmin + ((double)i*(xmax-xmin))/(danz-1.0);
//y-Werte berechnen:
double x,y;
for(int i=0;i<anzahl;i++)
{
x = xwerte->at(i);
y = 0.0;
for(int potenz = koeff.size()-1;potenz>=0; potenz--)
{
y*=x;
y+=koeff.at(potenz);
}
ywerte->at(i) = y;
}
//ymin und ymax in Textfelder 3 und 4
double ymin = ywerte->at(0);
double ymax = ywerte->at(0);
for(int i=0;i<anzahl;i++)
if(ywerte->at(i)>ymax)
ymax = ywerte->at(i);
for(int i=0;i<anzahl;i++)
if(ywerte->at(i)<ymin)
ymin = ywerte->at(i);
std::stringstream st;
st<<ymin;
st>>texte[2];
st.clear();
st<<ymax;
st>>texte[3];
}
Code 7.3-1: C++ Programm "anwendung.cpp"
anwendung und minimal, .cpp,.o,.h und .exe - Dateien gepackt