-1

C コードで奇妙なランタイム エラーが発生しました。ここでのIntegers比較はうまくいきます。しかし、Decimals比較すると、2 番目の数値が最初の数値よりも大きいことが常にわかりますが、これは誤りです。私は C とプログラミング全般にかなり慣れていないので、これは私にとって複雑なアプリケーションです。

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int choose;
long long neLimit = -1000000000;
long long limit = 1000000000;
bool big(a,b) {
    if ((a >= limit) || (b >= limit))
        return true;
    else if ((a <= neLimit) || (b <= neLimit))
        return true;
    return false;
}
void largerr(a,b) {
    if (a > b)
        printf("\nThe First Number is larger ..\n");
    else if (a < b)
        printf("\nThe Second Number is larger ..\n");
    else
        printf("\nThe Two Numbers are Equal .. \n");
}
int main() {
    system("color e && title Numbers Comparison && echo off && cls");
start:{
    printf("Choose a Type of Comparison :\n\t1. Integers\n\t2. Decimals \n\t\t     I Choose Number : ");
    scanf("%i", &choose);
    switch(choose) {
        case 1:
            goto Integers;
            break;
        case 2:
            goto Decimals;
            break;
        default:
            system("echo Please Choose a Valid Option && pause>nul && cls");
            goto start;
        }
    }
Integers: {
    system("title Integers Comparison && cls");
    long x , y;
    printf("\nFirst Number : \t");
    scanf("%li", &x);
    printf("\nSecond Number : ");
    scanf("%li", &y);
    if (big(x,y)) {
        printf("\nOut of Limit .. Too Big Numbers ..\n");
        system("pause>nul && cls") ; goto Integers;
    }
    largerr(x,y);
    printf("\nFirst Number : %li\nSecond Number : %li\n",x,y);
    goto exif;
}
Decimals: {
    system("title Decimals Comparison && cls");
    double x , y;
    printf("\nFirst Number : \t");
    scanf("%le", &x);
    printf("\nSecond Number : ");
    scanf("%le", &y);
    if (big(x,y)) {
        printf("\nOut of Limit .. Too Big Numbers ..\n");
        system("pause>nul && cls") ; goto Decimals;
    }
    largerr(x,y);
    goto exif;
}
exif:{
    system("pause>nul");
    system("cls");
    main();
}
}
4

1 に答える 1

0

関数には、パラメーターの型宣言が必要です。

OP が呼び出さbig()largerr()、変数x ydouble.

Decimals: {
  ...
  double x , y;
  ... 
  big(x,y)
  ...
  largerr(x,y)

これら2つの関数が宣言されています

bool big(a,b) {
...
void largerr(a,b) {

どちらの関数でも、パラメーターにa b型情報がありません。a b古い学校の C 標準を使用して、関数はare を想定していintます。

その結果、2doubleが渡され、これらの通常は 2*8 バイトが関数で受信され、通常は 2*4 バイトであると予想されますint。したがって、渡されるデータのタイプとサイズが一致せず、あらゆる種類の未定義の動作 (UB) が発生します。

以下のように、プロトタイピングが役立ちます。

bool big(double a, double b)

+側では、OPの投稿が完了しました。


その他の懸念事項:ラベルの 使用と 過度の使用 からの返品不可
goto
の呼び出し。main()
main()
lager_double(double, double)lager_long(long, long)

于 2013-11-06T21:13:06.513 に答える