изменение аргумента функции

semaawp
semaawp аватар
Offline
Зарегистрирован: 29.05.2017

можно ли изменять значение аргумента функции внутри функции?

void Func(unsigned char arg1)
{
    arg1 = 0;
}

изменится ли значение переменной, которую я передам в качестве аргумента или нет?

VasiliyV
Offline
Зарегистрирован: 09.07.2018

Можно. Изменится. Может вкратце поясните какая задача?

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

Можно положить новое значение по адресу, который вы передадите в качестве аргумента. См. "передача аргумента по ссылке". 

В вашем случае значение изменится на время жизни функции, а точнее - будет заведена еще одна локальная переменная, в которую откопируется значение передаваемой. См. "передача аргумента по значению".

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

semaawp пишет:

изменится ли значение переменной, которую я передам в качестве аргумента или нет?

При таком способе передачи аршумента - нет.

Подробнее - см ответ sadman41

semaawp
semaawp аватар
Offline
Зарегистрирован: 29.05.2017

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

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

semaawp пишет:

можно ли изменять значение аргумента функции внутри функции?

void Func(unsigned char arg1)
{
    arg1 = 0;
}

изменится ли значение переменной, которую я передам в качестве аргумента или нет?

Можно. Варианта два: передача по ссылке, или по указателю. В том и другом случае - параметры должны быть неконстантными, т.е. разрешать изменение:

// по ссылке
void Func(unsigned char& arg1)
{
    arg1 = 0;
}

// по указателю
void Func(unsigned char* arg1)
{
    *arg1 = 0;
}

Вызов этого добра:

unsigned char val = 123;

// по ссылке
Func(val);

// по указателю
Func(&val);

 

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

Ну можно и так #190

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

qwone пишет:

Ну можно и так #190

А это каким боком к вопросу ТС?

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

ЕвгенийП пишет:
А это каким боком к вопросу ТС?
А вы уверены, что вопрос изначально верен. Скрорее ТС не только не знает в чем он плавает, так и правильно задать вопрос не умеет.

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

И из это следует, что ему надо валить ссылки, инкапсуляцию, полиморфизм и вообще всё, о чём когда-то слышали?

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

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

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

Ваш пас про возвращение ссылок, на мой взгляд, никакого отношения к его вопросу не имеет. Ну, это на мой взгляд, возможно, я ощшибаюсь. Потому я и попросил Вас объяснить Вашу мысль. Вы вместо того, чтобы объяснить, начинаете намекать на посылание. У Вас что-то не в порядке? Вы чем-то сильно озабочены?

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

Конечно озабочен. Вы все время требуете что бы я Вам вместо ТС в его его теме разжевывал свою мысль. Если вам надо что то разжевать , то откройте свою тему и ждите, что бы Вам что-то кто-то расжевывал, если зубы у вас все выпали.

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

Я правильно понял, что вопросы Вам лучше не задавать - ничего кроме хамства в ответ не будет? Так? Если так, то обязуюсь юольше этого не делать (в смысле вопросы не задавать, от удовольствия иногда прокомментировать Ваши класссы я кончено же не отказываюсь - но без вопросов :)

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

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

Ваши класссы кончено

Согласен, Евгений - там кончено всё :)

semaawp
semaawp аватар
Offline
Зарегистрирован: 29.05.2017
unsigned char Soft_UART_Transfer(unsigned char data)
{
    //return 0 if transfer data register empty and shift register empty
    //return 1 if transfer data register ready to receive new data and shift register full
    //return 2 if transfer complete
	
	static unsigned char send_bit = 255;
	static unsigned char state = 0;
	static unsigned char shift_register = 0;
    switch(send_bit)
	{
	    case 0: SOFT_TX_PIN = 0; send_bit = 255; break;
	    case 1: SOFT_TX_PIN = 1; send_bit = 255; break;
	}
    if(data)
    {
        shift_register = data;
        data = 0;    // вот это место
    } 
    if(shift_register)
    {
        if(state == 0)
        {
            shift_register = data_reg;
            send_bit = 0;
            state++;
			return 1;
        }
        else if((state >= 1) && (state <= DATA_BITS))
        {
            send_bit = shift_register & 0x01;
            shift_register = shift_register >> 1;
            state++;
			return 1;
        }	
		else if(state > DATA_BITS && state == DATA_BITS + STOP_BITS)
		{
		    send_bit = 1;
            state = 0;
			return 2;
		}	
		else if(state > DATA_BITS && state != DATA_BITS + STOP_BITS)
		{
		    send_bit = 1;
            state++;
			return 1;
		}
    }
	else 
	{
	    return 0;
	}
}

эта функция будет крутиться в прерывании таймера

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

semaawp, попробую я вам дать свое объянение, а потом другие дадут свое. Вы хотите организовать механизм передачи байта с помощью таймера. Но тогда у Вас должно бы не одна функция а две. - 1- это передать байт. а 2-я это обработчик таймера с передачей, которая и решает что надо передавать бит если есть что-то передавать или нет. Ей не надо данные. Для ее работы нужны внешние переменные . флаг передавать или нет, байт данных и сколько уже передано.