8

我发现了 Arthur Whitney 的这部惊人的作品 - http://www.jsoftware.com/jwiki/Essays/Incunabulum

它编译时带有一些警告

$ gcc-4.7 incuna.c -o incuna.o
incuna.c: In function 'ma':
incuna.c:8:15: warning: incompatible implicit declaration of built-in function 'malloc' [enabled by default]
incuna.c: In function 'pi':
incuna.c:26:7: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]
incuna.c: In function 'nl':
incuna.c:26:24: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]
incuna.c: In function 'pr':
incuna.c:28:10: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]
incuna.c: In function 'ex':
incuna.c:35:36: warning: assignment makes integer from pointer without a cast [enabled by default]
incuna.c:35:25: warning: return makes pointer from integer without a cast [enabled by default]
incuna.c: In function 'noun':
incuna.c:37:57: warning: return makes integer from pointer without a cast [enabled by default]
incuna.c: In function 'wd':
incuna.c:39:21: warning: incompatible implicit declaration of built-in function 'strlen' [enabled by default]

但它在输入基本输入时出现段错误1 + 1

./incuna.o
warning: this program uses gets(), which is unsafe.
1 + 1
[1]    11525 segmentation fault  ./incuna.o

我猜这与自 1989 年以来 C 编译器的差异有关。

我怎么能运行这个?我可以在最近的 Linux/Mac 上使用它吗?还是在 VirtualBox VM 上?还是别的什么?

我的谷歌搜索结果没有任何相关。

4

4 回答 4

9

它将指针转换为intlong反之亦然。这与它们具有不同大小的 64 位体系结构不同。

为 32 位目标编译它。例如,在 Mac OS X 上使用 clang/LLVM 使用“-arch i386”。

于 2012-12-11T19:40:04.553 回答
4

我敢打赌它是因为这个而出现段错误的:

incuna.c:8:15:警告:内置函数“malloc”的隐式声明不兼容 [默认启用]

如果 malloc 未声明,那么它不会为您分配内存,您最终会取消引用 null,这可能导致段错误。

包括后:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

printf()malloc()和的警告strlen()消失了。如果您输入以下内容,代码将运行并工作:

1+1

注意间距在这里很重要:

1 + 1 

会段错误。

于 2012-12-11T19:33:07.697 回答
4

仅通过预处理器运行它:

gcc -E interp.c > interp-pp.c

然后在编辑器中美化它,然后使用调试器来观察它的作用。

于 2012-12-11T20:19:08.163 回答
2

在我的系统(AMD64 Win 8)上,似乎指针值通常设置了最高位,因此将指针视为整数(该程序会这样做)会出现异常并崩溃。

更改qv(a)函数(“查询动词”)允许程序运行:

qv(a){R a<'a';}

应该

qv(a){R a<'a'&&a>0;}

或者

qv(a)unsigned a;{R a<'a';}

这是一个最小修改版本的链接,它应该在没有警告的情况下编译(使用 gcc,默认选项)并执行(使用正确的输入)。

于 2014-03-18T06:55:58.580 回答