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


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

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



1 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:25:51 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.63【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1231499251/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。


196 名前:195 mailto:sage [2009/02/26(木) 06:51:07 ]
すいません
スレ移動します

197 名前:195 ◆Ci3UmwhFqY mailto:sage [2009/02/26(木) 07:18:27 ]
>>196 は他人です

198 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 10:37:07 ]
何でメリットがないと思ったのか、それが知りたい。

199 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 12:19:36 ]
つnew, singleton

200 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 12:23:18 ]
コールバック関数のポインタを取るCスタイルのAPIへなんとかしてクラスを配送したいときに

201 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 02:01:54 ]
質問です。

class Foo { void Bar(void* ptr); };
void Foo::Bar(void* const ptr) {}

VisualC++2008 にてこの様なクラスを作ったところ、コンパイルエラーも警告も出ずにコンパイルが通りました。
疑問に思ったのは Foo::Bar の引数を、void* から void* const に変えてもエラーが出ない事です。

これは文法的に正しいんでしょうか?それともVC++の独自拡張だったりするんでしょうか。

202 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 02:10:38 ]
文法的にOK

203 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 02:21:40 ]
>>201

class Foo { void Bar(int ptr); };
void Foo::Bar(int const ptr) {}

が問題ないのと同じこと。

204 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 02:51:20 ]
>>202-203
仮引数にconstをつけるのは実装と宣言で違っても文法的に問題無いのですね。
勉強になりました、ありがとうございました。



205 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 05:09:10 ]
とても基本的なことなのですが、
符号なし整数の変数で与えられた数 N - 1 から 0 まで順番に処理をするループは、どう書くのが一般的ですか。
for (size_t i = N - 1; i >= 0; --i) だとダメですよね。

自分が考えた書き方は、
const size_t N = ...;
for (size_t i = N; i > 0; --i) hoge(i - 1);
for (size_t i = 0; i < N; ++i) hoge(N - i - 1);
for (size_t i = N - 1; i != ~0; --i) hoge(i);
ですが、どれも使われるのでしょうか。

206 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 05:13:20 ]
size_t i = N;
do { --i; hoge(i); } while (i > 0);


207 名前:206 mailto:sage [2009/02/28(土) 05:14:35 ]
ああ、書いてから気づいたけど >>206 は N が初めから 0 だったらダメだね

208 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 05:36:00 ]
T i = M; //M = N - 1ということで
do {
hoge(i);
} while (i-- != 0);
これだと、MがT型の最大値でも対応できるはず。

209 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 06:46:33 ]
>>205
普通に for (size_t i = N - 1; i >= 0; --i) を使ってるけど
size_tを使う理由が分からない

210 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 08:29:35 ]
>>209
メモリのサイズを意味するときはsize_tを使うようにしてる
64ビット環境だとunsigned long longになるのかな

211 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 11:52:40 ]
>>209
> i >= 0;

↑は符合無しだと常に真だろ。

212 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 11:53:48 ]
何か問題でも?

213 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 11:54:56 ]
for (i = 0; i > N; ++i) {;} // ループ中に前後の値が影響しない場合。
if (N > 0) for (i = N - 1; i >= 0; --i) {;} // ループ中に前後の値が関わってくる場合。
while 系をカウントループに使うのは愚策と考える。

214 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 12:02:05 ]
>>212
やめられない、とまらない



215 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 12:33:44 ]
while(N-->0)は普通に使うだろ
--が矢印に見えるから「Nを0にするまで」って視覚的にわかりやすいじゃん

216 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 12:39:17 ]
その考えはなかった

217 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 12:43:37 ]
>>215
そんな餌にクマー
まあでも>>205の要求にあってるしシンプルでわかりやすいな

218 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 13:16:49 ]
>>215
ああ、意外と面白い使い方かも・・・

視覚的にわかり易く書かない場合は
>0は書かなくても大丈夫か

219 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 14:09:16 ]
有名だろ、それ

220 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 14:16:21 ]
ぶっちゃけ初めて見た

221 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 14:20:36 ]
ソース自体は見た事があるような気もするけど、考え方は初めて見た。

222 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 16:14:42 ]
減少していくのに減少していく方向が空いてるのはなんとなく怖いなぁ

223 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 17:18:11 ]
>>215
while(N-->0) って見た目が素敵だな


224 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 17:23:55 ]
AAのプログラム言語とかなら、見た目で分かりやすいかもな・・・



225 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 17:39:46 ]
befungeのことですね!!

226 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 17:41:03 ]
面白そうだけど絶対コーディングしにくいな
ほぼ記号だろw

227 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 20:31:33 ]
さすがショートコーディングスレ。
ためにな・・・って、あれ?


228 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 18:45:19 ]
繰り返し処理のことを何ていいますか?
専門的にお願いします。

229 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 18:49:47 ]
反復処理とか繰り返し処理とか

230 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:00:35 ]
繰り返し処理のことを何ていいますか?
専門的にお願いします。

231 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:01:14 ]
反復処理とか繰り返し処理とか

232 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:38:29 ]
>>210
メモリのサイズを入れる型ってsize_t以外になんかなかった?

233 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:50:58 ]
繰り返し処理のことを何ていいますか?
専門的にお願いします。

234 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:55:57 ]
ループ処理じゃね?w
反復も繰り返しだろうけど、お前は違い分からないだろう



235 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:26:00 ]
ぶっちゃけC/C++の話じゃないからスレ違い

236 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:29:11 ]
>>234>>231>>229
もうちょっとかっこいい言い方あるだろ
それを教えろ

237 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:31:09 ]
>>236
死ねハゲ

238 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:31:47 ]
反復処理とか繰り返し処理とか

239 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:47:20 ]
リピート

240 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:14:30 ]
>>228-231
見事な繰り返し処理
>>232は空気嫁

241 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:19:39 ]
>>232
ssize_tとか、でもCでもC++でも標準ではないけど。

242 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:24:27 ]
>>232
ptrdiff_tのこと?ポインタ同士の引き算の型だからちょっと違うが

243 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:34:14 ]
>>241 >>242
そうだな。size_tでよかった。


244 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 05:50:11 ]
まだ初心者なのですが、batファイルをC++builder6で
ボタンを押したら実行するようにしたいので

ShellExecute(Handle,"open",ファイル名.c_str,NULL,NULL,SW_SHOW);

と書いたのですが、うまくいきません・・・どなたか教えてくださいOTL



245 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 06:13:52 ]
>>244
何故、どう巧くいかないのか書かないのですか?

246 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 06:28:56 ]
実行はされるのですが(コマンドプロントが一瞬表示される)
バッチファイルの中身自体が実行されません;;

247 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 06:39:59 ]
batの最後に

pause

入れとけ


248 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 07:00:46 ]
>>247
ありがとうございます。

やってみたところ指定されたパスがありませんとのことでした。
普通にbatファイルを起動すると何も問題がないのですが・・・
原因などわからないでしょうか?

249 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 07:08:14 ]
ファイルパスをちゃんと指定すればいいじゃん・・・

250 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 07:12:19 ]
できました!
こんな時間に、質問に答えてくださりありがとうございました
大変助かりました。

251 名前:デフォルトの名無しさん [2009/03/03(火) 18:34:32 ]
以下のような感じで「*」の前後にスペースが
入っている場合もポインタの宣言なんでしょうか?

static unsigned int * ADDR;

スペースが、後だけのもは参考書にも紹介されていますが
前後両方ともスペースのものは見つかりませんでした。

よろしくお願いいたします。

252 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 19:01:49 ]
vector<string> * const (&u)[buf]; // こんな感じですか?

253 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 19:06:04 ]
>>251
おんなじ。空白類がいくらあろうと関係ない。

254 名前:デフォルトの名無しさん [2009/03/03(火) 19:47:28 ]
>>252
static unsigned int * ADDR;

全くこのままのコードです。

>>253
ご回答有難う御座いました。
もやもやしていましたが、これですっきりしました。



255 名前:デフォルトの名無しさん [2009/03/04(水) 03:11:45 ]
VC++9の質問です。Unicode環境で
Void Func(LPCSTR pMsg);
みたいな関数があって、ここに文字列を渡すのですが、
Func("xxx");
というように普通に書くと問題ないのですが、
Func(_T("xxx"));
とやると、
const wchar_t[3] から LPCSTRに変換できません、みたいなエラーが出ます。
全ての文字列を_T("") で括ればいいのかと思ってたのですが、違うのでしょうか?


256 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 03:14:42 ]
>>255
_Tで括るのはLPC"T"STRのとき。
LPCSTRはconst char*のtypedefだから_Tは要らない。

257 名前:デフォルトの名無しさん [2009/03/04(水) 03:25:58 ]
>>256
なるほど、ありがとうございました。

258 名前:デフォルトの名無しさん [2009/03/04(水) 13:36:24 ]
初歩的過ぎてすいませんが...

すでに宣言してある配列の配列数を求めて
それと同じ配列数の配列を宣言するには
どうすればいいですか?

よろしくお願いします。

259 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:39:38 ]
>>258
配列数はプログラム書いた人しか知らないから無理
それができたら配列のオーバーフロー管理も楽なんだけど


260 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:44:40 ]
>>258
状況がよくわからん

261 名前:259 mailto:sage [2009/03/04(水) 13:44:42 ]
sizeof(配列) / sizeof(型)
でいいか
マクロで定義して同じマクロ使うとか


262 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:49:06 ]
char a[]={10, 10, 10};
char b[sizeof(a)];
int c[(sizeof(a)-1+sizeof(int))/sizeof(int)]

263 名前:258 mailto:sage [2009/03/04(水) 13:53:28 ]
すいません言葉が足りなすぎました。。

int a[]= {1,2,...};

size=sizeof(a)/sizeof(a[0]);

int b[size];

として同じ配列数の新しい配列を宣言しようとしてもできません。

264 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:56:39 ]
C++ なら const int size
Cなら int b[sizeof(a)]



265 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:57:14 ]
>>263
size の型は何か

言語をいえ言語を
C か C++どっちだ
あとCならC89かC99なのか

266 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:57:33 ]
>>263
コンパイラも

267 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 14:03:12 ]
>>265
C++です。
size の型はintです
>>266
gccです。

268 名前:258 mailto:sage [2009/03/04(水) 14:08:43 ]
const int size = sizeof(a)/sizeof(a[0]);

int b[size];

として宣言できました。

ありがとうございました。

269 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 15:03:27 ]
配列の要素に変数が使える規格って無かったっけ


270 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 15:30:51 ]
>>269
C99だろ

271 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 17:19:24 ]
連立方程式のを渡したら戻ってくる関数ってありますか?

272 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 17:20:51 ]
>>271
標準にはない
標準じゃなくていいならある

273 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 09:53:35 ]
assert()と_ASSERT()ってなにか違いがあるのでしょうか?

274 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 10:11:11 ]
assertはC/C++標準
結果としてabort()
_ASSERTはVC++独自
_CrtSetReportMode等で動作の調整が可能



275 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 18:14:15 ]
メンバ関数のポインタの宣言はCxxx::*funcなのに
取得はCxxx::&funcでなく&Cxxx::funcなの?
&がなんで宣言の時の*の位置より移動するの?

276 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 18:40:47 ]
>>275
発想としては、Cxxx::という修飾が
メンバへのポインタ型では*にかかっていて、
メンバへのポインタを得るときには、メンバ名funcにかかっている
ということのようだ。

277 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 18:51:32 ]
俺としては逆なんだが
なんでCxxx::&funcなの?
どこのクラスのメンバ関数のアドレスか分からんが

278 名前:デフォルトの名無しさん [2009/03/05(木) 20:41:28 ]
大変だー
さっぱりわからん

279 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 20:43:44 ]
>>278
何が分からないんだかさっぱり分からないぞ

280 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 20:44:43 ]
>>275
単に文法的な曖昧さを除いた結果そうなっただけ。

class A {
public:
 static void (*A::func)();
};

としてしまうと、static メンバ変数の実体定義がこうなってしまう。

void (*A::A::func)();

どっちがどっちの A:: やら分からん。

281 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 21:16:46 ]
もうクラスのメンバ関数のポインタは無しで

282 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 22:09:09 ]
9割くらいBoostやTR1のbind(暗黙のmem_fun)と一緒にしか使わない。

283 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 22:41:19 ]
delegate パターンで使うね

284 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 01:31:13 ]
じゃあdeleteパターンで



285 名前:276 mailto:sage [2009/03/06(金) 19:49:52 ]
>>276, >>280
すみません、レス読んでも、それが
取得はCxxx::&funcでなく&Cxxx::funcなの?
の回答になるのか、さっぱり理解できないですが><

あと、&Cxxx::funcは&(Cxxx::func)としては良くないと本に書いてあるんですが
なんで良くないんですか?

286 名前:デフォルトの名無しさん [2009/03/06(金) 20:12:15 ]
なんか抽象クラスをインスタンス化できないらしいのですがどうすればいいですか?
派生クラスは無いのですが
その派生クラスの無い抽象クラスが型な引数をとる関数を使いたいのですが初期化?の方法がわかりません

287 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:16:31 ]
>>286
まずは、その抽象クラスへのポインタ型か参照型を引数にしている?

288 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:24:22 ]
>>287
ポインタ型を宣言してます、いろいろ上手くいかなかったのでポインタで宣言、元の抽象型で宣言、アドレスをポインタ型に代入→引数に
としてます、エラーメッセージはメンバが抽象型です、宣言を確認してください、です

289 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:27:48 ]
>>286
派生クラスがない、ではなく、派生クラスは自分で作れということでは?

290 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:29:59 ]
ああ、そうかもしれない

291 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:43:25 ]
"派生クラスの無い抽象クラスが型な引数をとる関数"
これ、抽象クラスのインターフェイスを使って新しいクラスを作れということ

292 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:56:18 ]
覚えておきます、ありがとうございました

293 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 22:13:20 ]
>>285
普通の関数でも&(func)はよくないだろ?
そういうこと

294 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 22:51:58 ]
>>293
普通の関数で、&funcを&(func)にするとコンパイルエラーにでもなるのか?

>>280 のvoid (*A::func)(); は何を宣言しているんだ?
本人はメンバー関数へのポインタ宣言のつもりなのかな
これだと、俺俺的にはfuncはスコープAにあり、引数void型で戻り型voidの関数を指すポインタの宣言してると解釈するんだが
つまり、funcは引数void型で戻り型voidの関数ならA::以外のでも受付OK
そうなると、funcはA::以外のでも受付OKなのにメンバー関数へのポインタ宣言ですって言えないよな
そうなるから、*Cxx::じゃなく、Cxx::*をメンバーへのポインタ宣言としているだろ
俺俺解釈間違ってる?



295 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 23:05:45 ]
>>294
関数は式中に現れると関数ポインタに暗黙変換される
だから(func)はfunc関数へのポインタで、&(func)はそのポインタのアドレスになる
つまり関数ポインタへのポインタになる
そして(func)は右辺値だから、そんなものを使うとろくなことにならない

一方&funcは、関数が単項&演算子のオペランドの場合は関数ポインタに変換されないと特別に決まってるから
無事にfuncへのポインタが取れる


と、思ってたんだがよくよく読むと()の中身が関数の場合は特別に()を外しても関数になると決まっているらしい
だから&funcも&(func)も全く一緒だ
すまん

296 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 23:59:08 ]
グローバル変数についての質問です。
C言語の参考書などには「グローバル変数は初期化をしなくてもはじめから0が入る」
と書かれていたので今まで特に初期化処理を追加せずに書いてきたのですが、
プログラムの途中でグローバル変数を初期化(中身を全て0にする)処理を入れる必要が出たので

//EDIT_DATAは構造体配列で事前にDATA EDIT_DATA[16][64][34][64]と宣言しています。
 memset(EDIT_DATA, 0, sizeof(EDIT_DATA));

という処理を加えたところ途端にメモリの使用量が跳ね上がりました。
最初から0が入っているのであれば、新たに0を入れ直してもメモリの使用量はかわらないと思ったのですが、どうやら違うようなので
いったい初期化処理を行っていない宣言した直後のグローバル変数と
memsetを利用し初期化処理を行ったグローバル変数では何が違うのかを教えて頂きたいです。






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

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

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