作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [語法] 呼叫函數
時間Sun May 3 10:45:05 2009
※ 引述《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
推 chrisjon:lcg_seed 原始是寫 Lcg_seed,我的全程式就是那樣^^" 05/03 15:09
→ chrisjon:喔!!會錯意...我去生出程式碼,謝謝建議 05/03 15:20
→ chrisjon:我不知道有沒有支援...^^" 那要怎麼宣告呢? 05/03 15:33
→ chrisjon:我剛去試著改宣告成double lcg_seed,結果 %無法計算.. 05/03 15:34
→ chrisjon:把lcg_a和lcg_p一起改成double,一樣也無法計算%...~.~ 05/03 15:35
→ chrisjon:錯誤都一樣(invalid operand to binary %) 05/03 15:39
→ chrisjon:剛把lcg_seed丟到全域,又可以跑了...怪怪..只是一樣溢位 05/03 15:40
→ weiyucsie:我只知道c99有long long 可是有int64_t嗎? 05/03 16:14
→ sunneo:%的問題再很久以前的文章提過了 要用fmod 05/03 16:18
→ sunneo:浮點操作跟整數操作有差 05/03 16:19
→ sunneo:如果你這麼堅持要% 那乾脆(*(long long*)&變數1)%(變數2) 05/03 16:20
→ chrisjon:之前原本是以為要產生浮點數,後來發現好像不用 05/03 16:20
→ chrisjon:所以就把浮點數部份的程式刪除了,現在只是要整數就行了 05/03 16:21
→ chrisjon:用%是要求餘數,不是嗎? ^^" 05/03 16:23
→ chrisjon:int64_t 有用,剛剛去試了,執行成功,沒有溢位問題^^ 05/03 16:24
→ sunneo:%只有定義整數的餘數操作 沒有定義在浮點數上 05/03 16:24
→ chrisjon:(至少我剛的16807*lcg_seed mod (2^31-1)跑5次沒溢位) 05/03 16:25
→ chrisjon:嗯嗯!!sun大,我已經把浮點數的部份刪除了,所以改回用% 05/03 16:26
→ adrianshum:良好的寫法是單一行也加 { .. } 05/04 12:00