Форум: "Начинающим";
Текущий архив: 2014.01.12;
Скачать: [xml.tar.bz2];
ВнизЧисло в PChar Найти похожие ветки
← →
Cobalt © (2013-03-12 14:31) [0]Есть у меня массив данных, по которым надо заполнить массив сторонних структур и передать в функцию.
Одно из полей структуры - PAnsiChar, а данные для него у меня хранятся в Integer.
придумал такое:it.expiryDate := StrNew(PChar(IntToStr(Ware.LifeTime)));
но есть сомнение - StrNew() - не перебор?
ЗЫ. освобождение памяти на мне.
← →
Медвежонок Пятачок © (2013-03-12 15:51) [1]зависит от жизнедлительности исходного лайфтайм.
← →
Cobalt © (2013-03-12 17:22) [2]Там небольшая длительность.
первый массив освобождается после обработки второго.
← →
Игорь Шевченко © (2013-03-13 00:00) [3]вроде не перебор
← →
Cobalt © (2013-03-13 13:25) [4]А вот такое вот - уже перебор.
it.name := StrNew(PChar(string(Copy(Ware.Name1, 1, 20))));
а все потому, что Ware.Name1 - ShortString, понимаешь.
← →
Игорь Шевченко © (2013-03-13 14:11) [5]Локальные переменные типа string не проще/понятнее завести ?
← →
Cobalt © (2013-03-13 16:02) [6]Полагаю излишним - я из одной записи копирую данные в другую.
← →
Григорьев Антон © (2013-03-13 20:14) [7]Тут дело не в длительности, а в том, в какой момент будет финализирована неявная строковая переменная, которую компилятор создал для хранения результата 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 может вести себя по-разному, если будет делать какие-то предположения о времени жизни таких переменных.
← →
DevilDevil © (2013-03-20 11:14) [8]> Cobalt © (12.03.13 14:31)
существует ли причина, почему в структуре вместо PAnsiChar нельзя указать AnsiString ?
Если эти структуры ты передаёшь в какую-то dll
то смело меняй на AnsiString. SizeOf(AnsiString) = SizeOf(PAnsiChar). К тому же по сути строка - это указатель на символы
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2014.01.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.002 c