реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Что это фича или баг?, avr-gcc 4.1.2 WinAvr 20070525
msalov
сообщение Dec 1 2008, 11:02
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(Непомнящий Евгений @ Dec 1 2008, 12:44) *
Ну тогда получается, что конструкции вида
Код
РЕГИСТР = значение;

должны приводить к записи регистра и его последующему чтению. Т.е. запись регистра без чтения на С вообще невозможна smile.gif

Надо различать конструкции. Оператор ?: подразумевает дальнейшее использование возвращаемого значения, а РЕГИСТР = значение - допускает.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 1 2008, 11:51
Сообщение #17


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(gotty @ Dec 1 2008, 16:02) *
Надо различать конструкции. Оператор ?: подразумевает дальнейшее использование возвращаемого значения, а РЕГИСТР = значение - допускает.


Тогда по идее конструкция
Код
a = b ? func1() : func2();

должна сначала вызвать обе функции? smile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 1 2008, 12:07
Сообщение #18


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(AHTOXA @ Dec 1 2008, 15:51) *
должна сначала вызвать обе функции? smile.gif

А это тут при чем? smile.gif
По теме
Код
(void) (tty ? UDR1 = data : UDR0 = data);

Можете проверить, насколько это кошерно ?
ЗЫ некошерно, уже проверил. smile.gif
ЗЫ^2
последний WinAVR-20081118rc2
Код
#include<avr/io.h>
volatile uint8_t UR0,UR1,tty,data;

int main(void)
{
while(1)
{
  tty ? UR1=data : UR0=data;
}
return(0);
}


../test.c:9: error: lvalue required as left operand of assignment
не оставляет шанса для кривотолков.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 1 2008, 12:21
Сообщение #19


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(_Pasha @ Dec 1 2008, 17:07) *
А это тут при чем? smile.gif


И действительно:-)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
xelax
сообщение Dec 1 2008, 12:30
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(_Pasha @ Dec 1 2008, 15:07) *
../test.c:9: error: lvalue required as left operand of assignment
не оставляет шанса для кривотолков.


tty ? (UR1=data) : (UR0=data);

а так? lol.gif
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 1 2008, 12:38
Сообщение #21


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(xelax @ Dec 1 2008, 16:30) *
а так? lol.gif

Понятно. Не догнал...smile.gif
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 1 2008, 15:12
Сообщение #22


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(_Pasha @ Dec 1 2008, 16:38) *
Понятно. Не догнал...smile.gif

Господа, внимание! Мой путь через ж%пу к звездам:
исходные те же
Код
int main(void)
{
while(1)
{
  tty ? (void)(UR1=data) : (void)(UR0=data);
}
return(0);
}


ЛыстынГ:
Код
int main(void)
{
while(1)
{
  tty ? (void)(UR1=data) : (void)(UR0=data);
  6c:    80 91 02 01     lds    r24, 0x0102
  70:    88 23           and    r24, r24
  72:    29 f0           breq    .+10     ; 0x7e <main+0x12>
  74:    80 91 01 01     lds    r24, 0x0101
  78:    80 93 03 01     sts    0x0103, r24
  7c:    f7 cf           rjmp    .-18     ; 0x6c <main>
  7e:    80 91 01 01     lds    r24, 0x0101
  82:    80 93 00 01     sts    0x0100, r24
  86:    f2 cf           rjmp    .-28     ; 0x6c <main>

00000088 <_exit>:
  88:    f8 94           cli

0000008a <__stop_program>:
  8a:    ff cf           rjmp    .-2      ; 0x8a <__stop_progr


такшта... надо было хоть раз голову включить. smile.gif
Go to the top of the page
 
+Quote Post
ReAl
сообщение Dec 11 2008, 09:13
Сообщение #23


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(_Pasha @ Dec 1 2008, 17:12) *
Господа, внимание! Мой путь через ж%пу к звездам:
исходные те же
Код
int main(void)
{
while(1)
{
  tty ? (void)(UR1=data) : (void)(UR0=data);
}
return(0);
}
Мдя... Тогда уж лучше, если так хочется поизвращаться, переходить на С++ (заодно и с атомарными фрагментами кода будет легче через класс критической секции).
В С++ несколько унифицировали понятие lvalue и он допускает не только возможное в С
Код
   variable = (flag ? function1 : function2)(argument1, argument2);

вместо
Код
variable = (flag ? function1(argument1, argument2) : function2(argument1, argument2) );


но и такое:

Код
#include <avr/io.h>

void foo(uint8_t flag, uint8_t data)
{
    (flag ? PORTB : PORTC) = data;
}


Код
.global    _Z3foohh
    .type    _Z3foohh, @function
_Z3foohh:
/* prologue: frame size=0 */
/* prologue end (size=0) */
    tst r24
    breq .L2
    out 37-0x20,r22
    ret
.L2:
    out 40-0x20,r22
    ret


Кстати, это только более простая и логичная запись допустимого в С
Код
*(flag ? &PORTB : &PORTC) = data;

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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 07:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01447 секунд с 7
ELECTRONIX ©2004-2016