Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++ MFC]Serializzazione

    ho il seguente codice che sto usando per cercare di serializzare una classe LPACCEL che carico in questo modo:
    for (iLoop = 0; iLoop < nAccel; iLoop++) {

    pACCEL = arrayACCEL.GetAt(iLoop);
    lpAccel[iLoop].fVirt = pACCEL->fVirt;
    lpAccel[iLoop].key = pACCEL->key;
    lpAccel[iLoop].cmd = pACCEL->cmd;

    delete pACCEL;
    }

    ma provando a serializzare / deserializzare cosi:
    void CAcceleratorManager::SerializeArray(LPACCEL aAccelleratorArray)
    {
    CFile fileSz;
    fileSz.Open("Accellerator.bin",CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
    CArchive archAcc(&fileSz,CArchive:: store);
    if(archAcc.IsStoring())
    {
    CObject:: Serialize(archAcc);
    for(int i=0;i<sizeof(aAccelleratorArray);i++)
    {
    archAcc << &aAccelleratorArray[i].cmd;
    archAcc << &aAccelleratorArray[i].fVirt;
    archAcc << &aAccelleratorArray[i].key;
    }
    }
    archAcc.Flush();
    archAcc.Close();
    fileSz.Close();

    }
    LPACCEL CAcceleratorManager::UnSerializeArray()
    {
    LPACCEL aAccelleratorArray;
    CFile fileUnsz;
    fileUnsz.Open("Accellerator.bin", CFile::modeRead| CFile::typeBinary);
    CArchive archAcc(&fileUnsz,CArchive:: load);
    int i=0;
    if(archAcc.IsLoading())
    {
    CObject:: Serialize(archAcc);
    archAcc>> aAccelleratorArray[i].cmd;
    archAcc>> aAccelleratorArray[i].fVirt;
    archAcc>> aAccelleratorArray[i].key;
    i++;
    }
    return aAccelleratorArray;
    }
    mi da errore nell' unserialize.
    grazie.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Magari se dicessi in dettaglio quale errore e in quale riga ...

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    pardon oregon :
    queto è l'errore:
    Unhandled exception at 0x796dbcb1 in AccelsEditor.exe: Microsoft C++ exception: CArchiveException @ 0x0012fc40.

    e questa è la funzione unserialize da sostituire a quella che ho postato , sorry:
    LPACCEL CAcceleratorManager::UnSerializeArray()
    {
    LPACCEL aAccelleratorArray;
    CFile fileUnsz;
    fileUnsz.Open("Accellerator.bin", CFile::modeRead| CFile::typeBinary);
    CArchive archAcc(&fileUnsz,CArchive:: load);
    int i=0;
    while(archAcc.IsLoading())
    {
    CObject:: Serialize(archAcc);
    archAcc>> aAccelleratorArray[i].cmd;
    archAcc>> aAccelleratorArray[i].fVirt;------------------>errore
    archAcc>> aAccelleratorArray[i].key;
    i++;
    }
    return aAccelleratorArray;
    }

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Due dubbi ...

    1) nella Serialize, quando scrivi

    i<sizeof(aAccelleratorArray);

    cosa credi che restituisca la sizeof?

    2) nella UnSerialize, hai un puntatore ad un array

    LPACCEL aAccelleratorArray;

    ma non allochi mai lo spazio per i suoi elementi ... e fra l'altro, dopo aver letto il primo non leggi gli altri ...

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    allora oregon , intanto graize per l'aiuto e scusa per la mia preparazione su c++.
    rispondo alle domande:

    Due dubbi ...

    1) nella Serialize, quando scrivi

    i<sizeof(aAccelleratorArray);

    cosa credi che restituisca la sizeof?
    il numero di elementi dell aAccelleratorArray

    2) nella UnSerialize, hai un puntatore ad un array
    inizio a capire , puntatore ad array e?!

    LPACCEL aAccelleratorArray;

    ma non allochi mai lo spazio per i suoi elementi ... e fra l'altro, dopo aver letto il primo non leggi gli altri ...

    come faccio a leggere tutti gli elementi e a serializzare l'array ?


    Sto cercando di serializzare una accellerator table,ma come hai visto non ci sono riuscito.
    Puoi darmi ancora qualche dritta?
    grazie.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    ho provato a cambiare le mie funzioni di serialize/unserialize cosi:
    void CAcceleratorManager::SerializeArray(LPACCEL aAccelleratorArray)
    {
    CFile fileSz;
    fileSz.Open("c:\\Accellerator.bin",CFile::modeCrea te | CFile::modeWrite | CFile::typeBinary);
    CArchive archAcc(&fileSz,CArchive:: store);
    if(archAcc.IsStoring())
    {
    CObject:: Serialize(archAcc);
    //for(int i=0;i<sizeof(aAccelleratorArray);i++)
    {
    archAcc << &aAccelleratorArray;
    }
    }
    archAcc.Flush();
    archAcc.Close();
    fileSz.Close();

    }
    LPACCEL CAcceleratorManager::UnSerializeArray()
    {
    LPACCEL *aAccelleratorArray=new LPACCEL();
    CFile fileUnsz;
    fileUnsz.Open("c:\\Accellerator.bin", CFile::modeRead| CFile::typeBinary);
    CArchive archAcc(&fileUnsz,CArchive:: load);
    int i=0;
    if(archAcc.IsLoading())
    {
    CObject:: Serialize(archAcc);
    archAcc >> *aAccelleratorArray;-------------------->errore




    }
    return *aAccelleratorArray;
    }
    ma il compilatore mi da questo errore :

    c:\C++\accel_editor\AccelsEditor\AcceleratorManage r.cpp(478): error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'LPACCEL' (or there is no acceptable conversion)

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    No ... la sizeof non restituisce il numero di elementi ma la "grandezza" dell'argomento in byte ... ed essendo un puntatore, restituira' sempre 4 (in Win32 un puntatore e' fatto da 4 byte).

    La new che hai fatto non ha senso.

    Nella Serialize devi registrare su file

    - il numero di elementi

    - tutti gli elementi uno dopo l'altro

    Nella UnSerialize devi

    - leggere il numero di elementi file

    - allocare dinamicamente l'array (con la new)

    - leggere tutti gli elementi dal file

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie oregon adesso funziona.
    Ti chiedo un ultima cosa:
    come faccio ad associare uno shortcut da tastiera ad un tasto del menu?
    In pratica vorrei visualizzare tutti i comandi dei menu e con una semplice interfaccia associargli uno shortcut.
    Il problema è che non so come associare lo schortcut alla funzione richiamata dal menu.
    si puo' fare?
    grazie.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    up

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Questo e' un altro argomento ... sarebbe bene che tu aprissi un altro thread e postassi il codice con cui hai creato i menu ...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.