kramann.info
© Guido Kramann

Login: Passwort:










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:

anwendung.exe

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"