Текущий архив: 2006.10.15;
Скачать: CL | DM;
ВнизПочему функция возвращает данные, которые ей недоступны Найти похожие ветки
← →
zamtmn © (2006-09-27 14:09) [40]>>и Result действительно не проинициализирован
дубль 2
ps=pstring;
getmem(ps,sizeof(string));
ps^ - это стринг и не проинициализированый
а result из [0] проинициализированый, что прекрасно видно в debug cpu window
← →
oxffff © (2006-09-27 14:10) [41]Palladin © (27.09.06 14:02) [39]
> zamtmn © [38]
и Result действительно не проинициализирован, но на AV присвоением ему значения ты никоим образом нарваться не можешь.
Хочу поправить
Result в данном случае является синонимом data переданный по ссылке.
Data инициализирован.
см. oxffff © [22] [25].
← →
Palladin © (2006-09-27 14:17) [42]
> oxffff © (27.09.06 14:10) [41]
я верю и неспорю, но в данном случае это не важно, а важно то что компилятор ведет работу с ним, как с обыкновенной строкой...
> дубль 2
ты объяснишь мне причем pstring-то, как он вообще относится к теме ветки? никто же не утверждает что при обращении за область видимой вселенной все будет хорошо...
← →
oxffff © (2006-09-27 14:39) [43]zamtmn видимо хотел предоставить такой пример
var a:pstring;
begin
getmem(a,4);
DWORD(a^):=0;
a^:=GetSomeData;
ShowMessage(a^);
a^:="";
freemem(a);
Утверждать, что никто так не напишет невозможно.
Правда и компилер другой генерит, создавая временную переменную.
Таким образом если написать так, что не будет проблем сабжа
То есть
var a:pstring;
begin
getmem(a,4);
DWORD(a^):=0;
a^:="some text";
a^:=GetSomeData;
ShowMessage(a^);
a^:="";
freemem(a);
Будет только bla bla bla....
то есть так сабжа можно избежать. или использовать safecall.
← →
oxffff © (2006-09-27 14:45) [44]Уважаемые давно хочу спросить как получить значок мастер Delphi. :)
← →
Palladin © (2006-09-27 14:48) [45]
> oxffff © (27.09.06 14:39) [43]
этот пример никоим образом не коррелирует с высказыванием из [5] по поводу AV, и тема совсем другая, о чем и разгорелся спор... говорить одно, а доказывать другое не правильно
← →
clickmaker © (2006-09-27 14:48) [46]
> [44] oxffff © (27.09.06 14:45)
что правда не знаешь?
поставить ящик пива админу или за смешную сумму в webmoney
← →
oxffff © (2006-09-27 14:51) [47]
> Palladin © (27.09.06 14:48) [45]
>
> > oxffff © (27.09.06 14:39) [43]
>
>
> этот пример никоим образом не коррелирует с высказыванием
> из [5] по поводу AV, и тема совсем другая, о чем и разгорелся
> спор... говорить одно, а доказывать другое не правильно
Тут я не могу не согласиться.
← →
Игорь Шевченко © (2006-09-27 16:25) [48]zamtmn © (27.09.06 14:09) [40]
> ps=pstring;
> getmem(ps,sizeof(string));
> ps^ - это стринг и не проинициализированый
Нет, это не стринг. Изучай, как стринги устроены.
Если ты напишешь код вида
type
PTList = ^TList;
var
pl: PTList;
begin
getmem(pl, sizeof(TList));
...
end;
и будешь утверждать, что pl^ - это TList, только не инициализированный, то бегом изучать матчасть.
← →
@!!ex © (2006-09-27 16:56) [49]zamtmn ©
реально бред какой то...
← →
zamtmn © (2006-09-27 18:32) [50]>>и будешь утверждать, что pl^ - это TList, только не инициализированный, то бегом изучать матчасть.
ненадо приплетать сюда классы.
var
s:string;
ps:pstring;
чем будут отличатся s и ps^?
← →
Игорь Шевченко © (2006-09-27 18:48) [51]zamtmn © (27.09.06 18:32) [50]
> чем будут отличатся s и ps^?
тем, что ps может указывать на некорректную структуру строки вообще.
Почитай матчасть наконец, в system.pas все написано.
Тебе было предложено привести код, с которым можно получить av, без фантазий типа pointer(str) := хрен_знает_что.
Кода нет.
← →
zamtmn © (2006-09-27 19:11) [52]>>тем, что ps может указывать на некорректную структуру строки вообще.
так это и есть не инициализированная строка.
getmem(ps,sizeof(string));
ps^:="";
чем не код? тем что ты так никонгда не писал?
← →
@!!ex © (2006-09-27 19:13) [53]В коде:
zamtmn © (27.09.06 11:54) [14]
переменная указывает хзкуда, и не удивительно что мы получаем AV при обращение хзкуда....
По поводу:
zamtmn © (27.09.06 12:04) [16]
При присвоении значения стрнгу указывающему в nil AV не будет. По понятным причинам.
← →
@!!ex © (2006-09-27 19:16) [54]zamtmn © (27.09.06 12:15) [19]
Как вы верно заметили, в Дельфи неинициализированную строку можно получить только создавая ее динамически.
А тут о динамическом создании речи вроде не шло совсем...
← →
Игорь Шевченко © (2006-09-27 23:41) [55]zamtmn © (27.09.06 19:11) [52]
Ты все-таки матчасть учить не хочешь. Ты выделил 4 байта, забывая о том, что размер структуры для string немножко больше, чем 4 байта. Я тебе не зря привел пример с TList, для иллюстрации твоей ошибки.
← →
Германн © (2006-09-28 01:27) [56]
> Игорь Шевченко © (27.09.06 23:41) [55]
>
> zamtmn © (27.09.06 19:11) [52]
>
> Ты все-таки матчасть учить не хочешь.
Не он первый, не он последний такой. Уже что-то знающий, но ещё не понявший как мало он знает. И некоторые из них впоследствии стали вполне уважаемыми участниками форума. (Правда, по крайней мере некоторые, предпочли сменить "запятнанный" ник на другой :-). А уж проблемы с "терминологией" тут на форуме очень часты.
← →
Ketmar © (2006-09-28 04:10) [57]>[56] Германн(c) 28-Sep-2006, 01:27
>предпочли сменить "запятнанный" ник на другой
неаясно только, зачем. имо, если некто был чайником, а стал вполне продвинутым -- то это только плюс к репутации. %-)
← →
zamtmn © (2006-09-28 07:55) [58]>>Ты все-таки матчасть учить не хочешь. Ты выделил 4 байта, забывая о
>>том, что размер структуры для string немножко больше, чем 4 байта. Я
>>тебе не зря привел пример с TList, для иллюстрации твоей ошибки.
да чтож вы за люди та, просили пример с av на неинициализированном string. вот он. после pointer(ps^):=nil; ps^ становится вполне нормальным стрингом с которым можно работать
← →
zamtmn © (2006-09-28 08:21) [59]>>> чем будут отличатся s и ps^?
>>тем, что ps может указывать на некорректную структуру строки вообще.
а чем отличается не инициализированная строка от инициализированной? говорить о том что result не инициализируется не верно
>>Почитай матчасть наконец, в system.pas все написано
с чего ты взял что я его не читал?
← →
Palladin © (2006-09-28 08:33) [60]
> а чем отличается не инициализированная строка от инициализированной?
> говорить о том что result не инициализируется не верно
Инициализация переменной всегда являлась и будет являться впредь назначением ей первоначального значения перед последующими операциями с ней.
← →
zamtmn © (2006-09-28 08:53) [61]>>Инициализация переменной всегда являлась и будет являться впредь назначением ей первоначального значения перед последующими операциями с ней.
для простых типов да, для сложных еще и вызов конструктора
← →
Palladin © (2006-09-28 08:59) [62]нет, понятие объекта не является понятием переменной
var
r:TList
e:TList;
e:=TList.Create;
r:=Nil; // я ее проинициализировал
r:=e; // и тут я ее тоже проинициализировал
r:=TList(3423523); // и здесь я ее тоже проинициализировал
и при последующих обращениях к переменной r я буду расчитывать что содержит она именно то что я и предполагаю в ней увидеть
← →
Palladin © (2006-09-28 09:07) [63]о чем и сказал Джо, при вызове функции Result не инициализирован, он может не содержать (а в большинстве случаев так оно и есть) пустую строку на которое расчитывал автор ветки...
← →
zamtmn © (2006-09-28 09:10) [64]var s:string;
begin
s:=""; тут ты ниче не проинициализировал, s уже была проинициализирована компилятором, ты присвоил значение
← →
zamtmn © (2006-09-28 09:12) [65]а я говорю, что в делфи нету неинициализированных стрингов, а если они появляются, то нужно их обнулить
← →
Palladin © (2006-09-28 09:15) [66]Хорошо, тогда война разгорелась из-за терминологии.
← →
zamtmn © (2006-09-28 09:24) [67]>>нет, понятие объекта не является понятием переменной
объекта какраз является, ты говоришь о классах
← →
Ketmar © (2006-09-28 09:44) [68]>[64] zamtmn(c) 28-Sep-2006, 09:10
>var s:string;
>begin
> s:=""; тут ты ниче не проинициализировал, s
>уже была проинициализирована компилятором, ты
>присвоил значение
только в том случае, если s -- глобальная. иначе в неё радостно попадает мусор со стека.
← →
Palladin © (2006-09-28 09:48) [69]
> zamtmn © (28.09.06 09:24) [67]
какого объекта? ты о чем?
r:=TList(3423523);
какой тут объект? причем здесь объект? я просто использую r как целочисленную переменную, причем тут объект?
← →
Johnmen © (2006-09-28 09:53) [70]
> Palladin © (28.09.06 09:07) [63]
> о чем и сказал Джо, при вызове функции Result не инициализирован
В данном рассматриваемом случае [0] Result инициализирован.
О чём уже было сказано и мной, и Sha, и Игорем Шевченко, и Borland"ом :)
← →
Palladin © (2006-09-28 09:54) [71]Значение его не инициализированно...
← →
Ketmar © (2006-09-28 09:56) [72]>[70] Johnmen(c) 28-Sep-2006, 09:53
>В данном рассматриваемом случае [0] Result
>инициализирован.
это не есть документированное поведение. мало ли, какой там код компилятор генерирует сейчас, и какой код появится потом...
← →
zamtmn © (2006-09-28 09:59) [73]>>только в том случае, если s -- глобальная. иначе в неё радостно попадает мусор со стека.
глобальная, локальная - без разницы, будет проинициализирована. C неопределенным значением в случае [0]. если в стринге мусор - будет av
>>какого объекта? ты о чем?
>>>нет, понятие объекта не является понятием переменной
тут ты имеешь ввиду class а не object
← →
Johnmen © (2006-09-28 10:01) [74]
> Ketmar © (28.09.06 09:56) [72]
> это не есть документированное поведение.
Если об этом говорит сам Борланд, то документированное.
← →
Ketmar © (2006-09-28 10:02) [75]хм. "инициализация мусором" -- это новое слово в терминологии.
зыж вот интересно, тут идёт попытка доказать глупость просто из вредности, или как?
← →
Ketmar © (2006-09-28 10:02) [76]>[74] Johnmen(c) 28-Sep-2006, 10:01
>Если об этом говорит сам Борланд, то
>документированное.
э-э-э... а можно раздел справки, где это сказано? или хотя бы цитату?
← →
zamtmn © (2006-09-28 10:06) [77]>>зыж вот интересно, тут идёт попытка доказать глупость просто из вредности, или как?
тут идет подмена понятия инициализации присвоением начального значения
← →
Johnmen © (2006-09-28 10:06) [78]
> Ketmar © (28.09.06 10:02) [76]
Ты вообще ветку с начала читал?
Обрати внимание на [9] и [10]. Теперь понимаешь, к кому надо обращаться с этой просьбой? :)))
← →
Ketmar © (2006-09-28 10:10) [79]>[78] Johnmen(c) 28-Sep-2006, 10:06
>Ты вообще ветку с начала читал?
да читал, вроде. %-)
>Обрати внимание на [9] и [10]. Теперь понимаешь,
>к кому надо обращаться с этой просьбой? :)))
ну, Игорь придёт -- прочитает. пояснит, надеюсь. %-)
← →
Palladin © (2006-09-28 10:51) [80]
> тут ты имеешь ввиду class а не object
угу... прошу прощения... смысл в том, что объявить переменную ты можешь одного типа, а инициализировать любыми данными
Страницы: 1 2 3 вся ветка
Текущий архив: 2006.10.15;
Скачать: CL | DM;
Память: 0.62 MB
Время: 0.05 c