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

Вниз

AV при сложение AnsiString и UnicodeString в D2010   Найти похожие ветки 

 
Anatoly Podgoretsky ©   (2009-10-01 22:39) [0]

Вот пример тестового приложения, которое вызывает 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);  то проблемы нет.ЪЪЪ


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


> S1: String;


AnsiString


 
DVM ©   (2009-10-01 23:02) [2]


> Anatoly Podgoretsky ©   (01.10.09 22:39)  

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


 
Anatoly Podgoretsky ©   (2009-10-01 23:09) [3]

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

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


 
Anatoly Podgoretsky ©   (2009-10-01 23:30) [4]


> а что находится в 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]));
И разделено для отладки и замаскировано все лишнее.


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


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

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


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

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

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

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


 
icWasya ©   (2009-10-02 15:35) [7]

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


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

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

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


 
alles   (2009-10-02 17:02) [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;


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

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


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

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


 
Anatoly Podgoretsky ©   (2009-10-02 19:11) [12]

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

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


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


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

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


 
Anatoly Podgoretsky ©   (2009-10-02 22:42) [14]

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

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

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

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


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


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

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


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

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

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


 
Anatoly Podgoretsky ©   (2009-10-03 18:02) [17]

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2009.11.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.013 c
2-1254289329
Johnnnnn
2009-09-30 09:42
2009.11.15
Управление с клавиатуры &amp;


2-1254066422
K_Lock
2009-09-27 19:47
2009.11.15
1 копия формы в MDI приложении


15-1252930319
Раиса
2009-09-14 16:11
2009.11.15
html + VBScript +Connection +mdb


2-1253959376
контрол
2009-09-26 14:02
2009.11.15
Как программно "зажать" контрол?


2-1254568749
faiwer
2009-10-03 15:19
2009.11.15
Как реализовать?