2015-02-24 45 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