Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.12.2010, 20:06
Chalkin_Ilya Chalkin_Ilya вне форума
Прохожий
 
Регистрация: 04.12.2010
Сообщения: 6
Репутация: 10
По умолчанию Вывод внутреннего представления динамических строковых типов данных

Просьба помочь с программой по отображению внутреннего представления строк.
Для статических строк я все сделал, а для динамических (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  
Старый 04.12.2010, 21:03
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Если я правильно понял, то ты делаешь строку, а потом юзаешь ее как массив байт. С динамическими строками так не прокатит: они сами есть указатели. Попробуй так
Код:
type
  pb=^tb;

//вместо
tbp:=@ans
//сделай
tbp:=pb(ans)
НО ТОЛЬКО ДЛЯ ДИНАМИЧЕСКИХ
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 04.12.2010, 21:22
Chalkin_Ilya Chalkin_Ilya вне форума
Прохожий
 
Регистрация: 04.12.2010
Сообщения: 6
Репутация: 10
По умолчанию

на 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  
Старый 04.12.2010, 21:23
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Я ж написал:
Код:
TYPE /// !!!!!!!
pb=^tb;
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #5  
Старый 04.12.2010, 21:24
Chalkin_Ilya Chalkin_Ilya вне форума
Прохожий
 
Регистрация: 04.12.2010
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Если я правильно понял, то ты делаешь строку, а потом юзаешь ее как массив байт.
Мне надо побайтно выводить адрес динамич. массива и его содержимое.
Ответить с цитированием
  #6  
Старый 04.12.2010, 21:31
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

ну тогда
Код:
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  
Старый 04.12.2010, 21:36
Chalkin_Ilya Chalkin_Ilya вне форума
Прохожий
 
Регистрация: 04.12.2010
Сообщения: 6
Репутация: 10
По умолчанию

у меня пишет для строки 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: Пользуемся тегами!

Последний раз редактировалось Admin, 05.12.2010 в 14:00.
Ответить с цитированием
  #8  
Старый 04.12.2010, 21:42
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

У меня работает нормально:
Код:
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.
сделай тоже tpb: pb;
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #9  
Старый 04.12.2010, 21:58
Chalkin_Ilya Chalkin_Ilya вне форума
Прохожий
 
Регистрация: 04.12.2010
Сообщения: 6
Репутация: 10
По умолчанию

Спасибо, все заработало, но вот только почему-то адрес строки меняется в пределах 2-х значений, даже после запуска/закрытия сторонних программ. А ведь адрес должен меняться после занятия/освобождения ОЗУ. Или нет?
Ответить с цитированием
  #10  
Старый 04.12.2010, 22:50
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

А с чего ему меняться? Адрес считается в виртуальной памяти. В виртуальную память твоей проги никто не лезет. Вот она и юзает одно и то же место. А вот как оно отобразилось в настоящую оперативку, боюсь, узнать будет тяжелова-то...
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #11  
Старый 08.12.2010, 18:22
Chalkin_Ilya Chalkin_Ilya вне форума
Прохожий
 
Регистрация: 04.12.2010
Сообщения: 6
Репутация: 10
По умолчанию

Ок, спасибо за помощь
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:23.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter