Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - chiarimento sugli header e la divisione di codice tra più file
Forum - C/C++ - chiarimento sugli header e la divisione di codice tra più file

Avatar
GrG (Member)
Guru^2


Messaggi: 3430
Iscritto: 21/08/2007

Segnala al moderatore
Postato alle 22:14
Venerdì, 19/10/2012
Ciao!
con l'università stiamo iniziando a studiare C.. solo che ho un problema molto banale, ma che non riesco a risolvere

si tratta della divisione del codice tra più file. Io ho questo:

un file chiamato prova.c contenente questo codice:
Codice sorgente - presumibilmente C/C++

  1. #include <iostream.h>
  2. #include "file.h"
  3.  
  4. main() {
  5.         Funzione();
  6.         printf("fine!\n");
  7. }



un file chiamato file.c contenente questo:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include "file.h"
  3. void Funzione() {
  4.         int n;
  5.         printf("Scrivi un numero:");
  6.         scanf("%d", &n);
  7.         printf("\n\nOk, il numero che hai scritto è %d\n", n);
  8. }



ed infine file.h
Codice sorgente - presumibilmente C++

  1. #ifndef FILE_H
  2. #define FILE_H
  3. void Funzione();
  4. #endif



ora.. io utilizzo dev-c++ solo che mi da problemi a iostream.h perchè dice che non lo trova.. eppure sulle dispense del professore dove c'è uno pseudocodice di esempio questa libreria è presente.. ho provato pure solo con #include <iostream> ma non va uguale..

allora ho provato a compilare direttamente con gcc, all'inizio anche lui non trovava questa libreria.. poi scaricando il componente aggiuntivo g++ per il c++ che si è portato appresso altre librerie mi riconosce <iostream> (anche se non iostream.h e mi domando perchè no, e come mai mi riconosce iostream senza h che quindi non essendo un header non ho idea di cosa sia)

comunque sia, mi accetta iostream (nel senso che non mi da l'errore che non lo trova) ma mi dice che Funzione() è indefinita (segnalandomela nel main)

insomma, sono un pò confuso, chi mi spiega un attimo meglio come dichiarare iostream e come distribuire il proprio codice su più file? grazie :)

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 23:33
Venerdì, 19/10/2012

leggi questo: http://www.pierotofy.it/pages/extras/forum/2/79939-compila ...

cmq nei file .h si dichiarano i prototipi delle funzioni, nei file c/cpp le implementazioni :)

PM Quote
Avatar
GrG (Member)
Guru^2


Messaggi: 3430
Iscritto: 21/08/2007

Segnala al moderatore
Postato alle 9:50
Sabato, 20/10/2012
ho letto il topic da te linkato, in effetti dev-c++ non mi piaceva per niente vista la mancanza della tabulazione e per questo all'inizio ho usato direttamente il compilatore gcc.. solo che poi incappando in questo problema (sopra descritto) pensavo tipo che magari usando dev-c++ sarei riuscito a collegare tutti i file, ma tanto non mi ha funzionato uguale

riguardo la teoria più o meno ho capito che nei file .h vanno i prototipi e nei file .c vanno le implementazioni..

infatti in file.c ho implementato void Funzione() { //codice }

in file.h ho dichiarato void Funzione(); (se non mi sbaglio dovrebbe essere questo quello che si intende con il termine prototipo)

però mi da problemi e non capisco come mai.. mi sono basato sulle dispense del professore, però devo aver sbagliato da qualche parte senza essermene accorto e vorrei capire dove

sicuramente è un errore idiota che faccio, però avendo iniziato questo linguaggio dall'altro ieri sono in difficoltà xD


PM Quote
Avatar
carlduke (Member)
Pro


Messaggi: 153
Iscritto: 29/01/2011

Segnala al moderatore
Postato alle 12:41
Sabato, 20/10/2012
la questione e' abbastanza semplice :) suppongo che tu per  ompilare con g++ abbia dato la seguente istruzione

Codice sorgente - presumibilmente Plain Text

  1. g++ prova.c



questo non basta poiche' indicando a g++ solo il file del main, non trovera' poi'implementazione della funzione
(invece la dichiarazione la trova perche' il file prova.c include 'file.h')

per risolvere semplicemente indica a g++ il file che contiene l'implementazione vera e propria (quindi file.c)

Codice sorgente - presumibilmente Plain Text

  1. g++ prova.c file.c



cosi dovrebbe andare! ;)

ricordati che in un IDE questo viene fatto automaticamente, ma solo quando crei un progetto :k:

PM Quote
Avatar
GrG (Member)
Guru^2


Messaggi: 3430
Iscritto: 21/08/2007

Segnala al moderatore
Postato alle 21:47
Sabato, 20/10/2012
grazie mille!! ora funziona :D

pensavo che il compilatore in automatico prendesse tutti i files che gli servivano senza bisogno di dichiararglieli esplicitamente

ma ho notato che #include <iostream.h> non è comunque riconosciuto (ma levando questa riga di codice il tutto funziona).. a questo punto mi domando come mai il nostro prof. l'abbia inclusa nel suo pseudo-codice di esempio e a che cosa serva..

p.s. ho visto che hai usato g++ per compilare un progetto c, ma io uso gcc, è la stessa cosa? perchè g++ so che è per compilare progetti c++ ma se gli viene dato in input un sorgente c si comporta come il compilatore gcc?


PM Quote
Avatar
carlduke (Member)
Pro


Messaggi: 153
Iscritto: 29/01/2011

Segnala al moderatore
Postato alle 22:24
Sabato, 20/10/2012
allora intanto iostream.h e' deprecato, percio' includi iostream ;)

poi iostream fa parte delle librerie standard del c++ e per compilare progetti c++ usa g++

se il tuo era un progetto c, per potere usare le funzioni printf e scanf includi "stdio.h" e non iostream e per compilare usa gcc ;)

il fatto che poi un compilatore per c++ possa compilare codice  sorgente c semplicemente si spiega con il fatto che il c++ deriva dal c :k:

PM Quote