Форум программистов, компьютерный форум CyberForum.ru

Многомерный массив и массив массивов - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.85
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 09:24     Многомерный массив и массив массивов #1
На паскале это синонимы. Например, всё валидно:
Pascal
1
2
3
4
5
6
7
var a:array[1..n]of array[1..n]of array[1..n] of real; {объявлен одномерный массив одномерных массивов одномерных массивов реалов}
begin
        a[1,2][3]:=2; {А обращаемся к нему как к двумерному массиву одномерных массивов реалов}
        a[1][2,3]:=2; {А здесь как к одномерном массиву двумерных массивов реалов}
        a[3,4]:=a[5,5]; {И здесь как к двумерному массиву одномерных массивов реалов}
        a[1]:=a[8]; {И здесь как к одномерном массиву двумерных массивов реалов}
        a[1,2,3]:=2; {А здесь как к трёхмерному реалов}
,
Pascal
1
2
3
4
5
6
var a:array[1..n]of array[1..n,1..n] of real; {Объявлен одномерный массив двумерных массивов реалов}
begin
        a[1,2][3]:=2; {А обращаемся к нему как к двумерному массиву одномерных массивов реалов}
        a[1]:=a[8]; {И здесь как к одномерном массиву двумерных массивов реалов}
        a[1,2,3]:=2; {А здесь как к трёхмерному реалов}
        a[6][8][4]:=2; {А здесь как к одномерному массиву одномерных массивов одномерных массивов реалов}
Pascal
1
2
3
4
5
6
var a:array[1..n]of array[1..n]of array[1..n] of real; {Объявлен одномерный массив двумерных массивов реалов}
begin
        a[1,2][3]:=2; {А обращаемся к нему как к двумерному массиву одномерных массивов реалов}
        a[1]:=a[8]; {И здесь как к одномерном массиву двумерных массивов реалов}
        a[1,2,3]:=2; {А здесь как к трёхмерному реалов}
        a[6][8][4]:=2; {А здесь как к одномерному массиву одномерных массивов одномерных массивов реалов}
,
Pascal
1
2
3
4
5
var a:array[1..n,1..n]of array[1..n] of real; {объявлен двумерный массив одномерных массивов реалов}
begin
        a[1][2,3]:=2; {А обращаемся к нему как к одномерном массиву двумерных массивов реалов}
        a[1,2,3]:=2; {А здесь как к трёхмерному реалов}
        a[6][8][4]:=2; {А здесь как к одномерному массиву одномерных массивов одномерных массивов реалов}
,
Pascal
1
2
3
4
5
6
7
var a:array[1..n,1..n,1..n]of real; {объявлен трёхмерный массив реалов}
begin
        a[1,2][3]:=2; {А обращаемся к нему как к двумерному массиву одномерных массивов реалов}
        a[1][2,3]:=2; {А здесь как к одномерном массиву двумерных массивов реалов}
        a[3,4]:=a[5,5]; {И здесь как к двумерному массиву одномерных массивов реалов}
        a[1]:=a[8]; {И здесь как к одномерном массиву двумерных массивов реалов}
        a[6][8][4]:=2; {А здесь как к одномерному массиву одномерных массивов одномерных массивов реалов}
. А на c/c++ нет самого понятия многомерного массива. А теперь вопрос: почему? Почему на паскале это синонимы и почему на c/c++ существует только одно из этих двух понятий?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2012, 09:24     Многомерный массив и массив массивов
Посмотрите здесь:

Многомерный массив, Си!!! C++
многомерный массив C++
C++ Многомерный массив
C++ многомерный массив
Многомерный массив C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.12.2012, 15:51     Многомерный массив и массив массивов #41
Цитата Сообщение от taras atavin Посмотреть сообщение
Оба языка прямо запрещают такой синтаксис.
Да ладно вам!
C++
1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
int main() {
    int a[3];
    a[0,2] = 8;
    cout << a[2] << endl; // 8
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
20.12.2012, 15:56
  #42

Не по теме:

palva, смысл поддержки кода с подобными кульбитами стремится к нулю)

taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 15:56  [ТС]     Многомерный массив и массив массивов #43
C:\tsserver\Projects\cpp\codeblocks\test\test.cpp||In function 'int main()':|
C:\tsserver\Projects\cpp\codeblocks\test\test.cpp|5|warning: left-hand operand of comma has no effect|
||=== Build finished: 0 errors, 1 warnings ===|
Нужны комментарии?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.12.2012, 16:03     Многомерный массив и массив массивов #44
taras atavin, Warning - не ошибка. И к стандарту никакого отношения не имеет.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.12.2012, 16:03     Многомерный массив и массив массивов #45
Цитата Сообщение от gray_fox Посмотреть сообщение
смысл поддержки кода с подобными кульбитами стремится к нулю
Я, например, часто использую запятую, например
C++
1
for(i=0, j=0, k=0; i<n; i++) {...}
Для всяких счетчиков такая инициализация очень удобна.

Цитата Сообщение от taras atavin Посмотреть сообщение
Нужны комментарии?
А зачем мне комментарии. Такой синтаксис не запрещен. Просто оптимизатор видит его избыточность. Если бы вместо чисел стояли обращения к функциям, то оптимизатор бы промолчал.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
20.12.2012, 16:08     Многомерный массив и массив массивов #46
Цитата Сообщение от palva Посмотреть сообщение
Я, например, часто использую запятую
Я про запятые внутри [].
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 16:08  [ТС]     Многомерный массив и массив массивов #47
Смотри скриншот:
Миниатюры
Многомерный массив и массив массивов  
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 16:11  [ТС]     Многомерный массив и массив массивов #48
Цитата Сообщение от palva Посмотреть сообщение
for(i=0, j=0, k=0; i<n; i++) {...}
Кстати да. В c++ для запятой два отдельных случая: разделение параметров и разделение операторов в отдельной позиции заголовка цикла for. В отличие от паскаля.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.12.2012, 16:13     Многомерный массив и массив массивов #49
Например, я хочу подсчитать количество обращений к массиву в моей программе. Каждое обращение к массиву я сопровождаю наращиванием счетчика, а потом печатаю счетчик.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
int s=0;
void p() {s++;}
int main() {
    int a[3];
    a[p(),2] = 8;
    cout << a[p(),2] << endl; // 8
    cout << s << endl; // 2
    return 0;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.12.2012, 16:15     Многомерный массив и массив массивов #50
palva, Ну это знаете-ли изврат. Кто будет такой код сопровождать - постарается найти автора.
taras atavin, и что? это всего-лишь предупреждение.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
20.12.2012, 16:16     Многомерный массив и массив массивов #51
palva, жуть.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.12.2012, 16:39     Многомерный массив и массив массивов #52
Ну а как иначе написать такую вдруг возникшую задачу? Я беру готовый текст и в редакторе делаю замену 'a[' на 'a[p(),' (конечно, если у меня нет массивов с именами кончающимися на a), а потом делаю обратную замену, если это рабочий код.

Добавлено через 8 минут
Обращение a[i++] ведь никого не смущает? А кого смутит наращивание еще двух счетчиков: a[j++,k++,i++]
Например, я сканирую в одном цикле сразу три массива одинаковой длины.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 16:41  [ТС]     Многомерный массив и массив массивов #53
Цитата Сообщение от palva Посмотреть сообщение
А кого смутит наращивание еще двух счетчиков: a[j++,k++,i++]
Я уже дал скриншот, на котором видно, что запятая в квадратных скобках запрещена. Вопрос в мотивации: почему это запрещено. На паскале запятая имеет два назначения и может разделять индексы, на плюсах не может, но имеет два назначения, из них одно совпадает. Зачем на ровном месте конструкция
C++
1
a[TVerctor (i,j,k)]
? Меня не напрягает ни векторный, ни строчный индекс.
vxg
Модератор
 Аватар для vxg
2663 / 1674 / 157
Регистрация: 13.01.2012
Сообщений: 6,251
20.12.2012, 16:45     Многомерный массив и массив массивов #54
предлагаю вынести тему в религию
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 16:49  [ТС]     Многомерный массив и массив массивов #55
Но зачем? На паскале мотивация автора очевидна: так как там индексы могут быть только целого, символьного, перечислимого, или ограниченного типа, то нет возможности прикрутить к массиву векторный индекс, а массив массивов удобен далеко не всегда. А на плюсах? Ладно, пусть индекс может быть любого типа, включая TImage. Ну и что? А зачем запрещены несколько индексов?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
20.12.2012, 16:57     Многомерный массив и массив массивов #56
Цитата Сообщение от palva Посмотреть сообщение
А кого смутит наращивание еще двух счетчиков: a[j++,k++,i++]
Меня например. Мне вообще не понятно, зачем так писать. Хотя о чём я, давайте сразу
C++
1
 std::cout << (std::cout << a[p(), 2[p(), a] = 8, 2] << std::endl, s) << std::endl;  // 8 2
ведь подобное никого не смущает.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.12.2012, 17:09     Многомерный массив и массив массивов #57
Меня смущает это: 2[ по-моему это даже не скомпилируется.
Но я не об этом. Использование запятой внутри квадратных скобок разрешено, как разрешено в любом выражении си. Но операция запятая очень редко применяется и многих смущает, а некоторые даже не в курсе, что она существует.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
20.12.2012, 17:14     Многомерный массив и массив массивов #58
Цитата Сообщение от palva Посмотреть сообщение
2[ по-моему это даже не скомпилируется.
Да ладно вам!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
 
int s = 0;
 
void p() {
   s++;
}
 
 
int main() {
    int a[3];
    std::cout << (std::cout << a[p(), 2[p(), a] = 8, 2] << std::endl, s) << std::endl;
}
http://liveworkspace.org/code/377A2p
Я конечно передёргиваю, но то, что это разрешено, ещё не значит, что это стоит использовать. Код всё таки для людей писать.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.12.2012, 17:32     Многомерный массив и массив массивов #59
А что означает: 2[p(), a] не понимаю. Это обращение к массиву, который начинается с адреса 2 что ли?

Добавлено через 1 минуту
Цитата Сообщение от gray_fox Посмотреть сообщение
Код всё таки для людей писать.
Бывают такие люди, для который и подобного кода не жалко.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2012, 17:32     Многомерный массив и массив массивов
Еще ссылки по теме:

C++ Многомерный массив
C++ многомерный массив
Многомерный массив. С++ C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 17:32  [ТС]     Многомерный массив и массив массивов #60
Цитата Сообщение от palva Посмотреть сообщение
Использование запятой внутри квадратных скобок разрешено, как разрешено в любом выражении си.
Запрещено, что хорошо видно на скриншоте.
Yandex
Объявления
20.12.2012, 17:32     Многомерный массив и массив массивов
Ответ Создать тему
Опции темы

Текущее время: 23:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru