Как портировать программу в C# с С++ с указателями? Доброго времени суток. Есть программа, которая написана на C++.#include #include
using namespace std; class Person { public: int wagee_rate(){ switch(position){ case 1: wage_rate = 1500;break; case 2: wage_rate = 2500;break; case 3: wage_rate = 3500;break; case 4: wage_rate = 4500;break; case 5: wage_rate = 5500;break; case 6: wage_rate = 6500;break; default: wage_rate = 0;
}
} private: int position,wage_rate,total,bonus; string name; public: Person() {
position = 0; total =0; name = ""; wage_rate=0;
}
public: void set_worker(string new_name, int new_position) { name = new_name; position = new_position; } void get_worker()
{ string person; switch(position){ case 1: person = "specialist";break; case 2: person = "specialist1";break; case 3: person = "specialist2";break; case 4: person = "specialist high";break; case 5: person = "Chief";break; case 6 : person = "Direcotr";break; default : person = " "; }
cout>n; Person organization[n]; Person *o_ptr = organization;
for(int i = 0; i >name; cin>>position; (o_ptr + i)->set_worker(name,position); (o_ptr + i)->wagee_rate(); }
float tmp=0;//averrage for(int i = 0; i get_wage_rate(); }
averrage = tmp/n;
float bonus; for(int i = 0; i get_wage_rate(); if(tmpset_bonus(tmp);
}
for (int i = 0; i set_total((o_ptr+i)->get_bonus()); }
Show_all(o_ptr,n); //showing info about all workers }
void Show_all(Person *work_ptr,int n) { int i = 0; while (iget_worker(); i++; } } Я ее хочу переделать на C#, но использовать так же указатели(без ссылок). Создал новый проект, разрешил в сборке использование небезопасного режима, но проблема заключается в том что я не знаю как создать указатель на массив объектов.Person[] Company = new Person[qty]; Как мне создать указатель на массив объектов Comapny? Знаю, что есть два варианта:using System; using System.Runtime.InteropServices;
namespace Temp { class Program { public static unsafe void Main(string[] args) { int[] arr = new int[1024];
Для создания указателя на массив объектов Person в C# вы можете воспользоваться классом GCHandle. Вот пример кода, демонстрирующего это:
using System; using System.Runtime.InteropServices; namespace Temp { class Person { public int position; public int wage_rate; public string name; public int bonus; public int total; } class Program { public static unsafe void Main(string[] args) { int qty = 5; // количество объектов в массиве Person[] Company = new Person[qty]; // создание указателя на массив объектов GCHandle gch = GCHandle.Alloc(Company, GCHandleType.Pinned); try { Person* ptr = (Person*)gch.AddrOfPinnedObject(); // теперь можно обращаться к объектам массива по указателю for (int i = 0; i < qty; i++) { (ptr + i)->position = i + 1; // пример установки значения поля position } } finally { gch.Free(); } } } }
В этом примере создается массив объектов Person с помощью Person[] Company = new Person[qty];, а затем создается указатель на этот массив с использованием GCHandle. Вы можете обращаться к объектам массива через указатель и устанавливать значения их полей. Не забудьте вызвать метод gch.Free() для освобождения ресурсов после использования указателя.
Для создания указателя на массив объектов Person в C# вы можете воспользоваться классом GCHandle. Вот пример кода, демонстрирующего это:
using System;using System.Runtime.InteropServices;
namespace Temp
{
class Person
{
public int position;
public int wage_rate;
public string name;
public int bonus;
public int total;
}
class Program
{
public static unsafe void Main(string[] args)
{
int qty = 5; // количество объектов в массиве
Person[] Company = new Person[qty];
// создание указателя на массив объектов
GCHandle gch = GCHandle.Alloc(Company, GCHandleType.Pinned);
try
{
Person* ptr = (Person*)gch.AddrOfPinnedObject();
// теперь можно обращаться к объектам массива по указателю
for (int i = 0; i < qty; i++)
{
(ptr + i)->position = i + 1; // пример установки значения поля position
}
}
finally
{
gch.Free();
}
}
}
}
В этом примере создается массив объектов Person с помощью Person[] Company = new Person[qty];, а затем создается указатель на этот массив с использованием GCHandle. Вы можете обращаться к объектам массива через указатель и устанавливать значения их полей. Не забудьте вызвать метод gch.Free() для освобождения ресурсов после использования указателя.