Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR AVR 4.10
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Sergio66
Кто нибудь сталкивался с такой проблемой, вот текст:

__eeprom unsigned int LID_ADC_Tabl[10];

unsigned int Select_LID_Position(unsigned int U)
{
char i;
for (i=0; i<10; i++) if (LID_ADC_Tabl[i] <= U) break;
if (i==0) return 0;
if (abs(U-LID_ADC_Tabl[i]) < abs(U-LID_ADC_Tabl[i-1])) return i;
else return (i-1);
}

Линкер ругается на строке :
if (abs(U-LID_ADC_Tabl[i]) < abs(U-LID_ADC_Tabl[i-1])) return i;

Error[e18]: Range error,
Number out of range. Valid range is -128 (-0x80) to 255 (0xFF).
File: G:\ATMega_8\Climat\LID.c, Line: 31
Source: LDI R19, (LID_ADC_Tabl - 2) >> 8
Where $ = Select_LID_Position + 0x54 [0xE4]
in module "LID" (G:\ATMega_8\Climat\Release\Obj\LID.r90),
offset 0x54 in segment part 11, segment CODE
What: 8 ? ((LID_ADC_Tabl + 0xFFFFFFFE) >> 1 & 0x7FFFFFFF) >> 8 - 1 : (LID_ADC_Tabl + 0xFFFFFFFE) [0xFFFFFF]
Allowed range: 0xFFFFFF01 - 0xFF
Operand: LID_ADC_Tabl [0xffffffff]
in module LID (G:\ATMega_8\Climat\Release\Obj\LID.r90),
Offset 0xfffffffe in segment part 9, segment EEPROM_I

Что это может означать?
Причем, если заменить в порочной строке j=i-1; и далее, в качестве индекса использовать j, то проблема снимается.
В чем может быть дело???
AndyBig
Цитата
for (i=0; i<10; i++)

Цитата
U-LID_ADC_Tabl[i-1]

Когда i = 0, результат i-1 получается -1, чего недьзя допускать smile.gif.
Sergio66
Цитата(AndyBig @ Jul 12 2005, 17:43)
Цитата
for (i=0; i<10; i++)

Цитата
U-LID_ADC_Tabl[i-1]

Когда i = 0, результат i-1 получается -1, чего недьзя допускать smile.gif.
*



Тут уместно было бы выдать варнинг, а не посылать меня к такой то матери.
Причем, это касается любого массива, однако, он ругается только на массив в EEPROM. Причем, только тогда, когда этот массив объявлен как int. Если его объявить, как char, то проблема уходит. Нет, тут что-то поглубже..
BVU
У Вас функция объявлена, как: unsigned int, а Вы пытаетесь возвратить значение: 'return i' - объявленное как 'char'...!
При возврате значения сделайте преобразование типов '(unsigned int) i'.
Sergio66
Цитата(BVU @ Jul 13 2005, 08:41)
У Вас функция объявлена, как: unsigned int, а Вы пытаетесь возвратить значение: 'return i' - объявленное как 'char'...!
При возврате значения сделайте преобразование типов '(unsigned int) i'.
*


Ругается то он не на это!!!
Grape
это глюк компилятора.

__eeprom unsigned int LID_ADC_Tabl[10];

unsigned int Select_LID_Position(unsigned int U)
{
char i,j;
for (i=0; i<10; i++) if (LID_ADC_Tabl[i] <= U) break;
if (i==0) return 0;

j = i-1;

if (abs(U-LID_ADC_Tabl[i]) < abs(U-LID_ADC_Tabl[j])) return i;

else return (i-1);
}

для 4.10 вроде так проходит.

в 4.11 поправили.
ksinet
Цитата(Grape @ Jul 13 2005, 15:35)
это глюк компилятора.

для 4.10 вроде так проходит.

в 4.11 поправили.
*


Незнаю как для 4,11, но первоначальный код у меня отлично компилиться и линкуеться на 4,10B. Может вы в опциях че-то перемудрили?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.