Как портировать программу в 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<<"Worker position is "<<person<<endl;
cout<<"Worker name is "<<name<<endl;
cout<<"Worker wage_rate is "<<wage_rate<<endl;
cout<<"Worker bonus is"<<bonus<<endl;
cout<<"Worker total salary is"<<total<<endl;

}

public:
void set_bonus(float new_bonus)
{
bonus = new_bonus;
}

public:
float get_bonus()
{
return bonus;
}

public:
void set_total(float new_total)
{
total = wage_rate + bonus;
}

public:
float get_total()
{
return total;
}

public:
int get_wage_rate()
{
return wage_rate;
}

~Person(void)
{
cout<<"destructed"<<endl;
}
};





void Show_all(Person *,int n);
float averrage=0;


int main()
{
int n = 0,position = 0;
string name;
cout<<"Enter the number of workers"<>n;
Person organization[n];
Person *o_ptr = organization;

for(int i = 0; i < n; i++)//filling object array
{
cout<<"Enter the name and position"<>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
288 +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 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир