|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
|
[C++] Programmazione su più file
Ho qualche problema con la programmazione su più file. Io ho scritto un programma semplicissimo che legge il contenuto di un array, mettendo su un file chiamato file1.cc il main e sul file header funzioni.h le funzioni che il main utilizzerà.
Questo è il file1.cc Codice:
using namespace std; #include<iostream> #include "funzioni.h" int main(){ int array[4]={1,2,3,4}; stampa(array,4); } Codice:
#ifndef FUNZIONI_H #define FUNZIONI_H using namespace std; #include<iostream> void stampa(int array[], int dim){ for (int i=0; i<dim; i++) cout << array[i] << endl; } #endif Codice:
g++ file1.cc funzioni.h Codice:
./a.out Il problema è che nei file di esercizio (che per essere precisi riguardano la gestione di stack, code ed alberi) viene richiesta la creazione di un file di estensione .o! Io non ho idea di come si faccia a fare, nè come funzioni..qualcuno che mi sa aiutare gentilmente? ![]() |
![]() |
![]() |
![]() |
#2 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
solo un appunto: nella lista dei files che passi nell'invocazione al compilatore NON INCLUDERE ASSOLUTAMENTE PER NESSUNISSIMO MOTIVO gli headers; Gesu Bambino piange per queste cose.
invoca usando solo i sorgenti, cosi: Codice:
g++ file1.cc |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Le dichiarazioni di funzioni e di classi vanno messe in file header .h o .hpp.
Le implementazioni delle funzioni e delle classi vanno messe in file .cpp o .cc. Se si usano i template l'implementazione va messa nel file header. Non si includono mai file .cpp con la direttiva #include (in questo caso è come se tu includessi un file .cpp). |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
|
ehm, sig. Schuldiner, non ho mica capito cosa vuoi dirmi col tuo post..
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
![]() Che non bisogna mischiare la dichiarazione delle funzioni con l'implementazione. Devi creare 3 file: funzioni.h Codice:
#ifndef FUNZIONI_H #define FUNZIONI_H using namespace std; void stampa(int array[], int dim); #endif Codice:
#include "funzioni.h" #include <iostram> using namespace std; void stampa(int array[], int dim){ for (int i=0; i<dim; i++) cout << array[i] << endl; } Codice:
#include<iostream> #include "funzioni.h" using namespace std; int main(){ int array[4]={1,2,3,4}; stampa(array,4); } g++ -c file1.cc -o file1.o g++ file1.o funzioni.o -o eseguibile oppure g++ -c funzioni.cc -o funzioni.o g++ file1.cc funzioni.o -o eseguibile oppure g++ file1.cc funzioni.cc -o eseguibile |
|
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
|
uhm ok, mi pare di esserci..
rimane il mistero del file .o: da dove viene fuori? colo creo e lo eseguo? a che serve? |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
g++ -c funzioni.cc -o funzioni.o
![]() |
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
|
uhm, si tratta quindi semplicemente di cambiare il nome all'eseguibile, anzichè a.out in quello che voglio io?
immagino quindi che si esegua con Codice:
./funzione.o |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
No, quello non si esegue è un file oggetto. Cioè è un file che è passato dal compilatore, ma non dal linker (nota l'opzione -c al compilatore).
Codice:
-c Compile or assemble the source files, but do not link. The linking stage simply is not done. The ultimate output is in the form of an object file for each source file. By default, the object file name for a source file is made by replacing the suffix .c, .i, .s, etc., with .o. Unrecognized input files, not requiring compilation or assembly, are ignored. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:03.