2017-08-08 90 views
0

我一直在成功運行此語法的一個變量,但現在我正試圖將其更改爲foeach()循環,並採用一系列值並將結果顯示爲消息框。我在語法上的問題是ecll始終保留傳遞的第一個數字的值,並且對於數組中的每個後續數字都不會更新計算。計算未更新

我在哪裏發生了錯誤,是爲了防止它被更新爲數組中的每個後續數字?

private void btnGetData_Click(object sender, EventArgs e) 
{ 
    int start = 2; 
    int end = 10; 

    int[] nums = Enumerable.Range(start, end - start).ToArray(); 

    foreach (int n in nums) 
    { 
     float tp_x = 0, tp_y = 0; 

     SAP = new List<PointF>(); 
     float fbw = m_pd.bl[m_pd.bl.Count - 1].m_Width; 
     float Location1_X = tp_x + fbw; 
     float Location1_Y = tp_y; 
     SAP.Add(new PointF(Location1_X, Location1_Y)); 

     float iBH = gbh(m_pd.bl.Count - 1); 
     float lbw = m_pd.bl[0].m_Width; 
     float Location2_X = tp_x + lbw; 
     float Location2_Y = tp_y + (iBH) + 1.5f; 

     PointF rip = new PointF(); 
     if (!Getrip(ftp, rhep, ref rip)) 
     { 
     SAP = null; 
     return; 
     } 

     for (int iRowIndex = saii; iRowIndex < m_pd.pp.Count; iRowIndex++) 
     { 
     float Xvalue = m_pd.pp[iRowIndex].X; 
     float Yvalue = m_pd.pp[iRowIndex].Y; 
     SAP.Add(new PointF(Xvalue, Yvalue)); 

     if (Yvalue == LeftIntersectionPoint.Y) 
     { 
      pp.X = Xvalue; 
      pp.Y = Yvalue; 
      continue; 
     } 

     if (Xvalue >= rip.X) 
     { 
      Xvalue = rip.X; 
      SAP[SAP.Count - 1] = new PointF(rip.X, rip.Y); 
     } 

     if (Xvalue == rip.X) 
     { 
      break; 
     } 

     pp.X = Xvalue; 
     pp.Y = Yvalue; 
     } 

     double ecll = Getll(Location1_X, Location1_Y, rip.X, rip.Y); 

     Messagebox.Show(Convert.ToString(ec11)); 
     txtLength.Text = ll.ToString("0.00"); 
    } 
} 
+0

現在是瞭解如何使用所選工具集的調試器的時候了。 – nvoigt

+0

@nvoigt - 我正在使用VS2017 - 我已經使用了調試器和立即窗口,並將問題跟蹤到Location1_X&Location1_Y,當n被更改時不會更改值。但我不明白爲什麼不。 –

+2

它們被設置在一個點上。你可以在那裏放置一個斷點。他們似乎不依賴'n',你爲什麼期望他們改變?此時'tp_x'和'tp_y'將始終爲零。 – nvoigt

回答

2

我覺得這更多的是基於什麼是怎麼回事評論,但我種的需要代碼部分解釋這更好,我相信。

讓我們從你的觀點,寬度等簡化掉我想我們都同意,n爲從未在函數中使用,所以讓我們做一個類似的例子:

所以我我寫了一個功能,增加了1至1

var newNum = 1 + 1; 

它做什麼預期,將newNum 2,但讓我們說,我想,使其在NUMS加1號(從原始功能),以加強它:

int start = 2; 
int end = 10; 

int[] nums = Enumerable.Range(start, end - start).ToArray(); 

但如果我嘗試重用我的直接功能:

foreach (int n in nums) 
{ 
    var newNum = 1 + 1; 
} 

每一個傳球,我總是將不得不newNum設置爲2,因爲我沒有使用的變量。

我應該做的是這樣寫:

foreach (int n in nums) 
{ 
    var newNum = 1 + n; 
} 

所以根據你的2至10,我應該看到newNum〜11設置爲3在不同迭代。

0

'Foreach'循環中的每次迭代都將一個新值賦給'n'。 但是在循環體中,這個值(n)在計算中的任何地方都沒有使用(除非我錯過了某些東西)。所以,這些計算結果當然總是一樣的。

只要你有「N」中的一些calclations,結果會改變......

+0

,但在我修改代碼以包含foreach循環之前,單個變量(我更改爲數組)的值未用於計算rip.x&rip。年。這就是爲什麼我沒有把它包含在我的修改中。 –

+0

但是現在寫的方式,除了只說「吐出結果n次」之外,您並沒有使用nums/n – Robert

+0

如果單個變量對計算沒有影響,爲什麼您會期望幾個不同的值該變量來改變結果? –