|
WinAVR и адрес статической функции, странная ошибка |
|
|
|
Jun 6 2011, 09:45
|

Профессионал
    
Группа: Свой
Сообщений: 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 }; не получается занести в массив адрес функции  пишет - не константа  с чего бы это вдруг?
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
 |
Ответов
|
Jun 10 2011, 10:55
|
Участник

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

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

фанат дивана
     
Группа: Свой
Сообщений: 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 Почему так - не понимаю...
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jun 14 2011, 05:08
|

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 14 2011, 06:05
|

фанат дивана
     
Группа: Свой
Сообщений: 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 }; }; -- ругается точно так же. Так что дело не в статике. Но за способ обхода - спасибо
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jun 14 2011, 11:17
|

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 15 2011, 04:59
|

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

|
Цитата(AHTOXA @ Jun 14 2011, 17:42)  Языка - C++? Да, конечно. Цитата(AHTOXA @ Jun 14 2011, 17:42)  А когда мы объявляем вне класса, то срабатывает совместимость с Си, а там это можно? Ничего не "срабатывает". Просто то, что у Вас в строке 1 и в строке 2 - это две разные семантические конструкции, и они подчиняются разным правилам языка C++. В строке 1 инициализатор не обязан быть integral constant expression, в строке 2 - обязан.
Сообщение отредактировал alx2 - Jun 15 2011, 05:09
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Jun 15 2011, 09:14
|

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

|
Цитата(AHTOXA @ Jun 15 2011, 10:11)  Можно какую-нибудь цитату из стандарта? Конечно. Подпункт 4 пункта 9.4.2 по версии ISO: Цитата If a static data member is of const integral or const enumeration type, its declaration in the class definition can specify a constant-initializer which shall be an integral constant expression (5.19). А это из подпункта 1 пункта 5.19: Цитата An integral constant-expression can involve only literals (2.13), enumerators, const variables or static data members of integral or enumeration types initialized with constant expressions (8.5), non-type template parameters of integral or enumeration types, and sizeof expressions. ... Only type conversions to integral or enumeration types can be used. In particular, except in sizeof expressions, functions, class objects, pointers, or references shall not be used,...
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
Сообщений в этой теме
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          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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|