PDA

View Full Version : [C++] Programmazione su più file


Cory
08-02-2009, 15:49
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
using namespace std;
#include<iostream>
#include "funzioni.h"

int main(){

int array[4]={1,2,3,4};

stampa(array,4);

}


e di seguito il funzioni.h
#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


compilo quindi con il comando
g++ file1.cc funzioni.h

ed eseguo con
./a.out

Il tutto funziona...e dov'è il problema allora?
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? :help:

71104
08-02-2009, 17:27
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:
g++ file1.cc

e lo stesso vale per quando compili in C col comando gcc.

cionci
08-02-2009, 17:38
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).

Cory
08-02-2009, 18:10
ehm, sig. Schuldiner, non ho mica capito cosa vuoi dirmi col tuo post..

cionci
08-02-2009, 19:35
ehm, sig. Schuldiner, non ho mica capito cosa vuoi dirmi col tuo post..
:ave:

Che non bisogna mischiare la dichiarazione delle funzioni con l'implementazione.

Devi creare 3 file:

funzioni.h
#ifndef FUNZIONI_H
#define FUNZIONI_H

using namespace std;

void stampa(int array[], int dim);

#endif


funzioni.cc
#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;
}


file1.cc
#include<iostream>
#include "funzioni.h"

using namespace std;

int main(){

int array[4]={1,2,3,4};

stampa(array,4);

}

g++ -c funzioni.cc -o funzioni.o
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

Cory
09-02-2009, 08:48
uhm ok, mi pare di esserci..
rimane il mistero del file .o: da dove viene fuori? colo creo e lo eseguo? a che serve?

cionci
09-02-2009, 08:50
g++ -c funzioni.cc -o funzioni.o

;)

Cory
09-02-2009, 10:46
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
./funzione.o

cionci
09-02-2009, 10:58
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).

-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.