Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.11.15;
Скачать: [xml.tar.bz2];

Вниз

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

Наверх





Память: 0.49 MB
Время: 0.007 c
15-1253179997
dort12
2009-09-17 13:33
2009.11.15
Может кто делал??


15-1252932944
SP
2009-09-14 16:55
2009.11.15
Математическая задачка


2-1254333632
Vorotnyak_nazar
2009-09-30 22:00
2009.11.15
где в Delphi 7 компонент TrotateImage


2-1254420046
faiwer
2009-10-01 22:00
2009.11.15
PasteToClipboard, RichEdit


8-1198845410
hero
2007-12-28 15:36
2009.11.15
снять звук с аудио ин или аут, где найти TdeAudioIn или подобное





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