【问题标题】:c++ code (malloc method) to c# codec++代码(malloc方法)到c#代码
【发布时间】:2014-01-23 15:36:09
【问题描述】:

我有这个 c++ 代码并将其转换为 c# (.net framework 4) 代码。 有人对 malloc、free 和 sprintf 方法有什么提示吗?

int monate = ee;
double *forward;
double *backward;
size_t bytes = 6*sizeof(double);
forward = (double *)malloc(monate * bytes);
backward = (double *)malloc(monate * bytes);

for (int i = 0; i <= monate; i++) {
    forward[i]   = 0.;
    backward[i]  = rate;
}

forward[0]        = auszahlungsbetrag;
backward[0]       = 0.;
backward[monate]  = rate + rest;

double ez =  esolver(12 , monate, forward, backward);
printf("Effektivzins: %.2f\n", ez);

char tmp0[256];
sprintf (tmp0, "Rate: %.2f (%f)" , rate, rate);
writeToLogFile(tmp0);

char tmp[256];
sprintf (tmp, "Effektivzins: %.2f (%f)" , ez, ez);
writeToLogFile(tmp);

free(forward);
free(backward);

这是我转换后的 c# 代码。对于 malloc、free 和 sprintf 方法,我在将其转换为 c# 时遇到了一些麻烦。

using System;

namespace Zinsrechner
{ 
public static class Basic
{

    public static void basic(double aa, double auszahlungsbetrag, double cc, int ee, double rest)
    {

        Writelog.writeToLogFile("Start der Berechnung, Type BASIC");
        Writelog.writeToLogFileDouble("Kreditvolumen: ", aa);
        Writelog.writeToLogFileDouble("Auszahlungsbetrag: ", auszahlungsbetrag);
        Writelog.writeToLogFileDouble("Nominalzins: ", cc);
        Writelog.writeToLogFileInt("Laufzeit: ", ee);
        Writelog.writeToLogFileDouble("Restschuld: ", rest);

        /////////

        // Ratenberechnung

        double nomzins = (cc / 12.0 / 100.0) + 1.0;
        double unten = 0.0;

        for (int x = 0 ; x <= ee-1 ; x++)
        {
            unten = unten + Math.Pow(nomzins,x);
        }

        double rate = ((aa * Math.Pow(nomzins, ee)) - rest) / unten;
        Console.Write("Rate: {0:f2}\n", rate);

        int monate = ee;
        double[] forward;
        double[] backward;
        uint bytes = 6 * sizeof(double);
        //C++ TO C# CONVERTER TODO TASK: The memory management function 'malloc' has no equivalent in C#:
        //forward = (double)malloc(monate * bytes);
        forward = (double)(monate * bytes);
        //C++ TO C# CONVERTER TODO TASK: The memory management function 'malloc' has no equivalent in C#:
        backward = (double)malloc(monate * bytes);

        for (int i = 0; i <= monate; i++)
        {
            forward[i] = 0.0;
            backward[i] = rate;
        }

        forward[0] = auszahlungsbetrag;
        backward[0] = 0.0;
        backward[monate] = rate + rest;

        double ez = Effektivzinssolver.esolver(12, monate, forward, backward);
        Console.Write("Effektivzins: {0:f2}\n", ez);

        string tmp0 = new string(new char[256]);
        tmp0 = string.Format("Rate: {0:f2} ({1:f})", rate, rate);
        Writelog.writeToLogFile(tmp0);

        string tmp = new string(new char[256]);
        tmp = string.Format("Effektivzins: {0:f2} ({1:f})", ez, ez);
        Writelog.writeToLogFile(tmp);

        //C++ TO C# CONVERTER TODO TASK: The memory management function 'free' has no equivalent in C#:
        free(forward);
        //C++ TO C# CONVERTER TODO TASK: The memory management function 'free' has no equivalent in C#:
        free(backward);


    }
}
}

【问题讨论】:

  • 那不是 C++ 代码,那是 C 代码。
  • @Angew 这并不是说这里的代码不是有效的 C++。为什么,我一直认为“C++”指的是整个语言,而不仅仅是经典 C 中没有的部分。
  • @user3109672 好的,是的。但是,将惯用的 C++ 代码转换为 C# 将遵循与将“具有新颖文件扩展名的 C”代码转换为 C# 截然不同的过程。

标签: c# c++ malloc converter printf


【解决方案1】:

malloc 和 free 的等价物是:

IntPtr memory = Marshal.AllocHGlobal(100); //malloc
Marshal.FreeHGlobal(memory); //free

【讨论】:

  • 虽然是这样,但我认为这在这种情况下并不是很有帮助,因为对于这个示例,您不需要在 C# 中进行任何手动内存管理。
【解决方案2】:
double[] forward = new double[monate * 6];

您不需要free()。 C# 已被垃圾回收。

【讨论】:

    【解决方案3】:

    在 C# 中,您不需要关心内存 - 垃圾收集器可以很好地处理它。您的代码必须是这样的:

    int monate = ee;
    double[] forward = new double[monate * 6];
    double[] backward = new double[monate * 6];
    
    for (int i = 0; i <= monate; i++) {
        forward[i]   = 0.;
        backward[i]  = rate;
    }
    
    forward[0]        = auszahlungsbetrag;
    backward[0]       = 0;
    backward[monate]  = rate + rest;
    
    double ez =  esolver(12 , monate, forward, backward);
    Console.WriteLine("Effektivzins: {0}\n", ez);
    

    然后,不要将 Deutsch 和 English 一起命名变量 ;)

    【讨论】:

    • 你在给这个可怜的家伙讲课,却没有回答他的问题。如果他真的想在他管理内存生命周期的地方执行相当于 malloc/free 的操作怎么办?
    【解决方案4】:

    您可以忘记 MallocFree,因为 C# 有一个垃圾收集器。至于sprintf看看String.Format()Console.WriteLine()

    另外,由于您的应用程序似乎处理的是金额,我强烈建议使用decimal 类型而不是double。 (decimal)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 2017-10-03
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      相关资源
      最近更新 更多