[問題] 到底錯在哪裡~.~
#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
→
06/10 04:37, , 1F
06/10 04:37, 1F
→
06/10 09:18, , 2F
06/10 09:18, 2F
※ 編輯: chrisjon 來自: 123.195.137.179 (06/11 00:38)
推
06/11 01:06, , 3F
06/11 01:06, 3F
→
06/11 01:06, , 4F
06/11 01:06, 4F
→
06/11 01:07, , 5F
06/11 01:07, 5F
→
06/11 01:08, , 6F
06/11 01:08, 6F
→
06/11 01:09, , 7F
06/11 01:09, 7F
→
06/11 01:09, , 8F
06/11 01:09, 8F
→
06/11 01:10, , 9F
06/11 01:10, 9F
這我之前有問過,有兩種宣告方式
long long和int64_t
不過聽說int64_t要新版的才有支援?
推
06/11 01:12, , 10F
06/11 01:12, 10F
推
06/11 01:14, , 11F
06/11 01:14, 11F
→
06/11 01:15, , 12F
06/11 01:15, 12F
→
06/11 01:15, , 13F
06/11 01:15, 13F
→
06/11 01:16, , 14F
06/11 01:16, 14F
怪了...通常計算後的最大值是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)
推
06/11 13:28, , 15F
06/11 13:28, 15F
→
06/11 13:28, , 16F
06/11 13:28, 16F
→
06/11 13:35, , 17F
06/11 13:35, 17F
不好意思....趕著上課,沒寫清楚..
2^32 = 42949672956
※ 編輯: chrisjon 來自: 120.125.72.28 (06/11 16:07)
推
06/11 17:55, , 18F
06/11 17:55, 18F
→
06/11 17:55, , 19F
06/11 17:55, 19F
→
06/11 17:56, , 20F
06/11 17:56, 20F
→
06/11 17:56, , 21F
06/11 17:56, 21F
→
06/11 17:57, , 22F
06/11 17:57, 22F
→
06/11 17:58, , 23F
06/11 17:58, 23F
推
06/11 18:00, , 24F
06/11 18:00, 24F
→
06/11 18:00, , 25F
06/11 18:00, 25F
→
06/11 18:11, , 26F
06/11 18:11, 26F
→
06/11 18:11, , 27F
06/11 18:11, 27F
→
06/11 18:12, , 28F
06/11 18:12, 28F
推
06/11 18:12, , 29F
06/11 18:12, 29F
→
06/11 18:12, , 30F
06/11 18:12, 30F
→
06/11 18:12, , 31F
06/11 18:12, 31F
→
06/11 18:14, , 32F
06/11 18:14, 32F
推
06/11 18:22, , 33F
06/11 18:22, 33F
→
06/11 18:23, , 34F
06/11 18:23, 34F
→
06/11 18:26, , 35F
06/11 18:26, 35F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章