2012-12-06 155 views
1
float a, b; 
float sa() { return a;}; 
int main() { 
    a = 10; 
    b = sa(); 
    printf("%f", b); 
    return 0; 
} 

這是我的代碼的簡化版本。 我相信該程序應該打印10,但它給我真的很小的數字,如-65550,並不總是相同,但非常相似。C函數返回錯誤值

我已經使用調試器在返回之前檢查變量a的值,它是10,因此該函數返回10,但b設置爲類似於-65550之類的值。我不明白爲什麼會發生這種情況。

我會欣賞一些intell。

在此先感謝。

下面是完整的代碼:

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

int dimensiuni, nrBitiSolutie, bitiPeDimensiune, gasitInbunatatire, nrRulari; 
float limInf, limSup, precizie, valoareFunctie, minim, minimNou, T; 
char solutie[100000]; 
float solutieReala[100]; 

void generateRandomSolution(); 
void bitesToFloat(); 
void rastrigin(); 
void rosenbrock(); 
float nextFirstFit(); 
float nextBestFit(); 


void main() { 
    int k; 
    T = 10; 
    gasitInbunatatire = 1; 
    srand (time(NULL)); 
    printf("Introduceti numarul de dimensiuni: "); 
    scanf("%d", &dimensiuni); 
    printf("Introduceti limita inferioara si cea superioara: "); 
    scanf("%f%f", &limInf, &limSup); 
    printf("Introduceti precizia: "); 
    scanf("%f", &precizie); 

    //calculam numarul de biti necesari ca sa reprezentam solutia 
    nrBitiSolutie = dimensiuni * ceil(log(limSup-limInf * pow(10, precizie)))/log(2.0); 
    bitiPeDimensiune = nrBitiSolutie/dimensiuni; 

    //generam o solutie random 
    generateRandomSolution(); 
    bitesToFloat(); 
    rastrigin(); 
    minim = valoareFunctie; 

    printf("Pornim de la %f\n", minim); 

    while((nrRulari < 10000) && (T > 0.001)) { 
     minimNou = sa(); //error occurs here. sa() returns about 200 but minimNou is set to -65550 
     if (minimNou < minim) { 
      printf("Minim nou: %f\n", minimNou); 
      minim = minimNou; 
      T *= 0.995; 
     } 
     nrRulari++; 
    } 
    printf("Minimul aproximat: %f\n", minim); 
    system("pause"); 
} 

void generateRandomSolution() { 
    int l; 
    for (l = 0; l < nrBitiSolutie; l++) solutie[l] = rand()%2; 
} 

void bitesToFloat() { 
    int i, parcurse = 1, gasite = 0; 
    int variabila = 0; 
    float nr; 
    for (i = 0; i < nrBitiSolutie; i++) { 
     variabila = variabila<<1 | (int)solutie[i]; 
     if(parcurse == bitiPeDimensiune) { 
      nr = (float)variabila/(float)pow(2, bitiPeDimensiune); 
      nr *= limSup-limInf; 
      nr += limInf; 
      nr *= pow(10, precizie); 
      nr = (int)nr; 
      nr /= pow(10, precizie); 
      parcurse = 0; 
      solutieReala[gasite++] = nr; 
      variabila = 0; 
     } 
     parcurse++; 
    } 
} 

void rastrigin() { 
    int i; 
    valoareFunctie = 10 * dimensiuni; 
    for (i = 0; i < dimensiuni; i++) { 
     valoareFunctie += pow((float)solutieReala[i], 2) - 10 * (float)cos(2 * 3.14 * (float)solutieReala[i]); 
    } 
} 

void rosenbrock() { 
    int i; 
    valoareFunctie = 0; 
    for (i = 0; i < dimensiuni - 1; i++) { 
     valoareFunctie += 100 * pow((solutieReala[i+1] - pow(solutieReala[i], 2)), 2) + pow((1-solutieReala[i]), 2); 
    } 
} 

float sa() { 
    int j; 
    for (j = 0; j < nrBitiSolutie; j++) { 
     solutie[j] = solutie[j] == 0 ? 1 : 0; 
     bitesToFloat(); 
     rastrigin(); 
     if (valoareFunctie < minim) return valoareFunctie; 
     else if ((rand()/INT_MAX) < exp((minim - valoareFunctie)/T)) 
      return valoareFunctie; 
     else solutie[j] = solutie[j] == 0 ? 1 : 0; 
    } 
    return minim; 
} 

我已經打上其中具有error occurs here評論

+1

您的代碼似乎沒問題,也許你*簡化了*不正確? :) –

+1

你確定你已經正確地複製了代碼嗎?它看起來應該打印10給我(和我很方便的編譯器同意)。 –

+1

我試了一下,打印10 – Addict

回答

5

出現錯誤錯誤地簡化了代碼。在您的簡化中,您在調用之前定義了sa()。但是在完整的程序中,您在定義之前先撥打sa()。在沒有聲明的情況下,函數被假定返回int。由於你的函數實際返回一個float,結果是未定義的。 (在這種情況下,您將從浮點堆棧的頂部讀取垃圾值,然後浮點堆棧將下溢,並且從那裏開始下坡)。

+0

我剛剛意識到我忘了在發佈之前就宣佈了sa()函數。這是我正在尋找的答案,並且非常好地解釋了在沒有聲明的情況下返回的內容。謝謝。 –

+0

Yuck!還有一個讓人討厭C的理由。 –

+0

@JanDvorak自1999年以來,隱式聲明不再是C的一部分。您只需告訴編譯器您需要C99或C2011。 –