|
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
|
||||||||||||||||
Что такое двумерный массив?13.08.2011, 23:24. Показов 2531. Ответов 13
Не буду долго объяснять мотивы subj-а, но не получается организовать работу с матрицей как с массивом векторов.
Пытаюсь написать цикл просмотра массива с использованием указателя на элемент в качестве счетчика. Для вектора
Пытаюсь написать
test.cpp:57: error: comparison between distinct pointer types 'int**' and 'int (*)[5]' lacks a cast 57 строка в файле == 2 строка в примере. Не понимаю, почему указатель совместим с вектором, а указатель-на-указатель не совместим с указатель-на-вектор? Из этого следует сделать вывод, что n-мерный массив - это n-мерный массив, а не вектор (n-1)-мерных массивов!? Косвенно это подтверждается тем, что sizeof от матрицы пропорционален размеру матрицы, т.е. указателей на строки не создаётся.
0
|
||||||||||||||||
| 13.08.2011, 23:24 | |
|
Ответы с готовыми решениями:
13
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?
|
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
||||||
| 13.08.2011, 23:52 | ||||||
0
|
||||||
|
|
||||||
| 14.08.2011, 00:01 | ||||||
|
двумерный массив в памяти выглядит так:
То есть реально элементы лежат последовательно, и положение элемента a[2][4] рассчитывается как адрес_начала + 2*5 + 4. Не надо его путать с массивом указателей на int, который записывается как int * array[3]; или int ** array; (обе записи равносильны).
0
|
||||||
|
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
|
||
| 14.08.2011, 00:17 [ТС] | ||
|
"Везде" написано: "Двухмерный массив — это массив одномерных массивов."
0
|
||
|
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
|
||||||
| 14.08.2011, 00:46 [ТС] | ||||||
|
Двумерный массив - это не массив массивов. Многомерная таблица реализуется за счет пересчета индексов, а не за счет последовательного доступа по схеме слой-строка-элемент.
type ** эквивалентен type [][] или type *[], но компилятор считает их разными типами и не позволяет прямо присваивать. Вобщем, тред можно закрыть, задача частично решается приведением типов
0
|
||||||
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
|||||||
| 14.08.2011, 01:06 | |||||||
|
То, что Вы пытаетесь сделать могло бы выглядеть так:
1
|
|||||||
|
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
|
||||||
| 14.08.2011, 01:44 [ТС] | ||||||
|
Спасибо, вот так только надо
Жить стало веселей :dance3:
0
|
||||||
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
|||||||||||
| 14.08.2011, 01:57 | |||||||||||
|
Тогда уж
Да и вообще, индексы на x86 вычисляются довольно эффективно, а современные компиляторы зачастую хитрее "оптимизаторов". Так что обязательно надо сравнивать, в том числе и с доступом через a[i][j]
1
|
|||||||||||
|
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
|
|
| 14.08.2011, 02:15 [ТС] | |
|
Да, спасибо, я постепенно прихожу к пониманию первого варианта.
Второй вариант не подходит, т.к. работает только для двумерного массива, а я хочу что б выглядело как массив массивов. Собственно, самый быстрый проход по любому массиву (но не массиву массивов) будет если поставить указатель на первый элемент и итерировать до конца циклом без вложения.
0
|
|
|
|
||
| 14.08.2011, 11:35 | ||
|
1
|
||
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||
| 14.08.2011, 11:53 | ||
|
1
|
||
|
Заблокирован
|
||
| 14.08.2011, 19:41 | ||
|
Итак, вы имеете массив a[ 3 ][ 5 ] и хотите его элементы вывести на пкечать. Фактически, вы имеете массив массивов, то есть a[ 0 ] указывает на массив из 5 элементов, a[ 1 ] указывает на следующимй массив из пяти элементов, а a[ 2 ] указывает на последний массив из пяти элементов. То есть значением a[ i ] является одномерный массив. Когда вы испеользуете имя массива в выражениях, то он преобразуется в казатель на свой пекрвый элемент. Для вашего массива он преобразуется в указатель int ( * )[ 5 ]. Поэтому в своем внешнем цикле вы должны написать for ( int ( *p )[ 5 ] = a; p < a + 3; ++p ) А что написать во внутреннем цикле? Во внутренний цикл вы передаете указатель на массив, то есть int ( *p )[ 5 ]. Тогда если разыменовать этот указатель, то есть использовать выражение *p, то вы получите одномерный массив. В свою очерель если использовать имя одномерного массива в выражении, то оно преобразуется в указатель на его первый элемент. Итак, мы имеем что выражение *p представляет собой массив вида int[ 5 ]. Если его использовать в выражениях, то он преобразуется в указатель вида int *. Следовательно внутренний цикл должен быть записан в виде for ( int *p1 = *p; p1 < *p + 5; ++p1 ) Как говорятфранцузу, вуаля! ![]() Добавлено через 2 часа 37 минут Хотел бы себя поправить, то есть заменить слово "указывать" на "представляет собой", когда я говорил об a[i] то есть a[0] представляет собой массив размерностью 5, a[1] представляет собой массив размерности 5 и т.д.
2
|
||
| 14.08.2011, 19:41 | |
|
Помогаю со студенческими работами здесь
14
Что такое массив строк? Что такое хэндлер файла? Что такое файловый указатель? Массив фиксированного размера может быть динамическим? Что такое "динамический массив"? Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2.
Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники".
В. . .
|
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии.
. . .
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут.
https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc
Первый документ красиво выглядит, но без схемы.
Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
|
|
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере".
Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
|
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти".
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
В качестве источника данных. . .
|
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер
Написал заготовку:
dotnet new console --aot -o UrlHandler
var items = args. Split(":");
var tag = items;
var id = items;
var executable = args;. . .
|
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3.
Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
|