Newsgroup: it.comp.lang.c++
Titolo: perchè declaration syntax error?

salve a tutti, semplicemente vorrei sapere perchè mi indica il suddetto
errore proprio sulla riga "int main() {", sarà sicuramente una fesseria ma
io non capisco.
#include <iostream.h>
#include "listamia.h"
int main() {
 int n, c, num;
 Lista corda;
   corda=crealista();
   cout << "quanti elementi vorrai inserire? \n";
   cin >> n;
   for (c=1; c>n; c++){
    cout << "che numero inserisci? \n";
      cin  >> num;
      inserisci(num);
      }
return 0;
}

 #include "listamia.h"
controlla che l'ultima dichiarazione di listamia.h abbia il ";"
finale,


 ha scritto nel messaggio
news:7_SY9.48368$YG2.1...@twister1.libero.it...
| "Ivan Sofa n.1" <dromeda...@inwind.itDELETE> ha scritto nel
| messaggio news:EJSY9.48982$ZE.13...@twister2.libero.it...
| > salve a tutti, semplicemente vorrei sapere perchè mi indica il
| suddetto
| > errore proprio sulla riga "int main() {", sarà sicuramente una
| fesseria ma
| > io non capisco.
| >
| >
| > #include <iostream.h>
| > #include "listamia.h"
|
| controlla che l'ultima dichiarazione di listamia.h abbia il ";"
| finale,
|
niente, ho controllato ma niente. l'errore persiste.
cosa mai può essere?
ivan

    for (c=1; c>n; c++){
non so soluzione per il tuo primo problemo, ma qui mi sembra che avrai un
altro :-)
        Ana

 ha scritto nel messaggio
news:b1125g$u3diu$1...@ID-173664.news.dfncis.de...

vabbè, capita di non premere bene lo shift.... :-)
anyway non sai come potrei risolvere il *vero* problema?
giuro che le sto provando tutte (per quel che la mia conoscenza mi
permette!)
ivan

 anyway non sai come potrei risolvere il *vero* problema?
fammi vedere "listamia.h", forse trovo una soluzione :-)
        Ana

 ha scritto nel messaggio
news:7_SY9.48368$YG2.1...@twister1.libero.it...
| "Ivan Sofa n.1" <dromeda...@inwind.itDELETE> ha scritto nel
| messaggio news:EJSY9.48982$ZE.13...@twister2.libero.it...
| > salve a tutti, semplicemente vorrei sapere perchè mi indica il
| suddetto
| > errore proprio sulla riga "int main() {", sarà sicuramente una
| fesseria ma
| > io non capisco.
ho risolto il problema ma ora vorrei una spiegazione "tecnica-teorica" sul
perchè.
in listamia.h si trovavano sia le dichiarazioni (in public) della classe
lista sia le definizioni delle stesse, ovviamente fuori dalla classe.
ho spostato queste ultime in un file chiamato listamia.cpp.
ora tutto va liscio (almeno come errori di sintassi!:-))
quindi deduco che in un .h non posso mettere alcun genere di definizione? è
così?
una risposta secca è anche gradita!
ivan

Questo è il codice di listamia.h
#ifndef LISTAMIA_H
#define LISTAMIA_H
#include "bottone.h"
#include <iostream>
class Lista{
   char nomelista[];
 Bottone *partenzaPTR;
   public:
   void crealista();
   bool listavuota();
   void inserisci(int);
   //int leggi();
   };
#endif
Questo invece è il codice di listamia.cpp
#include <iostream>
#include "listamia.h"
Bottone nodo;
void Lista::crealista(){
   cout << "inserisci il nome della lista: \n";
   cin >> Lista::nomelista;
   Lista::partenzaPTR= new Bottone;
   }
bool Lista::listavuota(){
   partenzaPTR->valore=0;
   }
void Lista::inserisci(int x){
 if (listavuota()) {
   partenzaPTR->valore=x;
   partenzaPTR->succPTR=new Bottone; }
   else {
   nodo.succPTR=new Bottone;
   nodo.valore=x;}
   }
ora il compilatore non da problemi per il precendete problema ma ora credo
giustamente non trova la definizione delle chiamate come crealista presenti
nel main, ovvero il codice dove inizialmente cis tava l'errore.
in conclusione: come faccio ad inserire il codice di un .cpp in un altro
.cpp come se fosse un header????
è una prassi buona?
help!
ivan

 è una prassi buona?
quello che hai fatto è giusto: dichiarazioni nei file header (.h) e
definizioni nei file .cpp. Generalmente se hai una classe chiamata
ListaMia crei due file, uno chiamato ListaMia.h e uno chiamato
ListaMia.cpp, nel primo ci vanno le dichiarazioni, quindi:
<file ListaMia.h>
#ifndef LISTAMIA_H
#define LISTAMIA_H
/**    non c'è bisogno di includere Bottone.h e iostream, per il primo
basta
        una forward declaration, per l'altro nessun problema, tanto
qui non lo usi
**/
class Bottone;
class Lista
{
public:
   void crealista();
   bool listavuota();
   void inserisci(int);
private:
    char nomelista[];
        /**    qui c'è un errore, come fa il compilatore a sapere
                la dimensione dell'array?
        **/
    Bottone* partenzaPTR;
};
#endif
</file ListaMia.h>
e poi la definizione in ListaMia.cpp
<file ListaMia.cpp>
/**    qui includi gli header che non avevi usato prima, nel file
header.
        Ti servono perchè qui i tipi devono essere completi (se li
usi, ovviamente),         ovvero il compilatore deve conoscerne
dimensioni e funzioni membro
**/
#include "ListaMia.h"
#include "Bottone.h"
#include <iostream>
etc. etc.
</file ListaMia.cpp>
ci penserà poi il linker a fare il resto...

 ha scritto nel messaggio
news:IeVY9.49017$YG2.1...@twister1.libero.it...
|
| "Ivan Sofa n.1" <dromeda...@inwind.itDELETE> ha scritto nel
| messaggio news:CvUY9.48805$YG2.1...@twister1.libero.it...
| >
|
| > ora il compilatore non da problemi per il precendete problema ma ora
| credo
| > giustamente non trova la definizione delle chiamate come crealista
| presenti
| > nel main, ovvero il codice dove inizialmente cis tava l'errore.
| >
| > in conclusione: come faccio ad inserire il codice di un .cpp in un
| altro
| > .cpp come se fosse un header????
| >
| > č una prassi buona?
|
| quello che hai fatto č giusto: dichiarazioni nei file header (.h) e
| definizioni nei file .cpp. Generalmente se hai una classe chiamata
| ListaMia crei due file, uno chiamato ListaMia.h e uno chiamato
| ListaMia.cpp, nel primo ci vanno le dichiarazioni, quindi:
|
| <file ListaMia.h>
|
| #ifndef LISTAMIA_H
| #define LISTAMIA_H
|
| /**    non c'č bisogno di includere Bottone.h e iostream, per il primo
| basta
|         una forward declaration, per l'altro nessun problema, tanto
| qui non lo usi
cosa sarebbe una forward declaration? probabilmente so cos'č ma non so che
si chiama cosě! :-)
ora provo tutto il resto, ti ringrazio infinitamente.
ivan

 ha scritto nel messaggio
news:IeVY9.49017$YG2.1...@twister1.libero.it...
CUT CUT CUT
|
| ci penserà poi il linker a fare il resto...
|
ecco, forse ci sono al grande dubbio.
nonostante quello che tu mi hai detto, nel main è evidente che il programma
principale .cpp non rileva le definizioni di listamia.cpp.
io uso Borland c++ 5.02 e questi errori mi escono quando uso "compile", devo
forse fare altro prima?
se in listamia.h metto l'include per iostream c'è bisogno, ad esempio, che
lo riscriva anche nel codice principale? non credo. Ma il compilatore non mi
riconosce i cout e cin.
scusa per le domande banali.
ivan


Ciao Ivan,
per quanto riguarda i cin ed i cout, nel C++ standard occorre che li fai
precedere da std::
per cui nel tuo codice dovrai mettere std::cout e std::cin (poi anche
std::endl , std::vector, std::string ecc..)
Per una spiegazione dovresti rivedere su un tutorial o su un libro la teoria
dei namespaces nel C++.
In alternativa (ad std::) puoi anche mettere all'inizio:
using namespace std;
Ma leggendo la teoria dei namespaces capirai anche perche' non e'
consigliato.
Maurus

 ha scritto nel messaggio
news:b11aqm$ucq8n$1...@ID-125555.news.dfncis.de...
|
| "Ivan Sofa n.1" <dromeda...@inwind.itDELETE> wrote in message
| news:XWVY9.49215$YG2.1...@twister1.libero.it...
| >
| > se in listamia.h metto l'include per iostream c'è bisogno, ad esempio,
che
| > lo riscriva anche nel codice principale? non credo. Ma il compilatore
non
| mi
| > riconosce i cout e cin.
| >
| > scusa per le domande banali.
| >
|
| Ciao Ivan,
|
| per quanto riguarda i cin ed i cout, nel C++ standard occorre che li fai
| precedere da std::
|
in altri file non ne ho avuto bisogno (con mia grande sorpresa) di scrivere
nè using namespaces std nè i vari std::
infatti nemmeno in questo caso poichè ho trovato il problema (era un altro)
però mi piacerebbe sapere perchè non ho mai avuto bisogno di scrivere quello
che mi hai indicato.
ivan


Probabilmente perche' il tuo compilatore per questa cosa non e' standard e
accetta cio' che non dovrebbe.
Per cui faresti bene anche se il tuo compilatore non dice nulla, a usare lo
stesso la modalita' standard, per non stare a cambiare i tuoi codici e le
tue abitudini in futuro.
Maurus

 scrivere quello che mi hai indicato.
probabilmente perchè usi
#include <iostream.h>
invece di
#include <iostream>
(e così per tutti gli altri header standard)
In pratica gli #include per la libreria standard del C++ sono tutti
senza il .h finale
Le implementazioni del C++ pre standard, invece, sono simili,
ma spesso gli include erano fatti con il .h (alla maniera del C,
diciamo)
La grossa differenza, di solito, è che gli include standard mettono
il loro contenuto all'interno del namespace std:: mentre quelli
pre-standard no.
Usare gli header pre-standard è però rischioso perchè non si
è sicuri del contenuto, che potrebbe variare da compilatore
a compilatore (e da versione a versione dello stesso compilatore).
Anzi, non è neppure detto che tali header vengano mantenuti nelle
future versioni dei compilatori.
Conclusione:
1- usare un compilatore il più aggiornato possibile
VC++.NET, gcc3.2, Borland C++ Compiler 5.6 sono buone scelte.
E i secondi due sono gratuiti (beh... il borland gratuito è il 5.5,
a dire il vero, ma se scarichi la demo del Builder 6, quando
scade ti lascia comunque la possiblità di usare ancora il
compilatore a linea di comando)
2- Attenersi il più possibile al C++ standard per poter fornire
codice portabile da una piattaforma all'altra e compilabile da
qualunque compilatore presente e futuro
ciao
--
Gerolamo