Newsgroup: it.comp.lang.c++
Titolo: Classe e strutture [lungo][noioso]

Salve a tutti, vorrei chiedervi aiuto per un problema nel costruire una
classe (premetto che ancora non ho capito bene come funzionino (se qualcuno
conosce un tutorial...)).
Sapendo di non saper scrivere una classe, ho scritto prima tutto il codice
come funzioni, poi ho provato a inserire tutte le varie funzioni in un'unica
classe, ma quando compilo la funzione qui sotto che ha struct e puntatori dà
errore.. perchè? Che errore di sintassi sto facendo?? Se avete TANTA
pazienza, potreste sciogliere qualche dubbio vario disseminato nei commenti?
Vi ringrazio subito, sono ancora una capra a scrivere in c++...
PS: ho compilato il tutto con il dev
unsigned const int dimcol=7,outsider=12,dimmaz=40;     / / posso dichiararli
e definirli dentro il public?
class gioco {
 / / manca il costruttore?
private:
struct carta {
int numero;
int seme;};
struct col {
carta card;
col* succ;};
col* vett[];                               / / per dichiarare vett(dimcol)
devo usare un'altra funzione che la inizializzi
carta mazzo[] ;                        / / idem di sopra con patate (cioè
dimmaz)
public:
gioco();
 public:
void initmazzo (col*  []  , carta []);
col* creacolonna(int , carta [] );
int checkcarta(carta [] );
};
/ / questa è la classica funzione che crea liste( tanto x risparmiarvi tempo
a leggerlo)
/ / ed è quella che mi dà tutti i problemi (le altre con i puntatori e
strutture varie funzionano...)
col* gioco::creacolonna(int n, carta mazzo[]){           / / syntax error
bfore *
 col* inizio=NULL  ;                                                / / idem
col* succ;                                                                /
/idem
 int r;
 while (n>0)                                                            /
/parse error before "while"
 { r = checkcarta(mazzo);
   succ = new col;                                              / / 1) ANSI
c++ forbids
                                                                         /
/declaration 'succ' with no type
                                                                        /
/2)syntax error before ;
   succ->card.numero=mazzo[r].numero;            / /syntax error before ->
   succ->card.seme=mazzo[r].seme;                   / /idem
   succ->succ=inizio;                                          / /idem
   inizio = succ;                                        / / 1) ANSI c++
forbids
                                                                         /
/declaration 'succ' with no type
   mazzo[r].numero=0;
   n--;
 }
 return inizio;
 }
E infine...
1)Se più librerie che ho scritto richiedono, per esempio, iostream.h, devo
includere questo file in ogni libreria? (ho provato con il visual a mettere
ogni dichiarazione e include in 1 header e sembrava funzionare, ma il linker
del dev rigetta questa cosa, boooo)
2)il prog è un solitario che la grafica in ascii; una carta intera occupa
più di una riga, quindi per stamparla per intero, devo andare a capo; ma io
devo stampare più colonne di carte! C'è un modo per far tornare sopra il
cursore e scrivere il resto? o devo fare una funzione per spaccare una carte
in righe?
Vi ringrazio per l'attenzione e mi scuso di aver scritto un post così lungo
(e aver rubato tanto tempo), amen

Allora, ci sono diversi problemini ma partiamo dal dubbio più grande,
ovvero, perchè il metodo 'gioco::creacolonna' non compila correttamente.
Il problema sta nel fatto che la definizione del "tipo" di ritorno (col) è
privato della classe e quindi non può essere restituito all'esterno della
stessa da un metodo pubblico.
Il secondo problema è che sia la struttura 'col' che la struttura 'carta'
sono fondamentalmente SOLO strutture e non tipi di dato, infatti, se provi a
spostare la definizione della struttura 'col' all'esterno della classe e
ricompili, il messaggio d'errore che ti vien fuori è: 'carta' is used as a
type, but is not defined as a type, ovvero 'carta' viene utilizzato come
tipo ma non è stato definito come tale. Le dichiarazioni esatte, infatti
sono:
typedef struct tcarta
{
    int numero;
    int seme;
} carta;
typedef struct tcol
{
    carta card;
    tcol *succ;
} col;
Queste due dichiarazioni DEVONO essere definite in questo ordine ed esterne
alla classe dato che il tipo 'col' fa uso del tipo 'carta' ed inoltre viene
restituito all'esterno della classe da un metodo pubblico.
Il costruttore di una classe è quel metodo che non restituisce nulla (non
'void' ma nulla) ed ha lo stesso nome della classe, nel tuo caso 'gioco'.
Per quel che riguarda gli errori attribuiti al simbolo 'succ' nel metodo
'gioco::creacolonna' sono riferiti al fatto che 'succ' non ha tipo (il C++
come il C è molto pignolo), infatti va definito così:
col succ = new col;
grazie al fatto che ORA 'col' è diventato un tipo.
La domanda cira l'header 'iostream.h' non l'ho proprio capita comunque, se
le librerie sono diverse dovresti fornire header diversi ed in ognuno di
essi inglobare '#include <iostream.h>' (gli header fanno uso di direttive di
compilazione in modo tale che se un programma dovesse utilizzare due
librerie che includono la 'iostream' questa, in effetti, verrebbe inclusa
solo una volta).
La seconda domanda, invece ha una moltitudine di risposte, il fatto è che
non è molto semplice lavorare con il cursore (esistono comunque delle
funzioni C che ti permettono di posizionarlo dove ti pare nella matrice
80x25 dello schermo in modalità testuale) dovresti invece costruire un
vettore di 4000 (80x25x2) di tipo 'char' (meglio se 'unsigned char') e
mapparlo sulla memoria video testuale (a partire dall'indirizzo 0xB800) in
questo modo, ogni carattere scritto nel vettore verrà visualizzato a video
nella rispettiva posizione, ovvero, se scrivi un carattere nelle prime 80
posizioni pari di questo vettore, il carattere verrà scritto nella posizione
corrispondente sulla prima riga dello schermo, se lo scrivi nel vettore
nelle successive 80 posizioni pari lo scriverai nella corrispettiva
posizione ma sulla seconda riga e così via.
Un altro vantaggione di questo sistema è di poter precostruire in un vettore
le carte e quando se ne abbisogna, basta copiarle nella posizione desiderata
con una semplicissima istruzione 'memcpy'. Per cancellare i cartteri sullo
schermo basta scrivere il byte 0x0 (o l'eguale carattere '\0') nelle
posizioni da cancellare. Nelle posizioni dispari del vettore puoi scrivere
un valore (compreso tra 0 e 255) per stabilire il colore del carattere dello
sfondo ed il blinking (Ti consiglio di leggere un tutorial sulla memoria
video in modalità testo).
Ti allego una rivisitazione del tuo codice in modo corretto con tanto di
commenti (anche se pochi).
In bocca al lupo, Gaetano.
PS: Se vai su 
http://www.manuali.it
 troverai una marea di manuali sul C/C++.
-------
unsigned const int dimcol = 7, outsider = 12,dimmaz = 40;
// Con la direttiva typedef puoi dichiarare dei tipi di dato
typedef struct tcarta
{
 int numero;
 int seme;
} carta;
/* Dato che una struttura del tipo seguente utilizza un puntatore al suo
stesso tipo di
  dati (vedi Rif.1) alcuni compilatori ANSI C/C++ pretendono che il tipo di
dati venga
  dichiarato sempre prima del suo utilizzo, pertanto si deve dichiarare il
tipo con un
  nome simile a 'tcol' (t[nometipo]) e definire un "alias" con il nome
desiderato.     */
typedef struct tcol // Questo è il nome del tipo di dati
{
 carta card;
 tcol *succ; /* Rif.1 */
} col; // Questo è l'alias
class gioco
{
 private:
  col *vett[];
  carta mazzo[];
 public:
  gioco(); // Questo è il costruttore (ha lo stesso nome della classe)
  void initmazzo(col *[], carta []);
  col * creacolonna(int, carta []);
  int checkcarta(carta []);
};
gioco::gioco()
{}
void gioco::initmazzo(col *colonna[], carta mazzo[])
{}
col * gioco::creacolonna(int n, carta mazzo[])
{}
int gioco::checkcarta(carta cards[])
{}
int main(int argc, char *argv[])
{
 gioco *game = new gioco(); // Questa è una istanza della classe 'gioco'
}

G R A Z I E!!!!!!!!!!!!!!!!!
ps: grazie x il consiglio sulla memoria video in modalità testo: è ancora
fuori dalla mia portata, ma se  trovo un tutorial lo sbrano, ciao!

Felice d'esserti stato utile, sto comunque riesumando alcuni programmini
fatti da me sulla gestione degli interrupts e della memoria video (testo e
grafica) per prepararti qualcosa che ti illustri il funzionamento del
mappaggio, sempre se ti può esser utile o ti faccia piacere. Comunicami il
tuo indirizzo di posta elettronica così posso allegarti tutto a delle e-mail
(sul newsgroup non è possibile usare allegati).
Ciao.
"H.C.E." <b@b.b> ha scritto nel messaggio
news:jKgc8.71169$om6.1...@news1.tin.it...
