» Strtochar или зачем нужны указатели Borland Delphi. . . Блог программистов


Блог программистов






200722 Авг

Strtochar или зачем нужны указатели

Любой начинающий делфист написав эту процедуру расстроится, когда она не заработает, конечно, можно исправить это положение, написав свой или использовать сторонний модуль с функциями преобразования величин. В принципе, об этом я и хотел написать, как перевести переменную из одного типа в другую.

Для простых вопросов всегда есть готовые решения, нужно их найти, и возможно доработать, сделать современными. Как искать? Я начинаю поиск по всем сайтам клуба, за 2 года накопилось множество интересных статей, тем на форуме и прочее, а также появился инструмент для поиска только по сайтам клуба go.pblog.ru, ищем str to char

поиск программистов

По ходу поиска можно почитать статьи, которые либо давно были прочитаны, либо вообще не читались.
www.programmersclub.ru/typepchar/

Вспомнить, что есть удобный справочник — delphibasics.ru/navSystem.php
Почитать про Char
В похожих командах найти нужную информацию, для нас это — PChar Указатель на значение символа (Char), ещё в статье www.programmersclub.ru/typepchar/ мы про него читали что-то.

http://delphibasics.ru/PChar.php — смотрим пример кода, и понимаем, что нас вопрос решён с помощью указателей. Это тоже читаем http://delphibasics.ru/Addr.php, так как в коде используеться функция Addr

Используя указатели мы можем обращаться к любой ячейке в памяти и использовать размещённые там данные.

В данном примере я решил задачу замены русского слова, побуквенно html кодами(коды размещены в строках memo).

procedure TForm1.rusClick(Sender: TObject);
var
i: integer;
s: PChar;
sss: Char;
begin
for i:=1 to length(title.text) do
begin
s:='а';
s:=Addr(title.text);
sss:= s^;
Case sss of
'а' : titlebrowse.Text:=titlebrowse.Text+rusm.Lines[0];
'б' : titlebrowse.Text:=titlebrowse.Text+rusm.Lines[1];
'в' : titlebrowse.Text:=titlebrowse.Text+rusm.Lines[2];

else titlebrowse.Text:=titlebrowse.Text+copy(title.text,i,1)
end;
end;
end;

Комментарии

  1. 23 августа, 2007 | 11:08

    Сорри, но где тут применение PChar? В sss содержится то же самое, что и в title.text[i] и PChar тут не используется. Почему сразу не написать
    sss := title.text[i]?
    Вообще, для PChar был бы более уместен следующий пример:
    var
    S: string;
    pS: PChar;
    begin
    S := ‘LOL’;
    pS := PChar(S);
    while pS^ #0 do
    begin
    ShowMessage(pS^);
    Inc(pS);
    end;
    end;

  2. 23 августа, 2007 | 11:10

    В while проглотился знак не равно

  3. 23 августа, 2007 | 12:38

    sentry, а ты пробовал код использовать прежде чем предлагать такое просто решение?

  4. 23 августа, 2007 | 12:40

    sss := title.text[i]? так в sss — будет тип string, а нам нужен char для Case sss of…

  5. 23 августа, 2007 | 13:52

    Alar, title.text — это одна строка, так? Тогда title.text[i] — это i-ый символ строки, то есть тип char. И присваивание sss := title.text[i] волне допустимо. К тому же sss это по-любому объявлено как char, и string там быть не может. А раз забота только для case, то вот компилирующийся и правильно исполняющийся пример:
    var
    S: string;
    I: Integer;
    begin
    S := Edit1.Text;
    for I := 1 to Length(S) do
    begin
    case S[I] of
    ‘a’: ShowMessage(‘a’);
    ‘b’: ShowMessage(‘b’);
    end;
    end;

    PS Без обид, но все-таки прежде чем что-то писать, надо в этом разбираться.

  6. 23 августа, 2007 | 18:27

    sentry, рад за вас, что вы нашли другую delphi конструкцию для решения поставленной задачи. НО

    1) Цель статьи — объяснить зачем нужны указатели.
    2) Вы говорите о стринге в delphi, который обрабатывается как AnsiString
    читать здесь — http://delphibasics.ru/String.php
    Что такое AnsiString в delphi читать здесь — http://delphibasics.ru/AnsiString.php

    Я думаю мы друг друга поняли 🙂

  7. 23 августа, 2007 | 18:39

    Самое распространенное применение указателей — это передача параметров в функции.
    Я бы, в свою очередь, всем посоветовал прочитать следующее, чтобы стать гуру в строках 🙂 http://rsdn.ru/article/delphi/dynarrays.xml
    Поняли, поняли 🙂

  8. 22 мая, 2008 | 15:30

    Соглашусь с sentry —-> Самое распространенное применение указателей — это передача параметров в функции. !! и больш, по моему незачем..