Моя функция ничего не возвращает в Delphi - PullRequest
0 голосов
/ 24 марта 2020

Вот мой код:

function encrypt(str: string): string;
  var
    j: integer;
    answer: string;
  begin
    answer := '';
    for j := 0 to system.Length(str) do
      begin
        if str[j] = ' ' then
          begin
            answer := answer + 'er ';
          end
        else
          begin
            answer := answer + str[j];
          end;
      end;
    answer := answer + 'er';
    result := answer;
  end;

procedure TForm1.btn_encryptClick(Sender: TObject);
  begin
    lbl_answer.Caption := encrypt(edt_main.Text);
  end;

Я не получаю ошибок, однако lbl_answer не меняется. Спасибо за любую помощь.

1 Ответ

1 голос
/ 24 марта 2020

Проблема в этой строке:

for j := 0 to system.Length(str) do

Это должно читаться как

for j := 1 to system.Length(str) do

В строке длины, N , индексы символов равны 1, 2, ..., N .

Это потому, что строки в Delphi используют индексирование на основе 1. На большинстве других языков индексы были бы 0, 1, 2, ..., N - 1.

Но вы также получили число символов неправильно: действительно, вы пытаетесь перечислить N + 1 символ (0, 1, 2, ... N ) в строку длиной N . (Вспомните, например, случай N = 3. 0, 1, 2, 3 - это четыре, а не три индекса!)


Купите, почему вы получаете казалось бы, пустая строка из функции? Ну, это из-за внутренней структуры Delphi строк . Перед первым символом (каждый символ составляет два байта) у вас есть длина в виде четырехбайтового (32-разрядного) целого числа. str[0], скорее всего, получит доступ к «персонажу» перед первым символом. Эти два байта являются MSB длины. Поскольку длина вашей строки, вероятно, не превышает $ FFFF, они равны нулю, поэтому вы получите нулевой символ. Это, вероятно, приведет к тому, что рендеринг этой строки прекратится в этой точке, и будет выглядеть, будто строка пустая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...