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


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

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



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

357 名前:349 mailto:sage [2007/12/15(土) 19:53:53 ]
cout << "うはwwwおkww";

ありがとうございます orz

358 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 20:09:37 ]
初心者ですお願いします
何も入力されてないの(エンターーのみ)をデータとして扱うにはどうしたらいいでしょうか?
初歩的ですいません

359 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 20:15:00 ]
>>358
scanf("%d",・・・); みたいにしてるとか?


360 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 20:26:53 ]
getch()の戻り値はエンターの時どうなんだろ

361 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 20:32:50 ]
シャンピーとどいたー\(^o^)/

362 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 20:33:44 ]
ごばくー/(^o^)\

363 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 20:41:01 ]
>>359
yes

364 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 20:45:02 ]
エンターいれっと普通に13返ってくるな

365 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 20:45:45 ]
>>363
int n;
char line[100];
fgets(line, sizeof(line), stdin);
if (line[0] == '\n') {
  // エンターだけ
}
else {
  sscanf(line, "%d", &n)
}




366 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 21:14:43 ]
>>365
thanx

367 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 22:59:08 ]
>>353
規格違反ではないね。実装依存だから何でもアリ。
VCの実装がそういうふうに対応しているという
だけのことだね。

368 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 05:51:11 ]
質問です。
OSはMacOS X 104.11です。
#include <stdio.h>

int main (int argc, char *argv[]){
fprintf(stdout, "%s¥n", argv[1]);

return;
}
というプログラムを書いたのですが、
いざ実行させるときに、引数に
桜木 花道とやると、桜木 花道
桜木 花道とやると、桜木
しか出力されません。
なんとか回避したいのですが、どのようにすれば良いでしょうか?

369 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 05:55:25 ]
半角空白は区切られる
あきらめろ

370 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 05:56:15 ]
argv[2]
も出力する

371 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 05:59:50 ]
ああ、マジですかorz
それって、OSのバグとかじゃなくて
C言語の文字列の表現の仕様ですかね?
半角を入れると
桜木'¥0' 花道'¥0'
ってなるんでしょうか?

372 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 06:15:23 ]
そういうことだな

373 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 06:19:36 ]
うはー、せっかくここまでプログラム書いて、バグつぶししていたときに、
こんな問題に出会うとは!
どうしよう。鬱だ。寝よう。

374 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 08:13:42 ]
>>368
program "桜木 花道"

375 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 08:47:55 ]
>>371
C言語の文字列の表現の問題というよりは、コンソールの仕様(コマンドラインに入力した文字列を
半角で引数を区切る)かな。
自分でシェルを作って、引数の区切りを半角文字以外で指示できれば argv[1] = "桜木 花道" も可能だよ。

argv[]にどういう文字列が渡されるかもC言語の規格の範疇だっけ?




376 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 09:09:48 ]
>>375

JIS規格見てみたが、「文字列へのポインタでなければならない」としか書いてないな。



377 名前:375 mailto:sage [2007/12/16(日) 09:20:01 ]
>>374に書いてあるように、わざわざ自前シェルを作らなくても
たいていのプラットフォームでは "" で囲めば事足りるね。なぜか忘れてたorz


378 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 09:40:06 ]
>>373
program "安西 先生"

379 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 10:06:12 ]
#include <stdio.h>
#include <string.h>

int main (int argc, char *argv[]){
 if (strcmp("安西 先生", argv[1]) == 0) {
  fprintf(stdout, "あきらめたら?\n");
 } else {
  fprintf(stdout, "%s\n", argv[1]);
 }
 return 0; //mainの戻り値をint指定したら戻り値返さないとコンパイルエラー
}

380 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 10:19:34 ]
今時のコンパイラはエラーになるのか

381 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 10:23:58 ]
>>373
> うはー、せっかくここまでプログラム書いて、バグつぶししていたときに、
> こんな問題に出会うとは!
> どうしよう。鬱だ。寝よう。
>
>>368 のプログラムでそれは大げさだろ。>>370 がまっとうな解答だと思うが。
argc に情報あるんだし。

382 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 11:42:47 ]
VS2005MFCですが、OnKeyDown()関数で受け取ったint型のアスキーコードを、
元の文字に変換してstd::string型の変数に代入するにはどうしたらいいですか?
int n = 0x30; //キーボードの0を押下して得られるアスキーコード
nをstring型の0に変換したい
intからCString型の例は結構あちこちで、散見してるんですが・・・・


383 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 11:57:01 ]
382です自己解決しましたがもっといい方法があったら教えてください
#include <iostream>
#include "stdio.h"
#include <string>

int main()
{
 int n = 0x30;
 std::string str;
 str = ( char )n;
 std::cout << str << std::endl;
 return 0;
}

384 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 11:58:44 ]
>>382
代入: s.assign(1, static_cast<char>(n))
変換: std::string(1, static_cast<char>(n))

385 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 12:00:25 ]
str = static_cast<char>(n) が正解だね。これに何か不満でもあるの?



386 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 12:05:56 ]
>>384
>>385
サンクス

387 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 16:24:32 ]
C一通りやったつもりでいるし解説も読んだんだけど未だよくわからない、その過程過程が載っているとこでもないだろうか

int main (int argc, char *argv[]){←こいつなんですが

エントリポイントの引数ってことは解説サイト等見たところでもプログラムが実行させる時に渡されるものだというのはわかりました。
また、形態が文字列で、スペースで区切られ、argv[]の要素数がargcに入るのもわかりました。

でもその、プログラムが実行するときに渡される、という意味がさっぱりわかりません
例えばなんらかのソフトウェアをダウンロードし、自身で使うとき(ブラウザでもマルチメディアプレーヤでもなんでも)
.exeのファイルをクリックした際何かが渡っているんでしょうか?
ダブルクリックをして起動するだけですし、だとすると明示的にint argc, char *argv[]と書かなくてもいいことになってしまいそうで

すんごいこんがらがってます

int main (int argc, char *argv[]){でぐぐると解説が結構出るのですがもうさっぱりです

388 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 16:42:53 ]
>>387
例えばアイコンにファイルをD&Dして起動した場合、
argvにはそのファイルのパスが渡される。

コマンドプロンプトから起動する場合は、
任意のオプションを文字列として渡すことができる。


389 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 16:48:55 ]
コマンドプロンプトやファイル名を指定して実行では、
hege.exe /x /yのように実行ファイルの後に文字列(コマンドライン引数)を指定できる。
これがCのプログラムでは、mainの引数で受け取れるということ。
Windowsでは関連付け起動、実行ファイルへのドロップ&ドロップ起動などでもコマンドライン引数が使われる。

390 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 16:59:43 ]
>>388-389
早々にありがとうございます。

つまり先ほど例に出したものだと
WebブラウザならばそいつにhtmlファイルをD&Dするとそのhtmlファイルのパスが渡り、ブラウザが起動し、そのhtmlの内容を表示するとか
マルチメディアプレーヤなら音楽ファイルをD&Dするとその音楽ファイルのパスが渡り、プレーヤが起動し、その音楽が再生されるとか
といった具合でしょうか


391 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 17:14:11 ]
そういうこと。
ただし、ウインドウへのD&Dは全く別の仕組みなんで混同しないでね。

392 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 17:50:31 ]
UNIX使うと良くわかる。
#include <stdio.h>
int main (int argc, char *argv[]){
int i;
printf("argc = %d¥n",argc);
for(i = 0; i < argc;i++)
printf("argv[%d]=%s¥n",i,argv[i]);
}
exit(0);
}

ちなみにここ最近でargv[]で何が出来ないこれが出来ないと質問してるのは俺!
みんなありがとう!

393 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 17:53:31 ]
returnいらないの?exitの定義知らないんであれだけど

394 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 18:04:39 ]
exit()使ってるのにstdlib.hをインクルードしてないな。
ってか普通は return 0; だろ。


395 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 18:06:46 ]
つかエスケープ文字が全角だったり



396 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 19:49:45 ]
C++の入門書をやり終えました。
ですがいまいち、クラスの利点がわかりません。
部品化して便利になるというイメージはあるのですが。
まだC言語っぽい書き方をしてしまいます(C++っぽい書き方もいまいちわかりませんが)。
クラスの利点やC++の書き方について書かれた書籍ってありますか?

397 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 20:14:03 ]
>>396
>クラスの利点がわかりません。
まずは標準ライブラリを使いこなすところから始めたら?
そうしてクラスの利点が分かれば、自分で作ろうという気にもなるだろう

398 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 20:14:27 ]
>>396
適切な本を薦められなくて申し訳ないけど、まずは本で勉強するだけでなく
実際に書いてみて試行錯誤することが大切だと思うよ。

基本文法さえ分かったなら、あとはとりあえず自分であれこれ書いてみて、
まずいクラス設計をして使いにくいと感じたり、エラーが起きて原因を解決したり、
こういうことをしたいけどどう書いていいか分からないと悩んだり、
そういうことを経験したほうが深く理解できるよ。

そのうち、こういうことをするとうまくまとめて書きやすい、分かりやすい、などの利点が見えてくるはず。

本に載っている「正しいやり方」だけを学んでそれをなぞるだけだと、
理解したつもりになっていて実は分かっていない、ということになりがち。

仕事なら早く身につける必要があるだろうけど、学生や趣味でやるなら時間をかけてもいいんじゃない?

399 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 20:28:34 ]
クラスの勉強と思って簡単なゲームを作ってみたんだけれども、クラス間のやり取りが面倒すぎてやめた

あるAクラス内の配列をBクラスのメンバ関数から参照したいとき、とか
friendってのもあったがそんなこというと全部のクラスにfriendつける必要でるし、
クラスのうまい利用の仕方とか載ってる本探すべきっぽいなぁ

400 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 20:43:17 ]
C++でnewしたヤツをdeleteする時、
newした時の型のままのポインタをdeleteしないとダメ?

キャストされて別の型になってるポインタをdeleteしても
大丈夫?

401 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 20:44:45 ]
>>400
virtual

402 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 20:57:41 ]
>>400
new したときのクラスの基底クラスにキャストされてるポインタは、その基底クラスが
virtual なデストラクタを持っていれば delete できる。

403 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 00:14:23 ]
>>399
何がやりたかったのかわからんが、多分それはクラス設計ミス。

404 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 00:16:01 ]
>>399
参照するだけなら、クラスAの配列の要素にアクセスするメンバ関数をinlineで作るとか

405 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 03:59:03 ]
クラスの設計って難しいよねぇ。
PDO(PHPね)とか使うと、オブジェクト指向すげぇ!って感動するけれど、
自分でいざ、クラス設計してねって言われると、Orz。
何かコツがあるのかしらん?
Cのライブラリでも、構造体使ってうまくオブジェクト指向っぽいもの?を実現しているのを見ると、
感激する!



406 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 06:07:46 ]
もっとレベルの高い環境に触れないとわからんよ

407 名前:399 mailto:sage [2007/12/17(月) 09:21:57 ]
クラス設計、やっぱそういう本探してこよう・・

一応やってたのは、配列にフィールドというかマップのフラグみたいなものを格納したいた。
配列の要素内には数値が入っていて、それによってその1マスがどういう状態なのか示すように。

で、よくわからずクラスをマップごとに分けてたんだ、例えばドラクエでいうと宿屋の中と町の中が別クラス
そんな状態で宿屋で休むと町の様子が変化したりetcをやろうとして爆発した

408 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 11:46:43 ]
>>396
個人的には398に同意だけど、初学者向けの本であれば
「ゼロから学ぶ C++」(日経BP)って本に、CからC++への
移行時の要点ということで、クラスや継承を使うと便利な
ケースと使わない方がいいケースとか、is-a、has-a関係
とかの基本的な話が簡潔に載ってた気がするので、
立ち読みしてみてもいいかも。
ただかなり平易なので、ネットで効率よく検索できれば
不必要(または物足りない)かもしれないけど。

409 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 11:47:57 ]
長文失礼、ちょっとC++プログラムのコーディングでいい方法があれば誰か教えて下さい。

今、簡単なライブラリ的なクラスを作りました。それは継承されることを前提として
います。仮にそれをKihonとしておきます。

今、Kihonの派生クラスHaseiを作りました。HaseiからKihonを使う方法ですがまず、Kihonの
メンバ関数を通じて必要なパラメータ(privateな変数)を設定します。次にHaseiに
double func(double x)なメンバ関数を定義します。これはKihonクラスでvirtual関数として
宣言されているものです。その後、Kihonのrunを実行するとHaseiのfuncが利用されて
処理が行われるというものです。一回のrunでfuncは何度も呼ばれます。

問題なのはHaseiで異なる二つの処理をKihonのrunにさせるにはどうしたらいいものかということ
です。つまり、異なる相異なる2関数に対してKihonのrunを実行するにはどうすればいいのかと
いうことです。しかも後に実行されるrunが前に実行されたrunの結果を使う必要があります。

初心者なりに考えた方法ですと・・・
0, Haseiのオブジェクトh0を作る。
1, Haseiのfunc関数を作る。この関数内で別のクラス、__Haseiのオブジェクトh1を作る。__Haseiは
Kihonを継承している。
2, 最初のrunで必要なメンバ関数funcを__Haseiで定義する。
3, Haseiのfunc関数からh1.runとして最初のrunを行う。
4, h0.runとして二度目のrunを行う。
(メンバ変数の設定に関しては説明略)。

実際、この方法だととりあえずは動作するのですが次のような問題点があります。
・__HaseiからHaseiのプライベートメンバにアクセスできない。(friendでは次項が解決不能…)
・実はHasei自体もライブラリ的に実装を隠蔽してしまいたいため、__Haseiのfuncを変更
出来るようにしたい。(ちなみにHaseiのfuncは固定。)

多重継承をうまく使うと解決できそうにも思えるのですが賢い、実装方法はないでしょうか。
お力をいただけると幸いです。根本的にKihonの設計に対する指摘でもお願いします。

410 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 11:59:51 ]
>>409
いろいろわからん。コード書け。あと __ は使うな。

411 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 12:25:04 ]
>>409
適当に思い浮かんだ単語

スレッド
static メンバー
boost

412 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 12:54:23 ]
「初心者なりに考えた方法ですと・・・」の部分、ただしコードを全部書くとさらに長大になってしまうので
掻い摘んで。(409のHasei→Hasei0、__Hasei→Hasei1とした)

class Kihon{
virtual double func(double x){return 0.0;} /* =0としてしまってもよい */
public:
double run()
{
... /* runの実装部分 */
for (j = 1; j <= n; j++)
func (x); /* funcは何度も呼ばれる */
return ret; /* 計算結果を返す */
}
};

class Hasei1: public Kihon
{
double y;
double func(double x){return x*sin(x+y);} /* 計算対象 */
public:
void set_y(double y){this->y = y;}
};


413 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 12:54:54 ]
class Hasei0: public Kihon
{
double func(double x){
Hasei1 h1;
h1.set_y(x);
... /* h1のprivate変数を設定など */
return 1.0 - h1.run();
}
};

int main()
{
Hasei0 h0;
.....
cout << h0.run();
.....
}

例えばx*sin(x+y)の多重積分を想定している感じです。実際にはこれ以外にもたくさんありますが。
本来ですと計算対象は(例えば別のクラスを宣言することや、関数へのポインタでもいいですが)自由に変更出来ること、
そもそもHasei0も1も実装は隠蔽してしまいたい、計算対象はパラメータを含んでいるので本当はクラスとして実装
したいというのがありますが恐らく、これでは無理でしょうからいいアイディアはあるでしょうかという意味です。
よろしくお願いします。

414 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 13:01:11 ]
boostって知りませんでした。ちょっと調べてみます。

415 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 13:01:37 ]
>>409
多重継承だけは使うな。
あとでワケわかんなくなる。




416 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 15:15:36 ]
>>413
ようわからんがtemplateとかboost::bind(std::bind1st, std::bind2nd)使えばよさそうな気がする。ファンクタも調べた方がいいかも。
試しに同じような事するの書いてみた。

template<typename Func> double kihon(Func func)
{
 for (j = 1; j <= n; j++)
  func(x);
 return ret;
}
double hasei1(double x, double y) { return return x*sin(x+y); }
double hasei0(double x) { return 1.0 - kihon(boost::bind(&hasei1, _1, x)); }

int main()
{
 kihon(&hasei0);
}

417 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 16:17:11 ]
>>416
本当にどうもありがとうございます。まだ、自分のプログラムでは解決していませんが言わんとしていることが
よくわかります。たしかにテンプレートを関数のポインターに使えば解決しそうです。C++は初めてなので
参考になります。重ね重ね、ありがとうございます。


418 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 18:05:37 ]
あるライブラリ(A)をラップした、全く同一のインターフェイスが使えるDLL(B)を作りたいのです。
つまり、DLL(B)はライブラリ(A)のすべての関数をエクスポートします。

これを実現するために(とりあえずwin32環境限定の話)
ライブラリ(A)をDLL(B)にスタティックリンクさせ、ライブラリ(A)の各関数宣言に
__declspec(dllexport)をつけたファイルをDLL(B)からインクルードさせたのですが、
どうもこれでは上手くいかないようで、DLL(B)からライブラリ(A)の関数がエクスポートされていませんでした。
そこで質問なのですが、DLLからライブラリを直接エクスポートすることは可能なのでしょうか?
もし可能ならやり方を教えていただけるとありがたいです。

(ライブラリ(A)をDLLにするという方法はとりあえず却下でお願いします。
今は別の方法としてライブラリ(A)のソースファイルを直接DLL(B)に追加しています)

419 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 18:48:06 ]
VC++2005StandardでMFC使おうとしてるんですが
ウェブで調べてもVC6.0系の使い方ばかりで全然分かりません
2005のMFCの入門的なサイトってないですか?
できればopengl を絡めたところがいいんですが

420 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 18:55:07 ]
MFCはマイクロソフトファンダメンタルクラスだろ? バージョンによって言語(クラス)の使い方が変わるかよ
6用でも関係ないだろ

421 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 19:05:27 ]
クラスウィザードとかを使うのに、IDEのどこのボタン押して、どの選択肢を選べばいいのか?
・・・ってのを知りたいのじゃね?

422 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 19:53:19 ]
そういやVC2008EEが来るな

423 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 20:02:56 ]
VC2005でもういいです

424 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:09:24 ]
Hoge hoge1;
Hoge *hoge2 = new Hoge();

の違いがよくわからないのですが
newした場合、普通に宣言するより良いことがあったりしますか?

425 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:15:06 ]
>>424
絵に描いたような初心者か、釣りか、のどっちかだな



426 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:17:47 ]
ヒープ領域は量が多い (ハードディスクもメモリ代わりになる)
自分で変数の領域を開放できる
ヒープに確保すれば、高速な動作が必要な変数をスタック領域、レジスタ領域に割り当てられやすくなる

427 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:19:40 ]
大量にメモリ食うやつは全部newとかにしておけばよい 
実メモリを多く空けておくことが大事

428 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:21:41 ]
STL 頼ってるから最近 new 使ってないな…

429 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:27:03 ]
メモリどうこうより、初心者には寿命の違いを説明した方がいいのではなかろうか

430 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:27:30 ]
調べてきたけど、スタック領域はコンパイル時に決定されるらしい
メモリ食うやつは、動的に確保しないとプログラム終了までスタック領域として確保されっぱなしってことだ
他のプログラムや自分のプログラム内でもメモリ確保が難しくなるということだ

431 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:31:08 ]
30バイト以上の確保は動的確保にしようぜ newやvectorやstringを使おう

432 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:31:23 ]
>>424
Hoge hoge1; 
の場合、hoge1の寿命がその関数(あるいはブロック)に縛られる。
関数を抜けた後もhoge1を維持することは出来ないし、関数を抜ける前にhoge1を消すことも出来ない。

Hoge *hoge2 = new Hoge();
の場合、hoge2の寿命は自分でコントロールできる。
関数を抜けようが抜けなかろうが、deleteするまでは消えないし、deleteすればいつでも消せる。

433 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:35:35 ]
配列は動的確保、自動開放するvectorがあるけど 変数は動的確保、自動開放する命令ってないよね?
Hogeクラスが5Mとか使うとは想像していないのだろうか?

434 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:36:37 ]
auto_ptrのことか?ちょっと違うか?

435 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:57:06 ]
class Hoge{ char x[10000]; };

auto_ptr< Hoge > hog(new Hoge);

こうやって使うのか 勉強になった でもアクセスが*付けないと駄目で不便だよね



436 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 22:02:26 ]
そんなあなたに
boost::scoped_array
boost::shared_array

437 名前:424 mailto:sage [2007/12/17(月) 22:06:21 ]
しょうもない質問に答えてくれてありがとうございます

とりあえず普通に宣言しておけば大丈夫だ
なんて思ってた自分が馬鹿でした・・・
しっかりdeleteする必要がありますが、
なるべく動的確保にしておいた方が良いんですね

もうすこし自分でも調べてみようと思います
ありがとうございました

438 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 22:10:48 ]
int型やchar型やdouble型の変数を動的確保するのは止めよう
あとループの変数も動的確保するのは止めよう
判断基準は、メモリを消費するかどうかだろう

439 名前:!=438 mailto:sage [2007/12/17(月) 22:27:09 ]
>>438
判断基準に「(ループ内など)速度が必要か否か」も加えるといいかも。
10万回、100万回のループになると毎回newするのも…

まぁ、その場合は最初にnewして使いまわせ、って話になるわけだが。

440 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 22:30:32 ]
ループ内で毎回な別領域の確保が必要な場合はあるけどね・・・
流用できるなら内部でしたらだめだな

441 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 22:38:19 ]
基本的にループの変数は直前に確保した方が良いのかなあ
以前から使っている変数だと、レジスタにのっている可能性は低いし、ループで使うからと言って移動はしないよね?
for( int )だと最適化されそう

442 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 23:12:40 ]
>>441
変数の用途が明確な方が最適化対象になりやすい。

443 名前:デフォルトの名無しさん [2007/12/17(月) 23:42:33 ]
別のスレッドで返答がもらえなかったのでこちらで。

なぜcallocは2引数関数なのでしょうか。ゼロクリアするだけならmallocのように1引数でも可能だとおもいます。
2引数のほうが最適化しやすいからだときいたことがありますが、具体的にはどのような最適化が考えられるでしょうか?


444 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 23:51:31 ]
callocのcて何て意味?

445 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 23:52:34 ]
>>443
例えば80486以降のインテル系CPUはSTOSB STOSW STOSDという三つの命令があり、
それぞれバイト、ワード、ダブルバイト単位でレジスタから転送を行う。
他のCPUでもサイズに応じた専用のインストラクションを持っていることはよくある。
そのどれを使うかとかいったヒントになる可能性があると思う。



446 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 23:53:00 ]
clear?


447 名前:445 mailto:sage [2007/12/17(月) 23:53:15 ]
ダブルバイトってなんだよ。ダブルワードの間違いな。

448 名前:デフォルトの名無しさん [2007/12/17(月) 23:56:16 ]
>>445
なるほど。ありがとうございます。
しかしその程度なら、要求されたサイズの下位数ビットを見れば判断できる気もするが・・・。

449 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 00:05:43 ]
>>443

callocは一応「配列を確保する関数」だからじゃない?

最適化に関しては↓がヒントになるかも。
www.bohyoh.com/CandCPP/FAQ/FAQ00096.html


450 名前:デフォルトの名無しさん [2007/12/18(火) 00:09:54 ]
>>449
最適化については何も解説していないような・・・


451 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 01:03:49 ]
>>420
ファンダメンタルかよ

452 名前:デフォルトの名無しさん [2007/12/18(火) 02:16:52 ]
signed型へ<<や>>演算したときの結果の符号ビットや符号拡張有無って
規格で決まっていますか?


453 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 02:32:06 ]
>>452 いいえ。

454 名前:デフォルトの名無しさん [2007/12/18(火) 09:57:37 ]
C++ 初心者です。C++ でこんなコードを見かけたのですが、 struct S { S( int x ) : x_( x ) {} int x() { return x_; } int x_; }; 2 行目の意味がわかりません。とくに x_( x ) {} の部分が頭の中でパーズできないんですが、これは何を定義しているの?

455 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 09:59:38 ]
: x_( x ) だな
x_をxで初期化している

コンストラクタ初期化子とかでぐぐると幸せになるかも



456 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 10:37:10 ]
この書き方で「2行目の意味が」ってのも凄いな
ナチュラルな喧嘩の売り方するなぁと感心したw

457 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 10:42:22 ]
コンストラクタの初期化子で配列の初期化ってできる?






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

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

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