Problema interessante con strutture

di il
45 risposte

45 Risposte - Pagina 3

  • Re: Problema interessante con strutture

    Smalldragon ... vediamo di capirci, altrimenti questo thread va all'infinito ...

    La tua funzione NON può capire cosa c'è effettivamente nel file se non scrivi qualcosa di NOTO nel file stesso. Te ne rendi conto o continui senza tenere conto di questa cosa?
  • Re: Problema interessante con strutture

    Ma questo lo so e lo avevo anche scritto!
    nei file con tipo_file >0
    esistono dei byte iniziali pre-record che sono:
    riconoscimento 1 char
    primo recond 1 char + 1 int
    numero caratteri del record 1 int
    eventuale aggancio esterno 64 char che saranno riempiti solo se si raggiunge il limite massimo di record.
    il problema sta nel capire quale struttura viene passata alla funzione.
    quella che sta sul fie da leggere so come calcolarmela.
    una prima esclusione di eventuali strutture viene fatta confrontando la dimensione della struttura passata alla funzione con la dimensione del record che sta nel pre-record del file.
    ma ahime non basta
  • Re: Problema interessante con strutture

    SVNiko ha scritto:


    int leggi_file(handle hfile,int tipo_file,int record,int lrecord,char *buffer,struct *file)
    Hai provato a compilare? Penso di no!

    struct *file non sarebbe accettato, devi mettere o struct pippo *file oppure un void *file.

    Se metti struct pippo *file stai passando un puntatore alla struttura pippo. Se il tuo intento è questo tutto il discorso decade, perchè sai che struttura passi esattamente quella puoi passare.
    Se utilizzi void * allora la funzione non sa che struttura è stata passata, in questo secondo caso l'unico modo di saperlo è utilizzare una variabile di tipo che ti dice che struttura hai passato, anche perchè devi fare i cast per poterla utilizzare.
    se ne stò discutendo è normale che ancora non l'abbia compilata!
    comunque basta che aggiungo un carattere e il problema e risolto!
    so bene che se passo struct *pippo passo un puntatore a stuttura.
    ma essendo una funzione generica posso non conoscere la composizione della struttura pippo.
    e il problema che ho sottoposto consiste proprio nel come posso capire la struttura che è stata passata.
    e anche se mettessi come presupposto un campo noto nella struttura che mi viene passata avrei comunque il problema di capire se effettivamente questo campo nella struttura esista o meno e quindi sarei comunque al punto di partenza!
  • Re: Problema interessante con strutture

    Anche per la struttura devi usare lo stesso accorgimento. Usa un campo all'inizio della struttura che contenga un dato noto (un magic number) ad esempio

    0x12345678

    per identificare la struttura. Non hai altro modo, ok?
  • Re: Problema interessante con strutture

    smalldragon ha scritto:


    ma essendo una funzione generica posso non conoscere la composizione della struttura pippo.
    In C ti abbiamo già detto che non esiste. Se devi utilizzare qualcosa devi sapere che cos'è.
    anche se mettessi come presupposto un campo noto nella struttura che mi viene passata avrei comunque il problema di capire se effettivamente questo campo nella struttura esista o meno e quindi sarei comunque al punto di partenza!
    Deve esserci un patto implicito tra chi programma la funzione e chi la utilizza. Non puoi passare qualcosa che non centra nulla.

    Te lo dico ancora:
    • se nel prototipo scrivi struct pippo, sai che è esattamente struct pippo e di struct pippo conosci tutto
    • se invece scrivi void * allora puoi non sapere che tipo di struttura ti hanno passato, però delle 100 strutture che ti aspetti, utilizza un campo tipoStruct che ti dice che mi ha passato questa struttura.
    Esempio:
    
    struct pippo{ // tipo_struct 1
       int a;
       char b;
    }
    
    struct pippo1{ // tipo_struct 2
        char a;
        int b;
        int c;
    }
    
    prototipo:
    int leggi_file(handle hfile, int tipo_file, int record, int lrecord, char *buffer, int tipo_struct, struct *file);
    
    Quando tipo_struct è 1 sai che è pippo se tipo_struct è 2 sai che è pippo2.
    Oppure come ti è stato suggerito pure:
    
    struct pippo{ // tipo_struct 1
       int tipoStruct;  // inizializzato con 1
       int a;
       char b;
    }
    
    struct pippo1{ // tipo_struct 2
        int tipoStruct; // inizializzato con 2
        char a;
        int b;
        int c;
    }
    
    prototipo:
    int leggi_file(handle hfile, int tipo_file, int record, int lrecord, char *buffer, struct *file);
    
    La prima cosa che deve fare la tua funzione è andare in file->tipoStruct è leggere il valore, quindi sai che struct ti hanno passato.
    Spero che ti serva a convincerti che devi usare un artificio per risolvere il tuo problema.
  • Re: Problema interessante con strutture

    Allora se ho capito bene
    devo già conoscere tutti i campi della struttura e quindi avere una struttura fissa per ogni tipo_file?
    quindi non c'è alcun modo per distinguere 2 strutture dello stesso tipo?
    esempio
    
    struct pippo{ 
    int tipostruttura //inizializzato a 1
    char a
    int b
    }
    struct pippo1{ 
    int tipostruttura //inizializzato a 1
    int a
    char b
    }
    
    domanda sciocca
    ma come è vista una struttura dal c++?
    come un insieme di variabili o come un unico buffer?
  • Re: Problema interessante con strutture

    smalldragon ha scritto:


    allora se ho capito bene
    quindi non c'è alcun modo per distinguere 2 strutture dello stesso tipo?
    Che cosa sono due strutture dello stesso tipo?
    ma come è vista una struttura dal c++?
    come un insieme di variabili o come un unico buffer?
    In memoria viene allocato spazio per un blocco dati della dimensione della struttura, con eventuali offset sui vari campi per permettere di velocizzare gli accessi (un multiplo di due è benvenuto). Se provi a vedere lo spazio riservato alla struttura:
    struct pippo{
         char a;
         int b;
    };
    Ti renderai conto che non è proprio lo spazio che ti aspetteresti, ciò è dovuto appunto agli offset che ti dicevo
  • Re: Problema interessante con strutture

    Si tratta dell'allineamento della struttura; nel mio primo post avevo suggerito di fare attenzione a questo aspetto.
    Suggerisco di utilizzare le direttive pragma pack come in questo esempio () per impostare l'allineamento ad 1 byte e quindi evitare eventuali padding.
  • Re: Problema interessante con strutture

    smalldragon ha scritto:


    quindi non c'è alcun modo per distinguere 2 strutture dello stesso tipo?
    Dopo 3 pagine di post e n volte che ti si dice, fai ancora questa domanda ...

    Scusa ma che vuoi che si risponda? Che per magia è possibile ? NON è possibile ...!
  • Re: Problema interessante con strutture

    @oregon
    Sì, ma tu sai che vuol dire con stesso tipo? Io non ho mica capito! Due strutture o sono uguali o sono diverse.
  • Re: Problema interessante con strutture

    Ok l'idea era buona
    ma se non c'è soluzione progetto da cestinare!
    scusatemi per il tempo che vi ho fatto perdere.
  • Re: Problema interessante con strutture

    SVNiko ha scritto:


    @oregon
    Sì, ma tu sai che vuol dire con stesso tipo? Io non ho mica capito! Due strutture o sono uguali o sono diverse.
    Penso di aver "afferrato" che lui intenda

    int a
    int *b

    e

    int *x
    int c
  • Re: Problema interessante con strutture

    smalldragon ha scritto:


    ok l'idea era buona
    Al contrario. L'insegnamento fondamentale che devi trarre da questa discussione è che codesta, come l'hai formulata, è una pessima idea. Dovunque è stata applicata sistematicamente, nella storia informatica, ha provocato costi enormi a livello di runtime, che non giustificano (se non in casi rari) la "flessibilità" che ne deriva. Né tantomeno si tratta di una idea nuova, dal momento che anche i progettisti dei primi compilatori COBOL, negli anni Cinquanta del secolo scorso, se la sono trovata tra i piedi in qualche forma. E, ribadisco: ovunque si sia tentato di applicare una sovrastruttura del genere, dall'interprete __plankton del buon Clipper a C++ (dove codesta roba prende nello specifico le sembianze di RTTI e programmazione generica, brutalmente cassati - in special modo il primo - dal comitato ISO SC22/WG21 per la valutazione delle prestazioni di C++) fino ai più evoluti e semisconosciuti 4GL, il costo a runtime di simili caratteristiche è sempre risultato abnorme nella valutazione ingegneristica costi/benefici, pur tenendo in debita considerazione tutti i fattori inerenti (si tratta pur sempre, C++ a parte, di burotica e affini).

    La programmazione generica e l'uso di ADT - perché questo, di fatto, è ciò che confusamente stai tentando di pasticciare con codeste strutture fantasma autoidentificanti - sono ovviamente possibili anche in C e in Assembly, ma (per non compromettere eccessivamente le prestazioni: altrimenti tanto vale usare un qualsiasi HLL che consenta allegramente reflection e RTTI, magari interpretato!) passano per strade ben più raffinate, con librerie e preprocessori dedicati che estendono le capacità sintattiche dei linguaggi in tale direzione.
  • Re: Problema interessante con strutture

    Se lo dici tu mi fido!
    non ho mai detto che l'idea fosse innovativa!
    anzi al contrario pensavo che fosse una problematica molto diffusa e che qualcuno avesse trovato una soluzione.
    per semplice o complessa che fosse stata mi bastava la tecnica.
    avendo qualche soluzione o qualche idea sul come fare magari avrei trovato una soluzione alternativa!
    comunque per quanto riguarda gli standard ISO e compagnia bella.
    alla base ci sono solo ragioni economiche che fanno entrare delle specifiche invece che altre.
    quindi sotto molti punti di vista lasciano il tempo che trovano.
    comunque questa sarebbe un altra discussione che non finirebbe mai.
    comunque resto convinto che era una buona idea.
    grazie lo stesso di aver provato ad aiutarmi
    saluti e buon lavoro
  • Re: Problema interessante con strutture

    Guarda è un problema che tipicamente si affronta dopo un paio di mesi che si inizia a programmare.
    Puoi "serializzare" gli oggetti (/strutture) come vuoi, con metodi più o meno brutali, con maggiore o minore efficienza, con codifiche abbastanza standard tipo JSON o verbose e lente come XML.
    Quindi E' una problematica molto diffusa, e CI SONO tante soluzioni, adatte per chi vuoi "faticare poco", o avere alta efficienza e così via.

    Riguardo a ISO c'è del vero in quanto sostieni, ma ISO significa tutto e niente, spazia dalla forma dei tortellini alle viti delle stazioni spaziali.
    In questo caso specifico, più banalmente, dopo qualche riflessione ci si è resi conto che voler affrontare un problema non facilmente standardizzabile avrebbe significato complicarsi la vita inutilmente.
Devi accedere o registrarti per scrivere nel forum
45 risposte