Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1

    [c e api] Errore di lettura in un progetto

    Salve, vorrei chiedere a qualcuno se riesce a capire cosa non va in questa porzione di codice:
    codice:
    BOOL CALLBACK
    TabellaDlgProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {
       int i,lunghezza_testo;
       char riga[6],*testo;
       
       if((testo=(char*)malloc(sizeof(char)))==0)
       {
          MessageBox(hwnd,"Memoria insufficiente per eseguire l'operazione","Errore",MB_ICONERROR|MB_OK);
          return TRUE;
       }
       
    	switch(msg)
    	{
    	case WM_INITDIALOG:
          for(i=0;i<=0XFF;i++)
          {
             sprintf(riga,"%c=%2X\n",tab[i],i);
             if(realloc(testo,sizeof(char)*(strlen(riga)+1))==0)
             {
                MessageBox(hwnd,"Memoria insufficiente per eseguire l'operazione","Errore",MB_ICONERROR|MB_OK);
                break;
             }
             strcat(testo,riga);
          }
          printf(testo);
          if((SetDlgItemText(hwnd,IDC_TABELLA,testo))==0)
          {
             MessageBox(hwnd,"Errore nell'output dei dati","Errore!",MB_ICONERROR|MB_OK);
             break;
          }
    	break;
    quando vado a compilare e a aprire la dialog di questa funzione, il suo lavoro lo fà (anche se un pò male... dovrebbe andare a capo con \n ma mi scrive solo una sbarretta nera...), ma quando vado a chiudere il programma (! non la dialog !) win mi dice "l'istruzione 0x769520ba ha fatto riferimento alla memoria 0x0a43343d. La memoria non poteva essere read"

    il problema deve per forza essere nella parte di codice che è processata nel case WM_INITDIALOG, perchè se la elimino e ricompilo il tutto (fà parte di un progetto, quindi ho un sacco di altre funzioni...) l'errore non me lo dà più.

    Credo che il problema sia nella gestione della memoria... non uso spesso malloc e simili (anche se servono un casino) e quindi può darsi che ho fatto qualche errore nella gestione dei puntatori... ma non riesco proprio a capire cos'è che ho combinato.

    Se dovessero servire, ho caricato gli altri files del progetto su internet:
    Files crypter_win
    tenete presente che ho scritto tutto con Dev-Cpp 4.9.8.0

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    C'e' la realloc ... e la free dove l'hai messo?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Io aggiungerei una cosa .... chiamare una malloc (e in generale funzioni che allocano risorse) in modo così "indiscriminato" all'inizio di una window/dialog procedure indipendentemente dal messaggio, è una pessima idea.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    la free() l'avevo messa dopo della chiamata a SetDlgItemText(), poi l'ho provata a spostare per vedere se per caso dava problemi e l'ho messa prima della EndDialog(), ma non è cambiato niente... sono andato per tentativi, visto che non ne uscivo...

    per il fatto della malloc a inizio funzione, non so se va bene o male... solo non sapevo dove inizializzare quel puntatore... in effetti ho notato (dato che ho messo una printf per vedere se stampava \n dopo ogni valore) che durante l'esecuzione del programma è come se la funzione della dlg venisse chiamata più volte, anche se non dovrebbe farlo (secondo i miei calcoli... ho messo la chiamata alla dlg solo in un punto, quindi non so perchè fa così)

    [edit]
    ho provato a mettere la malloc nel case WM_INITDIALOG, prima del ciclo for, ma il risultato è sempre lo stesso non ho proprio idea di che fare...

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da OmbraDiFenice
    è come se la funzione della dlg venisse chiamata più volte, anche se non dovrebbe farlo (secondo i miei calcoli... ho messo la chiamata alla dlg solo in un punto, quindi non so perchè fa così)
    La window/dialog procedure non la invoca direttamente il programmatore ..... è la funzione DispatchMessage() (tipicamente usata nel cosiddetto "loop dei messaggi") che la invoca ogni volta che deve dispacciare un messaggio.

    È ed tranquillamente possibile che una window procedure riceva anche decine e decine (se non centinaia) di messaggi nell'arco di 1 secondo! Basta che muovi il mouse sopra la window/dialog e vengono inviati tantissimi messaggi.

    Peccato che non hai il tool Spy++ (fornito in genere con il Visual C++) perché altrimenti te ne renderesti subito conto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    A parte il fatto che adesso non ho piu' capito dove sono le malloc/free (e se sono corrette), per capire di cosa si tratta esattamente (naturalmente il problema e' determinato da un puntatore sballato ma bisogna capire dove e perche' ...) e' necessario avere una visione "completa" del programma ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    codice:
       if((testo=(char*)malloc(sizeof(char)))==0)
    Ma che senso ha allocare dinamicamente un singolo char?
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    in effetti quella chiamata a malloc l'ho messa perchè non non sapevo se la realloc avrebbe funzionato correttamente se prima non avessi allocato quell'area di memoria con malloc... e mi pare che comunque un carattere in più rispetto a quelli che avrei poi aggiunti mi serviva, perchè la strlen non calcola il terminatore di stringa (ora non ricordo esattamente, ma devo essermi fatto un conto del genere...)

    sono d'accordo sul fatto che ci sia un puntatore che non va, ma non so proprio da dove cominciare a cercare l'errore... la mia idea è che viene allocata "troppa memoria" all'interno del ciclo, ma come faccio a saperlo? Comunque se qualcuno ha voglia ho uploadato tutti i files su internet, il link lo trovate nel primo post... so che chiedo molto, ma almeno uno mi dà una pista da seguire... poi posso provare a continuare da solo a risolvere il bug.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Lasciamo perdere la spiegazione sulla malloc ...

    Ho scaricato il progetto ... cosa faccio, passo passo, per ottenere il tuo problema?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    ehm... mi sono appena reso conto che mi sono dimenticato di inserire il file che inizializza la tabella, quella che dovrebbe essere visualizzata dalla funzione...
    No-problem comunque, basta che copi questo testo dentro un file di testo e lo rinomini *.tbl.

    00=\
    01=%
    02=:
    03='
    04="
    05=)
    06=(
    07=.
    08=,
    09=_
    10=|
    11=A
    12=B
    13=C
    14=D
    15=E
    16=F
    17=G
    18=H
    19=I
    1A=J
    1B=K
    1C=L
    1D=M
    1E=N
    1F=O
    20=P
    21=Q
    22=R
    23=S
    24=T
    25=U
    26=V
    27=W
    28=X
    29=Y
    2A=Z
    2B=a
    2C=b
    2D=c
    2E=d
    2F=e
    30=f
    31=g
    32=h
    33=i
    34=j
    35=k
    36=l
    37=m
    38=n
    39=o
    3A=p
    3B=q
    3C=r
    3D=s
    3E=t
    3F=u
    40=v
    41=w
    42=x
    43=y
    44=z
    45=0
    46=1
    47=2
    48=3
    49=4
    4A=5
    4B=6
    4C=7
    4D=8
    4E=9
    4F=!

    Una volta aperto il programma, vai a visualizza - tabella caricata. Il programma ti avviserà che devi caricare una tabella. Apri il file *.tbl che hai salvato prima e ti dovrebbe apparire la dlg con l'elenco di quei valori (praticamente dovrebbe visualizzare il contenuto del file *.tbl, anche se al posto dei caratteri newline ci mette una sbarretta nera, non so perchè...)

    Una volta caricata e visualizzata la tabella, chiudi la dlg e il programma. A questo punto a me dà quell'errore di lettura della memoria.

    Spero di essere stato abbastanza chiaro. Grazie per l'interessamento e scusa per il file mancante...

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.