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

 
 
> WinAVR и адрес статической функции, странная ошибка
ARV
сообщение Jun 6 2011, 09:45
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Код
static basis sum(uint8_t arg_cnt, void **args){
        basis result = 0;
        for(;arg_cnt--;*args++){
               result += evalute(args);
        }
        return result;
    }
    

#define num(x)    ((x) & 0xFF), (((x) >> 8) & 0xFF), (((x) >> 16UL) & 0xFF), (((x) >> 24UL) & 0xFF)


#define adr(x)    ((uint16_t)(x) & 0xFF), ((uint16_t)(x) & 0xFF00) >> 8
    
    uint8_t massiv[] = {
            TOC_VAR, 0,
                TOC_FUNC,adr(sum), 0, 3,
                    TOC_NUMBER, num(99UL),
                    TOC_NUMBER, num(1UL),
                    TOC_VAR, 0,
            TOC_END
    };

не получается занести в массив адрес функции sad.gif пишет - не константа sad.gif с чего бы это вдруг?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Maddy
сообщение Jun 10 2011, 10:55
Сообщение #2


Участник
*

Группа: Validating
Сообщений: 56
Регистрация: 15-10-06
Пользователь №: 21 335



ну таки я об этом и говорю - тут на этапе формирования массива автор пытается пользовать данные ,которых еще нет . Если просто класть указатель на функцию - да , ld автоматом подсунет нужный адрес , но автор-то хочет вычеслений ... И как быть бедному gcc ?

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 10 2011, 12:22
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Maddy @ Jun 10 2011, 13:55) *
И как быть бедному gcc ?
Так же, как и в случае с указателем на функцию. Почему у gcc для других платформ с этим проблем не возникает?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 10 2011, 13:47
Сообщение #4


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

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



Цитата(Сергей Борщ @ Jun 10 2011, 18:22) *
Почему у gcc для других платформ с этим проблем не возникает?

У gcc с указателями иногда очень странные отношения.
Вот пример:
Код
struct rec1 {
    int field1;
    int field2;
};

#define prec1 ((rec1 *) 0x10000)

static const int field2addr = (uint32_t)&prec1->field2;    // строка 1

class testcase2
{
    static const int field2addr = (uint32_t)&prec1->field2;   // строка 2
};


Строку 1 - проглатывает, а строку 2 - нет:
Цитата
tests.cpp:64:43: error: a cast to a type other than an integral or enumeration type cannot appear in a constant-expression
tests.cpp:64:50: error: '->' cannot appear in a constant-expression
tests.cpp:64:50: error: '&' cannot appear in a constant-expression

Почему так - не понимаю...


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 14 2011, 05:08
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(AHTOXA @ Jun 10 2011, 18:47) *
У gcc с указателями иногда очень странные отношения.

Строку 1 - проглатывает, а строку 2 - нет:
Почему так - не понимаю...

Потому что (статические) члены классов не инициализируют таким образом, как у Вас в строке 2. Вот такой вариант:
Код
class testcase2
{
   static const int field2addr;
};
const int testcase2::field2addr = (uint32_t)&prec1->field2;
gcc компилирует без замечаний.


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 14 2011, 06:05
Сообщение #6


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

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



Статические int-ы легко инициализируются таким образом:
Код
class testcase2
{
    static const int test_static_const_int = 0x12345;
};

Кроме того, в enum-ах инициализация указателем тоже не проходит, на
Код
class testcase2
{
    enum { field2addr = (uint32_t)&prec1->field2 };
};

-- ругается точно так же. Так что дело не в статике. Но за способ обхода - спасибоsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 14 2011, 11:17
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(AHTOXA @ Jun 14 2011, 11:05) *
Статические int-ы легко инициализируются таким образом:
Код
class testcase2
{
    static const int test_static_const_int = 0x12345;
};

Нашел соответствующее место в спецификации языка, вроде бы все правильно. Такая форма требует constant expression в правой части, а constant expression, в свою очередь, может содержать только литералы, перечисления, const переменные интегральных типов и sizeof(). Указатели под перечисленное не подпадают.

И еще в constant expression допускаются приведения только к интегральным типам или перечислениям, поэтому компилятор совершенно справедливо ругается на (rec1 *)0x10000.

Сообщение отредактировал alx2 - Jun 14 2011, 11:20


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 14 2011, 12:42
Сообщение #8


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

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



Цитата(alx2 @ Jun 14 2011, 17:17) *
Нашел соответствующее место в спецификации языка
Языка - C++? А когда мы объявляем вне класса, то срабатывает совместимость с Си, а там это можно? Если так, то немного проясняется, спасибо.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ARV   WinAVR и адрес статической функции   Jun 6 2011, 09:45
- - Сергей Борщ   QUOTE (ARV @ Jun 6 2011, 12:45) пишет - н...   Jun 6 2011, 13:08
|- - ARV   Цитата(Сергей Борщ @ Jun 6 2011, 17:08) В...   Jun 6 2011, 19:17
- - zltigo   static убрать   Jun 6 2011, 20:14
|- - ARV   Цитата(zltigo @ Jun 7 2011, 00:14) static...   Jun 7 2011, 04:34
- - Сергей Борщ   CODEstatic void test() { } #define adr...   Jun 7 2011, 06:48
|- - ARV   Цитата(Сергей Борщ @ Jun 7 2011, 10:48) Т...   Jun 7 2011, 09:33
|- - demiurg_spb   Кодstatic void foo1(void){} static void fo...   Jun 7 2011, 10:12
|- - Сергей Борщ   QUOTE (ARV @ Jun 7 2011, 12:33) и где иск...   Jun 7 2011, 10:19
|- - demiurg_spb   Цитата(Сергей Борщ @ Jun 7 2011, 14:19) Б...   Jun 7 2011, 10:26
- - ARV   Кодstatic void foo(void){ } static uint8_...   Jun 7 2011, 11:01
|- - Сергей Борщ   QUOTE (ARV @ Jun 7 2011, 14:01) не проход...   Jun 7 2011, 11:40
|- - ARV   Цитата(Сергей Борщ @ Jun 7 2011, 15:40) К...   Jun 7 2011, 12:15
|- - Сергей Борщ   QUOTE (ARV @ Jun 7 2011, 15:15) совершенн...   Jun 7 2011, 14:35
- - Maddy   Хм ... а можно дурацкий вопрос ? откуда компилятор...   Jun 10 2011, 07:38
|- - Сергей Борщ   QUOTE (Maddy @ Jun 10 2011, 10:38) Хм ......   Jun 10 2011, 08:59
|- - alx2   Цитата(AHTOXA @ Jun 14 2011, 17:42) Языка...   Jun 15 2011, 04:59
|- - AHTOXA   Цитата(alx2 @ Jun 15 2011, 10:59) в строк...   Jun 15 2011, 05:11
|- - alx2   Цитата(AHTOXA @ Jun 15 2011, 10:11) Можно...   Jun 15 2011, 09:14
|- - AHTOXA   Цитата(alx2 @ Jun 15 2011, 15:14) Конечно...   Jun 15 2011, 09:47
|- - dxp   Цитата(AHTOXA @ Jun 15 2011, 16:47) На мо...   Jun 15 2011, 10:28
- - Maddy   Хм ... Кодlong handleTimersISR(void); sta...   Jun 10 2011, 13:21
- - Maddy   мдя послали А кстати - вариант с offsetof не под...   Jun 10 2011, 14:06
- - AHTOXA   Через него и выкрутился: Код static const int fiel...   Jun 10 2011, 15:04


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

 


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


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