|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Вывод внутреннего представления динамических строковых типов данных
Просьба помочь с программой по отображению внутреннего представления строк.
Для статических строк я все сделал, а для динамических (ansistring, widestring, widechar, pchar) и char не могу - выводятся абсолютно не те значения, ошибок delphi не выдает. Таким образом, мой вопрос - как найти внутреннее представление типов ansistring, widestring, widechar, pchar и char моя программа: (в edit1 вводится строка, на listbox1 выводится результат) Код:
type tb = array[0..15] of byte; var ss:shortstring; ans:ansistring; ws:widestring; c:char; wc:widechar; v:variant; tbp:^tb; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin radiogroup1.ItemIndex:=0; end; procedure TForm1.Edit1Click(Sender: TObject); begin edit1.Clear; end; //функция отображения внутреннего представления символа/строки procedure TForm1.Button1Click(Sender: TObject); var i:byte; n:integer; begin listbox1.Items.Clear; tbp:=nil; //for i:=0 to 15 do begin tbp[i]:=0; end; if(radiogroup1.ItemIndex=0) then //shortstring begin for i:=0 to 15 do ss[i]:=#0; ss:=edit1.text; tbp:=@ss; i:=0; end; if(radiogroup1.ItemIndex=1) then //ansistring begin //for i:=0 to 15 do ans[i]:=#0; ans:=edit1.text; tbp:=@ans; i:=0; end; if(radiogroup1.ItemIndex=2) then //widestring begin //for i:=0 to 15 do ws[i]:=#0; ws:=edit1.text; tbp:=@ws; i:=0; end; if(radiogroup1.ItemIndex=3) then //Char begin c:=#0; if (Length(Edit1.text)<>1) then showmessage('тип данных char может быть задан 1 символом'); edit1.text:=edit1.text[1]; c:=edit1.text[1]; tbp:=@c; i:=0; end; if(radiogroup1.ItemIndex=4) then //WideChar begin wc:=#0; wc:=edit1.text; tbp:=@wc; i:=0; end; while(tbp[i]<>0) do begin listbox1.items.add(inttostr(tbp[i])); i:=i+1; end;end; |
#2
|
||||
|
||||
Если я правильно понял, то ты делаешь строку, а потом юзаешь ее как массив байт. С динамическими строками так не прокатит: они сами есть указатели. Попробуй так
Код:
type pb=^tb; //вместо tbp:=@ans //сделай tbp:=pb(ans) jmp $ ; Happy End! The Cake Is A Lie. |
#3
|
|||
|
|||
на tbp:=pb(ans); компилятор выдает [Error] Unit1.pas(92): Missing operator or semicolon
часть кода, связанная с этим указателем: Код:
var ss:shortstring; ans:ansistring; ws:widestring; c:shortstring; wc:widechar; v:variant; pb:^tb; tbp:^tb; if(radiogroup1.ItemIndex=1) then //ansistring begin ans:=edit1.text; tbp:=pb(ans); i:=-4; n:=length(edit1.text); end; Последний раз редактировалось Admin, 05.12.2010 в 13:59. |
#4
|
||||
|
||||
Я ж написал:
Код:
TYPE /// !!!!!!! pb=^tb; jmp $ ; Happy End! The Cake Is A Lie. |
#5
|
|||
|
|||
Цитата:
|
#6
|
||||
|
||||
ну тогда
Код:
TYPE pb=^tb; var Addr: DWORD; ... //Адрес: tbp:=@s; // tbp[i] содержит байты адреса. Но проще так: Addr:=DWORD(s); // Тут в Addr будет адрес целиком //Сама строка: tbp:=pb(s); // tbp[i] содержит байты строки jmp $ ; Happy End! The Cake Is A Lie. |
#7
|
|||
|
|||
у меня пишет для строки tbp:=pb(ans); [Error] Unit1.pas(95): Incompatible types
раздел объявлений: Код:
type tb = array[0..15] of byte; pb=^tb; var ss:shortstring; ans:ansistring; ws:widestring; c:shortstring; wc:widechar; v:variant; tbp:^tb; Addr: DWORD; Последний раз редактировалось Admin, 05.12.2010 в 14:00. |
#8
|
||||
|
||||
У меня работает нормально:
Код:
program Project5; {$APPTYPE CONSOLE} uses SysUtils,Windows; type tb=array[byte]of byte; pb=^tb; var s:AnsiString; tpb:pb; begin readln(s); tpb:=pb(s); writeln(AnsiChar(tpb[0])); readln; end. jmp $ ; Happy End! The Cake Is A Lie. |
#9
|
|||
|
|||
Спасибо, все заработало, но вот только почему-то адрес строки меняется в пределах 2-х значений, даже после запуска/закрытия сторонних программ. А ведь адрес должен меняться после занятия/освобождения ОЗУ. Или нет?
|
#10
|
||||
|
||||
А с чего ему меняться? Адрес считается в виртуальной памяти. В виртуальную память твоей проги никто не лезет. Вот она и юзает одно и то же место. А вот как оно отобразилось в настоящую оперативку, боюсь, узнать будет тяжелова-то...
jmp $ ; Happy End! The Cake Is A Lie. |
#11
|
|||
|
|||
Ок, спасибо за помощь
|