2015-02-24 120 views
0
int main(){ 
    int size; 

    cout << "How many vertices? \n"; 
    cin >> size; 

    while (size > 20 || size < 0) { 
    cout << "Error. Enter new number: "; 
    cin >> size; 
    } 

    int graph[size][MAX_VERTICES],x,y; 
    InitializeGraph(graph, size); 
    while(x != 0 || y != 0) { 
    for(int i = 0; i<= size; i++){ 
    cout << "Enter a vertex pair(0 0 to end): "; 
    cin >> graph[x][y]; 
    } 
    } 
} 

當我在我的程序中運行此代碼時,出現分段錯誤錯誤,我不知道我在做什麼錯誤。有什麼建議麼?運行代碼並得到分段錯誤錯誤

+0

什麼'graph'?你如何聲明和初始化它?如果它是一個數組或向量,那麼在將它們用作索引之前,需要檢查「x」和「y」是否在範圍內。 – 2015-02-24 17:31:50

+0

請發佈'graph'聲明爲什麼,發生崩潰時'x'和'y'的值是什麼。 – PaulMcKenzie 2015-02-24 17:32:27

+0

你永遠不會改變x和y,所以如果它們不是0,那麼你會得到一個無限循環。 – NathanOliver 2015-02-24 17:32:29

回答

0

當你聲明本地(非靜態)變量時,它們將不會被初始化,它們的值將是不確定的(實際上它們看起來是隨機的)。使用這種變量除了初始化它將導致undefined behavior,這是崩潰最常見的原因之一。

你正在做什麼是通過使用這些未初始化的變量作爲數組的索引寫入內存中的隨機位置。


你似乎想要做的是首先讀取x和y值,然後讀取一個值到該位置。

我建議是這樣的:

std::vector<std::vector<int>> graph(size, std::vector<int>(MAX_VERTICES)); 
unsigned int x, y; // No negative numbers allowed 

while (true) 
{ 
    std::cout << "Please enter two vertices (end with any being 0): "; 
    if (std::cin >> x >> y) 
    { 
     if (x > size || y > MAX_VERTICES) 
     { 
      std::cout << "Those vertices are to big, pleas try again\n"; 
      continue; 
     } 
     if (x == 0 || y == 0) 
      break; // End of input 

     std::cout << "Please enter a value for (" << x << ',' << y << '): "; 
     // -1 because the indexes entered by the user are 1-based, 
     // vector indexes are 0-based 
     std::cin >> graph[x - 1][y - 1]; 
    } 
    else 
    { 
     if (std::cin.eof()) 
      break; // User terminated input by end-of-file 
     else 
     { 
      std::cout << "Please enter two integer values equal or larger than zero.\n"; 
      std::cin.clear(); // Clear the error, and try again 
     } 
    } 
} 
相關問題