Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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;

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.004 c
15-1237743773
Коммуноцентрист1
2009-03-22 20:42
2009.05.31
Зачм так положены трубы?


2-1239718109
zz14
2009-04-14 18:08
2009.05.31
Где посмотреть коды клавиш


15-1238075545
@!!ex
2009-03-26 16:52
2009.05.31
ПОчему все так не любытя ReactOS?


2-1239687223
Ulugbek
2009-04-14 09:33
2009.05.31
как сделать Max lenght Field в DbGride?


15-1238431132
Хибл Герзмаев
2009-03-30 20:38
2009.05.31
Патч MS 08-067





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский