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-27 14:17:00) [41]


> oxffff ©   (27.09.06 14:10) [41]

я верю и неспорю, но в данном случае это не важно, а важно то что компилятор ведет работу с ним, как с обыкновенной строкой...


> дубль 2

ты объяснишь мне причем pstring-то, как он вообще относится к теме ветки? никто же не утверждает что при обращении за область видимой вселенной все будет хорошо...


oxffff   (2006-09-27 14:10:00) [42]

Palladin ©   (27.09.06 14:02) [39]
> zamtmn © [38]
и Result действительно не проинициализирован, но на AV присвоением ему значения ты никоим образом нарваться не можешь.

Хочу поправить

Result в данном случае является синонимом data переданный по ссылке.
Data инициализирован.
см. oxffff ©  [22]  [25].


zamtmn   (2006-09-27 14:09:00) [43]

>>и Result действительно не проинициализирован
дубль 2
ps=pstring;
getmem(ps,sizeof(string));
ps^ - это стринг и не проинициализированый
а result из [0] проинициализированый, что прекрасно видно в debug cpu window


Palladin   (2006-09-27 14:02:00) [44]


> zamtmn © [38]


Result не является указателем на стринг, равно как и b:byte, тоже не является указателем, это раз, два: стринг (в отличии от указателя на стринг) есть указатель на область памяти содержащую набор символов...
и Result действительно не проинициализирован, но на AV присвоением ему значения ты никоим образом нарваться не можешь


zamtmn   (2006-09-27 13:58:00) [45]

>>раз пошла речь о банальнастях то он указывает не на стринг, а на
>>область памяти, которую компилятор
а что тогда есть стринг:)?
да меня под чютким подначиванием Игорь Шевченко © вильнуло в сторону от сабжа. я уж и не помню кто сказал что result не проинициализированна. она проинициализирована, только содержит неопределенное значение


Palladin   (2006-09-27 13:56:00) [46]


> clickmaker ©   (27.09.06 13:52) [36]


да он кому-то что-то доказывает... не понятно, только, что именно :)


clickmaker   (2006-09-27 13:52:00) [47]


> здрасте... он указывает на стринг который компилятором не
> проинициализирован

матерь божья... сколько можно пургу гнать?


zamtmn   (2006-09-27 13:52:00) [48]

var ps:pbyte;
begin
     getmem(ps,sizeof(byte));
     ps^:=255;
..................
тут тоже неизвестно куда?


Palladin   (2006-09-27 13:50:00) [49]

не нужно очевидностей не имеющих отношения к теме, все что ты сказал относится к любому указателю...


> он указывает на стринг

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


zamtmn   (2006-09-27 13:36:00) [50]

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


Palladin   (2006-09-27 13:29:00) [51]


> zamtmn ©   (27.09.06 13:11) [28]

а причем здесь pstring если речь в ветке идет о простом string? да и на кой нужен getmem если делается проще: new(ps)


Johnmen   (2006-09-27 13:26:00) [52]


> zamtmn ©   (27.09.06 13:11) [28]


А где здесь переменная типа string?


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

zamtmn ©   (27.09.06 13:11) [28]

Ты примеры из пальца высасываешь ? В твоем примере AV будет всегда, потому что разыменование неинициализированного указателя гарантировано вызовет AV.

Ты получил указатель, ссылащийся неизвестно куда, но в строчке

>    ps^:='';


ты почему-то считаешь, то он указывает на string.

Так нельзя делать.


clickmaker   (2006-09-27 13:19:00) [54]


> если cтринговая переменная не проинициализирована, то инициализировать
> ее нужно pointer(strvar):=nil, strvar:='' можно словить
> av

чё за бред?


zamtmn   (2006-09-27 13:11:00) [55]

>>Не было. Был код с глобальной переменной типа string, которая и без того
>>инициализирована.
после действий с поинтером, она таковой быть перестала.

var ps:pstring;
begin
      getmem(ps,sizeof(string));
      //вот тебе неинициализированная ps^;
      {pointer(ps^):=nil;}
      ps^:='';
      //а вот тут частенько будут av
      //а если раскоментировать строку выше то их небудет.
..................
хочу заметить, я не говорил что в [0] нужно делать pointer(result):=nil, я говорил о неинициализированных переменных


Игорь Шевченко   (2006-09-27 13:02:00) [56]

zamtmn ©   (27.09.06 12:57) [26]


> код с неинициализированным стрингом был.


Не было. Был код с глобальной переменной типа string, которая и без того инициализирована. А твои действия с pointer, это, извини, твои фантазии. Нафантазировать можно много чего, но причем здесь реальные ситуации, я не понимаю.


zamtmn   (2006-09-27 12:57:00) [57]

Игорь Шевченко ©   (27.09.06 12:45) [24]

>>Код будет или будут длинные рассуждения ?
код с неинициализированным стрингом был.
>>Внимательно читать раздел Declaring and initializing strings в родной справке.
внимательно читать [19]


oxffff   (2006-09-27 12:49:00) [58]

Тогда мы объявляем

var a:string;
begin

Он инициализирован. Cм. oxffff ©   (27.09.06 12:34) [22]

если делаем так

var a:pstring;
begin
new(a);

Он тоже инициализирован.

А вот если делаем так

var a:string;
    p:pointer;
begin
pointer(a):=p;

тогда естественно  DWORD(a):=0;


Игорь Шевченко   (2006-09-27 12:45:00) [59]

zamtmn ©   (27.09.06 12:38) [23]

Код будет или будут длинные рассуждения ?


> var:='' ты присвоишь значение, но не инициализируешь стринг


Внимательно читать раздел Declaring and initializing strings в родной справке.


zamtmn   (2006-09-27 12:38:00) [60]

в [5] нет 'слова Result' там говорится прои инициализацию. var:='' ты присвоишь значение, но не инициализируешь стринг


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

Наверх

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