Проблема при работе с массивами

fwmakc
Offline
Зарегистрирован: 07.03.2016

Доброго времени суток!

Есть библиотека Adafruit_MotorShield, есть оригинальный код:



#define MICROSTEPS 8 // 8 or 16
...
if (MICROSTEPS == 8)
uint8_t microstepcurve[] = {0, 50, 98, 142, 180, 212, 236, 250, 255};
#elif (MICROSTEPS == 16)
uint8_t microstepcurve[] = {0, 25, 50, 74, 98, 120, 141, 162, 180, 197, 212, 225, 236, 244, 250, 253, 255}; 

Когда я меняю его, задавая вместо констант переменные, вылезает ошибка. Вот код:



void Adafruit_StepperMotor::setSteps(uint8_t newsteps) {
	switch (newsteps) {
	case 8:
		microsteps = 8;
		microstepcurve[] = {0, 50, 98, 142, 180, 212, 236, 250, 255};
		break;
	case 16:
		microsteps = 16;
		microstepcurve[] = {0, 25, 50, 74, 98, 120, 141, 162, 180, 197, 212, 225, 236, 244, 250, 253, 255};
		break;
	}
}

Вот ошибка:



error: expected primary-expression before ']' token

   microstepcurve[] = {0, 50, 98, 142, 180, 212, 236, 250, 255};

                  ^

Объясните мне пожалуйста, в чем дело?

 

diger67
Offline
Зарегистрирован: 25.07.2015

Наверное вы не указали количество элементов в массиве. Попробуйте явно указать

microstepcurve[8] = {0, 50, 98, 142, 180, 212, 236, 250, 255};

 

Logik
Offline
Зарегистрирован: 05.08.2014

Не путайте обявление и присвоение!

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Уже надо какую-то ссылку по основам С/С++ сразу тыкать на такие ответы, по ходу. Потому как самые основы - объявление переменных, присвоение переменным значения.

ТС: вы чего хотите добиться вот такой строчкой-то?

microstepcurve[] = {0, 50, 98, 142, 180, 212, 236, 250, 255};

Вы объявили инициализированный массив, который заполняется значениями на этапе компиляции:

uint8_t microstepcurve[] = {0, 25, 50, 74, 98, 120, 141, 162, 180, 197, 212, 225, 236, 244, 250, 253, 255};

Теперь вы можете обращаться с любому элементу массива по его индексу, и писать/читать значения, тоже по индексу, но, не так:

microstepcurve[] = {0, 50, 98, 142, 180, 212, 236, 250, 255};

А - вот так:

microstepcurve[0] = 0;
microstepcurve[1] = 50;
// и т.д.

 

diger67
Offline
Зарегистрирован: 25.07.2015

DIYMan пишет:

Уже надо какую-то ссылку по основам С/С++ сразу тыкать на такие ответы, по ходу. Потому как самые основы - объявление переменных, присвоение переменным значения.

ТС: вы чего хотите добиться вот такой строчкой-то?

microstepcurve[] = {0, 50, 98, 142, 180, 212, 236, 250, 255};

Вы объявили инициализированный массив, который заполняется значениями на этапе компиляции:

uint8_t microstepcurve[] = {0, 25, 50, 74, 98, 120, 141, 162, 180, 197, 212, 225, 236, 244, 250, 253, 255};

Теперь вы можете обращаться с любому элементу массива по его индексу, и писать/читать значения, тоже по индексу, но, не так:

microstepcurve[] = {0, 50, 98, 142, 180, 212, 236, 250, 255};

А - вот так:

microstepcurve[0] = 0;
microstepcurve[1] = 50;
// и т.д.

 

Основы это важно, основы это хорошо. Только вот вы обсолютно не поняли суть вопроса человека. А она в следующем. Ему хочется что бы выбор массива происходил не по дифинишу, а по значению присвоенному переменной, определяющей какой массив будет использоваться.  Не смог объяснить что он конкретно хочет, а хочет он видимо убрать из либы условие компиляции по значению MICROSTEPS, заменив его swich. В общем изменить либу.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

diger67 пишет:

Основы это важно, основы это хорошо. Только вот вы обсолютно не поняли суть вопроса человека. А она в следующем. Ему хочется что бы выбор массива происходил не по дифинишу, а по значению присвоенному переменной, определяющей какой массив будет использоваться.  Не смог объяснить что он конкретно хочет, а хочет он видимо убрать из либы условие компиляции по значению MICROSTEPS, заменив его swich. В общем изменить либу.

Да неважно что он хочет, важно, что он делает это, не понимая основ. Что и как ему нужно сделать - вопрос десятый, а первый вопрос в том, что должно быть понимание, как можно, а как нельзя делать.

Всё, надо запастись дежурной ссылкой на Кернигана и Ричи ;)

 

fwmakc
Offline
Зарегистрирован: 07.03.2016

diger67, да, все верно - все именно так.

DIYMan, на самом деле просто не внял мануалам - исправил, хоть и громоздко, но работает и уже дальше буду допиливать.

В общем, всем спасибо большое! С проблемой разобрался.