|
Проблема с функциями, возвращается нулевой результат |
|
|
|
 |
Ответов
(1 - 13)
|
Aug 18 2008, 09:25
|

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

|
Цитата(mempfis_ @ Aug 18 2008, 15:08)  Осталась проблема с sram. Если использовать глобальную переменную crc8_result_table всё работает, если я её делаю статической - не работает  . Мистика. В чём может быть проблема? Если вы пишете Код unsigned char crc8_table_sram(unsigned char *pcBlock, unsigned char len) { crc8_result_table = 0xFF; while (len--) ... } , то присвоение crc8_result_table = 0xFF происходит каждый раз при входе в функцию. А если добавить static: Код static unsigned char crc8_result_table = 0xFF; , то присвоение происходит один раз, при старте программы. Поэтому для правильного подсчёта надо добавить строчку Код unsigned char crc8_table_sram(unsigned char *pcBlock, unsigned char len) { static unsigned char crc8_result_table; crc8_result_table = 0xFF; while (len--) ... } Хотя мне не ясно, зачем здесь глобальная либо статическая переменная...
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 18 2008, 10:31
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
AHTOXAс записью типа: Код static unsigned char crc8_result_table = 0xFF; не работает. А вот с: Код static unsigned char crc8_result_table; crc8_result_table = 0xFF; всё верно работает. Т.е. в первом случае компилятор при старте программы один раз проинициализирует эту переменную и при следующих вызовах функции будет использовать значения оставшиеся от предидущих вызовов функции. А во втором случае будет заново инициализировать её необходимой величиной (0xFF) ? P.S. А как Вы предлагаете вычислять без использования глобальных или статических переменных?
|
|
|
|
|
Aug 18 2008, 10:50
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Код unsigned char crc8_table_sram(unsigned char *pcBlock, unsigned char len) { unsigned char crc8_result_table = 0xFF; while (len--) crc8_result_table = Crc8Table[crc8_result_table ^ *pcBlock++]; return(crc8_result_table); } А чем вам такая запись не угодила?
|
|
|
|
|
Aug 18 2008, 12:02
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(gotty @ Aug 18 2008, 14:50)  Код unsigned char crc8_table_sram(unsigned char *pcBlock, unsigned char len) { unsigned char crc8_result_table = 0xFF; while (len--) crc8_result_table = Crc8Table[crc8_result_table ^ *pcBlock++]; return(crc8_result_table); } А чем вам такая запись не угодила? Спасибо, такая запись тоже работает  Вобщем разобался с проблемой  Всем спасибо за советы  На будущее буду знать что статические переменные нужно инициализировать перед использованием записью вида: Код static unsigned char i; i=0; а не: Код static unsigned char i = 0;
|
|
|
|
|
Aug 18 2008, 15:26
|

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

|
Вывод неверный:-) Правильный вывод будет такой: Если Цитата статические переменные нужно инициализировать перед использованием записью вида: Код static unsigned char i; i=0; , то статическая переменная здесь скорее всего не нужна.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 19 2008, 06:43
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(AHTOXA @ Aug 18 2008, 19:26)  Вывод неверный:-) ... статическая переменная здесь скорее всего не нужна. Объясните пожалуйста почему она сдесь не нужна? Насколько я помню static обозначает что некоторая переменная будет использована в пределах функции и после выхода из функции про эту переменную "забудут" до следующего вызова функции. Т.е. под неё выделяется память только когда нужно. Разве сдесь не тот случай когда нужно выделить переменную, с помощью неё чтото посчитать, возвратить результат и забыть про неё?  /*************************************************************************** ***************************************************************************/ //вычисление crc8 над данными в sram табличным методом unsigned char crc8_table_sram(unsigned char *pcBlock, unsigned char len) { static unsigned char crc8_result_table; crc8_result_table = 0xFF while (len--) crc8_result_table = Crc8Table[crc8_result_table ^ *pcBlock++]; return(crc8_result_table); } /*************************************************************************** ***************************************************************************/
|
|
|
|
|
Aug 19 2008, 08:34
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(mempfis_ @ Aug 19 2008, 09:43)  Т.е. под неё выделяется память только когда нужно. Разве сдесь не тот случай когда нужно выделить переменную, с помощью неё чтото посчитать, возвратить результат и забыть про неё?  Неверно, под статическую переменную память выделяется один раз, во время инициализации. Таким образом, если ваша переменная не используется более нигде, кроме этих функций -- она просто занимает память. А под переменные, обьявленные внутри функции не статическими, память выделяется из стека во время вызова, а после завершения -- память освобождается. Что лучше использовать -- это ваш выбор.
|
|
|
|
|
Aug 19 2008, 09:33
|

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

|
Цитата(mempfis_ @ Aug 19 2008, 12:43)  Насколько я помню static обозначает что некоторая переменная будет использована в пределах функции и после выхода из функции про эту переменную "забудут" до следующего вызова функции. Т.е. под неё выделяется память только когда нужно. Разве сдесь не тот случай когда нужно выделить переменную, с помощью неё чтото посчитать, возвратить результат и забыть про неё?  То что вы описали, называется - автоматическая переменная. А статическая - это как раз если надо хранить результаты между вызовами. Переменные, объявляемые в теле функции (локальные) - они по умолчанию автоматические, если не указано иное. То есть, убрав слово static из объявления переменной, вы получили как раз то, что требовалось - переменная создаётся в момент входа в функцию, используется и уничтожается при выходе из функции.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|