Re: Компиляция Refal6 для Linu


Subject: Re: Компиляция Refal6 для Linu
dmsidorov@mtu-net.ru
Date: Sun Oct 28 2001 - 00:26:37 MSD


On Fri, Oct 26, 2001 at 08:28:50PM +0400, Arkady Klimov wrote:
> Здравствуйте, Дмитрий,
> с указанной Вами ошибкой я в некоторой растерянности. (На С
> я уже более 5 лет не работаю). Почему-то до сих пор ни один
> компилятор в этом месте не брыкался. Что сие означает? Верно
> ли, что по стандарту языка правая часть инициализатора обязана
> быть константой? И почему stderr - не константа?

Здравствуйте, Аркадий.

Мои познания в C++ весьма невелики, как инженер всегда старался
использовать Паскаль или что-нибудь скриптовое, но вот что написано
в FAQ к gcc2.95:

Why can't I initialize a static variable with stdin?
   This has nothing to do with gcc, but people ask us about it a lot.
   Code like this:

   #include <stdio.h>
   FILE *yyin = stdin;

   will not compile with GNU libc (Linux libc6), because stdin is not a
   constant. This was done deliberately, in order for there to be no
   limit on the number of open FILE objects. It is surprising for people
   used to traditional Unix C libraries, but it is permitted by the C
   standard.

Так что, получается, под Linux это будет считаться ошибкой как минимум
до выхода новой glibc, а может, и дальше.
Кроме того, glibc теперь включает в себя определения myulong и myushort
(заголовок <sys/types.h>, включаемый через <stdlib.h>), полностью
идентичные тем, что в исходниках Рефала, поэтому ошибки не возникает,
но выдаются предупреждения об их переопределении. Чтобы избежать
двойного определения, возможно, следует использовать препроцессорную
директиву вроде

#if __GLIBC__ >= 2

но я пока не смотрел, начиная с какой версии это появилось.

> В принципе, можно, наверно, поступить и так:
>
> 1.удалить эту строку 43 rfstor.h
>
> 2.заменить строку 40 rfstor.h на строку:
> EXT FILE * stdtrc; /* File for debug information */
> (было:
> extern FILE * stdtrc; /* File for debug information */
> )
>
> 3. Вставить инициализацию
> stdtrc = stderr;
> первым оператором в функцию initstor (файл rfstor.c, строка 256)
> (эта функция вызывается первой в функции main).

Этот способ сработал, после исправлений rfstor.c скомпилировался
нормально. Теперь остались нескомпилированы rfarm.c и rbarm.c.
В rbarm.c строка 252 содержит определение matherr, конфликтующее с
аналогичным в <math.h>:

# ifdef __cplusplus
extern int matherr __P ((struct __exception *__exc));
# else
extern int matherr __P ((struct exception *__exc));
# endif

Сообщение об ошибке в rfarm.c совершенно непонятно:

rfarm.c: In function `rf_cgetnumb':
rfarm.c:289: Unable to generate reloads for:
(insn 45 43 47 (parallel[
            (set (reg:SI 0 %eax)
                (fix:SI (fix:SF (reg/v:SF 0 %eax))))
            (clobber (mem:HI (plus:SI (reg:SI 6 %ebp)
                        (const_int -2 [0xfffffffe])) 0))
            (clobber (mem:HI (plus:SI (reg:SI 6 %ebp)
                        (const_int -4 [0xfffffffc])) 0))
            (clobber (mem:SI (plus:SI (reg:SI 6 %ebp)
                        (const_int -8 [0xfffffff8])) 0))
            (clobber (scratch:HI))
        ] ) 145 {fix_truncsfsi2+1} (insn_list 92 (nil))
    (expr_list:REG_EQUIV (mem:SI (reg/v:SI 3 %ebx) 0)
        (expr_list:REG_DEAD (reg/v:SF 0 %eax)
            (expr_list:REG_UNUSED (scratch:HI)
                (nil)))))
make: *** [rfarm.o] Error 1

Что делать с определением matherr в rbarm.c, я еще мог бы попробовать
докопаться, но насчет rfarm.c никаких идей нет. Я еще не подписан, поэтому,
если есть что подсказать, пишите не только в рассылку, но и на мой адрес.

С уважением, Дмитрий.

> | ----- Original Message -----
> | From: dmsidorov@mtu-net.ru
> | To: klimov@keldysh.ru
> | сожалению, компиляция завершилась неудачей со следующим сообщением
> | об ошибке:
> |
> | gcc rfstor.c -O -c -ggdb
> | In file included from refcom.h:55,
> | from refgen.h:16,
> | from refint.h:14,
> | from rfstor.c:6:
> | rfstor.h:43: initializer element is not constant



This archive was generated by hypermail 2b25 : Mon Oct 25 2004 - 21:24:59 MSD