Lunghezza array interi in C

Messaggioda abaco90 » 10/03/2017, 09:30

Ciao a tutti,

volevo sapere come si trova la lunghezza di un array di interi in C.

Io ho usato questo codice (che funziona per le stringhe) ma continua a darmi lunghezza 1; forse non va bene per gli interi?

int main () {

int m[10], i, lunghezza;

printf ("Inserisci i valori\n");
scanf ("%d", m);

for (i=0; m[i] != '\0'; i++) { }

lunghezza = i;

i = lunghezza;

printf ("La lunghezza è %d\n", lunghezza);

return 0;
}
abaco90
Junior Member
Junior Member
 
Messaggio: 89 di 400
Iscritto il: 01/11/2016, 17:38

Re: Lunghezza array interi in C

Messaggioda apatriarca » 10/03/2017, 12:18

Stai leggendo un solo valore da standard input.. Il fatto che ti restituisca 1 è un caso e cambiando compilatore o opzioni del compilatore potrebbe crashare. Per leggere più valori è necessario scrivere un ciclo e in quel caso è sufficiente contare il numero di iterazioni. Quello di far terminare le stringhe con '\0' è una convenzione solo delle stringhe, non è in generale utilizzabile in altre situazioni a meno di terminare esplicitamente i tuoi array con qualche valore specifico.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4566 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Lunghezza array interi in C

Messaggioda abaco90 » 10/03/2017, 16:54

Ciao, grazie della risposta. Come posso trovare la lunghezza di un array di interi senza usare la libreria string.h e senza utilizzare valori particolari per terminare l'array?
abaco90
Junior Member
Junior Member
 
Messaggio: 90 di 400
Iscritto il: 01/11/2016, 17:38

Re: Lunghezza array interi in C

Messaggioda vict85 » 10/03/2017, 20:12

In generale, non si può. Quando lavori con gli array devi portarti dietro la sua dimensione e preoccuparti di non uscire dai suoi limiti. Per array statici si può usare il metodo seguente, ma ricorda che la dimensione viene persa quando passi l'array ad una funzione.
Codice:
#include <stdio.h>

#define UNSAFE_ARRAY_SIZE( __array__ )  ( sizeof( ( __array__ ) ) / sizeof( ( __array__[0] ) ) )

int func(int a[]);

int main(void)
{
   int v[] = { 1, 2, 3, 4, 5 };
   int dim = UNSAFE_ARRAY_SIZE(v);
   printf("Nota che %d e' diverso da %d\n", dim, func(v));
}

int func(int a[])
{
   return UNSAFE_ARRAY_SIZE(a);
}


Nota inoltre che anche con le stringhe la presenza dello 0 alla fine della stringa va gestita nel caso di funzioni scritte da te e non è assicurata.
vict85
Moderatore
Moderatore
 
Messaggio: 9037 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: Lunghezza array interi in C

Messaggioda apatriarca » 11/03/2017, 18:23

Esistono in generale due lunghezze che possiamo associare ad un array. La prima è la quantità di memoria allocata per quel particolare oggetto. E' possibile calcolare tale quantità con il codice postato da @vict85 nel caso di array statici, ma non è in generale possibile farlo quando si ha solo accesso ad un puntatore a tale array (come avviene nel caso di passaggio dell'array ad una funzione per esempio). Il secondo concetto di lunghezza è invece associato alla frazione di array che è stata effettivamente usata. E' quello che viene calcolato con il tuo metodo per le stringhe (o usando strlen). Per questo tipo di lunghezza esistono in generale due metodi: passare la lunghezza separatamente o utilizzare un valore particolare alla fine dell'array per segnarne il termine. Personalmente credo che memorizzare le due lunghezze sia in generale una soluzione migliore, ma il linguaggio C ha fatto una scelta diversa per quanto riguarda le stringhe.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4567 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite