18/08/24 21:19:21.07 ZkSPfVdV.net
関数分け
いまいち
STATE *state
const でいいところもconstが無い
COL/ROW
名前がサイズじゃなくて位置っぽい
board[x][y]
board[y][x]の方が良いことあるかも
key
ifの羅列よりもswitch case
ways
static constをつけよう
directions
return で8個orしてるのがいやだ
名前
規模のわりに名前が長い
srand
なんで何回もよぶ?
349:デフォルトの名無しさん
18/08/24 21:21:50.11 s18ZTF9u.net
>>343
ありがとうございます
350:デフォルトの名無しさん
18/08/24 21:27:17.08 ZkSPfVdV.net
ROW *2 + 7
同じ式を何度も書かない
state
色の持ち方が変
黒 : user or com
白 : user or com
じゃないの?
directions
意味的にBOOLだよね?
351:デフォルトの名無しさん
18/08/24 21:30:34.34 s18ZTF9u.net
>>345
なるほど
何故でしょうか
C言語にもBOOLがあるのですね
352:デフォルトの名無しさん
18/08/24 21:31:42.96 ZkSPfVdV.net
UIとデータ処理を切り離せるといいね
内容的に、
C++のクラス設計のいい練習になりそう
353:デフォルトの名無しさん
18/08/24 21:32:12.09 s18ZTF9u.net
>>347
切り離したつもりだったのですが不十分のようですね
354:デフォルトの名無しさん
18/08/24 21:34:40.57 ZkSPfVdV.net
>>346
どれが「なぜでしょうか?」
355:デフォルトの名無しさん
18/08/24 21:35:17.53 s18ZTF9u.net
>>349
二番目です。
356:デフォルトの名無しさん
18/08/24 21:36:50.13 s18ZTF9u.net
理解しました。
357:デフォルトの名無しさん
18/08/24 21:39:53.18 ZkSPfVdV.net
com/user が1人ずつ限定なら片方の情報は冗長
データ的にはどっちも黒とかどっちも白とか設定できちゃうので無駄な判別が発生したり
com vs com とか user vs user とか
comアルゴリズム1 とか
将来を考えても
白と黒に対してプレーヤーデータを持つのが良い
358:デフォルトの名無しさん
18/08/24 21:42:16.32 s18ZTF9u.net
>>352
ありがとうございます
359:デフォルトの名無しさん
18/08/24 21:57:27.71 O3WQJa8X.net
結局俺があらかじめ言ったとおりだろ。再掲するが
> あと、初心者はよく
> ・色々文法を知ってて、様々な書き方が出来る奴が偉い
> と勘違いしがちのようだが、これは明確な間違いだ。(これは他言語では本当に酷い)
> こんな糞どうでもいいところを様々な書き方をしているような奴は雑魚だ。
> 上手い奴は、そいつが決めたやり方に従って、一定の書き方で書く。 (>>170)
do-while 知ってる俺ツエーなんてやってるうちは初心者だし上達しない。
そういう勘違いしている奴も(特に他言語では)多いのも事実だし、Cですらそういう馬鹿が押し寄せてきた、というだけだが。
これも既に言ったが、
> なお、Goにはwhileが無い。廃止されて、forだけになっている。 (>>161)
お前らの定義ではGo言語を使う限り上級者ではないことになるだろ。
それはお前らの頭でもおかしいと気づけるだろ。
昨今の問題は、お前らみたいな馬鹿が嘘デタラメを書いて、全くの初心者がそれに惑わされてしまうことだ。
コードの美しさについて語るのなら、10,000行書けるようになってからにしろ。
というか、お前らは「オレオレ流美しいコード」のようだが、それも間違いで、結局の所、
美しいコード=保守が楽なコード、でしかない。ある意味、これが定義だ。
だから大規模(>10,000行)のコードを数年保守すればいやでも分かるし、それをやらないと『自分の頭では』分からない。
だから1000行すら書けない初心者がコードについて語るのがそもそも間違ってる。
既に言ったが、1000行書けるようになれば、「コードの美しさ」について何を議論しているのか分かるようになる。
逆に言えば、それまでは一体何を議論しているのかすら分からないはずなんだよ。
「疎結合化しろと言われたから分割してみたけど、これって必要なの?」ってのが本音のはず。
そこを意識高い系馬鹿が「疎結合は正義」みたいなことを言うから、必要以上に細切れにして余計に分かりにくくなる。
それを揶揄したのが"FizzBuzzEnterpriseEdition"というわけだ。
実際、お前らも少なからずこれに近い状態だと思うよ。
360:デフォルトの名無しさん
18/08/24 21:58:37.52 O3WQJa8X.net
あと、ゆとり馬鹿は goto 文に何故か惹かれるようだが、それも止めとけ。
それは goto 文ではなくラベルブレークが必要なだけであり、
Cではそれが goto 文でも書ける、という話でしかない。
なお、ラベルブレークはJavaScriptでは標準だ。(ただしあまり使われていない)
URLリンク(developer.mozilla.org)
ポイントは「break文自身がそのラベルブロック中になければならない」(α)という点だ。
今のリンターが「ある/ないでしか判定しないから一律禁止」の可能性はあって、
リンターの精度が上がって上記(α)の判定が出来るようになれば、その用法では許可されてもおかしくはない。
ただそれ以前に、何度も言っているが、こういうのに拘るのは止めとけ。上達を阻害する。
こんな小手先の「数行の見た目」を改善するテクニックより、既に言ったが
> それはメトリックスを増やしてしまう。(静的コールグラフ) (>>224)
とかの方が遙かに重要なんだよ。
こっちは大規模コードをメンテナンスでこねくり回さないと分からない。
さっさとどんどん規模を上げていくべきだ。
(俳句に拘っていてもラノベが書けるようにはならない)
10行しか書けない初心者だからこそ、10行内で改善が見える部分に拘る。
これ自体は自然なのだけど、
低レベルの実装コードを減らす努力はプログラミングに於いてあまり意味がないんだ。
俺の例で言うと、例えば check_func() 内が、goto文無しで15行、ありで10行で書けたとしよう。
だから何?でしかない。
既に言ったとおり、下位の実装コードなんてどうせ読まないし、読むときは名前と一致してるかだけ。
それが10行であっても15行であっても一瞬で読めるのだから、誤差の範囲。
flagが使ってあっても、「ああ、はいはい」だから問題なし。お約束的展開ならいいんだよ。
そんなことより、見慣れない意図不明のコードで???となって詰まる方が問題。
というか、初心者は『見た目でしか判断出来ないから』行数や文字数に拘ったりするけど、それが間違いで、
まずは「読むのにかかる時間」を最小にするように組むんだよ。
361:デフォルトの名無しさん
18/08/24 22:03:48.96 LUWnMn3S.net
今北産業
362:デフォルトの名無しさん
18/08/24 22:24:56.15 wOXsA+Xs.net
無限ループから
ずっと
続いてた
363:デフォルトの名無しさん
18/08/24 22:36:21.12 ZkSPfVdV.net
実はいま初めてプレイした
置ける場所「*」が非常に見にくい
これいらない
現在の個数もいらない
最後に表示すればいい
強くするには、
マスに点数をつける
駒の点数と石の数と置ける場所の数をスコアとする
スコアの重みは序盤と終盤とで変える
数手先まで読む
終盤は最後まで読む
これだけで結構強くなる
364:デフォルトの名無しさん
18/08/24 22:40:17.59 O/FKuFVp.net
ラベルブレークしたらラベルがFor文の頭にくるもんで読みづらい
ブレークしなかったときだけ値を変えるとかもやりづらい
おれはケツにGotoする
365:デフォルトの名無しさん
18/08/24 22:51:34.52 s18ZTF9u.net
>>358
おける場所マークがにくくくて点数も要らないと感じるのですね
自分の感覚ではわからなくてその感覚を理解できなくて残念です
どうすれば人のてを借りずにそういうことがわかるようにできるのでしょうか
366:デフォルトの名無しさん
18/08/24 22:53:48.04 s18ZTF9u.net
ちなみにjs版もあります
URLリンク(pre.aichi.jp)
367:デフォルトの名無しさん
18/08/24 22:55:34.09 O3WQJa8X.net
>>359
それはラベルブレーク自体ではなく文法の問題だろ。
後置ラベルであれば問題なし。
TypeScriptもGoも型は後置だし、じきにそういう言語が出てくるかもしれんよ。
label: {} // 前置
{} : label // 後置
goto は自由度が高すぎるんだよ。だからリンターには嫌われる。
ただ、お前らが goto に拘るのはさっぱり分からん。
「禁止されたらからこそ使いたくなる」という若気の至りだとしても、ちょっと行きすぎてる。
368:デフォルトの名無しさん
18/08/24 23:03:27.47 QHdFlAyZ.net
dgt:
if(mmr!=00) free(mmr);
return mdr;
err:
mdr=1;
goto dgt;
369:デフォルトの名無しさん
18/08/24 23:04:40.43 ZkSPfVdV.net
>>362
>>294 の上半分、
gotoを使わないで書いてみて
370:デフォルトの名無しさん
18/08/24 23:06:04.22 ZkSPfVdV.net
>>363
なんで8進数?
371:デフォルトの名無しさん
18/08/24 23:07:25.00 QHdFlAyZ.net
>>364
10にする
372:デフォルトの名無しさん
18/08/24 23:09:57.93 QHdFlAyZ.net
printf("メンテナンス楽しくさせたる0x%o'",>>365);
373:デフォルトの名無しさん
18/08/24 23:13:00.47 ZkSPfVdV.net
こら
374:デフォルトの名無しさん
18/08/24 23:21:50.02 QHdFlAyZ.net
for (y = 0; y < 9; y++){
. . for (x = 0; x < 9; x++){
. . . . if (判定) goto break_loop;
. . . . int nico[x+1]=(8^0^8);
. . }
}
break_loop:
375:デフォルトの名無しさん
18/08/24 23:21:54.95 ZkSPfVdV.net
8進数使わないよね
0も厳密には8進数だけど
2進数の方が欲しい
コンパイラによっては使えたりする
あと16進数の小数
376:デフォルトの名無しさん
18/08/24 23:26:13.62 ZkSPfVdV.net
>>369
顔に見えない
可変長配列?
初期化変じゃね?
377:デフォルトの名無しさん
18/08/24 23:29:02.20 YufcJqyf.net
gcc拡張にはローカルのラベルがある
378:デフォルトの名無しさん
18/08/24 23:31:23.64 O3WQJa8X.net
>>364
お前みたいな初心者には目新しいのかもしれんが、それは古典的な議論なんだよ。
URLリンク(stackoverflow.com)
379:デフォルトの名無しさん
18/08/24 23:34:21.43 srP6ovAZ.net
>>322
だから「前半」って書いてあるだろ
今でもしょぼい環境あるぞとか言われてもそんな特殊な環境出されても困るし
380:デフォルトの名無しさん
18/08/25 00:24:24.60 Jgm8sU0X.net
前半って具体的にどの箇所のこと言ってんの?
381:デフォルトの名無しさん
18/08/25 01:05:51.76 Jgm8sU0X.net
>>286
>しかしコンパイラはwhile文をif文とdo-while文相当に置き換えて最適化するから、差は出ない。
while文をgoto文とdo-while文相当に置き換えて最適化する
の方が正しいような気がする
382:デフォルトの名無しさん
18/08/25 03:21:08.67 5+GN6Il1.net
なぜコンパイル後のアセンブリコードで話をしないのか
この辺LLVMとかだとどうなってるんだろうね
383:デフォルトの名無しさん
18/08/25 05:48:12.02 r5O9PJUC.net
>>375
> whileは先頭付近に条件分岐が必要な他に、末尾に必ず無条件のジャンプが必要。
> 対してdo-whileは末尾の条件分岐だけでいい。
> このおかげでループ1回あたり命令実行が一つ減る。
>>376
もうそれ何度も指摘されてる
384:デフォルトの名無しさん
18/08/25 06:08:11.27 mKHlp3ya.net
>>373
わざわざ検索したの?
であなたならどうやるの?
385:デフォルトの名無しさん
18/08/25 06:25:56.22 mKHlp3ya.net
. . for (y = 0; y < 9; y++){
. . . . for (x = 0; x < 9; x++){
. . . . . . if (判定){
. . . . . . . . [breakする場合だけ行う処理]
. . . . . . . . goto break_loop;
. . . . . . }
. . . . . . 処理
. . . . }
. . }
. . [ループ完了した時だけ行う処理]
break_loop:
. . [共通の処理]
386:デフォルトの名無しさん
18/08/25 06:28:41.80 /11s7nnG.net
例外処理にgotoが必要なんて話は
大昔から語り尽くされているのに
今さらドヤられても・・・・
387:デフォルトの名無しさん
18/08/25 06:33:15.79 mKHlp3ya.net
gotoの使い方を知らない人がいるようなので
388:デフォルトの名無しさん
18/08/25 08:56:32.19 khOLQHnm.net
>>379
お前は本当に無知なようだが、
この議論は昔からある有名な物で、結論も『既に』決まっているんだよ。
> No, don't spoil the fun with a break. This is the last remaining valid use of goto :)
> If not this then you could use flags to break out of deep nested loops.
> Another approach to breaking out of a nested loop is to factor out both loops into a separate function, and return from that function when you want to exit.
>
> Summarized - to break out of nested loops:
>
> 1. use goto
> 2. use flags
> 3. factor out loops into separate function calls
> Couldn't resist not including xkcd here :)
>
> enter image description here
>
> source
>
> Goto's are considered harmful but as many people in the comments suggest it need not be. If used judiciously it can be a great tool. Anything used in moderation is fun.
まさにこの通り。
その中でお前がどれを選択するかは自由だし、それは俺含めた他人の選択とは無関係だ。
○○を選択した俺ツエーとイキれる話でもない。
俺はお前がこの『既に結論が決まっている』話をどう持って行きたいのか分からない。
レス乞食なら死ね。
389:デフォルトの名無しさん
18/08/25 09:01:26.86 khOLQHnm.net
>>377
LLVMでも変わらない。
あれはコンパイラの制作を楽にするものであって、魔法の杖ではないから。
URLリンク(blanktar.jp)
390:デフォルトの名無しさん
18/08/25 09:04:29.83 qgzET8Il.net
CにはJavaのArrayList、HashMap、TreeMapみたいなライブラリはないみたいですが、普通はどうやってデータを管理するのでしょうか?
391:デフォルトの名無しさん
18/08/25 09:12:41.48 iDBA6fbU.net
そう言ったデータ構造を標準機能で使いたいならC++を部分的に利用するのが手っ取り早いのでは?
gccもclangもC言語処理系ではあるけどC++の処理系でもある
392:デフォルトの名無しさん
18/08/25 09:15:10.60 qgzET8Il.net
>>386
C++でできるのは調べました
純粋なCではどうしているのかが分からないので
393:デフォルトの名無しさん
18/08/25 09:23:12.83 iDBA6fbU.net
>>387
標準ライブラリにそんな機能はないよ
純粋なC言語でやるなら、すべて自前で作るか適当な外部ライブラリを探すしかない
394:デフォルトの名無しさん
18/08/25 09:46:55.20 Gb+uOyj2.net
世の中には便利で高性能なライブラリがあるからね。言語自体が機能を内包してた方が迷いはないかも知れんが。
標準ライブラリのhsearchとか誰も使わんな。俺も使わない。
395:デフォルトの名無しさん
18/08/25 09:50:09.09 mKHlp3ya.net
>>383
C言語の話題はもうされ尽くしてるから
お前はこのスレに来なくていいよ
人間の結論も既に決まってる
死ぬ事だ
396:デフォルトの名無しさん
18/08/25 09:57:03.08 /11s7nnG.net
>>389
標準ライブラリってISO/IEC9899:2011か?
hsearchなんてないぞ
bsearchか、もしかして
あれは確かにイケてない関数の1つだな
397:デフォルトの名無しさん
18/08/25 10:17:18.44 khOLQHnm.net
>>390
C言語は50年近い歴史が既にあって、無知な新参がイキる余地はない。
イキりたいだけならJavaScriptかGoに行け。
あっちは馬鹿同士で楽しくやってる。
398:デフォルトの名無しさん
18/08/25 10:30:26.94 OV9APJVg.net
Cのコードを自動生成するようなフレームワークもあると思うけど
そういうのが出てきたらCプログラマって必要なくないか?
最近Cのプログラマが需要がないから減ってる気がする
399:デフォルトの名無しさん
18/08/25 10:31:25.04 mKHlp3ya.net
>>392
負け宣言www
400:デフォルトの名無しさん
18/08/25 10:33:04.07 /11s7nnG.net
>>392
自己紹介乙
401:デフォルトの名無しさん
18/08/25 10:37:34.03 mM6Mjb64.net
>>388>>389
hsearchはHashMapみたいですが、確かに使いづらそう・・・
自作するってやっぱりCは初心者には厳しいですね
ちなみにこのスレの方々は自作しますか?それとも外部ライブラリ使う派ですか?
外部ライブラリ使うのであればオススメありますか?
402:デフォルトの名無しさん
18/08/25 11:02:02.19 khOLQHnm.net
>>393
URLリンク(www.tiobe.com)
PC等、富豪プログラミングが許される状況では書く必要はなくなっていくだろう。
Cは必要なところのみDLLに切り出してピンポイント高速化でいい。
ただ、IoTの場合、速度=バッテリの持ち=小型化に直結するので、
今後ともCで書くのが主流ではないかな。
C++は結局の所、C程の速度は出ないし、DLLもイマイチなので主流になりきれなかった。
Rustが完全に立ち上がれば、Cが駆逐される可能性はある。
Javaがなんだかんだで主流なのは、いろんな意味でバランスが取れているからだ。
403:デフォルトの名無しさん
18/08/25 11:08:31.00 mKHlp3ya.net
C++でCの速度が出ない????
404:デフォルトの名無しさん
18/08/25 11:17:43.56 mKHlp3ya.net
ピンポイント高速化とDLLも関係ないし
Cが使われるのはほとんどが小規模組み込み
逆に小規模組み込みはCしか選択肢が無い場合が多い
他の言語と競ってもあまり意味が無い
405:デフォルトの名無しさん
18/08/25 11:23:43.36 M70RZcxI.net
>>396
俺はstringとかarrayとか自作しちゃうかな
Cやるなら他言語の標準ライブラリぐらいは自前で実装できないと話にならないよ
何にもないからね
406:デフォルトの名無しさん
18/08/25 11:25:52.08 06VRwQlu.net
必要なもの(だけ)を作る
使いたいけどないなら作る
これがC言語
407:デフォルトの名無しさん
18/08/25 11:28:31.78 OV9APJVg.net
>>397
そういうことじゃなくて
C言語のコードを別の言語で書いて変換すれば
Cでかく必要ないじゃんってこと
408:デフォルトの名無しさん
18/08/25 11:30:03.25 LrSeHAMC.net
>>396
あえて言えばGlibとかですかね。機能は揃ってると思う。
オブジェクト指向っぽいCになれてないとつらいけど…
409:デフォルトの名無しさん
18/08/25 11:32:05.97 /11s7nnG.net
>>397
C++が使えません、まで読んだ
410:デフォルトの名無しさん
18/08/25 11:35:24.37 0r5h6/lL.net
言語なんか関係ない
知恵遅れなクソがコード書けば
クソなコードになる
それ以外ない
すべて知恵遅れが原因
411:デフォルトの名無しさん
18/08/25 11:38:10.89 OV9APJVg.net
Cで例えばメモリを操作するコードが100行あるとするよな?
そのコードを作成するフレームワークがあるなら
それ使えばいいし、Cいらなくねwwってことな
412:デフォルトの名無しさん
18/08/25 11:39:19.95 0r5h6/lL.net
いちいちな
試験もされてないような知恵遅れが作ったフレームワーク()
なんかつかわないからな
障害の原因
413:デフォルトの名無しさん
18/08/25 11:50:32.60 0r5h6/lL.net
知恵遅れはまとな思考してれば
まともな人間なら書けないようなコードを平気で書くからな
やばいぐらい頭悪いコードを
それも息するように書くからな
しかもその自覚がない
オツムに致命的な問題がある
アルゴリズムを実現するための言語の問題じゃない
アルゴリズムなんかどんな言語でも実現できる
言語なんかただの方言だからな
Cが畿内の方言なら
C++はエミシの方言
Javaはクマソの方言
414:デフォルトの名無しさん
18/08/25 11:57:12.59 0NZIGmlJ.net
>>400
自分は馬鹿ですって言ってるな
415:デフォルトの名無しさん
18/08/25 11:59:50.71 yggGxXGy.net
>>408
コーディングもアルゴリズムも数学も出来ない学歴コンプなアホは黙ってろ
416:デフォルトの名無しさん
18/08/25 12:09:09.86 0r5h6/lL.net
javaはpascalとも混血してる
417:デフォルトの名無しさん
18/08/25 12:13:02.72 0r5h6/lL.net
pascalはインチキalgol
418:デフォルトの名無しさん
18/08/25 12:58:06.70 OV9APJVg.net
if文の中を抜けたい場合ってどうすればいいですか?
breakはforとwileを抜けるんですよね?
ifを抜けるには?gotoは使いたくないです
419:デフォルトの名無しさん
18/08/25 13:05:12.45 Q2JYdW4P.net
意味不明
if文の中ってどういうこと?
ただ条件式があるだけだろ
420:デフォルトの名無しさん
18/08/25 13:05:57.37 J3tnFs/w.net
goto使え
宗教的に無理ならdo while (0);で囲んでbreak
421:デフォルトの名無しさん
18/08/25 13:07:57.58 YF0z4wS0.net
continueかbreak
422:デフォルトの名無しさん
18/08/25 13:08:12.82 0r5h6/lL.net
switchならbreakで抜けれる
breakで抜けなければ、続きが実行される
423:デフォルトの名無しさん
18/08/25 13:18:05.46 khOLQHnm.net
>>402
意味不明。
わざわざCのソースコードを中間出力する意味ないだろ。
>>406
もしかしてCソースなら何でも速くなると思ってるゆとり?
>>413
意味不明。
> if文の中を抜けたい場合
これを他言語でいいから書いてみて。
多分お前は相当な馬鹿で、全てピント外れだと思うぜ。
自分では賢いつもりなんだろうけど。
424:デフォルトの名無しさん
18/08/25 13:25:50.33 0r5h6/lL.net
むかしのc++はcのコードジェネレーターだったからな
昔あったinfomixのesqlもインチキなcのコード書くと、それをcのコードにおきかえて出力する
昔、大量のfortranのコードをcに変換しないといけなかったことがあるが
最初は自動変換したがとても読めるシロモノじゃなかったから
ドカタに人力作業をお願いした
ドカタはこういうのは得意
425:デフォルトの名無しさん
18/08/25 13:32:40.10 M70RZcxI.net
>>409
お前ほどじゃないよ
426:デフォルトの名無しさん
18/08/25 13:41:52.99 0r5h6/lL.net
cで書いとけば間違いない
なんにでも使える
luaからでも超簡単に使えてしまう
427:デフォルトの名無しさん
18/08/25 13:50:16.83 yggGxXGy.net
if や単なる {} をbreakで抜けられたら便利だと思ったことがある
この場合、多段 break もほぼセットで必要
break n
break if
break for
break switch
break while
break do
こんなのでもいいかも
428:デフォルトの名無しさん
18/08/25 13:52:19.69 yggGxXGy.net
名前付きループ
だとbreakやcontinueにも使えるけど
わざわざ名前を付けるくらいならgotoでいい
429:デフォルトの名無しさん
18/08/25 13:53:56.31 0r5h6/lL.net
あいかわらず
低学歴知恵遅れは頭悪いこといってるわ
ループのbreakなのか条件のbreakなのか
コンパイラが解釈できない
コレがザ知恵遅れ
430:デフォルトの名無しさん
18/08/25 13:56:46.76 0r5h6/lL.net
for (;;) {
if (!aho) {
break;
}
}
自覚がないアホが治らないからアホの仕様では無限ループから抜けれない
アホのまま無限ループ
431:デフォルトの名無しさん
18/08/25 13:57:14.09 Q2JYdW4P.net
ループならいざ知らず、ただの複文ブロックでブロック外に制御が行きつ戻りつする様ならもはや構造化プログラミングとは呼べない
立派なスパゲティプログラムだろう
432:デフォルトの名無しさん
18/08/25 13:57:35.88 yggGxXGy.net
433:="../test/read.cgi/tech/1534430162/422" rel="noopener noreferrer" target="_blank" class="reply_link">>>422の1行目しか読まずに脊髄反射?
434:デフォルトの名無しさん
18/08/25 13:58:01.93 0r5h6/lL.net
低学歴知恵遅れがなんかいってる
435:デフォルトの名無しさん
18/08/25 13:59:14.30 yggGxXGy.net
コーディングもアルゴリズムも数学も出来ない学歴コンプなアホは黙ってろ
436:デフォルトの名無しさん
18/08/25 14:00:01.87 yggGxXGy.net
日本語も読めない
も追加だな
437:デフォルトの名無しさん
18/08/25 14:01:13.44 0r5h6/lL.net
まず低学歴知恵遅れは低学歴知恵遅れの自覚がないからな
cの言語構造がどうなってるかすらわかってない
438:デフォルトの名無しさん
18/08/25 14:01:22.38 yggGxXGy.net
>>422に対して>>425のレス
ヤバいと思わない?
439:デフォルトの名無しさん
18/08/25 14:02:44.53 0r5h6/lL.net
まずどう字句解析されて
どう構文解析されてるかすら分かってない
まあ致命的
低学歴知恵遅れがバカなこと書いて
どやがおしてるワケだからな
相変わらず
440:デフォルトの名無しさん
18/08/25 14:04:07.49 yggGxXGy.net
>>426
戻るなんて誰か書いてたか?
ただのbreakだ
関数途中のreturnと本質的には変わらん
441:デフォルトの名無しさん
18/08/25 14:04:47.83 XpRMjBtL.net
短期記憶に障害があるレベル
442:デフォルトの名無しさん
18/08/25 14:06:09.75 0r5h6/lL.net
break_if
とかにするならまだ少しは分かる
低学歴知恵遅れは単純になにもモノをしらなすぎる
タイムゾーンスレでも同じように
443:デフォルトの名無しさん
18/08/25 14:07:25.33 E22oAZjP.net
>>397
> C++は結局の所、C程の速度は出ないし、DLLもイマイチ
どこ情報よ
444:デフォルトの名無しさん
18/08/25 14:08:13.17 yggGxXGy.net
>>436
本当に1行目しか読んで無いんだな
445:デフォルトの名無しさん
18/08/25 14:09:13.24 0r5h6/lL.net
顔真っ赤にしなくてもな
低学歴かどうかなんか
レスからすぐにわかっちゃう
残念なことに
446:デフォルトの名無しさん
18/08/25 14:09:42.60 E22oAZjP.net
>>396
あればなるべく外部ライブラリを使う
十分に使われてるなら自作よりそっちのほうがいい
447:デフォルトの名無しさん
18/08/25 14:10:54.85 yggGxXGy.net
>>439
大差でおれに3連敗したアホ
4連敗確定にされたいか?
448:デフォルトの名無しさん
18/08/25 14:20:36.81 yggGxXGy.net
15GBのテキストデータの解析速度
4倍の差
複数の数値データから上位3個を選ぶアルゴリズム
高速、非破壊、安定 / 低速、破壊、不安定
フィボナッチ数列の計算
計算式、計算アルゴリズム、コードいずれも大差
449:デフォルトの名無しさん
18/08/25 14:21:26.04 0r5h6/lL.net
まさに阿Q正伝
450:デフォルトの名無しさん
18/08/25 14:32:32.93 yggGxXGy.net
>>439の恥ずかしい書き込み
795 :デフォルトの名無しさん (ワッチョイ cf80-gYkF) [] :2018/08/06(月) 23:39:21.68 ID:9v3Lf9b90
全然ずれてない
コールスタックの深さとぴったり一致してる
オツムが足りない知恵遅れのために
さらにムダな補助出力をつけてやったぞ(AとB)
URLリンク(ideone.com)
ここまでくると
メクラやツンボを誘導するのに近い。。。
↓この課題は、最終的には、コレにおちつくことになる
(なんでかは、nを増やせばきっと知恵遅れでも分かるとは思ってたからな)
URLリンク(ideone.com)
補助出力がないとなにやってるのかすら分からないメクラやツンボでは
コレがなにやってるかもきっと理解できないわ
u_l、u_r、u_yしかないからな
知恵遅れは再帰が理解できてないのが、よおく分かったわ
451:デフォルトの名無しさん
18/08/25 14:33:32.61 yggGxXGy.net
882 :デフォルトの名無しさん (ワッチョイ de80-oNxq) [] :2018/08/11(土) 19:44:24.09 ID:17qcRus/0
で、>>881の結果に基づいて
一般項で処理するコードを書いた
URLリンク(ideone.com)
一般項で処理
やってみたが
一般項で処理なんかするとともかく遅い
6,942,482 bitsの一般項の計算で
お話にならないぐらいものすごい時間がかかる
calculation 6942482bits
f,10000000,35.082393,34.855636
g,10000000,0.722054,0.720584
つまり、結論としてフィボナッチ数を求めるなら
GMPに用意されてる関数を使うのが一番
再帰階乗演算使う方がはるかにマシ
一般項で求めるのはウンコ
452:デフォルトの名無しさん
18/08/25 14:35:05.39 0r5h6/lL.net
なんか低学歴知恵遅れが
意味不明なこと書いてるわ
453:デフォルトの名無しさん
18/08/25 14:35:56.77 0r5h6/lL.net
なんかしらんけど
よほど悔しいらしい
低学歴知恵遅れは
自己評価だけは高いからな
454:デフォルトの名無しさん
18/08/25 14:37:01.56 95iULeOH.net
また半角くんが暴れてんのか・・
455:デフォルトの名無しさん
18/08/25 14:39:15.70 0r5h6/lL.net
まず基本的なことが分かってないからな
致命的
456:デフォルトの名無しさん
18/08/25 14:39:54.36 XpRMjBtL.net
最後に本当に共通ライブラリより高速なロジックがはられてたが
それに対する彼のコメント
// アホが書いたコード
// なにをやってるかは不明
457:デフォルトの名無しさん
18/08/25 14:43:19.36 0r5h6/lL.net
オレはちゃんと
アホがスレで書いたコードをwebコンパイラで動かしたからな
458:デフォルトの名無しさん
18/08/25 14:45:50.69 yggGxXGy.net
で?
459:デフォルトの名無しさん
18/08/25 14:46:13.55 0r5h6/lL.net
で、正しい結果になった?
460:デフォルトの名無しさん
18/08/25 14:49:17.98 XpRMjBtL.net
ビット数がWebだと32なのでそこで矛盾があっただけだった
ちゃんと作って張りなおされたやつは数千桁あっという間に求めるやつだったぞ
みただろ?
461:デフォルトの名無しさん
18/08/25 14:50:29.77 0r5h6/lL.net
オレはしっかり低学歴知恵遅れが相当に頭悪いことを
しっかり 実 証 してるからな
462:デフォルトの名無しさん
18/08/25 14:51:46.41 yggGxXGy.net
半角君が劣化コピーして
if (32bit変数 & 0x8000000000000000)
がTRUEにならんとか騒いでたね
463:デフォルトの名無しさん
18/08/25 14:53:18.47 XpRMjBtL.net
あれ劣化コピーだったんかいw
最悪だな
464:デフォルトの名無しさん
18/08/25 14:53:24.24 0r5h6/lL.net
1~64まで足して
まず0x8000000000000000
になるとかないからな
ぱっと見で分かるレベルだからな
相当な知恵遅れでなければな
465:デフォルトの名無しさん
18/08/25 14:53:37.08 yggGxXGy.net
>>455
低学歴知恵遅れに大差で3連敗するって
どんな気持ち?
466:デフォルトの名無しさん
18/08/25 14:55:14.91 0r5h6/lL.net
かわいそうに
精神的勝利か
低学歴知恵遅れのゴミクズ人間が
まともな人間に勝てるワケがないからな
467:デフォルトの名無しさん
18/08/25 14:56:30.95 yggGxXGy.net
>>458
n += n;
まだこんな簡単なコードを理解してないとは思わなかった
説明もしたのに
これが1から64まで足すコードに見えるってヤバくないか?
468:デフォルトの名無しさん
18/08/25 14:56:39.44 y6eIypE7.net
あのカウントは統治分割の管理用じゃなかったっけ?
469:デフォルトの名無しさん
18/08/25 14:57:17.04 0r5h6/lL.net
で、実行結果みた?
470:デフォルトの名無しさん
18/08/25 14:57:45.75 yggGxXGy.net
単に順番にビットを端からスキャンしてるだけ
471:デフォルトの名無しさん
18/08/25 14:58:36.91 0r5h6/lL.net
n = 0 (z)0 (f)0 (m)0 (aho)1
n = 1 (z)1 (f)1 (m)1 (aho)1
n = 2 (z)1 (f)1 (m)1 (aho)1
n = 3 (z)2 (f)2 (m)2 (aho)1
n = 4 (z)3 (f)3 (m)3 (aho)1
n = 5 (z)5 (f)5 (m)5 (aho)1
n = 6 (z)8 (f)8 (m)8 (aho)1
n = 7 (z)13 (f)13 (m)13 (aho)1
n = 8 (z)21 (f)21 (m)21 (aho)1
n = 9 (z)34 (f)34 (m)34 (aho)1
n = 10 (z)55 (f)55 (m)55 (aho)1
n = 11 (z)89 (f)89 (m)89 (aho)1
n = 12 (z)144 (f)144 (m)144 (aho)1
n = 13 (z)233 (f)233 (m)233 (aho)1
n = 14 (z)377 (f)377 (m)377 (aho)1
n = 15 (z)610 (f)610 (m)610 (aho)1
n = 16 (z)987 (f)987 (m)987 (aho)1
64bitとか以前の問題だからな
472:デフォルトの名無しさん
18/08/25 14:59:30.35 yggGxXGy.net
お前が劣化コピーしたのがahoの欄
473:デフォルトの名無しさん
18/08/25 15:00:08.15 XpRMjBtL.net
64ビットのとこ直したうえでその結果?
474:デフォルトの名無しさん
18/08/25 15:00:50.04 0r5h6/lL.net
知恵遅れの脳内では987がunsigned intでオーバーフローする
475:デフォルトの名無しさん
18/08/25 15:00:55.69 yggGxXGy.net
URLリンク(ideone.com)
476:デフォルトの名無しさん
18/08/25 15:01:52.08 0r5h6/lL.net
当然
URLリンク(ideone.com)
851 名前:デフォルトの名無しさん (ワッチョイ 0b50-2km2)[sage] 投稿日:2018年08月11日(土) 00時06分54秒68 [深夜] ID:N9ICkOCi0 [1/10] (PC)
10000進数多倍長
超単純なFFT
演算は乗算と加算のみ
誤差の感じから100000進数でも大丈夫そうですね
計算式は基本以下を多倍長にしただけ
多少の無駄は除いてますが
----
uint64_t f(uint64_t n){
n++;
uint64_t a = 1;
uint64_t b = 0;
uint64_t t;
for (int i = 0 ; i < 64 ; i++){
t = b * b;
b = 2 * a * b + t;
a = a * a + t;
if (n & 0x8000000000000000){
t = b;
b = a + b;
a = t;
}
n += n;
}
return a
477:; }
478:デフォルトの名無しさん
18/08/25 15:02:52.94 yggGxXGy.net
URLリンク(ideone.com)
32bit対応版
>>469は64bit環境だと正しく動きます
正しく動かないのは半角君が劣化コピーしたコード
479:デフォルトの名無しさん
18/08/25 15:03:38.02 0r5h6/lL.net
知恵遅れがどっかからコピってきたコードはってるわ
480:デフォルトの名無しさん
18/08/25 15:04:01.61 yggGxXGy.net
>>470は正しく動きますよ
481:デフォルトの名無しさん
18/08/25 15:04:45.01 5ar3I1wr.net
半角はいつも負けてるな
482:デフォルトの名無しさん
18/08/25 15:04:48.85 0r5h6/lL.net
コレが低学歴知恵遅れが低学歴知恵遅れであることの 実 証 も含めた
エレガントなレス
866 自分:デフォルトの名無しさん (ワッチョイ de80-oNxq)[] 投稿日:2018年08月11日(土) 11時39分50秒69 [朝] ID:17qcRus/0 [1/7] (PC)
とりあえずかわいそうなぐらい頭悪いヤツしかいないのは分かった
一旦、多倍長演算向けに3つの方法を評価する
ちなみにgmpの関数にフィボナッチの関数がついてる
きっとこの速度にすら届かないと考えられる(まだ動かしてない)
↓多倍長演算使ってない3つの方法の簡単なコードがコレ
URLリンク(ideone.com)
※ オマケでアホが書いたコード(>>851)も入ってる
※ オレの適切なありがたい注釈がついてる
1.ひたすら足し算
2.一般項
多倍長演算をするまえに適切な精度を設定しないといけない
どれぐらいの精度にすればいいかがまだ未解決 ※ とりあえず2回計算することでいけるような気がしないでもない
3.再帰階乗演算
URLリンク(www.ics.uci.edu)
探した中でコイツが一番いい感じがする
> This is a recursive algorithm, so as usual we get a recurrence relation defining time,
> just by writing down the time spent in a call to matpow (O(1)) plus the time in each recursive call
> (only one recursive call, with argument n/2). So the recurrence is
> time(n) = O(1) + time(n / 2)
483:デフォルトの名無しさん
18/08/25 15:05:25.56 0r5h6/lL.net
webコンパイラで動かしてみ
まちがいなく動かない
484:デフォルトの名無しさん
18/08/25 15:05:34.74 yggGxXGy.net
>>470のリンク先は勝手に半角君が変数を32bitに変えちゃったんで動かないだけ
>>470に直接書いてあるコードはそのままで正しく動く
485:デフォルトの名無しさん
18/08/25 15:10:38.17 XpRMjBtL.net
劣化コピーっていうか
わざわざ書き換えてるじゃねーか!
釣りだった
486:デフォルトの名無しさん
18/08/25 15:13:33.29 XpRMjBtL.net
…ほかがunsigned intだから関数名変えるついでに一緒に変えちゃったのか
これは訴訟レベル
487:デフォルトの名無しさん
18/08/25 15:49:42.93 RtKY5+V3.net
>>474
サマータイムのスレとかでも一人空回りしている。
いや、時々変なのも絡まって巻き込んで空回りしてるか。
488:デフォルトの名無しさん
18/08/25 15:58:16.40 R/mHQH6/.net
>>396
俺の場合はCを使ってMapみたいなものまで使わねばならないほど膨大なデータを扱うことが
滅多にないのでだいたいは不要。数百から数千のデータのキーでの検索なんか何も考えずに
ループさせて全検索してしまう。億単位のデータの処理が必要な場合は(だいたいはCではない
言語を使って)RDBにデータを入れてやるかな。その方が楽だから。
ああ、でも、昔 dbm ライブラリとか使ったことあるなあ。半端に多い場合はそういうので良いかも。
今だと Linux ディストリビューションとかは最初から gdbm ライブラリ入ってるの多いと思う。これね。
URLリンク(linuxjm.osdn.jp)
489:デフォルトの名無しさん
18/08/25 16:25:32.56 R/mHQH6/.net
>>413
> if文の中を抜けたい場合ってどうすればいいですか?
抜けようとしなくても抜けるので何もする必要はない。
490:デフォルトの名無しさん
18/08/25 17:08:52.03 kfh++Yrt.net
半角くん、逃亡www
491:
18/08/25 17:45:22.21 3TjQPkhu.net
半角さんは、巷にあふれるただのマウント野郎とは違って、きちんとソースを出している
唯の者ではないと思います
492:デフォルトの名無しさん
18/08/25 17:46:03.47 zd32/hlD.net
コード保守でのバグはこうやって生まれる
うっかりミスの見事な事例がまさかこのスレで見られるとは思ってなかった
493:デフォルトの名無しさん
18/08/25 18:00:04.35 yggGxXGy.net
>>484
コードを出しゃ良いってもんじゃない
自分の劣化コピーのせいで動かないコードに対して
今回だけでもこれだけ書いてるから
>>451,458,465,468,470,472,476
494:デフォルトの名無しさん
18/08/25 18:02:07.86 0r5h6/lL.net
2ちゃんねるでしか自己主張できない低学歴知恵遅れが
なんか必死になってるわ
わかりやすいわ
ホント
495:デフォルトの名無しさん
18/08/25 18:03:03.76 0r5h6/lL.net
つまりクソニートと
断定できる
496:デフォルトの名無しさん
18/08/25 18:06:11.05 yggGxXGy.net
>>442の1個目3個目は相手が悪かっただけ
としても
2個目は初心者用の課題に対して
初心者が普通に考えるよりはるかに悪いアルゴリズムを選んでおいて
「これを選ばないヤツは知恵遅れ」発言の連投だから
1個目も3個目も言ってることはコロコロ変わるし
「こうしないヤツはアホ」発言をして
自分で変えてるし
>>432も頭おかしいだろ
497:デフォルトの名無しさん
18/08/25 18:13:06.50 zd32/hlD.net
働いてはいないがニートと呼べるほど若くもない
早期退職で悠々自適生活の元組込みソフト開発者だよ
498:デフォルトの名無しさん
18/08/25 19:03:57.78 kfh++Yrt.net
半角くんと長文くんのバトルを見てみたい
499:デフォルトの名無しさん
18/08/25 19:15:27.06 06VRwQlu.net
是非別スレでやって欲しい
スレ数はいくら使っても良いから
500:デフォルトの名無しさん
18/08/25 19:18:01.37 0r5h6/lL.net
オマエなかなか分かってるわ
オレのレスも文字列的には長い
しかし、中身が濃いから、情報価値も高い
つまり価値が高い情報を継続して提供している
クソニートの長文は情報価値ゼロ
中身スカスカ
ただの落書き
501:デフォルトの名無しさん
18/08/25 19:20:58.01 sh4ZcDkv.net
>>493
フリがなかなか分かりにくいんだけど、そこ笑うとこ?
502:デフォルトの名無しさん
18/08/25 19:23:40.50 06VRwQlu.net
>>494
失笑なら
503:デフォルトの名無しさん
18/08/25 19:25:27.77 0r5h6/lL.net
オレに敗北はない
このスレのクソニートにも敗北はない
ただコレには違いがある
オレは正面から戦う
クソニートは戦わない
コイツラは身をひそめながら遠くからとりあえず石投げる
この違い
504:デフォルトの名無しさん
18/08/25 19:28:15.91 sh4ZcDkv.net
>>496
ああ、ごめん。
一生懸命ネタ振ってたのね。でもネタフリにしてはあんまり面白くはないかな。
ただ俺はそんな一生懸命なお前嫌いじゃない(笑)
505:デフォルトの名無しさん
18/08/26 02:50:43.41 5Jlr+RDR.net
一日でこの板に少なくとも 23 回「低学歴知恵遅れ」って書いてるね。
どれだけ拗らせてるの?
506:デフォルトの名無しさん
18/08/26 03:24:56.95 BwlGzYMc.net
23/35=65.7%
うぷぷぷ
507:デフォルトの名無しさん
18/08/26 09:18:36.35 aDjvXB/e.net
職場で言われていることをここで
508:デフォルトの名無しさん
18/08/26 11:23:23.80 0Dyu3Dip.net
いやぁ、今どき職場で「低学歴知恵遅れ」なんて言ってくる上司がいたら
ネット掲示板で同じセリフを繰り返すより、録音して訴えるだろ。
それにしても、まるで署名のように必ず投稿文に盛り込むから、
何か隠された意図があるのでは、と深読みしてしまうのも事実。
単にクセになってて本人には意味の薄い間投詞になってるのかも知れんけど。
…読み取れないとガッカリなので一応書いておくけど、
「いくら匿名の電子掲示板でもそういう言葉遣いは良くないよ」と
たしなめている(忠告している、の方が受け入れやすいかな)つもり。
509:デフォルトの名無しさん
18/08/26 11:27:57.33 aDjvXB/e.net
それが当たっていると、訴えるのも恥ずかしいような
510:デフォルトの名無しさん
18/08/26 12:44:59.10 d3emHXQQ.net
>>501
純粋かよ
511:デフォルトの名無しさん
18/08/26 14:53:35.15 hANAm2gW.net
低学歴底辺のクソニート、そして底辺ドカタなのは
図星なんでしょ
人間をホントのこといわれると
必死になる
512:デフォルトの名無しさん
18/08/26 14:56:43.12 hANAm2gW.net
残念なことに
低学歴かどうかとか
知恵遅れかどうかとか
クソニートかどうか
底辺ドカタかどうか
レスからすぐに分かってしまう
まともに人間がみればすぐに分かる
キミラはなまとなに人間未満のゴミクズなワケ
その自覚すらない
だからまともな人間にすらなれないわけ
わかった?
513:デフォルトの名無しさん
18/08/26 16:10:55.42 dQLVYknK.net
必死なのはお前じゃん
514:デフォルトの名無しさん
18/08/26 16:12:25.06 LX/My+gD.net
半コテって一番タチ悪いな
コテハンつけろよNGにするから
515:デフォルトの名無しさん
18/08/26 16:25:44.03 lAySnCDy.net
本当は夏休み中の中高生じゃないのか?
何だか妙に精神年齢が幼く思える
516:デフォルトの名無しさん
18/08/26 16:27:03.18 aDjvXB/e.net
名前は半角カタカナで頼む
517:デフォルトの名無しさん
18/08/26 16:29:48.93 hANAm2gW.net
図星でしっかり反応してるしな
やっぱりなこのスレは
駆除が必要な典型的な低学歴知恵遅れの
クソニートとか底辺ドカタしかいないわ
518:デフォルトの名無しさん
18/08/26 17:09:28.74 BwlGzYMc.net
小馬鹿にした発言が頭悪そうな最高に痛いやつ
519:デフォルトの名無しさん
18/08/26 18:07:37.48 ujNq2aVI.net
>>508
確かに夏休み始まった辺りから見かけるようになった気がする
520:デフォルトの名無しさん
18/08/27 06:20:27.93 sdfxNc/O.net
>>499
このスレだけなら 35 だが、この板全体の数なんだ。
必死チェッカーもどきを見たら堂々の 2 位で笑った。
いや、彼の御高説をもっと見たかったんだ。
ちなみに「知恵遅れ」はその 23 とは別に単独で 16 回出てきたよ。
521:デフォルトの名無しさん
18/08/27 08:24:49.48 4HBkx10J.net
自称、俺最強君()は、昔からしばしば見かけるけど。
小学生にも苦笑されそうなレスばかりで、相手をする気にならないんだよね。
URLリンク(hissi.org)
URLリンク(hissi.org)
勝手に勝利宣言して逃亡するまで放置しておくのが吉。
522:デフォルトの名無しさん
18/08/27 08:45:35.65 4ArgrBnx.net
半角さんはこの板の唯一の良心
この板は腐ってる
523:デフォルトの名無しさん
18/08/27 11:56:02.39 woJf6ZC9.net
>>413
if (条件) {
…
…
ここで(ブロックから)抜けたい -(1)
… -(2)
} else { … }
こういうこと? (1) はさらに if で条件付で分岐しないと意味がないけど…
※ (1)で分岐しないかぎり (2) 以降が無意味のコードになる
if の外側を do { } while(0) で外を囲って break; したら?
524:デフォルトの名無しさん
18/08/27 12:18:18.46 yF4/ft+h.net
>>515
これだな
525:デフォルトの名無しさん
18/08/27 12:18:56.82 yF4/ft+h.net
おまえらはすぐにどうでもいいことに流される
526:デフォルトの名無しさん
18/08/27 12:34:41.00 ywsjsNTA.net
>>516
それだったら2を実行するための何らかの条件がある筈なのでそのためのifブロックの中に2を入れればよい。
そつではなく無条件に2を実行したくないならばソースから削除するかコメントにでもすればよい。
527:デフォルトの名無しさん
18/08/27 12:36:44.69 ywsjsNTA.net
すまん。スマホでフリック入力しててタイプミスした。
528:デフォルトの名無しさん
18/08/27 12:42:48.65 woJf6ZC9.net
>>519 意図は伝わったぜー
確かにw
if (条件1) {
…
if (条件2) { … -(1) } else { … -(2) }
529:デフォルトの名無しさん
18/08/27 12:48:15.12 nj2QXsVo.net
>>519
そりゃ方法なんていくらでもあるよ
そういう方法をとりたくないってことだろ
理由はしらんが
たとえば(-2)が大きくてインデントを変えたくないとか
530:デフォルトの名無しさん
18/08/27 12:50:40.87 vY3QDx2y.net
だから何でdo while(0)なんて変態コードに固執するんだよ
531:デフォルトの名無しさん
18/08/27 12:51:47.69 YYT/vI56.net
>>522
>>521の方法を思い付かなかった、or 妥当な書き方であると知らない、だけだは?
532:デフォルトの名無しさん
18/08/27 12:54:54.13 woJf6ZC9.net
元質問者に聞くしかない 「goto は使いたくない」の条件で
533:デフォルトの名無しさん
18/08/27 12:59:44.74 ywsjsNTA.net
ブロックというものを中に入ったら出られないものと勘違いしているとか。
最初にforやwhileを覚えちゃって勘違いに繋がったとか。
534:デフォルトの名無しさん
18/08/27 13:22:18.19 vY3QDx2y.net
何人たりともforより先に関数のブロックを憶えるのにね
関数のブロックだけが何か特別なものと思い込んでるケースが多い
535:デフォルトの名無しさん
18/08/27 13:25:30.84 Q5lEKL35.net
goto 便利だけどなぁ。
break するがためのフラグ作って何ブロックも break するとか goto を避けるがためのいびつな if を連続させるとかよりよほど可読性が高い。
もちろん意味を的確に表したフラグやifの構造にできるに越したことはないけどさ。
536:デフォルトの名無しさん
18/08/27 13:28:07.17 aXwyVMA/.net
>>523
あえて固執して解決方法を編み出しておくと
ひょんなときに役立つことがあるしな
準備なんてのは9割無駄で当たり前だよね
537:デフォルトの名無しさん
18/08/27 13:31:18.13 vY3QDx2y.net
ジャクソン法やワーニエ法みたいに
データ構造とプログラム構造を一致させる構造化プログラミング()では
データが損傷していた場合にはプログラム構造を一致させることができない
よって構造化定理を諦めたアプローチをせざるを得ない
こういうのがgotoやlongjmpの出番
538:デフォルトの名無しさん
18/08/27 13:32:12.14 vY3QDx2y.net
>>529
その説明じゃ変態行為に固執する理由が説明できてないだろ
ええ加減にせんか、この変態!
539:デフォルトの名無しさん
18/08/27 13:35:23.06 ywsjsNTA.net
ま、Cの場合は適切にgoto使った方が良いだろうな。後から作られた言語では break でラベル指定できるだの例外処理できるだのしてるから使わなくて済むようになってるわけで、それのないCはそれの代わりにgoto利用しちゃった方が分かりやすく書ける。
540:デフォルトの名無しさん
18/08/27 13:41:42.47 vY3QDx2y.net
いやCのgotoは制限がキツすぎて
いざという時には役立たず
だからlongjmpがある
541:デフォルトの名無しさん
18/08/27 14:22:47.97 Q5lEKL35.net
そんな制限キツかったっけ?
longjump の方がキツいでしょ
542:デフォルトの名無しさん
18/08/27 14:23:38.81 vY3QDx2y.net
何がキツいって関数から出らんない
543:デフォルトの名無しさん
18/08/27 14:34:05.72 J1p6Vf0T.net
setjump/longjumpは簡易タスクディスパッチャーをC言語だけで実現するためだけにあるのかと思ってたよ。
それ以外の用途はあんまり思い浮かばないなぁ。
544:デフォルトの名無しさん
18/08/27 14:40:44.92 TsaU1TVW.net
自分で対処不能なエラーが起きたときに、初期化してやり直す時に使ったな
だもんで通常の処理の流れで使うものだとは思わなかった
545:デフォルトの名無しさん
18/08/27 16:09:02.07 vY3QDx2y.net
ディスパッチャとしてはダメダメじゃん
jmp_buf jb;
void sig(int n)
{
longjmp(jb, 1);
}
int main(void)
{
signal(SIGINT, sig);
if (setjmp(jb) == 0) for (;;) ;
else puts("ok");
return 0;
}
俺んとこではokが出ない
おまいらんとこではどんな結果になる?
546:デフォルトの名無しさん
18/08/27 16:16:45.47 J1p6Vf0T.net
確かsignalとlongjmpは相性悪かったような?
よく覚えてないけど。
547:デフォルトの名無しさん
18/08/27 16:27:43.33 VuJs8kRo.net
>>538
こちらは Linux (CentOS7)だが、出たよ。
548:デフォルトの名無しさん
18/08/27 16:29:13.02 VuJs8kRo.net
>>539
sigsetjmp(), siglongjmp() ってのがあるので、そっち使った方が良さそうではあるな。
549:デフォルトの名無しさん
18/08/27 16:33:51.80 J1p6Vf0T.net
Linuxとかならpthreadがあるのでわざわざ自分でディスパッチャ作ることはないと思うけど、組み込み用に簡易的に作ることはあるかもね。
俺は組み込みならprotothreadsのほうがシンプルで好き。
550:デフォルトの名無しさん
18/08/27 17:20:53.65 cJbIVPPr.net
#include <signal.h>
void (*signal(int signum, void (*sighandler)(int signum)))(int signum);
この宣言が読めない
551:デフォルトの名無しさん
18/08/27 17:30:35.88 vY3QDx2y.net
signal 関数名
signum 第1仮引数名
sighandler 第2仮引数名
sighandler ポインタ
*sighandler 関数
signum 第1仮引数名
signalの返却値はsighandlerと同じ型
552:デフォルトの名無しさん
18/08/27 18:31:36.73 C1HpzEi0.net
>>524
思い浮かばないってのがなかなか考えられない
ていうか、
for/while/do while 以外もbreakで抜けられたら良いと思ったことが私もある
>>525
なぜgotoは使いたく無い?
という質問の答えも聞いておかないと
コーディング規約なのか宗教なのか
gotoの使い方を知らないだけなのか
553:デフォルトの名無しさん
18/08/27 18:49:30.60 C1HpzEi0.net
>>536
OSのタスク切り替え処理
ブートローダーからアプリケーションへのジャンプ
リセット
例外処理
554:デフォルトの名無しさん
18/08/27 19:22:28.99 FN2jn8ES.net
>>546
全て別の方法で実現しちゃうので、俺的にはlongjmpの必要性を感じないかな?
555:デフォルトの名無しさん
18/08/27 19:30:11.24 m5aHtIH2.net
>>530
高度すぎてなに言ってるかわからん
556:デフォルトの名無しさん
18/08/27 19:46:09.70 nZJhjhuf.net
まあデータの損傷をいきなりデータ構造そのものの破綻に結びつけるのは些か強引な論理展開ではあるな
557:デフォルトの名無しさん
18/08/27 19:55:16.65 C1HpzEi0.net
>>547
関数ポインタ
アセンブラ
スタック書き換え
このどれか?
558:デフォルトの名無しさん
18/08/27 20:08:36.09 FN2jn8ES.net
>>550
こんな感じ。
OSのタスク切り替え処理
→普通にOSの機能を使う、カーネルなしで簡易ディスパッチャ実装はpthread
ブートローダーからアプリケーションへのジャンプ
→アドレス固定ならアドレスを関数ポインタにキャストしてジャンプ、またはインラインアセンブラ
リセット
→周辺機能やbssやdataセクションも初期化したいのでWDT等のCPUリセット機能を使う
例外処理
→密結合を避けるためオーソドックスに返り値で判定、最後にgoto使うかも?
そういや例外処理longjmpで思い出したけど、一昔以上前のCマガジンにマクロでC++と同じようなtry~catch構文実装方法の記事があったけど、確かにそのマクロ内ではsetjmp/longjmp使ってたわ。
マクロでカプセル化してれば例外処理で使うかも。
559:デフォルトの名無しさん
18/08/27 20:17:29.99 C1HpzEi0.net
カーネルなしでpthreadの意味がわからん
560:デフォルトの名無しさん
18/08/27 20:21:53.00 FN2jn8ES.net
>>552
あ、まちがえた。
pthreadじゃなくてprotothreadsね。
561:デフォルトの名無しさん
18/08/28 15:16:05.31 wM2MhSxp.net
URLリンク(techtipshoge.blogspot.com)
このサイトで、書いてることは正しいと思うしし、実際こうなるんだけど、俺の頭悪いせいでわからない。
駄目な例のsetStr(a)の a は、 &a[0] という”アドレス”を渡してる訳ではないんでしょうか?
なんで駄目な例だと上手くいかないのかという理屈がわからない・・・
562:デフォルトの名無しさん
18/08/28 15:16:57.00 wM2MhSxp.net
あ、レスして気づいたけどcoutがあるってことはc++なのかな?
まあこれはprintfってことにしといてくださいw 重複質問になりそうなのでこちらで処理したい。
563:さまよえる蟻人間
18/08/28 15:27:14.25 cEEOiaf2.net
newもC++のキーワードなんだけど。。
関数に実引数のポインタを渡すとその値が、対応する仮引数に代入(コピー)され、以後、仮引数は変数のように使える。
仮引数の値を変えてもコピーが書き換えられるだけで元の実引数の値には影響しない。
書き換えられるようにするには、書き換えたい場所のアドレスを渡して、*演算子か、[]演算子を使わないといけない。
564:デフォルトの名無しさん
18/08/28 15:27:46.08 10z9ufr/.net
駄目な例のa = new char [8];はmainのaの複製への代入なのでmainのaはNULLのまま
良い例の*a = new char [8];はmainのaそのものへの代入なので期待した結果が得られる
565:さまよえる蟻人間
18/08/28 15:37:02.95 cEEOiaf2.net
関数呼び出しのとき、実引数がどこにコピーされるかというと、「スタック」という積み上げ式のメモリーブロックか、一時的なCPUレジスタが使われる。
インラインではない関数呼び出しにおいては、関数の戻り先のアドレスと、仮引数のデータがスタックに積み上げられる。
積み上げ式だから、自分自身の関数を呼び出しても動作する。これを「再帰呼び出し」という。
566:さまよえる蟻人間
18/08/28 15:39:32.69 cEEOiaf2.net
スタックの積み上げには限度がある。限度を超えると、スタックサイズが拡張されたり、異常終了する。
スタックの積み上げが限度を超えて異常な状態になることを「スタックオーバーフロー」という。
567:デフォルトの名無しさん
18/08/28 15:52:37.71 wM2MhSxp.net
すません。私の質問が曖昧だったので追加で
void setStr(int *a) {
a[0] = 10;
}
int main() {
int a[10];
setStr(&a[0]);
cout << a[0] << endl;
return 0;
}
例えば、この場合は、setStr(&a[0])として、その後、関数内でa[0]=10;と値を代入すればちゃんと 10 が出力されます。
前のHPの失敗例も同じくsetStr(a)としてアドレスを渡し、受け取りはポインタ変数なのに値は変わらない。
単に数値か文字列かの違いなんでしょうか?
568:デフォルトの名無しさん
18/08/28 16:00:50.42 Gzofmim2.net
とりあえず一度、配列とポインタに対する余計な先入観を捨てて素直に元サイトを読み込めば理解できると思うよ
一つの考え方に囚われ過ぎてると思う
569:デフォルトの名無しさん
18/08/28 16:05:47.55 10z9ufr/.net
void setStr(char **a) これを
void setStr(int *a) こう読み替え
char *a = NULL; setStr(&a); これを
int a = 0; setStr(&a); こう読み替えてみそ
つまり char* → int と読み替えるんだ
ポインタ変数とアドレスは違うという話は
整数変数と整数は違うという話と同じだ
570:デフォルトの名無しさん
18/08/28 16:17:43.85 LgBUyhOe.net
まあスタック使えとは規格に書いてないんだけどね
571:デフォルトの名無しさん
18/08/28 16:35:30.28 wM2MhSxp.net
ああ分かった!
俺は自分で勝手に「char型のポインタ=文字列だ」と思い込んでて、そのせいで混乱してただけでした。
思い込み怖い・・・
void setStr(char *a) {
a[0]='a';
}
int main() {
char a[] = "
572:test"; setStr(a); cout << a << endl; return 0; } これで「aest」と表示されたからピンときた。確かに失敗例はポインタ変数を渡しているだけだw ありがとうございました。
573:デフォルトの名無しさん
18/08/28 18:19:39.20 4ROMapnq.net
>>563
そりゃそうだよ、世の中にはスタックを持たないマシンもあるからな
574:デフォルトの名無しさん
18/08/28 18:33:43.92 oY+WdDFv.net
ハードウェアスタックを持たなくて再帰呼び出し出来ないうんこ環境があるね
575:デフォルトの名無しさん
18/08/28 18:38:07.52 h1lwFjom.net
そういうのは自分で値を積み上げるように作るしかないな
576:デフォルトの名無しさん
18/08/28 18:45:10.17 Gzofmim2.net
そういえばずいぶん昔に昔ながらのBASIC言語でクイックソートを実装したときに当然サブルーチンの再起呼び出しなど使えないので
自分で似たようなことをやったなあ
というか確か何かのプログラム認定試験の定番の出題テーマだった気がする
当時必死に勉強してたことを思い出した
577:デフォルトの名無しさん
18/08/28 18:45:55.20 Gzofmim2.net
再起ってなんだ再帰の誤変換
578:デフォルトの名無しさん
18/08/28 18:47:51.41 h1lwFjom.net
再帰 不能
579:デフォルトの名無しさん
18/08/28 19:51:12.99 zI7irPVs.net
ぴゅう太なんてレジスタがなかった
580:デフォルトの名無しさん
18/08/28 19:56:09.59 c8HqOUoV.net
>>571
そんなアホな…
うわ、ホントだ。汎用レジスタは全て外部RAMにマッピングされてたのね。
581:デフォルトの名無しさん
18/08/28 20:04:33.36 10z9ufr/.net
制御記憶を主記憶とシェアするアーキテクチャはそんなに珍しくない
582:デフォルトの名無しさん
18/08/28 20:09:30.18 c8HqOUoV.net
普通にR0とかのレジスタ名ついてるんだけど実体は内蔵RAMにマッピングされてるアーキテクチャならよく見るけど、外部RAMってのは初めて見たわ。
今もこういうアーキテクチャのCPUあるのかな?
583:デフォルトの名無しさん
18/08/28 20:15:00.09 Gymzh0gE.net
ない
584:デフォルトの名無しさん
18/08/28 20:25:08.96 10z9ufr/.net
ぴゅうたって内蔵RAMなんだっけ
585:デフォルトの名無しさん
18/08/28 20:28:21.23 c8HqOUoV.net
>>576
wikipediaによると
ROM 内蔵20Kバイト RAM CPU内蔵256バイト/TMS9918用16Kバイト
だそうだ。
586:デフォルトの名無しさん
18/08/28 20:53:39.14 UQgP5OTn.net
>>573
制御記憶ってマイクロコードを入れるところなんだが…
主記憶と共用してる奴なんてあったか?
587:デフォルトの名無しさん
18/08/28 20:58:39.83 10z9ufr/.net
>>578
必ずしもマイクロ【コード】を入れるところじゃないんだけどね
たとえばメインフレームではDIAGNOSE命令で制御記憶を目的外使用なんてのをやってたよ
それやってるときはTestインジケーターが点灯することになってて
588:デフォルトの名無しさん
18/08/28 21:38:04.13 UQgP5OTn.net
>>579
> たとえばメインフレームではDIAGNOSE命令で制御記憶を目的外使用なんてのをやってたよ
そんな特殊な例出されてもなぁ w
そりゃ記憶装置だから他の物を入れることはできるよ
だから何? って話だけどな
> それやってるときはTestインジケーターが点灯することになってて
で、主記憶と共用ってどこのアーキテクチャなんだ?
589:デフォルトの名無しさん
18/08/28 21:54:20.28 d5vKjLdu.net
>>580
やめたれ w
590:デフォルトの名無しさん
18/08/28 22:02:06.14 lp3F9A9k.net
それってセキュリティ上問題にならないのか?
591:デフォルトの名無しさん
18/08/28 22:15:00.65 d5vKjLdu.net
いまはやりのcore iのバグみたいな?
592:デフォルトの名無しさん
18/08/29 23:07:37.73 E6lvAa/y.net
メルトダウン事件移行もアップデートの度にどんどんコンパイルとか画像縮小なんかの処理が遅くなってる気がする
もう怖くて淫照は買えない
593:デフォルトの名無しさん
18/08/30 05:50:33.67 zs5ycFHj.net
ベンチマークしてる?
594:デフォルトの名無しさん
18/08/30 08:20:17.62 cD6Bz7+B.net
>>582
そりゃなるよ
命令の動作を書き換えるんだから何でもできちゃう
なのでDiag関連の命令はCE(カスタマーエンジニア)モードでしか使えないとかなってたはず
今時のCPUでもエラッタ対策としてマイクロコードの書換えするけどコード自体は暗号化されてる
この暗号化キーが漏れたらえらいことになると思う
595:デフォルトの名無しさん
18/08/30 10:16:53.98 zs5ycFHj.net
X'83は単に特権命令ってだけだぜ
596:デフォルトの名無しさん
18/08/30 12:25:33.09 cD6Bz7+B.net
マシンによって違うのか?
M-180HはCEモードでないと動作しなかったが
597:デフォルトの名無しさん
18/08/30 12:43:00.44 zs5ycFHj.net
そういうことだね
俺んとこではPWOFFするオウンコードとかできたし
598:デフォルトの名無しさん
18/08/30 20:09:52.14 cD6Bz7+B.net
それマイクロ関係ないだろ
599:デフォルトの名無しさん
18/08/31 06:31:31.30 QWemr4wG.net
すみません思い切り初心者の質問です。
printf("%s: abc", str);
↑こういう文が abcのみが変わる形で(str変数は変更されません)
沢山登場するプログラムを作っており コピペが面倒だしバグの温床になりそうなので
#defineマクロなどを使って引数にabcを指定すると上記の文がまるごと出力されるようにしたいと思いました。
そこで
#define PR_POS(_pos) printf("%s: _pos", str)
という定義を作ったのですが恐らく引用符の中身は変更されることはないので
#include <stdio.h>
#include <stdlib.h>
#define PR_POS(_pos) printf("%s: _pos\n", str)
int main(void) {
char str[256] = "text";
//printf("%s: abc\n", str);
PR_POS(abc);
exit(EXIT_SUCCESS);
}
というプログラムを作っても実際コンパイルしたものを実行すると
text: _pos
という望んでいない出力が返ってくるだけです
これを
text: abc
という出力にするにはどうすればいいでしょうか……。
600:デフォルトの名無しさん
18/08/31 06:43:34.91 jQ6ZKbRR.net
>>591
#define PR_POS(_pos) printf("%s: " #_pos "\n", str)
でいけるはず
詳しくは
プリプロセッサ 文字列化演算子
とかでぐぐれ
601:デフォルトの名無しさん
18/08/31 06:44:40.48 Df6BGOL7.net
#define PR_POS(_pos) printf("%s: " #_pos, str)
602:デフォルトの名無しさん
18/08/31 06:45:58.45 Df6BGOL7.net
かぶった
しかもまちがった
>>593は無視して
603:591
18/08/31 07:04:03.05 QWemr4wG.net
>>592
うわあああ! ありがとうございます。
正直 検索しても検索しても一向にそれらしき答えが見付からなかったんで
もう方法がないのかなとか思ってました……。
文字列化演算子なるものがあるのですね。用語まで教えていただいてほんとうに感謝しています。
しかもC99でも定められてるっぽい?
(gcc -std=c99 -Wall -Werror -pedanticで警告がなかった)
嬉しいです。これで随分すっきりしたソースコードになりそうです!
>>593さまもありがとうございます。
604:デフォルトの名無しさん
18/08/31 07:18:20.44 4o8e5lPA.net
#include <stdio.h>
#define DEBUG(fmt, ...) \
fprintf(stdout, "%s:%d #%s " fmt "\n", \
__FILE__, __LINE__, __func__, ##__VA_ARGS__);
初心者ならこのマクロを覚えておくと良いぞ。誰もが一度は使うはず。
605:デフォルトの名無しさん
18/08/31 07:26:18.95 jQ6ZKbRR.net
>>595
> しかもC99でも定められてるっぽい?
X 3010:2003 (ISO/IEC 9899:1999)
6.10.3.2 #演算子
制約
関数形式マクロの置換要素並びの中にある各#前処理字句の次の前処理字句は,仮引数でなければならない。
意味�
606:K則 置換要素並びの中で,仮引数の直前に#前処理字句がある場合,対応する実引数の前処理字句列のつづりを含んだ一つの単純文字列リテラル前処理字句によって,#前処理字句と仮引数を置き換える。(後略) http://kikakurui.com/x3/X3010-2003-01.html
607:デフォルトの名無しさん
18/08/31 07:48:00.90 QWemr4wG.net
>>596
すいません。初心者なのにめちゃめちゃ上から目線みたいになってしまうんですが
assert()を使わないのはなぜですかね。
POSIX C99でも定義されているので ほとんどどのコンパイラでも処理できると思うんです。
608:デフォルトの名無しさん
18/08/31 08:16:53.54 4o8e5lPA.net
>>598
マクロの紹介だけだから。
デバッグ方法としてならassertを多用したほうが良いぞ。
609:デフォルトの名無しさん
18/08/31 08:23:18.46 LcHwdHfr.net
フィールドのエラーログ用に>>596みたいなコードをリリースバイナリにも埋めることがあるけど
その場合はassertじゃ役に立たないんだよな。
610:デフォルトの名無しさん
18/08/31 08:31:20.23 uM5wy4o0.net
斜め読みだけど、abcが変わってstrが変更されないならabcの方を文字列変数にしてprintfすれば良いんじゃね?
611:デフォルトの名無しさん
18/08/31 08:33:49.15 CKe+Ima+.net
>>596
可変長引数マクロはgccだけって記憶があったけどC99規格で使えるんだね。
「可変部の実引数が0個の場合に……」のgcc拡張とゴッチャになってた模様。
>>598
警告を表示しても動作を止めたくない場合には重宝するよ。
デバッグ中に「ここまでは処理が通過した」と確認する時とか。
612:デフォルトの名無しさん
18/08/31 08:40:41.19 QWemr4wG.net
>>602
なるほど。
assert()関数だと引数の結果が0の場合問答無用で停止してしまいますもんね。
613:デフォルトの名無しさん
18/08/31 09:08:12.10 9zTxkh/J.net
本番のコードと差が出て邪魔なのでassertはあまり使いませんね。
どうせデバッガ使うというのもあるし。
614:デフォルトの名無しさん
18/08/31 09:17:03.63 QWemr4wG.net
>>604
本業の方の意見はほんとありがたいです。
コンパイルエラーと違ってassert(3)は実行時にエラーを吐くので同じ「実行するときに診断する」プログラムでassert(3)より高機能なデバッガ(GDBとか)を使うということですか?
---
>>591の処理ですが以下のように書き直したところ望み通りに動きました。
みなさまありがとうございます。感謝します。
#include <stdio.h>
#include <stdlib.h>
#define PR_POS(_pos) printf("%s:" #_pos "\n", str)
int main(void) {
char str[256] = "text";
//printf("%s: abc\n", str);
PR_POS(abc);
exit(EXIT_SUCCESS);
}
615:デフォルトの名無しさん
18/08/31 10:04:04.85 Qsv+Vg4k.net
assertの使い道って「ここでは必ずhogeになる!」という意志をコードに残すという意味はあるかな。
言ってるとおりで動かすときはgdb使うし、開発中は単体テストで同等以上の確認するしで、実用性は今はあまり無いと思いますね。
616:デフォルトの名無しさん
18/08/31 11:00:23.86 mNRFahys.net
assertはどっちかつーと単体テストでよく使う
617:デフォルトの名無しさん
18/08/31 12:32:32.62 QMdn6GpG.net
本番コードでもassert使うかな
ハードエラーみたいなのはカバーしきれない
618:デフォルトの名無しさん
18/08/31 12:51:53.38 jQ6ZKbRR.net
>>606
> assertの使い道って「ここでは必ずhogeになる!」という意志をコードに残すという意味はあるかな。
assertion の意味は主張だからむしろそれが正しいとも言えるな
> 実用性は今はあまり無いと思いますね。
最初作るときはそうでも改修時に全然触ってない所のassert()に引っかかることもあるから俺は基本入れてる
619:デフォルトの名無しさん
18/09/02 07:11:07.60 667Fbrpy.net
int a = 42;
a = a++;
↑これがコンパイルエラーになる理由って
「左辺aに対する代入と右辺aに対するインクリメントのどちらの演算を優先して処理するか不定である為」
で合ってますか? 不定じゃなくて未定義かも……。
620:デフォルトの名無しさん
18/09/02 07:29:52.76 fa3EYjvI.net
エラーになるか? 警告ではなく
621:デフォルトの名無しさん
18/09/02 09:00:51.15 667Fbrpy.net
>>611
-Werrorとかにしてました
622:611
18/09/02 09:07:14.14 667Fbrpy.net
>>611
あれ。すいません。よく分からなくなりました。
$ gcc -pedantic -std=c99 -Wall -Werror -O2
でコンパイルするとエラーになり停止しますが
$ icc -std=c99 -Wall -Werror -O2
でコンパイルするとあっさり通りますね……。
623:デフォルトの名無しさん
18/09/02 09:27:27.59 pzXMyV5h.net
>>610
未定義っす (>>1 C FAQ の 3 章を参照してください)
蛇足ながらシーケンスポイントの間でオブジェクトを変更できるのは高々1回だけとか、そんな感じのルール
>>613
gcc の -Werror オプションは警告をエラー扱いにするっす
624:デフォルトの名無しさん
18/09/02 09:59:41.19 GR8jnF/5.net
未定義だからコンパイラは何をしてもいい
625:デフォルトの名無しさん
18/09/02 10:00:57.15 667Fbrpy.net
>>614
ありがとうございます。
ちなみにicc (Intel(R) C/C++ Compiler)で-Wallおよび-Werrorオプションを設定したときは
警告もなにも出力されることなくコンパイルに成功してしまったんですが
理由とか分かりますかね。すいません。変な質問で……。
626:デフォルトの名無しさん
18/09/02 10:19:45.38 667Fbrpy.net
>>614
あと,おっしゃる通り(すくなくともC99では)未定義でした。ありがとうございます。
> 直前の副作用完了点から次の副作用完了点までの間に,
> 式の評価によって一つのオブジェクトに格納された値を変更する回数は,高々1回でなければならない。
> さらに,変更後の値の読取りは,格納される値を決定するためだけに行われなければならない。
(JIS X 3010:2003 p.48; 参考 URLリンク(dotup.org))
627:デフォルトの名無しさん
18/09/02 11:28:11.60 owKXNyzr.net
>>610
そういう文法的になことには今は拘らない方がいい。(これは他言語学習者の方が酷いが)
上達の妨げにしかならない。
プログラミング言語は、「正しく書いたときに正しく動作する」ようにしか設計されていない。
特にCはそうだ。
意味不明なことを書いたらだいたい全て「未定義」であり、
意味不明なことを書く奴が悪い、ということになっている。
そしてそれが「未定義」と覚えることも、実質的な意味はない。
そんなコードはすぐに修正され、存在しないからだ。
実際、 a = a++; なんてコードは、どのOSSにもないはずだ。
この意味で、Cは全くの素人の入門者用ではない。
例えばC#はそこら辺厳しい言語で、そういった意味不明な書き方は全てコンパイルエラーにされるはず。
(さすがにその例では知らんが、例えば「未初期化の変数を使用」とかがエラーになる)
というか、マジでそのレベルならC#やった方がいい。
文法エラーなんてサジェストが出てOK押したら自動的に修正してくれる。
お前がどんな環境でやってるのかは知らんが。
ただ、こういった無駄な遠回りをしなくて済むだけでも、君にとってC#は有効だと思うよ。
つか、初心者は全ての文法を押さえないといけないと勘違いするようだが、それは間違いだ。
自分が使うだけの文法を押さえ、さっさと使うべきだ。
お前だって日本語の全ての漢字が読めるわけでもないのに日本語を使ってるだろ。
プログラミング言語も同様で、手段でしかないのだから、文法を一通り確認したら、
さっさとゲーム等何でもいいから作れ。
ネタがないのならそれはそもそも今プログラミングを学ぶ必要がないとも言えるし、
それでもやりたいのならラズパイでも買ってきてLEDチカチカでも目指せ。
文法を学ぶことが目的になってはいけない。それは完全に空回りだ。
628:デフォルトの名無しさん
18/09/02 11:39:01.45 mdI4MGys.net
やりたいことはシンプルに書けよってことだな。
最終的に a にどうなってほしいのか、それってもっと端的に書けないの?ってこと。
Cオタクになるのが目的じゃなければな。
629:デフォルトの名無しさん
18/09/02 12:11:10.31 owKXNyzr.net
(ちなみに補足)>>610
初心者には理解不能だと思うが、
「文法で許されていることが全て許される」環境なんて実質的に存在しない。
だから文法のコーナーケースについてはそもそも覚える必要がない。
(とはいえ、肝心のK&Rがフリーダムすぎて…ってのはあるが)
これは小説→ラノベの流れと同じで、
美辞麗句の技巧に走る必要はなく、簡単な文を書き連ねて面白い筋を書け、ということ。
プログラミングにおいてはこれが徹底していて、
同じ物なら、簡単な方が『常に』いい、ということになっている。
ただ、どこからが複雑なのか?というのは議論になる。
例えば自然言語で韓国が漢字を廃止した際、
「停留所」を「ばすが とまる ところ」と書き換え、老人が「舐めとんのか!」と切れた。
実際、全員が読める漢字を「もっと簡単に」という理由で平仮名に書き換えられても困るだろ。
丁度これと同じ(だが方向は逆)で、
新しいプログラミング言語は比較的すんなり書ける文法が用意されており、
それを使うべきかどうかでは揉めたりしている。
ただ、Cは古いのでまどろっこしい文法しかなく、ベタな書き方しか出来ない。
だから比較的この論争に巻き込まれることはないはず。
(それ以前に文法セット自体が小さくて、え?これだけ?のはずだが)
>>619
天然と養殖では学びのベクトルが逆なんだよな。
天然: 1を足したい → a++ と書くのか
養殖: a++と書くと → 1が足されるのか
結果、要因側をenumすると文法一覧になるのが養殖で、これが間違いの元だ。
そしてそれを馬鹿正直に一つずつ潰すから文法エリートになっていく。
そうではなく、要因側のenum結果はやりたいこと一覧になって、全部揃えばゲームが作れる!が正しい。
630:デフォルトの名無しさん
18/09/02 12:24:17.27 667Fbrpy.net
>>620
ちょっと反論があります。正直Cどころかプログラミング初学者なのですが……。
要するに私は〝養殖〟であり,そのような学び方では成長しないと仰りたいわけですよね。
まあ確かに自分でも「規格厨」というか,衒学的な性格をなのは自覚してます
しかしプログラミング言語というのは自然言語とは違う面が多々あると思います。
そして「文法を網羅すべきか」という点においては特に違うと思います。
プログラミング言語は少なくとも概念においては文法に正確に従えば定められた動作を確実に行ないます。
日本語の文法を遵守して話しても考えが伝わらないのとは全く異るところです。
だから私はプログラミング言語においては先に(かなり厳密に)文法を学ぶべきであり,
「文法を学ぶ」ことのなかには未定義動作に関する諸々の知識を習得することも含まれていると考えます。
偉そうにすいませんでした。まあ上手くいかなければまた考えを改めるつもりではいます。
631:デフォルトの名無しさん
18/09/02 12:32:31.40 mdI4MGys.net
やりたいことを素直に書いたつもりで未定義な文法になってしまうなら、もっと論理を考えた方がいいかも。
やりたいことを行う手順を整理できてないってことだと思うよ。
a = a++; ということが結局どういう動作するのかを知ることより、何をしたくてそういう(矛盾をはらむ)書き方になったのかを自己分析した方がいい。
もちろん基本的な文法は勉強しておく前提はあるよ。
おれは養殖とか天然とかは分からんけど。
632:デフォルトの名無しさん
18/09/02 13:02:03.12 gypPfsRT.net
Cは文法的にはコードのデザインをほとんど規定しないからね。
そういう意味では頑張って覚えるほどでもない。まあ量も少ないので覚えてもいい。
でも古いコードとの互換性にこだわる様なおっさんにはならんでくれやという感じ。
633:デフォルトの名無しさん
18/09/02 13:06:08.54 nnaQ2akS.net
>>621
あなたの言うことにも一理ある。
でもこの板にいる人は1つの言語しか使えない人って少数派で、たいていは3、4つまたはそれ以上の言語を操るマルチリンガルな人が多いと思う。
んで、その人たちはどうやって新しい言語を使えるようになるかって言うと、1つの言語をマスターすると(Prologとか特殊な言語は除いて)他の言語も方言みたいなもので、書き方の問題だけなことが多いのね。
その際には特定言語の重箱の隅をつつくような知識が必要なわけではなく、むしろ最大公約数的な知識、もっと言うと言語に依存しない設計力のほうが大事になってくる。
なので、特定言語のあまり細かいルールにこだわり過ぎないほうが良い、という経験論での意見は間違ってはないと思うよ。
634:デフォルトの名無しさん
18/09/02 13:21:05.23 mdI4MGys.net
そうそう、しいて文法を覚えるなら適切に const を指定するクセを付けてほしいな(const に限った話ではないんだが)。
文字列を引数で受ける箇所全部が char* になってるコードを見るとクラクラするw
635:デフォルトの名無しさん
18/09/02 13:50:09.03 owKXNyzr.net
>>621
反論自体は自由にやればいいんだよ。それが匿名掲示板のメリットなのだから。
ただ、書かれている内容については吟味しないといけない。
その中には君にも峻別出来る内容もあるはずだから。
(というか、こっちが君にも分かる範囲で《客観的な範囲で》話せばいいのだが)
事実から言うと、C言語は『当初から』バリバリの実用言語であり、今も現役だ。
これは同世代の他言語とは全然違う。
だから、普通に書いてれば「未定義」なんてのに命中するはずがないんだよ。
そんな言語、使い物にならないだろ?
次に、歴史も長いのだから、何をどうやったら嵌るかのノウハウも溜まっている。
それの集大成がコーディングルールであり、例えば goto 禁止論だ。
これについても是非はあるが、これまでの経験をタダで享受する気なら、乗った方が得だ。
そしてそれに従っておけば大体全て「未定義」は回避出来る。
具体的に言えば、警告レベルを一番か二番目に厳しい状態で使って、警告についてはほぼ全部直し、
google等「コードを実際に書いている連中」のルールに従って書けば、そもそも未定義なんて踏まない。
それらはそのように整備されているから。
業務で「コーディングルール無し、警告も全部無視してよし」なんてのはあり得ないし、
仮に個人レベルでそうでもバグが取れなくて無駄に苦労するだけ。
だから結果的に「未定義」なんて気にする必要ないんだよ。
一般的な環境で普通に書いてれば命中しないし、知る必要もない。
一通りも書けない初心者なら特にそう。他にやることはいくらでもある。
君は休日にプログラミングをやろうとしているのだから、本来は「天然」なんだよ。
それを自分で「養殖」型のカリキュラムにして、無駄に上達しにくくなってる。
そこが勿体ない。
君が何の為にCを学ぶのかは知らないが、もっと直接的にその結果を目指すべきだ。
とりあえず学ぼう、では全く上達しないんだよ。
それは日本人の英語でもそうだろ。使わないと上達しないんだよ。
636:デフォルトの名無しさん
18/09/02 13:50:53.63 667Fbrpy.net
>>624
確かにそうですね。先に述べた通りプログラム全般に暗いのですが
JavaやPythonなども大まかな構造(サブルーチンとか演算体系とか)は
似ているかなと感じました(見当違いなこと言ってるかも)。
もっと抽象的な立場になったほうがいいですかね。
>>625
アドバイスありがとうございます。
ggってみたところconstはその重要性の割に実務で使われていない傾向にあるみたいですね。
しかし役割を考えると,特に保守の面で,積極的に使うべきだなと確信しました。
「ここは固定された値代入を想定している」という意図を明確にできるってことですよね?
637:デフォルトの名無しさん
18/09/02 14:03:37.00 667Fbrpy.net
>>626
そうですね。
動くプログラムを作っていたらa=a++;なんていう文は登場することはないですね。
お察しの通りプログラマーでもなんでもない独学状態なので,
そういう人間が犯しがちなミスを防ぎたい一心で規格や文法などを厳密に勉強すべきと思っておりました。
C#についてですが,こういう事を素人が言うのはまさに傲慢ですけど,
どうせ勉強するなら万人が使ってる/種々のソフトウェアを作っている標準言語を勉強したいな
と思ったのがきっかけなので,正直C#はあまり乗り気になれません。
638:デフォルトの名無しさん
18/09/02 15:19:58.46 mdI4MGys.net
>>627
const の役割はその通り、その値を書き換えないことを意思表示するためのもの。
strcpy の引数なんかを見ても分かると思うけど、このように使い分けするだけで関数の入出力もよくわかる。
ケアレスミスで入出力を逆に書いてもコンパイラが指摘してくれる確率が上がるし、コンパイラにとっても最適化のヒントになってる。
でも実際、const皆無のコードも珍しくない。
そんな所に自分だけ const 付けると、余所の関数を呼ぶために意味不明なキャストをするハメになってストレスMAXになる。
ただ厳密に考え出すと、値受けの引数 int x なんかは const int x であるべきでは?なんて思うけど、個人的にはそこまで強要はしなくてもいいかな… なんて思う。
でもポインタ受けの引数 char* p なんかは const char* p にすることを強要したい。
前者について緩いのは、その const はその関数の中の実装を縛るものであり、そんなことは関数の外の世界の人にとってあまり重要ではないから、というのが理由。
639:デフォルトの名無しさん
18/09/02 15:26:12.33 FVhWhkTR.net
>>628
C#にマイクロソフト性を強く見出しているのか知らんがJDKがゴタついていて.NET Coreが出てマルチプラットフォームで優位性があり、Unityでゲームも作れる
コンピュータを勉強したいならCでいいけどプログラミングを勉強したいならCと比較してもC#は十分万人が使っている標準言語としての地を持つよ
640:デフォルトの名無しさん
18/09/02 15:44:37.64 Q8aSECkx.net
組み込みなどの特殊な分野を除けばC言語の方こそ万人向けとは言い難いな
C言語はそれほど広範な分野で利用されるような言語ではないよ
641:デフォルトの名無しさん
18/09/02 16:20:10.20 d8qknsqq.net
C言語が使えない環境は少ないけど、かと言ってC言語を積極的に使う必要のある環境も少ない、かな?
でも全ての基本として、低レベルなCを理解しておくのは有意だと思う。
642:デフォルトの名無しさん
18/09/02 16:34:34.65 mdI4MGys.net
C の前にアセンブラやってみるのも悪くないと思うよ。
今はお手軽なワンチップマイコンも多いし。
欲を言えば昔の 8bitパソコンくらいがメモリもそこそこあってちょうどいいし、16bit くらいになるとスタックフレームも使いやすくていいんだけど、今そういうので丁度いいのはあまり無いのが残念なところだけど。
643:デフォルトの名無しさん
18/09/02 16:48:06.49 owKXNyzr.net
>>628
君が思っているほど言語間の差異はないよ。
とはいえ、本気でコンピューターについて学ぶのならCは外せない。
最初からやる必要があるとは思わないが、それも含めて自由にすればいい。
最初はスクリプト言語(Ruby/Python/JavaScript)の方が上達は速いとは思うが。
>>627
> ggってみたところconstはその重要性の割に実務で使われていない傾向にあるみたいですね。
constもある意味宗教だからね。
使われてない理由は、単に、苦労に見合う結果を得られないからだよ。
Cに関してはconstを積極的に付ける理由もないからね。
C++は参照を導入したからconstを付けないと変更されるかどうかが分かりにくくなった。
Cだとポインタなら変更される(可能性がある)、そうでないなら変更されないと文法的に確定している。
だからgoogleは参照はconst以外禁止、というルールでC相当にしている。
C#では明示的にoutと書いて分かりやすくしている。
constを付けたことによるメリットは、constに対して代入したときにコンパイルエラーになることだが、
そもそもこれがないんだよ。constなんて間違う場所に使うものではない。
(ただし俺はCでストリング操作を積極的にやったことはないので、char*に関しては分からん。
>>629が引っかかっているのもそこだろうし。
とはいえ、世の中はstringはimmutableということでほぼ確定してしまったし、
今更mutableなstringの作法について学ぶ必要もないはずだが)