Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2014, 22:11   #1
spectrum988
Форумчанин
 
Аватар для spectrum988
 
Регистрация: 24.10.2013
Сообщений: 241
По умолчанию Перевод кода с Delphi в С++.

Помогите пожалуйста перевести код с Delphi в С++Builder.
Код:
unit MainUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TMainForm = class(TForm)
    Field: TPanel;
    StartBtn: TButton;
    EndBtn: TButton;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    Button11: TButton;
    Button12: TButton;
    Button13: TButton;
    Button14: TButton;
    Button15: TButton;
    Timer: TTimer;
    procedure StartBtnClick(Sender: TObject);
    procedure Move(Sender: TObject);
    procedure ButtonClick(Sender: TObject);
    procedure EndBtnClick(Sender: TObject);
  end;

var MainForm: TMainForm;

implementation

{$R *.dfm}

type
  TTagArray = array [1..16] of Byte;

var
  Dibs: TTagArray;
  Direction: 0..4;
  Number,N: 1..16;
  Xo,Yo,X,Y: Integer;

function RandomArray: TTagArray;
var
  i,j,X: 1..16;
  Single: Boolean;
begin
  Randomize;
  for i:=1 to 16 do begin
    repeat
      X:=Random(16)+1; 
      Single:=True; for j:=1 to i-1 do Single:=(Single)and(X<>Result[j]); 
    until Single;
    Result[i]:=X;
  end;
end;

procedure DrawArray(Sender: TForm; TagArray: TTagArray);
var i: 1..16;
begin
  for i:=1 to 16 do begin
    if TagArray[i]=16 then Continue; 
    with TButton(Sender.Components[TagArray[i]]) do begin Left:=((i-1) mod 4)*75+2; Top:=((i-1) div 4)*75+2; end;
  end;
end;

procedure TMainForm.StartBtnClick(Sender: TObject);
begin
  Dibs:=RandomArray;
  DrawArray(MainForm,Dibs);
end;

procedure TMainForm.Move(Sender: TObject);
var i: 1..16;
begin
  Timer.Enabled:=True; 
  case Direction of  
   1: dec(X,15); 
   2: inc(X,15); 
   3: dec(Y,15); 
   4: inc(Y,15); 
  end;
  with TButton(Components[Number]) do begin Left:=Xo+X; Top:=Yo+Y; end; 
  if (abs(X)=75)or(abs(Y)=75) then begin 
    Timer.Enabled:=False; 
    X:=0; Y:=0;
    case Direction of 
     1: begin Dibs[N-1]:=Dibs[N]; Dibs[N]:=16; end;
     2: begin Dibs[N+1]:=Dibs[N]; Dibs[N]:=16; end;
     3: begin Dibs[N-4]:=Dibs[N]; Dibs[N]:=16; end;
     4: begin Dibs[N+4]:=Dibs[N]; Dibs[N]:=16; end;
    end;
    for i:=1 to 16 do if Dibs[i]<>i then Break; 
    if i=17 then ShowMessage('Победа!'); 
  end;
end;

procedure TMainForm.ButtonClick(Sender: TObject);
var i: 1..16;
begin
  Number:=((TButton*)(Sender)).ComponentIndex; 
  for i:=1 to 16 do if Dibs[i]=Number then N:=i; 
  Direction:=0;
  if (N>1 )and(N<>5)and(N<>9)and(N<>13)and(Dibs[N-1]=16) then Direction:=1; 
  if (N<16)and(N<>4)and(N<>8)and(N<>12)and(Dibs[N+1]=16) then Direction:=2; 
  if (N-4> 0)and(Dibs[N-4]=16) then Direction:=3; 
  if  (N+4<17)and(Dibs[N+4]=16) then Direction:=4; 
  if Direction=0 then Exit; 
  Xo:=((TButton*)(Sender))->Left;
  Yo:=(Sender as TButton).Top; X:=0; Y:=0;
  MainForm->Move(Sender); 
end;

procedure TMainForm.EndBtnClick(Sender: TObject);
begin Close end;

end.

Последний раз редактировалось spectrum988; 13.04.2014 в 22:14.
spectrum988 вне форума Ответить с цитированием
Старый 13.04.2014, 22:13   #2
spectrum988
Форумчанин
 
Аватар для spectrum988
 
Регистрация: 24.10.2013
Сообщений: 241
По умолчанию

Вот мой частичный вариант перевода,может кто знает,помогите пожалуйста перевести недостающие строки.
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
TTagArray = array [1..16] of Byte;
  Dibs: TTagArray;
int Direction;
int Number,N;
int Xo,Yo,X,Y;
//---------------------------------------------------------------------------
void __fastcall TForm1::EndBtnClick(TObject *Sender)
{
close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonClick(TObject *Sender);
{ int i;
  Number=((TButton*)(Sender))->ComponentIndex; 
  for (i=1;i<=16;i++)
   if Dibs[i]=Number
    N=i; 
  Direction=0;
  if (N>1 )&&(N!=5)&&(N!=9)&&(N!=13)&&(Dibs[N-1]==16)
  Direction=1; 
  if (N<16)&&(N!=4)&&(N!=8)&&(N!=12)&&(Dibs[N+1]==16)
  Direction=2; 
  if (N-4>0)&&(Dibs[N-4]==16)
   Direction=3; 
  if (N+4<17)&&(Dibs[N+4]==16)
   Direction=4; 
  if Direction=0
   Exit; 
  Xo=((TButton*)(Sender))->Left;
  Yo=((TButton*)(Sender))->Top;
  X=0; Y=0;
  MainForm.Move(Sender); 
}
//---------------------------------------------------------------------------

void __fastcall TForm1::StartBtnClick(TObject *Sender)
{
Dibs=RandomArray;
DrawArray(Form1,Dibs);
}
//---------------------------------------------------------------------------
void __fastcall DrawArray(TForm *Sender; TTagArray *TagArray);
{ int i;
  for (i=1;i<=16;i++)
  {
    if TagArray[i]==16
    Continue;      
    with TButton(Sender->Components[TagArray[i]]) do
    {
     Left=((i-1) mod 4)*75+2;
     Top=((i-1) div 4)*75+2;
    }
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Move(TObject *Sender);
{
int i;
  switch Direction
  {  
   case 1: dec(X,15); 
   case 2: inc(X,15); 
   case 3: dec(Y,15); 
   case 4: inc(Y,15); 
  }
}
  with TButton(Components[Number]) do
  {
  Left=Xo+X;
  Top=Yo+Y;
  }                                   
  if (abs(X)=75)||(abs(Y)=75)
    {                               
    X=0; Y=0;
    switch Direction
    {                           
     case 1: {
             Dibs[N-1]=Dibs[N];
             Dibs[N]=16;
             }
     case 2: {
             Dibs[N+1]=Dibs[N];
             Dibs[N]=16;
             }
     case 3: {
             Dibs[N-4]=Dibs[N];
             Dibs[N]=16;
             }
     case 4: {
             Dibs[N+4]=Dibs[N];
             Dibs[N]=16;
             }
    }
    for (i=1;i<=16;i++)
     if Dibs[i]!=i
      Break;        
     if i==17
      ShowMessage(Победа!');       
  }
}

function RandomArray: TTagArray;
{
int i,j,X;
bool Single;
  Randomize;
  for (i=1;i<=16;i++)
  {
    do
      X=Random(16)+1;  
      Single=True;
      for (j=1;j<=i-1;j++)
      Single=(Single)&&(X!=Result[j]); 
    while Single;
    Result[i]=X;
  }
}
spectrum988 вне форума Ответить с цитированием
Старый 14.04.2014, 08:58   #3
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Код:
TButton(Sender->Components[TagArray[i]]
Код:
 TButton* button = dynamic_cast<TButton*>(Sender->Components[TagArray[i])
if(button)
{
  button->Left=((i-1) % 4)*75+2;
  button->Top=((i-1) / 4)*75+2;
}
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 14.04.2014, 17:15   #4
spectrum988
Форумчанин
 
Аватар для spectrum988
 
Регистрация: 24.10.2013
Сообщений: 241
По умолчанию

Спасибо.А переменные,как будут выглядеть ?
Код:
TTagArray = array [1..16] of Byte;
  Dibs: TTagArray;
spectrum988 вне форума Ответить с цитированием
Старый 15.04.2014, 16:33   #5
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Код:
typedef BYTE TTagArray[15];

TTagArray Dibs;
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 16.04.2014, 00:47   #6
spectrum988
Форумчанин
 
Аватар для spectrum988
 
Регистрация: 24.10.2013
Сообщений: 241
По умолчанию

Cкажите пожалуйста,при компилировании программы выбивает ошибку здесь
Код:
void __fastcall TForm1::ButtonClick(TObject *Sender);
На форме я для каждой кнопки активировал событие OnClick и убирал номер кнопки. тоесть получилось OnClick:ButtonClick
но выбивает такую ошибку
Код:
[C++ Error] Unit1.cpp(28): E2333 Class member '_fastcall TForm1::ButtonClick(TObject *)' declared outside its class
И как будет выглядеть эта часть кода на C++
Код:
function RandomArray: TTagArray;
spectrum988 вне форума Ответить с цитированием
Старый 16.04.2014, 01:34   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Открываете h файл и дописываете:
Код:
class TForm1 : public TForm
{
__published:	// IDE-managed Components
	void __fastcall ButtonClick(TObject *Sender);
По 2 вопросу:
Код:
TTagArray RandomArray(void) {}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 16.04.2014 в 01:42.
BDA вне форума Ответить с цитированием
Старый 16.04.2014, 01:45   #8
spectrum988
Форумчанин
 
Аватар для spectrum988
 
Регистрация: 24.10.2013
Сообщений: 241
По умолчанию

Делал уже так:
вот мой файл .h
Код:
 class TForm1 : public TForm
{
__published:	// IDE-managed Components       
        void __fastcall EndBtnClick(TObject *Sender);
        void __fastcall Move(TObject *Sender);
        void __fastcall StartBtnClick(TObject *Sender);
        void __fastcall ButtonClick(TObject *Sender);
Добавлял это но все по прежнему.
Я кликаю на кнопку в событии OnClick и по стандарту пишет OnClick:Button1Click;но я меняю на OnClick:ButtonClick(убираю единицу),правильно я делал ?
spectrum988 вне форума Ответить с цитированием
Старый 16.04.2014, 08:22   #9
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Цитата:
Я кликаю на кнопку в событии OnClick и по стандарту пишет OnClick:Button1Click;но я меняю на OnClick:ButtonClick(убираю единицу),правильно я делал ?
Не убирай никаких циферок. Что среда создала, то есть истина.
Или если уж так хочется убирать циферки, убирай в инспекторе объектов, вкладка Events.

Цитата:
По 2 вопросу:
Код:


TTagArray RandomArray(void) {}
Здесь лучше возвращать ссылку на массив, но!, только если объект не локального происхождения.

Код:
TTagArray& RandomArray(void) {}
Знающий не говорит, говорящий не знает (С) Лао Цзы

Последний раз редактировалось Krok27; 16.04.2014 в 08:31.
Krok27 вне форума Ответить с цитированием
Старый 17.04.2014, 08:49   #10
spectrum988
Форумчанин
 
Аватар для spectrum988
 
Регистрация: 24.10.2013
Сообщений: 241
По умолчанию

Так я и изменял на вкладке events.
spectrum988 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод кода из Delphi на C++ mego4el Общие вопросы C/C++ 1 29.12.2012 22:27
перевод кода с Delphi sergo555 Общие вопросы C/C++ 1 12.11.2011 20:32
Перевод кода с C++ на Delphi atagilov Общие вопросы Delphi 5 22.06.2011 22:09
Перевод кода с Pascal в Delphi Rin Общие вопросы Delphi 5 09.01.2011 01:39
Перевод кода с Fortran-77 на Delphi unhide Помощь студентам 3 20.05.2008 14:27