Newsgroup: it.comp.lang.c
Titolo: DJGPP; ma come cavolo...

Un saluto a tutti e scusate il titolo, ma qui c'è qualcosa che non
capisco proprio.
Allora: io uso il DJGPP, che continua a darmi sempre lo stesso errore
di compilazione nelle stesse condizioni, ma non riesco proprio a
capire né perchè, né come fare a scrivere un codice che faccia ciò che
dico io e che gli vada bene.
Il problema riguarda la definizione delle variabili. Se io scrivo
int main()
{
int a, b, c;
a = b + c;
int d;
return 0;
}
Il simpaticissimo DJGPP mi dice sempre
5: parse error before `int'
ovvero mi impedisce di definire altre variabili di tipo int, visto che
l'ho già fatto una prima volta. Ma che senso ha? E' normale? C'è
qualcosa di assolutamente fesso che non noto o che non so? Bho?
Fin qui comunque poco male. Mi sono rassegnato e ogni volta che mi
serve una variabile la vado ad aggiungere all'elenco oramai
interminabile di definizioni che ho alle prime 4-5 righe del
programma; ho delle righe lunghe 200 caratteri, ma non ho ancora
trovato un'alternativa. 
Così facendo, però non posso definire un array la cui dimensione non è
nota all'atto della compilazione. Io scriverei
char *memory = new char[lenght];
(ovviamente avendo definito e inizializzato length in precedenza), ma
guarda caso non funziona, perchè avendo già definito una volta delle
variabili di tipo char*, il GCC da errore (sempre lo stesso). Allora
sposto la definizione di memory assieme agli altri puntatori a char, e
scrivo solo
memory = new char[lenght];
Peccato che non funziona perchè ho già definito le variabili di tipo
char 50 righe prima.
Perchè scrivere una fesseria di programma diventa così difficile in C?
Fatemi sapere qualcosa, per favore.
Grazie in anticipo e ciao ciao, Piero.

#ovvero mi impedisce di definire altre variabili di tipo int, visto che
#l'ho già fatto una prima volta. Ma che senso ha? E' normale? C'è
#qualcosa di assolutamente fesso che non noto o che non so? Bho?
#memory = new char[lenght];
#Perchè scrivere una fesseria di programma diventa così difficile in C?
Perche' e' una fesseria pensare di compilare codice C++ con un
compilatore C... 
Il C, a differenza del C++, non consente di definire le variabili in
qualsiasi punto del corpo di una funzione (in C++ viene preservata
l'information hiding) cosi' come non consente di allocare memoria
tramite l'operatore new (sconosciuto in C).
Per allocare memoria in C devi usare la funzioni malloc().
--------------------------------------------------------
* Andrea Laforgia        (
andrea_...@bigfoot.com
) *
--------------------------------------------------------

Caro Piero, devi sapere che in C NON si possono dichiarare variabili
dove si vuole, ma solo subito dopo una parentesi graffa aperta (cioé
"{").
Questo però non ti impedisce di dichiarare variabili in qualsiasi
posto del codice. Per esempio su una dispensa di Programmazione in C
utilizzata dagli studenti di ingegneria al politecnico si suggerisce
di implementare la funzione di Swap come segue:
#define SWAP(tipo, a, b)  {tipo temp=a; a=b; b=temp}
come ben saprai utilizzando la direttiva #define il preprocessore ogni
qual volta trova la dicitura SWAP(parametro1, parametro2, parametro3)
sostituisce nel codice quello che stà scritto dopo, quindi il
compilatore non si trova mai ad interpretare direttamente SWAP (...).
In questo modo, richiamando la SWAP in qualsiasi parte del codice, ti
permette di dichiarare una variabile in qualsiasi punto del codice.
Il dichiarare una variabile dopo una parentesi graffa aperta credo
serva per una questione di SCOPE delle variabili.
Per la seconda parte della tua domanda non sono ben sicuro di aver
afferrato il significato, ma credo che sia lo stesso problema della
prima.
Spero di esserti stato d'aiuto, ma soprattutto di essere stato chiaro.
Paolo "Mox" Mossino

Correggo: dopo aver letto la risposta di Andrea ho capito il problema
relativo alla seconda domanda, quindi il problema non è nel come
dichiarare la variabile, ma in come Piero voleva allocare lo spazio
necessario.
Paolo "Mox" Mossino
P.S. Ma il DJGPP non compila anche codice C++ ? Almeno, da quel che mi
ricordo (non ho ancora scaricato il compilatore, ma stò per farlo e ho
preparato la lista dei files ...) è previsto anche un compilatore C++
della GNU (e se mi ricordo la sintassi GNU, le lettere GPP, non stanno
per Gnu C++ compiler ???

 l'ho già fatto una prima volta. Ma che senso ha? E' normale?
Si. In C non si possono definire variabili se non all'inizio di un
blocco. In C++ invece si possono definire ovunque. Se vuoi utilizzare il
C++ allora prova a chiamare i sorgenti con l'estensione .CC.
EMG

  
PGP 2.6.3i key available
--------------------

 P.S. Ma il DJGPP non compila anche codice C++ ?
Si, ma per default interpreta files con estensione .C come sorgenti C e
files con estensione .CC come sorgenti C++ (forse anche CPP ma non
ricordo).
EMG

 codice che faccia ciò che dico io e che gli vada bene.
  In C non e` possibile:
	1. Dichiarare variabili all'interno del codice;
	2. Allocare memoria con l'operatore 'new' (che non esiste).
  Le soluzioni sono due:
	1. Non programmi in C ma in C++ (devi pero` "consigliare" 
	al compilatore di utilizzare la sintassi C++ 
	nella compilazione, cambiando l'estensione del file 
	sorgente).
	2. Scrivi programmi sintatticamente corretti in C, mettendo 
	le dichiarazioni in testa ai blocchi ed usando le 
	funzioni standard per l'allocazione dello heap.
	Alla prossima,
		Marco

 Grazie in anticipo e ciao ciao, Piero.
Ma tu confondi il C con il C++...e questo non va bene!