Официальный сайт компании Arduino по адресу arduino.cc
Присвоение значений переменным без использования массива
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пт, 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 и ей присваивать значение в цикле, вообще не используя считывание в массив".
на выходе должно быть это, но без костылей:
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?
ЕвгенийП вам написал же...
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, не произойдёт ли замена значений в других (соседних) элементах массива, как делал я раньше и всё работало правильно:
Присваивал значение временной переменной и уже значение этой временной переменной присваивал глобальной
Может так надо?
Что за жесть? А приведение типов уже запретил Клопоуций? Оно тут неявное, но можно и прописать для наглядности:
channels[channel - 1] = (
unsigned
int
) ppm.latestValidChannelValue(channel, 0);Правда, сейчас этот кастинг как-то иначе модно (правильно) записывать...
Функция возвращает значение типа unsigned long я эти значения засовываю в массив unsigned int, не произойдёт ли замена значений в других (соседних) элементах массива, как делал я раньше и всё работало правильно:
Присваивал значение временной переменной и уже значение этой временной переменной присваивал глобальной
Значит я правильно понял сразу, жаль, что не смог в это поверить! ;))) Я как-то лучше о тебе думал.
1. Собственно ответ: нет, не произойдет.
2. Эмоция: а ты не ах...ел?!!! Подобного вопроса, даже от самых убогих новичков, еще ни разу не было!
Что за жесть? А приведение типов уже запретил Клопоуций? Оно тут неявное, но можно и прописать для наглядности:
channels[channel - 1] = (
unsigned
int
) ppm.latestValidChannelValue(channel, 0);Правда, сейчас этот кастинг как-то иначе модно (правильно) записывать...
спросить уже нельзя )))
Функция возвращает значение типа unsigned long я эти значения засовываю в массив unsigned int, не произойдёт ли замена значений в других (соседних) элементах массива, как делал я раньше и всё работало правильно:
Присваивал значение временной переменной и уже значение этой временной переменной присваивал глобальной
Значит я правильно понял сразу, жаль, что не смог в это поверить! ;))) Я как-то лучше о тебе думал.
1. Собственно ответ: нет, не произойдет.
2. Эмоция: а ты не ах...ел?!!! Подобного вопроса, даже от самых убогих новичков, еще ни разу не было!
не )))
я поищу кусок кода, где неявное приведение типа не работало и я не понимал ЧТО ПРОИСХОДИТ...
Там правда был float приводимый к int
ЗЫ ты становишься агрессивным, пора хвосты откидывать )))
Это не будет правильно работать в случае *ptrInt = &valFloat - когда на данные, что лежат по адресу четырехбайтного float начинаешь смотреть "через очки" двухбайтного int. Чтобы представить что-то другое, чего компилятор не прокастовал - мне придется у DetSemen отнять полстакана...
2. Эмоция: а ты не ах...ел?!!! Подобного вопроса, даже от самых убогих новичков, еще ни разу не было!
Просто они не знали, что надо спрашивать ;) Многие знания, как грицца, ведут к запою...
А приведение типов уже запретил Клопоуций?
Покинувший нас был Клапауций, это герой Станислава Лема, Кибериада. Там были Трурль и Клапауций. Если, каким-то чудом, еще не читал, то это классика, читать просто обязательно!
А приведение типов уже запретил Клопоуций?
Покинувший нас был Клапауций, это герой Станислава Лема, Кибериада. Там были Трурль и Клапауций. Если, каки-то чудом, еще не читал, то это классика, читать просто обязательно!
Это сарказм. Про семь приключений я читал. Просто товарищ так любил всех говнякать и подкусывать... ;))