Re: [語法] 呼叫函數

看板C_and_CPP (C/C++)作者 (我要加入劍道社!)時間16年前 (2009/05/03 10:45), 編輯推噓1(1018)
留言19則, 4人參與, 最新討論串2/3 (看更多)
※ 引述《chrisjon (隨機數能吃嗎?)》之銘言: : ===========程式內容================== : #include <stdio.h> : void lcga(void) : { : static int Lcg_seed = 12345; : int lcg_a,lcg_p; : lcg_p = 2147483647; : lcg_a = 16807; : lcg_seed = (lcg_a*lcg_seed) % lcg_p; ^ ^ 大小寫不符合 這樣應該無法編譯成功 : printf("%d\n", Lcg_seed); : } : int main(void) : { : int i; : for(i=0; i<5;i++) : lcga(); : printf("%d\n", Lcg_seed); 寫程式不要這樣縮排,很容易以為你的 printf 也是迴圈的一部份 一般的良好寫法是這樣: for(i = 0; i < 5; i++) lcga(); printf("%d\n", Lcg_seed); : return 0; : } [deleted] : 我仿書上把lcg_seed在全區宣告,但是不知道為什麼 : 呼叫lcga,在lcga列印lcg_seed是 0;在main列印lcg_seed是12345不會變 : 所以試著用 static ,結果可以,但是變得無法在main print....(紅色那行) 應該是其它地方寫錯了,請附上完整程式碼 : 另外,我的程式中 : lcg_seed = (lcg_a*lcg_seed) % lcg_p; : 照道理來講,求出來的餘數應該永遠是正的 : 怎麼會出現負的答案呢...~.~?? : 我用Maple程式去跑答案,只有第一個答案是正確的,之後沒有一個正確 : 程式哪裡有問題呢?? 因為 int 一般來說大小為 32bit 儲存範圍是 -2147483648 ~ 2147483647 你的計算已經超過了它的範圍,當然會得到錯誤的結果 C99 的標準有提供 64bit 的整數型別 int64_t 如果你的 compiler 有支援,這是最簡單的解決方法 : ======================================== : 另外 : int main(void) : { : unif01_Gen *gen; : gen = ulcg_CreateLcg (2147483647, 397204094, 0, 12345); : retuen 0 : } : 我執行過相同的 ulcg_CreateLcg函數(包含後方的參數) : 它能產生不同的數字 : 我該如何 寫出像這樣的函數呢? 它可能用了 64bit 整數 或是自己去處理大數運算 : 是否直接用.txt寫好,存成.c 就可以用#include "lcga.c"呼叫了呢? : 感恩 不行,這不是正確用法。 正確的方法是把函式的宣告寫在 .h 內,函式的實作寫在 .c 內, 然後讓你的主程式去連結函式的實作 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.217.34.43

05/03 15:09, , 1F
lcg_seed 原始是寫 Lcg_seed,我的全程式就是那樣^^"
05/03 15:09, 1F

05/03 15:20, , 2F
喔!!會錯意...我去生出程式碼,謝謝建議
05/03 15:20, 2F

05/03 15:33, , 3F
我不知道有沒有支援...^^" 那要怎麼宣告呢?
05/03 15:33, 3F

05/03 15:34, , 4F
我剛去試著改宣告成double lcg_seed,結果 %無法計算..
05/03 15:34, 4F

05/03 15:35, , 5F
把lcg_a和lcg_p一起改成double,一樣也無法計算%...~.~
05/03 15:35, 5F

05/03 15:39, , 6F
錯誤都一樣(invalid operand to binary %)
05/03 15:39, 6F

05/03 15:40, , 7F
剛把lcg_seed丟到全域,又可以跑了...怪怪..只是一樣溢位
05/03 15:40, 7F

05/03 16:14, , 8F
我只知道c99有long long 可是有int64_t嗎?
05/03 16:14, 8F

05/03 16:18, , 9F
%的問題再很久以前的文章提過了 要用fmod
05/03 16:18, 9F

05/03 16:19, , 10F
浮點操作跟整數操作有差
05/03 16:19, 10F

05/03 16:20, , 11F
如果你這麼堅持要% 那乾脆(*(long long*)&變數1)%(變數2)
05/03 16:20, 11F

05/03 16:20, , 12F
之前原本是以為要產生浮點數,後來發現好像不用
05/03 16:20, 12F

05/03 16:21, , 13F
所以就把浮點數部份的程式刪除了,現在只是要整數就行了
05/03 16:21, 13F

05/03 16:23, , 14F
用%是要求餘數,不是嗎? ^^"
05/03 16:23, 14F

05/03 16:24, , 15F
int64_t 有用,剛剛去試了,執行成功,沒有溢位問題^^
05/03 16:24, 15F

05/03 16:24, , 16F
%只有定義整數的餘數操作 沒有定義在浮點數上
05/03 16:24, 16F

05/03 16:25, , 17F
(至少我剛的16807*lcg_seed mod (2^31-1)跑5次沒溢位)
05/03 16:25, 17F

05/03 16:26, , 18F
嗯嗯!!sun大,我已經把浮點數的部份刪除了,所以改回用%
05/03 16:26, 18F

05/04 12:00, , 19F
良好的寫法是單一行也加 { .. }
05/04 12:00, 19F
文章代碼(AID): #19_GKqMy (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
2
4
以下文章回應了本文
完整討論串 (本文為第 2 之 3 篇):
2
4
文章代碼(AID): #19_GKqMy (C_and_CPP)