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

Поиск:

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


Новичок



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

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



Почему при выполнении этой процедуры
Код
procedure TForm1.Button1Click(Sender: TObject);
var x: array [0..10] of integer;;
begin
Edit1.Text:=inttostr(x[4]);
end;

x[4]=512?
При увеличении или уменьшении границ массива значение х[4] меняется.
PM MAIL   Вверх
Kesh
Дата 24.5.2004, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А что значит увеличение/уменьшение границ массива? У тебя статический массив, как можно в нем менять границы?

Вот если было бы
Код
var x: array of integer;

Тогда при SetLength(X,Size) было бы изменение границ массива, а где оно у тебя, я не вижу...

А значение содержимого массива у тебя будет меняться каждый раз при вызове TForm1.Button1Click, т.к. массив будет инициализироваться заново... Как решение - вынести массив из процедуры...

А вообще приведи больше кода... А то по этому куску я лично мало чего понял...

Хотя, наверное, это я такой непонятливый...


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
Pakshin A. S.
Дата 24.5.2004, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А где происходит заполение?! hehe.gif

Поставь полный код с заполнением, изменением и т. п. А то получается, что ты выводишь элемент, которого нет, либо в котором содержится число из пямяти, на чьё место был поставлен массив и которое не было удалено предыдущей программой, использующей данную ячейку памяти.
PM   Вверх
p0s0l
Дата 24.5.2004, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Это потому что массив - локальный, он хранится в стеке. Видимо мусор в стеке получается одинаковый (т.к. выполняются одни и те же действия).
Можешь увеличить, например, на единицу и длину массива, и № выводимого элемента, тогда у тебя x[5] тоже должно остаться 512...


--------------------
С уважением, г-н Посол.
PM   Вверх
Marriage
Дата 24.5.2004, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



x[5] тоже должно остаться 512...


Действительно так ...
Нам преподавали, что массивы нужно обнулять перед использованием, так как в них изначально храняться каки-то значения ..


--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
Jey_k
Дата 24.5.2004, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Marriage
конечно хранятся!!!!!
Это же просто выделенная область памяти и в ней что-нибудь да содержится при работе под виндами по крайней мере.
Если переменная или элемент массива работает как аккумулятор, то нужно обнулить сначала, в других случаях присвоить конкретное значение



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


Эксперт
****


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

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



Вот это дискуссию развели!!! Scrip, чего молчишь... Народ требует код...


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


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Kesh, он же привел код ?! Самый первый пост...



--------------------
С уважением, г-н Посол.
PM   Вверх
Kesh
Дата 24.5.2004, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



p0s0l Смотри мой первый пост в этой теме... Я просил больше кода... Да и не я один... Просто из вопроса я многого не понял...


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


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

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



p0s0l
Цитата
он же привел код ?! Самый первый пост..

На самом деле трудно поверить, что это весь код smile.gif Переросли smile.gif


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 25.5.2004, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 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: массив - локальный, т.е. без начального значения).

Какой еще код нужен ? Он привел более, чем достаточно...



--------------------
С уважением, г-н Посол.
PM   Вверх
Kesh
Дата 25.5.2004, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



p0s0l Дык изменится... И при каждом вызове процедуры (читай - инициализации локального статического массива) будет новый... В зависимости от выделяемого куска памяти... А вот с динамическими все так...

Код
// пример для консоли
var
 a: array of integer;
begin
 SetLength(a,2);
 a[0] := 1;
 a[1] := 3;
 SetLength(a,4);
 a[2] := 2;
 a[3] := 5;
 Write(a[1]); // отгадай что выдаст... я думаю '3'
end

Добавлено @ 01:08
Или я опять чего-то не понял...


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


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Kesh, а ты проверь. Не изменится. Потому что нет никакой инициализации. Просто в стеке выделяется память (add esp, -40h к примеру - на 16 integer'ов). Ну буди если ты будешь кучу push'ов делать (или действия, приводящие к записи в стек), чтобы забить стек, перед вызовом этой процедуры, тогда да - изменится...
А про динамические - вообще не то... Уж не знаю, как и объяснять...


--------------------
С уважением, г-н Посол.
PM   Вверх
Scrip
Дата 25.5.2004, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


Эксперт
****


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

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



Цитата
To truncate a dynamic array, pass it to SetLength or Copy and assign the result back to the array variable. (The SetLength procedure is usually faster.) For example, if A is a dynamic array, A := SetLength(A, 0, 20) truncates all but the first 20 elements of A.
Help из D6... Именно по этому я и говорю, что при изменении размеров динамических массивов значения в незатронутых элементах остаются без изменения...
А про статику ты и сам сказал
Цитата
Ну буди если ты будешь кучу push'ов делать (или действия, приводящие к записи в стек), чтобы забить стек, перед вызовом этой процедуры, тогда да - изменится...
Ага буду...


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

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

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

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

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


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

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


 




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


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

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