簡體   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