![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Число в 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]зависит от жизнедлительности исходного лайфтайм.