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

Вниз

Авто-преобразование параметров 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;

Pltcm function 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
15-1238018281
Юрий
2009-03-26 00:58
2009.05.31
С днем рождения ! 26 марта 2009 четверг


4-1190046757
Bora.ru
2007-09-17 20:32
2009.05.31
Снимок частично закрытого окна


15-1237877089
{RASkov}
2009-03-24 09:44
2009.05.31
Настройка сетевого принтера


2-1240226221
VMF
2009-04-20 15:17
2009.05.31
DLL в C++ для Delphi


15-1237875001
Урсулапов_
2009-03-24 09:10
2009.05.31
Программа, которая распознает тип файла без расширения