2017-02-19 28 views
4

Я немного обернулся для точного синтаксиса для этого. Я один массив определен как таковой:C Массив const unsigned char [] []

const unsigned char ARR[SIZE][SIZE] = {...} 

, и я хочу, чтобы иметь его в массив, так что я могу сделать что-то к эффекту

ARR2[0] = ARR 

Я попытался const unsigned char ARR2[][SIZE][SIZE] = {ARR} и const unsigned char* ARR2[SIZE][SIZE] = {ARR}, но ни из тех, кто работал. Может ли кто-нибудь указать правильный синтаксис для наличия постоянного массива постоянных двухмерных массивов беззнаковых символов?

+0

Непонятно, чего вы пытаетесь достичь: можете ли вы опубликовать код, в котором вы пытаетесь использовать «ARR» и этот «ARR2»? – chqrlie

+0

Вы хотите сказать, что вам нужен массив '[SIZE] [SIZE]' массивов или массив указателей на '[SIZE] [SIZE]' arrays? – Dolda2000

+0

Другими словами, вы намерены для 'ARR2 [0]' указывать на 'ARR', или же быть массивом, инициализированным содержимым' ARR'? – Dolda2000

ответ

2

Ваш комментарий к ответу haccks', это звучит, как вы хотите:

const unsigned char ARR[SIZE][SIZE] = {...}; 
const unsigned char (*ARR2[])[SIZE][SIZE] = {&ARR}; 

Если вы хотите ARR2 себя быть const, это было бы так:

const unsigned char (* const ARR2[])[SIZE][SIZE] = {&ARR}; 

Он должен возможно, также следует отметить, что вы не можете использовать эту мерзость для доступа ARR[x][y] как ARR2[0][x][y], но необходимо сделать (*ARR2[0])[x][y] (или, что эквивалентно, ARR2[0][0][x][y]).

Еще одно замечание, которое может быть примечательно, заключается в том, что вы не можете назначить ARR2ARR2[0] = ARR, но вам нужно явно сделать ARR2[0] = &ARR (по крайней мере, чтобы избежать предупреждений). Причина заключается в том, что ARR вырождается указатель на его первый элемент, то есть const unsigned char *, значение которого &ARR[0][0], тогда как ARR2[0] рассчитывает быть назначен const unsigned char (*)[SIZE][SIZE], который получен с &ARR. Хотя значение указателя в обоих случаях одинаково, типы не являются.

+0

Это технически правильно, но, похоже, опережает уровень мастерства OPs. По сути, это похоже на тест соответствия компилятора. – chqrlie

+0

Да, я понял, когда начал писать ARR2, что это будет немного беспорядок. Мне нужно было иметь массив массивов и потребовалось, чтобы каждый из массивов имел свои собственные файлы заголовков по причинам мобильности. Я понимаю, что здесь происходит; Наверное, у меня было ошибочное впечатление, что всякий раз, когда вы используете массив, он преобразуется в ссылку. – user2752635

+1

@ user2752635: Не уверен, но из вашего комментария к ответу Серхио также звучит так, будто вы можете ошибаться в том, что инициализация переменной такая же (или, по крайней мере, аналогичная) присваиванию переменной, что может быть довольно далеким от правда. – Dolda2000

-1

Попробуйте

const unsigned char (* ARR2)[SIZE] = ARR; 

Вы упомянули в своем комментарии, что вы хотите ARR2 быть массивом, который может содержать массив ARR, как это первый элемент, но, это невозможно. ARR - массив, и он преобразуется в указатель на его первый элемент, ожидающий, когда это операнд унарных & и sizeof.

+1

Я не пытаюсь иметь указатель на ARR. Я пытаюсь иметь массив, из которых первый индекс указывает на ARR. – user2752635

+1

@ user2752635; Обновлен ответ. – haccks

1

Кажется, что то, чего вы пытаетесь достичь, невозможно, так как левый операнд оператора присваивания может быть только арифметикой, структурой/объединением или типом указателя, но не массивом. См. Здесь для деталей: 6.5.16.1 Simple assignment.

Таким образом, единственный способ для вас - только memcpy() 'ing.

+0

Не понимаю. 'const unsigned char ARR [SIZE] [SIZE] = {...}' компилируется в порядке. Я могу использовать ARR в своем коде.Установка массива, равная чему-то, не является проблемой, проблема заключается в типизации. Это может быть особенностью gcc, но я могу определенно инициализировать массив таким образом. – user2752635

 Смежные вопросы

  • Нет связанных вопросов^_^