Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.03.06;
Скачать: CL | DM;

Вниз

С++ -> Delphi   Найти похожие ветки 

 
Ikar ©   (2010-12-11 10:53) [0]

Помогите пожалуйста разобраться. Есть 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 для потоков или не верно его принимаю в процедуре, так как при создании потока сразу же вываливается ошибка.


 
Anatoly Podgoretsky ©   (2010-12-11 11:44) [1]

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

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


 
Ikar ©   (2010-12-11 11:53) [2]


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

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

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


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


> 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 13:04) [4]


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

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


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


procedure reader(parR:Pointer);

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


 
Ikar ©   (2010-12-11 13:59) [6]

Внёс такие изменения:
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 15:10) [7]


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

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


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


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

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


 
Ikar ©   (2010-12-11 15:53) [9]

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;


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

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


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


> 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;


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


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

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


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


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

procedure Reader(P: Pointer); stdcall;


 
Ikar ©   (2010-12-11 16:34) [14]

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.


 
Ikar ©   (2010-12-11 17:22) [15]

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

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



Страницы: 1 вся ветка

Текущий архив: 2011.03.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.007 c
2-1292346008
kak-bydima
2010-12-14 20:00
2011.03.06
видео с youtube


15-1290433047
stone
2010-11-22 16:37
2011.03.06
Бесшумная клавиатура


15-1290590811
Alx2
2010-11-24 12:26
2011.03.06
Мощность ракеты


2-1292312079
gst
2010-12-14 10:34
2011.03.06
проблема с установкой компонента


2-1292567719
axels
2010-12-17 09:35
2011.03.06
call stack