Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - file sorgente e header c++
Forum - C/C++ - file sorgente e header c++

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
Venerba Mirco (Member)
Rookie


Messaggi: 29
Iscritto: 01/08/2016

Segnala al moderatore
Postato alle 16:43
Mercoledì, 07/09/2016
Questo topic è stato chiuso dal moderatore

buongiorno a tutti,
scs se rompo ogni giorno.
che differenza c'è tra sorgente c++ e file header?
poi qua sotto allego i vari file con del codice di cui avevo provato a collegarli insieme ma non ci sono riuscito.

io ho riscontrato un problema usando come ide dev-c++ e come errore mi da redefinition of struct caselladama e previus definition of struct caselladama,
qua sotto posto i relativi codici.

main.cpp
Codice sorgente - presumibilmente C/C++

  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<ctime>
  4. #include<windows.h>
  5. #include<string>
  6. #include"inizializza.h"
  7. #include"stampa.h"
  8.  
  9. using namespace std;
  10.  
  11. int main(){
  12.  caselladama matrice[8][8];
  13.  inizializzamatrice(matrice);
  14.  ciao();
  15.  return 0;
  16. }



inizializza.h
Codice sorgente - presumibilmente C++

  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<ctime>
  4. #include<windows.h>
  5. #include<string>
  6. #include"struttura.h"
  7.  
  8. using namespace std;
  9.  
  10. void inizializzacellavalida(caselladama matrice[8][8]){
  11.  for(int i=0; i<8; ++i){
  12.   for(int j=0; j<8; ++j){
  13.    if((i%2==0&&j%2==0)||(i%2!=0&&j%2!=0)){
  14.     matrice[i][j].cellavalida=true;
  15.    }
  16.    else{
  17.     matrice[i][j].cellavalida=false;
  18.    }
  19.   }
  20.  }
  21. }
  22.  
  23. void inizializzadamaopedina(caselladama matrice[8][8]){
  24.  for(int i=0; i<8; ++i){
  25.   for(int j=0; j<8; ++j){
  26.    matrice[i][j].damaopedina=false;
  27.   }
  28.  }
  29. }
  30.  
  31. void inizializzanumerogiocatore(caselladama matrice[8][8]){
  32.  for(int i=0; i<8; ++i){
  33.   for(int j=0; j<8; ++j){
  34.    if(i>=0&&i<=2&&matrice[i][j].cellavalida==true){
  35.     matrice[i][j].numerogiocatore=1;
  36.    }
  37.    else if(i>=5&&i<=7&&matrice[i][j].cellavalida==true){
  38.     matrice[i][j].numerogiocatore=2;
  39.    }
  40.    else{
  41.     matrice[i][j].numerogiocatore=0;
  42.    }
  43.   }
  44.  }
  45. }
  46.  
  47. void inizializzacampo(caselladama matrice[8][8]){
  48.  for(int i=0; i<8; ++i){
  49.   for(int j=0; j<8; ++j){
  50.    matrice[i][j].campo="          ";
  51.   }
  52.  }
  53. }
  54.  
  55. void inizializzamatrice(caselladama matrice[8][8]){
  56.  inizializzacellavalida(matrice);
  57.  inizializzadamaopedina(matrice);
  58.  inizializzanumerogiocatore(matrice);
  59.  inizializzacampo(matrice);
  60.  for(int i=0; i<8; ++i){
  61.   for(int j=0; j<8; ++j){
  62.    cout<<matrice[i][j].campo<<".";
  63.   }
  64.   cout<<endl;
  65.  }
  66. }



struttura.h
Codice sorgente - presumibilmente C/C++

  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<ctime>
  4. #include<windows.h>
  5. #include<string>
  6.  
  7. using namespace std;
  8.  
  9. struct caselladama{
  10.  bool cellavalida;
  11.  bool damaopedina;
  12.  int numerogiocatore;
  13.  string campo;
  14. };



stampa.h
Codice sorgente - presumibilmente C/C++

  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<ctime>
  4. #include<windows.h>
  5. #include<string>
  6. #include"struttura.h"
  7.  
  8.  
  9. using namespace std;
  10.  
  11.  
  12. void ciao(){
  13.  caselladama c;
  14.  for(int i=0; i<10; ++i){
  15.   cout<<i++;
  16.  }
  17. }



poi leggendo su internet ho letto che i file header servono solo per i prototipi mentre i file .cpp per le implementazioni. non so se abbia capito giusto però non riesco a metterlo in pratica su questo programma.
mi potete aiutare? grazie a chi mi risponde


Venerba Mirco
PM
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 16:49
Mercoledì, 07/09/2016
Testo quotato


poi leggendo su internet



Veramente ti hanno dato la risposta in

http://forum.html.it/forum/showthread.php?threadid=2943868 ...

E giustamente, devi scrivere il codice delle funzioni in file .cpp e lasciare solo le dichiarazioni nei file header.

Quindi ti basta usare un file

inizializza.cpp

e inserire il codice delle funzioni, così come

stampa.cpp


P.S. Ma scusa, nei tuoi dati risulta che hai una "buona conoscenza di c c++" ... ma mi sembra invece che non ne conosci neanche le basi. Non è un problema non conoscere, ma non scrivere il contrario ....


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM
Avatar
lumo (Member)
Expert


Messaggi: 416
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 16:51
Mercoledì, 07/09/2016
Ti consiglio di trovare un buon manuale di C o C++ perché queste sono le basi che devi sapere perfettamente se vuoi poter fare qualcosa con C o C++.

Comunque non c'è in realtà nessuna differenza tra file .h e .cpp, entrambi sono equivalenti.
Questo vuol dire che puoi compilare un .h, oppure includere un .cpp
Però per convenzione si considerano i .h come file da includere, contenenti solo le dichiarazioni, mentre i .cpp contengono le definizioni/implementazioni.
Infatti i .h si chiamano file di intestazione, mentre i .cpp file sorgente.

Detto questo, la seconda cosa che devi capire è come funziona #include. Molti linguaggi hanno i moduli e l'import al giorno d'oggi, ma C ai suoi tempi era molto meno sofisticato: il meccanismo di inclusione semplicemente ricopia tutto il file che specifichi dentro la direttiva include dentro al file dove usi #include.

Questo vuol dire che se includi due volte lo stesso file, oppure include due file che contengono le stesse intestazioni, avrai un errore dal compilatore per doppia dichiarazione, esattamente come succede a te.

Per risolvere questo problema si usano le include guards, oppure il pragma once. Prova a cercarli su google per capire come usarli.

PM
Avatar
Venerba Mirco (Member)
Rookie


Messaggi: 29
Iscritto: 01/08/2016

Segnala al moderatore
Postato alle 19:47
Mercoledì, 07/09/2016
di c++ ne so abbastanza, il problema è che la suddivisione in più sorgenti non l' avevo mai presa in considerazione


Venerba Mirco
PM
Avatar
Venerba Mirco (Member)
Rookie


Messaggi: 29
Iscritto: 01/08/2016

Segnala al moderatore
Postato alle 19:50
Mercoledì, 07/09/2016
ho provato a guardare le include guards ma non ci ho capito granchè. potete farmi un esempio rispetto al mio programma e funzionante cosi come inizio le guardo da la? grazie

Ultima modifica effettuata da Venerba Mirco il 07/09/2016 alle 20:52


Venerba Mirco
PM
Avatar
AldoBaldo (Member)
Expert


Messaggi: 347
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 21:07
Mercoledì, 07/09/2016
In ogni file di "include" (i file .h) definisci una macro/costante e imposti una condizione per il proprocessore, tale che il preprocessore stesso includa il file una sola volta. Tipo...

file pincopallo.h

Codice sorgente - presumibilmente C++

  1. #ifndef PINCOPALLO_H
  2. #define PINCOPALLO_H
  3.  
  4. // fai quello che devi qui in mezzo
  5.  
  6. #endif // fine #ifndef PINCOPALLO_H



In questo modo, quando viene incluso il file la prima volta viene definito PINCOPALLO_H, così che quando il preprocessore tenta di includere il file la seconda volta trova PINCOPALLO_H già definito e salta tutto quello che è compreso tra #ifndef PINCOPALLO_H e #endif, evitando il problema che stai incontrando.

A suo tempo, 'sta roba ha fatto impazzire pure me. E, lo ammetto, di quando in quando nei casi più complicati casco ancora in qualche trabocchetto. La classica sequenza di improperi, qualche minuto di analisi della situazione e ne esco, però che rabbia, quando capita!

Ultima modifica effettuata da AldoBaldo il 07/09/2016 alle 21:08


Ma cosa vuoi che ne sappia? Io ci gioco, col codice, mica ci lavoro!
PM
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:30
Mercoledì, 07/09/2016
Testo quotato

Postato originariamente da Venerba Mirco:

di c++ ne so abbastanza, il problema è che la suddivisione in più sorgenti non l' avevo mai presa in considerazione



No, non ne sai molto perché questa è roba di base del C, figurati del C++ ...

Testo quotato

Postato originariamente da Venerba Mirco:

ho provato a guardare le include guards ma non ci ho capito granchè. potete farmi un esempio rispetto al mio programma e funzionante cosi come inizio le guardo da la? grazie



Di nuovo ...

Prima di qualsiasi esempio, potresti provare a scrivere il codice in tanti file .cpp e compilarlo?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:56
Mercoledì, 07/09/2016
Testo quotato

Postato originariamente da AldoBaldo:
... evitando il problema che stai incontrando ...



Non è questo il caso. Al momento non serve gestire le multiple inclusioni. Il problema incontrato è solo relativo al fatto che ha inserito del codice nei file .h

Se studiasse un po' meglio il C, potrebbe scrivere quel codice in maniera corretta senza errori.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:00
Mercoledì, 07/09/2016
In pratica avrai un

main.cpp

Codice sorgente - presumibilmente C++

  1. #include "struttura.h"
  2. #include "inizializza.h"
  3. #include "stampa.h"
  4.  
  5. int main(){
  6.  caselladama matrice[8][8];
  7.  inizializzamatrice(matrice);
  8.  ciao();
  9.  return 0;
  10. }



un file

inizializza.cpp

Codice sorgente - presumibilmente C++

  1. #include<iostream>
  2. #include "struttura.h"
  3.  
  4. using namespace std;
  5.  
  6. void inizializzacellavalida(caselladama matrice[8][8]){
  7.  for(int i=0; i<8; ++i){
  8.   for(int j=0; j<8; ++j){
  9.    if((i%2==0&&j%2==0)||(i%2!=0&&j%2!=0)){
  10.     matrice[i][j].cellavalida=true;
  11.    }
  12.    else{
  13.     matrice[i][j].cellavalida=false;
  14.    }
  15.   }
  16.  }
  17. }
  18.  
  19. void inizializzadamaopedina(caselladama matrice[8][8]){
  20.  for(int i=0; i<8; ++i){
  21.   for(int j=0; j<8; ++j){
  22.    matrice[i][j].damaopedina=false;
  23.   }
  24.  }
  25. }
  26.  
  27. void inizializzanumerogiocatore(caselladama matrice[8][8]){
  28.  for(int i=0; i<8; ++i){
  29.   for(int j=0; j<8; ++j){
  30.    if(i>=0&&i<=2&&matrice[i][j].cellavalida==true){
  31.     matrice[i][j].numerogiocatore=1;
  32.    }
  33.    else if(i>=5&&i<=7&&matrice[i][j].cellavalida==true){
  34.     matrice[i][j].numerogiocatore=2;
  35.    }
  36.    else{
  37.     matrice[i][j].numerogiocatore=0;
  38.    }
  39.   }
  40.  }
  41. }
  42.  
  43. void inizializzacampo(caselladama matrice[8][8]){
  44.  for(int i=0; i<8; ++i){
  45.   for(int j=0; j<8; ++j){
  46.    matrice[i][j].campo="          ";
  47.   }
  48.  }
  49. }
  50.  
  51. void inizializzamatrice(caselladama matrice[8][8]){
  52.  inizializzacellavalida(matrice);
  53.  inizializzadamaopedina(matrice);
  54.  inizializzanumerogiocatore(matrice);
  55.  inizializzacampo(matrice);
  56.  for(int i=0; i<8; ++i){
  57.   for(int j=0; j<8; ++j){
  58.    cout<<matrice[i][j].campo<<".";
  59.   }
  60.   cout<<endl;
  61.  }
  62. }



un file

inizializza.h

Codice sorgente - presumibilmente C++

  1. void inizializzacellavalida(caselladama matrice[8][8]);
  2. void inizializzadamaopedina(caselladama matrice[8][8]);
  3. void inizializzanumerogiocatore(caselladama matrice[8][8]);
  4. void inizializzacampo(caselladama matrice[8][8]);
  5. void inizializzamatrice(caselladama matrice[8][8]);



un file

stampa.cpp

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include "struttura.h"
  3.  
  4. using namespace std;
  5.  
  6. void ciao(){
  7.  caselladama c;
  8.  for(int i=0; i<10; ++i){
  9.   cout<<i++;
  10.  }
  11. }



un file

stampa.h

Codice sorgente - presumibilmente C/C++

  1. void ciao();



e un file

struttura.h

Codice sorgente - presumibilmente C++

  1. #include <string>
  2.  
  3. using namespace std;
  4.  
  5. struct caselladama{
  6.  bool cellavalida;
  7.  bool damaopedina;
  8.  int numerogiocatore;
  9.  string campo;
  10. };



Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM
Pagine: [ 1 2 3 ] Precedente | Prossimo