Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Quelltextaufteilung in mehrere Dateien

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
06.03.2016, 15:43 Uhr
Bfmg2016



Hallo,

ich habe folgendes Problem:
Ich habe ein Programm in C++ geschrieben mit verschiedenen Funktionen (Grundrechenarten, Prozentrechnung, Primzahlen, etc.) welche jeweils seperat in einer extra Datei geschrieben sind. Diese werden dann von der "main.cpp" aufgerufen und der darin enthaltende Quellcode wird ausgeführt. Soweit so gut... Jetzt würde ich aber gerne das Programm so haben, dass nach der Ausführung einer Funktion (z.B. "grundrechenarten.cpp") wieder zurück zur "main.cpp" gesprungen wird und der Quellcode dort weiter ausgeführt wird.
Kann mir da jemand einen Tipp geben, welchen Befehl ich dazu benötige? Vielen Dank im vorraus!

Gruß
Bfmg2016
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.03.2016, 00:14 Uhr
Hans
Library Walker
(Operator)


Hi,

wenn Du Dein Programm richtig modular aufgebaut hast, dann wird am Ende wieder der Code aus der main-Funktion aufgerufen. Wenn da allerdings nur noch ein return 0; steht, ist die main-Funktion falsch entworfen. In dem Fall wäre es sinnvoll, das Programm als Schleife zu gestalten.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.03.2016, 07:49 Uhr
ao

(Operator)


grundrechenarten.cpp ist ja keine Funktion, sondern eine Quellcode-Datei, die Funktionen enthält (vermute ich mal). Wie die Dateien heißen, ist grundsätzlich egal, der Linker sammelt alles, was ihm übergeben wird zu einem Code-Haufen zusammen und baut daraus das Programm.

Was genau meinst du mit "zurückkehren"? Wenn du eine Funktion aus "grundrechenarten" aufgerufen hast, kehrt das Programm am Ende dieser Funktion IMMER an die Stelle zurück, von der aufgerufen wurde. Es sei denn, du hast überhaupt keine Funktion gerufen, sondern mit goto hantiert, oder du hast den Stack manipuliert und die Rücksprungadresse verändert (aber das ist Stoff für Hacker, nicht für Anfänger).

Zeig mal ein Stück von deinem Code, z.B. die main-Funktion, die eine Grundrechenart aufruft, und die entsprechende Grundrechen-Funktion.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.03.2016, 13:46 Uhr
Bfmg2016



Vielen Dank für die Antworten.

Ich werde heute Abend, sobald ich zuhause bin, den Quellcode hier zeigen.
Ich denke mal anhand eines Quellcodes lässt sich das ganze besser beschreiben.

Gruß
Bfmg2016
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.03.2016, 18:43 Uhr
Bfmg2016



Hallo zusammen,

hier nun einige Quellcodes:

main.cpp:

C++:
#include <iostream>
#include <stdlib.h>
#include "grundrechenarten.h"
#include "prozentrechnung.h"
#include "countdown.h"
#include "primzahlen.h"
#include "flaechenberechnung.h"
#include "umfang.h"
#include <string>
#include <windows.h>
using namespace std;

int main(void)
{
    string auswahl;
    string wdh;
    
    cout << "\n Modus: ";
    getline(cin, auswahl);
    
    if(auswahl=="grundrechenarten")
    {
        Sleep(1000); system("cls");
        grundrechenarten();
        
        cin.get();
        return EXIT_SUCCESS;
    }
    else if(auswahl=="prozent" || auswahl=="prozentrechnung")
    {
        Sleep(1000); system("cls");
        prozentrechnung();
        
        cin.get();
        return EXIT_SUCCESS;
    }
    else if(auswahl=="countdown")
    {
        Sleep(1000); system("cls");
        countdown();
        
        cin.get();
        return EXIT_SUCCESS;
    }
    else if(auswahl=="primzahlen")
    {
        Sleep(1000); system("cls");
        primzahlen();
        
        cin.get();
        return EXIT_SUCCESS;
    }
    else if(auswahl=="flaechenberechnung" || auswahl=="Flaechenberechnung" || auswahl=="flaeche" || auswahl=="Flaeche")
    {
        Sleep(1000); system("cls");
        flaechenberechnung();
        
        cin.get();
        return EXIT_SUCCESS;
    }
    else if(auswahl=="umfang" || auswahl=="Umfang" || auswahl=="umfang berechnen" || auswahl=="Umfang berechnen")
    {
        Sleep(1000); system("cls");
        umfang();
        
        cin.get();
        return EXIT_SUCCESS;
    }
    
    cout << "\n main " << endl;
    getchar();
}


grundrechenarten.cpp:

C++:
#include <iostream>
#include "grundrechenarten.h"
#include <windows.h>
using namespace std;

void grundrechenarten(void)
{
    int z1, z2, e;
    char op;
    
    cout << "\n Grundrechenarten -> Rechnung: ";
    cin >> z1 >> op >> z2;
    
    switch (op)
    {
        case '+':
            {
                Sleep(1000); system("cls");
                cout << "\n\t Ihre Rechnung: " << z1 << op << z2 << endl;
                e=z1+z2;
                cout << "\n\t Das Ergebnis ist: " << e << endl;
            }
        break;
        case '-':
            {
                Sleep(1000); system("cls");
                cout << "\n\t Ihre Rechnung " << z1 << op << z2 << endl;
                e=z1-z2;
                cout << "\n\t Das Ergebnis ist: " << e << endl;
            }
        break;
        case '*':
            {
                Sleep(1000); system("cls");
                cout << "\n\t Ihre Rechnung: " << z1 << op << z2 << endl;
                e=z1*z2;
                cout << "\n\t Das Ergebnis ist: " << e << endl;
            }
        break;
        case '/':
            {
                Sleep(1000); system("cls");
                cout << "\n\t Ihre Rechnung " << z1 << op << z2 << endl;
                e=z1/z2;
                cout << "\n\t Das Ergebnis ist: " << e << endl;
            }
        break;
        default:
        {
            cout << "\n\t\t Fehler im Programm! Bitte erneut versuchen!" << endl;
        }    
    }
}


Das Programm ist ansonsten voll funktionsfähig, nur das der Quellcode in der "main.cpp" nach Aufruf von "grundrechenarten.cpp" nicht weiter ausgeführt wird.

Gruß
Bfmg2016
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.03.2016, 19:39 Uhr
~f.-th.
Gast


Mal sehen ob ich das ohne Vorschau hin bekomme?




C++:
#include <iostream>
#include <stdlib.h>   // dieser C-Header sollte in einem C++ Quelltext nicht vorkommen
#include "grundrechenarten.h"
#include "prozentrechnung.h"
#include "countdown.h"
#include "primzahlen.h"
#include "flaechenberechnung.h"
#include "umfang.h"
#include <string>
#include <windows.h>
using namespace std;

int main(void)
{
    string auswahl;
    string wdh;
    
    cout << "\n Modus: ";
    getline(cin, auswahl);
    
    if(auswahl=="grundrechenarten")
    {
        Sleep(1000); system("cls");  // diese Zeile hast du nach jedem if
              // Überlege ob du die woanders positioniert, nur einmal benötigst
        grundrechenarten();
        
        cin.get();  // Hier das gleiche => woanders hin, dann brauchst du es nur ein mal
        return EXIT_SUCCESS;  // typisches C - willst du hier schon aufhören?
    }
    else if(auswahl=="prozent" || auswahl=="prozentrechnung")
    {
        Sleep(1000); system("cls");
        prozentrechnung();
        
        cin.get();
        return EXIT_SUCCESS;
    }
    else if(auswahl=="countdown")
    {
        Sleep(1000); system("cls");
        countdown();
        
        cin.get();
        return EXIT_SUCCESS;
    }
    else if(auswahl=="primzahlen")
    {
        Sleep(1000); system("cls");
        primzahlen();
        
        cin.get();
        return EXIT_SUCCESS;
    }
    else if(auswahl=="flaechenberechnung" || auswahl=="Flaechenberechnung" || auswahl=="flaeche" || auswahl=="Flaeche")
    {
        Sleep(1000); system("cls");
        flaechenberechnung();
        
        cin.get();
        return EXIT_SUCCESS;
    }
    else if(auswahl=="umfang" || auswahl=="Umfang" || auswahl=="umfang berechnen" || auswahl=="Umfang berechnen")
    {
        Sleep(1000); system("cls");
        umfang();
        
        cin.get();
        return EXIT_SUCCESS;
    }
    
    cout << "\n main " << endl;  // ich hoffe das dient nur als Hilfe bei der Entwicklung?
    getchar();
}


Ähnlich bei deinem Quelltext Grundrechenarten => bei gleicher oder gar besserer Funktion brauchst du etwa nur die Hälfte des Quelltextes, wenn die die Wiederholungen meidest.

Eventuell eine Schleife um die ganze Auswahl? Dann brauchst du das Programm nicht jedes mal neu starten.

Dies nur grob skizziert. Die Feinheiten überlassen wir dir.

Das Schlafen würde ich in einem C++ Quelltext auf Konsole zur Übung möglichst meiden - dann kannst du den Header auch gleich weg lassen.

MfG
f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.03.2016, 20:07 Uhr
Bfmg2016



Vielen Dank für die schnelle Antwort.

Zuerst einmal zu deinen Tipps bezüglich des kürzeren Quellcodes:

Ich muss dir recht geben, einige Zeilen hätte ich mir durch aus sparen können. Aber manchmal sieht man es erst auf den zweiten Blick oder durch einen Hinweis einem neutralen Programmierer - Vielen Dank dafür!

Die Schleife in der "main.cpp" wird auf jeden Fall noch eingefügt.

Der letzte "cout-" Befehl in der "main.cpp" dient, so wie du es gehofft hast, rein der Entwicklung. Ich wollte damit überprüfen ob das Programm nach Aufruf einer anderen Datei tatsächlich wieder in die "main.cpp" springt und den Quellcode ab der if-Schleife weiter ausführt - leider hat er dies gerade eben bei einem Test nicht gemacht.

Hier mal ein kleiner Programm-Ablauf-Plan, welchen ich auf die schnelle erstellt habe um mein Problem besser darzustellen.
Hier der Link zum Bild:

[/URL]


Gruß
Bfmg2016

Dieser Post wurde am 07.03.2016 um 20:11 Uhr von Bfmg2016 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.03.2016, 20:29 Uhr
ao

(Operator)



Zitat von Bfmg2016:
Das Programm ist ansonsten voll funktionsfähig, nur das der Quellcode in der "main.cpp" nach Aufruf von "grundrechenarten.cpp" nicht weiter ausgeführt wird.

Doch, wird es. Schau dir an, was du nach dem Aufruf noch programmiert hast: cin.get (also noch ein Zeichen abholen) und dann return EXIT_SUCCESS, also die Main-Funktion verlassen mit Rückgabe "Success". Das wird ausgeführt, und nach dem return aus der main() ist das Programm befehlsgemäß zuende.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.03.2016, 20:42 Uhr
Bfmg2016




Zitat:
Doch, wird es. Schau dir an, was du nach dem Aufruf noch programmiert hast: cin.get (also noch ein Zeichen abholen) und dann return EXIT_SUCCESS, also die Main-Funktion verlassen mit Rückgabe "Success". Das wird ausgeführt, und nach dem return aus der main() ist das Programm befehlsgemäß zuende.


Ich muss mich noch einmal für den Hinweis bedanken! Ich habe jetzt die Zeilen mit dem "cin.get();" sowie dem "return EXIT_SUCCESS" aus dem Quellcode entfernt und siehe da - es funktioniert so wie es soll.

Beim nächsten Problem gehe ich den Quellcode erst noch einmal in Ruhe durch und denke über die einzelnen Funktionen nach.

Gruß
Bfmg2016

Dieser Post wurde am 07.03.2016 um 20:47 Uhr von Bfmg2016 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: