| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > двумерный массив |
| Автор: intel 28.10.2009, 21:22 | ||
| Здравствуйте. Есть такая функция:
Проблема в том что если я передаю в неё массив размера size, где size меньше MAX_SIZE, то она перестаёт коректно работать, то бишь выдаёт пару значений из массива и много муссора. В этот самый мусор и есть моя проблема - откуда он?! Подскажите, ребят |
| Автор: KuMa1104 28.10.2009, 22:35 |
| В с++ не силен. Но как я понемаю масив у тебя лежит в памяти и функция читает по указаннаму адресу масив данных размером 8 баит * size. А так как в памяти после твоего масива идёт какаято другая инфа. то компьётер читает её пока на дойдет до нужного места (начал масива + size) |
| Автор: jonie 28.10.2009, 22:38 |
| intel, как вызываешь показывай, и откуда буфер берешь с данными тоже |
| Автор: intel 29.10.2009, 00:53 | ||||
создаю и заполняю массив:
Вот так вызываю:
Всё происходит в мэйне. Пишу на Dev-C++ |
| Автор: Anikmar 29.10.2009, 08:35 |
| Так делать вообще нельзя. По логике должно выдавать правильно первые n элементов. Странно, что это компилируется. ИМХО Терпеть не могу статические массивы Размеры массивов передаваемого и в прототипе функции должны совпадать. |
| Автор: andrew_121 29.10.2009, 09:07 | ||
|
| Автор: zim22 29.10.2009, 09:08 |
чему равен? |
| Автор: Cheloveck 29.10.2009, 09:09 |
| http://forum.vingrad.ru/index.php?showtopic=278215&view=findpost&p=2007631 |
| Автор: andrew_121 29.10.2009, 09:24 |
Вот только я не понял, почему в том коде контейнеров нет? |
| Автор: jonie 29.10.2009, 09:31 | ||
Anikmar, почему это нельзя?
все работает штатно, как и должно быть. У автора где-то портится память очевидно? |
| Автор: andrew_121 29.10.2009, 09:38 | ||
А почему не использовать контейнеры? и: наверное все же так:
|
| Автор: Cheloveck 29.10.2009, 10:21 |
Из-за специфики ТС. Думаю его нельзя было озадачивать контейнерами)) |
| Автор: intel 29.10.2009, 20:26 | ||
| Прошу прощения, Модеры, что поднимаю уже на сто раз разжёванную тему, но к сожалению после долгих хождений по форумам я так ничего и не нашёл. Спасибо за комментарии и советы, но всётаки вопрос остаётся открытым. Постараюсь описать по подробнее. В общем дана довольно-таки простенькая задачка: Напишите функцию, которая вычисляет детерминанту матрицы размером N x N, где N define-константа. Функция имеет следующий прототип:
Побегал по форумам и пришёл к выводу, что реализовать это дело рекурсивно было бы самым изящным и наглядным способом. Значит так; вот что я тут накумекал: Создаю матрицу размером N, передаю в функцию get_det(matrix, N), которая создаёт tmp-матрицу размером (size-1)*(size-1), заполняет её значениями из переданной матрицы (без 0. строки и i. столбца) и вызывает саму себя, но уже с tmp-матрицей размером (size-1)x(size-1), size-1 и т.д. пока size > 1. Вот тут то и весь геморой, то бишь в прототипе размер матрицы равен N x N, а передаю (N-1) x (N-1) (первый рекурс-вызов)!! Надеюсь ход мыслей понятен. Объяснил как мог. Господа Прогеры, может у вас есть более простое решение?, а то у меня после явы при виде статических массивов и указателей, волосы дыбом встают. Спасибо |
| Автор: 17dufa 30.10.2009, 14:29 |
| я подозреваю, что двумерный массив matrix[N][N] при компиляции становится одномерным. как следствие matrix[1][2] на самом деле будет matrix[1*N+2]. так как в вызываемой функции и вызывающей разные значения N получается бардак при адресации (положим в вызывающей N = 5, тогда matrix[1][2] на самом деле matrix[7], а в вызываемой N = 10 и как следствие matrix[1][2] на самом деле становится matrix[12]). не хотите контейнеров - используйте двойной указатель и динамическое выделение памяти. |
| Автор: mes 30.10.2009, 14:51 |
да двумерный статический массив представлен непрерывным куском памяти.. а не массивом массивов как в случае использования двумерных динамический. где то я это уже слышал... неа.. смотрите внимательней длина строки ($N) массива всегда одна и та же, а size определяет лишь сколько элементов использовать. |
| Автор: 17dufa 30.10.2009, 15:01 | ||
mes, у топикастера - разная:
|
| Автор: mes 30.10.2009, 15:29 |
длина матрицы определена в прототипе функции... компилятор не позволит передать другой длины.. |
| Автор: 17dufa 30.10.2009, 15:53 |
| mes, кхем. тогда надо просить intel привести кусок кода. словесное описание недостаточно красноречиво (по крайней мере для меня). ну или советовать переходить на double** и начинать релаксировать от мемори ликов |
| Автор: Anikmar 31.10.2009, 00:13 | ||
Нельзя - потому, что типы данных не совпадают. Что происходит у автора я понятия не имею - потому, что при описанных условиях это не должно компилироваться (в нормальном режиме - без изуверств, которые С++ позволяет делать). Можно только при
Что вы в своем примере наглядно и продемонстрировали. - Размерности совпали - все впорядке. Да и теоритически невозможно - смещение по индексу он (компилятор) физически не сможет правильно посчитать. |