PDA

Visualizza la versione completa : stranezza in programma C


Occam
18-09-2002, 22:32
Ciao a tutti!
Ho iniziato a studiare C da poco e, in un programma di prova da me realizzato mi capita una cosa strana.
Il listato del programma è il seguente:

#include <stdlib.h>
#include <stdio.h>

int square(int num)
{
return num * num;
}

int fourth_pow(int num)
{
return square(num) * square(num);
}

main()
{
int num;

/*
Se non dichiaro solution il risultato dell'if è:
"La quarta potenza di 0 è 0"
*/
int solution;

char fine = 'n';

do
{

printf("Digita un intero: ");
scanf("%d", &num);
printf("\n");

printf("Il quadrato di %d è %d\n\n", num, square(num));

printf("Vuoi conoscere la quarta potenza di %d (y)?:", num);
scanf("%s", &fine);
printf("\n");

if (fine == 'y')
printf("La quarta potenza di %d è %d\n\n", num, fourth_pow(num));

printf("Vuoi uscire dal programma (y)?: ");
scanf("%s", &fine);

}
while (fine != 'y');

exit(0);
}

La cosa strana è che se io non dichiaro la variabile "solution", quando mi esegue l'if il valore della variabile "num" diventa zero. Però la variabile "solution" io non la utilizzo da nessuna parte! Se però la dichiaro, il programma funziona regolarmente.
Io non ho capito il perchè, potete aiutarmi voi?
(ho compilato il programma con gcc in Linux Red Hat 7.2)

al79it
19-09-2002, 11:51
non capisco perché hai dichiarato la variabile se non ti serve.
Così al volo ti direi di eliminare l'a.out e ricompilare
Al

al79it
19-09-2002, 11:59
io l'ho provato su unix in ogni modo a me funziona sempre.
sono sicuro che sia un problema di aggiornamento dell'a.out.
Daltra parte non usando mai quella variabile non può essere un errore di codice
Al

al3x
19-09-2002, 12:09
mmm....io l'ho provato sotto unix...beh...non funge nemmeno a me!!! e non capisco ;)

Occam
19-09-2002, 13:38
Ciao a tutti e grazie per l'attenzione!

Il file sorgente si chiama "provasquare.c" e per compilarlo do il seguente comando:

gcc provasquare.c -o provasquare

Questo mi restituisce l'eseguibile provasquare, il quale, se nel sorgente non ho dichiarato la variabile:

int solution; (comunque qualsiasi variabile di qualsiasi tipo, anche char, lo fa funzionare)

alla richiesta:

Vuoi conoscere la quarta potenza di [num] (y)?: y

mi edita:

La quarta potenza di 0 è 0

Ovvero, dopo aver eseguito l'istruzione:

scanf("%s", &fine)

il valore di num diventa misteriosamente 0

se però dichiarò int solution (o qualsiasi altra variabile) il programma mi restituisce l'output esatto.

Non ne capisco proprio il motivo!

Se potete, provate a compilare il programma prima dichiarando "int solution", e dopo senza dichiarare questa variabile, e fatemi sapere!

Grazie per l'attenzione!

ChReAn
19-09-2002, 14:41
Eheh... succede anche a me... a prima vista pare un'assurdita'... Aspetta che approfondisco. :confused:

ChReAn
19-09-2002, 14:44
Forse ho capito.
Il fatto che funzioni dichiarando solution e' un puro caso, credo.
Il punto, secondo me, e' che chiami una scanf su un char con un segnaposto %s, mentre un char dovrebbe essere letto con un %c, giusto?
Questo potrebbe portare a una sovrascrittura di qualche variabile locale.

Occam
20-09-2002, 13:45
Potrebbe essere la spiegazione giusta.
Purtroppo non ho ancora potuto provare, e comunque ho messo %s perchè con %c a volte il programma non leggeva bene l'input.
Appena verifico ti faccio sapere.

Ciao e grazie per l'attenzione!

degno
20-09-2002, 14:00
Anche secondo me è per via del %s che usi al posto di %c. Quest' ultimo comando forse non ti funziona perchè riceve come paramtro l' ultimo carattere non ricevuto da altre operazioni di scanf() e l' ultimo carattere non letto è '/n' ( cioè la new line che invii in input quando immetti il dato che viene memorizzato nella variabile num) !!!!

Vai al mio sito

http://www.angelfire.com/80s/degno/index.htm

e fammi sapere se hai risolto.

Occam
20-09-2002, 21:27
Ho risolto il problema dichiarando per ultima la variabile num. Tutto derivava dal fatto che leggevo da input una stringa assegnandola a una variabile "char" (come voi avete intuito). Dichiarando per ultima la variabile fine, essa veniva allocata subito prima di num (ho imparato che il C alloca le variabili partendo dalle ultime dichiarate). Scanf poi allocava il carattere letto come se fosse una stringa andando a sovrascrivere proprio la prima cella di memoria di num.

Ciao a tutti e grazie per l'attenzioe!

(ci sentiamo presto)

Loading