Richiamo struct da c++ a c

di il
12 risposte

Richiamo struct da c++ a c

Salve a tutti, ho appena finito di scrivere un programma in C++ che legge un csv e ne salva alcuni valori in una struct. Ora dovrei richiamare questa struct in un programma C. Sto lavorando su linux tramite shell. Ho cercato in rete se fosse possibile e lo è ma non riesco a implementare la cosa. Il codice da cui parto è il seguente:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <algorithm>
using namespace std;

struct Buses{
	int maggiore[10005];
	int minore[10005];
}bus_scelti;
	
int main () {
//leggo il file csv
	string line,nomefile;
	ifstream myfile;
	cout << "Quale file si vuole aprire? " << endl;
	cin >> nomefile;
	myfile.open(nomefile.c_str());
	int uscita[2];
	int j=0;
	if (myfile.is_open()) {
		int primobus;
		int secondobus;
		cout << "Digitare il numero di uno dei due BUS sul quale si vuole eseguire l'operazione (1-9): " << endl;
		cin >> primobus;
		cout << "Digitare il numero di un secondo BUS sul quale si vuole eseguire l'operazione (1-9): " << endl;
		cin >> secondobus;
		int bus1_scelto;
		int bus2_scelto;
		while (getline(myfile,line)) {
			istringstream myline(line);
			string bus[10];
			for (int i=0; i<9; i++){
					getline(myline,bus[i+1],';');
				}
			
			for (int i=0; i<10; i++){
				if(i == primobus){
					int bus1_scelto_c = atoi(bus[i].c_str());
					bus1_scelto=bus1_scelto_c;
				}
				if(i == secondobus){
					int bus2_scelto_c = atoi(bus[i].c_str());
					bus2_scelto=bus2_scelto_c;
				}
			}
			uscita[0] = max(bus1_scelto,bus2_scelto);
			uscita[1] = min(bus1_scelto,bus2_scelto);
			bus_scelti.maggiore[j]=uscita[0];
			bus_scelti.minore[j]=uscita[1];
			j=j+1;
			
		}
			
	}
	
	cout << uscita[0]<<'\n'<<uscita[1]<<endl;
	cout << bus_scelti.maggiore[10004]<< '\n' << bus_scelti.minore[10004]<< endl;
	return 0;
}
In pratica nel programma C dovrei poter leggere i valori degli array "maggiore" e "minore" in modo da poterci eseguire delle operazioni. In teoria so che dovrei salvare tutto in una funzione, richiamare il file .cpp nel file .c e utilizzare extern "C" per poter richiamare. In pratica non riesco. Grazie a chiunque potesse aiutarmi.

12 Risposte

  • Re: Richiamo struct da c++ a c

    Non puoi compilare in C del codice C++

    Se vuoi unire i sorgenti devi scrivere in c++.
    Oppure modifichi il codice c++ in c e lo usi nel tuo programma
  • Re: Richiamo struct da c++ a c

    oregon ha scritto:


    Non puoi compilare in C del codice C++

    Se vuoi unire i sorgenti devi scrivere in c++.
    Oppure modifichi il codice c++ in c e lo usi nel tuo programma
    Sono sicuro che si possa fare (). Purtroppo il codice in C deve rimanere così perchè sto utilizzando una libreria che gira solo sotto C. Il problema è che non sono pratico del C e farei più fatica a riscrivere il codice C++ in C che a capire come fare a integrarli.
  • Re: Richiamo struct da c++ a c

    Quel codice è banale, lo porti in C in poco tempo. Se vuoi usare l'altra via, auguri
  • Re: Richiamo struct da c++ a c

    Kelkut ha scritto:


    oregon ha scritto:


    Non puoi compilare in C del codice C++

    Se vuoi unire i sorgenti devi scrivere in c++.
    Oppure modifichi il codice c++ in c e lo usi nel tuo programma
    Sono sicuro che si possa fare
    Ehhh... guarda... ne sono sicuro anche io.
    Una volta, tanto tanto tempo fa, i compilatori C++ non esistevano proprio, in realtà traducevano il codice C++... in C, che poi veniva compilato normalmente (una sorta di preprocessore, anche se in realtà compilatore vero e proprio).
    Ma parliamo da tanto, tanto tempo fa (quando il buon Stroustrup mi ha firmato la prima versione italiana del suo libro).
    Oggi è, come ti è stato fatto notare, follia pura, da adottare solo, e solamente, se non hai alternative (che nel 99.99999999999999999999999999% dei casi, ci sono)

    Ti segnalo che il programma che hai scritto non ha nulla di C++, è tutto C in cui usi "qualche" estensione di libreria.
    Puoi (ri)farlo in C in pochissimo tempo.
    Non basta scrivere cout qualcosa per aver scritto in C++

    Se hai tempo da perdere, ma cosa da imparare, prova Cfront e LLVM

    EDIT: eccolo!
    http://www.softwarepreservation.org/projects/c_plus_plus/cfront/release_e/src/cfront.pdf
    Notare anche i goto

    EDIT2:
    http://www.softwarepreservation.org/projects/c_plus_plus/cfront/release_e/src/
    per il "pacchetto" completo
  • Re: Richiamo struct da c++ a c

    +m2+ ha scritto:


    Kelkut ha scritto:


    oregon ha scritto:


    Non puoi compilare in C del codice C++

    Se vuoi unire i sorgenti devi scrivere in c++.
    Oppure modifichi il codice c++ in c e lo usi nel tuo programma
    Sono sicuro che si possa fare
    Ehhh... guarda... ne sono sicuro anche io.
    Una volta, tanto tanto tempo fa, i compilatori C++ non esistevano proprio, in realtà traducevano il codice C++... in C, che poi veniva compilato normalmente (una sorta di preprocessore, anche se in realtà compilatore vero e proprio).
    Ma parliamo da tanto, tanto tempo fa (quando il buon Stroustrup mi ha firmato la prima versione italiana del suo libro).
    Oggi è, come ti è stato fatto notare, follia pura, da adottare solo, e solamente, se non hai alternative (che nel 99.99999999999999999999999999% dei casi, ci sono)

    Ti segnalo che il programma che hai scritto non ha nulla di C++, è tutto C in cui usi "qualche" estensione di libreria.
    Puoi (ri)farlo in C in pochissimo tempo.
    Non basta scrivere cout qualcosa per aver scritto in C++

    Se hai tempo da perdere, ma cosa da imparare, prova Cfront e LLVM

    EDIT: eccolo!
    http://www.softwarepreservation.org/projects/c_plus_plus/cfront/release_e/src/cfront.pdf
    Notare anche i goto

    EDIT2:
    http://www.softwarepreservation.org/projects/c_plus_plus/cfront/release_e/src/
    per il "pacchetto" completo
    Ok. Proverò a riscriverlo allora, scrivo da pochissimo in questi linguaggi ed è tutto nuovo. Grazie per la cortese risposta
  • Re: Richiamo struct da c++ a c

    Vabbè tranquillo, se serve aiuto... in questo forum vedrai che una mano la rimedi!
  • Re: Richiamo struct da c++ a c

    Usare librerie C in C++ e' un'operazione che si puo' fare e viene fatta correntemente.
    MA la cosa NON E' banale: ci sono delle direttive SPECIFICHE del linguaggio, a supporto del compilatore, come ad esempio la
    
    extern "C" { ... }
    
    che probabilmente avrai gia' visto, ma se non l'hai vista, la trovi nei vari "stdio.h", ...

    Ora, usare oggetti del C++ in C non e' banale, perche' il compilatore C++ usa un formato dei nomi (detto "name mangling") che serve per poter usare il linker del C ma linkare la funzione con i parametri giusti. Ricorda che il C++ permette l'overlading delle funzioni/metodi/...

    Quindi, per poter usare delle strutture C++ in C hai due soluzioni:

    1) scoprire come il compilatore C++ chiama quella struttura, ma questo DIPENDE dal compilatore.
    2) convincere il compilatore C++ che quella struttura e' di tipo "C", scrivendo "extren "C" struct { ... }"

    (nota: ovviamente questo non sara' sufficiente, ma per iniziare potrebbe bastare)

    In ogni caso, poiche' il compilatore C++ FA MOLTI PIU' CONTROLLI di consistenza del compilatore "C", ANCHE se si scrive semplice codice "C", CONVIENE forzare l'uso del compilatore C++.
    Questo lo si fa BANALMENTE giocando con l'estensione del file, che deve essere ".cpp" oppure ".cxx".
  • Re: Richiamo struct da c++ a c

    migliorabile ha scritto:


    Usare librerie C in C++ e' un'operazione che si puo' fare e viene fatta correntemente.
    MA la cosa NON E' banale: ci sono delle direttive SPECIFICHE del linguaggio, a supporto del compilatore, come ad esempio la
    
    extern "C" { ... }
    
    che probabilmente avrai gia' visto, ma se non l'hai vista, la trovi nei vari "stdio.h", ...

    Ora, usare oggetti del C++ in C non e' banale, perche' il compilatore C++ usa un formato dei nomi (detto "name mangling") che serve per poter usare il linker del C ma linkare la funzione con i parametri giusti. Ricorda che il C++ permette l'overlading delle funzioni/metodi/...

    Quindi, per poter usare delle strutture C++ in C hai due soluzioni:

    1) scoprire come il compilatore C++ chiama quella struttura, ma questo DIPENDE dal compilatore.
    2) convincere il compilatore C++ che quella struttura e' di tipo "C", scrivendo "extren "C" struct { ... }"

    (nota: ovviamente questo non sara' sufficiente, ma per iniziare potrebbe bastare)

    In ogni caso, poiche' il compilatore C++ FA MOLTI PIU' CONTROLLI di consistenza del compilatore "C", ANCHE se si scrive semplice codice "C", CONVIENE forzare l'uso del compilatore C++.
    Questo lo si fa BANALMENTE giocando con l'estensione del file, che deve essere ".cpp" oppure ".cxx".
    Sto provando a linkare i due file c++ e c. Sono partito creando un header. Ho modificato il file di lettura in modo che salvi in una struct i miei risultati, richiamati poi dalla funzione get_buses indicata nell'header. Dovrei poi riuscire a richiamare i dati della struct nel programma in C. Nel programma C includo il file .h e nel main scrivo :
    Buses bus_scelti[10005];
    	get_buses(&bus_scelti);
    La compilazione del c++ va a buon fine. Quella del C no, mi da errore proprio in queste due righe che ho scritto. Premetto che non ho molta dimestichezza con i puntatori. Se qualcuno ci capisce qualcosa e potesse aiutarmi gliene sarei grato. Allego i codici del .h e del .cpp.

    Header
    typedef struct Buses{
     int maggiore;
     int minore;
    }Buses;
    
    extern "C"{
          extern void get_buses(Buses *);
    }
    File di lettura cpp
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <string>
    #include <algorithm>
    #include "lettura.h"
    using namespace std;
    
    void get_buses(Buses * bus_scelti){
    //leggo il file csv
    	string line,nomefile;
    	ifstream myfile;
    	cout << "Quale file si vuole aprire? " << endl;
    	cin >> nomefile;
    	myfile.open(nomefile.c_str());
    	//int uscita[2];
    	int j=0;
    	if (myfile.is_open()) {
    		int primobus;
    		int secondobus;
    		cout << "Digitare il numero di uno dei due BUS sul quale si vuole eseguire l'operazione (1-9): " << endl;
    		cin >> primobus;
    		cout << "Digitare il numero di un secondo BUS sul quale si vuole eseguire l'operazione (1-9): " << endl;
    		cin >> secondobus;
    		int bus1_scelto;
    		int bus2_scelto;
    		while (getline(myfile,line)) {
    			istringstream myline(line);
    			string bus[10];
    			for (int i=0; i<9; i++){
    					getline(myline,bus[i+1],';');
    				}
    			
    			for (int i=0; i<10; i++){
    				if(i == primobus){
    					int bus1_scelto_c = atoi(bus[i].c_str());
    					bus1_scelto=bus1_scelto_c;
    				}
    				if(i == secondobus){
    					int bus2_scelto_c = atoi(bus[i].c_str());
    					bus2_scelto=bus2_scelto_c;
    				}
    			}
    			//uscita[0] = max(bus1_scelto,bus2_scelto);
    			//uscita[1] = min(bus1_scelto,bus2_scelto);
    			bus_scelti[j].maggiore=max(bus1_scelto,bus2_scelto);
    			bus_scelti[j].minore=min(bus1_scelto,bus2_scelto);
    			j=j+1;			
    		}	
    	}
    }
  • Re: Richiamo struct da c++ a c

    È interessante osservare come non hai dato credito a quanto scritto.

    fondere c e c++ è (almeno) 100 volte più difficile (e rischioso per certi versi) rispetto a cambiare quel programmello.
    il tempo che stai impiegando (perdendo) con questi tentativi è (almeno) 10 volte maggiore di quello che impiegheresti a cambiare il programma.

    in sostanza è qualcosa del tipo "non ho voglia di imparare ad allacciarmi le scarpe, preferisco studiare come fare un trapianto di piede"
  • Re: Richiamo struct da c++ a c

    +m2+ ha scritto:


    è interessante osservare come non hai dato credito a quanto scritto.

    fondere c e c++ è (almeno) 100 volte più difficile (e rischioso per certi versi) rispetto a cambiare quel programmello.
    il tempo che stai impiegando (perdendo) con questi tentativi è (almeno) 10 volte maggiore di quello che impiegheresti a cambiare il programma.

    in sostanza è qualcosa del tipo "non ho voglia di imparare ad allacciarmi le scarpe, preferisco studiare come fare un trapianto di piede"
    A dire il vero mi è stato chiesto di procedere in questo modo. Sinceramente avrei preferito l'altra strada ma a questo punto ci provo e vedo di imparare qualcosa.
  • Re: Richiamo struct da c++ a c

    Kelkut ha scritto:


    A dire il vero mi è stato chiesto di procedere in questo modo. Sinceramente avrei preferito l'altra strada ma a questo punto ci provo e vedo di imparare qualcosa.
    Fai pure, ci mancherebbe altro.
    Però non imparerai nulla di utile, poichè quel programma è talmente banale (leggi: non ci sono classi) che l'elemento "didattico" è nullo.

    Se, al contrario, avessi un VERO programma C++ (cioè di media complessità, con classi ed oggetti in particolare,e overload), ALLORA imparare a "mergiarlo" col C avrebbe un suo vago interesse (assai tenue).
    Ma parliamo di un mesetto di studio (per coprire tutti i casi) vs 30 minuti.
    A me non è mai capitato di avere questa necessità, programmo in C da 34 anni e C++ da 28, ma tutto può accadere.

    Comunque, quando ci sarai riuscito, posta il risultato.
    Magari sarà utile per qualcun altro, in pieno "spirito forummistico"
  • Re: Richiamo struct da c++ a c

    Kelkut ha scritto:


    A dire il vero mi è stato chiesto di procedere in questo modo. Sinceramente avrei preferito l'altra strada ma a questo punto ci provo e vedo di imparare qualcosa.
    Da dove deriva questa necessità se non sono indiscreto?
Devi accedere o registrarti per scrivere nel forum
12 risposte