|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 5974
|
violazione di accesso
Salve ragazzi, sto implementando il codice di huffman in c++. Ho dichiarato il file header in questo modo:
class Huffman { public: Huffman() {} Huffman(unsigned char data, int freq, Huffman*sin, Huffman*des): codice(data), frequenza(freq), left(sin), right(des){} ~Huffman() {} unsigned char codice; int frequenza; Huffman*left; Huffman*right; Huffman**crea_albero (FILE*in); Huffman*ricerca (Huffman**lista, Huffman*salta, int*posizione); Huffman*crea_albero_binario(Huffman**lista); void crea_codice_Huffman(Huffman*node, unsigned char*codice, unsigned char numerobit); void scrivi_bit(unsigned char*ptr, int posizionebit, char numerobit); void scrivi(); }; Quando richiamo la funzione crea_albero mi da' una violazione di accesso. Huffman**Huffman::crea_albero(FILE*in){ Huffman*PHuff[256]; int v=0; while(!feof(in)){ v= fgetc(in); if(PHuff[v]==NULL) {PHuff[v]=new Huffman(v, 1, NULL, NULL);} else {PHuff[v]->frequenza++;} //qui mi da' l'errore } fclose(in); return PHuff; } In pratica, quando leggo un simbolo in cui ho già creato l'albero, tento di acedere al campo frequenza dell'oggetto puntato dal puntatore nell'array, ma mi da' questo tipo di errore. Chi mi puo' aiutare? Thanks. Ultima modifica di Unrue : 13-07-2005 alle 10:53. |
![]() |
![]() |
![]() |
#2 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Per favore...mettici qualche spazio...altrimenti non ci si capisce niente...
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Tipo così:
Huffman(unsigned char data, int freq, Huffman*sin, Huffman*des): codice(data), frequenza(freq), left(sin), right(des) { } |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
![]()
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Nono...guada bene... Clicka su Modifica e lo vedi... Mancherà l'indentazione, ma gli spazi fra nome e tipo mancano...
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Inoltre perchè le variabili membro non sono private ?
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
![]()
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 5974
|
E' vero,
![]() Va bene questa dichiarazione allora? PHuff deve essere un puntatore ad un'array di puntatori di tipo Huffman: PHuff=(Huffman*)malloc(sizeof(Huffman)); |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 5974
|
Come si fa? non ricordo
![]() |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Codice:
Huffman **PHuff = new Huffman *[256]; for(unsigned pos=0; pos<256; ++pos) { PHuff[pos] = new Huffman(pos, 0, NULL, NULL); }
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 5974
|
Quote:
![]() ![]() |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Puoi postare il codice attuale su cui stai lavorando?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 5974
|
Quote:
E' quello nel primo messaggio, ti posso dare il main se vuoi: void main() { Huffman prova; FILE*in; in= fopen("D:logo.txt","r"); if (in!=NULL){ prova.crea_albero(in); cout<<"Albero creato!"; } else{ cout<<"File vuoto, impossibile comprimere";} } e questa è la dichiarazione della funzione nel file.cpp Huffman**Huffman::crea_albero(FILE*in){ Huffman**PHuff = new Huffman *[256]; for(unsigned pos=0; pos<256; ++pos) { PHuff[pos] = new Huffman(pos, 0, NULL, NULL); } int v=0; while(!feof(in)){ v= fgetc(in); if(PHuff[v]==NULL) {PHuff[v]=new Huffman(v,1,NULL,NULL);} else {PHuff[v]->frequenza++;} } fclose(in); return PHuff; Ultima modifica di Unrue : 13-07-2005 alle 11:08. |
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
mmm feof ritorna true solo dopo che la fgetc ritorna -1.
Prova così: Codice:
while((v=fgetc(in))>=0) PHuff[v]->frequenza++;
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 Ultima modifica di ilsensine : 13-07-2005 alle 11:20. |
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 5974
|
Quote:
while(!feof(in)){ v= fgetc(in); if(PHuff[v]==NULL) {PHuff[v]=new Huffman(v,1,NULL,NULL);} else {while((v=fgetc(in))>0){PHuff[v]->frequenza++;}} } Funziona! Se un un grande! pero' non ho capito come mai feof ritorna true dopo che fgetc da' -1. Se feof da' false, fgetc non viene eseguita. Illuminami, e grazie ancora. Se avro' altri problemi spero che potro' contare su di te . Ciaooo ![]() |
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 5974
|
Poi non ci vorrebbe un if? In quel modo altrimenti non esce piu' da quel ciclo
Ultima modifica di Unrue : 13-07-2005 alle 11:37. |
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
while((v=fgetc(in))>=0){PHuff[v]->frequenza++;} direttamente eliminando il resto inutile di codice (nb occhio che il confronto è ">=0" non ">0").
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#20 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Ho letto adesso; non amo molto le funzioni sui FILE *.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:38.