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

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

Глюк с массивом 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]

нихрена не понятно.. что это за код? что он делать должен?


Наверх

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