2013-11-02 79 views
-1

我的C代碼中有一個奇怪的運行時錯誤。這裏的Integers比較工作正常。但在Decimals比較中,我總是得到第二個數字大於第一個數字,這是錯誤的。我對C和編程一般都很陌生,所以這對我來說是一個複雜的應用程序。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(); 
} 
} 
+7

請忘記goto存在......更重要的是無論打破你的程序。 – SJuan76

+0

作爲提示,爲'Integers'和'Decimals'創建函數,並在這裏調用它們而不是使用'goto'。 –

+2

只要我看到'goto',我就停下來試圖找出問題所在。 – John3136

回答

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缺少任何類型的信息的參數。使用舊學校C標準,函數假設a bint

結果是傳遞了2 double,這些典型的2 * 8字節在函數中被接收,並且期望通常是int的2 * 4字節。因此,所傳遞的數據的類型和大小不匹配,隨後出現各種未定義的行爲(UB)。

原型設計將有所幫助,如下所示。

bool big(double a, double b) 

在+側,OP的職位是完整的。


其他關注:從main()
main()
無返回
goto
呼叫應使用lager_double(double, double)lager_long(long, long)
過度使用標籤。