Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.01.12;
Скачать: CL | DM;

Вниз

Число в 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
15-1374239185
vrem
2013-07-19 17:06
2014.01.12
Синхронный запуск и синхронизация двух программ


15-1374148630
Ega23
2013-07-18 15:57
2014.01.12
Коллеги, а у кого есть LibreOffice или OpenOffice


15-1374346226
Mobilnik
2013-07-20 22:50
2014.01.12
Использование памяти на Андроид


1-1320399017
Lucky
2011-11-04 12:30
2014.01.12
не компилируется любой проект под Delphi в RAD Studio XE2


15-1374558352
DevilDevil
2013-07-23 09:45
2014.01.12
Багтрек Embarcadero