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

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

AV при сложение AnsiString и UnicodeString в D2010


Anatoly Podgoretsky ©   (2009-10-01 22:39:00) 

Вот пример тестового приложения, которое вызывает AV при втором и более проходов

procedure TClientTestForm.SendToServer;
var
 S: AnsiString;
 S1: String;
begin
 if SendList.Count > 0 then begin
   S1 := SendList.Strings[0];
//    InputsCLI.Proto := 'udp';
//    InputsCLI.Addr := ServerIPEdit.Text;
//    InputsCLI.Port := InputsPortEdit.Text;
//    InputsCLI.LocalPort := InputsRepliesPortEdit.Text;
//    InputsCLI.Connect;
   S := RawByteString(UnitIDEdit.Text) + '-';
   S := S + AnsiString(S1);                 <-- место возникновения AV
//    InputsCLI.SendStr(S);              
 end;
end;

Нифига не понятно, приложение сведено к минимуму.
Значение S и S1 не пустые и правильные. SendList в каждый момент на строку больше, но S[0] не изменяется.

Есть ли какие либо идеи.
Возможно как то связано со StringList (SendList). На его основе организована очередь.
Добавление в конец методом Add, пока большего в приложение не делается, только добавляется и используется только в данном месте.
Переменные введены только для отладки. Закоментировано тоже для отладки, что бы свести к минимуму другие случайные влияния. Если строку изменить на S := AnsiString(S1);  то проблемы нет.ЪЪЪ


Anatoly Podgoretsky   (2009-10-03 18:02:00) [1]

К сожалению или к счастью на мини проекте ошибка не возникает, как я только не пробовал. Видимо проблема комбинации компонент на моем проекте.

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

В общем вопрос можно считать изчерпаным - моя проблема.


Anatoly Podgoretsky   (2009-10-03 00:36:00) [2]

> Семён. А  (02.10.2009 23:42:15)  [15]

Попробую сделать самый, самый мини проект, наверно завтра.


Семён. А   (2009-10-02 23:42:00) [3]


> Интересно было бы услышать, воспроизводится ли подобное
> у кого либо?

Демку ф студию!


Anatoly Podgoretsky   (2009-10-02 22:42:00) [4]

> turbouser  (02.10.2009 21:00:13)  [13]

Ты путаешь, это TStrings "абстрактный", и объявлять можно как TStrings, так и TStringList, без разницы, но методологически правильнее объявлять TStrings.

Я пробовал и так и так. Кстати если бы дело было в этом, то оно сразу бы проявилось, а не со второй попытки, по поведению понятно, что ссылка по какой то причине становится недействительной. Я проект свел к минимуму. Создание в Create, однократное заполнение одной строкой и приведеный код для анализа.

Интересно было бы услышать, воспроизводится ли подобное у кого либо?


turbouser   (2009-10-02 21:00:00) [5]


> Возможно как то связано со StringList

Скорее всего.
TStringList- абстрактный. д.б. объявлен как TStrings и уж затем создан как TStringList
Боролся с переводом fr 2.5 под d2010, все сделал, не работало. Потом в полях, процедурах и ф-циях поменял TStringList на TStrings - заработало :)


Anatoly Podgoretsky   (2009-10-02 19:11:00) [6]

> alles  (02.10.2009 17:02:09)  [9]

Аналогичный эксперимент я проводил, без толку.


Anatoly Podgoretsky   (2009-10-02 19:10:00) [7]

Черт его знает, разбираться буду когда потребуется, пока не требуется.


Дмитрий Белькевич   (2009-10-02 17:10:00) [8]

Может в ассемблер глянуть? Иногда помогает...


alles   (2009-10-02 17:02:00) [9]

А попробуйте добавить еще одно переменное

procedure TClientTestForm.SendToServer;
var
S, Stmp: AnsiString;
S1: String;
begin
if SendList.Count > 0 then begin
 S1 := SendList.Strings[0];
 S := RawByteString(UnitIDEdit.Text) + '-';
 Stmp:=AnsiString(S1);
 S := S + Stmp;    
end;
end;


Anatoly Podgoretsky   (2009-10-02 15:58:00) [10]

> icWasya  (02.10.2009 15:35:07)  [7]

Потому что приемник типа AnsiString, можно и не делать, тогда Дельфи сделает это сама, но в компиляторе будут предупреждения об этом.


icWasya   (2009-10-02 15:35:00) [11]

а зачем делать это
AnsiString(S1);


Anatoly Podgoretsky   (2009-10-02 10:00:00) [12]

> Германн  (02.10.2009 01:06:05)  [5]

Мне тоже кажется, что я нарвался на ошибку реализации Юникод строк, хотя еще на 100% не уверен, видимо где то меняется адрес из-за счетчика ссылок, при том с моей стороны нет изменения SendList[0]. Я для чистоты эксперимента даже обеспечил одно единственное присвоение.

if SendList.Count = 0 then SendList.Add(string(AnsiString));


Германн   (2009-10-02 01:06:00) [13]


> Есть ли какие либо идеи.

Послать багрепорт эмбаркадеру?


Anatoly Podgoretsky   (2009-10-01 23:30:00) [14]


> а что находится в S непосредственно до момента AV ?

Ничего, текст приведен точно, вот с убраными комментариями.
procedure TClientTestForm.SendToServer;
var
S: AnsiString;
S1: String;
begin
if SendList.Count > 0 then begin
  S1 := SendList.Strings[0];
  S := RawByteString(UnitIDEdit.Text) + '-';
  S := S + AnsiString(S1);                 <-- место возникновения AV
end;
end;

Оригинально было так, без переменных
InputsCLI.SendStr(RawByteString(UnitIDEdit.Text) + '-' + RawByteString(SendList.Strings[0]));
И разделено для отладки и замаскировано все лишнее.


Anatoly Podgoretsky   (2009-10-01 23:09:00) [15]

> Семён. А  (01.10.2009 22:45:01)  [1]

Без разницы.
После дополнительного иследования стало ясно, что проблема как то связана со StringList, поскольку если заменить на константу S1 := 'abcdef'; то ошибка не возникает. Для более полного иследования StringList содержить только одну строку (один раз добавляется).


DVM   (2009-10-01 23:02:00) [16]


> Anatoly Podgoretsky ©   (01.10.09 22:39)  

а что находится в S непосредственно до момента AV ?


Семён. А   (2009-10-01 22:45:00) [17]


> S1: String;


AnsiString


Наверх

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