2012-08-29 29 views
2

我正在處理這個問題一段時間,我無法弄清楚爲什麼它不起作用。該代碼只是用於解決仿真問題的工作程序的擴展。我剛剛向結構中添加了兩個字符串變量,並調整了必要的函數,以便交付附加參數。 Valgrind顯示大約20個不同的條件跳轉或移動取決於未初始化的值(s)錯誤。所有這些都提供了相同的錯誤消息:有條件跳轉或移動取決於函數調用上的未初始化值(s)

Uninitialised value was created by a stack allocation 
at 0x401E23: addproxel(int, int, int, double, std::string&, std::string&) (HNMM.cpp:360) 

低於相應的功能:

typedef struct tproxel *pproxel; 

typedef struct tproxel { 
    int  id;     /* unique proxel id for searching */ 
    int  s;     /* discrete state of SPN    */ 
    int  tau1k;    /* first supplementary variable  */ 
    int  tau2k;    /* second supplementary variable  */ 
    double val;     /* proxel probability    */ 
    string path;     /* previous path      */ 
    string output;    /* previous output     */ 
    pproxel left, right;   /* pointers to child proxels in tree */ 
} proxel; 


/* adds a new proxel to the tree */ 
void addproxel(int s, int tau1k, int tau2k, double val, string &path, string &output) { 
    proxel *temp, *temp2; 
    int cont = 1,id; 

    /* Alarm! TAUMAX overstepped! */ 
    if (tau1k >= TAUMAX) { 
     // printf(">>> %3d %3d %3d %7.5le \n", s, tau1k, val, TAUMAX); 
     tau1k = TAUMAX - 1; 
    } 

     /* compute id of new proxel */ 
    id = TAUMAX*(TAUMAX*s+tau1k)+tau2k; 

    /* New tree, add root */ 
    if (root[sw] == NULL) { 
     root[sw] = insertproxel(s,tau1k, tau2k, val, path, output); 
     root[sw]->left = NULL; 
     root[sw]->right = NULL; 
     return; 
    } 

    /* Locate insertion point in tree */ 
    temp = root[sw];  
    while (cont == 1) { 
     if ((temp->left != NULL) && (id < temp->id)) 
      temp = temp->left; 
     else 
      if ((temp->right != NULL) && (id > temp->id)) 
       temp = temp->right; 
      else 
       cont = 0; 
    } 

    /* Insert left leaf into tree */ 
    if ((temp->left == NULL) && (id < temp->id)) { 
     temp2  = insertproxel(s, tau1k,tau2k, val, path, output); 
     temp->left = temp2; 
     temp2->left = NULL; 
     temp2->right = NULL; 
     return; 
    } 

    /* Insert right leaf into tree */ 
    if ((temp->right == NULL) && (id > temp->id)) { 
     temp2  = insertproxel(s, tau1k,tau2k, val, path, output); 
     temp->right = temp2; 
     temp2->left = NULL; 
     temp2->right = NULL; 
     return; 
    } 

    /* Proxels have the same id, just add their vals */ 
    if (id == temp->id) { 
     temp->val += val; 
     return; 
    } 
    printf("\n\n\n!!!!!! addproxel failed !!!!!\n\n\n"); 
} 

/* compute size of tree */ 
int size(proxel *p) { 
    int sl, sr; 
    if (p == NULL) 
     return(0); 
    sl = size(p->left); 
    sr = size(p->right); 
    return(sl+sr+1); 
} 

添加了兩個字符串變量的代碼工作得很好,但現在我越來越只讀存儲器訪問違規。經過幾個小時的努力使代碼工作,我不知道,什麼是錯的。

我希望有人能告訴我我錯過了什麼幫助,將不勝感激。

編輯:

我改變什麼被@Jens指出了回到工作的代碼在原PROGRAMM,現在我得到不同的錯誤:

==1900== 1 errors in context 1 of 4: 
==1900== Invalid read of size 4 
==1900== at 0x5159218: std::string::assign(std::string const&) (in /usr/lib/libstdc++.so.6.0.13) 
==1900== by 0x401CF1: insertproxel(int, int, int, double, std::string&, std::string&) (HNMM.cpp:347) 
==1900== by 0x401E48: addproxel(int, int, int, double, std::string&, std::string&) (HNMM.cpp:374) 
==1900== by 0x402195: main (HNMM.cpp:465) 
==1900== Address 0xfffffffffffffff8 is not stack'd, malloc'd or (recently) free'd 
==1900== 
==1900== 
==1900== 1 errors in context 2 of 4: 
==1900== Use of uninitialised value of size 8 
==1900== at 0x5159218: std::string::assign(std::string const&) (in /usr/lib/libstdc++.so.6.0.13) 
==1900== by 0x401CF1: insertproxel(int, int, int, double, std::string&, std::string&) (HNMM.cpp:347) 
==1900== by 0x401E48: addproxel(int, int, int, double, std::string&, std::string&) (HNMM.cpp:374) 
==1900== by 0x402195: main (HNMM.cpp:465) 
==1900== Uninitialised value was created by a heap allocation 
==1900== at 0x4C274A8: malloc (vg_replace_malloc.c:236) 
==1900== by 0x401C57: insertproxel(int, int, int, double, std::string&, std::string&) (HNMM.cpp:336) 
==1900== by 0x401E48: addproxel(int, int, int, double, std::string&, std::string&) (HNMM.cpp:374) 
==1900== by 0x402195: main (HNMM.cpp:465) 
==1900== 
==1900== 
==1900== 1 errors in context 3 of 4: 
==1900== Conditional jump or move depends on uninitialised value(s) 
==1900== at 0x51591A5: std::string::assign(std::string const&) (in /usr/lib/libstdc++.so.6.0.13) 
==1900== by 0x401CF1: insertproxel(int, int, int, double, std::string&, std::string&) (HNMM.cpp:347) 
==1900== by 0x401E48: addproxel(int, int, int, double, std::string&, std::string&) (HNMM.cpp:374) 
==1900== by 0x402195: main (HNMM.cpp:465) 
==1900== Uninitialised value was created by a heap allocation 
==1900== at 0x4C274A8: malloc (vg_replace_malloc.c:236) 
==1900== by 0x401C57: insertproxel(int, int, int, double, std::string&, std::string&) (HNMM.cpp:336) 
==1900== by 0x401E48: addproxel(int, int, int, double, std::string&, std::string&) (HNMM.cpp:374) 
==1900== by 0x402195: main (HNMM.cpp:465) 
==1900== 
==1900== 
==1900== 1 errors in context 4 of 4: 
==1900== Conditional jump or move depends on uninitialised value(s) 
==1900== at 0x5159181: std::string::assign(std::string const&) (in /usr/lib/libstdc++.so.6.0.13) 
==1900== by 0x401CF1: insertproxel(int, int, int, double, std::string&, std::string&) (HNMM.cpp:347) 
==1900== by 0x401E48: addproxel(int, int, int, double, std::string&, std::string&) (HNMM.cpp:374) 
==1900== by 0x402195: main (HNMM.cpp:465) 
==1900== Uninitialised value was created by a heap allocation 
==1900== at 0x4C274A8: malloc (vg_replace_malloc.c:236) 
==1900== by 0x401C57: insertproxel(int, int, int, double, std::string&, std::string&) (HNMM.cpp:336) 
==1900== by 0x401E48: addproxel(int, int, int, double, std::string&, std::string&) (HNMM.cpp:374) 
==1900== by 0x402195: main (HNMM.cpp:465) 

各自的代碼並且誤差條生產線:

/* get a fresh proxel and copy data into it */ 
proxel *insertproxel(int s, int tau1k, int tau2k, double val, string &path, string &output) { 
    proxel *temp; 
    /* create new proxel or grab one from free list */ 
    if (firstfree == NULL) 
    temp = (proxel*) malloc(sizeof(proxel)); 
    else { 
    temp = firstfree; 
    firstfree = firstfree->right; 
    } 
    /* copy values */ 
    temp->id = TAUMAX*(TAUMAX*s+tau1k)+tau2k; 
    temp->s  = s; 
    temp->tau1k = tau1k; 
    temp->tau2k = tau2k; 
    temp->val = val; 
    temp->path = string(path); 
    temp->output = string(output); 
    ccpcnt  += 1; 
    if (maxccp < ccpcnt) { 
     maxccp = ccpcnt; 
     //printf("\n ccpcnt=%d",ccpcnt); 
    } 
    return(temp); 
} 

線336:

temp = (proxel*) malloc(sizeof(proxel)); 

行347:

temp->path = string(path); 

行374:

root[sw] = insertproxel(s,tau1k, tau2k, val, path, output); 
+1

你可以標記線? –

+0

哪些是報告的行,包括「條件跳轉或移動」和「創建值」消息?此外,如果您可以將您的代碼縮減爲顯示該問題的最小,完整的程序,將會非常有幫助。 –

回答

3

insertproxel要返回堆棧分配的變量的引用:

proxel temp2 = {0}; 
    temp = &temp2; 
    /* ... */ 
    return(temp); 
+0

感謝您的幫助,我已將代碼更改回此功能的原始代碼,但現在我收到更多錯誤。你可以在我編輯的開場白中找到更多細節。 – Faoran

+0

當包含'std :: string'時,不能使用'malloc'來分配'struct tproxel'。字符串構造函數將不會被調用。使用'新tproxel'。 (呵呵,'typedef struct foo {...} bar'是C++中的成語,你在C++中也不需要 - struct foo的聲明將使foo成爲一個類型名稱。) –

+0

Once再次感謝您的幫助,現在一切都按預期工作。 – Faoran

相關問題