Форум: "Начинающим";
Текущий архив: 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