Precedente :: Successivo |
Autore |
Messaggio |
Andrea Moderatore

Registrato: 23/12/03 13:10 Messaggi: 5200
|
Inviato: Lun Set 04, 2006 11:37 am Oggetto: Dubbio in C |
|
|
Mi è venuto un dubbione in C: devo scrivere una funzione che scorre un vettore di cui non so la dimensione, come faccio?
Se è di char cerco il carattere '\0' e finqui ok, ma se è di int, float o un tipo strutturato che faccio? Sono costretto a farmi passare dal chiamante la dimensione? |
|
Top |
|
 |
Endless Utente adulto


Registrato: 23/12/03 18:06 Messaggi: 2905 Residenza: Bergamo (provincia)
|
Inviato: Lun Set 04, 2006 12:27 pm Oggetto: |
|
|
Codice: | type t = sizeof(vettore)/sizeof(type) |
Questo funziona sicuro, compilare per credere! _________________
Training autogeno: in caso di stress, eseguite il movimento in figura e ripetete:
"Amo il mio lavoro! Amo il mio lavoro! Amo il mio lavoro!"
L'ultima modifica di Endless il Lun Set 04, 2006 3:41 pm, modificato 1 volta |
|
Top |
|
 |
ice Utente adulto


Registrato: 21/01/04 19:07 Messaggi: 2885 Residenza: Seriate (Bergamo)
|
Inviato: Lun Set 04, 2006 12:28 pm Oggetto: |
|
|
Suppongo che non esista nulla di simile ad un Codice: | System.out.println(iltuovettore.length) |
Che brutto non ricordarsi un cacchio di C...  _________________
Ti chiedo:
La saggezza per capire i colleghi...
La pazienza per ascoltarli...
La capacità di stare calmo...
... ma non darmi la forza... perchè se mi dai anche quella...
FACCIO UN MACELLO !!! |
|
Top |
|
 |
Endless Utente adulto


Registrato: 23/12/03 18:06 Messaggi: 2905 Residenza: Bergamo (provincia)
|
Inviato: Lun Set 04, 2006 12:32 pm Oggetto: |
|
|
Citazione: | Sono costretto a farmi passare dal chiamante la dimensione? |
Comunque sì, in alcuni casi sì. Sei costretto! (e.g. fread, fwrite) _________________
Training autogeno: in caso di stress, eseguite il movimento in figura e ripetete:
"Amo il mio lavoro! Amo il mio lavoro! Amo il mio lavoro!" |
|
Top |
|
 |
vinz Amministratore


Registrato: 12/12/03 12:56 Messaggi: 6648 Residenza: San Pellegrino Terme (Bergamo)
|
Inviato: Lun Set 04, 2006 2:21 pm Oggetto: Re: Dubbio in C |
|
|
Andrea ha scritto: | Mi è venuto un dubbione in C: devo scrivere una funzione che scorre un vettore di cui non so la dimensione, come faccio? |
Devi passare alla funzione la dimensione del vettore. Ne sono un esempio alcune funzioni di ricerca e ordinamento dei dato della libreria standard del C come bsearch, qsort che hanno i seguenti prototipi.
Codice: | void *bsearch(const void *key, const void *base, size_t num, size_t width, int (*compare)(const void *elem1, const void *elem2)) |
Codice: | void qsort(const void *base, size_t num, size_t width, int (*compare)(const void *elem1, const void *elem2)) |
_________________ Let the future tell the truth and evaluate each one according to his work and accomplishments. The present is theirs; the future, for which I really worked, is mine.
Nikola Tesla |
|
Top |
|
 |
vinz Amministratore


Registrato: 12/12/03 12:56 Messaggi: 6648 Residenza: San Pellegrino Terme (Bergamo)
|
Inviato: Lun Set 04, 2006 2:24 pm Oggetto: |
|
|
Endless ha scritto: | Se vuoi conoscere il numero di celle... Codice: | type t = sizeof(vettore)/sizeof(type) | dove type indica il dominio del vettore.
 |
Sicuro che Codice: | int *i = new int[10];
cout << sizeof(i) << endl; |
stampi 40? Secondo me stampa 4. _________________ Let the future tell the truth and evaluate each one according to his work and accomplishments. The present is theirs; the future, for which I really worked, is mine.
Nikola Tesla |
|
Top |
|
 |
Andrea Moderatore

Registrato: 23/12/03 13:10 Messaggi: 5200
|
Inviato: Lun Set 04, 2006 3:07 pm Oggetto: |
|
|
Ok perfetto, grazie mille a tutti! |
|
Top |
|
 |
Endless Utente adulto


Registrato: 23/12/03 18:06 Messaggi: 2905 Residenza: Bergamo (provincia)
|
Inviato: Lun Set 04, 2006 3:43 pm Oggetto: |
|
|
Scusate, volevo quotare il mio primo post per confermarne la correttezza ed invece l'ho editato perdendo così la sua forma originale...  _________________
Training autogeno: in caso di stress, eseguite il movimento in figura e ripetete:
"Amo il mio lavoro! Amo il mio lavoro! Amo il mio lavoro!" |
|
Top |
|
 |
vinz Amministratore


Registrato: 12/12/03 12:56 Messaggi: 6648 Residenza: San Pellegrino Terme (Bergamo)
|
Inviato: Lun Set 04, 2006 4:48 pm Oggetto: |
|
|
Allora, secondo me c'è un po' di confusione.
Se tu dichiari un array così:
Codice: | int vettore_interi[10]; |
sono d'accordo che il tuo codice funziona... ma questo perché a compile time tu sai già quanto è grande il vettore.
Il problema si pone quando devi stabilire la dimensione di un array dinamico o passato ad una funzione. Ad esempio:
Codice: | void foo(int vettore_interi[]) {
cout << sizeof(vettore_interi) << endl;
}
int main() {
int i[10];
foo(i);
} |
Il tuo codice stamperà 4, che è la dimensione in byte del puntatore all'array.
Endless ha scritto: | Scusate, volevo quotare il mio primo post per confermarne la correttezza ed invece l'ho editato perdendo così la sua forma originale...  |
Se vuoi ripristinarlo, lo trovi nel mio quote. _________________ Let the future tell the truth and evaluate each one according to his work and accomplishments. The present is theirs; the future, for which I really worked, is mine.
Nikola Tesla |
|
Top |
|
 |
Endless Utente adulto


Registrato: 23/12/03 18:06 Messaggi: 2905 Residenza: Bergamo (provincia)
|
Inviato: Lun Set 04, 2006 9:24 pm Oggetto: |
|
|
vinz ha scritto: | Se tu dichiari un array così:
Codice: | int vettore_interi[10]; |
sono d'accordo che il tuo codice funziona... ma questo perché a compile time tu sai già quanto è grande il vettore. |
Esattamente, avevo capito fosse riguardo questo il dubbio che aveva Andrea...
vinz ha scritto: | Il problema si pone quando devi stabilire la dimensione di un array dinamico o passato ad una funzione. Ad esempio:
Codice: | void foo(int vettore_interi[]) {
cout << sizeof(vettore_interi) << endl;
}
int main() {
int i[10];
foo(i);
} |
Il tuo codice stamperà 4, che è la dimensione in byte del puntatore all'array.
| Vero.
vinz ha scritto: | Endless ha scritto: | Scusate, volevo quotare il mio primo post per confermarne la correttezza ed invece l'ho editato perdendo così la sua forma originale...  |
Se vuoi ripristinarlo, lo trovi nel mio quote. |
Ormai non serve più credo. No? _________________
Training autogeno: in caso di stress, eseguite il movimento in figura e ripetete:
"Amo il mio lavoro! Amo il mio lavoro! Amo il mio lavoro!" |
|
Top |
|
 |
Estevan Utente adolescente


Registrato: 28/12/03 21:12 Messaggi: 310 Residenza: Sant'imbù Al d'emagna
|
Inviato: Lun Set 04, 2006 10:15 pm Oggetto: |
|
|
Il Vinz ha ragione, se si conosce a CT la dimensione del vettore attraverso le diverse possibilità messe a disposizione del linguaggio è possibile determinarne la dimensione del vettore e dividendo per il numero di byte occupati da una singola "cella" è possibile determianare il num di celle.
Il problema si pone quando la dimensione non è nota a priori ma variabile (varazione a RT) ed è quindi necessario fornire oltre al vettore anche la dimensione (det. anch'essa a RT).
Sempre parlando di programmazione imperativa (quale il C), un problema che si pone a RT è quello di determinare il tipo di dato che riceve una funzione.
Per esempio qunado si salva su un file un record, come fa la funzione fwrite a conoscere il tipo di dato passato???.
Dal prototipo della funzione si evince come il paraemtro formale indicante il buffer da scrivere sia di tipo void*.
Il C attraverso il tipo void* (e il molto limitato type-safe) è in grado di accettare il tipo di dato. Sarà poi compito del programmatore verificare la correttezza in tutti i sensi del parametro attuale. Naturalmente come sottilineava Vincenzo oltre al buffer è necessario passare alla funzione anche la dimensione in byte dell'oggetto in questione.
Tale operazione è ottinibile grazie all'operatore sizeof.
Anche se conosciuto a priori il tipo di dato (es char 1 byte int 4 byte...) consiglio di utilizzare sempre l'operatore sizeof in modo da rendere il codice molto più portatile e "facilmente ricompilabile" per altre architetture.
ciao Cive _________________ http://email2image.altervista.org
Protect your mail against spam!! |
|
Top |
|
 |
|