Как портировать программу в 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];

//1-й способ:
fixed (int* ptr = arr)
{
//тут работаем с указателем...
}

//2-й способ:
GCHandle gch = GCHandle.Alloc(arr, GCHandleType.Pinned);
try
{
int* ptr = (int*)gch.AddrOfPinnedObject();
//тут работаем с указателем...
}
finally
{
gch.Free();
}
}
}
}

21 Авг 2019 в 07:00
251 +1
0
Ответы
1

Для создания указателя на массив объектов 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() для освобождения ресурсов после использования указателя.

20 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 683 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир