2013-06-25 8 views
-3

Я ищу некоторую помощь с пониманием, почему я получаю значение. У меня есть основное меню для выбора и установки значений на микроконтроллере KL25Z (32-битная архитектура). У меня есть int, который не печатает значение выше 255. Что я делаю неправильно?неожиданное значение C структура

beacon.h

typedef struct _payload_t { 

int t1_range; 

} PAYLOAD_T; 

beacon.c

#define BUFFSIZE 100 
PAYLOAD_T payload; 

int main (int argc, char *argv[]) 
{ 

char line[2]; 
int ret, select; 

// print menu 
print_menu(); 

// get menu input 
ret = readline(line, BUFFSIZE, stdin, stdout); 

select = atoi(line); 

switch(select) 
{ 

case 1: 

uprintf(" Target 1 Starting Range: "); 
ret = readline(line, BUFFSIZE, stdin, stdout); //--> 257 
payload.t1_range = atoi(line); 
printf(" Selection = %s\r\n", line); //--> 257 
printf("(%d)\r\n",payload.t1_range); //--> 1 
break; 

... rest of case 
} 
return 0; 
} //end main 

Все работает нормально, пока значения выше 255 не будут введены, то отображаемые значения, кажется, вернуться к 1. Если payload.t1_range является int (16 бит), почему он действует как 8 бит?

Любая помощь или направление были бы очень признательны.

Спасибо!

+2

Является точным представлением вашего кода? У одного «BUFFSIZE» есть два F. – Potatoswatter

+6

Согласен; пожалуйста post ** настоящий ** код. –

+2

Ключевое слово, наиболее близкое к 'typdef', -' typedef'. Кроме того, ваша 'строка' является ** элементом ** массива элементов char (независимо от того, что может быть BUFFSIZE или BUFSIZE). –

ответ

2

line - 2 символа. atoi работает с нулевыми завершенными строками, поэтому любое число из 1 символа будет давать вам неопределенное поведение.

Попробуйте сделать line больше.

+0

Спасибо, Джон за полезный совет и заглянул за пару опечаток. Похоже, что у некоторых из них был тяжелый день или в процессе попыток сделать алмаз из угля. Еще раз спасибо. – txcotrader

+0

Что поставило проблему - поскольку мое максимальное значение было бы 2 байта, я увеличил линию до строки «char [3]», а затем выполнил «memset (line, 0, sizeof (line)); чтобы обнулить биты, поэтому мне не нужно было беспокоиться о том, чтобы atoi не ударил нуль. Надеюсь, это поможет кому-то в будущем. – txcotrader

+0

@txcotrader 'line [3]' все еще не будет обрабатывать значение 256 - вы использовали все свои символы без места для nul-терминатора. – John3136