Инициализация массива, возникает ошибка

Жак Фреско
Offline
Зарегистрирован: 20.01.2022

Надо инициализировать массив framesArray

const byte frame0[][3] = {
  {7, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {255, 255, 255},
  {0, 0, 255},
  {255, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {255, 0, 255},  
};

const byte frame1[][3] = {
  {7, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {255, 255, 255},
  {0, 0, 255},
  {255, 0, 33},
  {0, 0, 0},
  {0, 58, 0},
  {0, 0, 0},
  {255, 0, 255},  
};

const byte framesArray[2][10][3] = {frame0, frame1};

Компилятор говорит:

picture:27:51: error: array must be initialized with a brace-enclosed initializer
 const byte framesArray[2][10][3] = {frame0, frame1};
                                                   ^
picture:27:51: error: array must be initialized with a brace-enclosed initializer
exit status 1
array must be initialized with a brace-enclosed initializer
 
подскажите чё к чему

 

vrd
Offline
Зарегистрирован: 20.01.2022

У вас двухмерный массив, а опрашиваете вы трёхмерный. Вот компилятор и матерится.

Жак Фреско
Offline
Зарегистрирован: 20.01.2022

Извините, не могли бы вы это кодом написать, я плохо шарю)))

Жак Фреско
Offline
Зарегистрирован: 20.01.2022

vrd пишет:

У вас двухмерный массив, а опрашиваете вы трёхмерный. Вот компилятор и матерится.

Не могли бы вы это кодом написать

Green
Offline
Зарегистрирован: 01.10.2015

- зюйд, зюйд ост
- что ты там зюзюкаешь! Пальцем покажи.
Уже было.

vrd
Offline
Зарегистрирован: 20.01.2022

framesArray НЕ прописан как трёхмерный массив. Что хотите получить на выходе?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Если сильно хочется, то обрами ещё одними фигурными скобками, как компилятор говорит ))

vrd
Offline
Зарегистрирован: 20.01.2022

frame0 - 10 на 3

frame1 - 10 на 3

framesArray - 10 на 3 на 2

Вот и весь ответ.

Жак Фреско
Offline
Зарегистрирован: 20.01.2022

BOOM пишет:

Если сильно хочется, то обрами ещё одними фигурными скобками, как компилятор говорит ))

Решил эту хрень трёхмерным массивом, но всё-же спасибо

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Мужики, Вас куда-то не туда понесло. Вы предлагаете ТС как сделать по-другому, а не как исправить то, что есть.

Жак Фреско,

Вы тут человек новый, потому я пока без мата (а мат так и просится, потому, что Вы не первый и не десятый, и не сотый, кому приходится это говорить). Постарайтесь запомнить то, что я скажу.

Всегда выкладывайте ПОЛНЫЙ код, который можно скомпилировать, запустить и увидеть Вашу проблему. Если я дописываю код за Вас, то вполне возможно, я спрячу Вашу проблему, да и в лом дописывать. Всегда ПОЛНЫЙ код!

Всегда внятно пишите, что Вы хотите сделать. Не думайте, что кто-то знает, что у Вас в голове! Например, в данном случае, чего Вы хотите? Чтобы третий массив просто ссылался на первые два, или чтобы данные продублировались? Я предположил первое, но если ошибся - то, всё, что я для Вас делал - псу под хвост, а я время терял. Всегда пишите, чего Вы хотите добиться!

Не будете это выполнять - вероятность помощи сильно уменьшится, а вероятность срача - увеличится.

Теперь по Вашей проблеме, если Вам нужно объявить массив двумерных массивов, то это делается не так. Вместно строки №27 нужно писать

const byte (* framesArray[])[3] = {frame0, frame1};

Вот Вам полный пример с печатью всех элементов массива для контроля. Запустите. Как видите, всё печатается нормально.

template <typename T> inline Print & operator << (Print & s, T  n) { s.print(n); return s; }

const byte frame0[][3] = {
  {7, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {255, 255, 255},
  {0, 0, 255},
  {255, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {255, 0, 255}
};

const byte frame1[][3] = {
  {7, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {255, 255, 255},
  {0, 0, 255},
  {255, 0, 33},
  {0, 0, 0},
  {0, 58, 0},
  {0, 0, 0},
  {255, 0, 255}  
};

const byte (* framesArray[])[3] = {frame0, frame1};

void setup(void) {
	Serial.begin(115200);
	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 10; j++) {
			for (int k = 0; k < 3; k++) {
				Serial << "framesArray[" << i << "][" << j << "][" << k << 
					"] = " << framesArray[i][j][k] << "\r\n";
			}	
		}
	}
}

void loop (void) {}

Если не понимаете первую строку - не берите в голову, она здесь только для компактной записи печати, а то я задолбался бы писать "Serial.print" (про это есть отдельная тема на форуме)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

вот и тест получился - "можно писать коротко, как привыкли все программисты на С:"

1 SerialPrintf("Voltage=%dV; Current=%dma\n, u,a);

НЕ!!! Ни разу не программист оказывается )))

 

Жак Фреско
Offline
Зарегистрирован: 20.01.2022

ЕвгенийП пишет:

Мужики, Вас куда-то не туда понесло. Вы предлагаете ТС как сделать по-другому, а не как исправить то, что есть.

Жак Фреско,

Вы тут человек новый, потому я пока без мата (а мат так и просится, потому, что Вы не первый и не десятый, и не сотый, кому приходится это говорить). Постарайтесь запомнить то, что я скажу.

Всегда выкладывайте ПОЛНЫЙ код, который можно скомпилировать, запустить и увидеть Вашу проблему. Если я дописываю код за Вас, то вполне возможно, я спрячу Вашу проблему, да и в лом дописывать. Всегда ПОЛНЫЙ код!

Всегда внятно пишите, что Вы хотите сделать. Не думайте, что кто-то знает, что у Вас в голове! Например, в данном случае, чего Вы хотите? Чтобы третий массив просто ссылался на первые два, или чтобы данные продублировались? Я предположил первое, но если ошибся - то, всё, что я для Вас делал - псу под хвост, а я время терял. Всегда пишите, чего Вы хотите добиться!

Не будете это выполнять - вероятность помощи сильно уменьшится, а вероятность срача - увеличится.

Теперь по Вашей проблеме, если Вам нужно объявить массив двумерных массивов, то это делается не так. Вместно строки №27 нужно писать

const byte (* framesArray[])[3] = {frame0, frame1};

Вот Вам полный пример с печатью всех элементов массива для контроля. Запустите. Как видите, всё печатается нормально.

template <typename T> inline Print & operator << (Print & s, T  n) { s.print(n); return s; }

const byte frame0[][3] = {
  {7, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {255, 255, 255},
  {0, 0, 255},
  {255, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {255, 0, 255}
};

const byte frame1[][3] = {
  {7, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {255, 255, 255},
  {0, 0, 255},
  {255, 0, 33},
  {0, 0, 0},
  {0, 58, 0},
  {0, 0, 0},
  {255, 0, 255}  
};

const byte (* framesArray[])[3] = {frame0, frame1};

void setup(void) {
	Serial.begin(115200);
	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 10; j++) {
			for (int k = 0; k < 3; k++) {
				Serial << "framesArray[" << i << "][" << j << "][" << k << 
					"] = " << framesArray[i][j][k] << "\r\n";
			}	
		}
	}
}

void loop (void) {}

Если не понимаете первую строку - не берите в голову, она здесь только для компактной записи печати, а то я задолбался бы писать "Serial.print" (про это есть отдельная тема на форуме)

БЛАГОДАРСТВУЮ!!!!

Жак Фреско
Offline
Зарегистрирован: 20.01.2022

ЕвгенийП пишет:

Мужики, Вас куда-то не туда понесло. Вы предлагаете ТС как сделать по-другому, а не как исправить то, что есть.

Жак Фреско,

Вы тут человек новый, потому я пока без мата (а мат так и просится, потому, что Вы не первый и не десятый, и не сотый, кому приходится это говорить). Постарайтесь запомнить то, что я скажу.

Всегда выкладывайте ПОЛНЫЙ код, который можно скомпилировать, запустить и увидеть Вашу проблему. Если я дописываю код за Вас, то вполне возможно, я спрячу Вашу проблему, да и в лом дописывать. Всегда ПОЛНЫЙ код!

Всегда внятно пишите, что Вы хотите сделать. Не думайте, что кто-то знает, что у Вас в голове! Например, в данном случае, чего Вы хотите? Чтобы третий массив просто ссылался на первые два, или чтобы данные продублировались? Я предположил первое, но если ошибся - то, всё, что я для Вас делал - псу под хвост, а я время терял. Всегда пишите, чего Вы хотите добиться!

Не будете это выполнять - вероятность помощи сильно уменьшится, а вероятность срача - увеличится.

Теперь по Вашей проблеме, если Вам нужно объявить массив двумерных массивов, то это делается не так. Вместно строки №27 нужно писать

const byte (* framesArray[])[3] = {frame0, frame1};

Вот Вам полный пример с печатью всех элементов массива для контроля. Запустите. Как видите, всё печатается нормально.

template <typename T> inline Print & operator << (Print & s, T  n) { s.print(n); return s; }

const byte frame0[][3] = {
  {7, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {255, 255, 255},
  {0, 0, 255},
  {255, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {255, 0, 255}
};

const byte frame1[][3] = {
  {7, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {255, 255, 255},
  {0, 0, 255},
  {255, 0, 33},
  {0, 0, 0},
  {0, 58, 0},
  {0, 0, 0},
  {255, 0, 255}  
};

const byte (* framesArray[])[3] = {frame0, frame1};

void setup(void) {
	Serial.begin(115200);
	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 10; j++) {
			for (int k = 0; k < 3; k++) {
				Serial << "framesArray[" << i << "][" << j << "][" << k << 
					"] = " << framesArray[i][j][k] << "\r\n";
			}	
		}
	}
}

void loop (void) {}

Если не понимаете первую строку - не берите в голову, она здесь только для компактной записи печати, а то я задолбался бы писать "Serial.print" (про это есть отдельная тема на форуме)

 

Евгений, я так понял вы тут местная легенда! Ладно, не сердитесь но ваш скетч выводит какую-то ерунду

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ну, теперь ты будешь месной феерической лечендой.  Сравни скорости порта в скетче и у монитора

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

вот что значит, кто рано встаёт )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Жак Фреско пишет:
ваш скетч выводит какую-то ерунду
Это не скетч, это Вы выводите. Вы скорость вывода в строке №32 видели? А у Вас какая установлена? (Если что, она в правом нижнем углу монитора порта). Поставьте одинаковые и будет много счастья.