30/04/20 17:25
nessuno
Ok ... solo qualche precisazione.
E' buona norma restituire sempre un valore di stato in uscita ed è meglio che il punto di uscita sia unico (niente return in mezzo al codice). I valori in uscita devono essere chiaramente stabiliti e documentati.
Inoltre, considera che la mancanza di argomenti può essere trattato come un caso particolare.
Infine, controlla SEMPRE che l'allocazione di memoria vada a buon fine e che ad una allocazione corrisponda SEMPRE una free che libera la memoria allocata quando non serve più; anche se sembrano operazioni poco utili, sono buone abitudini che fanno risparmiare mal di testa in codici molto lunghi e complessi e differenziano il codice scritto da PROFESSIONISTI (chi vuole intendere mi intenda...).
#define ALL_OK 0
#define OUT_OF_MEM -1
#define NO_ARGS -2
int main(int argc, char **argv)
{ // i valori vanno inseriti da riga comando dopo compilazione release
// es \Release\InsertionSort4 12 23 62 7 4 5 2
int res = ALL_OK;
int num_dati = argc - 1; // numero di interi passati da riga comando
if (num_dati)
{
int* dati_inout = (int*)malloc(num_dati * sizeof(int)); // dimensiono il vettore in out
if (!dati_inout)
{
printf("Out of memory\n");
res = OUT_OF_MEM;
}
else
{
for (int i = 0; i < num_dati; ++i)
dati_inout[i] = atoi(argv[i + 1]); // copio i dati dell'argomento nel VETTORE in out
printf("\n- Sono stati inseriti N. %d interi: \n\n", num_dati);
// ordinamento
insertion_sort(dati_inout, num_dati);
printf("\n- Risultato = ");
stampa_vettore(dati_inout, num_dati);
free(dati_inout);
}
}
else
{
printf("No args\n");
res = NO_ARGS;
}
return res;
}
Ciao e buono studio.
P.S. La questione dell'operatore sizeof è semplice ... questo riporta la grandezza in byte del TIPO di dato che si pasa.
Se scrivi
char a[10];
printf("%d\n", sizeof(a));
vedrai che otterrai 10 perché il tipo di dato passato è char[10] e un carattere è in genere equivalente ad un byte.
Ma se passi il vettore ad una funzione, ad esempio (e questo vale sempre perché viene sempre passato per puntatore)
void test(char *v)
{
printf("%d\n", sizeof(v));
}
otterrai SEMPRE 4 perché adesso il tipo di dato passato è un char * ovvero un puntatore che ha sempre grandezza 4 (nei sistemi a 32 bit) anche se il vettore è di 1000 elementi. Nei sistemi (e programmi) a 64 bit otterrai sempre 8 dato che il puntatore è a 8 byte. Quindi, in questo caso non potrai utilizzare questo operatore per determinare la grandezza del vettore. In realtà in C NON E' POSSIBILE sapere quanto sia grande il vettore passato per puntatore (ovvero non si può sapere quanti byte sono allocati e validi per un determinato puntatore e in questo forum c'è stata una lunga e controversa discussione sulla questione).
Questi sono errori comuni di chi inizia a programmare o chi rimane nello stato di "dilettante" come il fatto di non controllare la validità di una allocazione, di non liberare la memoria allocata o altro ...
Ultima modifica effettuata da nessuno 30/04/20 17:52
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.