1 / 1 / 1
Регистрация: 13.11.2015
Сообщений: 56
|
||||||
1 | ||||||
Работа с массивами13.02.2016, 18:35. Показов 5643. Ответов 6
Метки нет (Все метки)
Добрый вечер. В свое время сразу не понял как с ними работать в c++ и особенно не понял работу в динамике. Теперь необходимо составить программу по расчету в нечеткой логике, и заметил, что там нужно использовать массивы. Решил начать с азов. Одномерные статические и динамические массивы вроде освоил, впринципе должно хватить. Но решил попробовать и двумерные массивы попробовать сделать, появились некоторые вопросы...
Билдер создает массивы горизонтально или вертикально? Или это определяется тем, как я его в цикле заполняю? По идее ведь i-тые элементы это номера строк, а j-тые номера столбцов верно? Попробовал как в одной статье сделать, впринципе работает такая конструкция двумерного динамического массива.
Но еще более важный вопрос - когда решил попробовать работать с массивом (ведь в дальнейшем прийдется перемножать элементы массива с элементами другого массива или если в двумерном то строку со строкой и потом ведь нужно результат получить и наверняка в новый массив вставлять) и запутался, специально ведь по аналогии со статьей, заменил rows на str и columns на stolb (чтобы не попутать) а когда решил вывести первую строку через ShowMessage получил 1, 6, error. Ну методом тыка поменял местами str и stolb и вышло то, что хотел - 1, 2, 3, 4, 5. Но непойму в статье ошибка в том что в таком массиве 5 строк и 2 столбца или я что-то напутал?
0
|
13.02.2016, 18:35 | |
Ответы с готовыми решениями:
6
Работа с массивами Работа с массивами работа с массивами Работа с массивами |
14.02.2016, 01:05 | 2 | ||||||||||
При таком обращении - massiv[str][stolb] - у тебя в массиве условно две строки и два столбца. Условно - потому что логика тут внутри совсем иная и желательно ее понимать.
В твоем коде объявлено три динамических массива: в первом два элемента типа int * - указателей на тип int, в остальных двух - массивы элементов типа int, по пять элементов в каждом. Под именем massiv у тебя находится один объект типа int ** - "указатель на указатель", то есть указатель на тип int *.
Видно, что "двумерный массив" в таком случае представлен четырьмя отдельными объектами - указателем massiv, одним массивом указателей и двумя массивами данных, которые нам и нужны изначально. Причем все они физически расположены в различных местах памяти. В случае со статически объявляемым массивом, какой бы размерности он ни был, данные хранятся одним большим куском в одном месте памяти, как будто бы это одномерный массив. В этом случае "массив" представлен двумя объектами - одним куском данных и указателем на первую ячейку этого куска.
1
|
15.02.2016, 16:33 | 3 |
BRcr, к сожалению в вашем посте есть плохая рекомендация касательно второго способа работы с элементами двумерного статически объявленного массива. Здесь описано, в чем дело https://www.cyberforum.ru/blog... g3291.html
З.Ы. несмотря на то, что запись про си, это справедливо и для с++11 (только что нашел этот абзац в стандарте).
1
|
15.02.2016, 18:32 | 5 |
BRcr, смотря что под вылетом понимать. Просто с формальной точки зрения то, что вы порекомендовали, делать нельзя. По причинам в статье.
0
|
15.02.2016, 18:39 | 7 |
Значит, я неверно понял вашу мысль. Прошу прощения.
Справедливо.
0
|
15.02.2016, 18:39 | |
15.02.2016, 18:39 | |
Помогаю со студенческими работами здесь
7
Работа с массивами Работа с массивами Работа с массивами Работа с массивами Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |