In effetti il problema potrebbe essere quello suggerito.
la scanf con il parametro %d si aspetta 4 byte, passandogli un solo byte dove andrà a scrivere i restanti 3 byte? semplice nella memoria adiacente che in questo case setta a 0 la variabile adiacente. In altri casi l'errore potrebbe rivelarsi di difficile comprensione.
Il suddetto errore viene poi ben spiegato dal compilatore con il seguente warning:
warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘char *’ [-Wformat=]
compilato con gcc ed eseguito su raspbian
Presumo tu abbia una scheda con architettura arm e quindi la compilazione sarà completamente diversa e porterà dunque ad errori diversi.Questo perchè i comandi assembly dell'arm(risc) sono completamente diversi dai comandi assembly di un x86(cisc/risc) effettuando dei passaggi diversi si otterranno diveri errori che in quel caso potranno essere ancora piu difficile da trovare.
Abbiamo risolto con l'accoppiata fgets() + atoi()
Perfetto io ti consoglierei ancora due cose,primo è implementare una corretta funzione gets quale ad esempio:
Codice: Seleziona tutto
char* con_gets(char* d,int max)
{
char* st = d;
int c;
while ( (c = getchar()) != EOF && c != '\n' && --max > 0 ) *d++ = c;
*d = '\0';
return st;
}
Questa funzione ti toglierà quell'odioso '\n' che riporta la fgets,praticamente è la gets dello standard ma priva del bug di buffer overflow.
Secondo la funzione main DEVE ritornare un int quindi è "int main()".
Il parametro di ritorno viene memorizzato nel registro "eax" quindi una funzione che esamina il parametro di ritorno di una funzione non farà altro che leggere tale registro,ma se tu utilizzi void non essegni niente a eax che conterrà dunque un valore casuale dato dall'ultimo utilizzo del suddetto registro,restituendo dunque un valore errato alla funzione chiamante.
Naturalmente il ritorno del valore della funzione main passa attraverso al kernel linux ma questo è un dettaglio meno importante,perchè tanto lui non lo analizza,ma permette solo ad una applicazione estrna di accedervi tramite apposite system call.
Naturalmente anche questo è un warning del compilatore
warning: return type of ‘main’ is not ‘int’ [-Wmain]