0 / 0 / 0
Регистрация: 28.05.2017
Сообщений: 7
|
||||||
1 | ||||||
Ошибки 201/216 при попытке перемножить динамические массивы28.01.2019, 17:37. Показов 1943. Ответов 17
Добрый вечер,
решаю задачу такого характера: нужно из матрицы А получить матрицу В = А + А2 + ... + Аn. Натуральное число n и порядок матрицы вводятся с клавиатуры. С выделением памяти, заполнением матрицы, ее выводом, а так же со сложением проблем нет - программа все считает и выводит. Как только начала тестить умножение - при запуске после ввода А выскакивают ошибки 201, 216. С чем это может быть связано, и как это исправить? Динамические структуры только начали проходить, и пока не все понятно ![]()
0
|
|
28.01.2019, 17:37 | |
Ответы с готовыми решениями:
17
Как обойти системные ошибки 106 и 201 при поиске Код ошибки 201. Тип переменных менял, все одно ошибка при исполнении программы
|
573 / 896 / 145
Регистрация: 10.08.2015
Сообщений: 4,645
|
|
01.02.2019, 00:04 | 2 |
Ты неправильно назвал тип данных. Компилятор не знает, что это матрица и не может ее умножить.
попробуй использовать функции вместо процедур. например, написать функцию возведения матрицы в степень. И не нужно называть матрицу числом, они от этого грустят
0
|
Модератор
![]() ![]() |
||||||||||||||||
01.02.2019, 00:33 | 3 | |||||||||||||||
https://www.cyberforum.ru/post13171411.html
Добавлено через 12 минут Это ошибочное утверждение. Ошибки немного в другом.
но лучше использовать динамические массивы, раз уж они есть в языке:
burgundel,
Для динамических массивов вам в этом поможет Copy().
0
|
573 / 896 / 145
Регистрация: 10.08.2015
Сообщений: 4,645
|
||||||
01.02.2019, 15:29 | 4 | |||||
Ошибочно утверждение, что мое утверждение ошибочно
Ведь как вы лодку назовете, так она и поплывет. Не говоря уж о подводных камнях указателей Код должен быть понятен, тогда его легче дебажить. Код ниже не идеален, но он хотя бы работает
0
|
Модератор
![]() ![]() |
|
01.02.2019, 16:50 | 5 |
Ну и чем это лучше SetLength() плюс помянутого выше https://www.cyberforum.ru/post13171411.html ?
0
|
573 / 896 / 145
Регистрация: 10.08.2015
Сообщений: 4,645
|
|
02.02.2019, 20:38 | 6 |
ну, это как прийти на бал зубных фей в костюме усманова
этот пример показывает, что не все так гладко при использовании указателей. а ваш пример не оформлен должным образом.
0
|
Модератор
![]() ![]() |
||||||||||||||||||||||||||||||||||||
03.02.2019, 15:45 | 7 | |||||||||||||||||||||||||||||||||||
vlisp,
про бал не понял, ну да ладно... про "не оформлен" -- что там оформлять-то? 1) заменить строку 5 на
6) если зачем-то очень хочется очистить память руками:
Собственно, вот и вся разница. Вся эта тривиальщина -- точно не "космические технологии". Добавлено через 9 минут Если наложить ограничение на то, что в mMul() фактический параметр r не может быть одним из фактических a, b, то можно убрать промежуточную матрицу t и распределение памяти под нее, сразу заполнять r.
0
|
573 / 896 / 145
Регистрация: 10.08.2015
Сообщений: 4,645
|
|
03.02.2019, 16:39 | 8 |
Да вот не ладно. Тут тема про указатели, олдскульный треш, пришедший из щей под дос. а у вас динамические массивы. И стоила б овчинка выделки, можно было б потестить производительность, но в данном случае это не имеет смысла, так как матрицы "растут" очень быстро и вываливаются за пределы целых раньше, чем могла бы возникнуть разница по времени двух вариантов.
Есть такое явление, когда человек просит помощи в одном, а ему взамен предлагают другое и не факт, что это другое ему нужно. Вот вам и бал. Вы вероятно предполагали, что ваш код будут просто копировать в свой.. Но лучше оформить код в виде модуля. Написать комментарии, отформатировать код, чтоб он был читаемым, вставить копирайт. и приложить файл модуля для скачивания. Вот это я называю правильно оформленный код.
0
|
Модератор
![]() ![]() |
|
03.02.2019, 18:34 | 9 |
Олдскульный треш тоже бывает разный. Навскидку пара вариантов: 1) как здесь, 2) одним куском.
Плюсы (1): синтаксис FPC позволяет обращаться к указателю как к массиву, поэтому вместо a[i]^[j] имеем вполне себе обычное a[i][j] или a[i,j]. Минусы (1): громоздкое создание/удаление. Плюсы (2): создание/удаление/копирование тривиальны. Минусы (2): адресация в виде a[i*n+j], тем не менее, последовательное обращение к элементам как построчно так и поколоночно поддается некоторой оптимизации. У каждой монеты более одной стороны: бывает часто, что человек не знает, что ему нужно, но просит помощи в том как он сам видит решение, а на самом деле нужно ему совсем-совсем другое. Как минимум забыли комплект документации на модуль, покрытие тестами. Какой же без них правильно оформленный? И да, дописать unit SomeShit; interface, imlementation, end.,uses SomeShit; -- непосильная задача ![]() Добавлено через 18 минут К слову, зачем бы были нужны строки 61-64, 73-74, многовато распределений/удалений, одной пары было бы достаточно. Добавлено через 55 минут Ах да, Randomize внутри fill_random_matr() -- идея не очень хорошая, если не сказать хуже.
0
|
573 / 896 / 145
Регистрация: 10.08.2015
Сообщений: 4,645
|
||||||
04.02.2019, 01:00 | 10 | |||||
так код пишется не для того, чтоб его дописывали
пожалуй вы правы, достаточно создать одну временную временную матрицу
0
|
Модератор
![]() ![]() |
|||||||||||
04.02.2019, 13:32 | 11 | ||||||||||
vlisp,
в новой mult_matr временной матрицы действительно достаточно, кроме того, можно легко обойтись без копирования содержимого, достаточно копирования одного указателя:
0
|
573 / 896 / 145
Регистрация: 10.08.2015
Сообщений: 4,645
|
||||||
04.02.2019, 15:07 | 12 | |||||
нет, что-то не получается, заметил очепятку вместо a[j,k] Нужно b [j,k]. но результат все равно неверный
0
|
Модератор
![]() ![]() |
|||||||||||
04.02.2019, 17:52 | 13 | ||||||||||
vlisp, проверяйте.
0
|
573 / 896 / 145
Регистрация: 10.08.2015
Сообщений: 4,645
|
|
04.02.2019, 23:29 | 14 |
опять вы со своими массивами... ну, поймите это мне не интересно, мне интересно понять почему не работает код, который по идее должен работать
0
|
Модератор
![]() ![]() |
|
05.02.2019, 02:17 | 15 |
vlisp,
почему своими, с кривыми динамическими по двойному GetMem/FreeMem, все ровно как просили ![]() Найдете и проанализируете отличия — выясните источник ошибки... Добавлено через 6 минут Для сверки расчетов можно вместо Randomize задавать в начале одинаковый RandSeed, генерируемые последовательности будут воспроизводимыми.
0
|
573 / 896 / 145
Регистрация: 10.08.2015
Сообщений: 4,645
|
|
05.02.2019, 02:38 | 16 |
проблема в том, что процедура mult_matr в обоих случаях умножает матрицу правильно, а в итоге, получается разный результат. причем если создавать 1 временную матрицу, то результат меньше, подозреваю, где-то неинициализированная матрица с нулями перемножается, но где - непонятно. какой-то для меня неуловимый побочный эффект, которого нет, когда создаешь 2 матрицы (1 вариант)
чет у меня ваши имена процедур, ассоциировались с массивами... у вас то же самое, что и у меня, только имена другие, разве не так? вы проверяли свой код на правильность вычислений?
0
|
573 / 896 / 145
Регистрация: 10.08.2015
Сообщений: 4,645
|
|
05.02.2019, 11:05 | 18 |
0
|
05.02.2019, 11:05 | |
Помогаю со студенческими работами здесь
18
Ошибки при попытке подключения к MySQL При попытке запустить ВПН выдаются ошибки Ошибки при попытке прочитать в указанном месте Вылетает программа при попытке вывести массивы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |