Присвоение значений переменным без использования массива
- Войдите на сайт для отправки комментариев
Пт, 01/02/2019 - 19:00
Добрый день!
Есть код возвращающий значение массиву переменных.
Можно ли присваивать переменным значение в цикле, но без использования массива, если да, то пример.
include <PPMReader.h>
#include <InterruptHandler.h>
int interruptPin = 3; // пин приемника
int channelAmount = 8; // число каналов (max 8)
PPMReader ppm(interruptPin, channelAmount);
unsigned long value[8];
void setup()
{
Serial.begin(115200);
}
void loop()
{
for (int channel = 1; channel <= channelAmount; ++channel) // ВЫВОД ВСЕХ КАНАЛОВ В SERIAL
{
if(channel==3) {value[channel-1] = ppm.rawChannelValue(channel);}else{ // FS настроен на стик газа
value[channel-1] = ppm.latestValidChannelValue(channel, 0);}
Serial.println("ch" + String(channel) + " = " + String(value[channel-1]) + " ");
}
delay(500);
}
Есть код возвращающий значение массиву переменных.
Можно ли присваивать переменным значение в цикле, но без использования массива, если да, то пример.
Сами-то понимаете, что здесь написано? Я - нет :)
Ну можно с прмощью указателей, например. А цель-то какая?
Сами-то понимаете, что здесь написано? Я - нет :)
И понимаю и работает, это декодер стандартного PPM сигнала, всего каналов 8, значения считываются в массив переменных для дальнейшей работы, то-есть value[0] - канал 1 и т.д.
Неудобочитаемое!
Хотелось бы чтобы переменные были читабельные ch1 - ch8 и заполнять их в цикле непосредственно.
Через if не хотелось бы
а что мешает сделать ch[1]...ch[8] ?
а что мешает сделать ch[1]...ch[8] ?
Тогда массив надо размерности 9 и 0 ячейка не используется, подумал, тут гуру, может как-то через конструкцию вида ch.1 и т.д. можно )))
Ну, блин, 100500 вариантнов. Например
1. Задефайните типа
#define ch1 value[0]
или
2. назначьте ссылки
int & ch1 = value[0];
И пользуйте хоть ch1, хоть value[0] - они будут синонимами.
int & ch1 = value[0];
а value у ТС 32 битный. Это нормально, что ссылка int ? или опечатка
Нет, конечно. Тип должен быть таким же. Я просто не смотрел какой он там, а написал для примера.
ок, понято!
Или
#define CHANNEL_01 0x00
....
channels[CHANNEL_01]=....
Или
#define CHANNEL_01 0x00
....
channels[CHANNEL_01]=....
Тогда уж лучше enum
Можно и енум и юнион. С планшетки набивать долго их.
В библиотеке используется unsigned long при том, что диапазон значений не может быть больше 2400-2500, хотелось назначать переменную типа unsigned int и ей присваивать значение в цикле, вообще не используя считывание в массив
надо Квона позвать, он класс сделает и оператор [ ] перегрузит!
Понятно, напрямую значит нельзя, всё через костыли
Лично я уже третий раз читаю пост и не понимаю what the hell: "хотелось назначать переменную типа unsigned int и ей присваивать значение в цикле, вообще не используя считывание в массив".
Лично я уже третий раз читаю пост и не понимаю what the hell: "хотелось назначать переменную типа unsigned int и ей присваивать значение в цикле, вообще не используя считывание в массив".
на выходе должно быть это, но без костылей:
#include <PPMReader.h> #include <InterruptHandler.h> int interruptPin = 3; // пин приемника int channelAmount = 8; // число каналов (max 8) PPMReader ppm(interruptPin, channelAmount); #define ch1 value[1] #define ch2 value[2] #define ch3 value[3] #define ch4 value[4] #define ch5 value[5] #define ch6 value[6] #define ch7 value[7] #define ch8 value[8] unsigned long value[9]; unsigned int Ch_1; unsigned int Ch_2; unsigned int Ch_3; unsigned int Ch_4; unsigned int Ch_5; unsigned int Ch_6; unsigned int Ch_7; unsigned int Ch_8; void setup(){Serial.begin(115200);} void read_ppm(){ for (int channel = 1; channel <= channelAmount; ++channel) // ВЫВОД ВСЕХ КАНАЛОВ В SERIAL { if(channel==3) {value[channel] = ppm.rawChannelValue(channel); }else{ // FS настроен на стик газа CH3 value[channel] = ppm.latestValidChannelValue(channel, 0);} Serial.println("ch" + String(channel) + " = " + String(value[channel-1]) + " "); } Ch_1=ch1; Ch_2=ch2; Ch_3=ch3; Ch_4=ch4; Ch_5=ch5; Ch_6=ch6; Ch_7=ch7; Ch_8=ch8; } void loop() { read_ppm(); delay(500); }Ch_1 = value[0] - это костыль что ли? Или на ассемблерах волшебным образом переносится всё из регистра в регистр и еще мнемонически понятно?
Или нужно вот это:
Ch_1 = ppm.latestValidChannelValue(1, 0);
Ch_2 = ppm.latestValidChannelValue(2, 0);
Ch_3 = ppm.rawChannelValue(3);
...
Ch_1 = value[0] - это костыль что ли? Или на ассемблерах волшебным образом переносится всё из регистра в регистр и еще мнемонически понятно?
Или нужно вот это:
Ch_1 = ppm.latestValidChannelValue(1, 0);
Ch_2 = ppm.latestValidChannelValue(2, 0);
Ch_3 = ppm.rawChannelValue(3);
...
А то, метку поставил и загружай по метке, а что Ch_1 и тд регистровые переменные? Если так, откуда мне это должно быть известно?
Да, хочу грузить в цикле напрямую с преобразованием типов, видимо я сильно много хочу
ua6em, можете объяснить, зачем в Вашем коде строка 35?
ЕвгенийП вам написал же...
void setup() { byte channelAmount = 9; unsigned int channels[channelAmount]; unsigned int & Ch_1 = channels[0]; unsigned int & Ch_2 = channels[1]; unsigned int & Ch_3 = channels[2]; unsigned int & Ch_4 = channels[3]; unsigned int & Ch_5 = channels[4]; unsigned int & Ch_6 = channels[5]; unsigned int & Ch_7 = channels[6]; unsigned int & Ch_8 = channels[7]; unsigned int & Ch_9 = channels[8]; Serial.begin(115200); for (byte channel = 1; channel <= channelAmount; ++channel) { channels[channel - 1] = channel + 73; // = ppm.latestValidChannelValue(channel, 0); Serial.print("Channel #"); Serial.print(channel); Serial.print(" => "); Serial.println(channels[channel - 1]); } Serial.println("-------------"); Serial.print("Channel #2 => "); Serial.println(Ch_2); } void loop() { }ua6em, можете объяснить, зачем в Вашем коде строка 35?
Преобразование типа long в int (беззнаковые)
Функция возвращает 32 битное значение, а для дальнейшей работы нам надо 16 битное беззнаковое, волшебства (без использования массива) видимо не получится, разбрасываться по 20 байт памяти как-то не комильфо )))
Если не сложно, то поясните, что такое "метку поставил и загружай по метке". Я не специалист в этих ваших ассемблерах, однако чувствую, что дело пахнет набором ячеек памяти, расположенными последовательно с запомненным в отдельной переменной началом этой области. Только так, на мой взляд, можно относительно дёшево перегружать данные циклом.
дело пахнет набором ячеек памяти, расположенными последовательно с запомненным в отдельной переменной началом этой области.
и чем это отличается от массива? :)
Короче, ТС хочется что-то неясное и он капризничает...
Если не сложно, то поясните, что такое "метку поставил и загружай по метке". Я не специалист в этих ваших ассемблерах, однако чувствую, что дело пахнет набором ячеек памяти, расположенными последовательно с запомненным в отдельной переменной началом этой области. Только так, на мой взляд, можно относительно дёшево перегружать данные циклом.
необязательно последовательно но в данном случае желательно, по адресу метки и загружайте данные, адрес вычисляет компилятор и подставляет к примеру mov 0x1f0, ax - прямая адресация памяти, всё вычисляет компилятор, когда его не было и программировали в кодах, адреса просто запоминали )))
Ваш пример скомпилировался, а вот попытка переделать его не удалась )
Функция чтения PPM должна вызываться как можно чаще, сама посылка занимает 20 миллисекунд, то-есть каждые 20 миллисекунд данные обновляются, то-есть с такой периодичностью их и надо обрабатывать и направлять в блок обработки сервомеханизмов...
Вывод в сериал, это на стадии написания и отладки, далее всё это уберётся никаких сериалов
массив то чем не угодил?
дело пахнет набором ячеек памяти, расположенными последовательно с запомненным в отдельной переменной началом этой области.
и чем это отличается от массива? :)
Короче, ТС хочется что-то неясное и он капризничает...
да не капризничаю я, хотелось красивости...весна жеж на пороге, вон как птички поют )))
а на деле, надо считывать лонг и присваивать инт (и то и другое беззнаковое)...
почему автор библиотеки использовал лонг ума не приложу, нет там таких значений для обработки
необязательно последовательно но в данном случае желательно, по адресу метки и загружайте данные, адрес вычисляет компилятор и подставляет
вы сами-то не понимаете, что то что вы описываете - ровно такой же "костыль", как и
а машинном коде это и выглядять, небось, будет одинакок
дело пахнет набором ячеек памяти, расположенными последовательно с запомненным в отдельной переменной началом этой области.
и чем это отличается от массива? :)
Так я вот и пытаюсь понять - у меня мозг отказывает, ТС не может сформулировать своё желание или волшебный ассемблер творит чудеса, разбрасывая последовательно выгружаемые данные по произвольным адресам "без костылей (TM)"
необязательно последовательно но в данном случае желательно, по адресу метки и загружайте данные, адрес вычисляет компилятор и подставляет
вы сами-то не понимаете, что то что вы описываете - ровно такой же "костыль", как и
а машинном коде это и выглядять, небось, будет одинакок
ну так я и спрашивал, можно ли без костылей )))
Меня больше интересует не сломает ли конструкция вида
данные в массиве инициализируемом как uint_16...
А, то, что компилятор многа лишних букв связанных с адресным указанием ячейки массива интерпретирует правильно и память не расходует - проверил и, это хорошо
необязательно последовательно но в данном случае желательно, по адресу метки и загружайте данные, адрес вычисляет компилятор и подставляет к примеру mov 0x1f0, ax - прямая адресация памяти, всё вычисляет компилятор, когда его не было и программировали в кодах, адреса просто запоминали )))
Чем это отличается от Ch_1 = ppm.latestValidChannelValue(1, 0); ?
Ваш пример скомпилировался, а вот попытка переделать его не удалась )
Вы меня, конечно извините, но я сочуствую выпускникам вузов, которых Вы собеседуете. В приведенном примере никакого rocket science нет и даже интергалы с физикой седьмого класса отсутствуют.
У меня чисто научный интерес по изучению людей, которые на ассемблерах без ошибок с первого раза по 3.6кб пишут.
У меня чисто научный интерес по изучению людей, которые на ассемблерах без ошибок с первого раза по 3.6кб пишут.
А, так Вы фольклорист! Понятно.
У меня чисто научный интерес по изучению людей, которые на ассемблерах без ошибок с первого раза по 3.6кб пишут.
Вы забыли добавить - в молодости )))
Во времена службы на спор любую схему из журнала радио (70-76 годов) по памяти рисовал с обозначением значения элементов )))
Как молоды мы были...
Ну или справочник, открываете любую страницу, я вам называю значения всех параметров выбранного Вами транзистора )))
Так что запомнить 3.6 кб машинного кода это не так сложно, Горный справочник телефонов на 10 тыс. номеров за вечер запоминает, а ему уже далеко не 30
Это как в анекдоте: В молодости я телефоный справочник помнил, а сейчас не могу вспомнить где находится туалет в моей однокомнатной квартире. Тема поднималась вами из-за того что вам сложно запомнить заполнение переменными, но раньше вы коды на память знали. Может вам витамины попить надо?
Тема поднималась вами из-за того что вам сложно запомнить заполнение переменными...
мне не сложно...повторюсь, хочется делать это красиво, как сделал Евгений Петрович в своих этюдах про потоки...сударь, Вы опять о "неправильный мёд и неправильные пчёлы" )))
Приезжайте, настоящим айраном угощу, он из "зёрен Аллаха дарованных" делается
Ну не зачем гнаться за Евгением Петровичем. Это глупо и бесполезно. У него регулярная практика. И при этом сегодня красивым стало это, а вчера носили это. Рассматривай-те эти этюды, как веянье моды и ничего больше.
Ну не зачем гнаться за Евгением Петровичем. Это глупо и бесполезно. У него регулярная практика. И при этом сегодня красивым стало это, а вчера носили это. Рассматривай-те эти этюды, как веянье моды и ничего больше.
Вы даже представить себе не можете сколько утилит было мной написано с использованием потоков )))
А Вы говорите веяние, веяние, да весь Linux сплошные потоки... WDRAKULA не даст соврать
Меня больше интересует не сломает ли конструкция вида
данные в массиве инициализируемом как uint_16...
Я тоже включюсь, как энтомолог-любитель. ;)
Ты вот о чём сейчас спросил? Медленно и без украшательств поясни, что ты хочешь узнать в этом вопросе?
Меня больше интересует не сломает ли конструкция вида
данные в массиве инициализируемом как uint_16...
Я тоже включюсь, как энтомолог-любитель. ;)
Ты вот о чём сейчас спросил? Медленно и без украшательств поясни, что ты хочешь узнать в этом вопросе?
Функция возвращает значение типа unsigned long я эти значения засовываю в массив unsigned int, не произойдёт ли замена значений в других (соседних) элементах массива, как делал я раньше и всё работало правильно:
Присваивал значение временной переменной и уже значение этой временной переменной присваивал глобальной
Может так надо?
void read_ppm(){ unsigned long temp; for (int channel = 1; channel <= channelAmount; ++channel) // ВЫВОД ВСЕХ КАНАЛОВ В SERIAL { if(channel==3) {temp = ppm.rawChannelValue(channel); value[channel] = temp; }else{ // FS настроен на стик газа CH3 temp = ppm.latestValidChannelValue(channel, 0); value[channel] = temp;} Serial.println("ch" + String(channel) + " = " + String(value[channel) + " "); } }Что за жесть? А приведение типов уже запретил Клопоуций? Оно тут неявное, но можно и прописать для наглядности:
channels[channel - 1] = (
unsignedint) ppm.latestValidChannelValue(channel, 0);Правда, сейчас этот кастинг как-то иначе модно (правильно) записывать...
#define SIZE 3 int *arrofptr[ SIZE ]; int a = 10, b = 20, c = 50; ... arrofptr[ 0 ] = &a; arrofptr[ 1 ] = &b; arrofptr[ 2 ] = &c; for( int i = 0; i < SIZE; i++ ) { printf("Address = %d\t Value = %d\n", arrofptr[i], *arrofptr[i]); }Функция возвращает значение типа unsigned long я эти значения засовываю в массив unsigned int, не произойдёт ли замена значений в других (соседних) элементах массива, как делал я раньше и всё работало правильно:
Присваивал значение временной переменной и уже значение этой временной переменной присваивал глобальной
Значит я правильно понял сразу, жаль, что не смог в это поверить! ;))) Я как-то лучше о тебе думал.
1. Собственно ответ: нет, не произойдет.
2. Эмоция: а ты не ах...ел?!!! Подобного вопроса, даже от самых убогих новичков, еще ни разу не было!
Что за жесть? А приведение типов уже запретил Клопоуций? Оно тут неявное, но можно и прописать для наглядности:
channels[channel - 1] = (
unsignedint) ppm.latestValidChannelValue(channel, 0);Правда, сейчас этот кастинг как-то иначе модно (правильно) записывать...
спросить уже нельзя )))
Функция возвращает значение типа unsigned long я эти значения засовываю в массив unsigned int, не произойдёт ли замена значений в других (соседних) элементах массива, как делал я раньше и всё работало правильно:
Присваивал значение временной переменной и уже значение этой временной переменной присваивал глобальной
Значит я правильно понял сразу, жаль, что не смог в это поверить! ;))) Я как-то лучше о тебе думал.
1. Собственно ответ: нет, не произойдет.
2. Эмоция: а ты не ах...ел?!!! Подобного вопроса, даже от самых убогих новичков, еще ни разу не было!
не )))
я поищу кусок кода, где неявное приведение типа не работало и я не понимал ЧТО ПРОИСХОДИТ...
Там правда был float приводимый к int
ЗЫ ты становишься агрессивным, пора хвосты откидывать )))
Это не будет правильно работать в случае *ptrInt = &valFloat - когда на данные, что лежат по адресу четырехбайтного float начинаешь смотреть "через очки" двухбайтного int. Чтобы представить что-то другое, чего компилятор не прокастовал - мне придется у DetSemen отнять полстакана...
2. Эмоция: а ты не ах...ел?!!! Подобного вопроса, даже от самых убогих новичков, еще ни разу не было!
Просто они не знали, что надо спрашивать ;) Многие знания, как грицца, ведут к запою...
А приведение типов уже запретил Клопоуций?
Покинувший нас был Клапауций, это герой Станислава Лема, Кибериада. Там были Трурль и Клапауций. Если, каким-то чудом, еще не читал, то это классика, читать просто обязательно!
А приведение типов уже запретил Клопоуций?
Покинувший нас был Клапауций, это герой Станислава Лема, Кибериада. Там были Трурль и Клапауций. Если, каки-то чудом, еще не читал, то это классика, читать просто обязательно!
Это сарказм. Про семь приключений я читал. Просто товарищ так любил всех говнякать и подкусывать... ;))