Форум: "Начинающим";
Текущий архив: 2011.03.06;
Скачать: [xml.tar.bz2];
ВнизС++ -> 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.003 c