[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 09/30 01:57 / Filesize : 166 KB / Number-of Response : 641
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.46【環境依存OK】



1 名前:◆NUNUK382Dk mailto:sage [2007/12/27(木) 20:32:47 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.45【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1197090562/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

263 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 14:51:41 ]
>>255
引っ越す前から見てるんだけど
時間の分解能を定義してないのはなぜよ?

sleep とか alam でやれば当然誤差累積だし…

精度とか確度とかって数学の時間に習わなかったか?


264 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 15:09:03 ]
何で偉そうなの?

265 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 15:19:32 ]
>>263
些末な問題だから。

266 名前:255 mailto:sage [2008/01/04(金) 17:22:32 ]
>>263
引っ越し前からの長期に渡る応援ありがとうございます!

精度は1秒あればOKです。
sleepにせよ、alarmにせよ、
仕掛ける前にtime_tを取ってきて、
それから逆算してやろうかなと思っててわざわざ書きませんでした。

数学は得意です。
自分で微分を発明しました(`・ω・´)シャキーン

267 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 17:39:02 ]
ライプニッツもしくはニュートン乙

268 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 18:13:59 ]
凄い奴が書き込んでたんだな。しかも前スレから。

269 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 18:45:21 ]
>>263
どこに引っ越したんだ?

270 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 19:44:39 ]
いや、>255が他のスレから移動してきただけのことだろ。

271 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 03:46:06 ]
度忘れしてしまったので助けて

引数にポインタをとる関数があるのだが
このポインタのアドレスを自動変数のものに書き換えるのはNG
このポインタに自動変数を代入するのはOK
でいいんだよね



272 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 03:49:55 ]
>>271
ごめん、読解できない

273 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 03:53:50 ]
寝ぼけてるから日本語でokになってしまったorz

a(int* p)
{
int local = 10; //適当

p = &local; //NG
*p = local; //これはどうだったっけ?
}




274 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 03:59:04 ]
>>273
//これはどうだっけ?
OKだよ。    ってか、なんでこの程度の事が分からん。

//NG
これの理由は説明できるか?

275 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 04:00:36 ]
>>273
*p = local; //これはどうだったっけ?

問題ない
pの指す領域に10の値が代入される


pがもつ10の値と、localが持つ10の値は、それぞれ別の領域に格納されている状態になる

276 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 04:01:11 ]
よくわからんが混乱してしまった、最近疲れてる予感orz


あれだ、auto変数は関数から脱出した瞬間ナイナイされちゃうからな
するとポインタpは意味の無いところを示してしまうのでエラーになるんだ

277 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 04:12:09 ]
>>274-275
説明ありがとう
今日はもう休もうorz

278 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 08:30:54 ]
文字列から指定の文字列を省いて他の変数へコピー
例えば
文字列が入った変数 MOJI[]="aaabbbccc\0" 指定の文字列="bbb"だと
MOJI→他の変数へaaaccc\0をコピー
できれば
aaabbbccc→ポインタ使ってMOJI自身をaaaccc\0に
ってしたいんだけど、どのようにすればいい?

279 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 08:35:58 ]
ドゥアブルポイントゥアァァァァ

280 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 08:57:36 ]
strstrでbbb探してbbbのに続くバイトをヌル文字まで一文字ずつ前にコピー

281 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 09:04:56 ]
void func(char * a, char const * b)
{
if (a == NULL || b == NULL || a[0] == '\0' || b[0] == '\0') return;
char const * p = strstr(a, b);
if (p == NULL) return;
char tmp[strlen(a) + 1];
sprintf(tmp, "%.*s%s", p - a, a, p + strlen(b));
strcpy(a, tmp);
}

char MOJI[] = "aaabbbccc";
char * b = "bbb";
func(MOJI, b);

但し、"aaabbbccc\0"はナンセンスなんで"aaabbbccc"に変更済み



282 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 09:06:01 ]
>一文字ずつ前にコピー
馬鹿がいる。
>char tmp[strlen(a) + 1];
c99使いがいる。
# つーか、一時領域要らないだろw

283 名前:281 mailto:sage [2008/01/05(土) 09:10:17 ]
>>282
確かに一時領域要らなかった。

>>278
ってことで、訂正。これでc89でも大丈夫。
void func(char * a, char const * b)
{
if (a == NULL || b == NULL || a[0] == '\0' || b[0] == '\0') return;
char const * p = strstr(a, b);
if (p == NULL) return;
strcpy(p, p + strlen(b));
}

284 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 09:13:58 ]
>>283
いや、未だc89じゃ通らないし。つーか、char const * pじゃなくてchar * pだろよ。

285 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 09:28:25 ]
>>283
strcpyでコピー範囲が重なってるから動作が未定義になるぞ。

286 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 09:35:26 ]
さらに指定の文字列は複数回出現する可能性も有るから・・・
さらに言えば指定文字列を取り除いた後に前後の文字列がくっついて取り除くべき指定文字列になる可能性も。
ex. aabbcからabを取り除くとabcになって再度abが出現。

287 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:05:44 ]
ありがとうstrlen使う発想がなかったから助かりました
実はURLからime.nu/を消したかっただけなんでこんな感じでまとめたみた

if(NULL!=strstr(url,"ime.nu/")){
char *buf;
buf=strstr(url,"ime.nu/");
url[strlen(url)-strlen(buf)]='\0';
buf+=strlen("ime.nu/");
strcat(url,buf);
}

288 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:27:58 ]
strcatも未定義動作になるから止めれ。

289 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 11:18:35 ]
>>276
ポインタpも関数から脱出した瞬間ナイナイされるので安全。

290 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 11:21:28 ]
strcpy()で、前方への移動ができない実装ってあるんかいな。
未定義には違いないけど。

291 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:10:38 ]
>>273
>p = &local; //NG
これもOKだよ
よく考えろ、pもローカル変数だ



292 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:32:16 ]
>>291
ほう?
void TestFunc(int* p)
{
    int x = 10;
    p = &x;
}

int main(int argc, char* argv[])
{
    int a;
    TestFunc(&a);
    printf("%d\n", a);
    return 0;
}


293 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:44:20 ]
>>292
そういう話をしてるんじゃないと思うが。

294 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:45:20 ]
何が「ほう?」なんだか。

295 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:52:06 ]
>>292
君が何を言いたいのか分からない
要するに、そのコードがどうした?
何か問題でも?

296 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:59:12 ]
>>292
void TestFunc(int* p)
{
  int x = 10;
  p = &x;
}

int main(int argc, char* argv[])
{
  int a = 5;
  TestFunc(&a);
  printf("%d\n", a);
  return 0;
}

出力結果
5

297 名前:292 mailto:sage [2008/01/05(土) 15:00:49 ]
ごめん、俺が悪かった。物凄く勘違いしてたらしい。いじめないでくれ。

298 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 15:10:58 ]
ローカル変数のポインタをリターンするときに注意が必要なんだっけ?

299 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 15:14:17 ]
あれ?戻った先で使おうと思っても残ってる保証がないんぢゃ? > 298

300 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 15:15:17 ]
そうだね。
int* f()
{
int a = 10;
return &a; // NG
}

特に構造体とか大きいものを返したいときに、
コストを避けようとしてやってしまう人もいるかも。
素直に値で返すか、引数に格納先のポインタを貰うべし。

301 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 15:21:00 ]
そんな時のための動的確保ですよ > 300



302 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 15:24:48 ]
>>300
動的確保するならauto_ptrですな。
std::auto_ptr<int> f()
{
return std::auto_ptr<int>( new int(10) );
}

303 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 15:25:07 ]
ヒープ領域に確保されるからdeleteで明示的に削除しない限り開放されないってやつか

ただしdelete忘れるとメモリリークが起こるから注意(´・ω・)

304 名前:デフォルトの名無しさん [2008/01/05(土) 18:52:20 ]
初歩的な質問ですいません。ポインタに関して質問です。
二次元配列の動的確保なのですが、
TCHAR hoge[5][260];
のような時に5の部分だけ動的に確保して260の方は固定したいのですが、
TCHAR *hoge[260];
hoge = (TCHAR *)malloc(sizeof(TCHAR)*260*num);
のようにすると、"'char *'から'char *[260]'に変換することはできません"とコンパイルエラー吐きます。
TCHAR **hoge;
で最初から動的確保を2度行う方法は分かるのですが、片方を固定した場合どのようにすべきでしょうか。

305 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 18:54:06 ]
TCHAR (*hoge)[260];

306 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 18:54:47 ]
hoge = (TCHAR (*)[260])malloc(sizeof(TCHAR)*260*num);

307 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 18:54:58 ]
sizeof(TCHAR)*260

sizeof(hoge)
にするとどうなる?

308 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 18:55:45 ]
あるいは

hoge = (TCHAR (*)[260])malloc(sizeof(*hoge)*num);

309 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 19:02:05 ]
typedef すると分かりやすいよ。


typedef TCHAR Path[MAX_PATH];

Path *hoge;
hoge = (Path *)malloc(sizeof (Path) * num);

310 名前:304 mailto:sage [2008/01/05(土) 19:23:37 ]
即レス感謝です。
>>307
そうすると、後者の場合は戻り値が4になりました。
何故かsizeof(TCHAR)だと1でした。何故2じゃないのだろう・・・。Unicodeじゃないからかな・・・??
>>305-306
のように間接参照演算子を括弧でくくると上手くコンパイルも通り、
for(i = 0 ; i < max ; i++) hoge[i] = "test";
と動作も確認出来ました。
>>309
のようにtypedefのやり方もググって見つけたのですが、
直接的にどうやれば通るか知りたかったもので。。 やはり、typedefの方が分かりやすいですね。

311 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 19:30:57 ]
型宣言の * は間接参照演算子とは別物。



312 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 19:35:03 ]
>>310
TCHARはマクロでワイド文字(wchar_t)とマルチバイト文字(char)を切り替える
VCならプロパティからUnicode文字セットを使用するようにすればワイド文字になる
後"test";は_T("test");もしくはTEXT("test");って書くように。そうすれば切替の対象になるから。

313 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 21:29:06 ]
構造体にすると見慣れた形になる。
typedef struct { TCHAR str[260]; } Path;
Path* hoge = (Path*)malloc(sizeof(Path) * num);
煩雑かな。

314 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 00:18:19 ]
なんて言うかポインタの配列と多次元配列へのポインタを勘違いしている様な希ガス
int *p[10]だとint型のポインタが10個あるポインタの配列
int a[10][10]とかの多次元配列へのポインタなら int (*p)[10]

315 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 00:55:57 ]
C言語で何か分かりやすいプログラムはないでしょうか。

316 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 00:56:34 ]
helloworld

317 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 00:59:19 ]
int main(){
return 0;
}

多分これが一番分かりやすい

318 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 01:48:10 ]
C++Builder 6でコンパイルした後
printfでテキスト文を表示したいんですけど
どうすればいいんでしょうか。

319 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 01:49:48 ]
エスパーが質問に答えるスレ
pc11.2ch.net/test/read.cgi/tech/1187922645/

320 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 02:15:16 ]
実行すれば良いんじゃない。

321 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 02:28:04 ]
日本語をコマンドプロンプトや「メモ帳」で表示させたいです。
できれば背景が白い所に分かりやすく表示させたい。
マジレスきぼんぬ。



322 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 02:34:03 ]
コマンドプロンプトの配色を「白地に黒文字」に設定

323 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 02:48:13 ]

#include <stdlib.h>

system( ); で、適当に
コマンドの命令だが、
color F0
とか
#define color(x) printf("\033[%dm", x + 30);
MS使用だったかも知れないが。

system("notepad.exe puni.cpp");
詳しくは調べて

324 名前:304 mailto:sage [2008/01/06(日) 02:57:35 ]
>>314
それを観て何となく納得出来ました。
キャストが初めて観るので、もうちょっと弄ってみます。
レスくれた皆さんありがとうございました。

325 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 05:36:09 ]
動的メモリの解放がいまいちよく判りません。
以下の(A)で生成した snow は、
(B)で問題なく解放されているのでしょうか?

void procMain()
{
 Snow ***snow = NULL;
 int i, j;
 
 // 生成 ←(A)
 snow = new Snow**[10];
 for ( i = 0; i < 10; i++ ) {
  snow[i] = new Snow*[5];
  for ( j = 0; j < 5; j++ ) {
   snow[i][j] = new Snow();
  }
 }
 
 // 解放 ←(B)
 for ( i = 0; i < 10; i++ ) {
  for ( j = 0; j < 5; j++ ) {
   delete snow[i][j];
  }
  delete snow[i];
 }
 delete snow;
}

下2つの delete が delete[] の様な気もしますが、
判る方がいましたらよろしくお願いします。

326 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 05:49:38 ]
>>321
ファイルに出力した後にそのファイルを開けばいい。
fp=fopen("test.txt","r");
fprintf(fp,"hoge");
fclose(fp);
system("test.txt");

327 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 06:32:15 ]
>>325
new [] 使ってるから delete [] だろうね。

こういうのはややこしくなるから、
フラットな配列にして添え字は掛け算するのがシンプルでいい。
Snow *snow = new Snow[10*5];
for (int i = 0; i < 10; i++ ) for (int j = 0; j < 5; j++ ) snow[i*5+j].xxx();
delete [] snow;


328 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 06:40:43 ]
>>321
>>318でエディションがPersonal以外ならOutputDebugString。イベントタブに出力される

329 名前:325 mailto:sage [2008/01/06(日) 08:55:02 ]
>>327
レスありがとうございます。問題が解決しそうです。

どちらの delete でもコンパイルが通っちゃうから自信が持てない・・・

330 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 11:33:30 ]
>>315
全然関係ないが、自分が一番最初に見たC++のサンプルはこれだ。

#include <iostream>
int main(int argc, char *argv) {
 std::cout << "Hello World !" << std::endl;
 return 0;
}

ついでに、一番最初に聞いたクラスの説明は
 猫も人もみな哺乳類なのです
だ。

331 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 11:48:57 ]
>>330
mainの引数もまともに書かないとは、悪いサンプルだな。



332 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 12:42:49 ]
俺はこれだった・・・

static char _main[] = { 0x81, 0x21, ...., 0x21 }

PDPほにゃらら専用とかかいてあった


333 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 14:01:44 ]
最近Win32APIを使ったソフトを作り始め、色々とサンプルを見て回ってるのですが
多くがひとつの.cppファイルにまとまってるようなコードや、グローバル変数が多いソースで、
それを元にコードを打ち始めたらひとつのファイルに何千行というコードが入り、設定情報
をグローバル変数で共有するような気持ち悪いコードになってしまいました。

Win32を用いたコードでうまくOOPの概念を取り入れて、出来るだけすっきりとしたコードを書きたいのですが、
なにかアドバイスがあればご教授願います。

334 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 14:08:52 ]
APIを直接呼ぶんじゃなくて、APIを包み込むクラスかしてから使う。たとえばファイル関係のクラスを作って外からAPIを見えなくする。

335 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 14:19:46 ]
>>333

Win32API 直叩きじゃなくて、MFCや.NET Framework使ったほうが良いよ。


336 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 14:21:16 ]
MFCや.NET Frameworkみたいなのを作りたいんだろ。

337 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 14:48:05 ]
SDLとかwx使おう是

338 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 15:25:17 ]
VCLも愛して

339 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 16:29:28 ]
暇だしVCLをC++に移植するか

340 名前:333 mailto:sage [2008/01/06(日) 16:30:59 ]
皆さん ご回答ありがとうございます。
どうやらMFCってのがうまくAPIを纏めているようなのでそれを使いたいと思います・・・

341 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 16:37:27 ]
>>339
それ欲しい。是非に



342 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 16:58:12 ]
>>339
文字列クラスには是非sprintfメソッドを

343 名前:デフォルトの名無しさん [2008/01/06(日) 19:06:34 ]
C++のSTLであるvector型に関する質問です。
AAA, BBB, CCCという3つのvector型があって、
それらの要素AAA[index], BBB[index], CCC[index] (indexは全て共通の整数)を一括削除したいのですが、
下記のような冗長な構文になってしまいます。
消したい対象DDD, EEE, FFFが増えていくと、プログラムが非常に長くなってしまうのですが、
イテレーターaaa, bbb, cccを極力使用せずにコンパクトに記述する方法は無いでしょうか・

vector<double>::iterator aaa; aaa = AAA.begin();
vector<int>::iterator bbb; bbb = BBB.begin();
vector<string>::iterator ccc; ccc=CCC.begin();
for(int a=0;a<index;a++) { aaa++; bbb++; ccc++; }
AAA.erase(aaa);
BBB.erase(bbb);
CCC.erase(ccc);


344 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 19:21:25 ]
>>343
いや、少なくともfor文はいらなくね?advance使えば?
というより、こういうのは思いっきりtemplateの出番だと思うんだが。


345 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 19:24:03 ]
>>343
そもそもデータ構造を
struct Hoge {
double d; int n; string s;
};
vector<Hoge> hoge;
とできないの?

ちなみにvector<>::iteratorはランダムアクセスできるので
AAA.erase(AAA.begin()+index)でOK

346 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 19:29:51 ]
>>344
>>345
ありがとうございます。

既にクラスの階層構造を何段か組んでいるので、これ以上階層化するのは避けたいと思いまして。
最後の1行の場合、indexがint型だからコンパイルエラーにならないでしょうか?

347 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 19:35:34 ]
>>346
RamdomAccessIteratorなら加算がオーバーロードされてるからおk

348 名前:343 mailto:sage [2008/01/06(日) 19:35:53 ]
まずはこの方法でためしてみます。
AAA.erase(AAA.begin()+index)

349 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 19:36:13 ]
>>347
重ね重ねありがとうございますm(_ _)m

350 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 19:52:25 ]
#include <stdio.h>
から始まる基本関数で
何か表示する物はあるんでしょうか。

351 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 20:02:22 ]
Random Access Iteratorだから

AAA.erase( AAA.begin() + index );
BBB.erase( BBB.begin() + index );
CCC.erase( CCC.begin() + index );

でいいんじゃね?



352 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 20:04:09 ]
printfとか簡単な関数でもいいんですが。
コンパイラの設定でブリーダーができません。

353 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 20:05:49 ]
質問はコミュニケーション言語日本でお願いします。

354 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 20:08:28 ]
これからテンプレートの勉強を始めようと思っているんですが

テンプレート:クラスみたいなもん
STL:テンプレートのあつまり

みたいな認識ってまちがっていますか?

355 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 20:10:15 ]
>>354
間違ってる

356 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 20:35:34 ]
関数テンプレートの使いどころというか選択についてです
気にしなくて良いレベルなのだと思いますが
引数にaとbを取り、大きな方を返す関数テンプレートがあったとします。
この場合、大きい値を返す関数のint用のものfloat用のもの・・・・といった具合にたくさんの関数を用意するのとでは
どちらが良いのでしょうか?
ここで関数テンプレートを使うとなんというかもったいないというか処理が無駄に大きく膨らんでいる気がしてならないです

今すぐに想像はできないのですが、ここでいう大小を比べる程度のものでなく、もっと大きなものならば関数テンプレートが有効だとは思います


357 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 20:36:29 ]
大事なところがorz

つまり処理数が多いものならば関数テンプレートを利用した方が良い、などの明確だったりしないまでの決まりのようなものはあるのでしょうか?

358 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 20:38:53 ]
>>356
何で?
ぜんぜんもったいなくないと思うけど。
呼び出されてる型のものだけが具体化されるから
効率的だと思うし、実際std::maxテンプレートはあるじゃない。

359 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 20:40:57 ]
>>356
>int用のものfloat用のもの・・・・といった具合にたくさんの関数を用意する
これが面倒じゃないと思うならがんばれば?

360 名前:356 mailto:sage [2008/01/06(日) 20:41:07 ]
>>358
ありがとうございます
そうですよねorzもったいないと感じている自分がおかしくてならないです
積極的に使っていこうとおもいます

361 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:03:26 ]
だから、std::max()を使えってば。



362 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:06:46 ]
>>361
356は例えばで言ってるだけだろ

363 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:14:07 ]
>>360
おかしくないです。出てくるコードの大きさを見積もることは必要なことです。







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<166KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef