|
|
|
![]() |
|
Strumenti |
![]() |
#1 | |
Senior Member
Iscritto dal: Aug 2002
Messaggi: 1334
|
Occupazione struttura!
Dato questo frammento di codice:
Quote:
Se no mi consigliate qualche altro modo di memorizzare una stringa di lunghezza variabile di cui non è possibile fissare un limite massimo? |
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
non ricordo perfettamente come lavora il sizeof ma probabilmente ti restituisce 8 byte nel secondo caso perché considera la memoria occupata in multipli di 4 byte (una word)
|
![]() |
![]() |
![]() |
#3 |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Ti sei imbattuto in una caratteristica del linguaggio C che dipende squisitamente dal compilatore e dalla macchina.
Dipende, in sostanza, da come viene "allineata" la memoria. Ci dovrebbe essere qualcosa in proposito sul sito delle FAQ del newsgroup comp.lang.c, ma non mi ricordo in che punto. Forse c'è qualcosa anche sul Kernighan e Ritchie, ma non ne sono sicuro.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Aug 2002
Messaggi: 1334
|
Ma quindi quando occupa la struttura? 5 o 8 byte?
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
Quote:
dipende da come è organizzata la memoria. cmq quando la allochi devi prendere un multiplo di 4 byte, quindi anche se la struttura occupa 5 va a finire che ne sprechi 3 |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
8 byte, a meno che il tuo compilatore non consenta di "impacchettarla" in qualche modo dentro i 5 byte.
Per curiosità, intendi usare una struttura per ogni carattere della tua stringa variabile? Non ti sembra un pò contorto?
__________________
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 |
![]() |
![]() |
![]() |
#7 | ||
Senior Member
Iscritto dal: Aug 2002
Messaggi: 1334
|
Quote:
Quote:
|
||
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
realloc
__________________
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 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
Quindi, se sizeof dice 8, sono 8.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Aug 2002
Messaggi: 1334
|
Quote:
|
|
![]() |
![]() |
![]() |
#11 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
(Potrebbe non esserci 1 blocco libero da 1 gozziliardo di byte, ma esserci 2000 blocchi liberi da 1 millesimo di gozziliardo di byte.)
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Aug 2002
Messaggi: 1334
|
Quote:
Ho pensato quindi ad una soluzione che mantenesse il vantaggio dell'indicizzazione degli array ed eliminasse il problema della loro dimensione statica. Fra l'altro mi sembra che realloc, se non trova un blocco contiguo nella memoria della dimensione richiesta fallisce, vero? |
|
![]() |
![]() |
![]() |
#13 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
Ragion per cui, IMHO, la soluzione con le liste è il miglior compromesso fra efficienza e complessità, purché la grandezza degli array al loro interno sia opportuna. Io direi 64, 80 o 128, in base al principio che "tanto l'utente di solito non fornisce input troppo grandi" e la tua lista avrà 2 o 3 elementi nel caso "ordinario"
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Codice:
struct cifrabinaria { unsigned int cifre; struct cifrabinaria *next; }; E poi ci accedi ai vari bit con le operazioni di and/or... Se prevedi che la struttura sia lunga puoi subito usare un vettore: Codice:
struct cifrabinaria { unsigned int cifre[1024]; int bit_usati; struct cifrabinaria *next; }; Ultima modifica di cionci : 11-02-2004 alle 00:29. |
![]() |
![]() |
![]() |
#15 | |||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
![]() 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 |
|||
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Aug 2002
Messaggi: 1334
|
Ho risolto il problema della struttura dati da utilizzare: alloco un unsigned int e poi uso gli operatori bitwise per manipolare i singoli bit... Così ho 32 configurazioni disponibili con soli 4 byte... con possibilità di espandere la struttura ulteriormente mediante puntatore. Che ne dite della soluzione?
Mi si presenta però un altro problema: "passare" come sorta di parametro di input della funzione un pezzo di cifre che sta nello standard input viola il principio di indipendenza delle funzioni dal contesto in cui sono collocate? Ovviamente non c'è alcun passaggio reale di parametro, è solo per rendere l'idea... |
![]() |
![]() |
![]() |
#17 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Allocarne uno alla volta è un graaaande spreco di memoria... Fare una lista in questo modo: Codice:
struct bits { unsigned int data; struct bits *next; }; Quote:
![]() Ultima modifica di cionci : 11-02-2004 alle 18:16. |
||
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Aug 2002
Messaggi: 1334
|
Quote:
![]() Per quanto riguarda la questione dello standard input intendo dire che avrei una funzione che mi prende dei caratteri da lì (mettiamo la tastiera ad es) e poi me li mette dentro la struttura. Mi spiego meglio: io devo fare un programma che interpreta righe di comando del tipo s 11001110 s è il nome dell'operazione da fare, e la uso per selezionare la funzione specifica... poi il restante pezzo lo farei "digerire" alla funzione specifica. Mi domando se questo ragionamento costituisca una violazione del principio di indipedenza delle funzioni o meno. |
|
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Semplice...fai fare la lettura dell stdin da un'altra funzione... Questa funzione avrà il compito di interpretare i comandi e di estrarre le informazioni...
Ad esempio: Codice:
#define LEN 128 #define BYTELEN 32 struct bits { unsigned int data[BYTELEN]; int pos; /*indica il primo libero*/ struct bits *next; }; int inserisci_bit(struct bits **data, char cbit) { unsiegned int op; if(!(cbit == '0' || cbit == '1')) return -1; if((*data)->pos == LEN) /* è pieno */ { while((*data)->next) (*data) = (*data)->next; (*data)->next = alloca_bits(); (*data) = (*data)->next; } op = 1 << ((*data)->pos)%(sizeof(int)*8); if(cbit == '1') ((*data)->data[((*data)->pos)/(sizeof(int)*8)] |= op; else ((*data)->data[((*data)->pos)/(sizeof(int)*8)] &= ~op; return 0; } int inserisci(struct bits *data, char *sbits) { if(!sbits || !data) return -1; while(strlen(sbits) > 0) { if(inserisci_bit(&data, *sbits)) return -1; ++sbits; } return 0; } int leggi_input(FILE *in = stdin) { struct bits *data; data = alloca(data); /*ora leggi da "in" l'input, quando hai trovato il comando e la stringa di bit semplicemente richiami: */ inserisci(data, stringa_bits); } Ultima modifica di cionci : 12-02-2004 alle 07:56. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:33.