2013-03-14 107 views
1

我有一个名为from_binary_to_decimal的C函数,它被另一个函数x_caching调用。问题是from_binary_to_decimal返回例如2.25(一个浮点数),但x_caching(有一行写入来存储返回值)修改了第一个函数返回的以前的值。C函数返回值但调用者分配另一个值

我把(在其下它们被执行的顺序)代码的图像:

float** cache_provider(struct INPUT_DATA* d, char** arrszChromosomes) 
{ 
    static float** arrfCache = NULL; 
    int i; 
    if (d == NULL && arrszChromosomes == NULL) return arrfCache; 

    if (arrfCache == NULL) 
    { 
     arrfCache = (float**)malloc(d->m_iPopulationSize * sizeof(float*)); 
     for (i = 0; i < d->m_iPopulationSize; ++i) 
     arrfCache[i] = (float*)malloc(2 * sizeof(float)); 
    } 

    x_caching(d, arrszChromosomes, &arrfCache); 

    return arrfCache; 

}

void x_caching(struct INPUT_DATA *d, 
       char **arrszChromosomes, 
       float **arrfCache) 
{ 
    int i; 
    float fTemp = 0.0f; 

    for (i = 0; i < d->m_iPopulationSize; ++i) { 
     arrfCache[i][0] = get_cache_key(arrszChromosomes[i]); 
     fTemp = from_binary_to_decimal(d, arrszChromosomes[i], 0); 
     arrfCache[i][1] = fTemp; 
    } 
} 

float from_binary_to_decimal(struct INPUT_DATA *d, 
          char *szChromosome, 
          int iCacheQuery) 
{ 
    float fRetVal = 0.0; 
    float fFinal = 0.0f; 
    float *fCacheVal = NULL; 
    int i = 0; 

    if (iCacheQuery 
     && (fCacheVal = get_x_value_from_cache(szChromosome)) != NULL) 
     return *fCacheVal; 

    for (i = 0; i < strlen(szChromosome); ++i) 
     fRetVal += 
      (szChromosome[i] == '1' ? 1 : 0) * 
      powf(2, d->m_iBitsPChromosome - (i + 1)); 

    fFinal = d->m_arrcDomainInterval[0] + (fRetVal * d->m_fDelta); 
    return fFinal; 
} 

fTemp本来存储多个像2.51代替它被存储值如8133608.

+0

后这里作为文本的代码,没有人会打扰你的如下链接 – stdcall 2013-03-14 18:55:07

+0

我更新了我的问题,如果没有被格式化得当那是因为我即将用完代表的。请帮助。谢谢。 – 2013-03-14 19:02:55

+0

你在什么时候检查'fTemp'的值?你使用调试器吗? – moooeeeep 2013-03-14 19:05:20

回答

3

对于初学者,您分配的浮点数组的数量以及用于访问它们的数组索引是不同的:

arrfCache = (float**)malloc(d->m_iMaxGenerations * sizeof(float*)); 
for (i = 0; i < d->m_iPopulationSize; ++i) 
    arrfCache[i] = (float*)malloc(2 * sizeof(float)); 

你分配d->m_iMaxGenerations浮标阵,但你通过他们的d->m_iPopulationSize迭代。

同为for循环,你必须fTemp

for (i = 0; i < d->m_iPopulationSize; ++i) 

您正在访问arrfCached->m_iPopulationSize阵列,当你只分配d->m_iMaxGenerations。如果d->m_iMaxGenerations较小,则可能导致内存损坏和奇怪的值,例如您看到的。

3

您从未将arrfCache设置为非空值。此外,x_caching应具有以下格式的声明:

void x_caching (struct INPUT_DATA* d, char** arrszChromosomes, float*** arrfCache) 

正如您希望将arrfCache作为输出参数。

x_caching(d, arrszChromosomes, &arrfTempCache); 
... 
*arrfCache = malloc(....) 
.... 
(*arrfCache)[i][0] = ... 
+0

感谢您指出wilsonmichaelpatrick的malloc错误,我纠正了它们,但错误依然存在。 Valeri Atamaniouk,你能向我解释为什么我需要arrfCache这种类型的声明吗?我只需要一个二维数组,其中像float **这样的声明可以做得很好。我几乎忘了cache_provider中有一个类型为arrfTempCache = NULL的赋值,它将作为对其他函数的引用传递。 – 2013-03-14 19:18:43

+1

@JorgeCespedes你正在尝试使用一个实际返回值的参数。由于你的类型是'float **',你需要添加一个指针来让你的函数改变变量值,所以参数变成'float ***'。是的,这有点令人困惑,但这是你如何修改调用者的价值。恭敬地,所有对该值的引用应该使用'*'运算符。您可以将'float **'类型保留为输入,只有当您将其添加到返回类型时,您的代码将如下所示:'arrfTempCache = x_caching(d,arrszChroms,arrfTempCache'。恭敬地,函数需要返回正确的val。 – 2013-03-14 19:26:16

+0

@ValeruAtamaniouk我现在明白了,我会做这个修改,看看它现在是否有效。谢谢 – 2013-03-14 19:29:00

相关问题