Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1292603871
НЕКТО
2010-12-17 19:37
2011.03.06
Как создать объект "Монитор" в Delphi 7?


13-1126779474
_Alexander_
2005-09-15 14:17
2011.03.06
EhLib: DBGridEh ругается на отстутсвие gstNone


15-1290673595
pavel_guzhanov
2010-11-25 11:26
2011.03.06
Можно ли заставить FastReport использовать функции из dll?


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


2-1291905273
Vidog
2010-12-09 17:34
2011.03.06
Embedded-файлы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский