Передача значения в функцию!

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Передача значения в функцию!

Сообщение king-live »

Доброго времени суток! Как правильно в С передать (написать) значение функции, если это значение по определённому условию должно быть предварительно увеличенна или уменьшинна. К примеру

int port_set(int a)
{
;
}
int main()
.....
port_set(2*a);//если писать так, то значение не увеличивается, но и не выдаёт ошибок

//или ещё пример

port_set(a/2);//если писать так, то значение не уменьшается, но и не выдаёт ошибок

Заранее спасибо!
Реклама
Ar-Gen-Tum
Прорезались зубы
Сообщения: 221
Зарегистрирован: Вс янв 23, 2011 21:51:12

Re: Передача значения в функцию!

Сообщение Ar-Gen-Tum »

Должно работать.
А каким компилятором пользуетесь? И для какой платформы?
Если при компиляции делается листинг на асме, то можете его посмотреть.
Реклама
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Передача значения в функцию!

Сообщение YS »

Попробуйте объявить переменную как volatile.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Re: Передача значения в функцию!

Сообщение Arlleex »

king-live писал(а):Доброго времени суток! Как правильно в С передать (написать) значение функции, если это значение по определённому условию должно быть предварительно увеличенна или уменьшинна. К примеру

int port_set(int a)
{
;
}
int main()
.....
port_set(2*a);//если писать так, то значение не увеличивается, но и не выдаёт ошибок

//или ещё пример

port_set(a/2);//если писать так, то значение не уменьшается, но и не выдаёт ошибок

Заранее спасибо!
лучше вот так сделайте:
int port_set(int a)
{
++a;
return a;
}
main()
int k;
k=0;
...
...
b=port_set(k);
return 0;
}
Не умеешь - не берись, но не взявшись не научишься...
Реклама
Эиком - электронные компоненты и радиодетали
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Передача значения в функцию!

Сообщение king-live »

Пользуюсь WinAVR + AVRStudio. Пробовал на железе!
К примеру - в программе есть функция задержки int White(int x)
Если мне нужно увеличить задержку в 5 раз, пишу White(5*x);
но на практике не работает.

А пишу так (к сожалению)
......

White(x);
White(x);
White(x);
White(x);
White(x);
........

Так работает, но это ненормально. ! :dont_know:
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Передача значения в функцию!

Сообщение ChipKiller »

king-live писал(а):.... если это значение по определённому условию должно быть предварительно увеличенна или уменьшинна. К примеру

int port_set(int a)
{
;
}
int main()
... и где же тут условие?
king-live писал(а):port_set(2*a);//если писать так, то значение не увеличивается, но и не выдаёт ошибок

//или ещё пример

port_set(a/2);//если писать так, то значение не уменьшается, но и не выдаёт ошибок
.. если имеется в виду значение a , то оно и не должно измениться ... напишите

Код: Выделить всё

 a*=2;
//или 
a/=2;
Реклама
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Передача значения в функцию!

Сообщение king-live »

лучше вот так сделайте:
int port_set(int a)
{
++a;
return a;
}
main()
int k;
k=0;
...
...
b=port_set(k);
return 0;
}
Попробую таким способом, но вопрос в другом, может памяти МК не хватить на дополнительную процедуру. Иногда приходится отваёвывать каждый 0,1% во Флешке МК.
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Передача значения в функцию!

Сообщение king-live »

a*=2;
//или
a/=2;
Вы имели ввиду следующее:

......

if (.....) a=a*5;
port_set(a);
.....
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Передача значения в функцию!

Сообщение ChipKiller »

king-live писал(а):Вы имели ввиду следующее: .....
... я имел ввиду, что в функцию передается локальная копия и если хотите изменить значение a, то передавать параметр нужно по ссылке, а не по значению.......
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Передача значения в функцию!

Сообщение king-live »

Понял! Спасибо! Ну а если такой пример

int White(unsigned int x)
{
x=ADCH;
while(x--)
{
_delay_ms(1);
}
}

int main()
{
...
White(x);
...
}

При таком построении функции White(x); наверное бессмысленно передавать по ссылке переменную x. Так как внутри функции, х изменит своё значение, которая будет зависить от значения ADCH.
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Передача значения в функцию!

Сообщение king-live »

Кстати, понял свою ошибку. В функции White(x), какоебы значение я не давалбы переменному "х" , что White(2*x), что White(x/2) - (возможно это работает) , х всёравно принялбы значение ADCH. Поэтому значение х не увеличивалось и не уменьшалось, а зависило от ADCH. Спасибо за помощь!
Ar-Gen-Tum
Прорезались зубы
Сообщения: 221
Зарегистрирован: Вс янв 23, 2011 21:51:12

Re: Передача значения в функцию!

Сообщение Ar-Gen-Tum »

Ради интереса опробовал пример. :)
Вот листинг участка кода:

Код: Выделить всё

		int a = 5;
		Delay_1_8(5*a);					// 
 574:	89 e1       	ldi	r24, 0x19	; 25
 576:	36 de       	rcall	.-916    	; 0x1e4 <Delay_1_8>
 578:	fb cf       	rjmp	.-10     	; 0x570 <main+0x18>
Компилятор (с оптимизатором) еще на этапе трансляции в асм все вычислил,
а переменную создавать даже и не стал.
Но в функцию было передано 5*5=25.

[add]
В этом примере переменная a объявлена, как volatile .
Результат другой, но правильный. В функцию передается значение 5*5=25 .
Переменная типа int , размещена в паре регистров r14:r15 .

Код: Выделить всё

		volatile int a=5;
 57e:	0f 2e       	mov	r0, r31
 580:	f5 e0       	ldi	r31, 0x05	; 5
 582:	ef 2e       	mov	r14, r31
 584:	ff 24       	eor	r15, r15
 586:	f0 2d       	mov	r31, r0
...
		volatile int a=5;
 58c:	fa 82       	std	Y+2, r15	; 0x02
 58e:	e9 82       	std	Y+1, r14	; 0x01
		Delay_1_8(5*a);					// 
 590:	29 81       	ldd	r18, Y+1	; 0x01
 592:	3a 81       	ldd	r19, Y+2	; 0x02
 594:	c9 01       	movw	r24, r18
 596:	88 0f       	add	r24, r24
 598:	99 1f       	adc	r25, r25
 59a:	88 0f       	add	r24, r24
 59c:	99 1f       	adc	r25, r25
 59e:	82 0f       	add	r24, r18
 5a0:	21 de       	rcall	.-958    	; 0x1e4 <Delay_1_8>
 5a2:	f2 cf       	rjmp	.-28     	; 0x588 <main+0x30>

[/add]
Последний раз редактировалось Ar-Gen-Tum Вс апр 17, 2011 21:15:03, всего редактировалось 1 раз.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Передача значения в функцию!

Сообщение DX168B »

Код: Выделить всё

void out(int b)
{
	DispOut32(0x0115F24A, b);
}

void main(void)
{
	int a=10;
	out(a+10);
}
Такой пример работает, но это не AVR, а x86.
I am DX168B and this is my favourite forum on internet!
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: Передача значения в функцию!

Сообщение ut1wpr »

king-live писал(а):Кстати, понял свою ошибку. В функции White(x), какоебы значение я не давалбы переменному "х" , что White(2*x), что White(x/2) - (возможно это работает) , х всёравно принялбы значение ADCH. Поэтому значение х не увеличивалось и не уменьшалось, а зависило от ADCH. Спасибо за помощь!
Не в обиду сказано, но возникает вопрос. Сейчас так принято, не доучив русский язык приниматься за языки программирования? Раньше все шло постепенно. Если следовать этому принципу, то и языку программирования уготована та же судьба - остаться недоученным...
Ну и совсем OFF, по английски White - это белый. "Ожидание" - wait. Впрочем, какая кому разница, особенно мне, настырному? :)
С уважением,
Виктор.
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Re: Передача значения в функцию!

Сообщение coredumped »

+1
Все будет только лучше, в крайнем случае - хуже.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»