![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюк с массивом PCHAR
PIG © (2007-09-07 11:05:00)обьявлено
List: array [0..5] of PCHAR
Count:byte=0; // количество
temp:string[244];
загрузка
Count:=0;
temp:='test';
List[Count]:=PCHAR(temp);
showmessage(List[Count]); // проверка все правельно
в другом потоке после загрузки массива
for b:=0 to Count do begin
P:=List[b];
s2:=String(P); // PCHAR to string
showmessage(p);
showmessage(s2);
end;
показывают пустой бокс - текста в массивах нет
Юрий Зотов (2007-09-07 18:44:00) [1]> PIG (07.09.07 16:38) [10]
> незнаю много ли жрет памяти пример
Объявление List жрет 24 байта в статической памяти (6*4=24).
Каждая строка примера жрет 10 байт в динамической памяти (4+4+1+1=10).
Итого - 84 байта.
PIG (2007-09-07 16:38:00) [2]проблему решил обьявлением
как обычно List: array [0..5] of string
незнаю много ли жрет памяти пример
list[0]:='1';
list[1]:='1';
list[2]:='1';
list[3]:='1';
list[4]:='1';
list[5]:='1';
поидее 6 байт должно занимать - фактически может 255*6 байт
хоть и рекомендуют обьявлять PCHAR как на C++
убедился в Делфи с ними много граблей
бесконечные переводы,чтоб согласовать
(CompartText,pos итд принимает только string)
PIG (2007-09-07 14:36:00) [3]как обычно в глобально в начале модуля
uses forms,...
var
List: array [0..5] of PCHAR
Count:byte=0; // количество
temp:string[244];
Palladin (2007-09-07 13:29:00) [4]где объявлен List и случаем не как threadvar?
clickmaker (2007-09-07 13:28:00) [5]
> List[0]:='TEST0';
List - глобальный объект
'TEST0' - локальная константа, живет только внутри функции
Если нужно получить массив указателей, то
List[0] := StrAlloc(6);
StrCopy(List[0], 'TEST0');
PIG (2007-09-07 13:25:00) [6]если бы) поток должен работать все время выполнять работу
еще информация
тоесть присваивание есть явное
Count:=2;
List[0]:='TEST0';
List[1]:='TEST1';
MesTest(List[0]); //проверка работает
MesTest(List[1]); //проверка работает
CreateThread(nil,0,@revien,0,0,d); // поток чтоб немешать
------в потоке переменные исчезают----------------------
procedure revien;stdcall;
begin
MesTest(List[0]); // выдает пустое окно куда исчезла информация
MesTest(List[1]); // выдает совершенно левый текст,как будто указателиPCHAR левые
Count выдает 2 - правельно
-----------------------------------
procedure MesTest(Text:string);
begin
MessageBox(0,PChar(Text),'debug',0);
end;
Riply (2007-09-07 12:30:00) [7]> [4] icWasya © (07.09.07 12:26)
:)
icWasya (2007-09-07 12:26:00) [8]А кстати. Если даже без дополнительных потоков сделать так
List: array [0..5] of PCHAR
Count:byte=0; // количество
temp:string[244];
b:byte;
S2:String;
P:PChar;
......
Count:=0;
temp:='Ноль';
List[Count]:=PCHAR(temp);
Count:=1;
temp:='Один';
List[Count]:=PCHAR(temp);
Count:=2;
temp:='Два';
List[Count]:=PCHAR(temp);
for b:=0 to Count do begin
P:=List[b];
s2:=String(P); // PCHAR to string
showmessage(p);
showmessage(s2);
end;
то результат Вас удивит
showmessage(List[Count]); // проверка все правельно
PIG (2007-09-07 12:22:00) [9]код сохраняет в массив строки в PCHAR так как
List: array [0..5] of string теоретически много памяти ест
поток соотвественно читает массив
To Сергей М
все нормально в оригинале MesTest(s:string)
я просто чтоб понятно заменил на лету
реализация MesTest(s:string) с помощью MessageBox(0, ...
Сергей М. (2007-09-07 11:17:00) [10]
> в другом потоке
> showmessage(
Вызов ShowMessage в доп.потоке недопустим!
clickmaker (2007-09-07 11:08:00) [11]нихрена не понятно.. что это за код? что он делать должен?