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