C函数返回一个值,但调用者指定另一个值

时间:2013-03-14 18:51:59

标签: c return-value

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

我把代码的图像(按照执行顺序):

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这样的值。

2 个答案:

答案 0 :(得分: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的{​​{1}}循环相同:

fTemp

当您只分配for (i = 0; i < d->m_iPopulationSize; ++i) 时,您正在访问arrfCache数组的d->m_iPopulationSize。如果d->m_iMaxGenerations较小,则可能会导致内存损坏和您见过的奇怪值。

答案 1 :(得分: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] = ...