Форум: "Начинающим";
Текущий архив: 2009.05.31;
Скачать: [xml.tar.bz2];
ВнизАвто-преобразование параметров char[]->String Найти похожие ветки
← →
KSergey © (2009-04-20 18:32) [0]Я чего-то могу придумать как и где почитать.
Функция: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? Может кто подскажет или где бы почитать?
← →
KSergey © (2009-04-20 18:35) [1]Сорри, вот эта строка кода в конце - лишняя: "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 вставил недавно по неаккуратности. В нем ли беда - не понятно.
Взрывается, понятно, только у клиентов, как обычно.
← →
clickmaker © (2009-04-20 18:41) [2]> причем с явно перегаженым стеком
так, может, все-таки не "корректно заполняем par1 и par2" ? например, строкой в 6 или 14 символов
← →
KSergey © (2009-04-20 19:00) [3]> clickmaker © (20.04.09 18:41) [2]
> так, может, все-таки не "корректно заполняем par1 и par2"
> ? например, строкой в 6 или 14 символов
Есть сильное подозрение, что корректно. Ну во всяком случае весь день пытался придумать как в конкретном месте можно заполнить некорректно - не придумал.
Хотя, конечно, подозрение о писательстве мимо памяти - имеется.
Да и фик бы с ним. Вот как понять почему тут компилятор не ругается? Вот что мне загадочно.
← →
Игорь Шевченко © (2009-04-20 19:05) [4]
> Вопрос: по каким правилам преобразуются массивы в String?
массивы [0..xxx] of Char совместимы по типу с PChar, а PChar в String преобразуется вызовом функции _LStrFromPChar, которую в код вставляет компилятор, когда встречается такое преобразование, явное или неявное.
В справке это все подробно описано
← →
KSergey © (2009-04-20 19:07) [5]Понял, спасибо всем.
Под вечер хватило тяму глянуть в ассемблер - так и есть. блииин, где ж беду-то искать?! видимо не здесь.
← →
Игорь Шевченко © (2009-04-20 19:12) [6]
> где ж беду-то искать?!
может 0 где-нибудь в середину попал ? String-у, ему все равно, есть в нем 0 или нет, главное, чтобы длина была задана. А вот PChar-у - ему не все равно, он до первого нолика...
← →
KSergey © (2009-04-20 19:48) [7]> Игорь Шевченко © (20.04.09 19:12) [6]
> может 0 где-нибудь в середину попал ? String-у, ему все
> равно, есть в нем 0 или нет, главное, чтобы длина была задана.
т.е.? не понял.
Выходит строка строится длиной во весь буфер, а не до первого нулевого символа?!
← →
Игорь Шевченко © (2009-04-20 19:53) [8]
> Выходит строка строится длиной во весь буфер, а не до первого
> нулевого символа?!
на этот вопрос лучше всего ответит отладчик.
Если вызывается SetString, то длиной в столько, сколько заказано в параметре длины.
← →
KSergey © (2009-04-20 19:59) [9]Поставил эксперимент:
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.
Ну и славно, это и желалось.
Значит надо вообще где-то не здесь искать, видимо. Мест - наверное можно найти.
← →
KSergey © (2009-04-20 20:00) [10]> KSergey © (20.04.09 19:59) [9]
> Если верить отладчику в точке останова,
Про i - это, конечно, в следующей строке смотрел.
← →
Anatoly Podgoretsky © (2009-04-20 20:04) [11]> KSergey (20.04.2009 19:59:09) [9]
PChar в string до первого нуля, через функцию получения длины.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.05.31;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c