作者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
1F:推 chrisjon:lcg_seed 原始是写 Lcg_seed,我的全程式就是那样^^" 05/03 15:09
2F:→ chrisjon:喔!!会错意...我去生出程式码,谢谢建议 05/03 15:20
3F:→ chrisjon:我不知道有没有支援...^^" 那要怎麽宣告呢? 05/03 15:33
4F:→ chrisjon:我刚去试着改宣告成double lcg_seed,结果 %无法计算.. 05/03 15:34
5F:→ chrisjon:把lcg_a和lcg_p一起改成double,一样也无法计算%...~.~ 05/03 15:35
6F:→ chrisjon:错误都一样(invalid operand to binary %) 05/03 15:39
7F:→ chrisjon:刚把lcg_seed丢到全域,又可以跑了...怪怪..只是一样溢位 05/03 15:40
8F:→ weiyucsie:我只知道c99有long long 可是有int64_t吗? 05/03 16:14
9F:→ sunneo:%的问题再很久以前的文章提过了 要用fmod 05/03 16:18
10F:→ sunneo:浮点操作跟整数操作有差 05/03 16:19
11F:→ sunneo:如果你这麽坚持要% 那乾脆(*(long long*)&变数1)%(变数2) 05/03 16:20
12F:→ chrisjon:之前原本是以为要产生浮点数,後来发现好像不用 05/03 16:20
13F:→ chrisjon:所以就把浮点数部份的程式删除了,现在只是要整数就行了 05/03 16:21
14F:→ chrisjon:用%是要求余数,不是吗? ^^" 05/03 16:23
15F:→ chrisjon:int64_t 有用,刚刚去试了,执行成功,没有溢位问题^^ 05/03 16:24
16F:→ sunneo:%只有定义整数的余数操作 没有定义在浮点数上 05/03 16:24
17F:→ chrisjon:(至少我刚的16807*lcg_seed mod (2^31-1)跑5次没溢位) 05/03 16:25
18F:→ chrisjon:嗯嗯!!sun大,我已经把浮点数的部份删除了,所以改回用% 05/03 16:26
19F:→ adrianshum:良好的写法是单一行也加 { .. } 05/04 12:00