Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> глюк с массивом 
:(
    Опции темы
Scrip
Дата 25.5.2004, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 8.5.2004

Репутация: нет
Всего: нет



Цитата
Нам преподавали, что массивы нужно обнулять перед использованием

Что значит обнулять? Так что-ли? biggrin.gif Или я не так понял?
Код
var a: array [1..10] of integer;
i: integer;
begin
for i:= low(a) to high(a) do
a[i]:=0;
end;


PM MAIL   Вверх
Kesh
Дата 25.5.2004, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 4
Всего: 54



Ага... именно так...


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
Akella
Дата 27.5.2004, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



А нельзя ли вместо обнуления, удалить его, а затем создать заново thumbs-up.gif
PM MAIL   Вверх
Scrip
Дата 27.5.2004, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 8.5.2004

Репутация: нет
Всего: нет



dsergey
Нееее, не получится, мы ведь ничего в этом случае не записываем в ячейки памяти, а значит весь мусор там по прежнему остается.
PM MAIL   Вверх
Scrip
Дата 27.5.2004, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 8.5.2004

Репутация: нет
Всего: нет



А вот ешо один и один воп.
1. Почему если массив а объявить как фактичесий, то во всех элементах массива будет 0, а если как формальный(т.е внутри подпрограммы) то с мусором. sad.gif //только щас заметил
2. Присвоил а[4] какое-нибудь значение.
Код
procedure TForm1.Button1Click(Sender: TObject);
var a: array [1..10] of integer;
begin
a[4]:=2323;
Edit1.Text:=inttostr(a[4]);
end;

В edit1 появляется, естественно, 2323. Далее, если удалить строку a[4]:=2323 и запустить прогу занова, то в edit1 появл. опять 512. Почему? Может какая нить прога туда забивает 512. Но если эта прога уже заняла эту область памяти, тогда как туда залазит Delphi? Что-то я опят недопонимаю.
PM MAIL   Вверх
Girder
Дата 27.5.2004, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Попробую попроще объяснить:

Для хранения твоих значений используется стек.
т.е.
push ebp
mov ebp,esp
add esp,-$30 - резервируется стек под твой массив
....

Отступление:
1) Когда заносится информация в стек командой "push ..." - процессор уменьшает адресс стека
(на необходимое количество значений) и записывает по получившимуся адресу информацию.
2) Когда информация забирается(выгружается) из стека командой "pop ..." - процессор копирует
информацию из стека(туда куда укажеш) и увеличивает(на необходимое количество значений) адресс стека,
exclamation.gif НО... - не обнуляет(очищает) информацию в стеке.

Мысля пошла?... Нет, тогда продолжаем.

1)Так как используется стек, то этот адресс(а[4]), в стеке, уже наверняка был использован в твой
программе(хочеш ты этого или нет) и было записано в него 512.
2)если напишеш вот так:
Код

 procedure TForm1.Button1Click(Sender: TObject);
 var a: array [1..10] of integer;
 begin
  Info_ESP;
 end;

 procedure TForm1.Info_ESP;
 var a: array [1..10] of integer;
 begin
   Edit1.Text:=inttostr(a[4]);
 end;

То уже не получиш 512.
3) exclamation.gif Если скомпилируеш не в D7, а в D5,D6 ... exclamation.gif
То уже не получиш 512.
4)если напишеш вот так:
Код

 procedure TForm1.Button1Click(Sender: TObject);
 var b: array [1..10] of integer;
      a: array [1..10] of integer;
 begin
  Edit1.Text:=inttostr(a[4]);
  Edit2.Text:=inttostr(b[4]);
 end;

то а[4]<>512, а b[4]=512

exclamation.gif exclamation.gif exclamation.gif
Компилятор используется один и тот же, так? ... Так.
Стек резирвируется рядом(add esp,-$30), так? ... Так.
Большая вероятность(>90%) что данный адресс в стеке(который выделяется под a[4]) был
использован в участке кода, exclamation.gif твоей программы exclamation.gif , которая передает
управление Button1Click - сам понимаеш данный участок будет менятся как правило при
изменении компилятора.

Т.ч. не грузись - все так как должно быть, а иначе быть не может.


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Scrip
Дата 28.5.2004, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 8.5.2004

Репутация: нет
Всего: нет



Идею понял.
А вот с этим желательно поподробней.
Код
push ebp
mov ebp,esp
add esp,-$30 - резервируется стек под твой массив

______________________________________________________
кстати,Girder, ты как узнал, что у меня D7.

Это сообщение отредактировал(а) Scrip - 28.5.2004, 01:23
PM MAIL   Вверх
Girder
Дата 28.5.2004, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Я же написал волшебное слово - компилятор.
Просто проверил в какой версии выдается 512

Цитата
А вот с этим желательно поподробней

- Всмысле?


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Scrip
Дата 28.5.2004, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 8.5.2004

Репутация: нет
Всего: нет



Да не знаю я что такое
Код
push ebp
mov ebp,esp
add esp,-$30
wink.gif
PM MAIL   Вверх
Girder
Дата 28.5.2004, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



А... ты об этом.

Не грузись пока.
Придет время -поймеш

Удачи.


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Akella
Дата 28.5.2004, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Неверное, с Delphi8 уже не поймешь. Там нет asm
PM MAIL   Вверх
Jey_k
Дата 30.5.2004, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WEB-командир
****


Профиль
Группа: Комодератор
Сообщений: 4149
Регистрация: 16.11.2003
Где: Москва

Репутация: 1
Всего: 61



Цитата(dsergey @ 28.5.2004, 12:16)
Неверное, с Delphi8 уже не поймешь. Там нет asm

Серьезно? Ну и отстой...
Добавлено @ 20:48
Цитата(Scrip @ 27.5.2004, 20:09)
Но если эта прога уже заняла эту область памяти, тогда как туда залазит Delphi? Что-то я опят недопонимаю.

Запомни и детям передай:
Только в одной операционной системе прога адресует только выделенную ЕЙ память а не весь доступный объем- это OS/2.
А в форточках возможно все, поэтому, переменные, элементы массивов и даже строк лучше либо сразу забивать значениями, либо если они, например, автоинкрементные или используют другие способы автоизменений, обнулять.
Успехов smile.gif

Это сообщение отредактировал(а) Jey_k - 30.5.2004, 20:50


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0591 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.