![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Scrip |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 8.5.2004 Репутация: нет Всего: нет |
Почему при выполнении этой процедуры
x[4]=512? При увеличении или уменьшении границ массива значение х[4] меняется. |
|||
|
||||
| Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: 4 Всего: 54 |
А что значит увеличение/уменьшение границ массива? У тебя статический массив, как можно в нем менять границы?
Вот если было бы
Тогда при SetLength(X,Size) было бы изменение границ массива, а где оно у тебя, я не вижу... А значение содержимого массива у тебя будет меняться каждый раз при вызове TForm1.Button1Click, т.к. массив будет инициализироваться заново... Как решение - вынести массив из процедуры... А вообще приведи больше кода... А то по этому куску я лично мало чего понял... Хотя, наверное, это я такой непонятливый... -------------------- ![]() |
|||
|
||||
| Pakshin A. S. |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 5056 Регистрация: 16.2.2003 Репутация: 21 Всего: 61 |
А где происходит заполение?!
Поставь полный код с заполнением, изменением и т. п. А то получается, что ты выводишь элемент, которого нет, либо в котором содержится число из пямяти, на чьё место был поставлен массив и которое не было удалено предыдущей программой, использующей данную ячейку памяти. |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Это потому что массив - локальный, он хранится в стеке. Видимо мусор в стеке получается одинаковый (т.к. выполняются одни и те же действия).
Можешь увеличить, например, на единицу и длину массива, и № выводимого элемента, тогда у тебя x[5] тоже должно остаться 512... -------------------- С уважением, г-н Посол. |
|||
|
||||
| Marriage |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 4.5.2004 Где: Таганрог Репутация: нет Всего: 2 |
x[5] тоже должно остаться 512...
Действительно так ... Нам преподавали, что массивы нужно обнулять перед использованием, так как в них изначально храняться каки-то значения .. -------------------- Praemonitus, praemunitus |
|||
|
||||
| Jey_k |
|
|||
![]() WEB-командир ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 4149 Регистрация: 16.11.2003 Где: Москва Репутация: 1 Всего: 61 |
Marriage
конечно хранятся!!!!! Это же просто выделенная область памяти и в ней что-нибудь да содержится при работе под виндами по крайней мере. Если переменная или элемент массива работает как аккумулятор, то нужно обнулить сначала, в других случаях присвоить конкретное значение |
|||
|
||||
| Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: 4 Всего: 54 |
Вот это дискуссию развели!!! Scrip, чего молчишь... Народ требует код...
-------------------- ![]() |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Kesh, он же привел код ?! Самый первый пост...
-------------------- С уважением, г-н Посол. |
|||
|
||||
| Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: 4 Всего: 54 |
p0s0l Смотри мой первый пост в этой теме... Я просил больше кода... Да и не я один... Просто из вопроса я многого не понял...
-------------------- ![]() |
|||
|
||||
| December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: 8 Всего: 57 |
p0s0l
На самом деле трудно поверить, что это весь код |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
December, Kesh, и др.
Выразю вопрос Scrip'а в понятной всем форме, а то многие требуют какой-то код... Итак, вопрошаю: Если изменить границы массива, т.е. вместо: var x: array [0..10] of integer; поставить, к примеру, var x: array [0..15] of integer; то по какой-то неведомой причине четвертый элемент массива не изменится... Что за причина такая ? (PS: массив - локальный, т.е. без начального значения). Какой еще код нужен ? Он привел более, чем достаточно... -------------------- С уважением, г-н Посол. |
|||
|
||||
| Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: 4 Всего: 54 |
p0s0l Дык изменится... И при каждом вызове процедуры (читай - инициализации локального статического массива) будет новый... В зависимости от выделяемого куска памяти... А вот с динамическими все так...
Добавлено @ 01:08 Или я опять чего-то не понял... -------------------- ![]() |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Kesh, а ты проверь. Не изменится. Потому что нет никакой инициализации. Просто в стеке выделяется память (add esp, -40h к примеру - на 16 integer'ов). Ну буди если ты будешь кучу push'ов делать (или действия, приводящие к записи в стек), чтобы забить стек, перед вызовом этой процедуры, тогда да - изменится...
А про динамические - вообще не то... Уж не знаю, как и объяснять... -------------------- С уважением, г-н Посол. |
|||
|
||||
| Scrip |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 8.5.2004 Репутация: нет Всего: нет |
p0s0l, благодарю!!!
|
|||
|
||||
| Kesh |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: 4 Всего: 54 |
А про статику ты и сам сказал
-------------------- ![]() |
||||
|
|||||
| Scrip |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 8.5.2004 Репутация: нет Всего: нет |
Что значит обнулять? Так что-ли?
|
||||
|
|||||
| Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: 4 Всего: 54 |
Ага... именно так...
-------------------- ![]() |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
А нельзя ли вместо обнуления, удалить его, а затем создать заново
|
|||
|
||||
| Scrip |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 8.5.2004 Репутация: нет Всего: нет |
dsergey
Нееее, не получится, мы ведь ничего в этом случае не записываем в ячейки памяти, а значит весь мусор там по прежнему остается. |
|||
|
||||
| Scrip |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 8.5.2004 Репутация: нет Всего: нет |
А вот ешо один и один воп.
1. Почему если массив а объявить как фактичесий, то во всех элементах массива будет 0, а если как формальный(т.е внутри подпрограммы) то с мусором. 2. Присвоил а[4] какое-нибудь значение.
В edit1 появляется, естественно, 2323. Далее, если удалить строку a[4]:=2323 и запустить прогу занова, то в edit1 появл. опять 512. Почему? Может какая нить прога туда забивает 512. Но если эта прога уже заняла эту область памяти, тогда как туда залазит Delphi? Что-то я опят недопонимаю. |
|||
|
||||
| Girder |
|
||||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 31 Всего: 155 |
Попробую попроще объяснить:
Для хранения твоих значений используется стек. т.е. push ebp mov ebp,esp add esp,-$30 - резервируется стек под твой массив .... Отступление: 1) Когда заносится информация в стек командой "push ..." - процессор уменьшает адресс стека (на необходимое количество значений) и записывает по получившимуся адресу информацию. 2) Когда информация забирается(выгружается) из стека командой "pop ..." - процессор копирует информацию из стека(туда куда укажеш) и увеличивает(на необходимое количество значений) адресс стека, Мысля пошла?... Нет, тогда продолжаем. 1)Так как используется стек, то этот адресс(а[4]), в стеке, уже наверняка был использован в твой программе(хочеш ты этого или нет) и было записано в него 512. 2)если напишеш вот так:
То уже не получиш 512. 3) То уже не получиш 512. 4)если напишеш вот так:
то а[4]<>512, а b[4]=512 Компилятор используется один и тот же, так? ... Так. Стек резирвируется рядом(add esp,-$30), так? ... Так. Большая вероятность(>90%) что данный адресс в стеке(который выделяется под a[4]) был использован в участке кода, управление Button1Click - сам понимаеш данный участок будет менятся как правило при изменении компилятора. Т.ч. не грузись - все так как должно быть, а иначе быть не может. -------------------- Как слышим, так и пишим. Истина где-то там... |
||||
|
|||||
| Scrip |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 8.5.2004 Репутация: нет Всего: нет |
Идею понял.
А вот с этим желательно поподробней.
______________________________________________________ кстати,Girder, ты как узнал, что у меня D7. Это сообщение отредактировал(а) Scrip - 28.5.2004, 01:23 |
|||
|
||||
| Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 31 Всего: 155 |
Я же написал волшебное слово - компилятор.
Просто проверил в какой версии выдается 512
- Всмысле? -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
| Scrip |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 8.5.2004 Репутация: нет Всего: нет |
Да не знаю я что такое
|
|||
|
||||
| Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 31 Всего: 155 |
А... ты об этом.
Не грузись пока. Придет время -поймеш Удачи. -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Неверное, с Delphi8 уже не поймешь. Там нет asm
|
|||
|
||||
| Jey_k |
|
||||
![]() WEB-командир ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 4149 Регистрация: 16.11.2003 Где: Москва Репутация: 1 Всего: 61 |
Серьезно? Ну и отстой... Добавлено @ 20:48
Запомни и детям передай: Только в одной операционной системе прога адресует только выделенную ЕЙ память а не весь доступный объем- это OS/2. А в форточках возможно все, поэтому, переменные, элементы массивов и даже строк лучше либо сразу забивать значениями, либо если они, например, автоинкрементные или используют другие способы автоизменений, обнулять. Успехов Это сообщение отредактировал(а) Jey_k - 30.5.2004, 20:50 |
||||
|
|||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |