[問題] 用class宣告的方法運算動態陣列

作者: moussorgsky (法國號有氣質)   2015-07-23 00:40:24
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
問題(Question):
我在網路上找到用class寫動態陣列的方法了,不過我還是不知道如何傳到另一個
副程式去做運算 @@"
請會的大大指教一下,謝謝!
(請看下面的程式碼)
假設要做運算的副程式名稱是cal(),內容就是a矩陣+b矩陣
請問該如何宣告、呼叫、還有寫副程式本身呢?
餵入的資料(Input):
預期的正確結果(Expected Output):
錯誤結果(Wrong Output):
程式碼(Code):(請善用置底文網頁, 記得排版)
#include <iostream>
using std::cout;
using std::cin;
using std::ios;
using std::cerr;
using std::endl;
#include <stdio.h>
#include <fstream>
using namespace std;
using std::ifstream;
using std::ofstream;
#include <cstdlib>
#include <math.h>
void read_obstacles();
ifstream inobst("obst.txt", ios::in);
//##############################################################################
void* malloc2d( int w, int h, int size )
{
int j;
void **a = (void**) malloc( h*sizeof(void*) + w*h*size );
for( j=0; j<h; j++ )
a[j] = ((char *)(a+h)) + j*w*size;
return a;
}
class Array2D
{
public:
int w, h;
int **m;
Array2D( int width, int height )
{
w = width;
h = height;
m = (int**)malloc2d(w,h,sizeof(int));
}
~Array2D(){free(m);}
};
void main()
{
Array2D a(3, 5);
Array2D b(3, 5);
int i, j;
for( j=0; j<a.h; j++ ){
for( i=0; i<a.w; i++ ){
a.m[j][i] = j*a.w+i;
b.m[j][i] = j*2*b.w+i;
}
}
for( j=0; j<a.h; j++ )
{
for( i=0; i<a.w; i++ )
printf( "%i ", a.m[j][i] );
printf( "\n" );
}
for( j=0; j<b.h; j++ )
{
for( i=0; i<b.w; i++ )
printf( "%i ", b.m[j][i] );
printf( "\n" );
}
system("pause");
}
補充說明(Supplement):
作者: BlazarArc (Midnight Sun)   2015-07-23 00:51:00
去找一本書把function pass argument的地方看完吧...http://ideone.com/MVmYhc 參考一下
作者: theWANDERER (癡、肥、蠢、宅)   2015-07-23 13:10:00
同樓上講的,你對pass argument還是不夠清楚以外你如果想要把2D array做成class,你會想把你這cal()做成一個class method
作者: Feis (永遠睡不著 @@)   2015-07-23 13:27:00
要不要變成成員倒是不一定
作者: moussorgsky (法國號有氣質)   2015-07-23 15:41:00
我在網路上看到有人的建議是:把多維陣列用一維的方式傳進副程式,然後在副程式裡再轉成多維陣列下去做運算,然後再傳回主程式我剛剛有試了一下,在副程式裡可以另外產生新的動態陣列,這樣應該可以把原本的多維陣列用一維的方式傳進副程式裡,然後轉存到在副程式裡產生的新的動態多維陣列,做完運算再傳回主程式
作者: BlazarArc (Midnight Sun)   2015-07-23 20:23:00
我給你的建議是 去找primer把C++好好學一學 不要寫成C
作者: Sirctal (母豬母豬 夜裡哭哭)   2015-07-23 23:32:00
只是我覺得Primer太雜了耶 The C++ Programming Language我比較喜歡
作者: fatrabitree (胖兔子)   2015-07-24 01:43:00
你是要練習還是要用?要用的話就用std::vector就好了要練習的話也可以去翻vector的實作
作者: moussorgsky (法國號有氣質)   2015-07-25 01:36:00
我會再去研究std::vector的。我是要跑數值模擬用的,我的程式碼大概都是16000行以上,有時一個case要跑一個星期以上。我多年來大部分的變數都是宣告成global的,陣列也都是用寫死的,所以我承認我對引數還有指標那些東西真的很不熟。我之前的case幾乎都是二維的,開180萬個元素大概是極限了,但我現在要跑三維的case,陣列的元素個數很容易就破千萬,所以陣列寫成死的根本compile就不會過......反正趁這個機會把引數還有指標、類別、樣版等東西好好學一下,讓自己的程式觀念完整一些,也是好事。感謝大家的建議
作者: EdisonX (卡卡獸)   2015-07-25 01:49:00
資料量還算正常 (算一下大概 500MB) , 不過程式跑一週...
作者: Sunal (SSSSSSSSSSSSSSSSSSSSSSS)   2015-07-25 01:50:00
看原PO跑數值模擬應該不是CS本科
作者: EdisonX (卡卡獸)   2015-07-25 01:50:00
是 Alg. 那裡沒弄好 , 還是 O2 沒開 , 還是本來就那麼久?
作者: Sunal (SSSSSSSSSSSSSSSSSSSSSSS)   2015-07-25 01:51:00
畢竟物理現象要算的對才是重要 不過跑一週...
作者: EdisonX (卡卡獸)   2015-07-25 01:52:00
我跑超過 3 分鐘就受不了要停下來了.. 萬一一週後的結果是錯的 , 那不是還要再重跑一週 , 想到都軟了 Orz對了 , 有種東西叫 intel library ...然後你發的 sample code, 叫 intel library 做比你自己寫速度還要快很多。
作者: Killercat (殺人貓™)   2015-07-27 13:06:00
你說的是Intel TBB? maa...建議等演算法穩定點再用TBB一用下去還挺難除錯的 <==受害者

Links booklink

Contact Us: admin [ a t ] ucptt.com