2013-02-04 66 views
2

我創建了一個結構爲:scanf()的和在Turbo浮點數Ç

typedef struct { 
    float real, img; 
} cmplx; 

和創建的函數爲:

void input(cmplx *a){ 
    scanf("%f + %f i", &a->real, &a->img); } 

和從主作爲調用的函數:

cmplx a; 
input(&a); 

執行到達scanf時停止。如果浮點數被整數替換,問題就解決了。這是什麼行爲?有沒有辦法讓我的問題可以使用float?

程序被編譯上的Turbo C,在MS-WINDOWS XP

+0

您對該計劃有何建議? – rasmus

+0

(a)檢查'scanf()'返回的值;它會告訴你有多少轉換工作。 (b)您的C運行時庫是否自動支持浮點操作,還是必須告訴編譯器與啓用了浮點的庫鏈接?轉換成Mac OS X上的可運行代碼,它在給定有效輸入的情況下工作正常。 –

+0

有沒有我可以寫的任何代碼來告訴編譯器鏈接浮點庫?或者我們應該編譯器params – cipher

回答

2

如果不知道程序執行停止的錯誤信息很難回答,但從您的評論「有任何代碼可以編寫來告訴編譯器鏈接浮點庫」, 我懷疑它可能是this issue

「浮點格式不連接的」 是一個Borland的運行時錯誤(Borland公司 C或C++,渦輪C或C++)。除非你需要,Borland的編譯器試圖變得聰明,而不是浮點(f-p)庫中的鏈接。唉,他們 都得到了錯誤的決定。一種常見的情況是,你不叫任何 F-P功能,但你必須%F或其他法布里 - 珀羅格式在scanf()或 printf()的調用。治癒的方法是調用一個f-p函數,或者至少強制鏈接中存在一個f-p函數。

爲了做到這一點,在源文件中某處定義此功能,但不 稱之爲:

static void forcefloat(float *p) 
{ 
    float f = *p; 
    forcefloat(&f); 
} 

它並不必須與主程序模塊中,只要 它在一個將包含在鏈接中的模塊中。

如果你用Borland C++ 3.0,README文件記錄了略少 醜陋的變通。在你的程序中插入這些語句:

extern unsigned _floatconvert; 
#pragma extref _floatconvert 

使用此解決方案,或更現代的編譯器,可能會解決您的問題。

1

問題是使用多年的舊的C編譯器一樣TURBOC,因爲這對我來說工作正常(我使用DEVC++) 檢查this discussion類似的問題

+1

它的強制。 – cipher

+0

強迫什麼?使用傳統的TurboC編譯器 – exexzian

+0

我建議 - 升級到現代編譯器 – exexzian