2012-12-06 130 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。 –