Работа с аргументами функции

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

Добрый день!

Имеется код:

byte getByteFromLong(unsigned long var, byte n) {
  byte out;
  unsigned long mask;
  mask=long(0xFF)<<(8*(n-1));
  var=var&mask;
  var=var>>(8*(n-1));
  out=var;
  return out;
}

Вызывается функция с аргументами-значениями: никаких указателей - только значения.

Это функция, выделяющая байт номер "n" из значения "var". Я вижу не лучший стиль программирования в том, что изменяется аргумент функции.

Профессионалы, подскажите пожалуйста, существует ли возможность измения в памяти Arduino переменной tmp, при вызовах getByteFromLong(tmp, 3) или компилятор защитит меня от этого нехорошего эффекта?

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

Защитит

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

Проще

byte ByteFromLong(unsigned long value, byte bytenum)
{
	union tmpunion
	{
		unsigned long longvalue;
		byte	 bytes[4];

	} tmplong;

	tmplong.longvalue = value;
	return tmplong.bytes[bytenum & 0x3];
}

проверка 

	for (byte i = 0; i < 4; i++) Serial.println(ByteFromLong(0xDEADBEEF, i), HEX);

 

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

DetSimen

byte     bytes[4];

Но сам код, конечно, намного более прямой, чем в исходном сообщении.

Я не силен в Си, но попытался бы сделать что-то вроде:

return ((tmpunion)longvalue).bytes[bytenum & 0x3];

 

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

andriano, спасибо, что поправил.