Re: [語法] 關於陣列裡的陣列
看板C_and_CPP (C/C++)作者littleshan (我要加入劍道社!)時間15年前 (2009/04/27 17:36)推噓31(31推 0噓 116→)留言147則, 16人參與討論串2/3 (看更多)
因為有人推文認為我在酸人
我只好一行一行來解釋你的 code 有哪些問題
※ 引述《seedpk5079 (fhcrc 99th ooxx)》之銘言:
: #include<stdio.h>
: #include<string.h>
: #include<stdlib.h>
: typedef struct big_number{
: int number;
: big_number(){
: int number[50]={};
: }
: };
首先這邊讓人搞不太清楚你是在寫 C 或是在寫 C++。
若你要用 C,就不能寫 constructor,因為那是 C++ 才有的功能。
若你要用 C++,就別再用舊式的 C 寫法,C++ 不需要針對每個 struct 去 typedef。
然後 stdio.h、string.h、stdlib.h 改成 cstdio、cstring、cstdlib 會比較標準。
再來,你的 number 到底是陣列還是單純的整數?
從你後面的 code 來看,number 應該要宣告成陣列,所以你的定義應該改成:
#include <algorithm>
struct big_number {
int number[50];
big_number()
{
std::fill(number, number+50, 0);
}
};
我們沒辦法直接用等號來清空陣列的全部元素,所以用 std::fill 來把每個元素
填為 0。這個做法會比用 memset 好一點。
: int b;
: struct big_number dp[120];
: struct big_number *w,*e;
像 b、w、e 這類沒有意義的名稱,絕對不應拿來宣告為全域變數。
: void first(void){/*進行費氏最初2項初始化*/
: dp[0].number[0]=1;
: dp[1].number[0]=1;
: }
: int *t,*tt,ll,*replace,*rr;
: int get_number(int *t){
: int v;
: for(v=0;t[v]!=0;++v){}
: return v;
: }
: void give(int* replace,int *rr){
: int z;
: for(z=0;z<50;++z){
: rr[z]=replace[z];
: }
: }
你把 t、tt、ll、replace、rr 都宣告為全域變數,
然而又用相同的名稱去宣告函式的參數,
我看不出你這樣做的用意何在。
: int * string_reversal(int *tt,int ll){
: int ttt[50]={},tttt=0;
: if(tt[ll]==0){
: ll--;
: }
: for(;ll>=0;ll--){
: ttt[tttt]=tt[ll];
: tttt++;
: }
: return ttt;
: }
這邊是個明顯的錯誤,ttt 並非靜態變數,它的生命週期在 return 後就會
結束。回傳 ttt 將導致未定義的結果 (通常是你的變數內容莫名奇妙被毀)。
: int * add(int *w,int *e){
: int total[50]={},i,j,k,h,m,l=0;
: i=get_number(w);
: j=get_number(e);
: i--;j--;
: give(string_reversal(w,i),w);
: give(string_reversal(e,j),e);
: k=((i>=j)?i:j);
: for(m=0;m<=k;++m){
: total[l]=w[m]+e[m]+total[l];
: if(total[l]>=10){
: total[l+1]=total[l]/10;
: total[l]=total[l]%10;
: }
: l++;
: }
: give(string_reversal(total,l),total);
: return total;
: }
這邊的錯誤和前面一樣,total 是區域變數陣列,你不應該拿來回傳。
另外因為你的變數名稱幾乎都沒有意義,我很難看出這段 code 是否有錯誤。
: int* Fibonacc(int b){
: if(b==1||b==2){
: return dp[0]->number;
: }
: else if(dp[b].number[0]<10&&dp[b]->number[0]>0){
: return dp[b]->number;
: }
: else{
: give(add(Fibonacc(b-1),Fibonacc(b-2)),dp[b]->number);
: return dp[b]->number;
: }
: }
這邊 return dp[b]->number 是可以的,因為 dp 是全域變數。
但這樣做不是好的設計,因為接受端很容易誤用得到的記憶體。
: int main(){
: int n;
: while(scanf("%d",&n)!=EOF ){
: int day=0,number=0,u,*o,mm[50]={},cc[50]={};
: first();
: mm[0]=9;mm[1]=2;cc[0]=1;cc[1]=9;
: o=add(mm,cc);
: printf("\n");
: for(u=0;u<50;++u){
: printf("%d",o[u]);
: }
: }
: return 0;
: }
最後的問題,程式碼最好進行縮排,這樣也容易讓你一眼就看出程式結構。
上面的 main 經過適當排版後如下:
int main(){
int n;
while(scanf("%d", &n) != EOF){
int day = 0, number = 0;
int mm[50] = {9, 2};
int cc[50] = {1, 9};
first();
int* o = add(mm, cc);
printf("\n");
for(int u = 0; u < 50; ++u){
printf("%d", o[u]);
}
}
return 0;
}
這樣看起來會比較清楚。當然你的程式還是有問題,最主要出在你把區域陣列
直接回傳的部份。雖然我可以直接寫一個 big_number 的 class 出來讓你當正
確答案參考,但這樣對你沒有幫助。建議你還是再重頭念一次你的 C++ 教科書,
了解之前的 code 錯在哪裡,再繼續寫這支程式。
: 以上是我寫的程式碼
: 內容是要把費氏數列做大數跟DP
: 可是我現在卡在紅色那幾行
: 到底要怎麼做才能把結構裡的陣列抓出來用啊...
: 希望會的人能幫忙解答一下XD
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.9.6.2
推
04/27 17:43, , 1F
04/27 17:43, 1F
→
04/27 17:43, , 2F
04/27 17:43, 2F
推
04/27 17:51, , 3F
04/27 17:51, 3F
→
04/27 17:51, , 4F
04/27 17:51, 4F
推
04/27 18:01, , 5F
04/27 18:01, 5F
→
04/27 18:02, , 6F
04/27 18:02, 6F
→
04/27 18:11, , 7F
04/27 18:11, 7F
→
04/27 18:11, , 8F
04/27 18:11, 8F
推
04/27 18:19, , 9F
04/27 18:19, 9F
推
04/27 18:19, , 10F
04/27 18:19, 10F
→
04/27 18:19, , 11F
04/27 18:19, 11F
→
04/27 18:20, , 12F
04/27 18:20, 12F
→
04/27 18:20, , 13F
04/27 18:20, 13F
→
04/27 18:20, , 14F
04/27 18:20, 14F
→
04/27 18:22, , 15F
04/27 18:22, 15F
→
04/27 18:23, , 16F
04/27 18:23, 16F
推
04/27 18:23, , 17F
04/27 18:23, 17F
→
04/27 18:23, , 18F
04/27 18:23, 18F
推
04/27 18:24, , 19F
04/27 18:24, 19F
→
04/27 18:24, , 20F
04/27 18:24, 20F
推
04/27 18:24, , 21F
04/27 18:24, 21F
→
04/27 18:24, , 22F
04/27 18:24, 22F
→
04/27 18:24, , 23F
04/27 18:24, 23F
→
04/27 18:25, , 24F
04/27 18:25, 24F
→
04/27 18:25, , 25F
04/27 18:25, 25F
→
04/27 18:25, , 26F
04/27 18:25, 26F
→
04/27 18:25, , 27F
04/27 18:25, 27F
→
04/27 18:26, , 28F
04/27 18:26, 28F
→
04/27 18:26, , 29F
04/27 18:26, 29F
推
04/27 18:26, , 30F
04/27 18:26, 30F
→
04/27 18:26, , 31F
04/27 18:26, 31F
→
04/27 18:27, , 32F
04/27 18:27, 32F
→
04/27 18:27, , 33F
04/27 18:27, 33F
推
04/27 18:30, , 34F
04/27 18:30, 34F
→
04/27 18:30, , 35F
04/27 18:30, 35F
→
04/27 18:33, , 36F
04/27 18:33, 36F
→
04/27 18:33, , 37F
04/27 18:33, 37F
推
04/27 18:35, , 38F
04/27 18:35, 38F
→
04/27 18:35, , 39F
04/27 18:35, 39F
還有 68 則推文
→
04/27 20:37, , 108F
04/27 20:37, 108F
→
04/27 20:38, , 109F
04/27 20:38, 109F
推
04/27 20:40, , 110F
04/27 20:40, 110F
→
04/27 20:40, , 111F
04/27 20:40, 111F
→
04/27 20:41, , 112F
04/27 20:41, 112F
→
04/27 20:42, , 113F
04/27 20:42, 113F
→
04/27 20:42, , 114F
04/27 20:42, 114F
→
04/27 20:43, , 115F
04/27 20:43, 115F
推
04/27 20:43, , 116F
04/27 20:43, 116F
→
04/27 20:43, , 117F
04/27 20:43, 117F
→
04/27 20:44, , 118F
04/27 20:44, 118F
→
04/27 20:45, , 119F
04/27 20:45, 119F
→
04/27 20:46, , 120F
04/27 20:46, 120F
推
04/27 20:51, , 121F
04/27 20:51, 121F
→
04/27 20:51, , 122F
04/27 20:51, 122F
→
04/27 21:21, , 123F
04/27 21:21, 123F
推
04/27 21:58, , 124F
04/27 21:58, 124F
→
04/28 12:41, , 125F
04/28 12:41, 125F
推
04/28 12:44, , 126F
04/28 12:44, 126F
→
04/28 12:45, , 127F
04/28 12:45, 127F
→
04/28 12:45, , 128F
04/28 12:45, 128F
→
04/28 12:45, , 129F
04/28 12:45, 129F
→
04/28 12:46, , 130F
04/28 12:46, 130F
→
04/28 12:46, , 131F
04/28 12:46, 131F
→
04/28 12:47, , 132F
04/28 12:47, 132F
→
04/28 12:48, , 133F
04/28 12:48, 133F
→
04/28 12:48, , 134F
04/28 12:48, 134F
→
04/28 12:49, , 135F
04/28 12:49, 135F
→
04/28 12:50, , 136F
04/28 12:50, 136F
→
04/28 12:50, , 137F
04/28 12:50, 137F
→
04/28 12:50, , 138F
04/28 12:50, 138F
→
04/28 13:31, , 139F
04/28 13:31, 139F
→
04/28 13:32, , 140F
04/28 13:32, 140F
→
04/28 13:33, , 141F
04/28 13:33, 141F
→
04/28 13:33, , 142F
04/28 13:33, 142F
→
04/28 13:35, , 143F
04/28 13:35, 143F
→
04/28 13:35, , 144F
04/28 13:35, 144F
→
04/28 13:36, , 145F
04/28 13:36, 145F
推
04/28 14:08, , 146F
04/28 14:08, 146F
推
04/28 17:53, , 147F
04/28 17:53, 147F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章