2013-03-14 271 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

相關問題