почему компилятор Open Watcom(wcc386) неккоректно компилирует код
я установил себе на компьютер Open Watcom и что бы протестировать компилятор я взял код из Интернета на Си и решил скомпилировать, но получил вот такое от компилятора:
f.c(11): Error! E1077: Missing '}'
f.c(11): Warning! W107: Missing return value for function 'main'
f.c(11): Error! E1061: Expecting data or function declaration, but found '{'
f.c(12): Error! E1026: Invalid declarator
f.c(12): Error! E1009: Expecting ';' but found 'char'
f.c(13): Warning! W132: No storage class or type specified
f.c(13): Error! E1129: Type does not agree with previous definition of 'n'
f.c(13): Note! I2002: 'n' defined in: f.c(11)
f.c(13): Error! E1011: Symbol 'argv' has not been declared
f.c(13): Error! E1045: Subscript on non-array
f.c(13): Warning! W100: Parameter 2 contains inconsistent levels of indirection
f.c(13): Note! I2003: source conversion type is 'char **'
f.c(13): Note! I2004: target conversion type is 'char const *'
f.c(13): Error! E1151: Parameter count does not agree with previous definition
f.c(13): Note! I2002: 'strtol' defined in: D:\Programms\Watcom\H\stdlib.h(221)
f.c(13): Error! E1054: Expression must be constant
f.c(14): Error! E1009: Expecting ')' but found '>'
f.c(14): Error! E1009: Expecting ')' but found 'argv'
f.c(14): Warning! W132: No storage class or type specified
f.c(14): Error! E1129: Type does not agree with previous definition of 'tail'
f.c(14): Note! I2002: 'tail' defined in: f.c(12)
f.c(14): Error! E1009: Expecting ';' but found ')'
f.c(14): Error! E1061: Expecting data or function declaration, but found ')'
f.c(14): Error! E1026: Invalid declarator
f.c(14): Error! E1009: Expecting ';' but found '?'
f.c(14): Error! E1061: Expecting data or function declaration, but found '?'
f.c(14): Error! E1009: Expecting ')' but found 'void'
f.c(14): Error! E1026: Invalid declarator
f.c(14): Error! E1009: Expecting ';' but found ')'
f.c(14): Error! E1147: Too many errors: compilation aborted
Вот почему он некорректно компилирует?
#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int
main (int argc, char *argv[])
{
assert (argc - 1 == 1);
long n;
{
char *tail;
n = strtol (argv[1], &tail, 0);
assert (tail > argv[1]);
assert (*tail == '\0');
}
assert (n >= 1);
assert (n <= sqrt (LONG_MAX));
const int width = (int)ceil (2 * log (1 + n) / log (10));
long i;
for (i = 1; i <= n; i++) {
long j;
for (j = 1; j <= n; j++) {
printf (" %*ld", width, i * j);
}
putchar ('\n');
}
return 0;
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Дело в том, что OW - достаточно старый компилятор, и новомодные :) веяния в C он не поддерживает. Ваш код вполне компилируем в режиме C++, но в режиме C ему хочется - по старой классике - собрать все объявления переменных в начале функции:
int main (int argc, char *argv[])
{
long n, i;
char *tail;
int width;
assert(argc - 1 == 1);
n = strtol (argv[1], &tail, 0);
assert (tail > argv[1]);
assert (*tail == '\0');
assert (n >= 1);
assert (n <= sqrt (LONG_MAX));
width = ceil(2*log(1+n)/log(10));
for (i = 1; i <= n; i++)
{
long j;
for (j = 1; j <= n; j++) {
printf (" %*ld", width, i * j);
}
putchar ('\n');
}
return 0;
}
Вот так все заработает...
Кстати, а какая нынче версия OW? Что-то новее 1.9 появилось?
А когда-то был очень крутой компилятор для своего времени...