2013-11-22 511 views
0

你好,我插入一些值到一個哈希表(已實現的哈希表以及測試和工程) 我用的fscanf文件中讀取和存儲字符串和浮子中變量的值。奇怪的指針行爲while循環

文本文件看起來像這樣:

die 0.000000 
laun -4.102468 
des -7.952615 
verliebt -6.080813 
ein -8.645762 
schaferspiel -4.315029 
in -8.645762 
vers -5.755391 
und -8.645762 
akt -3.909564 
person -8.645762 
egl -8.645762 

像這樣的作品讀:

//scan text for scheme WORDSTEM PROBABLITIY 
r = fscanf(text, "%s %f\n", wordstem, &prob); 
//doing some pointer madness!!! 
pProb = &prob; 
float PpProb = *pProb; 
float *PPpProb = &PpProb; 
char *cpStr = strdup(wordstem); 
hashtable_access(wordHash, cpStr,PPpProb); //insert into hashtable_t 
while (r != EOF){ 
    float prob1; 
    r = fscanf(text, "%s %f\n", wordstem, &prob1); 
    //printf("%f",prob1); 
    char *cpStr1 = strdup(wordstem); 
    float a = 0; 
    float *PpProb1 = &a; 
    float *pProb1 = &prob1; 
    *PpProb1 = *pProb1; 
    hashtable_access(wordHash, cpStr1,PpProb1); 
    pProb1 = NULL; 
    //do till EOF 
} 
float *pHashProb = (float *)hashtable_access(wordHash, "schaferspiel", NULL); 
float hashProb = *pHashProb; 
printf("%f\n",hashProb); 

的問題是,對於第一項的哈希返回「死」的正確值,但schaferspiel和第一個返回後的每個其他鍵總是返回最後一個值。

哈希表需要保存的指針。我不確定我做錯了什麼,因爲我認爲我複製了prob1的值。

有人可以幫我。

回答

1

有你的代碼的一些問題(例如,我不明白爲什麼你在做之前,循環,但在循環休息一個插件),但我認爲主要的問題是,你正在使用的在散列表中重複使用與浮點相同的指針。嘗試是這樣的:

float prob; 
float *probCopy; 

//scan text for scheme WORDSTEM PROBABLITIY 
r = fscanf(text, "%s %f\n", wordstem, &prob); 
probCopy = (float*)malloc(sizeof(float)); 
*probCopy = prob; 
char *cpStr = strdup(wordstem); 
hashtable_access(wordHash, cpStr, probCopy); //insert into hashtable_t 
while (r != EOF) { 
    float prob1; 
    r = fscanf(text, "%s %f\n", wordstem, &prob1); 
    probCopy = (float*)malloc(sizeof(float)); 
    *probCopy = prob1; 
    char *cpStr1 = strdup(wordstem); 
    hashtable_access(wordHash, cpStr1, probCopy); 
    //do till EOF 
} 
float *pHashProb = (float *)hashtable_access(wordHash, "schaferspiel", NULL); 
float hashProb = *pHashProb; 
printf("%f\n",hashProb); 

注意:您應該知道的一切,你把哈希表將可能「泄漏」,除非哈希表清理內存的元素指向(或者你明確地做你自己在別處)。

+0

WOW!這就像一個魅力!花費數小時修復它!非常感謝你! – arnoapp