トップページ⇒tech
1001コメント325KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/03/05(金) 16:51:13
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.71【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1264774545/

【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
http://codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め)

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
0516デフォルトの名無しさん2010/04/26(月) 21:45:13
みなさんありがとうございます。

>>513
blockSizeは4が入ってます。
一応RIFF , fmt , dataなどの文字を確認してヘッダー読み込みOKとしてます。

>>515
変えても何も起こりませんでしたが、確かにマイナスが入るというのは考えにくいですね
こうしておきました。
05175122010/04/26(月) 22:00:48
typedef struct _RIFF{
  char riff[4];
  int fileSize;
  char formatType[4];
}RIFF;

typedef struct _FORMATCHUNK{
  char id[4];
  int idFormatSize;
  short int formatId;
  short int channel;
  int sampleRate;
  int bytePerSec;
  short blockAlign;
  short bitsWidth;
}FORMATCHUNK;

typedef struct _DATACHUNK
{
  char id[4];
  int size;
}DATACHUNK;

ちなみにwaveHeaderは各構造体を持っているだけで
主要な部分のみgetメソッドを作りました。読み込まれたか確認するのは>>516の通りで
ヘッダーの最後にあるDATACHUNK内のsizeを見ても正しいデータが入ってますので
構造体の値はOKかと
0518デフォルトの名無しさん2010/04/26(月) 22:13:49
>>512
全て0ってのはどうやって確認してるのかな
出力の一部分だけ覗いてるならその部分がたまたま無音だったとか
05195122010/04/26(月) 22:25:12
>>518
そこはバイナリエディタで開いて確認しました。
最初の方は確かに0でしたが、一回目のfreadで全部読み込める程度しか
なかったので、全部0になっていると判断しました。

あと、いい忘れていましたが、小さいファイルなら do whileを抜けてプログラムが終了しますが
大きいファイルは do whileを抜けてきません。
0520デフォルトの名無しさん2010/04/26(月) 22:36:11
>>512
ソースうp!
0521デフォルトの名無しさん2010/04/26(月) 22:39:06
4*4000=16000
05225122010/04/26(月) 22:49:34
すいません。少し出かける用事がありますので。
今日は一旦締めせていただきます。
みなさんお付き合いいただき。どうもありがとうございました。m( _ _ )m

>>520
また後日お伺いする機会があれば
是非、よろしくお願いします。

>>521
その通りですね。恥ずかしいです。( /// )
0523デフォルトの名無しさん2010/04/28(水) 06:34:30
age
0524デフォルトの名無しさん2010/04/29(木) 04:37:54
2次元の座標を返す関数を作る予定です

POINT GetPoints() 戻り値が座標の場合
関数が失敗したかどうか分からないので


・bool GetPoints( POINT &out )
戻り値をboolで関数の成功判定、結果を入れる変数渡す

・POINT GetPoints()
失敗の場合(-1,-1)の座標を戻り値とする

どちらの方がいいかな?
両方のパターンを見たことがあるので気になった
0525デフォルトの名無しさん2010/04/29(木) 05:01:18
C++なら
・例外を投げる
・boost::optional<POINT>を返す
0526デフォルトの名無しさん2010/04/29(木) 08:14:57
>>524
その用途で言えば -1,-1 の座標を返すのだけは無しだと思う
個人的には bool 戻す形だな。もしも関数の失敗が通常は起こらない純粋な失敗なら例外でもいいけど、
もしもそれが有効範囲/リージョン判定等でも利用される想定ならシンプルに bool戻す
0527デフォルトの名無しさん2010/04/29(木) 08:18:01
(INT_MIN, INT_MIN)を返すようにしたことならある
0528デフォルトの名無しさん2010/04/29(木) 08:27:42
POINT* GetPoints()

にして NULL を返すのはあり?
0529デフォルトの名無しさん2010/04/29(木) 08:28:57
毎回newすんの?
それはないわ
0530デフォルトの名無しさん2010/04/29(木) 08:33:56
std::pair<bool, POINT> は?
0531デフォルトの名無しさん2010/04/29(木) 14:25:59
>>524
例外を投げろ。
C++なら例外と、例外安全くらいはどっちみち知らなきゃだめだから
勉強しよう。
。
0532デフォルトの名無しさん2010/04/29(木) 15:16:46
>>531
例外も例外安全もC++だけの話じゃないぜ。どの言語でも同じ。
例外機能の無い言語なら、より広い意味での「エラー安全」ね。
0533デフォルトの名無しさん2010/04/29(木) 15:17:23
>>524
エラーがほんとに例外的におきるものなら、例外がいいな
普通にありえるものならそんなのに例外使っちゃいかん
0534デフォルトの名無しさん2010/04/29(木) 18:20:09
こういうのは?

if(IsPointsValid()){
  POINT  pt = GetPoints();
  ...
}
0535デフォルトの名無しさん2010/04/29(木) 19:27:48
>>531
最近、例外安全って言葉を覚えたばかりの人とかは何でもそれを使いたがるかもしれないが、
それはそもそも 「例外的な何かが起こった場合の対処」 を行い、安全にしようって事なので、

元の質問にある「関数が失敗した場合」が何を指すのかによって話しは違ってくるぜ。
他の人も言ってるが、それが本当に例外的な意味での失敗なら例外投げた方がいいが、
そうでない場合、別の手段の方がいい。 そして勉強って意味だと、これらの話を理解して、
何でもそれにする、みたいな頭悪い処理は書かないようにした方がいいぜ
意味がちゃんと伝わると嬉しいが。
0536デフォルトの名無しさん2010/04/29(木) 19:30:27
あ、あと当たり前だけど、これらは別に排他の関係じゃないので、
両方実装したっていいんだぜ。 内容次第じゃ冗長にはなるけども、
しかしあえて冗長に書いて勉強の内にするって手もある。
・・・が、そもそも勉強の意図があるのかどうか不明なので、余計なお世話かもしれないけどもw
0537デフォルトの名無しさん2010/04/29(木) 19:48:21
つーか、コーディング規約次第だよな。
Win32 API風なら エラー判定値を返す HRESULT GetPoints(POINT *out)
最近のboost風なら 例外を投げる POINT GetPoints( ) と
空値を返す optional<POINT> GetPointsOpt( ) を両方用意するとか。
設計思想によるとしか。
0538デフォルトの名無しさん2010/04/29(木) 20:18:13
VECTOR2 a;
D3DXVECTOR2 b = a;

D3DXVECTOR2に自分で定義したVECTOR2を代入したいので以下のようにやったんですが
ランタイム スタック オーバーフローの警告が出ます。
警告を出さないようにするにはどうしたらいいのでしょうか。

class VECTOR2{
VECTOR2():x(0), y(0){}
operator D3DXVECTOR2() const { return static_cast< D3DXVECTOR2>( *this); }
FLOAT x, y;
};
0539デフォルトの名無しさん2010/04/29(木) 20:26:54
これじゃいかんの?
operator D3DXVECTOR2() const { return D3DXVECTOR2(x, y); }
0540デフォルトの名無しさん2010/04/29(木) 20:27:08
>>538
なんでキャストなんか使うの?
ちゃんとオブジェクト作って返せよ。
0541デフォルトの名無しさん2010/04/29(木) 20:40:38
そうでした。ありがとうございます
0542デフォルトの名無しさん2010/04/29(木) 20:52:27
>>538のコードが vc++2008ee でコンパイル通るのはバグだよね?
0543デフォルトの名無しさん2010/04/29(木) 21:03:09
>>542
1.
> D3DXVECTOR2 b = a; // VECTOR2->D3DXVECTOR2の暗黙の変換を呼び出そうとする
2.
で、VECTOR2::operator D3DXVECTOR2() const がlookupされるわけだが
3.
> static_cast< D3DXVECTOR2>( *this) // ここで、さらにVECTOR2->D3DXVECTOR2の暗黙の変換を呼び出そうとする
以下2-3の繰り返し

そのため> ランタイム スタック オーバーフローの警告
無限再帰でスタック溢れるぞ、って警告が出たんじゃないかと想像。

C++の規格的にどうかが知らん。たぶん未定義動作だと思うが。
0544デフォルトの名無しさん2010/04/29(木) 21:19:01
そういえばC++相談室 part79でも型が違うのに
コンパイルが通るってのがあったな

C++相談室 part79 の955
http://pc12.2ch.net/test/read.cgi/tech/1268846738/955
http://www.unkar.org/read/pc12.2ch.net/tech/1268846738/#l955

vc……
0545デフォルトの名無しさん2010/04/29(木) 21:28:33
>>535
元質問者のモデルで (2次元空間での)2直線の交点を返す関数 だったとする
与えられた2直線が平行だった場合
例外投げる? 戻りは解なしを通達・非引数は書き換えず?

俺は後者を選択したくなるけど… 意見を聞いてみたい
0546デフォルトの名無しさん2010/04/29(木) 21:38:35
交点だったら無限遠になるから
(HUGE_VAL, HUGE_VAL) を返したくなるな。
(数学座標を扱うものと仮定すれば要素の値は実数だろうし)
0547デフォルトの名無しさん2010/04/29(木) 21:47:49
なるほど。 実数空間ならソレも考え方としてはアリな部類かー
運用時の前提条件(呼び出される頻度や例外/エラーの頻度等)をがんがん絞り込んでいかないと
決められない部類の問いになっちゃうねー

思想がしっかりしてて、一貫してれば混乱しないだろうけど、取捨選択が難しいな
0548デフォルトの名無しさん2010/04/29(木) 22:22:23
>>545
535だけど、そのモデルっていうか、ケースで言えば俺も後者と言うか、
「解無しだ」っていう明示的な何らかの値なりBOOLなりを返して終了かな。
別に俺の意見がどうこうって言うより、そういうもんじゃね?

そして繰り返しになるけど、要はどういう使われ方を想定してるかって話なので
解が無いってのが例外と言うよりただの答え、って言う使われ方なら解がありませんって値を返してあげる方が自然かなと思う。
でも想定するその関数の使われ方の中で、「この関数に与えられる2直線として平行な値が与えられるのは異常なのだ」 って事なら
例外投げて明示するかもしれない。 要点はそこ。 セマンティクスというか考え方っていうか




0549デフォルトの名無しさん2010/04/29(木) 22:25:26
正しく間違えられた場合と、例外的な状態の違い
・・・って、言葉がまんま過ぎてそろそろゲシュタルト崩壊しそうな人もいるかも試練
0550デフォルトの名無しさん2010/04/29(木) 22:39:37
とある要素数10の配列を表す処理について、例えば外から11番目の値をくれとお願いをした時、
「私は0〜9の要素を持つ配列だ。私に対して11番目を欲しいという要求は、
 私にとってはあってはならない異常な要求だ」 として例外を投げるかもしれない。
でも、3番目の要素が例えばNULLだったとしても、「私はただの配列だ。その内容までは関知しない」 から、そのまま返す。

そして受け取った側にとって、NULLが戻る事が、例えば進行上異常だったとしても、
配列にとっては異常な訳じゃない。 だから、彼はそのまま返すし、進行上、それでは問題があるなら、
受け取った側が何か対策するか、あるいはこの配列処理そのもののスタンスを変えてしまえばいい。

例外と、何かを表す値の関係ってこんな感じじゃね? …今更かもしれないけども
0551デフォルトの名無しさん2010/04/29(木) 22:41:48
vectorのatですねわかります
0552デフォルトの名無しさん2010/04/30(金) 04:53:30
#include <stdio.h>

int main(void){

int i, j;

for(i=1; i<=5; i++){
for(j=1; j==i; j++){
printf("*");
}
printf("\n");
}

return 0;
}

↑どこが間違っていますか?
実行結果を
*
**
***
****
*****
にしたいのですが。
0553デフォルトの名無しさん2010/04/30(金) 05:23:04
× j==i
○ j<=i
0554デフォルトの名無しさん2010/04/30(金) 05:25:38
>>553
ありがとうございました
0555デフォルトの名無しさん2010/04/30(金) 05:34:02
余計な老婆心だが、
ループカウンタは1.for内で宣言 2.0から開始 を癖にしたほうがいい。
1.は変数のスコープはなるべく狭いほうがいいのと、
2.はC配列のインデックスが0から開始のため。

int main() {
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < i; j++) {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}
0556デフォルトの名無しさん2010/04/30(金) 05:36:40
>>555
ごめんなさい。入門書を読んでいて、そんなことが出来るなんて知りませんでした。
これからはそうやって書こうと思います。
0557デフォルトの名無しさん2010/04/30(金) 05:38:17
556ですが、
1.の意味は、forのなかで宣言するようにすると、forの中だけでiが有効になるから
節約できるって事ですか?
0558デフォルトの名無しさん2010/04/30(金) 05:42:32
あと、何度もすいません、
test.c:2: error: 'for' loop initial declaration used outside C99 mode
test.c:3: error: 'for' loop initial declaration used outside C99 mode
ってエラーがでてコンパイルできなくなりました…
0559デフォルトの名無しさん2010/04/30(金) 05:47:09
>>558は事故解決しました
0560デフォルトの名無しさん2010/04/30(金) 06:29:28
関数が長くなったり、処理が複雑になってきたときに
int i; /* i を外で宣言したら */
for (i = 0...

i = 5; /* ループカウンタ以外で i を使ったりすると管理が面倒 */

string::iterator i; /* 同じ識別子を宣言できない */

とかの状況を回避する。
要するにコードの保守性を上げるため。
グローバル変数多用しない、とかも同じ理由。
0561デフォルトの名無しさん2010/04/30(金) 06:53:02
>>560
つまりコードの上のほうでループ用にiつかって、
おそらくそのデータはそのループのカウント用にしか使わないなと思ったら
次の場所でiを再び使うこともある、そのブロック内で宣言しておけばOKってことですか?(最初に宣言してるとだめ?)
0562デフォルトの名無しさん2010/04/30(金) 09:39:00
>>561
ちょっと解釈は変かな。
本来、関数内で違う目的に同じ名前の変数を使うのは設計が悪い。
但し、ループ制御変数みたいに同じ*ような*目的に一々違う名前を使う習慣がない場合もある。
そんなとき、次のループで前のループ制御変数をそのまま使うと問題がある*かもしれない*し、ループだけ移動するかもしれない。
だったら有効範囲を限定してしまえば宣言を遠くまで探しに行かなくて済むし、影響を心配することもなくなるということ。
但し、古いCではブロックの途中での宣言ができないことと問題のfor文内での宣言ができないことに注意。
--
void func(int a)
{
int b = a; // ブロックの先頭なので問題なし
if (a == 0) return;
int c = a; // ブロックの先頭ではなくif文の後なので古いCではエラー
{
int d = a; // ここはブロックの先頭なので問題なし
for (int i = 0; i < a; ++i) { // for文内での宣言は古いCではエラー
int e = a; // ここもブロックの先頭なので問題なし
}
for (d = 0; d < a; ++d) ; // これは当然、問題なし
}
--
>>560
グローバル変数を極力使用しないのは、有効範囲を限定する目的以外にも名前を公開しないと言う目的もあることに注意。
0563デフォルトの名無しさん2010/04/30(金) 15:09:02
横から質問失礼
グローバル変数をやむなく使うというのは例えばどういう状況でしょうか
自分は結構頻繁に使ってましたorz
0564デフォルトの名無しさん2010/04/30(金) 15:54:23
>>563
やむなく使う状況が分からない、なぜならグローバル変数を使ったことがないから、なら筋が通るんだけど
頻繁に今使ってるのであれば、それを極力減らすように努力してみてはいかがか
0565デフォルトの名無しさん2010/04/30(金) 16:01:47
>>563
グローバル変数を使うと何が便利だと思う? その裏返しで、便利さ故の厄介な目に遭いたくないから使いたくないのよ。
0566デフォルトの名無しさん2010/04/30(金) 16:14:30
それはグローバル変数のデメリットなわけで、やむなく使う状況の説明になっていません
0567デフォルトの名無しさん2010/04/30(金) 16:16:17
あと、微妙な問題だけど、
1.for内で宣言
これコンパイルとおらない環境あるから。。
for(int i...){}
for(int i...){}
とやるとiの多重宣言だといわれるのがVC6
0568デフォルトの名無しさん2010/04/30(金) 16:26:14
>>567
今更そんな過渡期のコンパイラなんて無視していいでしょ。
今後サポートされているOSではVC6自体がサポートされないのだから。

>>566
已む無く使う状況は、その状況になれば判ります。
逆に言えば、そうならない限り無視して構いません。
0569デフォルトの名無しさん2010/04/30(金) 16:33:38
学校の環境がそれであることが十分ありうることは宿題スレを見てると実感できるよ。
あと、業務でも出会う可能性もあって、VC6でビルドできないとリリースさせてもらえない現場があった。
まあ、捨てちゃいなよ、とは思うんだけどさ。。
0570デフォルトの名無しさん2010/04/30(金) 17:29:43
>>567
YOU! #define for if (false); else for しちゃいなYO!
0571デフォルトの名無しさん2010/04/30(金) 19:54:37
563です。亀レス失礼
自分は趣味の域なんで大きいサイズを扱わないからってのが
グローバルの怖さがわからない一番大きな要因だと思います
とりあえず今後は減らす方向で色々やってくことにします

>>564
世間一般的にはグローバルは「やむなく」使うのかなと
自分はやむなくと言うより結構頻繁に使ってたもので
ややこしい文面で申し訳ない

いずれにせよ勉強あるのみってことで
0572デフォルトの名無しさん2010/04/30(金) 20:12:41
おまえみたいなやつは一番信用ならんので,
プログラマにならないでください
0573デフォルトの名無しさん2010/04/30(金) 20:14:56
>>570
上を説得する気もなかったのでそれやらないまま任務遂行したYO!
0574デフォルトの名無しさん2010/04/30(金) 20:17:45
>>571
ああ、なるほど。
自分が神様ですべてを把握できているのなら、グローバル祭りでも特に困らないままだよ。
というのは、複数人が触る、または他人のコードをメンテするときに困ることが多いから。
0575デフォルトの名無しさん2010/04/30(金) 20:28:48
グローバル変数のよくない理由はみんな分かってるし、それでも
メリットを見出して使うんだから、基本的にはどんどん使っていい

2chとかの頭でっかちは、グローバル変数ときいただけでとにかくダメって
わめくけど、気にする必要はない。そういう奴に限って、10個も20個も引数のある
関数作って、グローバル変数使ってないからって理由でドヤ顔だったりする
0576デフォルトの名無しさん2010/04/30(金) 20:43:00
とにかくグローバル変数はダメだろ。
0577デフォルトの名無しさん2010/04/30(金) 20:46:14
異なる翻訳単位におけるローカルでない静的オブジェクトの
初期化の順番は不定である。

っていうことは皆さん 分かっていて話をしているの?

それともこのスレの半分くらいは
まさかこれを知らないで話をしているわけではないよね?
0578デフォルトの名無しさん2010/04/30(金) 20:46:43
>>572
苦労したんだね(´;ω;`)ブワッ
0579デフォルトの名無しさん2010/04/30(金) 20:49:49
>>577
とりあえず >>575 あたりは知らないまま自信満々になってると思うw
0580デフォルトの名無しさん2010/04/30(金) 20:51:53
>>575
限ってといっても大半の人がグローバル否定派なんだから、その例は極端すぎ
0581デフォルトの名無しさん2010/04/30(金) 20:54:32
引数10個も20個もいるような内容ならクラスなり構造体使うだろjk
>>575 は何を言っているんだ。頭悪いのか
0582デフォルトの名無しさん2010/04/30(金) 20:56:15
本当にグローバル変数は使ったことがない。
(引数が8個以上の関数も定義したことがない)

どうしても必要な場合のみSingletonパターンか
関数ローカルなstatic変数を返すようにしてる。
0583デフォルトの名無しさん2010/04/30(金) 21:02:02
シングルトンパターンが確立している以上、グローバルはまったく使わないな。
0584デフォルトの名無しさん2010/04/30(金) 21:08:23
どうせ,571はクラス設計より,動かすことを優先してつくってる.

趣味レベルであるにもかかわらず,
そこをバランスよく出来ないあたり,センスがかけている.

さらにそれが仕事になったとき,
締め切りにおわれて痛いコードを量産することは目に見えてる.
0585デフォルトの名無しさん2010/04/30(金) 21:13:09
屈折した思い込みや妄想はその辺で。 思い込み激しいとデバッグ能力下がるぞ
0586デフォルトの名無しさん2010/04/30(金) 21:36:29
>>575
> 10個も20個も引数のある
> 関数作って、グローバル変数使ってないからって
> 理由でドヤ顔だったりする
どういうシチュエーションなのか全く伝わらないのに
PCの向こうでドヤ顔してそうな気がするのは俺だけではあるまい。
0587デフォルトの名無しさん2010/04/30(金) 21:37:34
>>582
それは大袈裟だろ。
俺だってこのウン年で使った事ないけど、
初心者の頃は使った事あるよ。

グローバル変数を人生で一度も使わないC/C++プログラマは
居ないだろ。
0588デフォルトの名無しさん2010/04/30(金) 21:43:17
>>587
そりゃ人生単位で括れば使ったことはあるさ。
厳密には「現在も活用したり保守したり、あるいはテストや学習目的を含めて、少なくとも手元に残してるコードの中では」
使ったことがないと言えばいいか?w
0589デフォルトの名無しさん2010/04/30(金) 22:30:13
なんか知らんがここが【初心者歓迎】ではないことだけは良く分かったw
0590デフォルトの名無しさん2010/04/30(金) 22:33:19
初心者歓迎だからこそ、「グローバルを基本的にはどんどん使っていい」なんてことは言ってはいけないだろうにと言いたいんだろうよ。
0591デフォルトの名無しさん2010/04/30(金) 22:38:21
プログラムすんなとかセンスがないとかそれを初心者に言ってどーすんだって
キモイ発言が目立つんだけど
0592デフォルトの名無しさん2010/04/30(金) 23:10:01
一部が目立つのなんて2ちゃんじゃ良くある事
でもそれがイコールで全体の意見なんて事は無いだろ
0593デフォルトの名無しさん2010/04/30(金) 23:21:05
そう言うのはどこにでもいる
そう言うのはどこでも基本スルー
0594デフォルトの名無しさん2010/04/30(金) 23:21:05
画面の向こうの敵に負け・厭気を植え付けられん程度の機知で中途半端に批判するくらいなら

黙ってろ
0595デフォルトの名無しさん2010/04/30(金) 23:52:15
test(kakikomi());
0596デフォルトの名無しさん2010/05/01(土) 00:26:57
たしかにそーだね
ベテラン同士で無知だどうだと殺り合うのはいいが
素人狙い撃ちするキモイのがいるなってことが言いたかった
ま、スルーだね
0597デフォルトの名無しさん2010/05/01(土) 00:40:59
ベテラン同士で無知だどうだとやりあうニアイコール罵り合うのは不毛
素人狙い撃ちするキモイのがいるのは同意
0598デフォルトの名無しさん2010/05/01(土) 01:52:13
VC++ 2008 Express edition で timeGetTime() を使おうと思って
とりあえずmmsystem.hをインクルードした以下のようなコードを書きました。

#include <mmsystem.h>
using namespace std;
int main()
{
}

これをコンパイルしただけで大量のコンパイルエラーが出ます。
1>C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\mmsystem.h(103) : error C2146: 構文エラー : ';' が、識別子 'MMVERSION' の前に必要です。
1>C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\mmsystem.h(103) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
・・・・・・

何か根本的に設定が不足しているのでしょうか?
0599デフォルトの名無しさん2010/05/01(土) 01:56:10
>>598
#include<windows.h>
にすればいいと思うよ
0600デフォルトの名無しさん2010/05/01(土) 01:56:15
#include <windows.h>
#include <mmsystem.h>

ググったらすぐ出てきたぞ。
06015982010/05/01(土) 02:00:59
>>599
>>600
ありがとうございます!

mmsystem.hはwindows.hが必要なのに内部でincludeしていない。
でも>>600みたいに実際に使うところで一緒に書くと上手くいく。
これはどういうことなのでしょうか?
0602デフォルトの名無しさん2010/05/01(土) 02:03:37
>>601
windows.h をインクルードすればいいようにできている
mmsystem.h みたいなのは直接使っちゃダメ
0603デフォルトの名無しさん2010/05/01(土) 06:36:51
forの中に(ループ変数以外に)変数を用意する場合、最初に一度初期化したい場合はforの外側に書いてやるしかないですか?
できればforの中だけに出てくるようにしたいんですが
0604デフォルトの名無しさん2010/05/01(土) 06:57:48
{ /* スコープを限定したいなら、ブロックで囲んで */
    /* 普通にループの外(ブロック内)で定義してやるのが定石かな */
    std::vector<int> v(100, 100);
    for (std::vector<int>::iterator i = v.begin(), last = v.end(); i != last; ++i) {
        *i *= 2;
    }
}
0605デフォルトの名無しさん2010/05/01(土) 06:58:17
for(int i=0,tagprm=reinterpret_cast<int>(&PRM(0,0));i<N;++i){
PRM &prm = &reinterpret_cast<PRM*>(tagprm);
0606デフォルトの名無しさん2010/05/01(土) 07:16:06
>>605
邪悪なコードを吹き込むなw
というかいろいろ間違いすぎ
0607デフォルトの名無しさん2010/05/01(土) 11:51:06
#include <stdio.h>

int main(void){

char *str ="Hello";

printf("%s", str);

return 0;
}

これでなんでHelloが出てくるのか分りません
strはポインタですよね?
アドレスが入るんですよね?
じゃあ*strとしないと中身は出てこないんじゃないでしょうか?
0608デフォルトの名無しさん2010/05/01(土) 11:58:14
%sが必要とするのは文字列の先頭を指すポインタ
0609デフォルトの名無しさん2010/05/01(土) 12:01:57
*strで出てくるのは'H'だよ
0610デフォルトの名無しさん2010/05/01(土) 12:14:23
>>607
そのコードをもっと分かり易く(分かり難く?)書くとこんな感じ

const char hello[] = { 'H', 'e', 'l', 'l', 'o', '\0' };

const char *str = hello;

printf("%s", str);

str は char型の配列の先頭アドレスを保持してるだけ
0611デフォルトの名無しさん2010/05/01(土) 12:15:45
つまり最後のstrは配列名ってことですか?
だとしたら先頭の文字が格納されたアドレスが出てくるのではないかと思うのですが…
%sというのはそれを文字に変換する機能があるって事なんでしょうか。
0612デフォルトの名無しさん2010/05/01(土) 12:17:42
*strで取り出していくのはprintfの中の仕事だから
0613デフォルトの名無しさん2010/05/01(土) 12:18:39
printfの中の人が%sが来たらこの値は文字列の先頭アドレスだなって勝手に解釈して処理を分岐してくれるんだよ
0614デフォルトの名無しさん2010/05/01(土) 12:19:58
C言語での文字列ってのはただの配列

関数内部で配列の中身読んでるだけ
0615デフォルトの名無しさん2010/05/01(土) 12:21:13
なるほど、ありがとうございます
文字列の時だけはそういうものだと覚えてしまう事にします
■ このスレッドは過去ログ倉庫に格納されています