作者chrisjon (语言转换真麻烦)
看板C_and_CPP
标题[问题] 到底错在哪里~.~
时间Wed Jun 10 04:36:46 2009
#include "unif01.h"
#include "util.h"
#include "addstr.h"
#include "gdef.h"
#include "num.h"
#include "bbattery.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
typedef unsigned long long b64;
typedef struct {
int p, k, m1, m2, d;
b64 *seed;
double minv;
}md_para;
typedef struct {
int mdi,mda,mdb,mdc,mdj;
}md_index;
(中删)
static unsigned long mdx_Bits(void *vpar,void *vind)
{
return (unsigned long)(4294967296*mdx_pro(vpar,vind));
}
(中删)
void Chris_DeleteMdx(unif01_Gen *gen)
{
md_para *index;
if(NULL==gen)return;
index = gen->state;
util_Free(para->seed);
gen->state = util_Free(gen->state);
gen->param = util_Free(gen->param);
gen->name = util_Free(gen->name);
util_Free(gen);
}
==============================================
cygwin环境
compile之後,出现的错误讯息
warning: integer constant is too large for "long" type
error 'para' undeclcared (first use in this function)
(Each undeclared identifier is reported only once
for each function it appears in.)
请问一下,这两段的问题出在哪??
bug一直de不掉,仿另一篇,但原始的不会有第2项错误....
感恩
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.195.137.179
1F:→ iscu:; 06/10 04:37
2F:→ chrisjon:真是简单又明显的错误...谢谢Orz 06/10 09:18
※ 编辑: chrisjon 来自: 123.195.137.179 (06/11 00:38)
3F:推 VictorTom:黄色那个, 代表你的const 4xxx数字太大, 不是预设const 06/11 01:06
4F:→ VictorTom:value (int)放的下的, 再数字後面加上UL试试, 就像这样 06/11 01:06
5F:→ VictorTom:123456UL <-这样; UL还是LU啊?? 其实32bit的环境应该只 06/11 01:07
6F:→ VictorTom:加U也行.... 06/11 01:08
7F:→ VictorTom:等等, 我错了, 你写那个数超过0xFFFFFFFFU了, 也就是这 06/11 01:09
8F:→ VictorTom:个整数根本超过32bit能表达的最大范围, 可能要依环境找 06/11 01:09
9F:→ VictorTom:64bit int的解决方案.... (int64?? long long??) 06/11 01:10
这我之前有问过,有两种宣告方式
long long和int64_t
不过听说int64_t要新版的才有支援?
10F:推 VictorTom:google一下好像是用 12345LL 这样.... 06/11 01:12
11F:推 VictorTom:第二个error就单纯para变数不存在, 既然不是local var, 06/11 01:14
12F:→ VictorTom:看这个用法八成是global var, 找一下这个变数在哪定义的 06/11 01:15
13F:→ VictorTom:要是不存在, 那你就得搞清楚para到底是哪来的东西.... 06/11 01:15
14F:→ VictorTom:要是存在, 可能要多宣告个extern该变数吧....?? 06/11 01:16
怪了...通常计算後的最大值是2^31-1
而mdx_pro产出来的值是X/p,p为2^31-1,而X范围在0~p
-1
(也就是X/p是介於
0<=x<1之间的小数,也就是"不可能出现1")
照理用unsigned int 应该可用数是0~2^32-1...也就是上面说的4294967296-1
(2^32)*x,不可能会出现2^32(因为x一定是小於1的小数)
我把mdx_pro的程式码贴回来好了...
(因为指标太多,看起来很花,问完就删掉了^^"把括号加上颜色应该比较好看范围)
以下接在上程式码中,红色"中删"的位置
#define DMOD(n,p)((n)%(p))
static double mdx_pro(void *vpar,void *vind)
{
md_para *para = vpar;
md_index *index = vind;
if(++index->mdi==para->k){index->mdi=0;} //计算第i-1项指标
index->mdj=(index->mdi+1)%para->k; //计算计算第i-k-1项指标
index->mda=(index->mdi+2)%para->k; //计算计算第i-k项指标
if(index->mdi==0) //计算第i-2项指标
{index->mdb=para->k-1;}
else{index->mdb=index->mdi-1;}
para->seed[index->mdj] =
DMOD(DMOD(para->seed[index->mdi] +
para->m1*(para->seed[index->mdi] + para->p - para->seed[index->mdj]),para->p
)+
DMOD(para->d*(para->seed[index->mda]+para->p-para->seed[index->mdb]),para->p
)
,para->p
);
return ((double)para->seed[index->mdj]+0.5)*para->minv;
}
麻烦各位先进再帮忙看了,感谢
※ 编辑: chrisjon 来自: 123.195.137.179 (06/11 12:11)
15F:推 VictorTom:您可能误算了, 0~2^31-1, 所以最大只能到4294967295.... 06/11 13:28
16F:→ VictorTom:个位数字是5, 6的话已经是 0x100000000了....:) 06/11 13:28
17F:→ VictorTom:可表达 4294967296 个整数, 但最大的数是 4294967295 :) 06/11 13:35
不好意思....赶着上课,没写清楚..
2^32 = 42949672956
※ 编辑: chrisjon 来自: 120.125.72.28 (06/11 16:07)
18F:推 VictorTom:Hm~小弟我的意思是, 下面这个warning.... 06/11 17:55
19F:→ VictorTom:warning: integer constant is too large for "long" 06/11 17:55
20F:→ VictorTom:应该就是因为您用了 4294967296 这个值当CONST, 而这个 06/11 17:56
21F:→ VictorTom:值超过了32 bit表达数的上限了, 所以才发了warning给您. 06/11 17:56
22F:→ VictorTom:至於那个绿色的 para 找不到的问题, 您可能search整个 06/11 17:57
23F:→ VictorTom:project所有code找找看吧, error就是没定义过它啊. 06/11 17:58
24F:推 VictorTom:那个 4294967296 跟谁产生的没有关系, 而是您code里自己 06/11 18:00
25F:→ VictorTom:就写的一个定值在那里, compiler警告你它太大了而已. 06/11 18:00
26F:→ chrisjon:warning 那个解决了,重新看一下说明书再比较 06/11 18:11
27F:→ chrisjon:发现只畏把4294967296加一个.0就解决了 06/11 18:11
28F:→ chrisjon:另外para那个,有人跟我说是seed 只是区域变数 06/11 18:12
29F:推 VictorTom:加一个.0是直接转成double用喔.... 06/11 18:12
30F:→ chrisjon:所以不用delete 06/11 18:12
31F:→ chrisjon:所以我把那行当注解 //掉 compile过了,但...不会跑..囧" 06/11 18:12
32F:→ chrisjon:可是我参考的文是这样写的啊...compile也没问题...~.~" 06/11 18:14
33F:推 VictorTom:好吧, 我没仔细看code研究演算法, 只能单纯就语法上与 06/11 18:22
34F:→ VictorTom:compiler丢的讯息瞎给意见, 再来的就没办法了....Orz 06/11 18:23
35F:→ chrisjon:嗯嗯!!感恩!! 谢谢^^ 06/11 18:26