Перевожу Код С С# На С++/cli

22.12.2013
3
0
#1
Перевожу код с С# на С++/СLI, но т.к. плохо знаком с синтаксисом на C++/CLI, выполняя по методичке,все равно вылезают ошибки.

C++:
#include "stdafx.h"
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>
using namespace System;
using namespace System::Collections::Generic;
using namespace System::Text;
using namespace System::Threading;
using namespace System::Windows::Forms;
using namespace System::Drawing;
using namespace System::Collections;

namespace KURSOVAYA
{

delegate void delEv(void);

ref class Car //класс машины
{
public: 
event delEv ^ev;
private:
int num; //номер машины
int speed; //скорость машины
int r; //радиус кольца
String ^name; //имя машины
int x, y; //текущая позиция машины
bool great, life; //жизнь потока - признак движения по большому кругу
Thread ^t1; //поток
bool run;
bool moving;
int indikator, max_indikator; //индикатор наполнения бензобака
public:
ArrayList ^aL;
private:
int i;
Refill ^refill;
int fuel;
int maxFuel;
bool eat;
int dx, dy;


public: Car(int N, string ^Name, int X, int Y, bool greatNew, Refill ^R)
{
num = N;
name = Name;
speed = 2;
x = X;
y = Y;
great = greatNew;
run = false;
life = false;
moving = false;
refill = R;
fuel = maxFuel;
eat = false;
Start();//	
}

~Car()
{
life = false;
}	// Деструктор

void Start()		// Стартовать
{
if (!run)
{
run = true;
life = true;
t1 = gcnew Thread(gcnew ThreadStart(Move));
t1->Start();
}
}

void Suspend()  // Приостановить
{
moving = true;
/*if (run)
{
run = false;
t1.Suspend();
}*/
}

void Resume()	// Возобновить
{
lock (this)
{
moving = false;
Monitor::Pulse(this);
}
/*if (!run)
{
run = true;
t1.Resume();
}*/
}

property int N
{
int get()
{
return num;
}
}
property int X			//свойство координаты X центра машины
{
int get()
{
return x;
}
}
property int Y			//свойство координаты Y центра машины
{
int get()
{
return y;
}
}


int counter;	  // время существования
void Move()		//движение
{

while (life)
{
counter++;
if (great) OnCirclebigroad();
if (!great) OnCirclesmallroad();
if (ev != null)
ev();
Thread::Sleep(100);
lock (this)
{
if (moving)
Monitor::Wait(this);
}
}
}

void OnCirclebigroad() //движение по большому кругу
{
r = 160;
x = 170 + (int)Math::Round(r * Math::Cos(counter * 0.1 * speed));
y = 170 + (int)Math::Round(r * Math::Sin(counter * 0.1 * speed));

Console::WriteLine("X=" + x + "Y=" + y + "R=" + r);

fuel--;

if (fuel < 30)
{
if (!eat)
{
eat = true;
x = 400;
y = 150;
//	}
//if (Math.Abs(refill.X - x) < 50 &&
//	Math.Abs(refill.Y - y) < 50)
//{
lock (refill)
{
Thread::Sleep(1300);
fuel = maxFuel;
eat = false;
}
}
great = true;
}
}

void OnCirclesmallroad() //движение по малому кругу
{
r = 120;
x = 170 + (int)Math::Round(r * Math::Cos(counter * 0.1 * -1 * speed));
y = 170 + (int)Math::Round(r * Math::Sin(counter * 0.1 * -1 * speed));

Console::WriteLine("X=" + x + "Y=" + y + "R=" + r);

fuel--;

if (fuel < 30)
{
if (!eat)
{
//eat = true;
// x = 400;
// y = 150;
x = 400;
y = 150;
//}
//if (Math.Abs(refill.X - x) < 81 &&
// Math.Abs(refill.Y - y) < 81)
lock (refill)
{
Thread::Sleep(1300);
fuel = maxFuel;
eat = false;
}
}
great = false;
}
}


void Finish()
{
life = false;
}
}

ref class Refill
{
private: int x, y;
public: int X { get { return x; } }
public: int Y { get { return y; } }

public: Refill(int X, int Y)
{ x = X; y = Y; }
}


ref class Cars : Form
{
public: ArrayList ^aL;
public: int n;
public: int _carsCount = 2; // кол-во машин (начальное значение 2 )
private: Refill ^refill;

public: Cars()
{
refill = gcnew Refill(370, 100);
}

void Start()		 // Стартовать
{
for (int i = 0; i < aL->Count; i++)
{
(aL[i] as Car)->Start();
}
}
void Suspend()	 // Возобновить
{
for (int i = 0; i < aL->Count; i++)
{
(aL[i] as Car)->Suspend();
}

}

void Resume()	 // Приостановить
{
for (int i = 0; i < aL->Count; i++)
{
(aL[i] as Car)->Resume();
}
}




protected: override void OnPaint(PaintEventArgs ^e) //рисование
{

e->Graphics->DrawEllipse(gcnew Pen(Color::Black, 40), 20, 20, 320, 320);
e->Graphics->DrawEllipse(gcnew Pen(Color::Black, 40), 65, 65, 230, 230);
e->Graphics->FillRectangle(gcnew SolidBrush(Color::Brown), refill->X, refill->Y, 70, 170);
for (int i = 0; i < aL.Count; i++)
{
//рисование машины
e->Graphics->DrawRectangle(gcnew Pen(Color::Red, 4), (aL[i] as Car)->X, (aL[i] as Car)->Y, 20, 20);
//e.Graphics.DrawRectangle(new Pen(Color.Green, 4), pCar[i].X, pCar[i].Y, 20, 20);
e->Graphics->DrawString((aL[i] as Car)->N->ToString(), Font, gcnew SolidBrush(Color::White), (aL[i] as Car)->X + 4, (aL[i] as Car)->Y + 4);
//e.Graphics.DrawRectangle(new Pen(Color.Blue, 4), pCar[i].X, pCar[i].Y, 20, 20);
}
}
protected override void OnClosed(EventArgs e) //закрытие
{
//for (int i = 0; i < aL.Count; i++) 
// aL[i].Finish();

}
}

ref class InterfaceForm : Form
{
protected User _user = null;

InterfaceForm()
{
}

InterfaceForm(User user)
{
_user = user;
this.DoubleBuffered = true;
}

protected: override void OnPaint(PaintEventArgs ^e)
{
if (_user == null)
return;

int rzm = 10;
int count = _user.aL.Count;
for (int i = 0; i < count; i++)
{
Car car = (Car)_user->aL[i];
e->Graphics->DrawString("Машина №" + i,
gcnew System::Drawing::Font("Arial", 10),
gcnew SolidBrush(Color::Red),
gcnew Point(rzm, 100));

if (_user.run)
{
e->Graphics->DrawString("Машина запущена",
gcnew System::Drawing::Font("Arial", 8),
gcnew SolidBrush(Color::Red),
gcnew Point(rzm, 60));
rzm = rzm + 130;
}
else
{
e->Graphics->DrawString("Машина остановлена",
gcnew System::Drawing::Font("Arial", 8),
gcnew SolidBrush(Color::Red),
gcnew Point(rzm, 60));
rzm = rzm + 130;
}
}
}
};

ref class User : Cars				 // Класс пользователя машин
{
public: bool run;
public: Form pChildForm, Interface,
Button pBut, pBut2, pBut3,
TextBox Text0;
private: Refill ^refill;

public: User()
{

refill = gcnew Refill(400, 150);
run = true;
//---------------			
pBut = gcnew Button();
pBut->Location = gcnew Point(32, 24);
pBut->Name = "pBut";
pBut->Size = gcnew System::Drawing::Size(120, 30);
pBut->Text = "Suspend/Resume";
pBut->Click += gcnew EventHandler(OnBut);
//---------------
pBut2 = gcnew Button();
pBut2->Location = gcnew Point(120, 24);
pBut2->Name = "pBut";
pBut2->Size = gcnew System::Drawing::Size(120, 30);
pBut2->Text = "Delete";
pBut2->Click += gcnew EventHandler(Delete);
//---------------
pBut3 = gcnew Button();
pBut3->Location = gcnew Point(210, 24);
pBut3->Name = "pBut";
pBut3->Size = gcnew System->Drawing->Size(120, 30);
pBut3->Text = "Add a car";
pBut3->Click += gcnew EventHandler(Add);
ClientSize = gcnew System::Drawing::Size(600, 450);
//---------------
pChildForm = gcnew Form();
pChildForm->Location = gcnew Point(700, 700);
pChildForm->Size = gcnew Size(800, 450);
pChildForm->Text = "User";
pChildForm->Show();
pChildForm->Controls->Add(pBut);
pChildForm->Controls->Add(pBut2);
pChildForm->Controls->Add(pBut3);
Text0 = gcnew TextBox();
Text0->Text = "1";
Text0->Location = gcnew Point(200, 60);
Text0vName = "T0";
Text0->Size = gcnew System::Drawing::Size(80, 20);
pChildForm->ClientSize = gcnew System::Drawing::Size(350, 100);
pChildForm->Controls->Add(Text0);
//-----------------Interface--------------
Interface = gcnew InterfaceForm(this); // Создать дочернее окно (форму)
Interface->Location = gcnew Point(700, 100);// и разместить его.
Interface->Text = "Interface"; // Задать заголовок дочернего окна
Interface->Show(); // Показать дочернее окно 
Interface->ClientSize = gcnew System::Drawing::Size(800, 200);

n = _carsCount;
this.DoubleBuffered = true;
aL = gcnew ArrayList(n);
for (int i = 0; i < aL.Capacity; i++)
{
if (i % 2 == 1)
{
Car ^c = gcnew Car(i, "Машина", 165, 330, true, refill);
c->ev += gcnew delEv(HandlerEv);
aL->Add(c);
c->Start();
}
else
{
Car ^c = gcnew Car(i, "Машина", 312, 96, false, refill);
c->ev += gcnew delEv(HandlerEv);
aL->Add(c);
c->Start();
}
}
Text = "Cars";

}

private: void HandlerEv() // Обработать событие
{

Interface->Invalidate();
this->Invalidate();

}


void OnBut(object obj, EventArgs e) // Обработчик кнопки
{

Console::WriteLine("OkMouse");
if (run)
{
run = false;
Suspend();
}
else
if (!run)
{
run = true;
Resume();
}

Interface->Invalidate();

}

void Add(object ^obj, EventArgs ^e)
{
try
{
Random ^rand = gcnew Random();
for (int i = 0; i < Convert::ToInt32(Text0->Text); i++)
{
if (rand->Next(10) % 2 == 1)
{
Car ^c = gcnew Car(_carsCount, "Машина", 165, 330, true, refill);
c->ev += gcnew delEv(HandlerEv);
aL->Add(c);
c->Start();

}
else
{
Car ^c = gcnew Car(_carsCount, "Машина", 312, 96, false, refill);
c->ev += gcnew delEv(HandlerEv);
aL->Add(c);
c->Start();

}
_carsCount++;
}
Update();
}
catch (Exception ex)
{
}
}

void Delete(object ^obj, EventArgs ^e)
{
try
{
for (int i = 0; i < Convert::ToInt32(Text0->Text); i++)
{
if (aL->Count != 0)
{
aL->RemoveAt(aL->Count - 1);
Update();
_carsCount--;
}
}
}
catch (Exception ex)
{
}
}


static void Main() //самая главная функция 
{
Cars ^aL = gcnew Cars();
Application::Run(gcnew User());
//for (int i = 0; i < aL.Count; i++) // Завершить потоки 
//aL[i].Finish();

}
}
}
 

a0z

Well-Known Member
15.03.2011
108
0
38
Minsk
#2
И хде ошибки-то?
Учти, что людей желающих создать проект в "угадай какой" студии с "угадай какими" настройками, вставить туда исходник и увидеть наконец-то ошибки не так уж много.

В целом есть простой метод - берёшь текст ошибки, вырезаешь всю специфичную инфу - номера строк, имена файлов и своих функций и гуглишь. Обычно находится пачка тем, где люди не поленились выкопипастить сами ошибки, и получили ответы.