Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

С++ -> Delphi [D7, XP]


Ikar ©   (2010-12-11 10:53:00) 

Помогите пожалуйста разобраться. Есть 3 процедуры, которые очень хотелось бы переделать на Delphi.
DWORD WINAPI reader(LPVOID lpParameter)
{

   SOCKET *socks = (SOCKET*)lpParameter;
  Printf("socks[0]");
  Printf("socks[1]");

   return 0;
}

DWORD WINAPI writer(LPVOID lpParameter)
{

   SOCKET *socks = (SOCKET*)lpParameter;
   Printf("socks[0]");
   Printf("socks[1]");
   return 0;
}
****************************************
бла-бла-бла...
SOCKET *socks = new SOCKET[2];
           socks[0] = n;
           socks[1] = d;
           DWORD id;
           CreateThread(NULL, 0, reader, socks, 0, &id);
           CreateThread(NULL, 0, writer, socks, 0, &id);

Делаю так:

procedure reader(parR:array of integer);
begin
Writeln(parR[0]);
Writeln(parR[1]);
end;

procedure writer(parW:array of integer);
begin
Writeln(parW[0]);
Writeln(parW[1]);
end;
*******************************
var
clientsock,serversock:Tsocket;
SockArr:array[0..1] of integer;
id:cardinal;
begin
sockarr[0]:= clientsock;
sockarr[1]:= serversock;
CreateThread(nil, 0, @reader, @sockarr, 0, &id);
CreateThread(nil, 0, @writer, @sockarr, 0, &id);
end;

Я так предполагаю, что не я не правильно передаю параметр sockarr для потоков или не верно его принимаю в процедуре, так как при создании потока сразу же вываливается ошибка.


Ikar   (2010-12-11 17:22:00) [1]

Всем спасибо. Все получилось. Сделал так:

procedure reader(parR:pointer);stdcall;
var r0,r1:integer;
begin
r0 :=IntegerArray(parR^)[0];
r1 :=IntegerArray(parR^)[1];


Ikar   (2010-12-11 16:34:00) [2]

type
TMyArray = array[0..1] of integer;
PMyArray = ^TMyArray;

procedure reader(parR:pointer);
var
MyArrayR: TMyArray;
begin
MyArrayR := PMyArray(parR)^;
//MyArrayR[0], MyArrayR[1]  - возвращаются не те значения, которые изначально присваивались в sockarr.


Юрий Зотов   (2010-12-11 16:19:00) [3]


> Ikar ©   (11.12.10 16:13) [12]

procedure Reader(P: Pointer); stdcall;


Ikar   (2010-12-11 16:13:00) [4]


> WINAPI соответствует модели stdcall

как это может мне помоч?


Юрий Зотов   (2010-12-11 16:12:00) [5]


> Ikar ©   (11.12.10 15:53) [9]
> Имея адрес массива... как я могу по нему получить ... значения масива


Например, так:

type
 TMyArray = array ... ; // объявление типа массива
 PMyArray = ^TMyArray; // объявление типа указателя на массив

procedure Example1(P: pointer);
var
 MyArray: TMyArray;
begin
 MyArray := PMyArray(P)^;
 ... // Работаем с MyArray
end;

procedure Example2(P: PMyArray);
var
 MyArray: TMyArray;
begin
 MyArray := P^;
 ... // Работаем с MyArray
end;

procedure Example3(P: PMyArray; Len: integer);
var
 i: integer;
begin
 for i := Low(TMyArray) to Len + Low(TMyArray) - 1 do
   P^[i] := ...  
end;


Юрий Зотов   (2010-12-11 15:56:00) [6]

И, если я еще не все забыл, то описатель WINAPI соответствует модели stdcall.


Ikar   (2010-12-11 15:53:00) [7]

var
SockArr:array[0..1] of integer;

sockarr[0]:= @clientsock;
sockarr[1]:= @serversock;
CreateThread(nil, 0, @reader, @sockarr, 0, id);
В моем случае, я как понимаю, процедуре reader передается параметр, значением которого является адрес массива sockarr.

Имея адрес массива (parR) как я могу по нему получить те значения масива, которые мне нужны? В моем случае их 2.
Procedure reader(parR:Pointer);
begin

end;


Anatoly Podgoretsky   (2010-12-11 15:25:00) [8]


> Так мне нужно описать параметр как указатель и передать
> как указатель или описать как массив и

Забудь про указатели, здесь не СИ


Плохиш   (2010-12-11 15:10:00) [9]


> SockArr:array[0..1] of ^integer;

Вам говорят одно, вы делаете другое. Мне больше не интересно.


Ikar   (2010-12-11 13:59:00) [10]

Внёс такие изменения:
var
 SockArr:array[0..1] of ^integer;

sockarr[0]:= @clientsock;
sockarr[1]:= @serversock;
CreateThread(nil, 0, @reader, @sockarr, 0, id);
CreateThread(nil, 0, @writer, @sockarr, 0, id);

procedure reader(parR:Pointer); <<-----вот с этим не знаю как дальше работать. Мне же нужно как-то получить из parR два значения. Это что, нужно вводить новую переменную типа array[0..1], присваивать ей Pointer? Или как? Help!


Плохиш   (2010-12-11 13:23:00) [11]


procedure reader(parR:Pointer);

и в теле привести к нужному типу, так же как и в оригинале сделано.
И ещё хорошо посмотреть что это за тип в c++ SOCKET


Ikar   (2010-12-11 13:04:00) [12]


> параметер описывают как открытьй массив, но передают почему-то указатель.

Так мне нужно описать параметр как указатель и передать как указатель или описать как массив и передать как массив?
Как это можно сделать и что в итоге должно быть за скобками?
procedure reader(parR:array of integer);


Плохиш   (2010-12-11 12:36:00) [13]


> DWORD WINAPI reader(LPVOID lpParameter)


>            CreateThread(NULL, 0, reader, socks, 0, &id);

Здесь параметер описывают как указатель и передают указатель

> procedure reader(parR:array of integer);


> CreateThread(nil, 0, @reader, @sockarr, 0, &id);

здесь параметер описывают как открытьй массив, но передают почему-то указатель.


Ikar   (2010-12-11 11:53:00) [14]


> Ошибку нас самим придумать?

'access violation at 0x0041955f: read of address 0x77ef66b2'

procedure reader(parW:array of integer);
begin <<<--------и стопорится тут.


Anatoly Podgoretsky   (2010-12-11 11:44:00) [15]

> Ikar  (11.12.2010 10:53:00)  [0]

Ошибку нас самим придумать?


Наверх

Титульная страница Поиск, карта сайта Написать письмо