Почему бы не увеличить Z? - PullRequest
0 голосов
/ 03 декабря 2010

Я пытаюсь написать простой исполнитель конечного автомата на C. У меня есть этот код:

while(1) {  
  strcpy(fsm.state[x][z], lines[i]);
  printf("%i %i\n", x, z);
  z++; i++;
  if(strcmp(lines[i], ".") == 0) x++; z = 0;
  if(strcmp(lines[i], "") == 0) break;
}

Я не понимаю, почему, если z должен быть сброшен, только когда текущая строка, которую я читаю из массива lines , равна ".", Что происходит при каждом третьем появлении в моем тестовом сценарии z остается равным 0, даже если x успешно увеличивается на каждую третью строку.

Мне нужен вывод примерно так:

1 0 \ n 1 1 \ n 1 2 \ n 2 0 \ n 2 1 \ n 2 2 \ n 3 0 \ n 3 1 и т. Д ...

Вместо этого я получаю:

1 0 \ n 1 0 \ n 1 0 \ n 2 0 \ n 2 0 \ n 2 0 \ n 3 0 \ n 3 0 и т. Д ...

Что я должен изменить? Это может быть глупый вопрос, но я действительно не понимаю, что здесь не так.

Спасибо за вашу помощь.

Ответы [ 4 ]

9 голосов
/ 03 декабря 2010

z всегда устанавливается на ноль.Оператор if не работает на основе строки, он переходит к следующей точке с запятой.

if(strcmp(lines[i], ".") == 0) x++; z = 0;
if(strcmp(lines[i], "") == 0) break;

То же, что:

if(strcmp(lines[i], ".") == 0){
 x++;
}

z = 0;

if(strcmp(lines[i], "") == 0){
 break;
}

Поскольку у вас есть два оператораx++; z = 0;), вам нужно поставить вокруг них фигурные скобки, чтобы указать условие:

if(strcmp(lines[i], ".") == 0){
 x++;
 z = 0;
}
7 голосов
/ 03 декабря 2010

используйте фигурные скобки, чтобы избежать путаницы:)

while(1) {  
  strcpy(fsm.state[x][z], lines[i]);
  printf("%i %i\n", x, z);
  z++; i++;
  if(strcmp(lines[i], ".") == 0) {
        x++; 
        z = 0;
  }
  if(strcmp(lines[i], "") == 0) {
        break;
  }
}
2 голосов
/ 03 декабря 2010
if(strcmp(lines[i], ".") == 0) x++; z = 0;

совпадает с:

if(strcmp(lines[i], ".") == 0) 
   x++; 
z = 0;

Вы, вероятно, хотите

if(strcmp(lines[i], ".") == 0) {
     x++; 
     z = 0;
}
1 голос
/ 03 декабря 2010

Ваша проблема в этой строке:

if(strcmp(lines[i], ".") == 0) x++; z = 0;

Без скобок if будет содержать только выражение x++, и ваш компилятор будет интерпретировать ваш код, например:

if(strcmp(lines[i], ".") == 0)
    x++;
z = 0;

Принимая во внимание, что z = 0 выполняется каждый раз. Чтобы исправить это, используйте фигурные скобки (для 2 или более операторов в блоке if)

if(strcmp(lines[i], ".") == 0) {
    x++;
    z = 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...