powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / вопрос по переводу кода из delphi в c++ (builder)
20 сообщений из 20, страница 1 из 1
вопрос по переводу кода из delphi в c++ (builder)
    #38285744
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер,столкнулся с проблемой,не могу решить,сильно не пинайте...не соображуи всё.
Есть код написанный в rad studio(delphi), нужно переписать его на c++ тоже в rad studio
есть код в делфе
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
....
....
type

 PPacket = ^Packet; {Указатель на запись}
 Packet = record    {Запись с данными о пользователе}
  Nick:string;
 end;
....
....
type
  TfrmServer = class(TForm)
....
....
....
private
    { Private declarations }
  public
    { Public declarations }
    procedure ClientExit(Data:PPacket);
    procedure SendAllClients(Msg:string; Exception:string = '');
  end;

//и описание функции

procedure TfrmServer.SendAllClients(Msg:string; Exception:string='');
var i:Word;
begin
...
...
end;


Если правильно понимаю с записью всё просто, объявляем структуру,так:
Код: plaintext
1.
2.
3.
4.
5.
struct Packet
{
	Packet *ppacket;
	string Nick;
};


далее, у меня в проекте есть проект например ser.cpp и ser.h
в хидере описываю функции,примерно так:
Код: plaintext
1.
2.
3.
4.
5.
private:	// User declarations
public:		// User declarations
	__fastcall TForm2(TComponent* Owner);
           __fastcall ClientExit(уже здесь ступор, так?ppacket data);
           __fastcall SendAllClients(???)



потом как в основном коде?
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38285759
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stellЕсли правильно понимаю с записью всё просто, объявляем структуру,так:
Код: plaintext
1.
2.
3.
4.
5.
struct Packet
{
	Packet *ppacket;
	string Nick;
};

Нет. У тебя в дельфевой структуре нету указателя на структуру внутри структуры.

Код: plaintext
1.
2.
3.
4.
5.
struct Packet
{
	string Nick;
};
typedef struct Packet* PPacket;



А потом в объявлении класса:
Код: plaintext
1.
2.
3.
4.
           void __fastcall ClientExit(PPacket data);
           void __fastcall ClientExit(struct Packet * data); // тоже самое что и предыдущая строка

           void __fastcall SendAllClients(string Msg, string Exception = "");




В .cpp уже будет:
Код: plaintext
1.
2.
3.
4.
5.
6.
void __fastcall TfrmServer::ClientExit(PPacket data) {
   ..... some code
}
void __fastcall TfrmServer::SendAllClients(string Msg, string Exception) {
   ..... some code
}
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38285849
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,
спасибо!

А можете подсказать зачем в объявлении класса 2 записи ?
Код: plaintext
1.
2.
           void __fastcall ClientExit(PPacket data);
           void __fastcall ClientExit(struct Packet * data); // тоже самое что и предыдущая строка
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38285855
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stellзачем в объявлении класса 2 записи ?
Чтобы донести до тебя, двоечника, все варианты записи параметра-указателя.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38285858
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Зачем сразу унижать/оскорблять?
я всё понял
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38285950
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят,в продолжении
есть ранее описанная функция SendAllClients.
на делфи было так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TfrmServer.SendAllClients(Msg:string; Exception:string='');
var i:Word;
begin
 for i:=0 to ServerSocket1.Socket.ActiveConnections - 1 do
  if (PPacket(ServerSocket1.Socket.Connections[i].Data).Nick <> Exception) then
   ServerSocket1.Socket.Connections[i].SendText(Msg)
end;


Описываю в .cpp так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void __fastcall TForm2::SendAllClients(AnsiString Msg, string Exception){
int i;
	for (i = 0; i <ServerSocket1->Socket->ActiveConnections-1 ; i++) {
		if (PPacket(ServerSocket1->Socket->Connections[i]->Data).Nick <>Exception) {
			ServerSocket1->Socket->Connections[i]->SendText(Msg);

		 }
	}
}



ошибка валится такая
[BCC32 Error] server.cpp(53): E2294 Structure required on left side of . or .*
Как быть?
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38285954
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stellошибка валится такая
[BCC32 Error] server.cpp(53): E2294 Structure required on left side of . or .*
Как быть?PPacket это указатель на структуру. Это не функция возвращающая структуру.
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38286519
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
denis_stellДобрый вечер,столкнулся с проблемой,не могу решить,сильно не пинайте...не соображуи всё.
Есть код написанный в rad studio(delphi), нужно переписать его на c++ тоже в rad studio
Зачем? С++ Builder прекрасно умеет использовать юниты на delphi
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38286524
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
denis_stell
Код: pascal
1.
 for i:=0 to ServerSocket1.Socket.ActiveConnections - 1 do


Код: plaintext
1.
	for (i = 0; i <ServerSocket1->Socket->ActiveConnections-1 ; i++) {


неправильно - количество выполнений цикла разное :)
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38286978
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

т.е. должно быть,как-то так?
Код: plaintext
1.
2.
3.
4.
....
  PPacket.Nick=ServerSocket1->Socket->Connections[i]->Data;
  if (PPacket.Nick <>Exception) {
...
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38287154
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
или так?

Код: plaintext
1.
PPacket->Nick=ServerSocket1->Socket->Connections[i]->Data;
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38287351
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPacket это тип. Это не переменная. Типу ничего присвоить нельзя.
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38287451
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

А можете подсказать(показать) или объяснить как лучше сделать в моей ситуации? Чё-т не пойму
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38287606
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
PPacket pointer_to_packet;
pointer_to_packet = (PPacket) (ServerSocket1->Socket->Connections[i]->Data);
if( pointer_to_packet->Nick <> Exception) {....}

Как-то так.... Но работать все равно не будет.
Во первых, я не знаю действительно ли в строке ServerSocket1->Socket->Connections[i]->Data должны быть стрелочки или там где-то точки должны стоять. Во вторых, я не знаю что такое тип string и умеет ли он делать оператор <>.
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38287647
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlКак-то так.... Но работать все равно не будет.конечно, не будет, в С++ нет оператора <>, правда, есть оператор !=, автору имеет смысл попробовать его
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38287658
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если предположить, что Data - это буфер данных полученный из сокета, то операция приведения типа к std::string для него бессмысленна, т.к. string имеет более сложную структуру чем массив байтов.
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38287666
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, там вряд-ли std::string, это скорее VCL-класс String, базовый для строк. Проблема в том, что Delphi - регистронезависимый язык, в отличие от С. Но они считают это удобным, почему то
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38289165
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо всем.
не совсем понимаю некоторые моменты, сделал так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void __fastcall TForm2::SendAllClients(AnsiString Msg, AnsiString Exception){
int i;
	for (i = 0; i <ServerSocket1->Socket->ActiveConnections-1 ; i++)
	 {
		if (PPacket(ServerSocket1->Socket->Connections[i]->Data)->Nick !=  Exception)
		{
			ServerSocket1->Socket->Connections[i]->SendText(Msg);

		 }
	}
}



компилируется без ошибок

и так:
Код: plaintext
1.
2.
3.
4.
5.
6.
void __fastcall TForm2::SendAllClients(AnsiString Msg, AnsiString Exception){
int i;
PPacket pointer_to_packet;
	for (i = 0; i <ServerSocket1->Socket->ActiveConnections-1 ; i++)
	 {
		[SRC c++]pointer_to_packet = (PPacket) (ServerSocket1->Socket->Connections[i]->Data);


if( pointer_to_packet->Nick != Exception)
{
ServerSocket1->Socket->Connections[i]->SendText(Msg);

}
}
}[/SRC]

тоже компилируется... конечно это не о чем не говорит.
не совсем понимаю это
Код: plaintext
1.
(PPacket) (ServerSocket1->Socket->Connections[i]->Data);



мысль правильна ли?
Код: plaintext
1.
PPacket pointer_to_packet;

объявляем структурную переменную
Код: plaintext
1.
pointer_to_packet = (PPacket) (ServerSocket1->Socket->Connections[i]->Data);

данной переменной мы присваиваем
значение значение сокета в структуре?или как?
затем соответственно производим проверку итд
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38291371
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем спасибо.
с этим разобрался
...
Рейтинг: 0 / 0
вопрос по переводу кода из delphi в c++ (builder)
    #38291413
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят,появился ещё такой вопро,пока не знаю как лучше сделать?
есть код делфи,в нём описывал функцию
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
procedure TfrmServer.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var Msg:string;
    Cmd:string[4];
    Text:string;
    NewClient:PPacket;
begin
 Msg := Socket.ReceiveText; {Забрать сообщение}
 Cmd := Copy(Msg,1,4);      {Копировать первые 4 символа. Команда состоит из 4-х символов}
 if (Cmd = cmd_Nick) then   {Если это команда с ником, то}
  begin
  {Копируем ник}
    Text := Copy(Msg,Length(cmd_Nick) + 1,Length(Msg) - Length(cmd_Nick));
  {Выделяем память под нового клиента}
    New(NewClient);
  {Записываем его ник}
    NewClient^.Nick := Text;
  {указатель на данные (Data) сокета текущего клиента будет являться адресом выделенной области памяти}
    Socket.Data := NewClient;
  {Добавить в список}
    lstClients.Items.Add(Text);
  {Сообщить что в сети}
    mmoChat.Lines.Add('Клиент ' + Text + ' в сети');
   end
 else
  begin
  {Вывести сообщение}
    mmoChat.Lines.Add('[' + PPacket(Socket.Data).Nick + ']: ' + Msg);
  {Если включена трансляция, послать всем клиентам}
    if chk1.Checked then
      SendAllClients(Msg,PPacket(Socket.Data).Nick);
  end;
end;



перед implementation
описаны команды в константе
Код: pascal
1.
2.
3.
4.
5.
6.
const

  {Команды}

  cmd_GetNick = '#101';
  cmd_Nick = '#102';



пишу в с++
1) команды перенес в #define (#define cmd_Nick "#102" ) - можно ли так заменять?
2) в процедуре описание переменных, могу ли описать так?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
   AnsiString Msg;
   char Cmd[4]; // в cmd нужно чтобы хранилась строка в 4 символа
   char Text;
   PPacket NewClient;

   Msg=Socket->ReceiveText(); 
   strncpy(Cmd,Msg.c_str(),4); 
....
.....


функция strnspy, мне нужно скопировать первые 4 символа из msg в cmd, нужно ли в данном случае учитывать завершающий ноль?
3) строчка Text := Copy(Msg,Length(cmd_Nick) + 1,Length(Msg) - Length(cmd_Nick));
а)как можно реализовать в с++? походу strnspy здесь не могу использовать?
б) Длину строки вычисляю через strlen
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / вопрос по переводу кода из delphi в c++ (builder)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]