看板 C_and_CPP 關於我們 聯絡資訊
#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
iscu:; 06/10 04:37
chrisjon:真是簡單又明顯的錯誤...謝謝Orz 06/10 09:18
※ 編輯: chrisjon 來自: 123.195.137.179 (06/11 00:38)
VictorTom:黃色那個, 代表你的const 4xxx數字太大, 不是預設const 06/11 01:06
VictorTom:value (int)放的下的, 再數字後面加上UL試試, 就像這樣 06/11 01:06
VictorTom:123456UL <-這樣; UL還是LU啊?? 其實32bit的環境應該只 06/11 01:07
VictorTom:加U也行.... 06/11 01:08
VictorTom:等等, 我錯了, 你寫那個數超過0xFFFFFFFFU了, 也就是這 06/11 01:09
VictorTom:個整數根本超過32bit能表達的最大範圍, 可能要依環境找 06/11 01:09
VictorTom:64bit int的解決方案.... (int64?? long long??) 06/11 01:10
這我之前有問過,有兩種宣告方式 long long和int64_t 不過聽說int64_t要新版的才有支援?
VictorTom:google一下好像是用 12345LL 這樣.... 06/11 01:12
VictorTom:第二個error就單純para變數不存在, 既然不是local var, 06/11 01:14
VictorTom:看這個用法八成是global var, 找一下這個變數在哪定義的 06/11 01:15
VictorTom:要是不存在, 那你就得搞清楚para到底是哪來的東西.... 06/11 01:15
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)
VictorTom:您可能誤算了, 0~2^31-1, 所以最大只能到4294967295.... 06/11 13:28
VictorTom:個位數字是5, 6的話已經是 0x100000000了....:) 06/11 13:28
VictorTom:可表達 4294967296 個整數, 但最大的數是 4294967295 :) 06/11 13:35
不好意思....趕著上課,沒寫清楚.. 2^32 = 42949672956 ※ 編輯: chrisjon 來自: 120.125.72.28 (06/11 16:07)
VictorTom:Hm~小弟我的意思是, 下面這個warning.... 06/11 17:55
VictorTom:warning: integer constant is too large for "long" 06/11 17:55
VictorTom:應該就是因為您用了 4294967296 這個值當CONST, 而這個 06/11 17:56
VictorTom:值超過了32 bit表達數的上限了, 所以才發了warning給您. 06/11 17:56
VictorTom:至於那個綠色的 para 找不到的問題, 您可能search整個 06/11 17:57
VictorTom:project所有code找找看吧, error就是沒定義過它啊. 06/11 17:58
VictorTom:那個 4294967296 跟誰產生的沒有關係, 而是您code裡自己 06/11 18:00
VictorTom:就寫的一個定值在那裡, compiler警告你它太大了而已. 06/11 18:00
chrisjon:warning 那個解決了,重新看一下說明書再比較 06/11 18:11
chrisjon:發現只畏把4294967296加一個.0就解決了 06/11 18:11
chrisjon:另外para那個,有人跟我說是seed 只是區域變數 06/11 18:12
VictorTom:加一個.0是直接轉成double用喔.... 06/11 18:12
chrisjon:所以不用delete 06/11 18:12
chrisjon:所以我把那行當註解 //掉 compile過了,但...不會跑..囧" 06/11 18:12
chrisjon:可是我參考的文是這樣寫的啊...compile也沒問題...~.~" 06/11 18:14
VictorTom:好吧, 我沒仔細看code研究演算法, 只能單純就語法上與 06/11 18:22
VictorTom:compiler丟的訊息瞎給意見, 再來的就沒辦法了....Orz 06/11 18:23
chrisjon:嗯嗯!!感恩!! 謝謝^^ 06/11 18:26