Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
11-1249205119
DevilDevil
2009-08-02 13:25
2014.01.12
SelLength для ComboBox


2-1363790754
Maximqa58415
2013-03-20 18:45
2014.01.12
Delphi7(Цикл с параметром for)


2-1363783734
Alex_C
2013-03-20 16:48
2014.01.12
TEdit+TStringGrid=странное поведение


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


15-1374610930
DevilDevil
2013-07-24 00:22
2014.01.12
Да решит коллективный разум бытовую задачу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский