2011-10-31 102 views
4

我有以下代碼:警告:語句沒有效果(C++)

void CScriptTable::EnumReferences(asIScriptEngine *engine) 
{ 
    if (m_table) 
    { 
     // Call the gc enum callback for each nested table  
     size_t col = 0, row = 0, num_cols = m_table->numCols(), num_rows = m_table->numRows(); 

     for(col; col < num_cols; col++) // Line 92 
     { 
      if (m_table->getColType(col) == COL_TABLE) { 
       for (row; row < num_rows; row++){ // Line 95 
        Table * tbl = m_table->getTable(row, col); 
        engine->GCEnumCallback(tbl); 
       } 
      } 
     } 
    } 
} 

編譯時,(G ++),警告(聲明沒有作用)被用於線路發出92 & 95(在所示上面的片段)

我看不出爲什麼他們沒有效果,即使我一直盯着它一段時間 - 可以用第二對眼睛做,看看他們能否發現我失蹤。 (?作爲小費也許)

+2

分手了你的變量聲明。這條線是瘋狂的。爲什麼你在循環外部聲明瞭你的循環變量?不要這樣做。 –

+1

你的代碼中有一個微妙的錯誤。在進入'col'循環之前'row'被設置爲0,並且之後永遠不會重置。因此,在外層('col')循環的第一次迭代中,你迭代了行,但對於所有其他迭代,你什麼都不做。請參閱@ b.buchhold的答案,它可以解決您的原始問題和這個錯誤...並學會盡可能在範圍內聲明您的變量。 –

回答

7

如果猜你想遍歷所有列,併爲他們每個人的所有行。所以最好將代碼更改爲如下所示:

for循環中的第一條語句會執行一次,即在首先輸入循環時。既然你要包括所有進一步的列行數爲零,你也得行設置爲0,每一列:

void CScriptTable::EnumReferences(asIScriptEngine *engine) 
{ 
    if (m_table) 
    { 
     // Call the gc enum callback for each nested table  
     size_t num_cols = m_table->numCols(), num_rows = m_table->numRows(); 

     for(size_t col = 0; col < num_cols; col++) // Line 92 
     { 
      if (m_table->getColType(col) == COL_TABLE) { 
       for (size_t row = 0; row < num_rows; row++){ // Line 95 
        Table * tbl = m_table->getTable(row, col); 
        engine->GCEnumCallback(tbl); 
       } 
      } 
     } 
    } 
} 
+0

+1,正在編寫完全一樣的東西。 – Roman

0

如果你真的想在你的循環型變量名,試圖通過改變:

for(col; col < num_cols; col++) 

到這樣的事情:

for(col = col; col < num_cols; col++) 

兩個線。它應該完成這項工作。

+0

這有可能隱藏一個未初始化的變量警告,或者產生一個特別糟糕的「用自己初始化的變量」警告。我甚至看到了一個脆弱的編譯器崩潰。這是不好的風格。 – Potatoswatter

+0

這個錯誤發生在'col'還沒有初始化時,情況並非如此..我同意你的觀點,這是非常糟糕的風格,但是我假設他知道正確的語法.. – AlQafir

5
for(col; col < num_cols; col++) 

col; 

這沒有效果。你必須分配一些東西,或者根本不寫。既然你把它分配給你的循環,你只需要在那個地方留下一個空的;或者使用while循環。

6

這是關於循環的初始化部分中的colrow部分。那些陳述什麼都不做。只是將其刪除:

for(; col < num_cols; col++) 
0

我的猜測是,你可以簡單地使用

for(; col < num_cols; col++) // Line 92 

for (; row < num_rows; row++) { // Line 95 
2

你得到這些警告,因爲在for環路初始化語句表達,什麼也不做:

for(col; col < num_cols; col++) // line 92: "col" has no effect 
for(row; row < num_rows; row++) // line 95: "row" has no effect 

既然你已經初始化外循環這些變量,你可能想從for聲明中省略掉:

for(; col < num_cols; col++) // line 92 
for(; row < num_rows; row++) // line 95 

然而,在這裏做的最好的事情是在for初始化變量環本身,而不是外面他們:

// Call the gc enum callback for each nested table 
size_t num_cols = m_table->numCols(), num_rows = m_table->numRows(); 

for(size_t col = 0; col < num_cols; col++) // Line 92 
{ 
    if (m_table->getColType(col) == COL_TABLE) { 
     for (size_t row = 0; row < num_rows; row++){ // Line 95 
      Table * tbl = m_table->getTable(row, col); 
      engine->GCEnumCallback(tbl); 
     } 
    } 
}