Реализация C++ std::string

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Реализация C++ std::string

Сообщение Jordan » 04.06.2020 23:53:36

Приветствую.

Пытался реализовать строки string C++ на паскале. Что хочется добиться от таких строк.
Строка содержит массив char оканчивающаяся на 0.

Цель:
1. Строка должна уметь очищаться. (С++ реализации в индекс 0 присваивается символ 0)
2. При добавлении строки, строка расширяется на размерность *2 *3 и т.д

Мне это нужно, для написания парсеров. Когда на вход принимаются строки в буфер, после обработки, буфер очищается заполняется новой строкой. Буфер выделяю один раз к примеру 64 кб.

Реализация ниже, не работает. В консоль выводится абракадабра.

Код: Выделить всё
{$mode objfpc}{$H+}

program Main;

uses
  Classes,
  SysUtils,
  LDL;
 
type
  FTString = class
  private
    Data : array of Char;
   Total: LongWord;
    Posit: LongWord;
  public
    function StrLen(const Source: PChar): LongWord;
    constructor Create(const Source: PChar);
   function ToChars(): PChar;
  end;

function FTString.StrLen(const Source: PChar): LongWord;
var
  i: LongWord;
begin
  i := 0;
 
  while (Source[i] <> #0) do
  begin
    inc(i);
  end;
 
  Result := i;
end;

constructor FTString.Create(const Source: PChar);
var
  i: LongWord;
begin
  Posit := StrLen(Source);
 
  Total := Posit + 1;
  SetLength(Data, Total);
 
  for i := 0 to Posit do
  begin
    Data[i] := Source[i];
  end;

  Data[Posit] := #0;
end;

function FTString.ToChars(): PChar;
begin
  Result := @Data;
end;

var
  Buffer: FTString;
 
begin
  Buffer := FTString.Create('Hello World!');
 
  WriteLn(Buffer.ToChars());
end.
Jordan
новенький
 
Сообщения: 13
Зарегистрирован: 19.12.2013 09:44:54

Re: Реализация C++ std::string

Сообщение Дож » 05.06.2020 05:17:40

Вместо @Data (указатель на местоположение переменной Data) должно быть @Data[0] (указатель на первый элемент массива).
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Реализация C++ std::string

Сообщение Vapaamies » 14.06.2020 16:43:08

Есть готовая реализация строк в виде object-ов в составе CoreLite. Строки писались для разработки парсеров/компиляторов. Строка может цепляться к буферу другой и не требовать финализации, ее можно просто «бросать». Будучи object-ами, их можно укладывать в массив друг за другом напрямую, не прибегая к указателям. Можешь попробовать адаптировать к FreePascal.

Документация по-прежнему в зачаточном состоянии. Обсуждать можно на форуме проекта.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 291
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru