2014-01-06 3 views
0

У меня есть этот код C++ и будет преобразовывать его в код C# (.net framework 4). Есть ли у меня какие-то намеки на методы malloc, free и sprintf?C++ code (malloc method) to C# code

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); 


    } 
} 
} 

+0

Это не код C++, это код C. – Angew

+2

@Angew Это не так, как будто код здесь недействителен C++. Почему, я всегда думал, что «C++» относится ко всему языку, а не только к частям, которые не относятся к классическому C. – user3109672

+0

@ user3109672 OK, true. Но, тем не менее, преобразование идиоматического кода C++ в C# будет следовать значительно отличающемуся курсу от преобразования этого кода «C с расширением файла новизны» на C#. – Angew

ответ

1
double[] forward = new double[monate * 6]; 

Вам не нужно free(). C# - сбор мусора.

1

В 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); 

А потом, не называйте переменные с Дойч и английским языками вместе;)

1

эквивалентов в таНос и свободно:

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

Хотя это правда, я думаю, что это не очень полезно в этом случае, так как для этого примера вам не нужно управлять ручным управлением памятью на C#. – Tobi

0

You может забыть про Malloc и Free, так как у C# есть сборщик мусора. Что касается sprintf взглянуть на String.Format() и Console.WriteLine()

Кроме того, поскольку он выглядит как приложение, кажется, дело с деньгами суммы, я настоятельно рекомендую использовать decimal типа вместо double. (decimal)