Передача значения в функцию!
Передача значения в функцию!
Доброго времени суток! Как правильно в С передать (написать) значение функции, если это значение по определённому условию должно быть предварительно увеличенна или уменьшинна. К примеру
int port_set(int a)
{
;
}
int main()
.....
port_set(2*a);//если писать так, то значение не увеличивается, но и не выдаёт ошибок
//или ещё пример
port_set(a/2);//если писать так, то значение не уменьшается, но и не выдаёт ошибок
Заранее спасибо!
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: Передача значения в функцию!
Должно работать.
А каким компилятором пользуетесь? И для какой платформы?
Если при компиляции делается листинг на асме, то можете его посмотреть.
А каким компилятором пользуетесь? И для какой платформы?
Если при компиляции делается листинг на асме, то можете его посмотреть.
Re: Передача значения в функцию!
Попробуйте объявить переменную как volatile.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: Передача значения в функцию!
лучше вот так сделайте: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;
}
Не умеешь - не берись, но не взявшись не научишься...
Re: Передача значения в функцию!
Пользуюсь WinAVR + AVRStudio. Пробовал на железе!
К примеру - в программе есть функция задержки int White(int x)
Если мне нужно увеличить задержку в 5 раз, пишу White(5*x);
но на практике не работает.
А пишу так (к сожалению)
......
White(x);
White(x);
White(x);
White(x);
White(x);
........
Так работает, но это ненормально. !
К примеру - в программе есть функция задержки int White(int x)
Если мне нужно увеличить задержку в 5 раз, пишу White(5*x);
но на практике не работает.
А пишу так (к сожалению)
......
White(x);
White(x);
White(x);
White(x);
White(x);
........
Так работает, но это ненормально. !
- Реклама
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Передача значения в функцию!
... и где же тут условие?king-live писал(а):.... если это значение по определённому условию должно быть предварительно увеличенна или уменьшинна. К примеру
int port_set(int a)
{
;
}
int main()
.. если имеется в виду значение a , то оно и не должно измениться ... напишитеking-live писал(а):port_set(2*a);//если писать так, то значение не увеличивается, но и не выдаёт ошибок
//или ещё пример
port_set(a/2);//если писать так, то значение не уменьшается, но и не выдаёт ошибок
Код: Выделить всё
a*=2;
//или
a/=2;Re: Передача значения в функцию!
Попробую таким способом, но вопрос в другом, может памяти МК не хватить на дополнительную процедуру. Иногда приходится отваёвывать каждый 0,1% во Флешке МК.лучше вот так сделайте:
int port_set(int a)
{
++a;
return a;
}
main()
int k;
k=0;
...
...
b=port_set(k);
return 0;
}
Re: Передача значения в функцию!
Вы имели ввиду следующее:a*=2;
//или
a/=2;
......
if (.....) a=a*5;
port_set(a);
.....
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Передача значения в функцию!
... я имел ввиду, что в функцию передается локальная копия и если хотите изменить значение a, то передавать параметр нужно по ссылке, а не по значению.......king-live писал(а):Вы имели ввиду следующее: .....
Re: Передача значения в функцию!
Понял! Спасибо! Ну а если такой пример
int White(unsigned int x)
{
x=ADCH;
while(x--)
{
_delay_ms(1);
}
}
int main()
{
...
White(x);
...
}
При таком построении функции White(x); наверное бессмысленно передавать по ссылке переменную x. Так как внутри функции, х изменит своё значение, которая будет зависить от значения ADCH.
int White(unsigned int x)
{
x=ADCH;
while(x--)
{
_delay_ms(1);
}
}
int main()
{
...
White(x);
...
}
При таком построении функции White(x); наверное бессмысленно передавать по ссылке переменную x. Так как внутри функции, х изменит своё значение, которая будет зависить от значения ADCH.
Re: Передача значения в функцию!
Кстати, понял свою ошибку. В функции White(x), какоебы значение я не давалбы переменному "х" , что White(2*x), что White(x/2) - (возможно это работает) , х всёравно принялбы значение ADCH. Поэтому значение х не увеличивалось и не уменьшалось, а зависило от ADCH. Спасибо за помощь!
-
Ar-Gen-Tum
- Прорезались зубы
- Сообщения: 221
- Зарегистрирован: Вс янв 23, 2011 21:51:12
Re: Передача значения в функцию!
Ради интереса опробовал пример.
Вот листинг участка кода:
Компилятор (с оптимизатором) еще на этапе трансляции в асм все вычислил,
а переменную создавать даже и не стал.
Но в функцию было передано 5*5=25.
[add]
В этом примере переменная a объявлена, как volatile .
Результат другой, но правильный. В функцию передается значение 5*5=25 .
Переменная типа int , размещена в паре регистров r14:r15 .
[/add]
Вот листинг участка кода:
Код: Выделить всё
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>
Последний раз редактировалось Ar-Gen-Tum Вс апр 17, 2011 21:15:03, всего редактировалось 1 раз.
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Передача значения в функцию!
Код: Выделить всё
void out(int b)
{
DispOut32(0x0115F24A, b);
}
void main(void)
{
int a=10;
out(a+10);
}
I am DX168B and this is my favourite forum on internet!
Re: Передача значения в функцию!
Не в обиду сказано, но возникает вопрос. Сейчас так принято, не доучив русский язык приниматься за языки программирования? Раньше все шло постепенно. Если следовать этому принципу, то и языку программирования уготована та же судьба - остаться недоученным...king-live писал(а):Кстати, понял свою ошибку. В функции White(x), какоебы значение я не давалбы переменному "х" , что White(2*x), что White(x/2) - (возможно это работает) , х всёравно принялбы значение ADCH. Поэтому значение х не увеличивалось и не уменьшалось, а зависило от ADCH. Спасибо за помощь!
Ну и совсем OFF, по английски White - это белый. "Ожидание" - wait. Впрочем, какая кому разница, особенно мне, настырному?
С уважением,
Виктор.
Виктор.
- coredumped
- Опытный кот
- Сообщения: 838
- Зарегистрирован: Вт апр 12, 2011 18:38:19
- Откуда: с Земли


