• ベストアンサー

templateの使い方を教えて下さい。

質問タイトルの通りです。 今、 unsigned char* AllocByteArray1d(unsigned long int n){ unsigned char *box; box = (uchar *)calloc(n, sizeof(uchar)); if(box == NULL){ puts("can't allocate memory..."); exit(1); } return box; } という関数があって、これはunsigned charの配列をとってくれる関数になってます。これをtemplateを使って、intの配列もとれるようにしたいんです。 恥ずかしながら試しに、 template <typename T> T* AllocByteArray1d(unsigned long int n){ T *box; box = (T *)calloc(n, sizeof(T)); if(box == NULL){ puts("can't allocate memory..."); exit(1); } return box; } とやってみましたがダメでした。事前にTのデータ型がわからないからだろうか、と思って template unsigned char* AllocByteArray1d(unsigned long int); を入れて実体化させてみましたが、これでもダメでした。 どこを修正すれば使えるようになるのか、C++に詳しい方に教えて頂けると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

↓何の問題もありませんねぇ。 #include <cstdio> #include <cstdlib> template <typename T> T* AllocByteArray1d(unsigned long int n) {   T *box;   box = (T *)calloc(n, sizeof(T));   if ( box == NULL ) {    std::puts("can't allocate memory...");    std::exit(1);   }   return box; } int main() {   int* buffer = AllocByteArray1d<int>(100);   delete[] buffer; }

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.5

お疲れ様です。 <typename T>のTに対して、int等の型だけでなくクラスを指定する場合には、確保および開放にnewとdeleteを勧めます。 mallocおよびdeleteはメモリ確保・開放だけの処理ですので、Tにクラスを指定されてもコンストラクタ・デストラクタが動きません。 その点、new・deleteはメモリ確保・開放に加えてコンストラクタおよびデストラクタの起動を行ってくれます。

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

あーっ! 失礼しました free(buffer) が正解。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

確か他人の回答への指摘はNGだったと思いますが、間違って覚えられると困りますので。。。 callocで確保するのであれば、開放はfreeです。 delete[]で開放するのであれば、確保はnewです。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「ダメ」といわれても何がどう「ダメ」なのかわからないので, メッセージが出ているならそれを書いてください. 逆に, 他人に「ダメ」とだけ言われてあなたは何が「ダメ」なのか理解できますか? でもって, 「テンプレートパラメータが推論できない」というだけであれば, AllocByteArray1d<int>(なんか) のようにテンプレートパラメータを明示的に渡せばいいはずです. でも, こんなの普通は new か std::vector のどっちかを使うものだよなぁ.... なんでこんなことをしたいんだろう....

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 「動的確保した2次元配列のメモリ解放」を関数化したい

    質問タイトルの通りですが、 「動的確保した2次元配列のメモリ解放」をC言語で関数化したいと思っています。しかし、関数の引数には動的確保した配列の先頭アドレスのみ渡す形にしたいです。そのような場合の関数化は可能ですか? どうもうまくいかず、困っています。 以下、具体的に、サンプルソースを記述します。 わかる方、よろしくお願いします。 //====================================================// #include<stdio.h> unsigned char** AllocByteArray2d(int column, int row); void FreeByteArray2d(unsigned char** box); int main(voidls){ unsigned char array**; array = AllocByteArray2d(2, 3); FreeByteArray2d(array); return 0; } unsigned char** AllocByteArray2d(int column, int row){ unsigned char* box; box = (unsigned char**)malloc( sizeof(unsigned char*)*column ) int i; for(i=0; i<column; i++){ box[i] = (unsigned char*)calloc( row, sizeof(unsigned char)); if(box[i] == NULL) exit(EXIT_FAILURE); } return box; } //引数では配列の先頭アドレスだけ渡す形にしたい void FreeByteArray2d(unsigned char** box){ //ここをどう書いたらいいかわからない }

  • 沢山の変数を扱う時、うまく出来ません・・。

    変数が沢山ある時、エラーが起こったかどうかは どうやって判断したらいいんでしょうか。 今50個位変数名があるとします。 今は端おって5つにします。 int a,b,d; char c,e a = (int *) calloc(500,sizeof(int)); b = (int *) calloc(200,sizeof(int)); c = (char *)calloc(700,sizeof(char)); d = (int *) calloc(400,sizeof(int)); e = (char *)calloc(100,sizeof(char)); if(a==NULL || b==NULL || c==NULL || d==NULL || e==NULL)   printf("エラー発生\n"); こうやって50個もif文の中にいれたら大変ですよね。 変数名も長いですし。うまく1つでもエラーが起きたら全体がエラーになるように出来ませんかね? 自分としてはこういう風に考えたんですけど int sum=1; a = (int *) calloc(500,sizeof(int)); sum*=a; b = (int *) calloc(200,sizeof(int)); sum*=b; c = (char *)calloc(700,sizeof(char)); sum*=c; d = (int *) calloc(400,sizeof(int)); sum*=d; e = (char *)calloc(100,sizeof(char)); sum*=e; if(sum==0)   printf("エラー発生\n"); コレくらいしかないですかね?

  • バッファオーバーランの危険性検出について

    下に示すmsg_file.txtの内容を読み込んで表示するプログラムを使ってバッファオーバーランの危険性を検出するプログラムを作りたいのですが、どのように書き換えたら良いでしょうか。 プログラムソース 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #define FILEPATH "msg_file.txt" 6 7 int main(); 8 void vuln(const char* line); 9 void stack_dump(void* ptr, int counts); 10 void hello(); 11 12 int main() 13 { 14 char linebuf[1024]; 15 FILE *fp; 16 long mark1 = 0x11111111; 17 memset(linebuf, 0, sizeof(linebuf)); 18 19 fp = fopen(FILEPATH, "r"); 20 fgets(linebuf, sizeof(linebuf)-1, fp); 21 fclose(fp); 22 23 vuln(linebuf); 24 25 printf("------------- end of main() -------------\n"); 26 } 27 28 void vuln(const char* line) 29 { 30 char msg[20]; 31 long mark2 = 0x22222222; 32 memset(msg, 0, sizeof(msg)); 33 34 strcpy(msg, line); 35 36 stack_dump(&mark2, 13); 37 38 printf("INPUT[%s]\n", msg); 39 } 40 41 void stack_dump(void* ptr, int counts) 42 { 43 int i; 44 unsigned long *ulong_ptr = (unsigned long *)ptr; 45 unsigned char uchar_buf[4]; 46 47 printf("-----------------------------------------\n"); 48 printf(" address | long var | +0 +1 +2 +3 | 0123\n"); 49 printf("-----------------------------------------\n"); 50 for(i=0; i<counts; i++) { 51 printf(" %08x| %08x", &ulong_ptr[i], ulong_ptr[i]); 52 memcpy(uchar_buf, &ulong_ptr[i], sizeof(uchar_buf)); 53 printf(" | %02x %02x %02x %02x", 54 uchar_buf[0], uchar_buf[1], uchar_buf[2], uchar_buf[3]); 55 if(uchar_buf[0]<32 || uchar_buf[0]>126) uchar_buf[0] = '.'; 56 if(uchar_buf[1]<32 || uchar_buf[1]>126) uchar_buf[1] = '.'; 57 if(uchar_buf[2]<32 || uchar_buf[2]>126) uchar_buf[2] = '.'; 58 if(uchar_buf[3]<32 || uchar_buf[3]>126) uchar_buf[3] = '.'; 59 printf(" | %c%c%c%c\n", 60 uchar_buf[0], uchar_buf[1], uchar_buf[2], uchar_buf[3]); 61 } 62 printf("-----------------------------------------\n"); 63 } 64 65 void hello() 66 { 67 printf("+----------+\n"); 68 printf("| HELLO! |\n"); 69 printf("+----------+\n"); 70 exit(0); 71 }

  • string から unsigned char へ

    unsigned char* uchar_string(string* str) { int length = str->length(); const char* cchar = str->c_str(); unsigned char* uchar = new unsigned char[length+1]; for(int i=0; i=length; i++) { uchar[i] = (unsigned char)cchar[i]; } return uchar; } int main() { string str; cin >> str; unsigned char* uc; uc = uchar_string(&str); cout << uc; delete uctest; return 0; } このようにしたところ、cout << uc; が出力されず入力待ちとなり正常に動きませんでした。 原因がわからないです。原因と解決方法のご教授願います。

  • char型+char型ってint型? if(char型==int型)?

    C言語の「汎整数拡張(インテグラルプロモーション)」というものに関するものだと思います。 char型とchar型を加えた結果は、char型でしょうか。それともint型でしょうか。 (下のプログラムの printf("sizeof(a[0]+a[1])は%d\n", sizeof(a[0]+a[1])); /* char型+char型 */ という部分の結果は4なので、int型と考えるべきなのかな。) 私は、char型とint型の加算の結果はint型だと思っていましたが、 char型とchar型の加算の結果はやはりchar型だと思っていました。 (それが間違えているのでしょうか。) if(a[0]==i) /* char型とint型の比較(?) */ の部分では、左辺はchar型、右辺はint型ですが、このように型の違う変数を比較しても文法上構わないのでしょうか。 (私は、「比較は必ず型の同じもの同士でしかできない」と思っていました。) 左辺はchar型のように見えて、じつはint型ですか。 #include <stdio.h> int main(void) { char a[4]; int i=77; printf("sizeof(int)は%d\n", sizeof(int)); printf("sizeof(char)は%d\n", sizeof(char)); printf("sizeof('M')は%d\n", sizeof('M')); printf("sizeof(a[0])は%d\n", sizeof(a[0])); a[0]='M'; a[1]=7+6; a[2]=a[0]+a[1]; printf("sizeof(a[0]+a[1])は%d\n", sizeof(a[0]+a[1])); /* char型+char型 */ printf("sizeof(+a[0])=%d\n", sizeof(+a[0])); if(a[0]==i) /* char型とint型の比較(?) */ puts("a[0]==i"); else puts("a[0]!=i"); return(0); } ちなみにワーニングもエラーもなんにもでません。

  • 雛形ウィンドウ処理について

    雛形のウィンドウをGetmessage()のところとWndProcのところをトレースしたときに気づいたんですが、 Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, longtThread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartup Function: WinMain(HINSTANCE__ *, HINSTANCE__ *, char *, int), と出るのですが、まぜ順番的( Function: WinMain(HINSTANCE__ *, HINSTANCE__ *, char *, int), Thread: 0x16D4 __tmainCRTStartup Function: WndProc(HWND__ *, unsigned int, unsigned int, long), Thread: 0x16D4 __tmainCRTStartupの交互 ) じゃないのはなぜなのでしょうか?あとFunction: WinMain(HINSTANCE__ *, HINSTANCE__ *, char *, int), Thread: 0x16D4 __tmainCRTStartupと Function: WndProc(HWND__ *, unsigned int, unsigned int, long), に個数に差が出るのですが、なぜなのでしょうか?

  • icon format について

    Visual Studio.NET 2003 MFC を使用しています。 View画面で、アイコンを表示しようと思いました。 アイコン読み込みようのクラスを作成しました。 class icon { public: void IconHeadRead(FILE *fp,int *width,int *height) { unsigned char uc; unsigned short us; unsigned int ui; fread(&us,sizeof(unsigned short),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&uc,sizeof(unsigned char),1,fp);*width=uc; fread(&uc,sizeof(unsigned char),1,fp);*height=uc; fread(&uc,sizeof(unsigned char),1,fp); fread(&uc,sizeof(unsigned char),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&ui,sizeof(unsigned int),1,fp); }; void IconDataRead(FILE *fp,unsigned char *red,unsigned char *green,unsigned char *blue) { unsigned char uc; fread(&uc,sizeof(unsigned char),1,fp);*red=uc; fread(&uc,sizeof(unsigned char),1,fp);*green=uc; fread(&uc,sizeof(unsigned char),1,fp);*blue=uc; }; }; このred,green,blueの値を使用して、 SetPixelでドローしようと思いましたが、 変な表示になります。 width,heightは、正しいようです。 ICON フォーマットについて教えてください。 よろしくお願いします。 同じような要領で、bitmapは保存、読み込みはできました。

  • 動きが部分的におかしくなる要因

    以前はアドバイスありがとうございました。 配列オーバーフロー? http://okwave.jp/qa4406037.html 以前のプログラムで以下を暗号化→解読化すると元通りにはならず、 6,8,64,66,67,68行目だけがおかしくなります。 明らかにその行に無い文字が交じってきたりしますが、 初期化はしておりますし、他の行は大丈夫なのに 何故この行だけがおかしくなるのか(暗号化の時点で既におかしいです) わかりません。 同じ作り込みをしていて、一部分だけ動きがおかしくなるのは どういった理由があるのでしょうか? 特に周期性は見られません。 ↓下の行から1行目 #define MAX_MOJI 250 /* ファイルNAME */ #include <stdio.h> #include <stdlib.h> typedef struct { char ch; double d1; float fl; short sh; int in; long ln; } testcell; char c1; char ch2[2]; char ch3[3]; double d; testcell t; char c2; char c3; long ln; float fl; char *p; static int st; void main( void ); void func( int ); void main( void ){ char* alc = malloc( 1000 ); func( 100 ); printf( "\nメイン\n" ); printf( "allocated addr : %p\n", alc ); printf( "func() addr : %p\n", func ); printf( "main() addr : %p\n", main ); printf( "addr of printf : %p\n", printf ); printf( "char c1 %2d : %p\n", sizeof(c1), &c1 ); printf( "char ch2[2] %2d : %p\n", sizeof(ch2),ch2 ); printf( "char ch3[3] %2d : %p\n", sizeof(ch3),ch3 ); printf( "double d %2d : %p\n", sizeof(d), &d ); printf( "testcell t %2d : %p\n", sizeof(t), &t ); printf( "char c2 %2d : %p\n", sizeof(c2), &c2 ); printf( "char c3 %2d : %p\n", sizeof(c2), &c3 ); printf( "long ln %2d : %p\n", sizeof(ln), &ln ); printf( "float fl %2d : %p\n", sizeof(fl), &fl ); printf( "char *p %2d : %p\n", sizeof(p), &p ); printf( "static int st %2d : %p\n", sizeof(st), &st ); printf( "\nコウゾウタイ\n" ); printf( "char ch %2d : %p\n", sizeof(t.ch), &t.ch ); printf( "double d1 %2d : %p\n", sizeof(t.d1), &t.d1 ); printf( "float fl %2d : %p\n", sizeof(t.fl), &t.fl ); printf( "short sh %2d : %p\n", sizeof(t.sh), &t.sh ); printf( "int in %2d : %p\n", sizeof(t.in), &t.in ); printf( "long ln %2d : %p\n", sizeof(t.ln), &t.ln ); } void func( int p ){ static int s; int loc; printf( "\nファンクション\n" ); printf( "parameter addr : %p\n", &p ); printf( "func static addr : %p\n", &s ); printf( "func local addr : %p\n", &loc ); }

  • リトルエンディアン→ビッグエンディアン

    (1)リトルエンディアン typedef struct recvData{  int a;  unsigned char b[16]; unsigned char c[8]; unsigned int d[4]; } recvData_t; recvData_t rData; (2)ビッグエンディアン typedef struct sendData{  int a;  unsigned int b[4]; unsigned int c[2]; unsigned int d[4]; } sendData_t; sendData_t sData; 上記のようなリトルエンディアンの構造体の各メンバのデータを、ビッグエンディアンの構造体の各メンバのデータにそれぞれ格納するには どうしたらよいでしょうか?

  • R8Cマイコンの乗算

    R8C34Mを使っています。 例えば下記のコードを実行したら  unsigned long kai;  unsigned int xx;  unsigned int yy; xx = 0x07d0;  //10進で2000 yy = 0x0064;  //10進で100 kai = xx * yy; kaiは 0x30d40 となるはずが、0x0d40 でした。 kai = (unsigned long)xx * yy; と書き直したら、うまくいきました。 答えが2バイトを超えるのが分かっていたのでkaiはlong長にしました。 どうして右辺もキャストでlong長にしないといけないのでしょうか? また、下記のようにkaiをint長、xx,yyをchar長にした場合は、 kaiは意図する値の0x4e20 になりました。  unsigned int kai;  unsigned char xx;  unsigned char yy; xx = 0x00c8;  //10進で200 yy = 0x0064;  //10進で100 kai = xx * yy; どうして後者の場合はうまくできて、前者の場合はキャストしないといけないのでしょうか? この辺ご存知の方ご教授願います。