[問題] 到底錯在哪裡~.~

看板C_and_CPP (C/C++)作者 (語言轉換真麻煩)時間16年前 (2009/06/10 04:36), 編輯推噓8(8027)
留言35則, 3人參與, 最新討論串1/1
#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
真是簡單又明顯的錯誤...謝謝Orz
06/10 09:18, 2F
※ 編輯: chrisjon 來自: 123.195.137.179 (06/11 00:38)

06/11 01:06, , 3F
黃色那個, 代表你的const 4xxx數字太大, 不是預設const
06/11 01:06, 3F

06/11 01:06, , 4F
value (int)放的下的, 再數字後面加上UL試試, 就像這樣
06/11 01:06, 4F

06/11 01:07, , 5F
123456UL <-這樣; UL還是LU啊?? 其實32bit的環境應該只
06/11 01:07, 5F

06/11 01:08, , 6F
加U也行....
06/11 01:08, 6F

06/11 01:09, , 7F
等等, 我錯了, 你寫那個數超過0xFFFFFFFFU了, 也就是這
06/11 01:09, 7F

06/11 01:09, , 8F
個整數根本超過32bit能表達的最大範圍, 可能要依環境找
06/11 01:09, 8F

06/11 01:10, , 9F
64bit int的解決方案.... (int64?? long long??)
06/11 01:10, 9F
這我之前有問過,有兩種宣告方式 long long和int64_t 不過聽說int64_t要新版的才有支援?

06/11 01:12, , 10F
google一下好像是用 12345LL 這樣....
06/11 01:12, 10F

06/11 01:14, , 11F
第二個error就單純para變數不存在, 既然不是local var,
06/11 01:14, 11F

06/11 01:15, , 12F
看這個用法八成是global var, 找一下這個變數在哪定義的
06/11 01:15, 12F

06/11 01:15, , 13F
要是不存在, 那你就得搞清楚para到底是哪來的東西....
06/11 01:15, 13F

06/11 01:16, , 14F
要是存在, 可能要多宣告個extern該變數吧....??
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
您可能誤算了, 0~2^31-1, 所以最大只能到4294967295....
06/11 13:28, 15F

06/11 13:28, , 16F
個位數字是5, 6的話已經是 0x100000000了....:)
06/11 13:28, 16F

06/11 13:35, , 17F
可表達 4294967296 個整數, 但最大的數是 4294967295 :)
06/11 13:35, 17F
不好意思....趕著上課,沒寫清楚.. 2^32 = 42949672956 ※ 編輯: chrisjon 來自: 120.125.72.28 (06/11 16:07)

06/11 17:55, , 18F
Hm~小弟我的意思是, 下面這個warning....
06/11 17:55, 18F

06/11 17:55, , 19F
warning: integer constant is too large for "long"
06/11 17:55, 19F

06/11 17:56, , 20F
應該就是因為您用了 4294967296 這個值當CONST, 而這個
06/11 17:56, 20F

06/11 17:56, , 21F
值超過了32 bit表達數的上限了, 所以才發了warning給您.
06/11 17:56, 21F

06/11 17:57, , 22F
至於那個綠色的 para 找不到的問題, 您可能search整個
06/11 17:57, 22F

06/11 17:58, , 23F
project所有code找找看吧, error就是沒定義過它啊.
06/11 17:58, 23F

06/11 18:00, , 24F
那個 4294967296 跟誰產生的沒有關係, 而是您code裡自己
06/11 18:00, 24F

06/11 18:00, , 25F
就寫的一個定值在那裡, compiler警告你它太大了而已.
06/11 18:00, 25F

06/11 18:11, , 26F
warning 那個解決了,重新看一下說明書再比較
06/11 18:11, 26F

06/11 18:11, , 27F
發現只畏把4294967296加一個.0就解決了
06/11 18:11, 27F

06/11 18:12, , 28F
另外para那個,有人跟我說是seed 只是區域變數
06/11 18:12, 28F

06/11 18:12, , 29F
加一個.0是直接轉成double用喔....
06/11 18:12, 29F

06/11 18:12, , 30F
所以不用delete
06/11 18:12, 30F

06/11 18:12, , 31F
所以我把那行當註解 //掉 compile過了,但...不會跑..囧"
06/11 18:12, 31F

06/11 18:14, , 32F
可是我參考的文是這樣寫的啊...compile也沒問題...~.~"
06/11 18:14, 32F

06/11 18:22, , 33F
好吧, 我沒仔細看code研究演算法, 只能單純就語法上與
06/11 18:22, 33F

06/11 18:23, , 34F
compiler丟的訊息瞎給意見, 再來的就沒辦法了....Orz
06/11 18:23, 34F

06/11 18:26, , 35F
嗯嗯!!感恩!! 謝謝^^
06/11 18:26, 35F
文章代碼(AID): #1ABiVX-r (C_and_CPP)
文章代碼(AID): #1ABiVX-r (C_and_CPP)