Torna in homepage www.vincenzomanzoni.com
Homepage personale e blog di Vincenzo Manzoni
 
 FAQFAQ   CercaCerca   Cerca con GoogleCerca con Google   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati   Feed AtomFeed
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

Dubbio in C

 
Questo forum è chiuso: Non puoi inserire, rispondere o modificare gli argomenti.   Quest'argomento è chiuso: Non puoi inserire, rispondere o modificare i messaggi.    Indice del forum -> Discussioni generali
Precedente :: Successivo  
Autore Messaggio
Andrea
Moderatore
Moderatore


Registrato: 23/12/03 13:10
Messaggi: 5200

MessaggioInviato: Lun Set 04, 2006 11:37 am    Oggetto: Dubbio in C Rispondi citando

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
Profilo Invia messaggio privato MSN
Endless
Utente adulto
Utente adulto


Registrato: 23/12/03 18:06
Messaggi: 2905
Residenza: Bergamo (provincia)

MessaggioInviato: Lun Set 04, 2006 12:27 pm    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato Invia e-mail HomePage MSN
ice
Utente adulto
Utente adulto


Registrato: 21/01/04 19:07
Messaggi: 2885
Residenza: Seriate (Bergamo)

MessaggioInviato: Lun Set 04, 2006 12:28 pm    Oggetto: Rispondi citando

Suppongo che non esista nulla di simile ad un
Codice:
System.out.println(iltuovettore.length)


Che brutto non ricordarsi un cacchio di C... Sad
_________________
Profilo Facebook di Dario Salvoldi
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
Profilo Invia messaggio privato Invia e-mail HomePage MSN
Endless
Utente adulto
Utente adulto


Registrato: 23/12/03 18:06
Messaggi: 2905
Residenza: Bergamo (provincia)

MessaggioInviato: Lun Set 04, 2006 12:32 pm    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato Invia e-mail HomePage MSN
vinz
Amministratore
Amministratore


Registrato: 12/12/03 12:56
Messaggi: 6648
Residenza: San Pellegrino Terme (Bergamo)

MessaggioInviato: Lun Set 04, 2006 2:21 pm    Oggetto: Re: Dubbio in C Rispondi citando

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
Profilo Invia messaggio privato HomePage
vinz
Amministratore
Amministratore


Registrato: 12/12/03 12:56
Messaggi: 6648
Residenza: San Pellegrino Terme (Bergamo)

MessaggioInviato: Lun Set 04, 2006 2:24 pm    Oggetto: Rispondi citando

Endless ha scritto:
Se vuoi conoscere il numero di celle...
Codice:
type t = sizeof(vettore)/sizeof(type)
dove type indica il dominio del vettore.
Wink

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
Profilo Invia messaggio privato HomePage
Andrea
Moderatore
Moderatore


Registrato: 23/12/03 13:10
Messaggi: 5200

MessaggioInviato: Lun Set 04, 2006 3:07 pm    Oggetto: Rispondi citando

Ok perfetto, grazie mille a tutti!
Top
Profilo Invia messaggio privato MSN
Endless
Utente adulto
Utente adulto


Registrato: 23/12/03 18:06
Messaggi: 2905
Residenza: Bergamo (provincia)

MessaggioInviato: Lun Set 04, 2006 3:43 pm    Oggetto: Rispondi citando

Scusate, volevo quotare il mio primo post per confermarne la correttezza ed invece l'ho editato perdendo così la sua forma originale... Confused
_________________

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
Profilo Invia messaggio privato Invia e-mail HomePage MSN
vinz
Amministratore
Amministratore


Registrato: 12/12/03 12:56
Messaggi: 6648
Residenza: San Pellegrino Terme (Bergamo)

MessaggioInviato: Lun Set 04, 2006 4:48 pm    Oggetto: Rispondi citando

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... Confused

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
Profilo Invia messaggio privato HomePage
Endless
Utente adulto
Utente adulto


Registrato: 23/12/03 18:06
Messaggi: 2905
Residenza: Bergamo (provincia)

MessaggioInviato: Lun Set 04, 2006 9:24 pm    Oggetto: Rispondi citando

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... Rolling Eyes
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... Confused

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
Profilo Invia messaggio privato Invia e-mail HomePage MSN
Estevan
Utente adolescente
Utente adolescente


Registrato: 28/12/03 21:12
Messaggi: 310
Residenza: Sant'imbù Al d'emagna

MessaggioInviato: Lun Set 04, 2006 10:15 pm    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Questo forum è chiuso: Non puoi inserire, rispondere o modificare gli argomenti.   Quest'argomento è chiuso: Non puoi inserire, rispondere o modificare i messaggi.    Indice del forum -> Discussioni generali Tutti i fusi orari sono GMT 1 ora
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi


Powered by phpBB © 2001, 2005 phpBB Group
phpbb.it