Присвоение значений переменным без использования массива

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

Добрый день!
Есть код возвращающий значение массиву переменных.
Можно ли  присваивать переменным значение в цикле, но без использования массива, если да, то пример.
 

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);

}

 

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

ua6em пишет:

Есть код возвращающий значение массиву переменных.
Можно ли  присваивать переменным значение в цикле, но без использования массива, если да, то пример.

Сами-то понимаете, что здесь написано? Я - нет :)

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Ну можно с прмощью указателей, например. А цель-то какая?

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

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

Сами-то понимаете, что здесь написано? Я - нет :)

И понимаю и работает, это декодер стандартного PPM сигнала, всего каналов 8, значения считываются в массив переменных для дальнейшей работы, то-есть value[0] - канал 1 и т.д.
Неудобочитаемое!
Хотелось бы чтобы переменные были читабельные ch1 - ch8 и заполнять их в цикле непосредственно.

Через if не хотелось бы

MaksVV
Offline
Зарегистрирован: 06.08.2015

а что мешает сделать ch[1]...ch[8] ?  

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

MaksVV пишет:

а что мешает сделать ch[1]...ch[8] ?  

Тогда массив надо размерности 9 и 0 ячейка не используется, подумал, тут гуру, может как-то через конструкцию вида ch.1 и т.д.  можно )))

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

Ну, блин, 100500 вариантнов. Например

1. Задефайните типа

#define ch1    value[0]

или

2. назначьте ссылки

int & ch1 = value[0];

И пользуйте хоть ch1, хоть value[0] - они будут синонимами.

MaksVV
Offline
Зарегистрирован: 06.08.2015

ЕвгенийП пишет:
назначьте ссылки

int & ch1 = value[0];

а value у ТС 32 битный. Это нормально, что ссылка int ? или опечатка

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

Нет, конечно. Тип должен быть таким же. Я просто не смотрел какой он там, а написал для примера.

MaksVV
Offline
Зарегистрирован: 06.08.2015

ок, понято!

sadman41
Offline
Зарегистрирован: 19.10.2016

Или

#define CHANNEL_01   0x00

....

channels[CHANNEL_01]=....

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

sadman41 пишет:

Или

#define CHANNEL_01   0x00

....

channels[CHANNEL_01]=....

 

Тогда уж лучше enum

sadman41
Offline
Зарегистрирован: 19.10.2016

Можно и енум и юнион. С планшетки набивать долго их.

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

В библиотеке используется unsigned long при том, что диапазон значений не может быть больше 2400-2500, хотелось назначать переменную типа unsigned int и ей присваивать значение в цикле, вообще не используя считывание в массив

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

надо Квона позвать, он класс сделает и оператор [ ] перегрузит!

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

Понятно, напрямую значит нельзя, всё через костыли

sadman41
Offline
Зарегистрирован: 19.10.2016

Лично я уже третий раз читаю пост и не понимаю what the hell: "хотелось назначать переменную типа unsigned int и ей присваивать значение в цикле, вообще не используя считывание в массив".

 

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

sadman41 пишет:

Лично я уже третий раз читаю пост и не понимаю 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);
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Ch_1 = value[0] - это костыль что ли? Или на ассемблерах волшебным образом переносится всё из регистра в регистр и еще мнемонически понятно?

Или нужно вот это: 

Ch_1 = ppm.latestValidChannelValue(1, 0);
Ch_2 = ppm.latestValidChannelValue(2, 0);
Ch_3 = ppm.rawChannelValue(3);
...

 

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

sadman41 пишет:

Ch_1 = value[0] - это костыль что ли? Или на ассемблерах волшебным образом переносится всё из регистра в регистр и еще мнемонически понятно?

Или нужно вот это: 

Ch_1 = ppm.latestValidChannelValue(1, 0);
Ch_2 = ppm.latestValidChannelValue(2, 0);
Ch_3 = ppm.rawChannelValue(3);
...

А то, метку поставил и загружай по метке, а что Ch_1 и тд регистровые переменные? Если так, откуда мне это должно быть известно?

Да, хочу грузить в цикле напрямую с преобразованием типов, видимо я сильно много хочу

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em, можете объяснить, зачем в Вашем коде строка 35?

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП вам написал же...

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
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

ua6em, можете объяснить, зачем в Вашем коде строка 35?

Преобразование типа  long в int (беззнаковые)
Функция возвращает 32 битное значение, а для дальнейшей работы нам надо 16 битное беззнаковое, волшебства (без использования массива) видимо не получится, разбрасываться по 20 байт памяти как-то не комильфо )))

sadman41
Offline
Зарегистрирован: 19.10.2016

Если не сложно, то поясните, что такое "метку поставил и загружай по метке". Я не специалист в этих ваших ассемблерах, однако чувствую, что дело пахнет набором ячеек памяти, расположенными последовательно с запомненным в отдельной переменной началом этой области. Только так, на мой взляд, можно относительно дёшево перегружать данные циклом. 

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

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

и чем это отличается от массива? :)

Короче, ТС хочется что-то неясное и он капризничает...

 

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

sadman41 пишет:

Если не сложно, то поясните, что такое "метку поставил и загружай по метке". Я не специалист в этих ваших ассемблерах, однако чувствую, что дело пахнет набором ячеек памяти, расположенными последовательно с запомненным в отдельной переменной началом этой области. Только так, на мой взляд, можно относительно дёшево перегружать данные циклом. 

необязательно последовательно но в данном случае желательно, по адресу метки и загружайте данные, адрес вычисляет компилятор и подставляет  к примеру mov 0x1f0, ax - прямая адресация памяти, всё вычисляет компилятор, когда его не было и программировали в кодах, адреса просто запоминали )))

Ваш пример скомпилировался, а вот попытка переделать его не удалась )
Функция чтения PPM должна вызываться как можно чаще, сама посылка занимает 20 миллисекунд, то-есть каждые 20 миллисекунд данные обновляются, то-есть с такой периодичностью их и надо обрабатывать и направлять в блок обработки сервомеханизмов...
Вывод в сериал, это на стадии написания и отладки, далее всё это уберётся никаких сериалов

b707
Offline
Зарегистрирован: 26.05.2017

массив то чем не угодил?

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

b707 пишет:

sadman41 пишет:

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

и чем это отличается от массива? :)

Короче, ТС хочется что-то неясное и он капризничает...

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

почему автор библиотеки использовал лонг ума не приложу, нет там таких значений для обработки

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

необязательно последовательно но в данном случае желательно, по адресу метки и загружайте данные, адрес вычисляет компилятор и подставляет

вы сами-то не понимаете, что то что вы описываете - ровно такой же "костыль", как и

int & CH_1 = channels[1];

а машинном коде это и выглядять, небось, будет одинакок

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

sadman41 пишет:

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

и чем это отличается от массива? :)

Так я вот и пытаюсь понять - у меня мозг отказывает, ТС не может сформулировать своё желание или волшебный ассемблер творит чудеса, разбрасывая последовательно выгружаемые данные по произвольным адресам "без костылей (TM)"

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

sadman41 пишет:
вот и пытаюсь понять - у меня мозг отказывает
А я ещё вчера капитулировал :(

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

b707 пишет:

ua6em пишет:

необязательно последовательно но в данном случае желательно, по адресу метки и загружайте данные, адрес вычисляет компилятор и подставляет

вы сами-то не понимаете, что то что вы описываете - ровно такой же "костыль", как и

int & CH_1 = channels[1];

а машинном коде это и выглядять, небось, будет одинакок

ну так я и спрашивал, можно ли без костылей )))
Меня больше интересует не сломает ли конструкция вида

  channels[channel - 1] = ppm.latestValidChannelValue(channel, 0);
 

данные в массиве инициализируемом как uint_16...
А, то, что компилятор многа лишних букв связанных с адресным указанием ячейки массива интерпретирует правильно и память не расходует - проверил и, это хорошо

sadman41
Offline
Зарегистрирован: 19.10.2016

ua6em пишет:

необязательно последовательно но в данном случае желательно, по адресу метки и загружайте данные, адрес вычисляет компилятор и подставляет  к примеру mov 0x1f0, ax - прямая адресация памяти, всё вычисляет компилятор, когда его не было и программировали в кодах, адреса просто запоминали )))

Чем это отличается от Ch_1 = ppm.latestValidChannelValue(1, 0); ?

ua6em пишет:

Ваш пример скомпилировался, а вот попытка переделать его не удалась )

Вы меня, конечно извините, но я сочуствую выпускникам вузов, которых Вы собеседуете. В приведенном примере никакого rocket science нет и даже интергалы с физикой седьмого класса отсутствуют.  

sadman41
Offline
Зарегистрирован: 19.10.2016

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

sadman41 пишет:
вот и пытаюсь понять - у меня мозг отказывает
А я ещё вчера капитулировал :(

У меня чисто научный интерес по изучению людей, которые на ассемблерах без ошибок с первого раза по 3.6кб пишут.

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

sadman41 пишет:

У меня чисто научный интерес по изучению людей, которые на ассемблерах без ошибок с первого раза по 3.6кб пишут.

А, так Вы фольклорист! Понятно.

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

sadman41 пишет:

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

sadman41 пишет:
вот и пытаюсь понять - у меня мозг отказывает
А я ещё вчера капитулировал :(

У меня чисто научный интерес по изучению людей, которые на ассемблерах без ошибок с первого раза по 3.6кб пишут.

Вы забыли добавить - в молодости )))
Во времена службы на спор любую схему из журнала радио (70-76 годов) по памяти рисовал с обозначением значения элементов )))
Как молоды мы были...
Ну или справочник, открываете любую страницу, я вам называю значения всех параметров выбранного Вами транзистора )))
Так что запомнить 3.6 кб машинного кода это не так сложно, Горный  справочник телефонов на 10 тыс. номеров за вечер запоминает, а ему уже далеко не 30

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Это как в анекдоте: В молодости я телефоный справочник помнил, а сейчас не могу вспомнить где находится туалет в моей однокомнатной квартире.  Тема поднималась вами из-за того что вам сложно запомнить заполнение переменными, но раньше вы коды на память знали. Может вам витамины попить надо?

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

qwone пишет:

Тема поднималась вами из-за того что вам сложно запомнить заполнение переменными...

мне не сложно...повторюсь, хочется делать это красиво, как сделал Евгений Петрович в своих этюдах про потоки...сударь, Вы опять о "неправильный мёд и неправильные пчёлы"  )))
Приезжайте, настоящим айраном угощу, он из "зёрен Аллаха дарованных" делается

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну не зачем гнаться за Евгением Петровичем. Это глупо и бесполезно. У него регулярная практика. И при этом сегодня красивым стало это, а вчера носили это. Рассматривай-те эти этюды, как веянье моды и ничего больше.

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

qwone пишет:

Ну не зачем гнаться за Евгением Петровичем. Это глупо и бесполезно. У него регулярная практика. И при этом сегодня красивым стало это, а вчера носили это. Рассматривай-те эти этюды, как веянье моды и ничего больше.

Вы даже представить себе не можете сколько утилит было мной написано с использованием потоков )))
А Вы говорите веяние, веяние, да весь Linux сплошные потоки... WDRAKULA не даст соврать

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ua6em пишет:

Меня больше интересует не сломает ли конструкция вида

  channels[channel - 1] = ppm.latestValidChannelValue(channel, 0);
 

данные в массиве инициализируемом как uint_16...

Я тоже включюсь, как энтомолог-любитель. ;)

Ты вот о чём сейчас спросил? Медленно и без украшательств поясни, что ты хочешь узнать в этом вопросе?

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

wdrakula пишет:

ua6em пишет:

Меня больше интересует не сломает ли конструкция вида

  channels[channel - 1] = ppm.latestValidChannelValue(channel, 0);
 

данные в массиве инициализируемом как 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) + " ");
    }
   }

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Что за жесть? А приведение типов уже запретил Клопоуций? Оно тут неявное, но можно и прописать для наглядности:

channels[channel - 1] = (unsigned int) ppm.latestValidChannelValue(channel, 0);

Правда, сейчас этот кастинг как-то иначе модно (правильно) записывать...

strarbit
Offline
Зарегистрирован: 12.06.2016
#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]); 
	}
wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ua6em пишет:

Функция возвращает значение типа unsigned long я эти значения засовываю в массив unsigned int, не произойдёт ли замена значений в других (соседних) элементах массива, как делал я раньше и всё работало правильно:
Присваивал значение временной переменной и уже значение этой временной переменной присваивал глобальной

Значит я правильно понял сразу, жаль, что не смог в это поверить! ;))) Я как-то лучше о тебе думал.

1. Собственно ответ: нет, не произойдет.

2. Эмоция: а ты не ах...ел?!!! Подобного вопроса, даже от самых убогих новичков, еще ни разу не было!

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

sadman41 пишет:

Что за жесть? А приведение типов уже запретил Клопоуций? Оно тут неявное, но можно и прописать для наглядности:

channels[channel - 1] = (unsigned int) ppm.latestValidChannelValue(channel, 0);

Правда, сейчас этот кастинг как-то иначе модно (правильно) записывать...

спросить уже нельзя )))

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

wdrakula пишет:

ua6em пишет:

Функция возвращает значение типа unsigned long я эти значения засовываю в массив unsigned int, не произойдёт ли замена значений в других (соседних) элементах массива, как делал я раньше и всё работало правильно:
Присваивал значение временной переменной и уже значение этой временной переменной присваивал глобальной

Значит я правильно понял сразу, жаль, что не смог в это поверить! ;))) Я как-то лучше о тебе думал.

1. Собственно ответ: нет, не произойдет.

2. Эмоция: а ты не ах...ел?!!! Подобного вопроса, даже от самых убогих новичков, еще ни разу не было!

не )))
я поищу кусок кода, где неявное приведение типа не работало и я не понимал ЧТО ПРОИСХОДИТ...
Там правда был float приводимый к int

ЗЫ ты становишься агрессивным, пора хвосты откидывать )))

sadman41
Offline
Зарегистрирован: 19.10.2016

Это не будет правильно работать в случае *ptrInt = &valFloat - когда на данные, что лежат по адресу четырехбайтного float начинаешь смотреть "через очки" двухбайтного int. Чтобы представить что-то другое, чего компилятор не прокастовал - мне придется у DetSemen отнять полстакана...

sadman41
Offline
Зарегистрирован: 19.10.2016

wdrakula пишет:

2. Эмоция: а ты не ах...ел?!!! Подобного вопроса, даже от самых убогих новичков, еще ни разу не было!

Просто они не знали, что надо спрашивать ;) Многие знания, как грицца, ведут к запою...

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

sadman41 пишет:

А приведение типов уже запретил Клопоуций?

Покинувший нас был Клапауций, это герой Станислава Лема, Кибериада. Там были Трурль и Клапауций. Если, каким-то чудом, еще не читал, то это классика, читать просто обязательно!

sadman41
Offline
Зарегистрирован: 19.10.2016

wdrakula пишет:

sadman41 пишет:

А приведение типов уже запретил Клопоуций?

Покинувший нас был Клапауций, это герой Станислава Лема, Кибериада. Там были Трурль и Клапауций. Если, каки-то чудом, еще не читал, то это классика, читать просто обязательно!

Это сарказм. Про семь приключений я читал. Просто товарищ так любил всех говнякать и подкусывать... ;))