IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Ограничение для выделения памяти под массив
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 227
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  3  +


Как надо написать в var'e, когда необходимо выделить некоторое количество ячеек для массива?

Код
var
a:array[1..?] of integer;
...

write('kakoe koli4estvo simvolov bydet v massive');
readln(n);

for i:=1 to n do
{zapolnenie masiva lyubym sposobom}

Если место ? написать n, вылетает ошибка, тогда что должно быть место вопросительного занка? Нельзя же просто писать максимальную цифру от фонаря, типа 9999?


--------------------
Само знание есть сила
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Бывалый
***

Группа: Пользователи
Сообщений: 227
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  3  +


Цитата
то непонимание тобой 5-й строки говорит о том, что ты невнимательно прочитал или не понял где-то выше по тексту, т.е. то, что скрывается за предыдущими 4-мя строками.
Специально, чтобы не было таких предложений, я привел краткий конспект вышесказанного. Про "Процедура FreeMem( var p: Pointer; size: Word ) ... " я там объяснения не нашел.

Цитата
Невозможно ничего объяснить, не опираясь на что-то из того, что человеку уже известно. Поэтому расскажи, что ты знаешь о работе с памятью в компьютере.
Что именно тебя интересует? Одна ячейка памяти - это один бит, байт это 8 бит, ... 1 Кб = 1024 Байт и т. д. Касаемо памяти в Паскале, знаю только общие фразы из учебника (типа: каждой переменной должна быть присвоена определенная ячека памяти, тип Integer ограничивается таким-то числом, тип Longint ограничивается таким-то числом - краткий пересказ, не придирайтесь : ))

Цитата
Ну просто array of написать не получится.
Но можно сделать так:
Смотри посты выше.

Цитата
Слав, я тебе от души советую: научись придавать значение каждому слову в том, что читаешь.
Буду стараться...

Нда, тогда действительно у меня возникает путаница. В строчке
Цитата
Насчет динамических массивов:
я нашел немного, сам разобраться не смогу.
Тогда есть ошибка, имелось в виду, насчет динамической памяти. Я так понимаю FreeMem образовано от английского Free Memory (свободная память), соответственно, я нашел немного не насчет динамических массивов, а насчет динамической памяти.

Цитата
Ошибиться довольно легко, потому что в сети масса недоразумений по этому поводу.
Согласен.

Цитата
Если ты теперь действительно являешься счастливым обладателем FPC,
Действительно, являюсь - FPC 2.2.2

Что значит вот это
Цитата
c: array of record
и вот это
Цитата
d: double;
?

SetLength я, так, понял действует только для динамических массивов и во FPC?

Строчка SetLength(a,10) - означает присвоить массиву a память под 10 элементов. То есть если бы пользователь сам вводил количество элеметов массива для которых он хотел решать задачу, то было бы:
...
writeln('vvedite kol-vo elementov massiva');
readln(n);
...
setlength(a,n);
...
Или нет?

Цитата
Процедура SetLength имеет такое же название, как аналогичная процедура для типа String.
Такой процедурой не пользовался : ( - мне это ни о чем не говорит...

Цитата
Если же все же возникнет нужда - скажи, объясним )).
Нужда, кажется, возникнет: в основном в учебниках я встречаю FreeMem, хотелось бы знать конкретнее. Все таки интересно, что это значит ?
Цитата
"Процедура FreeMem( var p: Pointer; size: Word ) освобождает участок памяти, адрес начала которого определен указателем p, а размер - параметром size. Значение указателя p становится неопределенным."


--------------------
Само знание есть сила
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Сначала о простом:
double - это один из вещественных типов. Занимает в паямяти 8 байт. Используется для расчетов повышенной точности (по сравнению с single, 4 байта, и real, 6 байт).
record - тип "запись", представляющий набор полей (переменных разных типов), сейчас рассказывать не буду, пройдешь позже. Извини, что упомянул.

Цитата(Вячеслав Людской @ 2.11.2009 9:37) *
краткий пересказ, не придирайтесь
Дело не в краткости. Дело в том, что ты не упомянул такое понятие, как адресация, а оно тут ключевое. Организация памяти - побайтовая, у каждого байта - адрес (грубо говоря, его номер). Если мы имеем дело с многобайтовой структурой (integer, string..), то ее адресом является адрес первого байта.

Адреса всех объявленных переменных зашиты намертво в программу. Но если мы хотим в программе использовать дополнительную память, то мы должны запросить ее у системы (ОС). Если у ОС память есть, она выделяет запрошенное нам количество байт (и записывает себе, что они теперь в деле) и выдает нам адрес начала этого куска. Эту память (начиная с выделенного адреса, и столько, сколько запросили) мы можем использовать (как - скажу ниже). Когда мы закончили работу с выделенной нам памятью, мы ее можем освободить, то есть сказать ОС, что кусок такой-то длины начиная с такого-то адреса теперь свободен.

В Паскале есть понятие pointer - переменная такого типа просто содержит адрес. Сначала рассмотрим две процедуры: GetMem и FreeMem. Они в точности соответствуют тому. что я сказал выше. Первая запрашивает память, вторая - освобождает. Длина участка памяти в них задается в байтах. Например:
var
p: pointer;
begin
GetMem(p,2);
{используем}
FreeMem(p,2);
end.

Этот пример не несет большого смысла. Смысл появится ниже..

Кроме простого указателя pointer в Паскале есть указатели на переменные. По сути - это точно такие же пойнтеры, то есть содержат адрес некоторой области. Но в программе есть информация, с каким типом каждый такой указатель ассоциирован. Например,
var
p: pointer;
pi: ^integer;
begin
GetMem(p,2);
pi:=p;
pi^:=3*4;
WriteLn(pi^);
FreeMem(p,2);
end.

В этом примере мы берем память (2 байта) и используем ее для целых вычислений. Появился небольшой смысл, но совсем маленький. Есть две непонятки:
1. почему бы нам сразу не сделать целую переменную i. Но это ясно - просто, чтоб изучить дин.память.
2. зачем нам был нужен пойнтер p? Ведь можно было просто так:
var
pi: ^integer;
begin
GetMem(pi,2);
pi^:=3*4; {ссылку по этому адресу мы используем как обычную целую переменную}
WriteLn(pi^);
FreeMem(pi,2);
end.
- так проще и лучше. Пока еще остается все-таки одна сложность: нам нужно "вручную" вычислять количество необходимой памяти в байтах. В принципе, с этим можно побороться так:
var
pi: ^integer;
begin
GetMem(pi,SizeOf(integer));
pi^:=3*4;
WriteLn(pi^);
FreeMem(pi,SizeOf(integer));
end.
- вот, мы избавились от двойки. Можно еще универсальнее сделать:

type
tInt=integer;
var
pi: ^tInt;
begin
GetMem(pi,SizeOf(tInt));
pi^:=3*4;
WriteLn(pi^);
FreeMem(pi,SizeOf(tInt));
end.
В этом виде программа имеет то преимущество, что если нам станет мало типа integer и мы захотим перейти на LongInt, то нужно будет подредатировать всего одну строчку (тип).

Но все же неудобно тащить за собой SizeOf. И вот тут приходит на помощь пара процедур New и Release. Думаю, чтоб ты разобрался, достаточно будет привести пример - все та же наша прога, только с парой New/Release вместо пары GetMem/ FreeMem.

type
tInt=integer;
var
pi: ^tInt;
begin
New(pi);
pi^:=3*4;
WriteLn(pi^);
Release(pi);
end.
Тут нам вообще не нужно было связываться с длиной области - компилятор освободил нас от этой работы.

Пока хватит, спрашивай, что неясно.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Вячеслав Людской   Ограничение для выделения памяти под массив   26.10.2009 22:16
volvo   Смотря что тебе надо, сколько элементов будет хран…   26.10.2009 22:23
Вячеслав Людской   Вопрос был именно для случая, когда заранее неизв…   27.10.2009 23:06
Lapp   [code]var a:array[1..?] of integer; ..…   28.10.2009 10:39
TarasBer   2. использовать динамические массивы. Насколько я…   1.11.2009 18:18
Вячеслав Людской   const m= 100; var a: array[1..m]of integer; По…   28.10.2009 19:24
Lapp   По моему, тут мы просто так же от фонаря пишем 100…   29.10.2009 1:27
Вячеслав Людской   Я не правильно понял "вопрос: что конкретно …   29.10.2009 16:15
Lapp   Вот насчет этого не надо, всегда стараюсь, отвечат…   29.10.2009 19:41
Вячеслав Людской   :) Тогда, извиняюсь, "поэтому" я действ…   29.10.2009 21:02
Вячеслав Людской   Насчет динамических массивов: я нашел немного, сам…   1.11.2009 13:58
andriano   Которую из приведенных 5 строчек ты не понял? Есл…   1.11.2009 17:58
Lapp   Насчет динамических массивов: я нашел немного, Нет…   2.11.2009 10:49
Вячеслав Людской   Специально, чтобы не было таких предложений, я пр…   2.11.2009 13:37
Lapp   Сначала о простом: double - это один из веществен…   2.11.2009 18:49
-volvo-   Это значит только одно: Как только тебе не нужна б…   2.11.2009 19:40
Вячеслав Людской   Извиняюсь, маленько отвлекся. За объяснения спаси…   5.11.2009 21:23
Lapp   Строчка SetLength(a,10) - означает присвоить масси…   6.11.2009 11:48
andriano   Ну да. Аналогия: Тебе выдали пачку чистой бумаги -…   6.11.2009 14:40
Вячеслав Людской   Все понял, спасибо.   6.11.2009 18:10


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 13.05.2024 1:49
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name