Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > .NET
Перезагрузить страницу Перевод с C# на C++/CLI
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Максим1552 Максим1552 вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.11.2013
Question Перевод с C# на C++/CLI - 22.12.2013, 19:07

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

cpp Код:
#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;
                }
            }
        }
    };
Ответить с цитированием
  (#2 (permalink)) Старый
Максим1552 Максим1552 вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.11.2013
По умолчанию 22.12.2013, 19:08

cpp Код:
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();

        }
    }
}
Ответить с цитированием
  (#3 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,275
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 24.12.2013, 21:19

Не проще ли было бы выложить ошибки?
Ответить с цитированием
  (#4 (permalink)) Старый
Максим1552 Максим1552 вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.11.2013
По умолчанию 24.12.2013, 22:33

error C3861: 'lock': identifier not found
error C2065: 'null' : undeclared identifier
error C2143: syntax error : missing ';' before '{'

cpp Код:
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);
                }
            }
        }
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод с Delphi на C# Ardni Delphi 0 19.12.2011 17:18
перевод времени win 7 игарокby Любые вопросы от новичков 8 07.11.2011 23:58
Перевод из C++ в Delphi fredwriter Delphi 1 08.10.2010 12:34
Перевод из Pascal в С++ Garg С/С++ 1 05.05.2010 11:55
Перевод строки в 0 и 1 *Юльчик* Delphi 5 26.05.2009 09:11
Перевод из ДНФ в КНФ VANISH-fcsm Prolog 0 03.05.2009 18:05
Перевод в тип int как сделать правильно Red1Kk С/С++ 11 10.06.2008 16:14
Перевод Hex в Int как это осуществить Makavely C++ Builder 14 19.12.2007 14:27
Перевод моделей в 3D _kT Программирование графики 1 09.11.2007 15:17
Перевод из 3d в 2d координаты dralexthk Программирование графики 4 11.04.2007 12:34
Перевод данных из HEX MG Delphi 0 29.02.2004 12:29



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов