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

Тема в разделе ".NET - Общие вопросы по языкам", создана пользователем Максим1613, 22 дек 2013.

  1. Максим1613

    Максим1613 New Member

    Регистрация:
    22 дек 2013
    Сообщения:
    3
    Симпатии:
    0
    Перевожу код с С# на С++/С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();

    }
    }
    }
     
  2. a0z

    a0z Well-Known Member

    Регистрация:
    15 мар 2011
    Сообщения:
    109
    Симпатии:
    0
    И хде ошибки-то?
    Учти, что людей желающих создать проект в "угадай какой" студии с "угадай какими" настройками, вставить туда исходник и увидеть наконец-то ошибки не так уж много.

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

Поделиться этой страницей