Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Число в PChar [D7]


Cobalt ©   (2013-03-12 14:31:00) 

Есть у меня массив данных, по которым надо заполнить массив сторонних структур и передать в функцию.
Одно из полей структуры - PAnsiChar, а данные для него у меня хранятся в Integer.
придумал такое:
it.expiryDate := StrNew(PChar(IntToStr(Ware.LifeTime)));
но есть сомнение - StrNew() - не перебор?

ЗЫ. освобождение памяти на мне.


DevilDevil   (2013-03-20 11:14:00) [1]

> Cobalt ©   (12.03.13 14:31)

существует ли причина, почему в структуре вместо PAnsiChar нельзя указать AnsiString ?

Если эти структуры ты передаёшь в какую-то dll
то смело меняй на AnsiString. SizeOf(AnsiString) = SizeOf(PAnsiChar). К тому же по сути строка - это указатель на символы


Григорьев Антон   (2013-03-13 20:14:00) [2]

Тут дело не в длительности, а в том, в какой момент будет финализирована неявная строковая переменная, которую компилятор создал для хранения результата IntToStr. Обычно такая переменная финализируется в эпилоге функции, но в некоторых случаях это может произойти раньше. Простой тест:

procedure TForm1.Button1Click(Sender: TObject);
var X:array[1..5] of Integer;
    S:array[1..5] of PChar;
    I:Integer;
 begin
  for I:=1 to 5 do
   X[I]:=I;
  for I:=1 to 5 do
   S[I]:=PChar(IntToStr(X[I]));
  Label1.Caption:=S[1];
  Label2.Caption:=S[2];
  Label3.Caption:=S[3];
  Label4.Caption:=S[4];
  Label5.Caption:=S[5];
 end;


В результате выполнения этого кода во всех label'ах будет текст "5" (проверено в Delphi 7). Потому что во втором цикле используется одна и та же неявная строковая переменная. Соответственно, строка, созданная на предыдущей итерации освобождается (а новая строка размещается в том же месте динамической памяти в силу логики работы менеджера памяти). И вообще, момент финализаци неявных переменных, насколько мне известно, не регламентирован в документации, поэтому один и тот же код в разных версиях Delphi может вести себя по-разному, если будет делать какие-то предположения о времени жизни таких переменных.


Cobalt   (2013-03-13 16:02:00) [3]

Полагаю излишним - я из одной записи копирую данные в другую.


Игорь Шевченко   (2013-03-13 14:11:00) [4]

Локальные переменные типа string не проще/понятнее завести ?


Cobalt   (2013-03-13 13:25:00) [5]

А вот такое вот - уже перебор.
 it.name := StrNew(PChar(string(Copy(Ware.Name1, 1, 20))));
а все потому, что Ware.Name1 - ShortString, понимаешь.


Игорь Шевченко   (2013-03-13 00:00:00) [6]

вроде не перебор


Cobalt   (2013-03-12 17:22:00) [7]

Там небольшая длительность.
первый массив освобождается после обработки второго.


Медвежонок Пятачок   (2013-03-12 15:51:00) [8]

зависит от жизнедлительности исходного лайфтайм.


Наверх

Титульная страница Поиск, карта сайта Написать письмо