Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
5-1140943637
Reset
2006-02-26 11:47
2006.10.15
Default - значения свойств


1-1157350859
Alkid
2006-09-04 10:20
2006.10.15
IntfClear


6-1148201699
Мигель
2006-05-21 12:54
2006.10.15
Как скачать фото с сайта? Контент в виде HTML скачивается


15-1158671748
Empleado
2006-09-19 17:15
2006.10.15
Есть ли возможность найти человека в Москве/Московской области?


4-1148978503
sicilla
2006-05-30 12:41
2006.10.15
Не могу запустить файл





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