![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
kent |
![]()
Сообщение
#1
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 50 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Захотел использовать динамическую матрицу в задаче, но что то не получается... Попытался сначала сделать ввод вывод, но вводишь к примеру M = 3, N = 3...
Вводишь 1 2 3 1 2 3 1 2 3 Выводит 1 1 1 1 1 2 1 2 3 Вот код:
Подскажите что не так... Сообщение отредактировано: kent - 30.07.2005 20:39 |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата(kent @ 30.07.05 20:16) Подскажите что не так... ![]() GetMem(a,Size); Если бы все было так просто... Вообще-то описания типов должны быть такими: type Ну, и выделение/освобождение памяти, соотвественно: ReadLn(M); Кстати, в процедуре распечатки матрицы у тебя лишний If - зачем? Вот так не лучше? ;) Procedure WriteMatrix(mx : PMatrix); |
kent |
![]()
Сообщение
#3
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 50 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Попробовал сделать так, выводит правильно, но вместо того чтобы ждать нажатия клавиши (Readkey), выдает Runtime - error 204...
![]() И ещё вопрос, что означает?
Не совсем врубаюсь... Может проще как-нибудь можно? |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата(kent @ 30.07.05 21:57) выводит правильно, но вместо того чтобы ждать нажатия клавиши (Readkey), выдает Runtime - error 204... ![]() Значит, что-то неправильно делаешь (эта ошибка возникает при неправильной работе с указателями через GetMem/FreeMem)... Вот так должно происходить освобождение: For i := 1 To M Do Цитата(kent @ 30.07.05 21:57) И ещё вопрос, что означает? MaxInt div sizeof(Type) Может проще как-нибудь можно? Вообще-то я пропустил, там должно быть вот так: TVector = Array[1 .. 2 * maxInt div sizeof(MyType)] Of MyType;:p2: Это означает, что максимальное число элементов массива рассчитывается исходя из следующих соображений: максимальный размер массива в Турбо-Паскале = 64Кбайта, что соответствует 2*maxInt. Но столько элементов в массив поместится только, если размер каждого = 1 байту. У тебя размер каждого элемента = SizeOf(MyType), вот и дели макс. возможный размер на размер каждого элемента, чтобы получить макс. число элементов в массиве... При таком способе у тебя НИКОГДА не произойдет выхода за пределы массива... Можно, в принципе, оставить как было у тебя: type , но тогда тебе придется отключать контроль выхода за пределы массива ({$R-}), что не очень хорошо, ведь контроль отключается ДЛЯ ВСЕЙ программы... |
kent |
![]() ![]()
Сообщение
#5
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 50 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Сейчас все ОК, никаких ошибок...
![]() Цитата Значит, что-то неправильно делаешь (эта ошибка возникает при неправильной работе с указателями через GetMem/FreeMem)... Немного не так у меня было... Вместо: For i := 1 To M Do Стояло:
А насчет размерности масива, буду наерное использовать твой вариант, дальше сложные задачки идут и без дополнительных массивов наверное не обойтись, так что ({$R-}) мне будет только мешать... Спасибо тебе большое, что так подробно всё объяснил... :thanks: Жалко тут рейтинга нет с меня два ++... ![]() Сообщение отредактировано: kent - 30.07.2005 22:47 |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата(kent @ 30.07.05 22:46) Стояло:
Я так и думал... Это очень распространенная ошибка: дело в том, что вообще-то память должна освобождаться в порядке, противоположном ее выделению. То есть, если выделялось так: GetMem(x1, ...); То освобождаться должно так: ... Это же желательно взять за правило в случае работы с New/Dispose... А я кроме этого (по возможности) придерживаюсь такого же порядка при работе с файлами, то есть то, что открывается последним, закрывается первым. :yes: |
![]() ![]() |
![]() |
Текстовая версия | 21.06.2025 15:06 |