Ошибка в программе C - PullRequest
       13

Ошибка в программе C

0 голосов
/ 25 марта 2009

while(((long)(1000*ratio*((long)clock()-(long)t0))%100)/1000)<Data_Read_Rate);

Приведенная выше строка вызывает следующую ошибку: «Синтаксическая ошибка перед <токеном». </p>

Почему появляется эта ошибка?

Я использую MINGW32 для разработки (компилятор GCC).

Спасибо ...

Ответы [ 7 ]

8 голосов
/ 25 марта 2009

Слева отсутствует одна пара. Это будет разбирать:

while ((((long)(1000*ratio*((long)clock()-(long)t0))%100)/1000)<Data_Read_Rate);

Помимо вопроса разбора:

  • Используйте редактор, который выделяет соответствующие скобки:)
  • Почему бы не рассчитать время, оставшееся до тех пор, пока скорость чтения данных не упадет в достаточной степени, и вызвать sleep ()? Это лучше на процессоре.

Кроме того, учитывая использование вами оператора%, вы можете захотеть разместить дополнительную скобку следующим образом (я предполагаю, что ratio не является целым числом), поскольку для оператора% требуются целочисленные операнды:

while (((long)(1000*ratio*(((long)clock()-(long)t0))%100)/1000)<Data_Read_Rate);

(Но имеет ли это смысл на семантическом уровне? Раскрой его!)

4 голосов
/ 25 марта 2009

У вас слишком много закрывающих скобок.

Плюс, ваша логика настолько длинна и глубока, что я не хочу пытаться понять, каким должен быть код. Просто vim выделяет последний ) красным цветом, что означает, что он не соответствует. Я предлагаю вам рассмотреть возможность использования нескольких промежуточных переменных и упростить логику этого утверждения, разбив его на несколько строк вместо одной.

3 голосов
/ 25 марта 2009

Parenthisis не совпадают. Кстати, я бы на самом деле отредактировал код и разбил его на несколько операторов, чтобы сделать его более читабельным.

2 голосов
/ 25 марта 2009

Потому что компилятор так же запутался в вашем коде, как и читатель-человек? [Дрожь]

Пробелы и разрывы строк бесплатны и обеспечивают удобство чтения.

    while ( ( (long)( 1000 * ratio * ( (long)clock() - (long)t0 ) ) % 100 ) / 1000 ) < Data_Read_Rate );

Вы также можете покончить с (длинными) приведениями clock () и t0 (при условии, что они оба int). Приведение их до вычитания не изменит результат. Чтобы сделать весь расчет длинным, достаточно было бы сделать один аргументов длинным - и самый короткий способ сделать это - приведение литерала 1000:

while ( ( ( 1000l * ratio * ( clock() - t0 ) ) % 100 ) / 1000 ) < Data_Read_Rate );

Хммм ... подожди. Вы берете что-то, по модулю 100 (с числом от 0 до 99), а затем делите на 1000? Ваш результат всегда 0 ...

О, и вы забыли сопоставить свои скобки. ; -)

1 голос
/ 25 марта 2009

Как упоминалось ранее, ваши круглые скобки не совпадают.

С такими выражениями почти всегда лучше работать с некоторыми временными переменными, чтобы упростить утверждение. Однако следующие советы могут помочь.

  1. Подсчитайте скобки, добавляя 1 к каждому «(» и вычитая 1 для каждого «)», вы всегда должны получить ответ 0. Положительный ответ означает, что у вас есть лишний »(« отрицательный ответ, что у вас ")".
  2. Переформатируйте выражение, чтобы его было легче читать, возможно, разбив его на несколько строк, с каждым логическим оператором в строке.
  3. Использовать редактор кода с подсветкой синтаксиса. Это должно показать несоответствие для вас
0 голосов
/ 25 марта 2009

У вас слишком много открывающих и закрывающих скобок. Если вы используете Visual Studio, это поможет вам сопоставить открывающий и закрывающий паратез / фигурную скобку, используя клавиши Ctrl + '[' и Ctrl + ']' нажатий

Еще одно предложение - сгруппировать и разделить его на несколько строк, поддерживая читабельность выражений. Также попробуйте выделить пробел между последующими скобками, чтобы логически сгруппировать выражения.

0 голосов
/ 25 марта 2009

Вам не хватает одного паразита на левой стороне.

...