Προς το περιεχόμενο

Βοήθεια για multiple cpp αρχεία


JohnnysR

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα παίδες,

 

Έχω μερικά αρχεία .cpp που έχουν δημιουργηθεί αυτόνομα και το καθένα κάνει διαφορετικά πράγματα..

 

Θα ήθελα να μάθω πως μπορώ να δημιουργήσω ένα καινούργιο αρχείο .cpp μέσα στο οποίο θα δημιουργήσω ένα μενού το οποίο ανάλογα με την επιλογή θα τρέχει το ανάλογο .cpp από τα παραπάνω..

 

Κοινώς πώς συνδέω όλα τα αρχεία μαζί σε ένα ενιαίο project, έχοντας τελικά μόνο ένα εκτελέσιμο αρχείο?

 

Thanks για κάθε βοήθεια!

Δημοσ.

Κάτσε λίγο, τον επί μέρους κώδικα λες ότι τον έχεις έτοιμο. Η ερώτηση είναι πως μπορείς σε ένα πρόγραμμα C++ να υλοποιήσεις μενού επιλογών; Μπερδεύτηκα!

 

Δε μπορείς στα επί μέρους cpp να μετονομάσεις τη συνάρτηση main π.χ. σε menu1, menu2,... αντίστοιχα και να κάνεις copy-paste τον κώδικα στο νέο σου πρόγραμμα;

Δημοσ.

Όντως δεν τα εξήγησα και πολύ καλα!

 

Καταρχάς τα .cpp τρέχουν σε console mode..Είναι αυτόνομα προγραμματα που κάνουν διαφορετικές εργασίες...Εκτός από την main το κάθε αρχείο έχει και πολλές συναρτήσεις..

 

Θα ήταν απλό να ενώσω όλα τα αρχεία σε ένα όπως μου προτείνεις (με αποτέλεσμα να ψιλοχαθώ λίγο από τις πολλές συναρτήσεις) αλλά θα ήθελα να μάθω αν υπάρχει τρόπος σε ένα καινούργιο αρχείο .cpp με μία switch για παράδειγμα ανάλογα με την επιλογή που θα δίνει ο χρήστης να τρέχει το ανάλογο αρχείο και αφού τελειώσει την εκτέλεση να επιστρέφει πάλι στο μενού...

Δημοσ.

Δεν είναι ανάγκη να ενώσεις όλα τα αρχεία σε ένα. Μπορείς όπως σου είπα να μετονομάσεις την κάθε main σε κάποιο custom όνομα συνάρτησης και στο κυρίως αρχείο θα κάνεις include τα επι μέρους cpp αρχεία.

 

Αν πάλι δεν το θες έτσι, μπορείς να κάνεις το εξής: για το κάθε αυτόνομο πρόγραμμα παράγεις το αντίστοιχο εκτελέσιμο. Στο πρόγραμμα-μενού, θα βάλεις την κατάλληλη switch, και κάθε case θα καλεί το αντίστοιχο υποπρόγραμμα ως εξωτερικό εκτελέσιμο με την system: http://cplusplus.com/reference/clibrary/cstdlib/system.html

Μειονέκτημα αυτής της μεθόδου: Για να έχεις μεταφερσιμότητα σε άλλο λειτουργικό σύστημα, πρέπει κάθε φορά να κάνεις build τα ξεχωριστά υπο-προγράμματα...

Δημοσ.

Ευχαριστώ για την βοήθεια :)

 

Προτίμησα την πρώτη μέθοδο όμως έχω ένα προβληματάκι..Αν αλλάξω όνομα στην main ενός αρχείου .cpp αυτομάτως στο compile παίρνω μηνύματα λάθους μιας και δεν υπάρχει πια main()..Τι πρέπει να κάνω?

Δημοσ.

Poio compiler xrhsimopoieis?

 

Me gcc gia paradeigma an exeis 3 arxeia C++, px first.cpp (contains main), second.cpp kai third.cpp kai 8eleis na ta "enoseis" (diladd na mporeis apo ena arxeio na kaleseis sunarthseis/antikeimena pou exei to allo) 8a prepei na trekseis ton compiler me thn entolh:

 

g++ first.cpp second.cpp third.cpp -o myprog

 

auto 8a dhmiourghsei ena ektelesimo arxeio myprog

Δημοσ.

Μπορείς να παραθέσεις τον αντίστοιχο κώδικα; Υποπτεύομαι ότι δεν έκανες παντού τις απαιτούμενες αλλαγές. Υπάρχει και ένας πιο τυπικός τρόπος να ενωθούν πολλά υπο-προγράμματα σε ένα, απαιτεί τη χρήση header files.

 

Παράδειγμα

Έστω ότι έχουμε το κυρίως πρόγραμμα myprogram.cpp, και χρησιμοποιεί τα υποπρογράμματα job1.cpp, job2.cpp. Στο job1.cpp ορίζεται επιπλέον μία συνάρτηση job1 (η παλιά του main) και ένας τύπος δεδομένων type1, ενώ στο job2.cpp αντίστοιχα τα job2, type2. Ο αντίστοιχος κώδικας θα έχει ως εξής:

 

>MYPROGRAM.CPP

#include <iostream>
#include <job1.hpp>
#include <job2.hpp>
...
...
int main(void) {
...
...
int reply = 0;

while(reply != 3) {
	cout << "Epilekste leitoyrgia:\n1. Job1\n2. Job2\n3. Eksodos\n";
	cin >> reply;
	switch(reply) {
		case 1:	job1(); break;
		case 2: job2(); break;
		case 3: break;
	}
}
...
...
return 0;
}

JOB1.HPP

#include "job1.cpp"
typedef {...}type1;

void job1(void);

JOB2.HPP

#include "job2.cpp"
typedef {...}type2;

void job2(void);

JOB1.CPP

// Ο παλιός κώδικας, μόνο που αντί για "void main(void) {...}" θα έχεις "void job1(void) {...}"

JOB2.CPP

// Ομοίως με JOB1.CPP

Δημοσ.

Χρησιμοποιώ Dev-C++ με τον default compiler, MingW32..

 

Έστω το κυρίως αρχείο που θα γίνει το menu:

 

> 
//data_structures.cpp
#include "1.cpp"

int main()
{
       menu1();
return 0;
}

 

Και ένα από τα αρχεία που θέλω να 'ενώσω'..

>
//1.cpp
#include <iostream>
#include <string>

using namespace std;

class myStack{
   public:
       char* sp;
       int maxSize;
       int topp;
   myStack(int s){
       ...
   }
   void push(char value){
       ...
   }
   char top(){
       ...
   }
   bool empty(){
      ...
   }
    void pop(){
       ...
   }
};

int protereotita (char ch);
int telestis (char ch);
int telesteos(char ch);

int menu1()
{
...
}
int protereotita (char ch)
{
   ...
}
int telestis (char ch)
{
  ...
}
int telesteos(char ch)
{
   ...
}

 

Έχω σβήσει τον κώδικα των συναρτήσεων για να μην είναι όλο το κατεβατό..

 

Με header files πως ακριβώς γίνεται η δουλειά???

Δημοσ.

Φίλε μου έκανα όλες τις απαραίτητες διορθώσεις αλλά από τον compiler συνεχίζω να παίρνω τα παρακάτω μηνύματα:

 

multiple definition of `menu()'

first defined here

multiple definition of `protereotita(char)'

first defined here

multiple definition of `telestis(char)'

first defined here

multiple definition of `telesteos(char)'

first defined here

ld returned 1 exit status

D:\...\Makefile.win [build Error] [data_structures.exe] Error 1

 

:(:(:(:(:(:(:(

Δημοσ.

Sorry parsifal αλλά δεν κατάλαβα,δηλάδη τι πρέπει να κάνω για να μην έχω πρόβλημα??Αν δεν τις δηλώσω στην αρχή έχω πάλι πρόβλημα...

Δημοσ.

Δικό μου λάθος, υπέθεσα ότι ακολουθείς το παράδειγμα με τα header files που έδωσα πιο πάνω και είχες βάλει αυτές τις δηλώσεις στο αντίστοιχο hpp αρχείο.

 

Δε μου λες, μήπως και στα υπόλοιπα αρχεία (2.cpp, 3.cpp κλπ) έχεις συναρτήσεις με ίδια ονόματα; (protereotita, telestis, telesteos)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...