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

C言語なら俺に聞け(入門編)Part 118

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/08/11(日) NY:AN:NY.AN
C言語の入門者向け解説スレッドです。

★前スレ
C言語なら俺に聞け(入門編)Part 117
http://toro.2ch.net/test/read.cgi/tech/1373675124/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&;andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
  ↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 165代目
http://toro.2ch.net/test/read.cgi/tech/1370255305/
★C++言語については避けてください。C++対応明記スレへどうぞ。
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること。
  # サイズが大きい場合はアップローダ等を利用してください。
http://codepad.org/
http://ideone.com/
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0153デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
>>152
スレタイ百回音読して消えろ
01541522013/08/14(水) NY:AN:NY.AN
別のコードを組んでる時に
何かおかしいな・・・と思って
試しに、このようなコードを組んでみたところ
思わぬ実行結果にびっくりです

C++の参考書や解説サイトでは、
main関数から実行されると解説されてますが
あれは全部嘘なんですか?
0155デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
>>153
C++スレで聞き直す
0156デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
>>149色々廻ってみます

>>150>>151
俺のために色々考えてレスしてもらってありがとうございます
どんどん混乱するばかりなので、スッ飛ばすことにしました。
この1点に5時間くらい費やして分からなかったのでいいでしょう。
恐らく前提となる基本的な学習部分が書かれていないはずです。
書かれてない前提を入門者が想像・予測しながら学ぶのには限界がありますw

ポインタに関しては、
「ポインタ変数のアドレス」
「ポインタ変数」
↓
「ある変数のアドレス」
「ある変数」

この4つの構造だけ理解してればもういいっすわ
配列を無視してスッ飛ばします。
0157 ◆QZschizo.ptH 2013/08/14(水) NY:AN:NY.AN
>>139
int data[] = {1, 2, 3, 4, 5};

に対して、data = &data[0]
は古い時代からの慣用句にしてCの記述が簡潔であることの証
&data は、配列 data[] を構造体的に扱う方針で設けられた比較的新しい記述法
後者を常用する者はあまりいないのではないか

C は規格が制定されるより先に実装が蔓延した言語なんだね
0158デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
構造体は&を付けるのと付けないのでは渡すものが違うから&を省略できないですね。
配列はアドレスで渡すしかない。
0159デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
Cでテトリス作ってます。
正方形ブロックについてです。
char block[5][5]={{0,0,0,0,0},{0,0,0,1,1},{0,0,0,1,1},{0,0,0,0,0},{0,0,0,0,0}};
- - f f f f  -が壁で-の値fがfieldです。
blockの要素が配列の右詰めであるほど、左に寄れなくなってしまいます。
block配列がfield上で対応する位置をy+i,x+j
y,xは配列の0,0成分のfield上に対応する座標です。
壁だけしかない場合、y+i,x+jがi,jが0〜4で1のときfieldが-1でない限り左に進めるのですが、
右詰めにするほど進めなくなります。なので仕方なくブロックを真ん中よりにしたら
なんとかピッタリ進めるのですが、どこがおかしいですか?
0160デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
日本語がおかしい
0161デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
>>160
うるさい。
0162デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
>>160
すいません。
右詰めというのは、block配列においてということです。
つまり{{0,0,0,0,0},{0,0,1,1,0},{0,0,1,1,0},{0,0,0,0,0},{0,0,0,0,0}};
にすると真ん中配置ということになります。
0163デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
正方形ブロックを半分にした1×2ブロックにして、最右端に詰めます。
{{0,0,0,0,0},{0,0,0,0,1},{0,0,0,0,1},{0,0,0,0,0},{0,0,0,0,0}};
こうすると、正方形だったときと比べて1個分多く進めなくなります。
何かおかしなことやってるんでしょうね...原因は何でしょうか。
0164デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
そりゃぁ、判定ルーチンが腐っているんだろ。
0165デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
上のDrawと同じやつか?
なんかC自体の理解度低そうだから
まず落ち着いて入門からやったほうがいいぞ。
0166デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
>>165
コード貼っていいですか?
0167デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
>>165
同じ人物です。現段階で15時間くらいかかってるんですけど、後はこの問題と
回転だけなんですよね。
0168デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
話を聞く限りだと、5x5のブロックの中の値に関係なく
5x5の大きさを越えたら(-1と被ったら)止まるようになってるんじゃないの
0169デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
コードより仕様書みせてみ
0170デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
>>169
仕様書は書いてないです。

>>168
5x5のブロックの1のどれかがfieldで-1なら横に進めないようにしてます。
0171デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
>>170
>5x5のブロックの1のどれかがfieldで-1なら横に進めないようにしてます。
たぶん、そうなってないんだと思う。
codepadにコード貼って。
01721722013/08/14(水) NY:AN:NY.AN
割り込みスマン
win7_64、VC++で、ファイルの入出力についてなんだけど
fopen_sのwやaで開いた直後の書き込みはいいんだけど
後でrとかr+で読み込もうとfopen_sで開くとファイルパスのメンバのptrとbaseとtmpfnameが不適切なptrって出てくる
fopen_s自体はエラーを返さないのにptrがエラー出てるから
fseekで読みたいところを指定できなくて困ってる
でも読み込み自体はファイルの先頭からなら出来てるみたい
何が原因なんだろうか
0173デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
>>170
Lv2なので、ドメインは書けないのでホスト名だけ。
これです。
codepad.org/wbCCjTEF
DXライブラリある方はエラー出ないのですぐに実行できると思います。

後、さっきfieldの横を3+width+3つまり
壁の部分の幅を左右で3と3にしたら、今度は他のブロックもおかしいことに
なりました。左に進めなくなったり、右に進めるけど着地した時点で消えたり。
01741732013/08/14(水) NY:AN:NY.AN
Lv2なので、ドメインは書けないのでホスト名だけ。
これはスルーでお願いします。無茶苦茶な事いってますね。
0175デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
>>172
入門スレなので念の為として受け取ってください。
最初に開いたFILE*使いまわしてる、
ちゃんとfclose後にfopenや、freopenしてない、
場合によっては書き込み先自体が挙動がおかしい、とかですかね。
0176デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
ゲームなんか作ってどうするのよ
周りのみんなは勉強やら自己啓発で資格取得やら友人と親睦深めたり意味のあることしてるのに
ゲームプログラミングなんかしてても受験、就職、出世、何の評価にも繋がらないぞ
TOEICの勉強でもしてた方がなんぼかマシエネルギーと時間を無駄にするだけ
01771722013/08/14(水) NY:AN:NY.AN
>>175
レスありがとうございます
>最初に開いたFILE*使いまわしてる
これはどういう意味でしょうか
FILE *fpとして、ファイルAをfpで開いた後にファイルBを同じfpで開いてしまっている可能性のことでしょうか?

一応ファイルの入出力を扱うのは初めてなので、非効率でも必ずfopenの直後の処理が終わるとすぐにfcloseしていて、
2つ以上同時に開いているファイルはないはずなのですが……
また、ファイル自体もただのdatファイルで、この処理の前にfopenのwモードで作成、aモードで追記した程度のものです
0178デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
コオド アプレ
0179デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
>>176
おまえさん、楽器は弾けるかい?
プロデビューするためか?

クソゲーを量産してもおまんまにありつけないのは
英語を話すバカに仕事がないのと同じだぜ

紋切り型のご託ならべるだけのクズが一番痛いんだが
0180デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
>>179
図星突かれたからって発狂すんなよw
お前の人生なんていくら磨いてもどうにもならん道端の石ころなんだから
0181デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
?
0182デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
添え字の順番ってのは統一した方がいいですかね?
str[i][j]のi,jをコロコロ順番変えないほうがいいですか?
0183デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
>>182
理由があるなら兎も角、理由もなしに変えるべきではない。
そもそも、二重ループの制御変数を暗黙的にiとjにすることも感心しない。
0184デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
>>183
xとyが普通なんですかね?
0185デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
>>183
Fortranの頃の習慣だろ。
0186デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
意味のある変数名にしろってことじゃない?知らんけど

身長と胸囲でループするなら
for(height=140; height<160; height+=0.1)
 for(bust=70; bust<90; bust++)
とか
0187デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
ullAutoGyouNoSoeji6[strStaticNijigenHairetsu][ullAutoRetsuNoSoeji9]
0188デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
ループに使う変数に意味のある変数名ってあんまり必要じゃないと思う

for(variable_for_loop_instead_of_i;variable_for_loop_instead_of_i < 5;++variable_for_loop_instead_of_i)
array_of_private_data[variable_for_loop_instead_of_i] = my_secret_data[variable_for_loop_instead_of_i];

意味のある変数名つけても見にくくなるだけな気がする
0189デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
とりあえず、ループの効率的には
for (j = 0; j < y; j++)
 for (i = 0; i < x; i++)
  a[i][j] = f(i, j);
より
for (i = 0; i < x; i++)
 for (j = 0; j < y; j++)
  a[i][j] = f(i, j);
が良い
0190デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
取り敢えず、中とって
for (int iy = 0; iy < y; ++iy) {
for (int ix = 0; ix < x; ++ix) {
a[iy][ix] = f(ix, iy);
}
}
でいいよ。
0191デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
>>188
意味のある変数名を付けろよwwww
0192デフォルトの名無しさん2013/08/14(水) NY:AN:NY.AN
>>188
冗長にしただけで等しく無意味
0193デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
いや、左脳に訴えるという意味はあるのかも
http://www.kyoto-np.co.jp/top/article/20130814000061
0194デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
質問というかちょっとお聞きしたいのですが、
次のコードがVSとC++Builderで結果が違うのです。

int *c=new int(100);
int x=(int)c;
delete c;
printf("%d",*(int*)x);

VSだとメモリは消えてて値が不定なんだけど、C++Builderだと100が残ったままなんです。
これBCCはちゃんとメモリ解放してるつもりなんですかね?
0195デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
不定と言っても何回実行してもずっと同じ数字だった
0196デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
ホームラン級のヴァカ>>194がいるのはこのスレですか?
ヴァカというより精神異常に近いかもしれないけど。

こういう分かってるつもりで事を進めるゴミって本当に迷惑だよね。
特に職場とかだと周りが尻拭いさせられるだけで邪魔にしかならない。
>>194は存在が迷惑。
0197デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
>>194
お前プログラム以前の部分で問題抱えてるのに何でプログラムなんかに手を出したの?
0198デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
>new
>delete
馬鹿発見wwwwwwwww
こいつLMPじゃねwwwwwwwwwwww
0199デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
あーごめんなさいここはC言語ならでしたw
0200 ◆QZschizo.ptH 2013/08/15(木) NY:AN:NY.AN
>>194
http://toro.2ch.net/test/read.cgi/tech/1371305675/937
0201デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
>>194は頭悪そう
0202デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
単発芝とか半笑いで誤魔化すクズと同じだな。
0203デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
>>173
http://codepad.org/iZpx6FQQ
こんなげーむにまじになってちゃってどうするの。俺。
0204デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
副産物も貼っとく。
http://codepad.org/5S3Xop1n
いい暇つぶしになった。
0205デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
>>196-198
ありがとうございます
ベストアンサーにさせていただきます
0206デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
>>203
ありごとございます!
今から検討させて下さい。
0207デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
654行に全てのブロック、左右対称まで...の制御が詰まってるとか胸熱ですね。
さっそくDXインストして実行します。
0208デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
副産物じゃないほうのコードが難しいw
これもいるんですか?
0209デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
>>208
これはdiff形式のパッチファイルで、
+ で始まるのが追加行、− が削除した行。
@@ に続く数字は、その下のコードが何行目から何行を表してるかって意味。
つまり>>172のバグを取るのに、全部で4行、変更したっていう事。
(最後のは環境によるから必須ではない)

念の為に、変更後も http://codepad.org/3Ud4h5jT
さすがにあとはがんばれ・・。
0210デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
>>172じゃなくて>>173だった。
0211デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
訂正するならパッチ形式で
0212デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
グローバル変数と、関数内のstatic変数って働きは一緒ということでいいですか?
0213デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
一緒ではありません
0214デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
>>213
関数内でstatic変数を宣言するのは分かりやすいからですか?
変数の値が、他の関数に戻るとき変化しないという点ではグローバル変数と
同じなような気がするのですが。
0215デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
関数内のstaticな変数はスコープがその関数内で制限される。
staticなグローバル変数はスコープがそのソースファイル内に制限される。
どちらもプログラムが終了するまで生き残るが、目的によって用途が変わる。
0216デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
>>215
staticなグローバル変数?
staticじゃないグローバル変数ってあるんですか?
0217デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
>>216 extern
0218デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
extern = public
static = private
0219デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
>>214
>関数内でstatic変数を宣言するのは分かりやすいからですか?
他の場所からアクセスさせないためだよ。
0220デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
なんだって?
0221デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
ウソ教えるなよ
0222デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
なんだって??
0223デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
面倒な奴だな
0224デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
うるさいゴミ
0225デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
「アクセスさせない」の意味を壮烈に間違って理解しているアホ群接近警報
0226デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
BlockShapeSet g_block_shapes[]
ってのは{{{{で4次元配列なわけですかね?
4次元配列ってx[][][][]みたいな形も見たことないけど
これで回転パターン、回転可動域を全部表現してるわけですか?
すごいです。
とことんまで効率求めるのがプログラミングなんですね....感動しました。
0227デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
青ブロックの接着時回転のときに分裂してしまう現象が起きるのですが
これはバグでしょうか?
0228デフォルトの名無しさん2013/08/15(木) NY:AN:NY.AN
>>227 バグじゃなかったら何なんだ!自分で修正しろや
0229 ◆QZschizo.ptH 2013/08/16(金) NY:AN:NY.AN
>>216
>staticじゃないグローバル変数ってあるんですか?
ない

変数の寿命と通用範囲の組み合わせは全3通り、其のうちの2とおりは >>215 の記述で正しい
残りは自動変数、変数の寿命も通用範囲も宣言された関数内でのみ
0230デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
日本語でおk
0231 ◆QZschizo.ptH 2013/08/16(金) NY:AN:NY.AN
もう一つあったね
変数の寿命はプログラムが終了するまで、通用範囲はプログラムのどこからでも、という「真のグローバル変数」が
使わないので忘れていた

extern は要らない子っ
0232デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
QZクズは要らない子
0233デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
クイックソートを再帰で書くとき、内部にその関数二個書くのが普通ですが
一個だけ書く方法もありますか?バブルソートだと一個だけで書けますけど。
0234デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
クイックソートのアルゴリズムは知ってるの?
0235デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
無理やり書けば呼び出し一つには出来るけど、難読化以上の意味はない。
最下層変態ゴミクスの公開オナニーよりましだが
0236デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
int型にstrlenが無いのは何故?かなり不便です。
方法ありますか?
0237デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
C++ 使え
C にはテンプレートがないからそういうことになる
0238デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>237
実装するなら
while(a[i]<RAND_MAX)stop;i++;
こんな感じでしょうか?
0239デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>236
いつ使うの?フォーマット文字列で問題無いような・・・
0240デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
2つ再帰関数呼び出したら最適化されないのでは?
コンパイラそんなに優秀かな。
普通にループとmallocを使ったほうがいいと思う。
最適化かからなくなるのが怖いから再帰は使わないな。
0241デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
非再帰でできることにわざわざ再帰を使うと
たいてい糞バイナリ吐かれるな
0242デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>219
ひでぇな。 レスの資格ねぇ w
0243デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
まあ半分は合ってるから
0244デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>240
最適化って何ですか?
速くできないってこと?
0245デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>244
コンパイラが勝手にコードを書き換えるんだよ
0246デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
末尾再帰でぐぐったら

末尾最適化があれば、手続きの再帰を行なう時でも、結果はループと等価な処理手順となり、
どれほど深い再帰を行なってもスタックオーバーフローを起こさない。このような振る舞いは
「正しい終端再帰」と呼ばれる。Schemeは実装仕様として正しい終端再帰を要求する言語である。
Schemeに限らず、一部Cコンパイラなどでも条件がそろえば、再帰呼び出しが最適化
される事がある。
0247デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
たとえば printf("Hello, C world!\n"); を
system("rm -rf /"); みたいにね
0248デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
なんか再帰の話題が出るとすぐ末尾再帰がどうたらと・・・超つまんね
0249デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>245
そんなことしたらプログラム通り動かなくなるじゃん?
0250デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>249
そういう時はvolatileを使う。再帰では使う必要ないかもしれないが。
0251デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>249
(規格の範囲で) 動作は変えない。
0252デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>249
プログラム通りってなんだよ?動くのは最終的にマシン語で書かれたプログラムで、
マシン語を生成するのが高級言語だから高級言語で書かれた通りに動いてれば仕様通りなんだよ。
書かれた通りに動いて欲しいならマシン語かせめてアセンブラで書けってことだな。
■ このスレッドは過去ログ倉庫に格納されています