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

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

Авто-преобразование параметров char[]->String


KSergey ©   (2009-04-20 18:32:00) 

Я чего-то могу придумать как и где почитать.

Функция:

function MyFunc(APar1: String; const APar2: String): Boolean;

Вызов:

var
      par1: array [0..4] of char;
      par2: array [0..12] of char;
...

// корректно заполняем par1 и par2 строкой с #0 символом на конце

function MyFunc(par1, par2);

Компилятор не ругается и с виду все работает.
Вопрос: по каким правилам преобразуются массивы в String?

Есть вариант

function MyOtherFunc(APar1, APar2: PChar): Boolean;

Pltcm function MyFunc(APar1: String; const APar2: String): Boolean;

Здесь я хотя бы могу предположить, что берется адрес первого символа массива и из него конструируется дельфи-строка.
А вот в первом случае? Массив рассматривается как представление строки в памяти или действия как в варианте 2? Может кто подскажет или где бы почитать?


Anatoly Podgoretsky   (2009-04-20 20:04:00) [1]

> KSergey  (20.04.2009 19:59:09)  [9]

PChar в string до первого нуля, через функцию получения длины.


KSergey   (2009-04-20 20:00:00) [2]

> KSergey ©   (20.04.09 19:59) [9]
> Если верить отладчику в точке останова,

Про i - это, конечно, в следующей строке смотрел.


KSergey   (2009-04-20 19:59:00) [3]

Поставил эксперимент:

procedure TForm1.Button8Click(Sender: TObject);
var
   buf: array [0..10] of Char;
   s: String;
   i: Integer;

   procedure dddd(sss: String);
   begin
     s := sss;
     i := Length(sss);  // <- точка останова
   end;

begin
   buf[0] := 'a';
   buf[1] := 'b';
   buf[2] := 'c';
   buf[3] := #8;
   buf[4] := #0;
   buf[5] := #5;
   buf[6] := #22;
   buf[7] := 'e';
   buf[8] := 'g';
   dddd(buf);
end;


Если верить отладчику в точке останова, то s = 'abc'#8, i=4.
Ну и славно, это и желалось.

Значит надо вообще где-то не здесь искать, видимо. Мест - наверное можно найти.


Игорь Шевченко   (2009-04-20 19:53:00) [4]


> Выходит строка строится длиной во весь буфер, а не до первого
> нулевого символа?!


на этот вопрос лучше всего ответит отладчик.

Если вызывается SetString, то длиной в столько, сколько заказано в параметре длины.


KSergey   (2009-04-20 19:48:00) [5]

> Игорь Шевченко ©   (20.04.09 19:12) [6]
> может 0 где-нибудь в середину попал ? String-у, ему все
> равно, есть в нем 0 или нет, главное, чтобы длина была задана.

т.е.? не понял.
Выходит строка строится длиной во весь буфер, а не до первого нулевого символа?!


Игорь Шевченко   (2009-04-20 19:12:00) [6]


> где ж беду-то искать?!


может 0 где-нибудь в середину попал ? String-у, ему все равно, есть в нем 0 или нет, главное, чтобы длина была задана. А вот PChar-у - ему не все равно, он до первого нолика...


KSergey   (2009-04-20 19:07:00) [7]

Понял, спасибо всем.

Под вечер хватило тяму глянуть в ассемблер - так и есть. блииин, где ж беду-то искать?! видимо не здесь.


Игорь Шевченко   (2009-04-20 19:05:00) [8]


> Вопрос: по каким правилам преобразуются массивы в String?


массивы [0..xxx] of Char совместимы по типу с PChar, а PChar в String преобразуется вызовом функции _LStrFromPChar, которую в код вставляет компилятор, когда встречается такое преобразование, явное или неявное.

В справке это все подробно описано


KSergey   (2009-04-20 19:00:00) [9]

> clickmaker ©   (20.04.09 18:41) [2]
> так, может, все-таки не "корректно заполняем par1 и par2"
> ? например, строкой в 6 или 14 символов

Есть сильное подозрение, что корректно. Ну во всяком случае весь день пытался придумать как в конкретном месте можно заполнить некорректно - не придумал.

Хотя, конечно, подозрение о писательстве мимо памяти - имеется.

Да и фик бы с ним. Вот как понять почему тут компилятор не ругается? Вот что мне загадочно.


clickmaker   (2009-04-20 18:41:00) [10]

> причем с явно перегаженым стеком

так, может, все-таки не"корректно заполняем par1 и par2" ? например, строкой в 6 или 14 символов


KSergey   (2009-04-20 18:35:00) [11]

Сорри, вот эта строка кода в конце - лишняя: "Pltcm function MyFunc(APar1: String; const APar2: String): Boolean;"

Т.е., еще раз: есть два варинта:

1. function MyFunc(APar1: String; const APar2: String): Boolean;

2. function MyOtherFunc(APar1, APar2: PChar): Boolean;


Собственно от чего вопрос: прога где-то иногда взрывается, причем с явно перегаженым стеком. Вариант номер 2 работает давно и без проблем во многих местах. Вариант номер 1 вставил недавно по неаккуратности. В нем ли беда - не понятно.
Взрывается, понятно, только у клиентов, как обычно.


Наверх

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