Newsgroup: it.comp.lang.c
Titolo: assegnazione di FILE*...si può??

Ciao a tutti,
sono un novellino appena arrivato che vi disturba con i suoi
problemi...
Un po' di tempo fa ho fatto un compito di programmazione in
università, ho risolto il problema con un algoritmo che prevedeva il
salvataggio del puntatore ad un file in modo da poter riprendere a
operare dalla posizione salvata. Questo mi ha risparmiato la fatica di
utilizzare base dati formate da liste di liste...il problema è che nel
borland 5 che abitualmente uso tutto funziona a meraviglia, ma quando
lo eseguo nei compilatori che ci sono in uni, cioè borland 2 3 4.5,
dev, ed lmi (forse di questo ho confuso le lettere...) non ne vuole
sapere di non fare danni...la mia curiosità è quindi: perchè non
posso fare un assegnamento del genere
main()
{
  FILE* pos_corrente;
  FILE* pos_precedente;
  *pos_precedente = *pos_corrente;        <-------
  printf("Aiutatemi!!!!");
}
e perchè il borland 5 lo accetta?
Ciao e grazie a tutti per le eventuali risposte

   *pos_precedente = *pos_corrente;        <-------
'FILE' è un tipo "opaco" le cui istanze possono essere create, distrutte e 
manipolate esclusivamente tramite alcune apposite funzioni: fopen, fclose, 
etc.
Il tuo codice può compilare con alcuni compilatori e non con altri, e 
questo dipende sostanzialmente da come "FILE" è dichiarato nelle varie 
implementazioni. In ogni caso, si tratta di codice non valido, il cui 
comportamento non è definito
Per salvare o ripristinare la posizione di lettura in un file userai le 
funzioni 'fseek'/'ftell'/'fsetpos'/'fgetpos' (v. manuale).
Max


pero' non dici che errore danno!
tipicamente il tipo FILE e' una struct ( e qualcun'altro ti ha fatto 
notare che e' un tipo opaco cioe' che non andrebbe manipolato se non 
tramite le funzioni che vi fanno riferimento )
potrebbe darsi che alcuni compilatori citati non accettino 
l'assegnazione tra strutture

 l'assegnazione tra strutture
Forse il BC2 che è preistorico, ma per gli altri sarebbe un grave bug.
Più probabilmente 'FILE' è un tipo incompleto, quindi non è possibile
dereferenziare il puntatore.
Negli header pubblici FILE potrebbe essere definita così:
typedef struct __FILE FILE;
in modo che un programmatore non possa mettere le mani nei dettagli
implementation defined, neppure per sbaglio. stdio.h potrebbe essere
fatto così:
/* struct FILE is an incomplete type */
typedef struct __FILE FILE;
FILE *fopen(char const *, char const *);
int fclose(FILE *);
L'uso di FILE* sarebbe quindi permesso, ma non la dereferenziazione dei
puntatori:
#include <stdio.h>
int main(void) {
        FILE *f, *g;
        f = fopen("test", "r"); /* OK */
        fclose(f);              /* OK */
        *f = *g;                /* KO: dereferencing incompletete type! */
        return 0;
}
Luca
-- 
Home: 
http://kronoz.cjb.net
La vispa candela bruciava l'erbetta
creando un'essenza alquanto sospetta;
sembrava l'odore di una sacrestia
ma presto mi accorsi che era maria.

 
francamente non ho mai letto di questi tipi incompleti, pero' le mie 
conoscenze sono ferme al KR ANSI e li non mi sembra si faccia menzione 
di queste cose tranne al fatto che identificatori prefissati dall' '_' 
sono per convenzione riservati ma mai nascosti ( esempio classico e' la 
funzione che i vari *printf chiamano per fare la formattazione )
tra l'altro l'eleganza del C sta proprio nel fatto che nulla della 
libreria standard fa parte del linguaggio in maniera specifica per cui 
ho difficolta' ad immaginare una cosa come dici tu per il C la struttura
l'unica e' sapere dall' OP i messaggi d'errore che ottiene !!!
ho testato, al volo, un TurboC 2.01 e funziona
sia con la FILE generica sia con un puntatore d un tipo incompleto
so per certo che l'SDCC ( compilatore C per micrcontroller ) non ammette 
l'assegnazione tra strutture


 ho difficolta' ad immaginare una cosa come dici tu per il C la struttura
Riformula in italiano.
Luca
-- 
Home: 
http://kronoz.cjb.net
Home: 
http://kronoz.cjb.net

 Luca