Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
24.11.2006, 08:06
|
|
Гражданин KAZUS.RU
Регистрация: 27.07.2006
Сообщений: 659
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
СИ
Сколь корректным является такая запись при передаче параметров?Мне никогда подобное не встречалось а сделать по другому не получилось.
main()
{
char a,s,d;
func(a,s,d);
}
void func(char &a,char &s,char &d)
{
}
|
|
|
|
24.11.2006, 14:22
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,956
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Re: СИ
Сообщение от EVGENIY1962
|
Сколь корректным является такая запись при передаче параметров?Мне никогда подобное не встречалось а сделать по другому не получилось.
main()
{
char a,s,d;
func(a,s,d);
}
void func(char &a,char &s,char &d)
{
}
|
Непонятно. Если вам нужно просто передать параметр, объявите функцию как
void func(char a,char s,char d)
Если нужно передать ссылки, то объявите как
void func(char *a,char *s,char *d)
а вызывайте как
func(&a,&s,&d)
|
|
|
|
24.11.2006, 14:44
|
|
Прописка
Регистрация: 14.02.2006
Сообщений: 114
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Это корректно! В данном случае ты передаёш аргументы по ссылке.
пример:
void fn(int &arg)
{
arg=10;
}
void parent(void)
{
int n=0;
fn(n)
}
Теперь значение n равно 10.
|
|
|
|
25.11.2006, 12:41
|
|
Частый гость
Регистрация: 14.07.2006
Сообщений: 16
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
|
Сообщение от Snixers
|
Это корректно! В данном случае ты передаёш аргументы по ссылке.
пример:
...
|
Такая запись коректна только для Си++ , а не для Си. Правдо не знаю может для автора это одна хрень ,но если он имел ввиду именно Си то не коректно.
|
|
|
|
25.11.2006, 14:09
|
|
Прописка
Регистрация: 14.02.2006
Сообщений: 114
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Наверное я неправ прошу прощения это действительно С++.Я с него начинал и по инерции считаю Си таким же но без создания обьектов(но со структурами).Открыл справочник Кернигана "Язык программирования Си" стр152 глава5.2 Указатели и аргументы функций там всё написано
|
|
|
|
25.11.2006, 15:54
|
|
Частый гость
Регистрация: 14.07.2006
Сообщений: 16
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
|
Имел ввиду автора топика +)
Честно сказать не знаю что там на той транички в этой книги но для Си ... коректна запись только вида:
int c = 66;
foo( &c );
foo( int *a){
*a = 44;
}
В Си++ уже можно было как раз как ты и описал делать передачу ссылки на параметр таким от обазом заваулируя для удобства передачи параметра и работы с ним. Так же ак я помню так можно делать в Си компиляторе LCC-WIN32 с опцией которая расширяет синтаксис Си ,но при этом нписаный код нельзя будет откомпилировать в любом другом стандартезированом Си компиляторе.
п.с: дискутировать на пример различия Си и Си++ думаю можно довольнатаки долго отличие только наличием ООП в Си++ тут дело не ограничиться(тежи темплейты, перугрузка функций и операторов, и вот такая вот преславутая передача параметров )... Но это уже мне кажеться за рамками вопроса. Сам лично предпочитаю ANSI C компиляторы.
|
|
|
|
28.11.2006, 07:30
|
|
Гражданин KAZUS.RU
Регистрация: 27.07.2006
Сообщений: 659
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
1 это CCS-PICC
2 Из-за чего возникла такая запись:
Если нужно передать ссылки, то объявите как
void func(char *a,char *s,char *d)
а вызывайте как
func(&a,&s,&d) все правильно я так и делал
продолжим функцию
func(char *a,char *s,char *d)
{*a=0;*S=0;*d=0;}все будет правильно и функция обнулит
содержимое a,s,d
но мне было надо
#asm
clrf a
clrf s
clrf d
#endasm
а транслятор сотворил из a,s,d чтото похожее на указатель на указатель,и никаким другим способом передать адреса переменных я не смог.
|
|
|
|
28.11.2006, 12:56
|
|
Частый гость
Регистрация: 14.07.2006
Сообщений: 16
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
|
Тут се дело уже в твоем компиляторе =) У разных компиля,торов разное представление о оптимизации ии представления твоего иходника в опкодах.... Это первое второе все таки что хочеться сказать у тебя же не просто код А ФУНКЦИЯ! Значит надо понимать что параметры которые передаешь сохраняеться где либо ещё например стек... и вот код функции работает со значениями из стека... и од функции не может рбаотать напрямую с аргументами которые ты туда передал ибо
1) Мягко говоря логично
2) Функция о них ничего не знает =)
Когда ты передал эти три параметра а именно адреса на переменные в функцю... то в "стеке" (почему пишу в кавычках слово СТЕК ибо в разных компиляторох он по разному делаеться и часто бывает что реальному стеку не имеет никакого отношения например потому что в контроллере его может и не быть под такие вот дела.)
будет три адреса этих переменных..... далее компилятор то делает конечно по логике считавает адрес из стека и помещает по нему в твоем случаи 0... то бишь минимум 2 опкода на операцию.... вот
твоем случаи как ты написал на асме.... если этот код будет в функции он просто напрото указатели указывающие на адрес твоих переменых сдеает нулевыми =) и все
Вот так что у тебя два пути решения:
1) Не удивляться почему коду генериться больше ем ты думал потому что так и длжно быть (можешь попробовать сделать функцию inline и может компилятор тогда подругому сделает)
2) так и написать вставку на АСМе +)) без функций
|
|
|
|
15.02.2008, 00:59
|
|
Временная регистрация
Регистрация: 05.06.2005
Сообщений: 84
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: СИ
Сообщение от nml
|
Сообщение от EVGENIY1962
|
Сколь корректным является такая запись при передаче параметров?Мне никогда подобное не встречалось а сделать по другому не получилось.
main()
{
char a,s,d;
func(a,s,d);
}
void func(char &a,char &s,char &d)
{
}
|
Непонятно. Если вам нужно просто передать параметр, объявите функцию как
void func(char a,char s,char d)
Если нужно передать ссылки, то объявите как
void func(char *a,char *s,char *d)
а вызывайте как
func(&a,&s,&d)
|
А как в функцию передать порт процессора? Теоретически я понимаю, что надо вытащить адрес бита, передать его в функцию и научить функцию по адресу читать нужный бит, т.е. создать указатель на бит. Но вот как это записать??
|
|
|
|
15.02.2008, 04:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Запарился искать по страничкам
Вот здесь предлагали https://kazus.ru/forum/topic_7108-0-asc-180.html ,я пробовал в CCS все работает
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:33.
|
|