Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2013, 21:56   #1
XAKKEP
 
Регистрация: 30.09.2010
Сообщений: 5
По умолчанию использование строк, указателей (string, PChar) в Delphi XE2

Пишу функцию для конвертации одной строки в массив array of const для последующего вызова функции Format. Возникла одна проблема. На третьем шаге во второй элемент массива Result пишется та же ссылка, что и в нулевой. И в нулевом элементе заменяется значение на такое же, что во втором.
например:

Код:
  type TVarRecArr = array of TVarRec;

  function Split(Str: string; const Ch: Char): TVarRecArr; // разделяет целую строку Str на массив array of const. элменты массива разделяются знаком Ch
  var
    i, j: Integer;
    Count: Integer; // количество разделителей
    Fstr: string;

  begin
    // считаем сколько будет частей
    Count := 0;
    for i := 1 to Length(Str) do
      if Str[i] = Ch then
        Inc(Count);

    // выделяем память под столько частей
    SetLength(Result, Count);

    // копируем
    j := 0;
    for i := 1 to Length(Str) do // для того чтобы отдельно последний элемент не писать, в исходной строке гарантированно последний знак будет Ch
    begin
      if Str[i] = Ch then
      begin
        Result[j].VPWideChar := PChar(Copy(FStr, 1, maxint));
        Result[j].VType := vtPWideChar; // устанавливаем тип
        Inc(j);
        Fstr := '';
      end
      else
        insert(Str[i], Fstr, Length(Fstr)+1);
    end;
  end;
Изображения
Тип файла: jpg шаг 2.jpg (73.3 Кб, 125 просмотров)
Тип файла: jpg шаг 3.jpg (69.9 Кб, 119 просмотров)

Последний раз редактировалось XAKKEP; 28.03.2013 в 22:00.
XAKKEP вне форума Ответить с цитированием
Старый 29.03.2013, 11:44   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Код:
var
  i, j: Integer;
  Count: Integer; // количество разделителей
  Fstr: string;
  PWCh: PWideChar;
begin
  // считаем сколько будет частей
  Count := 0;
  for i := 1 to Length(Str) do
    if Str[i] = Ch then
      Inc(Count);

  // выделяем память под столько частей
  SetLength(Result, Count);

  // копируем
  j := 0;
  Fstr := '';
  for i := 1 to Length(Str) do // для того чтобы отдельно последний элемент не писать, в исходной строке гарантированно последний знак будет Ch
  begin
    if Str[i] = Ch then
    begin
      PWCh := GetMemory ((Length(Fstr)+1) * 2);
      StringToWideChar (Fstr, PWCh, (Length(Fstr)+1) * 2);

      Result[j].VType := vtPWideChar; // устанавливаем тип
      Result[j].VPWideChar := PWCh;
      Inc(j);
      Fstr := '';
    end
    else
      Fstr := Fstr + Str[i];
  end;
end;
Sibedir вне форума Ответить с цитированием
Старый 29.03.2013, 22:54   #3
XAKKEP
 
Регистрация: 30.09.2010
Сообщений: 5
По умолчанию

Спасибо, помогло.

И если не сложно, хотелось бы услышать объяснения, почему Copy не сработал

Последний раз редактировалось XAKKEP; 29.03.2013 в 23:08.
XAKKEP вне форума Ответить с цитированием
Старый 30.03.2013, 08:49   #4
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Не сработал? Как-раз сработал. Не понятно только куда он скопировал. Ведь место под WideChar мы не выделяли.
Sibedir вне форума Ответить с цитированием
Старый 31.03.2013, 18:24   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от XAKKEP Посмотреть сообщение
Спасибо, помогло.

И если не сложно, хотелось бы услышать объяснения, почему Copy не сработал
http://www.transl-gunsmoker.ru/2009/09/pchars.html

Несложно сообразить, что:
1. Если ты сам не сохраняешь результат вызова функции, то компилятор вынужден сохранять его во временную переменную.
2. В цикле временная переменная всего одна на каждую итерацию.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
String и PChar iCaesy Общие вопросы Delphi 24 26.01.2012 01:37
Перевести тип String в тип PChar (Delphi 7) ScorpioN_T Помощь студентам 2 28.10.2008 22:13
String to PChar D7_beginner Общие вопросы Delphi 2 21.11.2007 14:05
проблема перевода (PChar и string) Fireleo Общие вопросы Delphi 4 29.07.2007 08:14