2015-02-24 76 views
0

我有一個非常詳細的while循環,並已真正抵制不得不再次尋求幫助,但我很茫然!對於這個while循環代碼,我真的很抱歉,有很多事情要做,但我不想留下任何東西,以防萬一觀衆需要看到這一切。我在Swift中的while循環不會終止,我錯過了什麼?

func retRhoCurrent() -> Double { 
     while abs(pTarget - pCalc) > 1 { 

      // 
      // SET rhoCurrent 
      // 

      if (pTarget > pCalc) { 
       rhoLow = rhoCurrent 
       if(rhoCurrent >= rhoHigh) { 
        rhoCurrent += RHO_C 
        rhoHigh = rhoCurrent 
       } else { 
        rhoCurrent += ((rhoHigh - rhoCurrent)/2) 
       } 
      } else { 
       rhoHigh = rhoCurrent 
       rhoCurrent += ((rhoLow - rhoCurrent)/2) 
      } 

      // 
      // SET rhoR 
      // 

      rhoR = rhoCurrent/RHO_C 

      // 
      // SET DIFFERENTIAL 
      // 
      diffAggregate = 0 
      for var kIndex = 0; kIndex < NK_VALUES.count; ++kIndex { 
       diffSegment = NK_VALUES[kIndex] 
       diffSegment *= pow(rhoR, IK_VALUES[kIndex]) 
       diffSegment *= pow(tempR, JK_VALUES[kIndex]) 
       iFactor = 0 
       if LK_VALUES[kIndex] > 0 { 
        diffSegment *= exp(-1 * pow(rhoR, LK_VALUES[kIndex])) 
        iFactor = LK_VALUES[kIndex] * pow(rhoR, LK_VALUES[kIndex]) 
       } 
       if PK_VALUES[kIndex] > 0 { 
        diffSegment *= exp(-1 * PK_VALUES[kIndex] * pow(rhoR, 2) - BK_VALUES[kIndex] * pow(tempR - UK_VALUES[kIndex], 2)) 
        iFactor = 2 * rhoR * PK_VALUES[kIndex] * (rhoR - 1) 
       } 
       diffAggregate += (diffSegment * (IK_VALUES[kIndex] - iFactor)) 
      } 

      // 
      // SET pCalc 
      // 
      zDiff + 1 + diffAggregate 
      pCalc = zDiff * R_CONST * 1000 * tempK * rhoCurrent 
     } 
     return rhoCurrent 
    } 

我想另一個問題,我也就是主要價值我想出來這個while循環的是rhoCurrent(我會用這最後#計算別的東西)。做「返回rhoCurrent」將工作,更正?

非常感謝!

+1

幾個快速評論:1)你在哪裏設置pTarget值? 2)似乎這比編程問題更關於算法。也許輸出值會幫助你看看它是否如你所期望的那樣收斂,或者你有一個合乎邏輯的問題... – Rusty30 2015-02-24 18:35:15

+0

你預期會發生什麼,以及你觀察到了什麼? 「pTarget」的典型值是什麼?當循環迭代時,'pCalc'接近該值嗎? – Caleb 2015-02-24 18:51:58

回答

2

我想你打算此行分配一個值,但是它沒有:

zDiff + 1 + diffAggregate 

因爲它不分配一個值,diffAggregate未在while循環體中使用。因此,也不使用rhoR。你的函數可以簡化爲這樣:

func retRhoCurrent() -> Double { 
     while abs(pTarget - pCalc) > 1 { 

      // 
      // SET rhoCurrent 
      // 

      if (pTarget > pCalc) { 
       rhoLow = rhoCurrent 
       if(rhoCurrent >= rhoHigh) { 
        rhoCurrent += RHO_C 
        rhoHigh = rhoCurrent 
       } else { 
        rhoCurrent += ((rhoHigh - rhoCurrent)/2) 
       } 
      } else { 
       rhoHigh = rhoCurrent 
       rhoCurrent += ((rhoLow - rhoCurrent)/2) 
      } 

      // 
      // SET pCalc 
      // 
      pCalc = zDiff * R_CONST * 1000 * tempK * rhoCurrent 
     } 
     return rhoCurrent 
    } 

我真的懷疑你在循環使用,但不會在函數中初始化變量。 rhoLow,rhoHigh,rhoCurrent,tempK,zDiff,pTargetpCalc的初始值是什麼?

這種方法非常混亂,取決於很多魔法。它正在修改它不擁有的值,這意味着您可能會在應用程序的其他區域遇到意想不到的事情。這絕對不是線程安全的(儘管這可能不是您的問題)。

+0

嗨伊恩,哇!我不能相信我錯過了那個簡單的錯誤......好眼睛!對於我的變量rhoLow,rhoHigh,rhoCurrent等等,我最初將它們設置爲零。 pTarget是唯一一個具有用戶輸入壓力的初始值的人。我會嘗試修復這一行,看看它是否正確輸出我正在尋找的東西。再次感謝您花時間瀏覽我的代碼混亂 – Matty 2015-02-24 18:47:40

+0

只是好奇:哪部分不是線程安全的?謝謝。 – Unheilig 2015-02-24 18:51:47

+1

他正在修改範圍內未由該範圍保存的變量的部分。如果在兩個不同的線程中同時調用該方法,則它們都可以獨立更改「rhoHigh」的值(例如),並將其餘線程的剩餘部分搞亂。 – 2015-02-24 18:52:45