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

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

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

 
 Ответить  Открыть новую тему 
> динамические массивы
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

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


не могли вы мне помочь разобраться с динамическими массивами в паскалеABC.
Ну вот для примера попыталась написать:

 uses crt;
Type
TTmas=array[1..1] of integer;
Tmas=^TTmas;
var
a:Tmas;
i,n:integer;
begin
writeln('введите n');
readln(n);
GetMem(a,SizeOf(TTmas)*n);
writeln('массив:');
for i:=1 to n do
readln( a^[i]);
for i:=1 to n do
writeln( a^[i], ' ');
writeln;
FreeMem(a,SizeOf(TTmas)*n); { пишет: неверное количество фактических параметров, а как надо писать?}
readln
end.
.

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


Гость






Попробуй просто FreeMem(a);, возможно ABC запоминает размер выделенной переменной самостоятельно. Проверить не могу, потому что простого ABC нету, а ABC.NET не понимает GetMem/FreeMem, у него для динамических массивов есть другие средства, SetLength, как в Дельфи...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

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


Цитата(volvo @ 9.06.2010 14:23) *

Попробуй просто FreeMem(a);,



пробовала, тогда тут ошибки не выдает, но когда начинаешь вводить числа, то после первого пишет:
Ошибка: 2 - выход за границы диапазона изменения индекса 1..1
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
Ошибка: 2 - выход за границы диапазона изменения индекса 1..1
А вот об этом я специально написал здесь: Как не надо писать программы (пункт 2)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

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


Цитата(volvo @ 9.06.2010 14:28) *

А вот об этом я специально написал здесь: Как не надо писать программы (пункт 2)



что-то я все прочитала и не поняла, что надо исправить (
если написать через new и dispose, все равно не работает
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Не надо описывать тип [1 .. 1], я об этом... По ссылке ж написано, ПОЧЕМУ это будет вылетать. Вот и исправь так, чтоб не вылетало. Это тоже описано по ссылке. И про New/Dispose там НИЧЕГО не сказано. Я дал точную ссылку и даже номер пункта, в котором описывается эта проблема. Неужели, пока не скопируешь сам текст в каждую тему - объяснить что-то нереально? unsure.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

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


Только с этим "запоминает размер выделенной переменной самостоятельно" тоже надо быть осторожным.
В турбопасе, например, код
 
var
p: ^byte;
begin
WriteLN(MemAvail);
GetMem(p, 1234);
Dispose(p);
WriteLN(MemAvail);
end.


Даёт утечку памяти и вообще портит всю структуру кучи, а вот код
 
var
p: ^byte;
begin
WriteLN(MemAvail);
GetMem(p, 1234);
Dispose(pointer(p)); {!!!}
WriteLN(MemAvail);
end.


Работает нормально


Добавлено через 3 мин.
А не, код, который снизу, тоже работает ненормально...


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


Гость






Цитата
В турбопасе, например, код
вообще является ошибочным (и не надо начинать старую песню о том, что так можно делать. С крыши прыгать тоже никто не запрещал, это тоже можно. Но не нужно).

Это прямо указано в документации к языку. Нельзя перемешивать GetMem/Dispose и New/FreeMem. Точка. Перемешал - получил проблемы. PascalABC прекрасно отслеживает размер выделенного блока. Равно как и FPC.
 К началу страницы 
+ Ответить 

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

 





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