繁体   English   中英

如何编译和运行这个1989年编写的C程序?

[英]How can I compile and run this 1989 written C program?

我找到了亚瑟惠特尼这件神奇的作品 - 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上? 或其他什么?

我的谷歌搜索没有任何关联。

它将指针转换为intlong ,反之亦然。 这打破了64位架构,它们具有不同的大小。

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

我猜赌它因为这个而被分割出来:

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

如果没有声明malloc,那么它不会分配你的内存,你最终会取消引用null,这可能会导致seg错误。

包括:

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

printf()malloc()strlen()的警告消失了。 如果输入,代码将运行并运行:

1+1

注意间距在这里很重要

1 + 1 

将是段错误。

仅通过预处理器运行:

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

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

在我的系统(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,默认选项)和执行(使用正确的输入)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM