Problema interessante con strutture

di il
45 risposte

45 Risposte - Pagina 2

  • Re: Problema interessante con strutture

    SVNiko ha scritto:


    Forse non mi è chiaro il problema.
    Se riuscissi ad esplicitarlo con più chiarezza, te ne sono grato e felice di apportare un contributo alla soluzione del problema.
    il problema è :
    ho due strutture una che mi viene passata dalla funzione
    l'altra che stà nel file che devo leggere.
    devo verificare se le due strutture sono compatibili.
    se si devo caricare i dati altrimenti devo segnalare l'errore.
    la struttura che sta nel file la posso "facilmente" dedurre grazie a dei terminatori di campo mentre per quella passata dalla funzione non ho praticamente idea sul come dedurla!
    esempio di due strutture compatibili ma diverse:
    struttura 1:
    puntatore precedente
    dato 1
    dato 2
    puntatore successivo

    struttura 2:
    dato 1
    puntatore precedente
    dato 2
    puntatore successivo
    esempio di due strutture non compatibili:
    struttura 1
    puntatore precedente
    dato 1
    dato 2
    puntatore successivo
    struttura 2
    puntatore precedente
    puntatore mediano
    dato 1
    puntatore successivo
  • Re: Problema interessante con strutture

    Ecco, come ti dicevo ... non esiste quello che vuoi fare se non in un solo modo ...

    All'inizio della struttura inserisci uno o più campi che indichino tipo e versione della struttura (così potrai gestire un insieme di strutture previste. ovviamente non tutte).

    Passa come primo campo della struttura alla funzione SEMPRE un dato con il TIPO

    TIPO 1
    ....

    oppure

    TIPO 2
    ---
  • Re: Problema interessante con strutture

    oregon ha scritto:


    No ... non è chiaro ...

    Che sono "i link ai record" ?

    Dobbiamo usare terminologia chiara, altrimenti non ci capiamo.

    E poi non era questo il problema. Ti stavo dicendo che, nel caso di un file binario, non hai modo di capire a quale struttura si riferiscono i dati se non sono marcati in modo chiaro (con CRC, marcatori e altro).
    ci hai presente le liste ?
    record successivo e record precedente i campi che hanno queste informazioni io li chiamo link se hanno altri nomi non lo so!
    tipo_file = 0 sequenziali, binari e tutti i tipi di file che non hanno collegamenti con altri record
    vengono letti dal file e messi in un unico buffer ed elaborati.
    la funzione restituirà i caratteri letti.
    non hanno un prerecord.
    prerecord = tutte le informazioni che servono per gestire il file
    tipo riconoscimento, record iniziale, dimensione record, etc etc
    tipo file = 1
    liste semplici con un unico link
    qui inizia a sorgere il problema perchè una volta letti i dati bisogna vedere le le strutture quella del file e quella passata in funzione sono compatibili.
    hanno un prerecord
    tipo_file = 2
    lista a 2 link o albero binario
    stesso problema che ho con quelli di tipo 1
  • Re: Problema interessante con strutture

    X oregon
    buona idea
    la implemento e ti faccio sapere.
    ma cosi non corro il rischio di avere una struttura fissa?
  • Re: Problema interessante con strutture

    oregon ha scritto:


    E poi non era questo il problema. Ti stavo dicendo che, nel caso di un file binario, non hai modo di capire a quale struttura si riferiscono i dati se non sono marcati in modo chiaro (con CRC, marcatori e altro).
    Ma non stiamo sempre parlando dei dati su file?

    smalldragon ha scritto:


    ho due strutture una che mi viene passata dalla funzione
    l'altra che stà nel file che devo leggere.
    devo verificare se le due strutture sono compatibili.
    se si devo caricare i dati altrimenti devo segnalare l'errore.
    la struttura che sta nel file la posso "facilmente" dedurre grazie a dei terminatori di campo mentre per quella passata dalla funzione non ho praticamente idea sul come dedurla!
    esempio di due strutture compatibili ma diverse:
    Hai postato il prototipo di una funzione, ti chiedo:
    il valore passato con int tipo_file che significato ha?
  • Re: Problema interessante con strutture

    X SVNiko
    il significato di tipo_file e molto importante perche da esso deriva il modo in cui i dati verranno trattati e di che tipo di file si tratta.
    individua il tipo di struttura che la funzione si aspetta di trovare nel file.
    ad esempio se vale 0 non considera la struttura della funzione perchè si aspetta dei dati "senza ordine" che verranno immessi nel buffer.
    mentre se vale 1 inizia a considerare tutte le possibili strutture di quel determinato tipo di file che gli verranno passate.
    e in base alla struttura della funzione verranno trattate le informazioni lette.
    nel caso di 1 andrà a gestire una semplice lista andando a verificare anche i dati del prerecord. nel quale c'è il richiamo a primo record della lista.
    mentre tutti gli altri valori corrispondono a file e gestione + complessi.
  • Re: Problema interessante con strutture

    smalldragon ha scritto:


    vale 1 inizia a considerare tutte le possibili strutture di quel determinato tipo di file che gli verranno passate.
    e in base alla struttura della funzione verranno trattate le informazioni lette.
    Questa cosa ha poco senso.

    Lo scopo di questa funzione è leggere un file? Bene, allora hai un parametro che è tipo_file, questo dice che struct utilizzare, devi avere un tipo_file per ogni struct che vuoi utilizzare. Fine, non hai bisogno di altro.
    Sai che quando arriva tipo_file == 0 ignori la struct, quando arriva tipo_file == 1 utilizzi la struct pippo, con tipo_file == 2 la struct paperino...
    Non vedo perchè ci si debba complicare la vita... tipo_file fa da discriminante.
  • Re: Problema interessante con strutture

    SVNiko ha scritto:


    Lo scopo di questa funzione è leggere un file? Bene, allora hai un parametro che è tipo_file, questo dice che struct utilizzare, devi avere un tipo_file per ogni struct che vuoi utilizzare. Fine, non hai bisogno di altro.
    Sai che quando arriva tipo_file == 0 ignori la struct, quando arriva tipo_file == 1 utilizzi la struct pippo, con tipo_file == 2 la struct paperino...
    Non vedo perchè ci si debba complicare la vita... tipo_file fa da discriminante.
    i problemi fondamentalmente sono 2
    1) che per tipo file = 1 andranno bene tutte le strutture pippo, pippo1....pippon
    mentre per tipo file = 2 andranno bene tutte le strutture paperino,paperino1,....paperinon
    etc etc
    bisogna vedere che per tipo file = 1 il file non contenga strutture paperino e che la struttura passata non sia una di quelle apparteneti al gruppo paperino.
    2) una volta verificato che le strutture sia quella del file che quella passata alla funzione appartengono allo stesso gruppo.
    bisogna determinare quale è la struttura pippo passata alla funzione per poterla riempire.

    non creo un unica struttura per ogni tipo file perchè cosi facendo risolverei il problema in maniera troppo specifica e la funzione sarebbe valida solo per determinati problemi che utilizzassero quella struttura.
    mentre io vorrei fare la funzione nella maniera più generica possibile al fine di risolvere una vasta gamma di problemi e non solo determinati problemi.
  • Re: Problema interessante con strutture

    In C queste cose le puoi fare SOLO se metti un campo specifico nella struttura che contenga un marcatore noto (un Magic Number) altrimenti, in una sola parola, scordatela.
  • Re: Problema interessante con strutture

    Non so perchè ma continuo a ritenere che questo è un problema/non problema.

    Ti dispiacerebbe scrivermi il prototipo esatto che utilizzi per questa funzione?
  • Re: Problema interessante con strutture

    Come ti e' stato detto (N volte), ti SERVONO dei descrittori che descrivono la struttura del record memorizzato.

    Altro problema, che non ho visto accennato: le varie struct hanno ESATTAMENTE la stessa lunghezza o lunghezze differenti?

    Se hanno la stessa lunghezza, puoi pensare al file come ad un VETTORE persistente (un record ogni N bytes)

    Se hanno lunghezze diverse, O usi un prefisso, per ogni record, che dice QUANTI byte e' lungo, OPPURE implementi l'equivalente di una LISTA (come hai fatto notare precedentemente).

    In ogni caso TI SERVE sapere il tipo di struct usata per un certo record. E questo lo puoi fare SOLO inserendo un prefisso (di un byte, potrebbe bastare) con un ID per il tipo di struttura. In binario, NON CI SONO ALTRI MODI!

    SENZA questi descrittori, NON E' POSSIBILE differenziare una struttura dati da un'altra: il motivo e' banale!

    Una sequenza di 8 BYTE 0 che cosa sono? Un log? un double? un puntatore a 64bit? una Union? una struct con 2 interi a 32 it?

    Un'alternativa relativamente semplice e' quella di NON USARE un formato binario puro/minimale per il file, ma un formato piu' descrittivo come JSON o XML, o il Protocol Buffer di Google.

    Ne esistono, ovviamente, N-mila altri, ma se impari ad usare questi, impare ad usare teconologie di uso comune in ambito professionale.

    Se inventi un nuovo modo (intelligente) che risolve il tuo problema, che non e' gia' stato inventato, potresti diventare famoso
  • Re: Problema interessante con strutture

    Direi che XML sarebbe una scelta condivisibile, anche se le cose si complicherebbero ...
  • Re: Problema interessante con strutture

    Le strutture hanno una parte fissa ed una parte variabile.
    la parte fissa sono i vari puntatori char + int32
    mentre le parti variabili sono quelle relative hai dati.
    il prototipo della funzione nelle mie intenzioni è:
    
    int leggi_file(handle hfile,int tipo_file,int record,int lrecord,char *buffer,struct *file)
    
    la routine restituisce 0 se tutto va bene altrimenti il codice di errore
    hfile = handle del file aperto
    tipo_file = va da 0 a 4 e corrisponde al tipo di file che bisogna gestire
    0 = sequenziale,binario e tutti i tipi di file che non prevedono link
    1 = lista semplice 1 link
    2 = lista e albero binario 2 link
    3 = albero 3 link
    4 = neurone (in fase semi avanzata di studio) per il momento non costituisce un problema.
    record = numero del record da leggere.
    lrecord = lunghezza dei byte da leggere che poi dovranno essere gestiti o da buffer o dalla struttura
    buffer = dati letti dal file se tipo file <> 0 sara vuoto
    file = struttura che dovrà contenere i dati nel caso in cui tipo file <> 0
    per quanto riguarda il linguaggio assembler o c++ sono quelli che conosco meglio e per me sono più intuitivi.
    vorrei non usare librerie non di sistema e se mi è possibbile ridurre all'osso anche quelle!
  • Re: Problema interessante con strutture

    Dimenticavo ogni file ha una sua struct fissa mentre quella che può variare e la struct passata alla funzione anche se ,giustamente, entrambe hanno la stessa dimensione.
  • Re: Problema interessante con strutture

    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.
Devi accedere o registrarti per scrivere nel forum
45 risposte