C言語なら俺に聞け 144
レス数が900を超えています。1000を超えると表示できなくなるよ。
int ret = 1;
int fdA = -1;
int fdB = -1;
int fdC = -1;
if (ret) {
fdA = open(A);
if (fdA < 0) {
printf(“ファイルAオープンエラー¥n”);
ret = 0;
}
}
if (ret) {
fdB = open(A);
if (fdB < 0) {
printf(“ファイルBオープンエラー¥n”);
ret = 0;
}
}
if (ret) {
fdC = open(A);
if (fdC < 0) {
printf(“ファイルCオープンエラー¥n”);
ret = 0;
}
}
if (ret) {
いろいろ処理
}
if (fdA >= 0) close(fdA);
if (fdB >= 0) close(fdB);
if (fdC >= 0) close(fdC);
return ret; O'ReillyのLinuxデバイスドライバ本では
初期化の失敗時、一部分だけ確保できたリソース群を
確保時とは逆順に行儀良く解放するのにgotoを使う方法を勧めてるね。
そういう具合にgotoが出てくる場面が明確ならば
必ずしもgotoが可読性を落とす、とは言えないじゃろ。 >>829
なんかの理由でネストを増やしたら全部書き換えになる糞仕様だろ
ループにラベルつけてラベルを指定してbreakできるようにしてほしい >>831
使わねーよノーマルさんなら
変態の自覚がない真性変態め goto を使わないようにというのは
昔、ダイクストラ大先生が「gotoは有害だ!」
とのたまわれたので、それ以後gotoを使わない
構造化プログラミングというのが流行ってFortranなども
Fortran 77で一部構造化されたりしてきたという経緯が
あります。
たしかに、昔のBASICプログラムはやたらgoto が多くて
まさにスパゲッティプログラムで論理を追うのに苦労しました。
最近のBasis(たとえばFree Basic)などは構造化されていて
使いやすく感じます。
Cもgotoを使わなくて書けるのですから、やむおえない
(gotoを使わなければ、どうしようもない)場合場合以外は
使わないにこしたことはないと思います。 ダウト
昔のBASICはGOTO文のせいで読みづらいんじゃない
最大のネックは変数が全てグローバルであること
次いでFOR文のNEXTの自由度が高すぎることだ
メインフレーム脳でPCを語るジジイどもが
行番号を批判していたが的外れもいいとこ >>833
gotoの使い道なんてそのパターン以外ないな。 Linuxカーネルで登場するgotoをざっくりgrepしてみたらラベルの種類は1000種類程度
top10は以下
12257 out
2534 err
1609 done
1520 error
1415 fail
1351 exit
737 unlock
493 retry
421 again
368 bail grepが雑すぎた
1753種でtop10は以下
2つ目のoutは先頭にスペースあり
12257 out
2534 err
1609 done
1520 error
1415 fail
1351 exit
1213 out
737 unlock
493 retry
421 again >>818
初心者…gotoを使いまくる
中級者…gotoを一切使わない
上級者…適材適所を覚える >>818
内部的には全部goto(継続とか)だって事を理解すれば、適切な使い方が出来るようになる。 ドラクエもテトリスもファイナルファンタジーも全部
C言語で作っているのですか?ふと疑問に思いました。 >>836
知識30年以上前で遅れてないか?
C言語なら理由があるgoto文は普通に使われるぞ
他言語で言う例外処理機能やラベル付きbreak文が無いからな >>846
> C言語なら理由があるgoto文は普通に使われるぞ
さすがにこれは言い過ぎだろう。
ただしgoto不要論も50年前の理論であり、盲信するのも間違いだというだけだ。
問題は、goto を無くしたいだけの理由で余分なフラグやループ(もどき)を導入する是非だ。
ソースが余計に見にくくなるのは事実だからね。
最近の風潮なら、linter等によって「間違ったgotoの使い方」を検出できるようになれば、
gotoは完全にありになるだろう。
問題はこれが難しい(と言うよりやる気がない)ことで、
Cのノリなら「お前が間違えなければいいだけ、何故特化文法が必要になる?」になってしまう。
ラベル付きbreakとか、導入しても俺はいいと思うけどね。
例外については、今のところ他言語でも上手い解を見つけられていない。
goto文を使った場合はあくまで自関数内のtry-catchになってしまうが、正直、これで十分だ。
OOPでの継承先からのcatchとかを許可すると、便利な反面、密結合になってしまい、
noexceptとか言いだしているし、完全にあっちは暗礁に乗り上げつつある。
Cだと最初からnoexceptしかない。OOPが色々屋上屋を架しているのも事実だね。 毎年どっかのスレでGOTO戦争起こってる気がする。 goto使えないなら、setjmpにマクロ被せてtry〜catch風にしちゃえw >>836
「gotoは有害!」と言われるそのgotoは昔のBASICみたいな、別のサブルーチンの中に無節操にジャンプできる機能のことだったんじゃないかと思われる。
関数の外に飛べないgotoなら、関数の行数が少なければさして問題じゃない。 gotoのラベルって、関数内しか有効じゃなかったっけ? こんな時代だからこそあえてmain関数にすべてを詰め込むプログラミングスタイルを確立していきたい あー。別サブルーチンにgotoあったねえ。
6502アセンブラで書かれた Apple ][ のモニタプログラムにもそういうの結構あって当時すげえとか思ったが、無理矢理2KBのROMに押し込むための苦肉の策だったんだよな。
当時はメモリが高価で少ないのが当たり前だったから何でもかんでもトリッキーな方法使って小さくしてた。 >>851
試してみ。お前のコンパイラは何か違うかも知れない。
ただし出来た場合、それをC言語と読んで良いのかどうか悩ましいところだ。
それと、一体どのようなコードを作っているのかが気になる所だな。
>>852
変なことに挑戦するなよw
Cだとそれできちゃうんだからw >>836
> 昔、ダイクストラ大先生が「gotoは有害だ!」
> とのたまわれた
本人が書いたわけじゃないけどな >>851
むかーし、データ受信専用のホストアプリ作ったときは、setjmp、longjmp使ったな >>851
ああ、>>850 で書いたのはもちろんC言語のgotoじゃない。
そもそもgotoはよくないという主張が叫ばれたのが1960年代、C言語ができたのは1972年らしいんだから。 ガチの初心者で申し訳ないんやが...。
unsigned char型変数には8ビットしか入らんはずやのに
0〜255の数値が入るのはなんでなんや?
8ビットを二進数変換すると11111111でこれを10進数に変換すると255になるのは分かるんやが
なぜ255の半角が入るのかがわからんのや。
#質問するとこ、ここで合ってるよな? >>859
うん、”255”の半角を入れるなら終端文字まで含めると4バイト必要だね
‘2’(0x32) ‘5’(0x35) ‘5’(0x35) ‘¥0’(0x00) >>859
君がどういう勘違いをしているのかよくわからない。 >>861
小人さんがASCIIコードに変換してる すまん、いま投稿しようと思ったら、クソ規制に弾かれたわ
だから詳細が書けない。 たぶんこんな感じ
2進数で格納すると8文字(11111111)
16進数で格納すると2文字(FF)
10進数で格納すると3文字(255)分の領域が必要なはず
なのになんで10進数の数値255を
1文字分の領域(unsigned char型変数)に格納できるの??? 簡単に書くわ
signed char var = 255;
↑これが何故格納できるのかわからない。 >>868
さっきまでunsigned言うてたのに… >>868
signed charでは-1を意味しているけど
中身は同じ8bit(2進数で表すと11111111)だから格納はできる 何が分からないのか、それがよく分からない
1ビットなら、0,1
2ビットなら、0,1,2,3
3ビットなら、0,1,2,3,4,5,6,7
・
・
・
・
8ビットなら、0,1,2,3,4,5,6,7.....253,254,255
指折るなりしてちょっと考えてみよう >>861
それは255という数値を "255" という文字列に変換しているね
0〜255 の「数値」は 8 ビット = 1 バイトで表現できますよ >856
Edgar Dijkstra: Go To Statement Condidered Harmful
Communications of the ACM 11, 3(March 1968) 147-148
というように、ダイクストラ大先生が権威ある
Communications of the ACM
にお書きになっていますが。
この論文は検索すれ読めますよ。 >>868
数値としての255だからだよ。コンパイラが"255"の文字の並びを見て数値の255として扱って8bitのvarを初期化するコードを作ってくれるの。 >>877 そんなのネットですぐ分かるだろ、と「コンディダード」を検索したら
5ちゃんねるの「C言語なら俺に聞け 144」て掲示板の投稿877番がトップに出た。
最新のネット用語で言うところの「モルゲッソヨ」みたいな感じね。 >>875
だからその
> Go To Statement Condidered Harmful
って言うタイトルはダイクストラじゃなくてニクラウス・ヴィルト(Pascal作った人)が付けたって話な
ちなみに本人がつけたタイトルは A Case Against the Goto Statement
そもそも論文の中身を読めばgoto有害一辺倒でないこともわかる
読んでない知ったかさんがタイトルだけで騒ぎすぎ w >>876
なるほど、数値だから格納できるのか。
仕組みに関しては初心者が触れたら戻ってこれなさそうだから
「そういう物」って感じに覚えておくよ。 >>881
> 「そういう物」って感じに覚えておくよ。
まずはそれでいい
そのうち、あ〜そういうことね、ってわかる日が来るから CとC++、C#の違いすら把握していない初心者だけど
構造体っていうのはC++にのみあってCにはない概念なの?
ポインタはCにもあるよね? >>1
>>1 > C言語の話題のみ取り扱います
どうぞお帰りください >>886
そうかな?
MISRA-Cの一つの出口の原則を守りつつ、ネストもあまり深くならない。
問題と言えば、一瞥して「これはヒドい」と思う人がいるのと、retの評価コストと、retの使い方に一貫性を持たせないとバグを生むリスクくらいじゃないかな? 簡単なSTGが作れるようになったが次は何を勉強したらいいんだ?
まだまだわからないことだらけだ
指定子だとかポイントだとかアロー演算子だとかまだまだ >>890
自分が作りたいものがないんならやる意味ないよ >>892
ゲームボーイのQビリオンの動画を見ると
実装方法が自ずと思い付く >>891
そんな意味なんて人それぞれやん…
バカじゃねえの >>890
time_t とか struct time とか使って書いたことある? >>890
時間制限付きの算数ドリルなんてどうや? 宿題もたいがいだけど、その上をいくな
(既に〆てる奴なら上位の回答見れないのけ?) プログラムはある程度かけるけどそういうコンテストみたいなのってからっきしダメなんだよなあ
将来これでやってけるのか不安 プログラミング・コンテスト・チャレンジブック、第2版、2012
1年掛けて、この本の問題をやれば? 与えられた希望一覧の中の希望を1番多く叶えられるようなチェック柄の位置に対する叶えられる与えられた希望の数を求めるらしい(´・ω・`) 複数の条件 (xi,yi,ci) ci =白か黒 と 市松模様の大きさ K
KxK の市松模様を任意の位相でプロットし(=(周期2Kの中で)位相を適当に振ったとき)
与えられた条件をできる限り満たしたい。 変数は位相
解で要求されているのは満たした条件数 シカくんが塗りたいマスの一覧
シカくんは出来るだけ多くのマスを塗りたいらしい。 出来るだけ多くのマスを塗りたい(希望一覧の中のマスの中で) どうやるの?
パターンを全種類生成してから条件に合わないものを弾いていくの?
数学苦手だから分からない>< あー。なんとなくわかってきたぞ。白か黒かに塗りたいのはその指定された座標の1マスだけということか。
その希望を実現するためのマス目を求めるってこと?
でもその出力例ってなんなの?数字一つしか出力されてないけど。なんの値が出力されてるの?マス目の一辺の長さ? 希望を出来るだけ多く満たせるようなチェック柄の位置に対する満たせる希望の数を出力するらしい わからんw
しかし、わかる必要性もないような気がしてきたw
わからない事はわからないままにしておこう。
きっと今はその時ではないのだ。 シカくんが塗りたいマスで実際に塗れるのは何個か求めるんだよ(>_<) N=100000、K=1000の場合、考え得る模様のパターン数は幾つになるのかな?
全部計算するのに何分かかる?
生成パターンを保存するためのメモリ容量は何MB必要? 模様のパターンは 2K × 2K 通りで時間はO(N×K^2) >>920
もうよい。昔の事は忘れようではないか。w
ていうかここでこの話続けるのもスレチな感じがしてきた。C言語かどうかの問題じゃないし。 確かにパズルの解き方の部分と、Cによる実現は別々に考えた方が良さそう。
それにしても問題文が酷いね。
たぶん元は外国語で、サイエンティフィック・アメリカン誌の
読者への問題コーナーみたいなノリの文章だったんだろうけど、
日本人向けにはまるまる再構成すべきだわ。 解き方のイメージとしては↓こんな感じ?
x = (x[i] /K) & 1;
y = (y[i] /K) & 1;
c = x^y;
if (c1==c) count++; ニキ質問!
頑張ってくるCといかいうサイト終わりそうなんだけど、2冊めってか次やるなら何がいいっすか? >>927
そのサイトは知らないけど、解説読んだり課題解くだけじゃ大して進歩しないから、とにかく自分でコード書いて悩んで調べて考えて乗り越えるのを繰り返してみたら。やってるうちに自分が理解していないのはどこか、自分がやりたいことに必要な物が何か分かると思う。
あと、こういうことやりたいのにこんなめんどくさい方法しかないの?って思うようなことは既に上手いやり方が確立してたりするから、そういうのも一度自分で経験してから身につけると理解が深まると思うよ。 >>927
「C実践プログラミング」 でCの文法、make、gdbなど、基礎を習得
↓
「C言語ポインタ完全制覇」 or 「秘伝C言語問答 ポインタ編」 でポインタに関して完全理解する
↓
「エキスパートCプログラミング―知られざるCの深層」 でスタック、ヒープ、リンカ、ローダなど周辺知識を習得
↓
「C言語によるオブジェクト指向プログラミング入門」 で大規模プログラムの作り方を学ぶ
↓
「C言語デバッグ完全解説」でバグに強いプログラムの記述法をマスター
↓
「Code Complete(上)(下)」でより良いC言語プログラムとは何かを各人で考察する
↓
神の誕生 神だってお
どんだけレベル低いんだよ
まあレベルの問題でもないんだが
なにがしか発明をしてやっと神界の入り口だぞ 青色LEDとかflashメモリーとか発明して初めて神の領域 レス数が900を超えています。1000を超えると表示できなくなるよ。