2010-09-12 9 views
2

Я выполняю свой проект, чтобы реализовать приложение для ввода текста в компиляторе turbo C (это предел), эта функция фактически представляет собой таблицу поиска для x, y и ключевого символа, но она возвращается значение мусора при первом значении, которое я передал в аргументе. С другой стороны он начинает делать правильно. Обратите внимание, что x, y - указатели для возврата двух значений во времени. Пожалуйста, ПРОВЕРЬТЕ, что такое моя ошибка.Проблема возникает в случае структуры

s1 = "ASDF JKL; ADSF JLK; "; 
char take_xy(char s1[], int j, int *x, int *y) 
{ 
    char ch; 
    switch(s1[j]) 
    { 
     case 'Q' : *x = 137; *y = 244; ch = 'Q'; break; 
     case 'W' : *x = 160; *y = 244; ch = 'W'; break; 
     case 'E' : *x = 183; *y = 244; ch = 'E'; break; 
     case 'R' : *x = 206; *y = 244; ch = 'R'; break; 
     case 'T' : *x = 229; *y = 244; ch = 'T'; break; 
     case 'Y' : *x = 252; *y = 244; ch = 'Y'; break; 
     case 'U' : *x = 275; *y = 244; ch = 'U'; break; 
     case 'I' : *x = 298; *y = 244; ch = 'I'; break; 
     case 'O' : *x = 321; *y = 244; ch = 'O'; break; 
     case 'P' : *x = 344; *y = 244; ch = 'P'; break; 

     case 'A' : *x = 144; *y = 268; ch = 'A'; break; 
     case 'S' : *x = 167; *y = 268; ch = 'S'; break; 
     case 'D' : *x = 190; *y = 268; ch = 'D'; break; 
     case 'F' : *x = 213; *y = 268; ch = 'F'; break; 
     case 'G' : *x = 236; *y = 268; ch = 'G'; break; 
     case 'H' : *x = 259; *y = 268; ch = 'H'; break; 
     case 'J' : *x = 282; *y = 268; ch = 'J'; break; 
     case 'K' : *x = 305; *y = 268; ch = 'K'; break; 
     case 'L' : *x = 328; *y = 268; ch = 'L'; break; 
     case ';' : *x = 351; *y = 268; ch = ';'; break; 
//  case ''' : *x = 374; *y = 268; ch = '''; break; 

     case 'Z' : *x = 162; *y = 292; ch = 'Z'; break; 
     case 'X' : *x = 185; *y = 292; ch = 'X'; break; 
     case 'C' : *x = 208; *y = 292; ch = 'C'; break; 
     case 'V' : *x = 231; *y = 292; ch = 'V'; break; 
     case 'B' : *x = 254; *y = 292; ch = 'B'; break; 
     case 'N' : *x = 277; *y = 292; ch = 'N'; break; 
     case 'M' : *x = 300; *y = 292; ch = 'M'; break; 
     case '?' : *x = 369; *y = 292; ch = '?'; break; 

     case ' ' : *x = 189; *y = 316; ch = ' '; break; 

    } 
    return ch; 
}  
+1

Укажите код, который вы используете, чтобы позвонить ему. Я также не понимаю, почему у вас есть отдельная переменная 's1' вне функции. –

+3

Кстати, похоже, что вы можете просто удалить все инструкции 'ch = '...'' и просто сделать 'return s1 [j]' из этой функции; но, как сказал Матфей, ​​похоже, что все в порядке, поэтому проблема может быть в коде, который вызывает 'take_xy', а не сама функция. –

ответ

0

В коде, который вы отправили, нет ничего плохого, ошибка должна быть в другом месте.

3

Я бы посмотрел, как вы вызываете эту функцию. Я бы предположил, что параметр «j» меньше 0 или больше 19.

Также запускается в отладчике и проверяется значение всех ваших параметров при первом вызове.

Как указано в указателе @ Matthew Flaschen, давайте посмотрим код вызова.

EDIT

Вы можете также добавить пункт default, чтобы поймать что-нибудь, что не соответствует.

3

Похоже, что содержимое sl [j] может не охватываться этим коммутатором, поэтому «ch» имеет любое значение по умолчанию, которое оно содержит при создании в стеке.

Я хотел бы сделать одно из следующих действий:

  1. Нормализовать содержание сл [J], прежде чем использовать его в переключателе.
  2. Добавить к стандарту тег «по умолчанию».
  3. Инициализировать «ch» до некоторого значения по умолчанию при его объявлении (эквивалентно опции 2).
+0

по умолчанию не проблема. 2nd Я проверил его через отладчик, но без проблем, если я добавлю значение по умолчанию, тогда он вернет это значение по умолчанию, которое не попадает в структуру case. –

+0

Это говорит мне, что содержимое sl [j] не распространяется на коммутатор. Когда вы отлаживаете эту функцию, какое значение она имеет? – 2010-09-12 02:49:20

 Смежные вопросы

  • Нет связанных вопросов^_^