Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему функция возвращает данные, которые ей недоступны [D7, Win2k, WinXP]


Страницы:   1 2 3 4 5

gosha67 ©   (2006-09-26 16:49:00) 

Здравствуйте уважаемые.
Я программист с некоторым опытом, но только сегодня я обнаружил сие недоразумение. Объясните мне пожалуйста почему в конечном итоге Data := 'some text bla bla bla ....'? По идее она должна быть равно только 'bla bla bla'. Загадка какая-то.
function GetSomeData: string;
var i : integer;
begin
 for i := 1 to 20 do
 begin
   Result := Result + ' bla bla bla';
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Data : string;
begin
 Data := 'some text';
 Data := GetSomeData;
 ShowMessage(Data);
end;


Palladin   (2006-09-28 08:59:00) [21]

нет, понятие объекта не является понятием переменной

var
r:TList
e:TList;

e:=TList.Create;
r:=Nil; // я ее проинициализировал
r:=e; // и тут я ее тоже проинициализировал
r:=TList(3423523); // и здесь я ее тоже проинициализировал

и при последующих обращениях к переменной r я буду расчитывать что содержит она именно то что я и предполагаю в ней увидеть


zamtmn   (2006-09-28 08:53:00) [22]

>>Инициализация переменной всегда являлась и будет являться впредь  назначением ей первоначального значения перед последующими операциями с ней.
для простых типов да, для сложных еще и вызов конструктора


Palladin   (2006-09-28 08:33:00) [23]


> а чем отличается не инициализированная строка от инициализированной?
>  говорить о том что result не инициализируется не верно

Инициализация переменной всегда являлась и будет являться впредь  назначением ей первоначального значения перед последующими операциями с ней.


zamtmn   (2006-09-28 08:21:00) [24]

>>> чем будут отличатся s и ps^?
>>тем, что ps может указывать на некорректную структуру строки вообще.
а чем отличается не инициализированная строка от инициализированной? говорить о том что result не инициализируется не верно
>>Почитай матчасть наконец, в system.pas все написано
с чего ты взял что я его не читал?


zamtmn   (2006-09-28 07:55:00) [25]

>>Ты все-таки матчасть учить не хочешь. Ты выделил 4 байта, забывая о
>>том, что размер структуры для string немножко больше, чем 4 байта. Я
>>тебе не зря привел пример с TList, для иллюстрации твоей ошибки.
да чтож вы за люди та, просили пример с av на неинициализированном string. вот он. после pointer(ps^):=nil; ps^ становится вполне нормальным стрингом с которым можно работать


Ketmar   (2006-09-28 04:10:00) [26]

>[56] Германн(c) 28-Sep-2006, 01:27
>предпочли сменить "запятнанный" ник на другой
неаясно только, зачем. имо, если некто был чайником, а стал вполне продвинутым -- то это только плюс к репутации. %-)


Германн   (2006-09-28 01:27:00) [27]


> Игорь Шевченко ©   (27.09.06 23:41) [55]
>
> zamtmn ©   (27.09.06 19:11) [52]
>
> Ты все-таки матчасть учить не хочешь.

Не он первый, не он последний такой. Уже что-то знающий, но ещё не понявший как мало он знает. И некоторые из них впоследствии стали вполне уважаемыми участниками форума. (Правда, по крайней мере некоторые, предпочли сменить "запятнанный" ник на другой :-). А уж проблемы с "терминологией" тут на форуме очень часты.


Игорь Шевченко   (2006-09-27 23:41:00) [28]

zamtmn ©   (27.09.06 19:11) [52]

Ты все-таки матчасть учить не хочешь. Ты выделил 4 байта, забывая о том, что размер структуры для string немножко больше, чем 4 байта. Я тебе не зря привел пример с TList, для иллюстрации твоей ошибки.


@!!ex   (2006-09-27 19:16:00) [29]

zamtmn ©   (27.09.06 12:15) [19]
Как вы верно заметили, в Дельфи неинициализированную строку можно получить только создавая ее динамически.
А тут о динамическом создании речи вроде не шло совсем...


@!!ex   (2006-09-27 19:13:00) [30]

В коде:
zamtmn ©   (27.09.06 11:54) [14]
переменная указывает хзкуда, и не удивительно что мы получаем AV при обращение хзкуда....

По поводу:
zamtmn ©   (27.09.06 12:04) [16]
При присвоении значения стрнгу указывающему в nil AV не будет. По понятным причинам.


zamtmn   (2006-09-27 19:11:00) [31]

>>тем, что ps может указывать на некорректную структуру строки вообще.
так это и есть не инициализированная строка.
getmem(ps,sizeof(string));
ps^:='';
чем не код? тем что ты так никонгда не писал?


Игорь Шевченко   (2006-09-27 18:48:00) [32]

zamtmn ©   (27.09.06 18:32) [50]


> чем будут отличатся s и ps^?


тем, что ps может указывать на некорректную структуру строки вообще.
Почитай матчасть наконец, в system.pas все написано.

Тебе было предложено привести код, с которым можно получить av, без фантазий типа pointer(str) := хрен_знает_что.
Кода нет.


zamtmn   (2006-09-27 18:32:00) [33]

>>и будешь утверждать, что pl^ - это TList, только не инициализированный, то бегом изучать матчасть.
ненадо приплетать сюда классы.
var
   s:string;
   ps:pstring;
чем будут отличатся s и ps^?


@!!ex   (2006-09-27 16:56:00) [34]

zamtmn ©
реально бред какой то...


Игорь Шевченко   (2006-09-27 16:25:00) [35]

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, только не инициализированный, то бегом изучать матчасть.


oxffff   (2006-09-27 14:51:00) [36]


> Palladin ©   (27.09.06 14:48) [45]
>
> > oxffff ©   (27.09.06 14:39) [43]
>
>
> этот пример никоим образом не коррелирует с высказыванием
> из [5] по поводу AV, и тема совсем другая, о чем и разгорелся
> спор... говорить одно, а доказывать другое не правильно


Тут я не могу не согласиться.


Palladin   (2006-09-27 14:48:00) [37]


> oxffff ©   (27.09.06 14:39) [43]


этот пример никоим образом не коррелирует с высказыванием из [5] по поводу AV, и тема совсем другая, о чем и разгорелся спор... говорить одно, а доказывать другое не правильно


clickmaker   (2006-09-27 14:48:00) [38]


> [44] oxffff ©   (27.09.06 14:45)

что правда не знаешь?
поставить ящик пива админу или за смешную сумму в webmoney


oxffff   (2006-09-27 14:45:00) [39]

Уважаемые давно хочу спросить как получить значок мастер Delphi. :)


oxffff   (2006-09-27 14:39:00) [40]

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.


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо