4

コードを実行するたびに、変数 bookcost が値 3435973836 に変わります。

これは、processingData 関数に到達した後に行われます。なぜこれを続けているのかわからない!私はすでに関数なしでこのプログラムを書きましたが、うまくいきました:( これは私の2番目のプログラミングクラスです。オンラインであり、教授からのサポートはほとんどありません.

#include <stdio.h>

void inputData(int* inputs,int* booknmbr, int* nmbrpurchased, int* bookcost);
void processingData(int bookcost, int nmbrpurchased, int totalpurch, int costaccu);
void outputInfo(int booknmbr, int nmbrpurchased, int bookcost, int* total);

    int bookcounter = 0;
    int totalpurch = 0;
    int costaccu = 0;
    int totalcostaccu = 0;


int main ()

{
    int booknmbr;
    int nmbrpurchased;
    int bookcost; 
    int bookcounter = 0;
    int cycleRun;
    int total;
    int inputs;

    printf("Run Program? 1 for Yes or -1 for No \n"); // ask user to input product name
    scanf("%d", &cycleRun);
    while (cycleRun != -1) 
    {

        inputData(&inputs, &booknmbr, &nmbrpurchased, &bookcost);
        processingData(bookcost, nmbrpurchased, totalpurch, costaccu);
        outputInfo(booknmbr, nmbrpurchased, bookcost, &total);

        printf("Run Program? 1 for Yes or -1 for No \n"); // ask user to input product name
        scanf("%d", &cycleRun);
    }
}

void inputData(int* inputs, int* booknmbr, int* nmbrpurchased, int* bookcost)
{
    printf( "\nEnter the Book Product Number?\n" );
    scanf("%d", &booknmbr);

    printf( "Enter the Number of Books Purchased?\n" );
    scanf("%d", &nmbrpurchased);

    printf( "Enter the Cost of the Book Purchased?\n");
    scanf("%d", &bookcost);

    printf( "TEST: %u\n", bookcost);

    return;
}

void processingData(int bookcost, int nmbrpurchased, int totalpurch, int costaccu)
{
    int total;

    printf( "TEST: %u\n", bookcost);

    total = bookcost * nmbrpurchased;
    totalpurch = totalpurch + nmbrpurchased;
    costaccu = costaccu + bookcost;
    totalcostaccu = totalcostaccu + (bookcost * nmbrpurchased);

    printf( "TEST: %u\n", bookcost);

    return;
}

void outputInfo(int booknmbr, int nmbrpurchased, int bookcost, int* total)
{
    printf( "\nBook Product number entered is: %u\n", booknmbr);
    printf( "Quantity of Book Purchased is: %u\n", nmbrpurchased);
    printf( "Cost of the Book Purchased is: %u\n", bookcost);
    printf( "Total cost of books is: $%u\n", total);

    return;
}

void outputSummary(int bookcounter, int totalpurch, int costaccu, int totalcostaccu)
{
    printf( "\n\nNumber of records processed = %u\n", bookcounter);
    printf( "Number of books purchased = %u\n", totalpurch);
    printf( "Cost of the books purchased = $%u\n", costaccu);
    printf( "Total cost for all book purchases = $%u\n", totalcostaccu);

    return;
}
4

2 に答える 2

5

クイック検索では、3435973836 が Windows が x64 で割り当てられていないメモリを与える値であることがわかります。

ここで何が起こっているのか見てみましょう。ではmain()、一連の int を定義します。と言うときに、これらの int への参照を渡しますinputData(&inputs, &booknmbr, &nmbrpurchased, &bookcost)。その関数には署名がありますvoid inputData(int* inputs, int* booknmbr, int* nmbrpurchased, int* bookcost)-これまでのところとても良いです。

...それからあなたscanf("%d", &booknmbr)。ちょっと考えてみてください。

それは正しい。scanf()ポインターだけでなく、塗りつぶしたい整数へのポインターへの参照を渡しています。scanf()おそらくいつもそのように呼び出しを書いていて、それが習慣になっているので、陥りやすい罠です。それを a に置き換えるとscanf("%d", booknmbr)、世界が再び正しくなります。

于 2012-10-06T01:55:49.763 に答える
2

変数のアドレスinputData...に渡していますこれを試してください:

/* not using inputs? */
void inputData(int* pinputs, int* pbooknmbr, int* pnmbrpurchased, int* pbookcost)  {
    printf( "\nEnter the Book Product Number?\n" );
    scanf("%d", pbooknmbr);
    printf( "Enter the Number of Books Purchased?\n" );
    scanf("%d", pnmbrpurchased);
    printf( "Enter the Cost of the Book Purchased?\n");
    scanf("%d", pbookcost);
    printf( "TEST: %u\n", *pbookcost);
} 

にも同様の問題がtotalありoutputInfoます。どの変数がポインターで、どの変数がスカラー値であるかに注意して、コードを注意深く読み、詳細に注意を払う必要があります。ここで行ったように、ポインターに別の名前を付けると役立ちます。

于 2012-10-06T01:50:41.997 に答える