問題解決:無法獲取本地變量或參數的值,因爲它在此指令指針中不可用,可能是因爲它已經被優化掉了。

本人遇到的這個問題是使用迭代程序造成內存泄漏(批量轉換時,在數據量較小時無問題,超過一定數量就崩潰),將其改成循環程序解決!實例如下:
遞歸算法:

public  double GetBottomLatitude(double Bf0, double x, double a, double f, double[] gaussCoefficient) {
            double e1Square = 2 * f - f * f;// first eccentricity square
            double FB0 = a * (1 - e1Square) * (gaussCoefficient[0] * Bf0 - gaussCoefficient[1] * Math.Sin(2 * Bf0) + gaussCoefficient[2] * Math.Sin(4 * Bf0) - gaussCoefficient[3] * Math.Sin(6 * Bf0) + gaussCoefficient[4] * Math.Sin(8 * Bf0) - gaussCoefficient[5] * Math.Sin(10 * Bf0) + gaussCoefficient[6] * Math.Sin(12 * Bf0));
            double FB1 = a * (1 - e1Square) * (gaussCoefficient[0] - 2 * gaussCoefficient[1] * Math.Cos(2 * Bf0) + 4 * gaussCoefficient[2] * Math.Cos(4 * Bf0) - 6 * gaussCoefficient[3] * Math.Cos(6 * Bf0) + 8 * gaussCoefficient[4] * Math.Cos(8 * Bf0) - 10 * gaussCoefficient[5] * Math.Cos(10 * Bf0) + 12 * gaussCoefficient[6] * Math.Cos(12 * Bf0));
            double Bf1 = Bf0 + (x - FB0) / FB1;
            if (Math.Abs(Bf0 - Bf1) < 0.00000000000005) {
                return Bf1;
            } else {
                return GetBottomLatitude(Bf1, x, a, f, gaussCoefficient);
            }
        }

循環算法:

public  double GetBottomLatitude(double Bf0, double x, double a, double f, double[] gaussCoefficient) {
            double e1Square = 2 * f - f * f;// first eccentricity square
            double FB0 = a * (1 - e1Square) * (gaussCoefficient[0] * Bf0 - gaussCoefficient[1] * Math.Sin(2 * Bf0) + gaussCoefficient[2] * Math.Sin(4 * Bf0) - gaussCoefficient[3] * Math.Sin(6 * Bf0) + gaussCoefficient[4] * Math.Sin(8 * Bf0) - gaussCoefficient[5] * Math.Sin(10 * Bf0) + gaussCoefficient[6] * Math.Sin(12 * Bf0));
            double FB1 = a * (1 - e1Square) * (gaussCoefficient[0] - 2 * gaussCoefficient[1] * Math.Cos(2 * Bf0) + 4 * gaussCoefficient[2] * Math.Cos(4 * Bf0) - 6 * gaussCoefficient[3] * Math.Cos(6 * Bf0) + 8 * gaussCoefficient[4] * Math.Cos(8 * Bf0) - 10 * gaussCoefficient[5] * Math.Cos(10 * Bf0) + 12 * gaussCoefficient[6] * Math.Cos(12 * Bf0));
            double Bf1 = Bf0 + (x - FB0) / FB1;
            while (Math.Abs(Bf0 - Bf1) >0.00000000000005)
            {
                Bf0 = Bf1;
                FB0 = a * (1 - e1Square) * (gaussCoefficient[0] * Bf0 - gaussCoefficient[1] * Math.Sin(2 * Bf0) + gaussCoefficient[2] * Math.Sin(4 * Bf0) - gaussCoefficient[3] * Math.Sin(6 * Bf0) + gaussCoefficient[4] * Math.Sin(8 * Bf0) - gaussCoefficient[5] * Math.Sin(10 * Bf0) + gaussCoefficient[6] * Math.Sin(12 * Bf0));
                FB1 = a * (1 - e1Square) * (gaussCoefficient[0] - 2 * gaussCoefficient[1] * Math.Cos(2 * Bf0) + 4 * gaussCoefficient[2] * Math.Cos(4 * Bf0) - 6 * gaussCoefficient[3] * Math.Cos(6 * Bf0) + 8 * gaussCoefficient[4] * Math.Cos(8 * Bf0) - 10 * gaussCoefficient[5] * Math.Cos(10 * Bf0) + 12 * gaussCoefficient[6] * Math.Cos(12 * Bf0));
                Bf1 = Bf0 + (x - FB0) / FB1;
            }
            return Bf1;
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章