Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    62

    stranezza in programma C

    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)

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    14

    mh

    non capisco perché hai dichiarato la variabile se non ti serve.
    Così al volo ti direi di eliminare l'a.out e ricompilare
    Al

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    14

    ok

    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

  4. #4
    mmm....io l'ho provato sotto unix...beh...non funge nemmeno a me!!! e non capisco

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    62
    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!

  6. #6
    Utente di HTML.it L'avatar di ChReAn
    Registrato dal
    Aug 2002
    Messaggi
    486
    Eheh... succede anche a me... a prima vista pare un'assurdita'... Aspetta che approfondisco.
    ChReAn
    -------------------

    Slackware 9.1 powered

  7. #7
    Utente di HTML.it L'avatar di ChReAn
    Registrato dal
    Aug 2002
    Messaggi
    486
    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.
    ChReAn
    -------------------

    Slackware 9.1 powered

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    62
    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!

  9. #9
    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.

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    62
    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)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.