X



C言語なら俺に聞け 147
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
垢版 |
2018/08/16(木) 23:36:02.22ID:fOCSKLtw
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/


C言語なら俺に聞け 146
https://mevius.5ch.net/test/read.cgi/tech/1525031257/
0006デフォルトの名無しさん
垢版 |
2018/08/17(金) 10:07:35.20ID:hKcJGgnp
>>1
乙curry
0007デフォルトの名無しさん
垢版 |
2018/08/17(金) 20:50:45.41ID:dgg8VvhO
>>4
ちょっとはググって言え。

使い道のないはずのイテレータをC++ではどう活用してるのか、
何故そんなことになるのか、考えてみろ。
0008デフォルトの名無しさん
垢版 |
2018/08/17(金) 20:54:30.35ID:dgg8VvhO
というかこのスレワッチョイ外されているんだな。
最近この手の荒らし多いな。

俺はワッチョイ無しのスレは気に入らないから、
>>4の疑問について、ワッチョイ無しのスレ(=このスレ)では答えないことにする。
まあもうヒントは十分に与えたし、馬鹿でなければ辿り着けるはずだが。
0009デフォルトの名無しさん
垢版 |
2018/08/17(金) 21:23:33.04ID:oMyhNvCc
イテレータへのこだわりは確かに謎。結局ローレベルな話なんだよね。
foreachという切り口だとイキるのが難しいということか。
0012デフォルトの名無しさん
垢版 |
2018/08/18(土) 00:42:04.17ID:JHZyD4lZ
改めて明解C読んだけどどう考えても入門者向けじゃねえなこれ
これ最初に読んだせいで挫折した人多そう
0013デフォルトの名無しさん
垢版 |
2018/08/18(土) 01:38:53.00ID:MBfkrj0T
その教科書は教師を再生産するための商品
独学でどうにかするアイテムじゃあない

教科書の肝心のところに教師から教えてもらうフェイズがひっそりとしのばせてある
だから教師の関与が深い
補助の人間が必要な物品だよ
教科書を誰が買うかっていうと、先生がより先生っぽい演技・活躍を出来るアイテムを買うだろ
だから教師の再生産をするためのアイテムを教師が生徒に買わせるんだよ

教科書は生徒が買うんじゃなくて先生が買う、
そのフェイズでは教師の介在があってはじめて理解できるようなひっかけがなくちゃあならない、
だから「入門者向けじゃねえ」になる
0014デフォルトの名無しさん
垢版 |
2018/08/19(日) 16:42:31.78ID:Gtfg19Vf
C言語の入門書を読み終えて文法をある程度理解したところなんですけどこの次はどうしたらいいんでしょうか・・・
0015デフォルトの名無しさん
垢版 |
2018/08/19(日) 16:48:10.98ID:mbogTHsz
何かを作って見る
何を作るかは自分で決める
決められないときは、みんなに相談してみる
0016デフォルトの名無しさん
垢版 |
2018/08/19(日) 16:58:14.33ID:PTySIHXJ
>>14
アルゴリズムとデータ構造の本を一冊買って勉強しとけ
もちろんコードを書くんだ
コードを書かないならそんな本は買わなくてよろしい
0023デフォルトの名無しさん
垢版 |
2018/08/19(日) 23:13:09.55ID:wM6XArJ0
詳説 Cポインタ、2013、オライリー・ジャパン

ポインターだけで1冊、本が書けるw
0024デフォルトの名無しさん
垢版 |
2018/08/19(日) 23:22:19.21ID:lk0ey+5M
引数に配列をとるとき
f(int* data)とf(int data[])の両方が有りだということは分かったのですが、基本的に後者の書き方をしてるコードはほとんど無くて大体前者な気がします。
これはなんででしょうか。後者の方がはっきり配列だとわかります。前者は配列を求められているのかただのint型のポインターを求められてるのか判断つかないと思うんです
0026デフォルトの名無しさん
垢版 |
2018/08/19(日) 23:26:29.60ID:6TZ29Z92
ポインタ本ならこっちの方がいい

新・標準プログラマーズライブラリ
C言語 ポインタ完全制覇 大型本
前橋 和弥 (著) 2017/12/7
0027デフォルトの名無しさん
垢版 |
2018/08/19(日) 23:55:12.29ID:wM6XArJ0
>>24
[ ] は、サイズが変わらない

* は、単なる先頭アドレスで、サイズが変わるかも知れない
0028デフォルトの名無しさん
垢版 |
2018/08/20(月) 00:01:28.25ID:FDfJ6Eqh
>>24
配列表記はアドレス表記のエイリアスだから区別するという発想がそもそもない
配列アクセスするコードならアドレスと配列のサイズを引数で渡す
0029デフォルトの名無しさん
垢版 |
2018/08/20(月) 00:03:41.14ID:OvqDIJZn
関数の引数としては配列であろうがポインタであろうが、ただのアドレスとしての意味しかない
0030デフォルトの名無しさん
垢版 |
2018/08/20(月) 00:12:09.78ID:V9a8ZDkH
>>29
配列でもポインタでも同じってことは分かってるでしょ
それでも元が配列なら配列で受けたほうが分かりやすいのでは?
という疑問だと思う

>>24
ぶっちゃけ、Cに慣れてくるとどっちでもたいして変わらない
配列で受けたいのならそうすればいい。
実際のところ、両方それなりに使われてる。
例えば、main() は int *argv[] にすることが多いんじゃないかな
多分だけど
0031デフォルトの名無しさん
垢版 |
2018/08/20(月) 00:19:11.88ID:houfzDz0
>>24
配列っぽい表記に惑わされて、sizeofして長さを求めようとしたというバグを何度か見ました。
0033デフォルトの名無しさん
垢版 |
2018/08/20(月) 01:02:08.56ID:houfzDz0
そんな文法はない。
宣言としては有効かな。でも意味はないだろうね。ただのポインタ。
0035デフォルトの名無しさん
垢版 |
2018/08/20(月) 03:08:45.92ID:k5zLgYIW
>>24
なるほど、じゃあ君は
void swap_int(int lhs[], int rhs[]);
と書いてもらえれば判断つきやすいんだな
0036デフォルトの名無しさん
垢版 |
2018/08/20(月) 04:14:23.20ID:GHO1XUgy
なんというか、Cならではの問題かな。
Javaもちょっと似てるか。
0037デフォルトの名無しさん
垢版 |
2018/08/20(月) 06:23:59.34ID:W9GZumqR
下のようなコードを書くとコンパイルエラーになるでしょ。
int ary[100];
int val;
val = ary++;
このaryは配列だから、ary自体の値を変化させる操作は出来ない。
それの類推で関数の仮引数はポインタで受けるんじゃないかな。
関数の中でポインタ風に使う変数はポインタの形で宣言。

関数内で値を変化させず [] によるインデクスだけでアクセスするなら
仮引数を配列の形で宣言するのも分かりやすい書き方かも。

後は歴史的な事情。
配列風に書くとインデクス計算に掛け算を使われて遅かった名残り。


>>30 俺はmainの引数は main(int argc, char *argv[]) だな。
保守的だけど、こんな場面で独自色出すことないしね。
0038デフォルトの名無しさん
垢版 |
2018/08/20(月) 07:23:53.30ID:iMQAgpc+
>>24
あんたの感覚は正しいと思う
同じだと言ってる奴もいるけど
foo(int a[]){
a = … /* エラー */
とか微妙に違う
ただそこまで気にする人があまりいないだけ
0039デフォルトの名無しさん
垢版 |
2018/08/20(月) 07:29:22.22ID:OvqDIJZn
関数の引数では配列の要素数は無視されるだけ
変数としての配列とポインタは別物だけど、関数の引数では全く同じもの
0040デフォルトの名無しさん
垢版 |
2018/08/20(月) 08:10:21.73ID:iwav6OWh
理由は既出だけど、C言語では配列とポインタは明確に違うよ。
相互変換可能なだけ。
0042デフォルトの名無しさん
垢版 |
2018/08/20(月) 09:09:43.44ID:zNROsdOB
同じ点もあるし違う点もある
同じ点を強調したいときに「同じ」
違う点を強調したいときに「違う」
と言うだけ

具体的に語らないと何の意味もない
0043デフォルトの名無しさん
垢版 |
2018/08/20(月) 09:30:29.85ID:W9GZumqR
>>38
そのコード片、エラーになるかな?
仮引数のa(intへのポインタ)に
関数内で値を代入することは許されるはずだけど。
0044デフォルトの名無しさん
垢版 |
2018/08/20(月) 10:24:22.53ID:B6E8iGMG
代入ではエラーにならんと思うよ。
lvalueとして使えると思う。配列っぽく書けるがあくまでポインタ。
0047デフォルトの名無しさん
垢版 |
2018/08/20(月) 11:46:22.27ID:B6E8iGMG
引数の配列がホンモノだとすると、非NULLが保証されてないとあかん。
というか構造体渡しと同様の配列渡しが必要だな。まあ使わんか。
0048デフォルトの名無しさん
垢版 |
2018/08/20(月) 13:08:43.61ID:k5zLgYIW
>>37
その例は
void func(int ary[100])
{
int val;
val = ary++;
}
との違いを示そうとしているのだとしたら
int *val; じゃないとおかしいだろ

>>37
[]で書くべきと主張するんなら
char argv[][]にしなきゃねえ
もちエラーだけどw
0049デフォルトの名無しさん
垢版 |
2018/08/20(月) 13:28:58.98ID:HLNtX2wQ
>>47
ま、必要なら構造体の中に入れて渡すと。
0050デフォルトの名無しさん
垢版 |
2018/08/20(月) 16:12:09.36ID:K5YeoIjy
配列をパラメータにするのは
サイズが決まってる時にそれを明示したい場合くらいだな

ポインタの方が汎用性が高いから
0054デフォルトの名無しさん
垢版 |
2018/08/21(火) 07:38:47.67ID:Xgm2Pp2D
初心者に対して誤解を与えるだけじゃね?
必ずそのサイズで呼ばれると保証されるわけでもないし。
0055デフォルトの名無しさん
垢版 |
2018/08/21(火) 08:20:07.94ID:FuTngql1
>>52
意味は違うね

要素が100個以外の時に前者を使ってるコードを見たら気持ち悪いだろ?
そういうこと

コンパイラによってはary[1000]にアクセスすれば警告が出る
0056デフォルトの名無しさん
垢版 |
2018/08/21(火) 08:40:04.69ID:ZsMFgi2m
ほんとに警告出るのか?
サイズ指定に意味がないというのが規格だし、コメント程度の役割しか持たせたらあかんという気が
0058デフォルトの名無しさん
垢版 |
2018/08/21(火) 09:13:57.61ID:GIXT+l9b
お高い静的解析ツールだと警告出るかもね。
やってないから知らんけど。

そういう環境で開発できるならコメント以上の意味はあるかも。
仮定で申し訳ない。
0063デフォルトの名無しさん
垢版 |
2018/08/21(火) 10:40:22.58ID:gERn4ySS
>>60
もう一度言う、おまえの主観は聞いてない
正論か屁理屈かはおまえの主観だ
客観的事実を示せ、理屈はそれからだ
0065デフォルトの名無しさん
垢版 |
2018/08/21(火) 10:59:30.05ID:gERn4ySS
>>62
void func(int ary[][100]); これはできるのに
int func(void)[][100] これはできない
{
int ary[][100]; これもできない
ary = 0;
return ary;
}
extern int ary[][100]; と
extern int (*ary)[100]; は意味が違う
結局、[]で書くべきなんて主張は
通用しないところが多すぎる戯れ言だ
0066デフォルトの名無しさん
垢版 |
2018/08/21(火) 11:01:09.20ID:gERn4ySS
>>64
プログラム言語は機械に解釈させるためのものだ
自明なことを誰も言ってないなんてことこそ屁理屈そのものだろうが
0070デフォルトの名無しさん
垢版 |
2018/08/21(火) 11:55:44.43ID:gERn4ySS
>>69
void func(int ary[100]); これのどこが
void func(int *ary); これの構文糖衣なんだ?
書いた奴の頭を疑わせる以外にどんな意味があるんだよ
0071デフォルトの名無しさん
垢版 |
2018/08/21(火) 11:56:39.26ID:gERn4ySS
サイズが100でなければならない関数なら
void func(int (*ary)[100]); こう書いて
int ary[100];
func(&ary); こう渡せよボンクラ
0073デフォルトの名無しさん
垢版 |
2018/08/21(火) 12:28:57.33ID:GIXT+l9b
>>71
どうした?
コードレビューで上司にボコボコにされた腹いせか?
こんなとこでイキっても虚しいだけやで。
0074デフォルトの名無しさん
垢版 |
2018/08/21(火) 12:29:15.96ID:GIXT+l9b
>>71
どうした?
コードレビューで上司にボコボコにされた腹いせか?
こんなとこでイキっても虚しいだけやで。
0077デフォルトの名無しさん
垢版 |
2018/08/21(火) 12:54:14.69ID:m1oFA/yA
多次元配列の型は typedef で型名作っておけば楽なのでは?
0079デフォルトの名無しさん
垢版 |
2018/08/21(火) 13:04:39.72ID:gERn4ySS
>>78
構文糖衣の話をしたんだが
構文糖衣と書いてないと読めないオツムなのか?
アホw バカwww
0081デフォルトの名無しさん
垢版 |
2018/08/21(火) 13:09:48.25ID:O6Fgkzwj
>>75
そりゃわかりにくいからだよ。
引数にするとCの多次元配列の嘘くささがよく表れるわ。
せめて構造体で包むとかして名前を付けた方がいいね。
0083デフォルトの名無しさん
垢版 |
2018/08/21(火) 13:10:23.54ID:RiLuNws8
>>70
それを糖衣構文というかどうかどうでもいいけど
だれも機械の解釈の違いには言及してない定期

>>50>>52
明示とは機械に対してではなく人間に対してのことを言ってるからこの返信は意味がずれてる
0084デフォルトの名無しさん
垢版 |
2018/08/21(火) 14:09:26.92ID:Xve8S0h8
超初心者です。
シミュレーターで動かしながら独学で学んでいるのですが、
scanfが動かない(スルーされる)ので困っています。scanfが動くシミュレーターってあります?
0088デフォルトの名無しさん
垢版 |
2018/08/21(火) 20:15:22.43ID:FwleoeVd
for文でこんなのを発見したのです。
for(;;)
ご覧のとおりセミコロンがカッコ内に2つあるだけ。
これはどういうfor文でしょうか。
ググり方も分からないです。
0090デフォルトの名無しさん
垢版 |
2018/08/21(火) 20:22:25.64ID:i/CPlprw
昔からその書き方の無限ループを好む人は多い
俺が知ってる範囲だとカーニハンもその書き方を好んでいた
009188
垢版 |
2018/08/21(火) 20:22:27.49ID:FwleoeVd
>>89
(*´Д`)ありがとうございました。
0092デフォルトの名無しさん
垢版 |
2018/08/21(火) 20:27:12.52ID:mIqstMqN
無限ループって言っても
大概は何かの条件で脱出するわけだから
while (条件) が一番わかりやすいと思う
あ、好みだろうから、反論は不要です
0093デフォルトの名無しさん
垢版 |
2018/08/21(火) 20:34:59.42ID:8p839GFL
>>92
俺も無限ループはwhile(TRUE)派だな。
静的解析で怒られるから使うなって人もいるけど。
これも個人の好みなので反論不要です。
0094デフォルトの名無しさん
垢版 |
2018/08/21(火) 20:45:15.49ID:FwleoeVd
無限ループには
for(;;)
while(1)
while(true)
などがあるようですが、驚いたことにfor(;;)がC言語の伝統的スタイルなんだそうで。
0097デフォルトの名無しさん
垢版 |
2018/08/21(火) 21:12:46.13ID:xHZnBR+z
true って新しいCだと使えるの?
0100デフォルトの名無しさん
垢版 |
2018/08/21(火) 21:21:39.51ID:WLqP+HZB
for(;;)は無条件であることを的確に表現してる
条件が書いてないのはこれだけ
0101デフォルトの名無しさん
垢版 |
2018/08/21(火) 21:30:40.05ID:xHZnBR+z
そういややったことないけど while () はできないのかな?
できたらできたでなんか怖いがw
0102デフォルトの名無しさん
垢版 |
2018/08/21(火) 21:35:16.36ID:8p839GFL
>>100
冷静に考えると、何でfor(;;)の真ん中の条件式のとこ空欄でも正しい構文になるんだろうね。
for以外に条件式省略できる構文ってないよね?
0103デフォルトの名無しさん
垢版 |
2018/08/21(火) 21:39:06.78ID:xHZnBR+z
if () ができたらなんか嫌だな
0107デフォルトの名無しさん
垢版 |
2018/08/22(水) 01:03:40.03ID:Vm7yolE7
ループの話でふと思い出したんだけど、この書き方キモいと思う?

LOCK();
while (条件) {
  UNLOCK();
  LOCK();
}
UNLOCK();
0111デフォルトの名無しさん
垢版 |
2018/08/22(水) 02:53:55.25ID:wb9Zg9xS
for (\(^o^)/)
0112デフォルトの名無しさん
垢版 |
2018/08/22(水) 06:53:07.59ID:Vm7yolE7
>>108
while (条件) で統一したいと思いつつ、この手の場合LOCK, UNLOCKのインデントがズレててキモいなといつも気になってしまう
まあどーでも良すぎていつも放置するが

>>110
アトミックな条件チェックの話
0113デフォルトの名無しさん
垢版 |
2018/08/22(水) 07:33:35.95ID:RPMrdt6N
>>112
手動でインライン展開する必要がなければ、普通は、

while (check_func()) {
}

bool check_func(){
LOCK();
bool retval = XXX; // check something here
UNLOCK();
return retval;
}

とする。
C++なら inline を付ければインライン展開時(元のコード)と似たようなオブジェクトコードが出ることになっている。
0115114
垢版 |
2018/08/22(水) 09:36:42.99ID:ULC6Ul0L
ごめん、ちがた
0116デフォルトの名無しさん
垢版 |
2018/08/22(水) 09:52:30.97ID:2YTphjWh
>>107
条件を判断するためだけにLOCK/UNLOCKを行うコードだとしたら最悪のコードだ

do {
LOCK
判断
UNLOCK
if (!判断結果)break;
} while (1);

素直にこうしなさい
0118デフォルトの名無しさん
垢版 |
2018/08/22(水) 11:35:04.81ID:yJL450CM
どこが素直なんだ
締め切りが迫ってバグが取れず
なりふり構ってらんなくなったやつが書く
イカレたコードでしかない
0121デフォルトの名無しさん
垢版 |
2018/08/22(水) 12:27:28.23ID:2YTphjWh
ん?
一番素直だろうが
条件判断の為だけにLOCKしてるという前提で

判断を関数に分ける?
分けるかどうかはこんなちっぽけな理由で判断するべきじゃないよ
判断の度に関数にしてたら意味不明な関数で溢れるぞ

もちろん意味が明瞭で他にも同じ判断を使う可能性があるのであれば
関数やマクロでパッキングすべきだが
0122デフォルトの名無しさん
垢版 |
2018/08/22(水) 12:36:44.83ID:yJL450CM
LOCK
判断
UNLOCK
というアトミックなシーケンスを関数にする理由はちっぽけじゃない
LOCK/UNLOCKが必要な具体的な場面を想定しての発言には見えない
0123デフォルトの名無しさん
垢版 |
2018/08/22(水) 12:50:05.96ID:2YTphjWh
どういう場面かなんて>>107では判断不能だし
分けるべきか分けないべきかも>>107では判断不能

判断出来ないのに
「わざわざ関数構成を変えるべき」
なんて主張をすべきじゃない
0125デフォルトの名無しさん
垢版 |
2018/08/22(水) 13:14:18.16ID:yJL450CM
昨日のvoid func(int ary[100]);にしても
ary[1000]を警告する処理系の具体的な例が挙がってないしな
0126デフォルトの名無しさん
垢版 |
2018/08/22(水) 13:39:37.67ID:2YTphjWh
>>124
わからんねえ
エスパーじゃないんだから

経験が少なくて
分けないべき場面が思い浮かばないんだろうねえ
0129デフォルトの名無しさん
垢版 |
2018/08/22(水) 14:15:28.00ID:J6lVaoNe
パッと見て何をしているか分からないソースって
後の人が取っても苦労するし、気の毒
0131デフォルトの名無しさん
垢版 |
2018/08/22(水) 14:26:31.81ID:TfhbroeT
while ( ^∀^)
0132デフォルトの名無しさん
垢版 |
2018/08/22(水) 15:10:17.96ID:44OVOulF
check_func()というアドホックっぽい関数名が誤解のもとかな
get条件atomically()にすれば意図が明白
0133デフォルトの名無しさん
垢版 |
2018/08/22(水) 15:19:38.80ID:yJL450CM
atomicallyって文言いるかねえ
いちいち全部につけて回るより
LOCK/UNLOCKしてることは
忘れたフリができるほうがいいと思うが
0134デフォルトの名無しさん
垢版 |
2018/08/22(水) 16:17:52.89ID:BT6ndhEb
英語圏の人には for (;;) をまとめて熟語的に "forever" と読めて
座りがいいのかも知れん。
カーニハンとパイクの『プログラミング作法』に
それに近いようなことが書いてあった。
0137デフォルトの名無しさん
垢版 |
2018/08/22(水) 16:44:34.35ID:AU3mefLA
>>134
そう言われると確かに座りが良いかもしれんが、(;;)をeverと読むのか。。。
今の時代では顔文字の失敗作にしか見えんなw
0138デフォルトの名無しさん
垢版 |
2018/08/22(水) 16:54:07.40ID:yJL450CM
>>134
#define ever (;;)
とかやんの?

だったら
#define forever for (;;)
のほうがマシだと思う

>>135
空想論なら付き合ってらんねえぜ
0139134
垢版 |
2018/08/22(水) 17:01:35.42ID:BT6ndhEb
「その部分のループ、終了条件が色々なんでとりあえず for (;;) で回して」
みたいな口答でのやりとりで for (;;) を forever と読めば手っ取り早いでしょ。
while (1) で…よりも言いやすいんじゃないかと。

これは空想論だけどね。
0140デフォルトの名無しさん
垢版 |
2018/08/22(水) 17:28:26.65ID:yJL450CM
無限ループで済むことを
forの第2式を空欄で
なんて回りくどい言い方しねえよ
0141デフォルトの名無しさん
垢版 |
2018/08/22(水) 17:52:35.43ID:l5cdWJfA
>>140
別に回りくどくないし
良く見るコードだよ

いろんな人のコードを見たりしないの?
みんないろんなポリシーでいろんなコードを書くから

いろんな書き方を知っていた方が良いよ
0142デフォルトの名無しさん
垢版 |
2018/08/22(水) 17:59:10.07ID:l5cdWJfA
while (条件)
でしかループが組めないのはちょっとさみしい

無理やりこの形にするために
>>107みたいな意味不明なコードになる
0146デフォルトの名無しさん
垢版 |
2018/08/22(水) 20:52:31.01ID:ROURn6Ut
for ( ;∀;)
0147デフォルトの名無しさん
垢版 |
2018/08/22(水) 21:21:35.96ID:yJL450CM
> while (条件)でしかループが組めないのはちょっとさみしい

ここは同意
while(1) であろうが for(;;) であろうが同じこと
どっちかが好みで他方で書かれたからって可読性が落ちたとか騒ぐ
救いようのないドアホには付き合ってらんね
それだけだ
0149デフォルトの名無しさん
垢版 |
2018/08/22(水) 21:26:52.07ID:MwkxeX8r
whileで無限ループする場合、0じゃなければ1以外を
使ってもいいわけだがどうする?
電話番号とか使えばオシャレかもしれないよ
0151デフォルトの名無しさん
垢版 |
2018/08/22(水) 21:28:19.40ID:yJL450CM
別にiocccのコードが読めろとか言ってない
int *aryがint ary[100]じゃなきゃ読めないとかぬかしたり
while(1)がfor(;;)じゃなきゃ読めないとかぬかす
想像を絶するアホには付き合ってらんねつってるだけ
lock/doit/unlockを関数化する必要性がわからないアホも含まれる
0152デフォルトの名無しさん
垢版 |
2018/08/22(水) 21:33:30.14ID:Jjipv9/i
>>151
「じゃなきゃ読めない」ってどこかに書いてたっけ?
そんな気はしてたが、やっぱり日本語不自由な人だったらしい。
0158デフォルトの名無しさん
垢版 |
2018/08/22(水) 21:54:35.09ID:Jjipv9/i
C言語以前に日本語もちゃんと理解できない人と議論が噛み合うわけない。
相手しただけ損したわ、アホらしい。
0159デフォルトの名無しさん
垢版 |
2018/08/22(水) 22:02:56.29ID:yJL450CM
勝手に損してろ
誰にも賠償請求できない
泣き寝入りだな
アホw バカwww
0160デフォルトの名無しさん
垢版 |
2018/08/22(水) 22:05:01.83ID:Jjipv9/i
はいはい、ちゃんとにほんごをべんきょうしてりかいできるようになってから、かきこんでくださいね。
0161デフォルトの名無しさん
垢版 |
2018/08/22(水) 22:13:51.56ID:RPMrdt6N
まあ概ね ID:yJL450CM が言っていることは正しい。

>>107のコードは、かなり特殊で、普通はあり得ない。
キモイかと問われれば、キモイと答えるのが正しい。
(必要ならやればいいが)

>>116
それはdo-whileの標準的使い方とは異なるので、混乱を招く。

>>132
check_func()は、107を書き直した場所がすぐに分かる名前にしただけ。
実際、問題なく伝わってるだろ。
本番コードでこの名前はあり得ない。名前が被るから。


ただ、正直、こんなどうでもいいところで拘るのは止めた方がいい。上達しなくなる。
どれでもいいから自分が好きなのを選び、グダグダ言わずにどんどん書いた方がいい。
なお、Goにはwhileが無い。廃止されて、forだけになっている。

ちなみに、俺は
固定長ループ(単純ループ): for … for (int i=0;i<num;i++) 程度の簡単な場合は常にこれ
可変長ループ(複雑なループ): while
無限ループ: while (1)
do-while: 使わない
にしているが、正直、ここら辺は好みだし、自分がどう決めるかだけ。(上記は標準的だとも思っているが)
それよりは、自分の中で統一するほうが重要だ。
(少なくとも自分が書いたコードを読むときに混乱しなくなる)

業務なら、グダグダ言わずコーディングルールに従えばいい。
場所によってはwhileとforのどちらかが禁止とかもある。(どっちかは忘れた)
理由はバグって無限ループにしてしまったときにコード上から判定しづらいとかだったはず。
0162107
垢版 |
2018/08/22(水) 22:19:27.48ID:Vm7yolE7
非常にくだらない質問にレス付けてくれてサンクス
なんか荒れる原因つくってスマンかった

やっぱりあの書き方きめえよなあ・・・
0163デフォルトの名無しさん
垢版 |
2018/08/22(水) 22:57:41.03ID:RPMrdt6N
>>112
> LOCK, UNLOCKのインデントがズレててキモい
これは諦めろ。
酷い話、インデントがぴったり合ってないと駄目な奴はプログラマに向いてない。
どうやってもずれるからだ。
googleのコーディングルールにも昔は
・インデントを揃える努力は、キリがないしやるだけ無駄だから諦めろ
と書いてあったはず。(今見る限りないが)


ちなみにキモイ理由は、インデントではなくて、完全に入れ子になっていないからだ。
最近はこの「入れ子」の厳密さも増していて、XML(HTML等)では入れ子しか文法的に認めないだろ。
例えば、

<while>
</while>

ならありだが、

<lock>
<while>
</lock>
</while>

は駄目で、

<while>
<lock>
</lock>
</while>

にしなければならない。
0164デフォルトの名無しさん
垢版 |
2018/08/23(木) 00:15:44.74ID:wxGNRrqx
>>161
do while の標準的な使い方?
無限ループも標準的な使い方ですよ

do whileはforやwhileに比べてパフォーマンスが良いことがあるので
使える時には積極的に使う人もいます

do whileを一切使わない人もいますが
0165デフォルトの名無しさん
垢版 |
2018/08/23(木) 00:29:51.18ID:qYtPM3Ou
>>107
対称性保たれてるし、よくあるコードだぞ。
俺はキモイと思わん。
0166デフォルトの名無しさん
垢版 |
2018/08/23(木) 00:38:41.07ID:wxGNRrqx
ロックしたい対象がわかりづらい
同じ用途のロック/アンロックが2箇所ずつある
0169デフォルトの名無しさん
垢版 |
2018/08/23(木) 00:59:32.58ID:HinwMmX/
頭が良い人ならすぐに意図がくみ取れるけど
メンテする人が必ずしも頭が良いとは限らない
コメント書いてもバグではまって始めて読まれたりするからね
ワザと作られた落とし穴なんて受けとられる危険もありそう

バカでも分かるような書き方をする方が安全かなと思う
0170デフォルトの名無しさん
垢版 |
2018/08/23(木) 01:59:34.18ID:y9Wx8uZn
>>164
>>116のコードは、while (1) で開始しても同じだし、(=do-whileを使う意味がない)
そもそも>>113に比べてメリットもないだろ。
そこで do-while 使う奴なんて皆無だと思うぞ。

まあそれでもやりたければやればいい。
個人開発ではメチャやって、その失敗を業務に生かした方がいい。

ただ、上達したければ、ある程度普通のコーディングルールで組んだ方がいい。(世間に合わせる)
自分と相手のルールが一致してたら、相手のコードも読みやすく、
結果、同じ時間、同じ努力でも読める量に違いが出てくるから。

あと、初心者はよく
・色々文法を知ってて、様々な書き方が出来る奴が偉い
と勘違いしがちのようだが、これは明確な間違いだ。(これは他言語では本当に酷い)
こんな糞どうでもいいところを様々な書き方をしているような奴は雑魚だ。
上手い奴は、そいつが決めたやり方に従って、一定の書き方で書く。
だから、後で読み直すときも楽だってこと。
自分の手書き文字なら相当汚くても読めるだろ。それに近い。

基本的には意味のない手動インライン展開は止めた方がいい。
それは無駄に関数を大きくする。
関数呼び出しのコストが気になるなら、C++なら inline が用意されてる。
そもそもロックなんて糞遅いから、そこでCPU命令数個ケチる意味もないはずだが。

可読性を上げる為に最初にやるべきなのは、関数を分割して小さくすることだ。
呼び出しコストは考えず、分割しまくった方がいい。
結果、抽象度が上がり、読みやすくなる。(全体を読まなくても済むようになる)
0171デフォルトの名無しさん
垢版 |
2018/08/23(木) 03:30:32.78ID:w8vcpguW
あくまで、プログラマが初心者の場合の話だけど。

いろいろなソースを見てきたけど。
仕事としてやるなら、初心者は、なるべく関数化してほしくないかな。
練習としてなら、いいけどね。

関数化する等して、抽象化した方が見やすいソースになるかというと、
間違いじゃないけど、正しくもない。

有能なプログラマーが書いたソースは素晴らしいし、可読性も申し分ない、うん。
でも、クソなコードは、関数化しちゃいけないものが、関数化されているなどが原因で、
追跡が難くなるんだな。
オブジェクト指向を謳う言語のソースなんか、C以上にプログラマーの手腕によって、
可読性の差が生じてしまう。関数だけでなく、クラスの設計が腐ってて、どうしもないとかね。
そうゆうソースの追跡は辛いわ。

Cの場合、ぐちょくちょなソースの場合、関数化されていない方が、
コードのメンテ等で、強引に追跡する際は苦労が少ない、そんな感じ。
0172デフォルトの名無しさん
垢版 |
2018/08/23(木) 04:08:27.50ID:rN/Im7Tc
そんなこたねえよ
関数を作った方がいいしファイルを分けた方がいい
ネストは浅い方がいい
0173デフォルトの名無しさん
垢版 |
2018/08/23(木) 05:49:50.39ID:OJr5a4rA
>>116
なぜわざわざbreakなんて使うんだ?
素直にこれでいいでしょ
do {
LOCK
判断結果 = 判断
UNLOCK
} while(判断結果)
0174デフォルトの名無しさん
垢版 |
2018/08/23(木) 06:27:06.53ID:OG65bZxS
>>173
breakしないと条件が偽の時にも処理が動いてしまうからでは
きっとループの中になんらかの処理があるはず
0176デフォルトの名無しさん
垢版 |
2018/08/23(木) 07:24:39.71ID:qYtPM3Ou
>>172
分割しすぎも考えものだけどな。
>>113も視点移動が増える書き方で、可読性やメンテナンス性が悪いという人もいる。
0177デフォルトの名無しさん
垢版 |
2018/08/23(木) 07:52:07.91ID:wxGNRrqx
>>170
do while のが軽い場合がある
って常識だと思ったが

>>175
私も当然他の処理があると思った
無いとするとビジーループか?
これだと気持ち悪いとかいう以前の問題になる
0179デフォルトの名無しさん
垢版 |
2018/08/23(木) 08:16:18.32ID:wxGNRrqx
全てのLOCK/UNLOCKのペアはそれだけで関数にする
2重ループやループ内のswitch caseは使わないで関数に分ける

いろんな人がいるね
自分では本当に例外なく実践してるんだろうか
0180デフォルトの名無しさん
垢版 |
2018/08/23(木) 08:31:20.08ID:wxGNRrqx
宗教の例

gotoは使ってはいけない
2重ループは使ってはいけない
3項演算子は使ってはいけない
インデントは全て揃える
全てのリテラルは別途定義する
変数名に型情報を埋め込む
関数の途中でreturnしてはいけない
関数は小さいほど良い
条件分の中に関数コールや副作用のある文を書いてはいけない
インクルードファイルをネストしてはいけない
コメントは全て /* */ で (// や #if 0 を使ってはいけない)
全ての演算子のネストに対して ( ) をつける
全てのロック、アンロックのペアは関数に分けなければいけない
0183デフォルトの名無しさん
垢版 |
2018/08/23(木) 09:21:50.49ID:itriZIP9
>>176
視点移動になるのは下手な関数化だ
サブルーチン呼び出しを1命令と読めるようにするのが
構造化プログラミングの本質
0184デフォルトの名無しさん
垢版 |
2018/08/23(木) 09:48:06.49ID:O7XDpWhz
>>183
ある程度の規模の関数になると結局その1命令に見えるはずの処理が正確に何してるかを理解するためには関数内を覗くはめになっちゃう。
覗かないですむほど関数仕様を単純化すると今度は関数が増えて管理の手間が増える矛盾。
後者のほうが正解なんだろうけど、なかなか理想通りには行かないよね。
0188デフォルトの名無しさん
垢版 |
2018/08/23(木) 10:11:39.46ID:rN/Im7Tc
>>178
ファイル数とか初めて聞いたよ。
疎結合高凝集は大抵の場面で正義だよ。トータル1000行のソースだったら好きにすればいいが。
あと関数にもファイルにも「意味のある名前をつける」
ある意味大変難しいんだがこれができれば保守性が全然違う。
0189デフォルトの名無しさん
垢版 |
2018/08/23(木) 10:34:14.06ID:3bgfj1QZ
規模は覗かないとわからんよ

1個の関数からしか呼ばれないたった3行の、
ただ単に特定のループの終了条件を示す為の関数
結局両方見ないと意味不明

こんな関数が山ほどあるプロジェクトは悪夢だ
0191デフォルトの名無しさん
垢版 |
2018/08/23(木) 10:40:50.31ID:3bgfj1QZ
たった3行の為に
関数名を考え
関数ヘッダを作成し
プロファイリングや静的解析ツールやMAPの項目も増える

大きく依存した関数なのに
グローバル関数とローカル関数を分けて書くという宗教を理由に
全然別の場所に書く

最悪ですねえ

こういう人は
ifなども含め、複数文からなる全ての条件判断を関数にするんでしょうか
あり得ないですね

もちろん単なる1個のループの終了条件ではなくて
その条件に意味があって
他でも使う可能性があるなら関数に分けるべきですが
0196デフォルトの名無しさん
垢版 |
2018/08/23(木) 12:48:09.07ID:iNuWULI+
>>177
> 私も当然他の処理があると思った
> 無いとするとビジーループか?
> これだと気持ち悪いとかいう以前の問題になる
君のレベルが低いだけ
最近のプロセッサはロック/アンロックをハードウェアレベルで行うようになってるけどビジーループ自体は使われてる
スピンロック でググれ
0199デフォルトの名無しさん
垢版 |
2018/08/23(木) 16:15:45.18ID:rN/Im7Tc
「長いから分割する」という発想で関数作ってる人は割といるんだよ。
そうするとまあコンテクストが広い範囲に分散してつらい。
0200デフォルトの名無しさん
垢版 |
2018/08/23(木) 16:28:54.58ID:EgEtgRif
そういえば昔客とソースレビューしてて、
引数チェックのための早期returnしてたら、

客「途中returnはやめてください」
俺「そうするとネストが深くなりすぎますよ?」
客「それなら関数に分けて下さい」
俺「分けた関数の先でも引数チェックするので同じですよ?」
客「それならその先の関数も別の関数に分けて下さい」
俺「…(反論するのめんどくせえ、言うとおりに作ってしまえ)」

結果、思い出すのも恐ろしい意味不明な関数ばかりのコードが出来上がったわ。
0201デフォルトの名無しさん
垢版 |
2018/08/23(木) 16:54:56.17ID:rN/Im7Tc
途中リターン禁止ってほんとアホだよね。要はreturnの否定だからな。
最近はMISRAからも外れてるらしいが
0202デフォルトの名無しさん
垢版 |
2018/08/23(木) 17:00:42.78ID:itriZIP9
>>191
単なる1個のループの条件に意味がないことなんてあるのか?
たった3行というがlock/unlockという2行で
他のタスクが干渉しないようにガードする必要がある条件だぞ
干渉されるとしたら何でだ? それでも意味がないのか?
0203デフォルトの名無しさん
垢版 |
2018/08/23(木) 18:14:09.43ID:wxGNRrqx
>>196
CASもLL/SCもアトミックなR-M-Wも使うけど
どう考えてもそんなコードじゃないだろ
知らない癖に書くなよ
0205デフォルトの名無しさん
垢版 |
2018/08/23(木) 19:15:54.01ID:iNuWULI+
>>203
> 最近のプロセッサはロック/アンロックをハードウェアレベルで行うようになってるけど
って書いてあるのにCASとか出してくるアホ乙
0207デフォルトの名無しさん
垢版 |
2018/08/23(木) 19:51:18.42ID:iNuWULI+
>>206 が必死にググって見つけて来た関係ありそうな(でも全く頓珍漢な)言葉 → ハードセマフォ
自爆志願者かよ w
0209デフォルトの名無しさん
垢版 |
2018/08/23(木) 19:59:23.06ID:EgEtgRif
な、ここのスレは読解力が乏しいのにお互いにマウント取り合って傍から見たらアホちゃうのって奴が多いだろ?
よくもまあLOCK/UNLOCK如きで生産性のカケラもない議論できるわ。
よほど暇なんかな?
0215デフォルトの名無しさん
垢版 |
2018/08/23(木) 20:28:12.68ID:EgEtgRif
初心者でもベテランでも新しい気付きがあるような内容に早く戻るといいね。
0216デフォルトの名無しさん
垢版 |
2018/08/23(木) 20:49:36.75ID:EgEtgRif
400メートルなら連続で泳げるけど、800メートルはよほどペース落とさないと無理だわ。
0222デフォルトの名無しさん
垢版 |
2018/08/23(木) 22:03:27.73ID:ZsGoqTtC
>>220
多分両方ともそれなりに正しい方法を知ってるのに
会話の祖語からとんでもないところに着地するケースだな
0223デフォルトの名無しさん
垢版 |
2018/08/23(木) 22:13:17.45ID:y9Wx8uZn
>>176
> 視点移動が増える書き方で、可読性やメンテナンス性が悪いという人もいる。
それは正しく分割出来てないから。(同じ抽象度で分割する)
読まなくても分かる名前を付けて、結果的に読まないから、視点移動はしない。例えば、以下。

while (1) {
int idx = get_data_idx();
if (idx<0) break;
int* data = prepare_data(idx);
calculate_data(data);
write_back_data(data, idx);
}

この部分はマルチスレッドでのデータ処理だとしよう。
get_data_idxは未演算のデータのインデックスを返し、ない場合は、-1を返すとしよう。
単純に、「インデックスを受け取り、チェックし、データを用意して演算して書き戻す」と読めるだろ。
そこでget_data_idxの中身を見ると、マルチスレッド用だからロックされてる、というだけ。
(余談だが>>107にはこういう具体性が見えないので、
> LOCK/UNLOCKが必要な具体的な場面を想定しての発言には見えない (>>122)
と言われている。これも当たっている)

「視点移動ガー」は読み方を間違っている。
プログラムが階層構造のツリーとして、
縦に掘るのではなく、横に読んで、必要であればその部分だけ縦に読むんだよ。
まず最初は同階層で全体の流れを把握して、必要であればその実装を読む。
実装を読む場合、名前と実装が一致しているかだけのチェックしかしない。

家を建てるとして、
全ての柱が設計図通りに組み上げられているか(全体のチェック)と、
それぞれの柱が設計図通りの仕上がりになってるか(ほぞ穴が正しく加工されてるか)は別にチェックするだろ。
プログラミングも同じで、上位と下位は別にチェックするんだよ。
同時に読まないからいちいち子関数に視点移動なんてしないし、視点移動しなくて済むように同抽象度で分割するんだよ。
0224デフォルトの名無しさん
垢版 |
2018/08/23(木) 22:16:11.26ID:y9Wx8uZn
>>177
> do while のが軽い場合がある
> って常識だと思ったが
それはお前が何も知らない初心者だから。

do while は初回のチェックが入らない分速い。(逆に言えば、その分だけしか速くない)
君は「なんだか知らないが do-while は速いんだ!」位の理解しかしてないだろ。
そんな馬鹿はC界隈にはいない。

問題は、この「初回チェックしない分速い」のをいちいち取り上げる必要があるか、という点で、
殆どの場合はどうでもいいから do-while は使われない。
ただし、どうしてもケチりたい場合は使われる。
(ルール等で駄目なら手動で初回部分だけインライン展開しても同じだが、それよりは do-while 使った方がいい)

禁止する必要はないけど、使う局面もない、といったところだと思うよ。

初回のチェックが必要ない=その前か上位で初回チェックが必要ないことを保証している、であって、
全くチェックしていないわけではないんだよ。
結果、処理を整理して集約していくと、while文に吸収されることもある。
或いはそうならないとして、ど頭でチェックだけして不要ならショートカットしたい等の場合、
別にチェック+ do-while になるが、それはメトリックスを増やしてしまう。(静的コールグラフ)
どのパスを通るかがデータ依存になり、それがかなり大きな区画になってしまうだろ。
それよりはショートカット出来ないけどどんなデータでも同じパス、
whileで弾かれて空振りするだけ、のほうがメンテナンスが遙かに楽なんだよ。
ここら辺はさんざんメンテナンスしてれば分かるようになるし、してないうちには分からない。
お前は相当それ以前だが。

「僕はdo-whileの方が速いケースもあるのを知ってるんだ!」ってのは痛いだけだから止めとけ。
自分でアホだと言っているようなものだ。
そんなことはみんな知ってて、その上で議論している。
コード分岐を増やすのが、1回のチェックを端折るのと釣り合うか?なんだよ。
0230デフォルトの名無しさん
垢版 |
2018/08/23(木) 22:26:06.91ID:y9Wx8uZn
ただマジで、初心者はこの手の話に首を突っ込まない方がいい。
時間の無駄で、上達を阻害するだけ。

コードの美しさ/抽象レベル/分割/隠蔽/疎結合が必要なのは少なくとも200-1000行程度であって、
50行程度ならグダグダ言わずにベタで密結合で書き下した方が分かりやすい。
10行のプログラムを動かすにも苦労する初心者にも、
理解に少なくとも200行程度書ける腕前が必要な内容を教えるから空回りする。
(とはいえ、初段階の洗脳は必要悪だ、というのがJava教団であるが。
そしてFizzBuzzはイテレートするクラス、判定クラス、表示クラスに分割され、
イテレータがインタフェースとして活用される、というのが件の悪ノリだった)

1000行程度も書けない初心者は、まず1000行書けることを目指せ。(1000行程度なら勢いで書ける)
コードの美しさその他はその辺になればだんだん分かってくる。
その後に、自分で「コードを減らす」練習をした方がいい。
(コードを「書く」よりも「減らす」方が上達する、と言う奴は居て、俺もそう思う)

それまでは自分でコーディングルールの優劣を判定する頭もないのだから、(これはちゃんと認めた方がいい)
オレオレルールではなくて、コードを書いている連中のルールをそのまま使った方がいい。
俺はgoogleがいいと思うが。
(なお意識高い系C++erはgoogleのルールはもう古い!と言いだした模様。
俺は布教用のルールなんてゴミだと思っているが、まだチェックはしてない)


>>180-181
MISRAは「自分でどのルールが無駄か判断出来る人向け」であって、
お前らみたいな「自分では判断出来ない初心者向け」ではないんだよ。
素直にとりあえずgoogle使っとけ。
0232デフォルトの名無しさん
垢版 |
2018/08/23(木) 22:28:37.43ID:y9Wx8uZn
>>184
> 覗かないですむほど関数仕様を単純化すると今度は関数が増えて管理の手間が増える矛盾。
管理の手間は増えないと思うが。

もし増えていると感じるのなら、それはCには階層がないことの弊害だ。
関数内関数が普通に使える状況であれば、
関数切り出しは「処理を纏めて名前を付けただけ」でしかなく、
外部からその関数が呼ばれることが文法的にないことを保証出来るから、手間は増えない。

そしてこの点に、妥協的だが現実的なのは「名前に階層も付けてしまう」だ。
つまり、AAA階層内の関数はAAA_get_data_idx()等にし、
もし仮にAAA_get_data_idx内でさらにローカル関数が必要な場合は、AAA_get_data_idx_BBBにしてしまう、というものだ。
関数名が長くなる点を除いて問題はないし、「grep出来るから便利」 by Linus。
OOPも実質同じで、フルパスで呼ぶなら AAA->get_data_idx->BBB()等、_ が -> に代わるだけだが、
実際はオブジェクトポインタ=途中のポインタだから、obj->BBB()となり、長くならずに済む。
(ただし、grep出来なくなる)

俺もCに階層記述能力がないのは問題だと思っているが、
現実的に分割/疎結合化が必要なのは200-1000行単位であり、
ここは「ファイル」(=モジュール)で分割しろ、というのがCだ。
だから不満ではあるが結果的に何とかなってしまうのも事実で、だからこそCがまだ生きながらえている、というのはある。

それにしても「関数内関数」は欲しいんだけどね。あと、ラムダも。
(gccでは前者は標準、後者はマクロで対応出来るが)
0236デフォルトの名無しさん
垢版 |
2018/08/23(木) 22:49:21.25ID:OJr5a4rA
>>224
> do while は初回のチェックが入らない分速い。(逆に言えば、その分だけしか速くない)
違う、>>177はコンパイラがあまり賢くない時代の知識で止まってるロートルってだけ
0240デフォルトの名無しさん
垢版 |
2018/08/23(木) 22:52:49.79ID:wxGNRrqx
デメリットは数文字ソースコードが増えるだけ
生成されるバイナリが悪くなることは無い
良くなる可能性はある
0241デフォルトの名無しさん
垢版 |
2018/08/23(木) 22:54:11.95ID:qYtPM3Ou
>>223
> それは正しく分割出来てないから。
そう。だから、>>113は正しく分割できていない、という人がいると書いたんだが。
0243デフォルトの名無しさん
垢版 |
2018/08/23(木) 22:57:34.92ID:wxGNRrqx
常に正しく分割されてるコードしかいじらないわけでも無いだろうし
常に正しく分割出来るとも限らないし
正しいか正しくないかは視点によっても違う

理想だけ語るだけで実際にコードを組んだ事が無さそうな人がいるようだけど
0244デフォルトの名無しさん
垢版 |
2018/08/23(木) 23:01:12.83ID:FIun2PeI
>>237
気圧申告しないと!
0246デフォルトの名無しさん
垢版 |
2018/08/23(木) 23:03:30.31ID:NMfUyUL+
>>230
>FizzBuzzはイテレートするクラス、判定クラス、表示クラスに分割され、イテレータがインタフェースとして活用される、というのが件の悪ノリだった
どんなコードになるのでしょうか?一度みてみたいものです…

fizzbuzz はこんなコードを書いたことがあります
https://mevius.5ch.net/test/read.cgi/tech/1434079972/25
https://ideone.com/i8wMea
0247デフォルトの名無しさん
垢版 |
2018/08/23(木) 23:18:47.64ID:y9Wx8uZn
>>226
具体例あるか?
それ以前に「成功するまでリトライ」自体がよろしくないが。


>>236
do-whileに対して何か特殊な最適化がかかるという話なら、
俺は知らんから突っ込めない。
が、そうだとしても、それでコードを汚すこと自体が間違いだが。


>>241
そう思うんならそれでいい。
平行線だし、議論しても結果は出ない。
君のコードを見て他の人がどう思うかはそれぞれの自由だ。

俺はこの場合関数に括り出す方を選択する。
同様の連中もここにいるだろ。それだけの話さ。

ただそれ以前に、アトミックなんて最初から関数に括り出されていると思うが。
インラインアセンブラを使う気でなければそもそも無理だし。例えば、以下。
https://msdn.microsoft.com/ja-jp/library/dd78zt0c(v=vs.110).aspx


>>245
あー、8は俺だ。
ワッチョイありで立て直してくれればそっち行くわ。
(俺が立て直してもいいが)
0248デフォルトの名無しさん
垢版 |
2018/08/23(木) 23:43:58.22ID:y9Wx8uZn
>>246
俺の記憶では、「FizzBuzz Implementation in Java」みたいなタイトルでGitHubに在ったはず。(だが出てこない)
★も2000位ついていたと思った。
クレームついて取り下げるとも思えないから、検索順位下げられたんじゃね?

そんなに見たければ自分で探せよ。多分まだそのまま公開してると思うぜ。
0253デフォルトの名無しさん
垢版 |
2018/08/23(木) 23:59:12.07ID:y9Wx8uZn
>>251
それだ。
(俺のキーワードが役に立ったようには見えないが…まあ辿り着けたようだしよしとしよう)
0254デフォルトの名無しさん
垢版 |
2018/08/24(金) 00:05:09.13ID:iMeaBiRp
>>247
> ただそれ以前に、アトミックなんて最初から関数に括り出されていると思うが。
そうだな。すでに atomic 実装されていたら俺も使うわ。

関わっているプロジェクトや文化にも依存するから、絶対はない。
例えば Kernel とかだと大半は関数化していない。俺は見た記憶がない。
まあそれだけの話。
0255デフォルトの名無しさん
垢版 |
2018/08/24(金) 00:16:45.53ID:O3WQJa8X
>>254
> 例えば Kernel とかだと大半は関数化していない。俺は見た記憶がない。
それソース出せるか?さすがに嘘だと思うぜ。

> C 言語ではアトミック操作を保証できないことから、Linux は基礎となるアーキテクチャーに依存してアトミック操作を提供します。
> https://www.ibm.com/developerworks/jp/linux/library/l-linux-synchronization.html
いちいちインラインアセンブラでは設計効率が悪すぎる。
APIにも当然用意されてるし、普通の人ならそれを使うし、Linusも当然そうだと思うけど。

根本的に「ロック」自体を勘違いしている気がするが。
0257デフォルトの名無しさん
垢版 |
2018/08/24(金) 00:34:08.73ID:O3WQJa8X
>>256
grepすれば出てきそうだが探す気はない。

linux kernel内でひたすらインラインされているとしたら、
おそらくスタック容量(1スレ当たり256バイトだったか?)の為だろう。
「関数化」はされていなくても「マクロ化」されていて、
ソースコード的には意味が同じという落ちじゃないか?
それなら君の噛みつき方は悪質だと思うがね。(意図的に議論を空回りさせててる)
0259デフォルトの名無しさん
垢版 |
2018/08/24(金) 00:43:06.32ID:O3WQJa8X
>>258
それが論点のすり替えなんだよ。
分かってないようだからそれでいいが。

というわけでこの件は終わりだ。
0260デフォルトの名無しさん
垢版 |
2018/08/24(金) 00:44:16.19ID:iMeaBiRp
>>259
>>113 が自前で関数化する意図でしか読み取れないからな。
あれが自前実装でないというのであれば、それまでだ。
0266デフォルトの名無しさん
垢版 |
2018/08/24(金) 05:28:07.79ID:Nyovr5Qp
>>242
> do while を使わない(使えない)人っているよね
このスレでも>>161とかな
while(){}に比べたら使用頻度は低いけど使用する機会があるから多くの言語で使えるようになってるのになぜかdo〜while使わない俺かっけーとか思ってそうw
ただ今どきパフォーマンスがいいからdo〜whileにすると言うのはナンセンス
0267デフォルトの名無しさん
垢版 |
2018/08/24(金) 05:50:10.13ID:Nyovr5Qp
>>247
> 俺は知らんから突っ込めない。
知らないなら突っ込むなよ…
> do while は初回のチェックが入らない分速い。(逆に言えば、その分だけしか速くない)
とか馬鹿丸出しだぞ
0268デフォルトの名無しさん
垢版 |
2018/08/24(金) 05:54:34.00ID:Nyovr5Qp
>>255
あんたの言ってるアトミック操作が>>107のLOCK/UNLOCKに相当する
わざとなのか理解してないのかは知らんけどレイヤーの違うものを混ぜて語られてもそりゃ噛み合わんよw
0269デフォルトの名無しさん
垢版 |
2018/08/24(金) 07:43:07.97ID:ZkSPfVdV
>>247
コードを汚す?
do whileに慣れてないと
無限ループでdo whileを使うのがコードを汚す
になるのか?
0270デフォルトの名無しさん
垢版 |
2018/08/24(金) 07:52:13.74ID:ZkSPfVdV
>>266
> ただ今どきパフォーマンスがいいからdo〜whileにすると言うのはナンセンス

forやwhileを選ぶ理由がある所でも
パフォーマンスを気にしてdo whileを選ぶべき
なんて話はしていない

どれを選んでも良いときに
forを選ぶ人、whileを選ぶ人、do whileを選ぶ人がいると言うだけ
0271デフォルトの名無しさん
垢版 |
2018/08/24(金) 07:57:40.75ID:ZkSPfVdV
わざわざCを使うってことは
8bitのチープなマイコン、チープなコンパイラだったり
OSやドライバの開発だったり

アセンブラも混ぜて使うこともありそうな
一番低級な高級言語

他の言語よりも記述方法によるパフォーマンスの差
が語られても良いと思う
0273デフォルトの名無しさん
垢版 |
2018/08/24(金) 08:00:01.51ID:Hnd+Ihtp
ソース見て do {...} while (1); で無限ループになってたら
さすがに「なんで for (;;) や while (1) にせんの?」と尋ねるわ。

…でも「ループ先頭の(決して成立しない)終了判定が入らないから速いんだ」
と言われたら受け入れるかも。分かってやってるんだな、という意味で。
実際のところ for (;;) は無論のこと while (1) でも判定しないと思うけど。
0274デフォルトの名無しさん
垢版 |
2018/08/24(金) 08:06:02.46ID:ZkSPfVdV
>>273
3個とも超基本構文だと思うけど

そのレベルだと
「なんでfor(;;)なの?」って聞く人もいそうだな
0275デフォルトの名無しさん
垢版 |
2018/08/24(金) 08:10:04.46ID:29l6jjMs
そういやループの話でgoto使うってレスないな
ネストが浅くなるし好んで使う人は・・・さすがに居ないか
0278デフォルトの名無しさん
垢版 |
2018/08/24(金) 08:16:04.10ID:ZkSPfVdV
goto label2

label1:
処理

label2:
条件判断
if (偽) goto label 1;

----
コンパイル結果的にはforやwhileはこんな感じ
条件が無かったとしても goto label2が入る
最適化しない場合やチープなコンパイラだと
このまま最適化されないかもしれない

goto label2
が不要な時にこれを除いたのがdo while
これのほうがバイナリはシンプル
0279デフォルトの名無しさん
垢版 |
2018/08/24(金) 08:18:32.35ID:ZkSPfVdV
>>175
多重ループから抜ける時
関数の終了処理
ガシガシに最適化をする時

使いどころはこんな感じ
0281デフォルトの名無しさん
垢版 |
2018/08/24(金) 08:30:42.38ID:ZkSPfVdV
gotoを使わない(使えない)人だと
多重ループから抜ける為だけにフラグを使ったり
多重ループから抜ける目的の為だけの理由で
関連する複数のループを分けたりする

double data[4][4];

例えばこんな構造のデータのある統計情報を返す関数
ただし、データに非有限値が入っていたらNaNを返す
デバッグ用に計算結果を出力するコードが入っている
どういうコードにする?
0282デフォルトの名無しさん
垢版 |
2018/08/24(金) 08:42:44.31ID:srP6ovAZ
>>270
> どれを選んでも良いときに
無限ループ以外にそんなケースあるか?
かつそれでdo〜whileの方が効率的になるケース示してみ
0284デフォルトの名無しさん
垢版 |
2018/08/24(金) 10:27:50.33ID:tx++RsbT
do…whileの方が初回の判定がないから速いとしてもループ回数が多いと誤差レベルだし無限ループならコンパイラで最適化されて差がなくなると思う
0286デフォルトの名無しさん
垢版 |
2018/08/24(金) 11:04:28.35ID:Cl8BSI3h
いろいろ誤解が多いので口出ししておく。

アセンブリ言語に手で変換してみるとすぐわかるんだが、
whileは先頭付近に条件分岐が必要な他に、末尾に必ず無条件のジャンプが必要。
対してdo-whileは末尾の条件分岐だけでいい。
このおかげでループ1回あたり命令実行が一つ減る。

しかしコンパイラはwhile文をif文とdo-while文相当に置き換えて最適化するから、差は出ない。
ヘボコンパイラなら最適化しないかもしれないが、
その場合は他の部分も最適化されるはずもないので、速度云々いうだけ無駄。
0290デフォルトの名無しさん
垢版 |
2018/08/24(金) 11:40:55.91ID:7MrYBE0R
使いどころを知らない自慢

forはwhileの上位互換だからwhileを使わない
ていうならまだわかる
0292デフォルトの名無しさん
垢版 |
2018/08/24(金) 12:22:55.87ID:srP6ovAZ
>>286
> しかしコンパイラはwhile文をif文とdo-while文相当に置き換えて最適化するから、差は出ない。
if文?
do 〜whileに置き換えて単に最後の条件文に飛ぶジャンプ命令入れるだけだぞ
0293デフォルトの名無しさん
垢版 |
2018/08/24(金) 12:29:41.83ID:9+ua1c/R
アセンブラのジャンプ命令や条件分岐の使い方が分かってない様子だね
ループ全体で命令が1回増えるだけなのにループ1回当たりの命令実行回数が増えるとか言ってるし
0294デフォルトの名無しさん
垢版 |
2018/08/24(金) 12:30:27.52ID:7MrYBE0R
----gotoの使用例----

for (y = 0; y < 9; y++){
. . for (x = 0; x < 9; x++){
. . . . if (判定) goto break_loop;
. . . . 処理
. . }
}
break_loop:


----do whileの使用例----

if (FindFirst()){
. . do {
. . . . 処理
. . } while (FindNext());
}
0295デフォルトの名無しさん
垢版 |
2018/08/24(金) 12:31:56.80ID:srP6ovAZ
>>291
> 1回目が必ず条件TRUEになることがわかっているwhileループ全て
それ1回目は必ず実行してその結果で2回目以降を実行するかどうかを決めるってことだよね?
典型的なdo〜whileパターン w
むしろそのパターンでwhile(){}使ってるなら単なるアホとしか思えない
0298デフォルトの名無しさん
垢版 |
2018/08/24(金) 12:38:53.07ID:srP6ovAZ
>>296
それは実行結果でループ制御してるわけじゃないだろ
x, y の値はループに入る時には条件満たしているべきだからdo〜whileなんて使っちゃダメ
0299デフォルトの名無しさん
垢版 |
2018/08/24(金) 12:39:50.18ID:TJU8554I
do whileってそんな語ることあるの?良くも悪くも単なる構文だと思うけど

ダラダラと長いループだと継続条件が下方に隠れるので嫌ってのはある
それ以外は正直どうでも良い
0300デフォルトの名無しさん
垢版 |
2018/08/24(金) 12:40:30.21ID:7MrYBE0R
>>297
今とか昔とかじゃなくて...

PCのプログラムしかしたことが無い人は分からないだろうけど
組み込みのチープなマイコンのコンパイラは
いまだに糞なのはたくさんあるよ

あと、
様々な事情により最適化をOFFにして出荷する事もある
0305デフォルトの名無しさん
垢版 |
2018/08/24(金) 13:32:55.56ID:Dz3bxc41
https://twitter.com/kondo_orange/status/1032690721822633985


俺は毒舌だから〜、ズバッと切れ味鋭いことも言っちゃうよ〜w、みたいな人、その意見が的を射ていない場合マジでイタイ奴だから気をつけろよ。

勘違いしてる奴けっこういるぞ。

斜に構えて逆張りするならそれなりに思考深めて来ないと。

田端さんとか意見が的外れだったらただのイヤな人だ(笑)
https://twitter.com/5chan_nel (5ch newer account)
0307デフォルトの名無しさん
垢版 |
2018/08/24(金) 13:53:06.07ID:MEArwTdw
>>306
書き方次第でどちらにもなりうる。
ポインタ変数作って自分で malloc() 等で初期化すればヒープになる。
関数の中で stastc 付けたり関数外で宣言すると data や bss 領域になると思う。
関数内で static 付けずに自動変数として宣言すれば多分スタックになる。

しかし、必ずそのようなコードを作るコンパイラにしなければならないという決まりはない。
0308デフォルトの名無しさん
垢版 |
2018/08/24(金) 16:55:09.53ID:MmiOMKcQ
「C言語」の名前の由来はB言語の後継だからというのは有名だけど、B言語って何でB言語?A言語はないのに。
0314デフォルトの名無しさん
垢版 |
2018/08/24(金) 17:31:50.43ID:MmiOMKcQ
へー、BLCLってぱっと見Fortranぽいね。
時代を感じるわ。
C言語みたいにnotationが基本lowercaseになったのって画期的だったのかもね
0317デフォルトの名無しさん
垢版 |
2018/08/24(金) 17:51:17.53ID:MmiOMKcQ
うちの会社って、まだHungarian notationを強制しようとする人がいるんだけど、make excessiveせずに説得するにはどうしたら良いでしょうか?
0318デフォルトの名無しさん
垢版 |
2018/08/24(金) 17:53:50.92ID:srP6ovAZ
>>301
あんたにはないのかもね
別に全てに人に同意してもらおうとは思ってない
色々おかしい人はいくらでもいるし
0322デフォルトの名無しさん
垢版 |
2018/08/24(金) 19:16:16.69ID:C/3CctmU
>>320
これだろ
>whileは先頭付近に条件分岐が必要な他に、末尾に必ず無条件のジャンプが必要。

whileの処理構造ならループ開始直後に条件判定の個所に(1度だけ)無条件ジャンプしてしまえば、あとは条件分岐を繰り返すだけで無条件ジャンプを再び使うことはない
ぶっちゃけ条件判定が先頭付近にあろうが末尾にあろうが何処でもいい
(do-whileの構造だと必ず一度は処理を実行する必要があるのでそんなことは出来ないけど)
0324デフォルトの名無しさん
垢版 |
2018/08/24(金) 19:28:22.47ID:MmiOMKcQ
>>321
日本人なんだけど日本育ちじゃないのでニュアンスをどう伝えたら良いのか分からないのですみません
0326デフォルトの名無しさん
垢版 |
2018/08/24(金) 19:37:04.31ID:C/3CctmU
>>323
C言語のソースと直接対応させるならそのほうがその方が素直といえば素直だけどね
条件分岐命令はジャンプ範囲に制限があることがある(-128〜+127byte程度)ので下手すれば多段ジャンプを強いられることがある
アセンブラレベルでギリギリの調整をするときはループ構造が制約されることもあるよ
0327デフォルトの名無しさん
垢版 |
2018/08/24(金) 19:50:21.18ID:rXR3rzpw
条件分岐で飛び先を相対で1バイトで指定しなければならないがそれ以上飛ばしたいなら逆の条件で無条件ジャンプによるループを抜けるようにすれば良いだけでは?
0330デフォルトの名無しさん
垢版 |
2018/08/24(金) 19:59:55.12ID:C/3CctmU
>>327
その方が適切な場合であればそうする
結局のところコンパイラの吐き出したバイナリをアセンブラでチューニングするような状況だと少しでも所要クロックが少なく命令バイト長が短くなるようにロジックを弄るんだよ
0340デフォルトの名無しさん
垢版 |
2018/08/24(金) 20:27:27.38ID:rXR3rzpw
これはダメだ。もう何を言っても無駄だろう。
と思わせれば100点である、と。
0343デフォルトの名無しさん
垢版 |
2018/08/24(金) 21:19:21.07ID:ZkSPfVdV
関数分け
いまいち

STATE *state
const でいいところもconstが無い

COL/ROW
名前がサイズじゃなくて位置っぽい

board[x][y]
board[y][x]の方が良いことあるかも

key
ifの羅列よりもswitch case

ways
static constをつけよう

directions
return で8個orしてるのがいやだ

名前
規模のわりに名前が長い

srand
なんで何回もよぶ?
0345デフォルトの名無しさん
垢版 |
2018/08/24(金) 21:27:17.08ID:ZkSPfVdV
ROW *2 + 7
同じ式を何度も書かない

state
色の持ち方が変
黒 : user or com
白 : user or com
じゃないの?

directions
意味的にBOOLだよね?
0347デフォルトの名無しさん
垢版 |
2018/08/24(金) 21:31:42.96ID:ZkSPfVdV
UIとデータ処理を切り離せるといいね

内容的に、
C++のクラス設計のいい練習になりそう
0352デフォルトの名無しさん
垢版 |
2018/08/24(金) 21:39:53.18ID:ZkSPfVdV
com/user が1人ずつ限定なら片方の情報は冗長
データ的にはどっちも黒とかどっちも白とか設定できちゃうので無駄な判別が発生したり

com vs com とか user vs user とか
comアルゴリズム1 とか
将来を考えても
白と黒に対してプレーヤーデータを持つのが良い
0354デフォルトの名無しさん
垢版 |
2018/08/24(金) 21:57:27.71ID:O3WQJa8X
結局俺があらかじめ言ったとおりだろ。再掲するが

> あと、初心者はよく
> ・色々文法を知ってて、様々な書き方が出来る奴が偉い
> と勘違いしがちのようだが、これは明確な間違いだ。(これは他言語では本当に酷い)
> こんな糞どうでもいいところを様々な書き方をしているような奴は雑魚だ。
> 上手い奴は、そいつが決めたやり方に従って、一定の書き方で書く。 (>>170)

do-while 知ってる俺ツエーなんてやってるうちは初心者だし上達しない。
そういう勘違いしている奴も(特に他言語では)多いのも事実だし、Cですらそういう馬鹿が押し寄せてきた、というだけだが。
これも既に言ったが、

> なお、Goにはwhileが無い。廃止されて、forだけになっている。 (>>161)

お前らの定義ではGo言語を使う限り上級者ではないことになるだろ。
それはお前らの頭でもおかしいと気づけるだろ。


昨今の問題は、お前らみたいな馬鹿が嘘デタラメを書いて、全くの初心者がそれに惑わされてしまうことだ。
コードの美しさについて語るのなら、10,000行書けるようになってからにしろ。

というか、お前らは「オレオレ流美しいコード」のようだが、それも間違いで、結局の所、
美しいコード=保守が楽なコード、でしかない。ある意味、これが定義だ。
だから大規模(>10,000行)のコードを数年保守すればいやでも分かるし、それをやらないと『自分の頭では』分からない。
だから1000行すら書けない初心者がコードについて語るのがそもそも間違ってる。

既に言ったが、1000行書けるようになれば、「コードの美しさ」について何を議論しているのか分かるようになる。
逆に言えば、それまでは一体何を議論しているのかすら分からないはずなんだよ。
「疎結合化しろと言われたから分割してみたけど、これって必要なの?」ってのが本音のはず。
そこを意識高い系馬鹿が「疎結合は正義」みたいなことを言うから、必要以上に細切れにして余計に分かりにくくなる。
それを揶揄したのが"FizzBuzzEnterpriseEdition"というわけだ。
実際、お前らも少なからずこれに近い状態だと思うよ。
0355デフォルトの名無しさん
垢版 |
2018/08/24(金) 21:58:37.52ID:O3WQJa8X
あと、ゆとり馬鹿は goto 文に何故か惹かれるようだが、それも止めとけ。
それは goto 文ではなくラベルブレークが必要なだけであり、
Cではそれが goto 文でも書ける、という話でしかない。
なお、ラベルブレークはJavaScriptでは標準だ。(ただしあまり使われていない)
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/break

ポイントは「break文自身がそのラベルブロック中になければならない」(α)という点だ。
今のリンターが「ある/ないでしか判定しないから一律禁止」の可能性はあって、
リンターの精度が上がって上記(α)の判定が出来るようになれば、その用法では許可されてもおかしくはない。

ただそれ以前に、何度も言っているが、こういうのに拘るのは止めとけ。上達を阻害する。
こんな小手先の「数行の見た目」を改善するテクニックより、既に言ったが
> それはメトリックスを増やしてしまう。(静的コールグラフ) (>>224)
とかの方が遙かに重要なんだよ。
こっちは大規模コードをメンテナンスでこねくり回さないと分からない。
さっさとどんどん規模を上げていくべきだ。
(俳句に拘っていてもラノベが書けるようにはならない)

10行しか書けない初心者だからこそ、10行内で改善が見える部分に拘る。
これ自体は自然なのだけど、
低レベルの実装コードを減らす努力はプログラミングに於いてあまり意味がないんだ。

俺の例で言うと、例えば check_func() 内が、goto文無しで15行、ありで10行で書けたとしよう。
だから何?でしかない。
既に言ったとおり、下位の実装コードなんてどうせ読まないし、読むときは名前と一致してるかだけ。
それが10行であっても15行であっても一瞬で読めるのだから、誤差の範囲。
flagが使ってあっても、「ああ、はいはい」だから問題なし。お約束的展開ならいいんだよ。
そんなことより、見慣れない意図不明のコードで???となって詰まる方が問題。

というか、初心者は『見た目でしか判断出来ないから』行数や文字数に拘ったりするけど、それが間違いで、
まずは「読むのにかかる時間」を最小にするように組むんだよ。
0358デフォルトの名無しさん
垢版 |
2018/08/24(金) 22:36:21.12ID:ZkSPfVdV
実はいま初めてプレイした

置ける場所「*」が非常に見にくい
これいらない

現在の個数もいらない
最後に表示すればいい

強くするには、
マスに点数をつける
駒の点数と石の数と置ける場所の数をスコアとする
スコアの重みは序盤と終盤とで変える
数手先まで読む
終盤は最後まで読む

これだけで結構強くなる
0359デフォルトの名無しさん
垢版 |
2018/08/24(金) 22:40:17.59ID:O/FKuFVp
ラベルブレークしたらラベルがFor文の頭にくるもんで読みづらい
ブレークしなかったときだけ値を変えるとかもやりづらい
おれはケツにGotoする
0360デフォルトの名無しさん
垢版 |
2018/08/24(金) 22:51:34.52ID:s18ZTF9u
>>358
おける場所マークがにくくくて点数も要らないと感じるのですね
自分の感覚ではわからなくてその感覚を理解できなくて残念です
どうすれば人のてを借りずにそういうことがわかるようにできるのでしょうか
0362デフォルトの名無しさん
垢版 |
2018/08/24(金) 22:55:34.09ID:O3WQJa8X
>>359
それはラベルブレーク自体ではなく文法の問題だろ。
後置ラベルであれば問題なし。
TypeScriptもGoも型は後置だし、じきにそういう言語が出てくるかもしれんよ。

label: {} // 前置
{} : label // 後置

goto は自由度が高すぎるんだよ。だからリンターには嫌われる。
ただ、お前らが goto に拘るのはさっぱり分からん。
「禁止されたらからこそ使いたくなる」という若気の至りだとしても、ちょっと行きすぎてる。
0369デフォルトの名無しさん
垢版 |
2018/08/24(金) 23:21:50.02ID:QHdFlAyZ
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:
0370デフォルトの名無しさん
垢版 |
2018/08/24(金) 23:21:54.95ID:ZkSPfVdV
8進数使わないよね
0も厳密には8進数だけど

2進数の方が欲しい
コンパイラによっては使えたりする

あと16進数の小数
0374デフォルトの名無しさん
垢版 |
2018/08/24(金) 23:34:21.43ID:srP6ovAZ
>>322
だから「前半」って書いてあるだろ
今でもしょぼい環境あるぞとか言われてもそんな特殊な環境出されても困るし
0376デフォルトの名無しさん
垢版 |
2018/08/25(土) 01:05:51.76ID:Jgm8sU0X
>>286
>しかしコンパイラはwhile文をif文とdo-while文相当に置き換えて最適化するから、差は出ない。

while文をgoto文とdo-while文相当に置き換えて最適化する

の方が正しいような気がする
0377デフォルトの名無しさん
垢版 |
2018/08/25(土) 03:21:08.67ID:5+GN6Il1
なぜコンパイル後のアセンブリコードで話をしないのか
この辺LLVMとかだとどうなってるんだろうね
0378デフォルトの名無しさん
垢版 |
2018/08/25(土) 05:48:12.02ID:r5O9PJUC
>>375
> whileは先頭付近に条件分岐が必要な他に、末尾に必ず無条件のジャンプが必要。
> 対してdo-whileは末尾の条件分岐だけでいい。
> このおかげでループ1回あたり命令実行が一つ減る。

>>376
もうそれ何度も指摘されてる
0380デフォルトの名無しさん
垢版 |
2018/08/25(土) 06:25:56.22ID:mKHlp3ya
. . for (y = 0; y < 9; y++){
. . . . for (x = 0; x < 9; x++){
. . . . . . if (判定){
. . . . . . . . [breakする場合だけ行う処理]
. . . . . . . . goto break_loop;
. . . . . . }
. . . . . . 処理
. . . . }
. . }
. . [ループ完了した時だけ行う処理]
break_loop:
. . [共通の処理]
0381デフォルトの名無しさん
垢版 |
2018/08/25(土) 06:28:41.80ID:/11s7nnG
例外処理にgotoが必要なんて話は
大昔から語り尽くされているのに
今さらドヤられても・・・・
0383デフォルトの名無しさん
垢版 |
2018/08/25(土) 08:56:32.19ID:khOLQHnm
>>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.
まさにこの通り。
その中でお前がどれを選択するかは自由だし、それは俺含めた他人の選択とは無関係だ。
○○を選択した俺ツエーとイキれる話でもない。

俺はお前がこの『既に結論が決まっている』話をどう持って行きたいのか分からない。
レス乞食なら死ね。
0385デフォルトの名無しさん
垢版 |
2018/08/25(土) 09:04:29.83ID:qgzET8Il
CにはJavaのArrayList、HashMap、TreeMapみたいなライブラリはないみたいですが、普通はどうやってデータを管理するのでしょうか?
0386デフォルトの名無しさん
垢版 |
2018/08/25(土) 09:12:41.48ID:iDBA6fbU
そう言ったデータ構造を標準機能で使いたいならC++を部分的に利用するのが手っ取り早いのでは?
gccもclangもC言語処理系ではあるけどC++の処理系でもある
0388デフォルトの名無しさん
垢版 |
2018/08/25(土) 09:23:12.83ID:iDBA6fbU
>>387
標準ライブラリにそんな機能はないよ
純粋なC言語でやるなら、すべて自前で作るか適当な外部ライブラリを探すしかない
0389デフォルトの名無しさん
垢版 |
2018/08/25(土) 09:46:55.20ID:Gb+uOyj2
世の中には便利で高性能なライブラリがあるからね。言語自体が機能を内包してた方が迷いはないかも知れんが。
標準ライブラリのhsearchとか誰も使わんな。俺も使わない。
0390デフォルトの名無しさん
垢版 |
2018/08/25(土) 09:50:09.09ID:mKHlp3ya
>>383
C言語の話題はもうされ尽くしてるから
お前はこのスレに来なくていいよ

人間の結論も既に決まってる
死ぬ事だ
0391デフォルトの名無しさん
垢版 |
2018/08/25(土) 09:57:03.08ID:/11s7nnG
>>389
標準ライブラリってISO/IEC9899:2011か?
hsearchなんてないぞ
bsearchか、もしかして
あれは確かにイケてない関数の1つだな
0392デフォルトの名無しさん
垢版 |
2018/08/25(土) 10:17:18.44ID:khOLQHnm
>>390
C言語は50年近い歴史が既にあって、無知な新参がイキる余地はない。
イキりたいだけならJavaScriptかGoに行け。
あっちは馬鹿同士で楽しくやってる。
0393デフォルトの名無しさん
垢版 |
2018/08/25(土) 10:30:26.94ID:OV9APJVg
Cのコードを自動生成するようなフレームワークもあると思うけど
そういうのが出てきたらCプログラマって必要なくないか?
最近Cのプログラマが需要がないから減ってる気がする
0396デフォルトの名無しさん
垢版 |
2018/08/25(土) 10:37:34.03ID:mM6Mjb64
>>388>>389
hsearchはHashMapみたいですが、確かに使いづらそう・・・
自作するってやっぱりCは初心者には厳しいですね

ちなみにこのスレの方々は自作しますか?それとも外部ライブラリ使う派ですか?
外部ライブラリ使うのであればオススメありますか?
0397デフォルトの名無しさん
垢版 |
2018/08/25(土) 11:02:02.19ID:khOLQHnm
>>393
https://www.tiobe.com/tiobe-index/
PC等、富豪プログラミングが許される状況では書く必要はなくなっていくだろう。
Cは必要なところのみDLLに切り出してピンポイント高速化でいい。
ただ、IoTの場合、速度=バッテリの持ち=小型化に直結するので、
今後ともCで書くのが主流ではないかな。

C++は結局の所、C程の速度は出ないし、DLLもイマイチなので主流になりきれなかった。
Rustが完全に立ち上がれば、Cが駆逐される可能性はある。
Javaがなんだかんだで主流なのは、いろんな意味でバランスが取れているからだ。
0399デフォルトの名無しさん
垢版 |
2018/08/25(土) 11:17:43.56ID:mKHlp3ya
ピンポイント高速化とDLLも関係ないし

Cが使われるのはほとんどが小規模組み込み
逆に小規模組み込みはCしか選択肢が無い場合が多い
他の言語と競ってもあまり意味が無い
0400デフォルトの名無しさん
垢版 |
2018/08/25(土) 11:23:43.36ID:M70RZcxI
>>396
俺はstringとかarrayとか自作しちゃうかな
Cやるなら他言語の標準ライブラリぐらいは自前で実装できないと話にならないよ
何にもないからね
0402デフォルトの名無しさん
垢版 |
2018/08/25(土) 11:28:31.78ID:OV9APJVg
>>397
そういうことじゃなくて
C言語のコードを別の言語で書いて変換すれば
Cでかく必要ないじゃんってこと
0403デフォルトの名無しさん
垢版 |
2018/08/25(土) 11:30:03.25ID:LrSeHAMC
>>396
あえて言えばGlibとかですかね。機能は揃ってると思う。
オブジェクト指向っぽいCになれてないとつらいけど…
0405デフォルトの名無しさん
垢版 |
2018/08/25(土) 11:35:24.37ID:0r5h6/lL
言語なんか関係ない
知恵遅れなクソがコード書けば
クソなコードになる

それ以外ない

すべて知恵遅れが原因
0406デフォルトの名無しさん
垢版 |
2018/08/25(土) 11:38:10.89ID:OV9APJVg
Cで例えばメモリを操作するコードが100行あるとするよな?
そのコードを作成するフレームワークがあるなら
それ使えばいいし、Cいらなくねwwってことな
0407デフォルトの名無しさん
垢版 |
2018/08/25(土) 11:39:19.95ID:0r5h6/lL
いちいちな
試験もされてないような知恵遅れが作ったフレームワーク()
なんかつかわないからな

障害の原因
0408デフォルトの名無しさん
垢版 |
2018/08/25(土) 11:50:32.60ID:0r5h6/lL
知恵遅れはまとな思考してれば
まともな人間なら書けないようなコードを平気で書くからな

やばいぐらい頭悪いコードを
それも息するように書くからな

しかもその自覚がない
オツムに致命的な問題がある

アルゴリズムを実現するための言語の問題じゃない
アルゴリズムなんかどんな言語でも実現できる

言語なんかただの方言だからな
Cが畿内の方言なら
C++はエミシの方言
Javaはクマソの方言
0411デフォルトの名無しさん
垢版 |
2018/08/25(土) 12:09:09.86ID:0r5h6/lL
javaはpascalとも混血してる
0412デフォルトの名無しさん
垢版 |
2018/08/25(土) 12:13:02.72ID:0r5h6/lL
pascalはインチキalgol
0413デフォルトの名無しさん
垢版 |
2018/08/25(土) 12:58:06.70ID:OV9APJVg
if文の中を抜けたい場合ってどうすればいいですか?
breakはforとwileを抜けるんですよね?
ifを抜けるには?gotoは使いたくないです
0417デフォルトの名無しさん
垢版 |
2018/08/25(土) 13:08:12.82ID:0r5h6/lL
switchならbreakで抜けれる
breakで抜けなければ、続きが実行される
0418デフォルトの名無しさん
垢版 |
2018/08/25(土) 13:18:05.46ID:khOLQHnm
>>402
意味不明。
わざわざCのソースコードを中間出力する意味ないだろ。

>>406
もしかしてCソースなら何でも速くなると思ってるゆとり?

>>413
意味不明。
> if文の中を抜けたい場合
これを他言語でいいから書いてみて。


多分お前は相当な馬鹿で、全てピント外れだと思うぜ。
自分では賢いつもりなんだろうけど。
0419デフォルトの名無しさん
垢版 |
2018/08/25(土) 13:25:50.33ID:0r5h6/lL
むかしのc++はcのコードジェネレーターだったからな
昔あったinfomixのesqlもインチキなcのコード書くと、それをcのコードにおきかえて出力する

昔、大量のfortranのコードをcに変換しないといけなかったことがあるが
最初は自動変換したがとても読めるシロモノじゃなかったから
ドカタに人力作業をお願いした

ドカタはこういうのは得意
0421デフォルトの名無しさん
垢版 |
2018/08/25(土) 13:41:52.99ID:0r5h6/lL
cで書いとけば間違いない
なんにでも使える
luaからでも超簡単に使えてしまう
0422デフォルトの名無しさん
垢版 |
2018/08/25(土) 13:50:16.83ID:yggGxXGy
if や単なる {} をbreakで抜けられたら便利だと思ったことがある
この場合、多段 break もほぼセットで必要

break n
break if
break for
break switch
break while
break do

こんなのでもいいかも
0423デフォルトの名無しさん
垢版 |
2018/08/25(土) 13:52:19.69ID:yggGxXGy
名前付きループ
だとbreakやcontinueにも使えるけど
わざわざ名前を付けるくらいならgotoでいい
0424デフォルトの名無しさん
垢版 |
2018/08/25(土) 13:53:56.31ID:0r5h6/lL
あいかわらず
低学歴知恵遅れは頭悪いこといってるわ
ループのbreakなのか条件のbreakなのか
コンパイラが解釈できない

コレがザ知恵遅れ
0425デフォルトの名無しさん
垢版 |
2018/08/25(土) 13:56:46.76ID:0r5h6/lL
for (;;) {
if (!aho) {
break;
}
}

自覚がないアホが治らないからアホの仕様では無限ループから抜けれない
アホのまま無限ループ
0426デフォルトの名無しさん
垢版 |
2018/08/25(土) 13:57:14.09ID:Q2JYdW4P
ループならいざ知らず、ただの複文ブロックでブロック外に制御が行きつ戻りつする様ならもはや構造化プログラミングとは呼べない
立派なスパゲティプログラムだろう
0428デフォルトの名無しさん
垢版 |
2018/08/25(土) 13:58:01.93ID:0r5h6/lL
低学歴知恵遅れがなんかいってる
0431デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:01:13.44ID:0r5h6/lL
まず低学歴知恵遅れは低学歴知恵遅れの自覚がないからな
cの言語構造がどうなってるかすらわかってない
0433デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:02:44.53ID:0r5h6/lL
まずどう字句解析されて
どう構文解析されてるかすら分かってない

まあ致命的

低学歴知恵遅れがバカなこと書いて
どやがおしてるワケだからな

相変わらず
0436デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:06:09.75ID:0r5h6/lL
break_if
とかにするならまだ少しは分かる

低学歴知恵遅れは単純になにもモノをしらなすぎる
タイムゾーンスレでも同じように
0439デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:09:13.24ID:0r5h6/lL
顔真っ赤にしなくてもな
低学歴かどうかなんか
レスからすぐにわかっちゃう

残念なことに
0442デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:20:36.81ID:yggGxXGy
15GBのテキストデータの解析速度
4倍の差

複数の数値データから上位3個を選ぶアルゴリズム
高速、非破壊、安定 / 低速、破壊、不安定

フィボナッチ数列の計算
計算式、計算アルゴリズム、コードいずれも大差
0443デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:21:26.04ID:0r5h6/lL
まさに阿Q正伝
0444デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:32:32.93ID:yggGxXGy
>>439の恥ずかしい書き込み

795 :デフォルトの名無しさん (ワッチョイ cf80-gYkF) [] :2018/08/06(月) 23:39:21.68 ID:9v3Lf9b90
全然ずれてない
コールスタックの深さとぴったり一致してる

オツムが足りない知恵遅れのために
さらにムダな補助出力をつけてやったぞ(AとB)

 https://ideone.com/2vP2kN

ここまでくると
メクラやツンボを誘導するのに近い。。。

 ↓この課題は、最終的には、コレにおちつくことになる
  (なんでかは、nを増やせばきっと知恵遅れでも分かるとは思ってたからな)
 https://ideone.com/eaJEjX

補助出力がないとなにやってるのかすら分からないメクラやツンボでは
コレがなにやってるかもきっと理解できないわ
u_l、u_r、u_yしかないからな

知恵遅れは再帰が理解できてないのが、よおく分かったわ
0445デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:33:32.61ID:yggGxXGy
882 :デフォルトの名無しさん (ワッチョイ de80-oNxq) [] :2018/08/11(土) 19:44:24.09 ID:17qcRus/0
で、>>881の結果に基づいて
一般項で処理するコードを書いた

 https://ideone.com/QKTrLi
 一般項で処理

やってみたが
一般項で処理なんかするとともかく遅い

6,942,482 bitsの一般項の計算で
お話にならないぐらいものすごい時間がかかる

calculation 6942482bits
f,10000000,35.082393,34.855636
g,10000000,0.722054,0.720584

つまり、結論としてフィボナッチ数を求めるなら
GMPに用意されてる関数を使うのが一番

再帰階乗演算使う方がはるかにマシ
一般項で求めるのはウンコ
0446デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:35:05.39ID:0r5h6/lL
なんか低学歴知恵遅れが
意味不明なこと書いてるわ
0447デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:35:56.77ID:0r5h6/lL
なんかしらんけど
よほど悔しいらしい

低学歴知恵遅れは
自己評価だけは高いからな
0449デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:39:15.70ID:0r5h6/lL
まず基本的なことが分かってないからな
致命的
0450デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:39:54.36ID:XpRMjBtL
最後に本当に共通ライブラリより高速なロジックがはられてたが
それに対する彼のコメント

// アホが書いたコード
// なにをやってるかは不明
0451デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:43:19.36ID:0r5h6/lL
オレはちゃんと
アホがスレで書いたコードをwebコンパイラで動かしたからな
0453デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:46:13.55ID:0r5h6/lL
で、正しい結果になった?
0454デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:49:17.98ID:XpRMjBtL
ビット数がWebだと32なのでそこで矛盾があっただけだった
ちゃんと作って張りなおされたやつは数千桁あっという間に求めるやつだったぞ
みただろ?
0455デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:50:29.77ID:0r5h6/lL
オレはしっかり低学歴知恵遅れが相当に頭悪いことを
しっかり 実 証 してるからな
0456デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:51:46.41ID:yggGxXGy
半角君が劣化コピーして

if (32bit変数 & 0x8000000000000000)
がTRUEにならんとか騒いでたね
0458デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:53:24.24ID:0r5h6/lL
1~64まで足して
まず0x8000000000000000
になるとかないからな

ぱっと見で分かるレベルだからな
相当な知恵遅れでなければな
0460デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:55:14.91ID:0r5h6/lL
かわいそうに
精神的勝利か

低学歴知恵遅れのゴミクズ人間が
まともな人間に勝てるワケがないからな
0461デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:56:30.95ID:yggGxXGy
>>458
n += n;

まだこんな簡単なコードを理解してないとは思わなかった
説明もしたのに

これが1から64まで足すコードに見えるってヤバくないか?
0463デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:57:17.04ID:0r5h6/lL
で、実行結果みた?
0465デフォルトの名無しさん
垢版 |
2018/08/25(土) 14:58:36.91ID:0r5h6/lL
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とか以前の問題だからな
0468デフォルトの名無しさん
垢版 |
2018/08/25(土) 15:00:50.04ID:0r5h6/lL
知恵遅れの脳内では987がunsigned intでオーバーフローする
0470デフォルトの名無しさん
垢版 |
2018/08/25(土) 15:01:52.08ID:0r5h6/lL
当然
https://ideone.com/vhpLPV
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;
}
0472デフォルトの名無しさん
垢版 |
2018/08/25(土) 15:03:38.02ID:0r5h6/lL
知恵遅れがどっかからコピってきたコードはってるわ
0475デフォルトの名無しさん
垢版 |
2018/08/25(土) 15:04:48.85ID:0r5h6/lL
コレが低学歴知恵遅れが低学歴知恵遅れであることの 実 証 も含めた
エレガントなレス

866 自分:デフォルトの名無しさん (ワッチョイ de80-oNxq)[] 投稿日:2018年08月11日(土) 11時39分50秒69 [朝] ID:17qcRus/0 [1/7] (PC)
とりあえずかわいそうなぐらい頭悪いヤツしかいないのは分かった

一旦、多倍長演算向けに3つの方法を評価する
ちなみにgmpの関数にフィボナッチの関数がついてる
きっとこの速度にすら届かないと考えられる(まだ動かしてない)

↓多倍長演算使ってない3つの方法の簡単なコードがコレ
https://ideone.com/vhpLPV
※ オマケでアホが書いたコード(>>851)も入ってる
※ オレの適切なありがたい注釈がついてる

1.ひたすら足し算

2.一般項
 多倍長演算をするまえに適切な精度を設定しないといけない
 どれぐらいの精度にすればいいかがまだ未解決 ※ とりあえず2回計算することでいけるような気がしないでもない

3.再帰階乗演算
 https://www.ics.uci.edu/~eppstein/161/960109.html
 探した中でコイツが一番いい感じがする
 > 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)
0476デフォルトの名無しさん
垢版 |
2018/08/25(土) 15:05:25.56ID:0r5h6/lL
webコンパイラで動かしてみ
まちがいなく動かない
0477デフォルトの名無しさん
垢版 |
2018/08/25(土) 15:05:34.74ID:yggGxXGy
>>470のリンク先は勝手に半角君が変数を32bitに変えちゃったんで動かないだけ

>>470に直接書いてあるコードはそのままで正しく動く
0479デフォルトの名無しさん
垢版 |
2018/08/25(土) 15:13:33.29ID:XpRMjBtL
…ほかがunsigned intだから関数名変えるついでに一緒に変えちゃったのか
これは訴訟レベル
0480デフォルトの名無しさん
垢版 |
2018/08/25(土) 15:49:42.93ID:RtKY5+V3
>>474
サマータイムのスレとかでも一人空回りしている。
いや、時々変なのも絡まって巻き込んで空回りしてるか。
0481デフォルトの名無しさん
垢版 |
2018/08/25(土) 15:58:16.40ID:R/mHQH6/
>>396
俺の場合はCを使ってMapみたいなものまで使わねばならないほど膨大なデータを扱うことが
滅多にないのでだいたいは不要。数百から数千のデータのキーでの検索なんか何も考えずに
ループさせて全検索してしまう。億単位のデータの処理が必要な場合は(だいたいはCではない
言語を使って)RDBにデータを入れてやるかな。その方が楽だから。

ああ、でも、昔 dbm ライブラリとか使ったことあるなあ。半端に多い場合はそういうので良いかも。
今だと Linux ディストリビューションとかは最初から gdbm ライブラリ入ってるの多いと思う。これね。
https://linuxjm.osdn.jp/html/GNU_gdbm/man3/gdbm.3.html
0482デフォルトの名無しさん
垢版 |
2018/08/25(土) 16:25:32.56ID:R/mHQH6/
>>413
> if文の中を抜けたい場合ってどうすればいいですか?

抜けようとしなくても抜けるので何もする必要はない。
0483デフォルトの名無しさん
垢版 |
2018/08/25(土) 17:08:52.03ID:kfh++Yrt
半角くん、逃亡www
0484 ◆QZaw55cn4c
垢版 |
2018/08/25(土) 17:45:22.21ID:3TjQPkhu
半角さんは、巷にあふれるただのマウント野郎とは違って、きちんとソースを出している
唯の者ではないと思います
0485デフォルトの名無しさん
垢版 |
2018/08/25(土) 17:46:03.47ID:zd32/hlD
コード保守でのバグはこうやって生まれる
うっかりミスの見事な事例がまさかこのスレで見られるとは思ってなかった
0486デフォルトの名無しさん
垢版 |
2018/08/25(土) 18:00:04.35ID:yggGxXGy
>>484
コードを出しゃ良いってもんじゃない
自分の劣化コピーのせいで動かないコードに対して
今回だけでもこれだけ書いてるから

>>451,458,465,468,470,472,476
0487デフォルトの名無しさん
垢版 |
2018/08/25(土) 18:02:07.86ID:0r5h6/lL
2ちゃんねるでしか自己主張できない低学歴知恵遅れが
なんか必死になってるわ

わかりやすいわ
ホント
0488デフォルトの名無しさん
垢版 |
2018/08/25(土) 18:03:03.76ID:0r5h6/lL
つまりクソニートと
断定できる
0489デフォルトの名無しさん
垢版 |
2018/08/25(土) 18:06:11.05ID:yggGxXGy
>>442の1個目3個目は相手が悪かっただけ
としても
2個目は初心者用の課題に対して
初心者が普通に考えるよりはるかに悪いアルゴリズムを選んでおいて
「これを選ばないヤツは知恵遅れ」発言の連投だから

1個目も3個目も言ってることはコロコロ変わるし
「こうしないヤツはアホ」発言をして
自分で変えてるし

>>432も頭おかしいだろ
0490デフォルトの名無しさん
垢版 |
2018/08/25(土) 18:13:06.50ID:zd32/hlD
働いてはいないがニートと呼べるほど若くもない
早期退職で悠々自適生活の元組込みソフト開発者だよ
0491デフォルトの名無しさん
垢版 |
2018/08/25(土) 19:03:57.78ID:kfh++Yrt
半角くんと長文くんのバトルを見てみたい
0493デフォルトの名無しさん
垢版 |
2018/08/25(土) 19:18:01.37ID:0r5h6/lL
オマエなかなか分かってるわ
オレのレスも文字列的には長い
しかし、中身が濃いから、情報価値も高い
つまり価値が高い情報を継続して提供している

クソニートの長文は情報価値ゼロ
中身スカスカ
ただの落書き
0496デフォルトの名無しさん
垢版 |
2018/08/25(土) 19:25:27.77ID:0r5h6/lL
オレに敗北はない
このスレのクソニートにも敗北はない

ただコレには違いがある

オレは正面から戦う

クソニートは戦わない
コイツラは身をひそめながら遠くからとりあえず石投げる

この違い
0497デフォルトの名無しさん
垢版 |
2018/08/25(土) 19:28:15.91ID:sh4ZcDkv
>>496
ああ、ごめん。
一生懸命ネタ振ってたのね。でもネタフリにしてはあんまり面白くはないかな。
ただ俺はそんな一生懸命なお前嫌いじゃない(笑)
0498デフォルトの名無しさん
垢版 |
2018/08/26(日) 02:50:43.41ID:5Jlr+RDR
一日でこの板に少なくとも 23 回「低学歴知恵遅れ」って書いてるね。
どれだけ拗らせてるの?
0501デフォルトの名無しさん
垢版 |
2018/08/26(日) 11:23:23.80ID:0Dyu3Dip
いやぁ、今どき職場で「低学歴知恵遅れ」なんて言ってくる上司がいたら
ネット掲示板で同じセリフを繰り返すより、録音して訴えるだろ。

それにしても、まるで署名のように必ず投稿文に盛り込むから、
何か隠された意図があるのでは、と深読みしてしまうのも事実。
単にクセになってて本人には意味の薄い間投詞になってるのかも知れんけど。


…読み取れないとガッカリなので一応書いておくけど、
「いくら匿名の電子掲示板でもそういう言葉遣いは良くないよ」と
たしなめている(忠告している、の方が受け入れやすいかな)つもり。
0504デフォルトの名無しさん
垢版 |
2018/08/26(日) 14:53:35.15ID:hANAm2gW
低学歴底辺のクソニート、そして底辺ドカタなのは
図星なんでしょ

人間をホントのこといわれると
必死になる
0505デフォルトの名無しさん
垢版 |
2018/08/26(日) 14:56:43.12ID:hANAm2gW
残念なことに
低学歴かどうかとか
知恵遅れかどうかとか
クソニートかどうか
底辺ドカタかどうか
レスからすぐに分かってしまう

まともに人間がみればすぐに分かる
キミラはなまとなに人間未満のゴミクズなワケ

その自覚すらない
だからまともな人間にすらなれないわけ

わかった?
0510デフォルトの名無しさん
垢版 |
2018/08/26(日) 16:29:48.93ID:hANAm2gW
図星でしっかり反応してるしな

やっぱりなこのスレは
駆除が必要な典型的な低学歴知恵遅れの
クソニートとか底辺ドカタしかいないわ
0513デフォルトの名無しさん
垢版 |
2018/08/27(月) 06:20:27.93ID:sdfxNc/O
>>499
このスレだけなら 35 だが、この板全体の数なんだ。
必死チェッカーもどきを見たら堂々の 2 位で笑った。
いや、彼の御高説をもっと見たかったんだ。
ちなみに「知恵遅れ」はその 23 とは別に単独で 16 回出てきたよ。
0516デフォルトの名無しさん
垢版 |
2018/08/27(月) 11:56:02.39ID:woJf6ZC9
>>413
if (条件) {
 …
 …
 ここで(ブロックから)抜けたい -(1)
 … -(2)
} else { … }

こういうこと? (1) はさらに if で条件付で分岐しないと意味がないけど…
※ (1)で分岐しないかぎり (2) 以降が無意味のコードになる

if の外側を do { } while(0) で外を囲って break; したら?
0519デフォルトの名無しさん
垢版 |
2018/08/27(月) 12:34:41.00ID:ywsjsNTA
>>516
それだったら2を実行するための何らかの条件がある筈なのでそのためのifブロックの中に2を入れればよい。
そつではなく無条件に2を実行したくないならばソースから削除するかコメントにでもすればよい。
0520デフォルトの名無しさん
垢版 |
2018/08/27(月) 12:36:44.69ID:ywsjsNTA
すまん。スマホでフリック入力しててタイプミスした。
0522デフォルトの名無しさん
垢版 |
2018/08/27(月) 12:48:15.12ID:nj2QXsVo
>>519
そりゃ方法なんていくらでもあるよ
そういう方法をとりたくないってことだろ
理由はしらんが

たとえば(-2)が大きくてインデントを変えたくないとか
0526デフォルトの名無しさん
垢版 |
2018/08/27(月) 12:59:44.74ID:ywsjsNTA
ブロックというものを中に入ったら出られないものと勘違いしているとか。
最初にforやwhileを覚えちゃって勘違いに繋がったとか。
0527デフォルトの名無しさん
垢版 |
2018/08/27(月) 13:22:18.19ID:vY3QDx2y
何人たりともforより先に関数のブロックを憶えるのにね
関数のブロックだけが何か特別なものと思い込んでるケースが多い
0528デフォルトの名無しさん
垢版 |
2018/08/27(月) 13:25:30.84ID:Q5lEKL35
goto 便利だけどなぁ。
break するがためのフラグ作って何ブロックも break するとか goto を避けるがためのいびつな if を連続させるとかよりよほど可読性が高い。
もちろん意味を的確に表したフラグやifの構造にできるに越したことはないけどさ。
0529デフォルトの名無しさん
垢版 |
2018/08/27(月) 13:28:07.17ID:aXwyVMA/
>>523
あえて固執して解決方法を編み出しておくと
ひょんなときに役立つことがあるしな
準備なんてのは9割無駄で当たり前だよね
0530デフォルトの名無しさん
垢版 |
2018/08/27(月) 13:31:18.13ID:vY3QDx2y
ジャクソン法やワーニエ法みたいに
データ構造とプログラム構造を一致させる構造化プログラミング()では
データが損傷していた場合にはプログラム構造を一致させることができない
よって構造化定理を諦めたアプローチをせざるを得ない
こういうのがgotoやlongjmpの出番
0531デフォルトの名無しさん
垢版 |
2018/08/27(月) 13:32:12.14ID:vY3QDx2y
>>529
その説明じゃ変態行為に固執する理由が説明できてないだろ
ええ加減にせんか、この変態!
0532デフォルトの名無しさん
垢版 |
2018/08/27(月) 13:35:23.06ID:ywsjsNTA
ま、Cの場合は適切にgoto使った方が良いだろうな。後から作られた言語では break でラベル指定できるだの例外処理できるだのしてるから使わなくて済むようになってるわけで、それのないCはそれの代わりにgoto利用しちゃった方が分かりやすく書ける。
0533デフォルトの名無しさん
垢版 |
2018/08/27(月) 13:41:42.47ID:vY3QDx2y
いやCのgotoは制限がキツすぎて
いざという時には役立たず
だからlongjmpがある
0536デフォルトの名無しさん
垢版 |
2018/08/27(月) 14:34:05.72ID:J1p6Vf0T
setjump/longjumpは簡易タスクディスパッチャーをC言語だけで実現するためだけにあるのかと思ってたよ。
それ以外の用途はあんまり思い浮かばないなぁ。
0537デフォルトの名無しさん
垢版 |
2018/08/27(月) 14:40:44.92ID:TsaU1TVW
自分で対処不能なエラーが起きたときに、初期化してやり直す時に使ったな
だもんで通常の処理の流れで使うものだとは思わなかった
0538デフォルトの名無しさん
垢版 |
2018/08/27(月) 16:09:02.07ID:vY3QDx2y
ディスパッチャとしてはダメダメじゃん
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が出ない
おまいらんとこではどんな結果になる?
0540デフォルトの名無しさん
垢版 |
2018/08/27(月) 16:27:43.33ID:VuJs8kRo
>>538
こちらは Linux (CentOS7)だが、出たよ。
0541デフォルトの名無しさん
垢版 |
2018/08/27(月) 16:29:13.02ID:VuJs8kRo
>>539
sigsetjmp(), siglongjmp() ってのがあるので、そっち使った方が良さそうではあるな。
0542デフォルトの名無しさん
垢版 |
2018/08/27(月) 16:33:51.80ID:J1p6Vf0T
Linuxとかならpthreadがあるのでわざわざ自分でディスパッチャ作ることはないと思うけど、組み込み用に簡易的に作ることはあるかもね。

俺は組み込みならprotothreadsのほうがシンプルで好き。
0543デフォルトの名無しさん
垢版 |
2018/08/27(月) 17:20:53.65ID:cJbIVPPr
#include <signal.h>
void (*signal(int signum, void (*sighandler)(int signum)))(int signum);

この宣言が読めない
0544デフォルトの名無しさん
垢版 |
2018/08/27(月) 17:30:35.88ID:vY3QDx2y
signal 関数名
signum 第1仮引数名
sighandler 第2仮引数名

sighandler ポインタ
*sighandler 関数
signum 第1仮引数名

signalの返却値はsighandlerと同じ型
0545デフォルトの名無しさん
垢版 |
2018/08/27(月) 18:31:36.73ID:C1HpzEi0
>>524
思い浮かばないってのがなかなか考えられない
ていうか、
for/while/do while 以外もbreakで抜けられたら良いと思ったことが私もある


>>525
なぜgotoは使いたく無い?
という質問の答えも聞いておかないと
コーディング規約なのか宗教なのか
gotoの使い方を知らないだけなのか
0546デフォルトの名無しさん
垢版 |
2018/08/27(月) 18:49:30.60ID:C1HpzEi0
>>536
OSのタスク切り替え処理
ブートローダーからアプリケーションへのジャンプ
リセット
例外処理
0549デフォルトの名無しさん
垢版 |
2018/08/27(月) 19:46:09.70ID:nZJhjhuf
まあデータの損傷をいきなりデータ構造そのものの破綻に結びつけるのは些か強引な論理展開ではあるな
0551デフォルトの名無しさん
垢版 |
2018/08/27(月) 20:08:36.09ID:FN2jn8ES
>>550
こんな感じ。

OSのタスク切り替え処理
→普通にOSの機能を使う、カーネルなしで簡易ディスパッチャ実装はpthread

ブートローダーからアプリケーションへのジャンプ
→アドレス固定ならアドレスを関数ポインタにキャストしてジャンプ、またはインラインアセンブラ

リセット
→周辺機能やbssやdataセクションも初期化したいのでWDT等のCPUリセット機能を使う

例外処理
→密結合を避けるためオーソドックスに返り値で判定、最後にgoto使うかも?

そういや例外処理longjmpで思い出したけど、一昔以上前のCマガジンにマクロでC++と同じようなtry〜catch構文実装方法の記事があったけど、確かにそのマクロ内ではsetjmp/longjmp使ってたわ。
マクロでカプセル化してれば例外処理で使うかも。
0554デフォルトの名無しさん
垢版 |
2018/08/28(火) 15:16:05.31ID:wM2MhSxp
http://techtipshoge.blogspot.com/2011/02/blog-post.html
このサイトで、書いてることは正しいと思うしし、実際こうなるんだけど、俺の頭悪いせいでわからない。

駄目な例のsetStr(a)の a は、 &a[0] という”アドレス”を渡してる訳ではないんでしょうか?
なんで駄目な例だと上手くいかないのかという理屈がわからない・・・
0555デフォルトの名無しさん
垢版 |
2018/08/28(火) 15:16:57.00ID:wM2MhSxp
あ、レスして気づいたけどcoutがあるってことはc++なのかな?
まあこれはprintfってことにしといてくださいw 重複質問になりそうなのでこちらで処理したい。
0556さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2018/08/28(火) 15:27:14.25ID:cEEOiaf2
newもC++のキーワードなんだけど。。

関数に実引数のポインタを渡すとその値が、対応する仮引数に代入(コピー)され、以後、仮引数は変数のように使える。
仮引数の値を変えてもコピーが書き換えられるだけで元の実引数の値には影響しない。
書き換えられるようにするには、書き換えたい場所のアドレスを渡して、*演算子か、[]演算子を使わないといけない。
0557デフォルトの名無しさん
垢版 |
2018/08/28(火) 15:27:46.08ID:10z9ufr/
駄目な例のa = new char [8];はmainのaの複製への代入なのでmainのaはNULLのまま
良い例の*a = new char [8];はmainのaそのものへの代入なので期待した結果が得られる
0558さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2018/08/28(火) 15:37:02.95ID:cEEOiaf2
関数呼び出しのとき、実引数がどこにコピーされるかというと、「スタック」という積み上げ式のメモリーブロックか、一時的なCPUレジスタが使われる。
インラインではない関数呼び出しにおいては、関数の戻り先のアドレスと、仮引数のデータがスタックに積み上げられる。
積み上げ式だから、自分自身の関数を呼び出しても動作する。これを「再帰呼び出し」という。
0559さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2018/08/28(火) 15:39:32.69ID:cEEOiaf2
スタックの積み上げには限度がある。限度を超えると、スタックサイズが拡張されたり、異常終了する。
スタックの積み上げが限度を超えて異常な状態になることを「スタックオーバーフロー」という。
0560デフォルトの名無しさん
垢版 |
2018/08/28(火) 15:52:37.71ID:wM2MhSxp
すません。私の質問が曖昧だったので追加で

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)としてアドレスを渡し、受け取りはポインタ変数なのに値は変わらない。
単に数値か文字列かの違いなんでしょうか?
0561デフォルトの名無しさん
垢版 |
2018/08/28(火) 16:00:50.42ID:Gzofmim2
とりあえず一度、配列とポインタに対する余計な先入観を捨てて素直に元サイトを読み込めば理解できると思うよ
一つの考え方に囚われ過ぎてると思う
0562デフォルトの名無しさん
垢版 |
2018/08/28(火) 16:05:47.55ID:10z9ufr/
void setStr(char **a) これを
void setStr(int *a) こう読み替え

char *a = NULL; setStr(&a); これを
int a = 0; setStr(&a); こう読み替えてみそ

つまり char* → int と読み替えるんだ
ポインタ変数とアドレスは違うという話は
整数変数と整数は違うという話と同じだ
0564デフォルトの名無しさん
垢版 |
2018/08/28(火) 16:35:30.28ID:wM2MhSxp
ああ分かった!
俺は自分で勝手に「char型のポインタ=文字列だ」と思い込んでて、そのせいで混乱してただけでした。
思い込み怖い・・・

void setStr(char *a) {
a[0]='a';
}

int main() {
char a[] = "test";

setStr(a);
cout << a << endl;
return 0;
}

これで「aest」と表示されたからピンときた。確かに失敗例はポインタ変数を渡しているだけだw
ありがとうございました。
0566デフォルトの名無しさん
垢版 |
2018/08/28(火) 18:33:43.92ID:oY+WdDFv
ハードウェアスタックを持たなくて再帰呼び出し出来ないうんこ環境があるね
0568デフォルトの名無しさん
垢版 |
2018/08/28(火) 18:45:10.17ID:Gzofmim2
そういえばずいぶん昔に昔ながらのBASIC言語でクイックソートを実装したときに当然サブルーチンの再起呼び出しなど使えないので
自分で似たようなことをやったなあ
というか確か何かのプログラム認定試験の定番の出題テーマだった気がする
当時必死に勉強してたことを思い出した
0574デフォルトの名無しさん
垢版 |
2018/08/28(火) 20:09:30.18ID:c8HqOUoV
普通にR0とかのレジスタ名ついてるんだけど実体は内蔵RAMにマッピングされてるアーキテクチャならよく見るけど、外部RAMってのは初めて見たわ。
今もこういうアーキテクチャのCPUあるのかな?
0578デフォルトの名無しさん
垢版 |
2018/08/28(火) 20:53:39.14ID:UQgP5OTn
>>573
制御記憶ってマイクロコードを入れるところなんだが…
主記憶と共用してる奴なんてあったか?
0579デフォルトの名無しさん
垢版 |
2018/08/28(火) 20:58:39.83ID:10z9ufr/
>>578
必ずしもマイクロ【コード】を入れるところじゃないんだけどね
たとえばメインフレームではDIAGNOSE命令で制御記憶を目的外使用なんてのをやってたよ
それやってるときはTestインジケーターが点灯することになってて
0580デフォルトの名無しさん
垢版 |
2018/08/28(火) 21:38:04.13ID:UQgP5OTn
>>579
> たとえばメインフレームではDIAGNOSE命令で制御記憶を目的外使用なんてのをやってたよ
そんな特殊な例出されてもなぁ w
そりゃ記憶装置だから他の物を入れることはできるよ
だから何? って話だけどな

> それやってるときはTestインジケーターが点灯することになってて
で、主記憶と共用ってどこのアーキテクチャなんだ?
0584デフォルトの名無しさん
垢版 |
2018/08/29(水) 23:07:37.73ID:E6lvAa/y
メルトダウン事件移行もアップデートの度にどんどんコンパイルとか画像縮小なんかの処理が遅くなってる気がする
もう怖くて淫照は買えない
0586デフォルトの名無しさん
垢版 |
2018/08/30(木) 08:20:17.62ID:cD6Bz7+B
>>582
そりゃなるよ
命令の動作を書き換えるんだから何でもできちゃう
なのでDiag関連の命令はCE(カスタマーエンジニア)モードでしか使えないとかなってたはず
今時のCPUでもエラッタ対策としてマイクロコードの書換えするけどコード自体は暗号化されてる
この暗号化キーが漏れたらえらいことになると思う
0591デフォルトの名無しさん
垢版 |
2018/08/31(金) 06:31:31.30ID:QWemr4wG
すみません思い切り初心者の質問です。
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
という出力にするにはどうすればいいでしょうか……。
0592デフォルトの名無しさん
垢版 |
2018/08/31(金) 06:43:34.91ID:jQ6ZKbRR
>>591
#define PR_POS(_pos) printf("%s: " #_pos "\n", str)
でいけるはず
詳しくは
プリプロセッサ 文字列化演算子
とかでぐぐれ
0595591
垢版 |
2018/08/31(金) 07:04:03.05ID:QWemr4wG
>>592
うわあああ! ありがとうございます。
正直 検索しても検索しても一向にそれらしき答えが見付からなかったんで
もう方法がないのかなとか思ってました……。
文字列化演算子なるものがあるのですね。用語まで教えていただいてほんとうに感謝しています。

しかもC99でも定められてるっぽい?
(gcc -std=c99 -Wall -Werror -pedanticで警告がなかった)
嬉しいです。これで随分すっきりしたソースコードになりそうです!

>>593さまもありがとうございます。
0596デフォルトの名無しさん
垢版 |
2018/08/31(金) 07:18:20.44ID:4o8e5lPA
#include <stdio.h>
#define DEBUG(fmt, ...) \
fprintf(stdout, "%s:%d #%s " fmt "\n", \
__FILE__, __LINE__, __func__, ##__VA_ARGS__);

初心者ならこのマクロを覚えておくと良いぞ。誰もが一度は使うはず。
0597デフォルトの名無しさん
垢版 |
2018/08/31(金) 07:26:18.95ID:jQ6ZKbRR
>>595
> しかもC99でも定められてるっぽい?
X 3010:2003 (ISO/IEC 9899:1999)
6.10.3.2 #演算子
制約
関数形式マクロの置換要素並びの中にある各#前処理字句の次の前処理字句は,仮引数でなければならない。
意味規則
置換要素並びの中で,仮引数の直前に#前処理字句がある場合,対応する実引数の前処理字句列のつづりを含んだ一つの単純文字列リテラル前処理字句によって,#前処理字句と仮引数を置き換える。(後略)
http://kikakurui.com/x3/X3010-2003-01.html
0598デフォルトの名無しさん
垢版 |
2018/08/31(金) 07:48:00.90ID:QWemr4wG
>>596
すいません。初心者なのにめちゃめちゃ上から目線みたいになってしまうんですが
assert()を使わないのはなぜですかね。
POSIX C99でも定義されているので ほとんどどのコンパイラでも処理できると思うんです。
0600デフォルトの名無しさん
垢版 |
2018/08/31(金) 08:23:18.46ID:LcHwdHfr
フィールドのエラーログ用に>>596みたいなコードをリリースバイナリにも埋めることがあるけど
その場合はassertじゃ役に立たないんだよな。
0601デフォルトの名無しさん
垢版 |
2018/08/31(金) 08:31:20.23ID:uM5wy4o0
斜め読みだけど、abcが変わってstrが変更されないならabcの方を文字列変数にしてprintfすれば良いんじゃね?
0602デフォルトの名無しさん
垢版 |
2018/08/31(金) 08:33:49.15ID:CKe+Ima+
>>596
可変長引数マクロはgccだけって記憶があったけどC99規格で使えるんだね。
「可変部の実引数が0個の場合に……」のgcc拡張とゴッチャになってた模様。

>>598
警告を表示しても動作を止めたくない場合には重宝するよ。
デバッグ中に「ここまでは処理が通過した」と確認する時とか。
0604デフォルトの名無しさん
垢版 |
2018/08/31(金) 09:08:12.10ID:9zTxkh/J
本番のコードと差が出て邪魔なのでassertはあまり使いませんね。
どうせデバッガ使うというのもあるし。
0605デフォルトの名無しさん
垢版 |
2018/08/31(金) 09:17:03.63ID:QWemr4wG
>>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);
}
0606デフォルトの名無しさん
垢版 |
2018/08/31(金) 10:04:04.85ID:Qsv+Vg4k
assertの使い道って「ここでは必ずhogeになる!」という意志をコードに残すという意味はあるかな。
言ってるとおりで動かすときはgdb使うし、開発中は単体テストで同等以上の確認するしで、実用性は今はあまり無いと思いますね。
0609デフォルトの名無しさん
垢版 |
2018/08/31(金) 12:51:53.38ID:jQ6ZKbRR
>>606
> assertの使い道って「ここでは必ずhogeになる!」という意志をコードに残すという意味はあるかな。
assertion の意味は主張だからむしろそれが正しいとも言えるな

> 実用性は今はあまり無いと思いますね。
最初作るときはそうでも改修時に全然触ってない所のassert()に引っかかることもあるから俺は基本入れてる
0610デフォルトの名無しさん
垢版 |
2018/09/02(日) 07:11:07.60ID:667Fbrpy
int a = 42;
a = a++;
↑これがコンパイルエラーになる理由って
「左辺aに対する代入と右辺aに対するインクリメントのどちらの演算を優先して処理するか不定である為」
で合ってますか? 不定じゃなくて未定義かも……。
0613611
垢版 |
2018/09/02(日) 09:07:14.14ID:667Fbrpy
>>611
あれ。すいません。よく分からなくなりました。
$ gcc -pedantic -std=c99 -Wall -Werror -O2
でコンパイルするとエラーになり停止しますが
$ icc -std=c99 -Wall -Werror -O2
でコンパイルするとあっさり通りますね……。
0614デフォルトの名無しさん
垢版 |
2018/09/02(日) 09:27:27.59ID:pzXMyV5h
>>610
未定義っす (>>1 C FAQ の 3 章を参照してください)
蛇足ながらシーケンスポイントの間でオブジェクトを変更できるのは高々1回だけとか、そんな感じのルール
>>613
gcc の -Werror オプションは警告をエラー扱いにするっす
0616デフォルトの名無しさん
垢版 |
2018/09/02(日) 10:00:57.15ID:667Fbrpy
>>614
ありがとうございます。
ちなみにicc (Intel(R) C/C++ Compiler)で-Wallおよび-Werrorオプションを設定したときは
警告もなにも出力されることなくコンパイルに成功してしまったんですが
理由とか分かりますかね。すいません。変な質問で……。
0617デフォルトの名無しさん
垢版 |
2018/09/02(日) 10:19:45.38ID:667Fbrpy
>>614
あと,おっしゃる通り(すくなくともC99では)未定義でした。ありがとうございます。
> 直前の副作用完了点から次の副作用完了点までの間に,
> 式の評価によって一つのオブジェクトに格納された値を変更する回数は,高々1回でなければならない。
> さらに,変更後の値の読取りは,格納される値を決定するためだけに行われなければならない。
(JIS X 3010:2003 p.48; 参考 https://dotup.org/uploda/dotup.org1632204.png
0618デフォルトの名無しさん
垢版 |
2018/09/02(日) 11:28:11.60ID:owKXNyzr
>>610
そういう文法的になことには今は拘らない方がいい。(これは他言語学習者の方が酷いが)
上達の妨げにしかならない。

プログラミング言語は、「正しく書いたときに正しく動作する」ようにしか設計されていない。
特にCはそうだ。
意味不明なことを書いたらだいたい全て「未定義」であり、
意味不明なことを書く奴が悪い、ということになっている。
そしてそれが「未定義」と覚えることも、実質的な意味はない。
そんなコードはすぐに修正され、存在しないからだ。
実際、 a = a++; なんてコードは、どのOSSにもないはずだ。

この意味で、Cは全くの素人の入門者用ではない。
例えばC#はそこら辺厳しい言語で、そういった意味不明な書き方は全てコンパイルエラーにされるはず。
(さすがにその例では知らんが、例えば「未初期化の変数を使用」とかがエラーになる)

というか、マジでそのレベルならC#やった方がいい。
文法エラーなんてサジェストが出てOK押したら自動的に修正してくれる。
お前がどんな環境でやってるのかは知らんが。

ただ、こういった無駄な遠回りをしなくて済むだけでも、君にとってC#は有効だと思うよ。

つか、初心者は全ての文法を押さえないといけないと勘違いするようだが、それは間違いだ。
自分が使うだけの文法を押さえ、さっさと使うべきだ。
お前だって日本語の全ての漢字が読めるわけでもないのに日本語を使ってるだろ。
プログラミング言語も同様で、手段でしかないのだから、文法を一通り確認したら、
さっさとゲーム等何でもいいから作れ。
ネタがないのならそれはそもそも今プログラミングを学ぶ必要がないとも言えるし、
それでもやりたいのならラズパイでも買ってきてLEDチカチカでも目指せ。
文法を学ぶことが目的になってはいけない。それは完全に空回りだ。
0619デフォルトの名無しさん
垢版 |
2018/09/02(日) 11:39:01.45ID:mdI4MGys
やりたいことはシンプルに書けよってことだな。
最終的に a にどうなってほしいのか、それってもっと端的に書けないの?ってこと。
Cオタクになるのが目的じゃなければな。
0620デフォルトの名無しさん
垢版 |
2018/09/02(日) 12:11:10.31ID:owKXNyzr
(ちなみに補足)>>610
初心者には理解不能だと思うが、
「文法で許されていることが全て許される」環境なんて実質的に存在しない。
だから文法のコーナーケースについてはそもそも覚える必要がない。
(とはいえ、肝心のK&Rがフリーダムすぎて…ってのはあるが)

これは小説→ラノベの流れと同じで、
美辞麗句の技巧に走る必要はなく、簡単な文を書き連ねて面白い筋を書け、ということ。
プログラミングにおいてはこれが徹底していて、
同じ物なら、簡単な方が『常に』いい、ということになっている。

ただ、どこからが複雑なのか?というのは議論になる。
例えば自然言語で韓国が漢字を廃止した際、
「停留所」を「ばすが とまる ところ」と書き換え、老人が「舐めとんのか!」と切れた。
実際、全員が読める漢字を「もっと簡単に」という理由で平仮名に書き換えられても困るだろ。
丁度これと同じ(だが方向は逆)で、
新しいプログラミング言語は比較的すんなり書ける文法が用意されており、
それを使うべきかどうかでは揉めたりしている。
ただ、Cは古いのでまどろっこしい文法しかなく、ベタな書き方しか出来ない。
だから比較的この論争に巻き込まれることはないはず。
(それ以前に文法セット自体が小さくて、え?これだけ?のはずだが)

>>619
天然と養殖では学びのベクトルが逆なんだよな。

天然: 1を足したい → a++ と書くのか
養殖: a++と書くと → 1が足されるのか

結果、要因側をenumすると文法一覧になるのが養殖で、これが間違いの元だ。
そしてそれを馬鹿正直に一つずつ潰すから文法エリートになっていく。
そうではなく、要因側のenum結果はやりたいこと一覧になって、全部揃えばゲームが作れる!が正しい。
0621デフォルトの名無しさん
垢版 |
2018/09/02(日) 12:24:17.27ID:667Fbrpy
>>620
ちょっと反論があります。正直Cどころかプログラミング初学者なのですが……。

要するに私は養殖≠ナあり,そのような学び方では成長しないと仰りたいわけですよね。
まあ確かに自分でも「規格厨」というか,衒学的な性格をなのは自覚してます
しかしプログラミング言語というのは自然言語とは違う面が多々あると思います。
そして「文法を網羅すべきか」という点においては特に違うと思います。
プログラミング言語は少なくとも概念においては文法に正確に従えば定められた動作を確実に行ないます。
日本語の文法を遵守して話しても考えが伝わらないのとは全く異るところです。
だから私はプログラミング言語においては先に(かなり厳密に)文法を学ぶべきであり,
「文法を学ぶ」ことのなかには未定義動作に関する諸々の知識を習得することも含まれていると考えます。

偉そうにすいませんでした。まあ上手くいかなければまた考えを改めるつもりではいます。
0622デフォルトの名無しさん
垢版 |
2018/09/02(日) 12:32:31.40ID:mdI4MGys
やりたいことを素直に書いたつもりで未定義な文法になってしまうなら、もっと論理を考えた方がいいかも。
やりたいことを行う手順を整理できてないってことだと思うよ。
a = a++; ということが結局どういう動作するのかを知ることより、何をしたくてそういう(矛盾をはらむ)書き方になったのかを自己分析した方がいい。
もちろん基本的な文法は勉強しておく前提はあるよ。
おれは養殖とか天然とかは分からんけど。
0623デフォルトの名無しさん
垢版 |
2018/09/02(日) 13:02:03.12ID:gypPfsRT
Cは文法的にはコードのデザインをほとんど規定しないからね。
そういう意味では頑張って覚えるほどでもない。まあ量も少ないので覚えてもいい。
でも古いコードとの互換性にこだわる様なおっさんにはならんでくれやという感じ。
0624デフォルトの名無しさん
垢版 |
2018/09/02(日) 13:06:08.54ID:nnaQ2akS
>>621
あなたの言うことにも一理ある。

でもこの板にいる人は1つの言語しか使えない人って少数派で、たいていは3、4つまたはそれ以上の言語を操るマルチリンガルな人が多いと思う。
んで、その人たちはどうやって新しい言語を使えるようになるかって言うと、1つの言語をマスターすると(Prologとか特殊な言語は除いて)他の言語も方言みたいなもので、書き方の問題だけなことが多いのね。
その際には特定言語の重箱の隅をつつくような知識が必要なわけではなく、むしろ最大公約数的な知識、もっと言うと言語に依存しない設計力のほうが大事になってくる。
なので、特定言語のあまり細かいルールにこだわり過ぎないほうが良い、という経験論での意見は間違ってはないと思うよ。
0625デフォルトの名無しさん
垢版 |
2018/09/02(日) 13:21:05.23ID:mdI4MGys
そうそう、しいて文法を覚えるなら適切に const を指定するクセを付けてほしいな(const に限った話ではないんだが)。
文字列を引数で受ける箇所全部が char* になってるコードを見るとクラクラするw
0626デフォルトの名無しさん
垢版 |
2018/09/02(日) 13:50:09.03ID:owKXNyzr
>>621
反論自体は自由にやればいいんだよ。それが匿名掲示板のメリットなのだから。
ただ、書かれている内容については吟味しないといけない。
その中には君にも峻別出来る内容もあるはずだから。
(というか、こっちが君にも分かる範囲で《客観的な範囲で》話せばいいのだが)

事実から言うと、C言語は『当初から』バリバリの実用言語であり、今も現役だ。
これは同世代の他言語とは全然違う。
だから、普通に書いてれば「未定義」なんてのに命中するはずがないんだよ。
そんな言語、使い物にならないだろ?

次に、歴史も長いのだから、何をどうやったら嵌るかのノウハウも溜まっている。
それの集大成がコーディングルールであり、例えば goto 禁止論だ。
これについても是非はあるが、これまでの経験をタダで享受する気なら、乗った方が得だ。
そしてそれに従っておけば大体全て「未定義」は回避出来る。

具体的に言えば、警告レベルを一番か二番目に厳しい状態で使って、警告についてはほぼ全部直し、
google等「コードを実際に書いている連中」のルールに従って書けば、そもそも未定義なんて踏まない。
それらはそのように整備されているから。

業務で「コーディングルール無し、警告も全部無視してよし」なんてのはあり得ないし、
仮に個人レベルでそうでもバグが取れなくて無駄に苦労するだけ。
だから結果的に「未定義」なんて気にする必要ないんだよ。
一般的な環境で普通に書いてれば命中しないし、知る必要もない。
一通りも書けない初心者なら特にそう。他にやることはいくらでもある。

君は休日にプログラミングをやろうとしているのだから、本来は「天然」なんだよ。
それを自分で「養殖」型のカリキュラムにして、無駄に上達しにくくなってる。
そこが勿体ない。
君が何の為にCを学ぶのかは知らないが、もっと直接的にその結果を目指すべきだ。
とりあえず学ぼう、では全く上達しないんだよ。
それは日本人の英語でもそうだろ。使わないと上達しないんだよ。
0627デフォルトの名無しさん
垢版 |
2018/09/02(日) 13:50:53.63ID:667Fbrpy
>>624
確かにそうですね。先に述べた通りプログラム全般に暗いのですが
JavaやPythonなども大まかな構造(サブルーチンとか演算体系とか)は
似ているかなと感じました(見当違いなこと言ってるかも)。
もっと抽象的な立場になったほうがいいですかね。

>>625
アドバイスありがとうございます。
ggってみたところconstはその重要性の割に実務で使われていない傾向にあるみたいですね。
しかし役割を考えると,特に保守の面で,積極的に使うべきだなと確信しました。
「ここは固定された値代入を想定している」という意図を明確にできるってことですよね?
0628デフォルトの名無しさん
垢版 |
2018/09/02(日) 14:03:37.00ID:667Fbrpy
>>626
そうですね。
動くプログラムを作っていたらa=a++;なんていう文は登場することはないですね。
お察しの通りプログラマーでもなんでもない独学状態なので,
そういう人間が犯しがちなミスを防ぎたい一心で規格や文法などを厳密に勉強すべきと思っておりました。

C#についてですが,こういう事を素人が言うのはまさに傲慢ですけど,
どうせ勉強するなら万人が使ってる/種々のソフトウェアを作っている標準言語を勉強したいな
と思ったのがきっかけなので,正直C#はあまり乗り気になれません。
0629デフォルトの名無しさん
垢版 |
2018/09/02(日) 15:19:58.46ID:mdI4MGys
>>627
const の役割はその通り、その値を書き換えないことを意思表示するためのもの。
strcpy の引数なんかを見ても分かると思うけど、このように使い分けするだけで関数の入出力もよくわかる。
ケアレスミスで入出力を逆に書いてもコンパイラが指摘してくれる確率が上がるし、コンパイラにとっても最適化のヒントになってる。

でも実際、const皆無のコードも珍しくない。
そんな所に自分だけ const 付けると、余所の関数を呼ぶために意味不明なキャストをするハメになってストレスMAXになる。
ただ厳密に考え出すと、値受けの引数 int x なんかは const int x であるべきでは?なんて思うけど、個人的にはそこまで強要はしなくてもいいかな… なんて思う。
でもポインタ受けの引数 char* p なんかは const char* p にすることを強要したい。
前者について緩いのは、その const はその関数の中の実装を縛るものであり、そんなことは関数の外の世界の人にとってあまり重要ではないから、というのが理由。
0630デフォルトの名無しさん
垢版 |
2018/09/02(日) 15:26:12.33ID:FVhWhkTR
>>628
C#にマイクロソフト性を強く見出しているのか知らんがJDKがゴタついていて.NET Coreが出てマルチプラットフォームで優位性があり、Unityでゲームも作れる

コンピュータを勉強したいならCでいいけどプログラミングを勉強したいならCと比較してもC#は十分万人が使っている標準言語としての地を持つよ
0631デフォルトの名無しさん
垢版 |
2018/09/02(日) 15:44:37.64ID:Q8aSECkx
組み込みなどの特殊な分野を除けばC言語の方こそ万人向けとは言い難いな
C言語はそれほど広範な分野で利用されるような言語ではないよ
0632デフォルトの名無しさん
垢版 |
2018/09/02(日) 16:20:10.20ID:d8qknsqq
C言語が使えない環境は少ないけど、かと言ってC言語を積極的に使う必要のある環境も少ない、かな?
でも全ての基本として、低レベルなCを理解しておくのは有意だと思う。
0633デフォルトの名無しさん
垢版 |
2018/09/02(日) 16:34:34.65ID:mdI4MGys
C の前にアセンブラやってみるのも悪くないと思うよ。
今はお手軽なワンチップマイコンも多いし。
欲を言えば昔の 8bitパソコンくらいがメモリもそこそこあってちょうどいいし、16bit くらいになるとスタックフレームも使いやすくていいんだけど、今そういうので丁度いいのはあまり無いのが残念なところだけど。
0634デフォルトの名無しさん
垢版 |
2018/09/02(日) 16:48:06.49ID:owKXNyzr
>>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の作法について学ぶ必要もないはずだが)
0635デフォルトの名無しさん
垢版 |
2018/09/02(日) 17:06:32.38ID:4Jf6YH6e
>>633
まず、エミュレータを作ります。
0636 ◆QZaw55cn4c
垢版 |
2018/09/02(日) 17:48:53.86ID:oSO4LvdH
>>626
>君が何の為にCを学ぶのかは知らないが、もっと直接的にその結果を目指すべきだ。
>とりあえず学ぼう、では全く上達しないんだよ。

うーん、これは非常にいい指摘ですね
私は、これに気が付くのにずいぶんと遅くなってしまいました
0637デフォルトの名無しさん
垢版 |
2018/09/02(日) 18:34:07.99ID:5WqNet32
素人は技術もないのに、登山で直線的に、絶壁を登ろうとするから失敗する。
勉強のプロは、斜めに進んでいくから、登れる

素人がすぐに思いつくような、直線的な方法をやってもダメ。
全員が失敗してる。
C の授業を受けた、ほとんどの大学生が、こんな授業は無駄・役に立たないと言ってるw
彼らはなぜ、そう言うのか、理由を考えたらよい

C のようなポインタのある言語を、1年勉強しても、
ポインタを追っかけるだけで時間がつぶれるから、何も作れない

その時間で、Ruby/Python/JavaScript の3つの動的言語をやれば、ツールを作れる

まず素人は、動的言語・静的言語・ポインタのある言語の、
位置付けや難易度をわかっていない
0639 ◆QZaw55cn4c
垢版 |
2018/09/02(日) 18:46:30.43ID:oSO4LvdH
>>638
難しいと思います
C++ に移ってからも、T ** を T *& に書き直すとかする段階で、自分のポインタ概念の認識が浅かったことを実感させられたりしたものです
0640デフォルトの名無しさん
垢版 |
2018/09/02(日) 19:00:28.56ID:zPdaUXCQ
Cのポインタはシンプルだからわかりやすいと思います
ビット演算のほうが難しいと思います
m = (m & 052525) + ((m & 0125252) >> 1);
m = (m & 031463) + ((m & 0146314) >> 2);
m = (m & 007417) + ((m & 0170360) >> 4);
m = (m & 000377) + ((m & 0177400) >> 8);
0641デフォルトの名無しさん
垢版 |
2018/09/02(日) 19:30:02.62ID:nnaQ2akS
>>640
8進数表記って滅多に使わないから、たまに良かれと思って桁合わせでゼロパディングすると意図せず8進数になって悩むよな。
0642デフォルトの名無しさん
垢版 |
2018/09/02(日) 19:43:35.59ID:4Jf6YH6e
>>641
あ、それ、30年ぐらい前にハマった。

幸い8や9を使っている所でコンパイルエラーになったからよかったが(それでも当初はなんでエラーになるのかと悩んだがw)、もし使ってなかったらROMに焼いてからターゲットマシンで変な動きになって悩み続けた事だろう。
0643デフォルトの名無しさん
垢版 |
2018/09/02(日) 22:38:57.74ID:u9h+2eE3
Cが全盛だった時代、否が応でもプログラミングの勉強はCから始めた。
昔の人は理解できて今の人には難しいと考えるのは傲慢ではなかろうか。

ところでアンサイクロペディアのC言語の項が18禁になってるのは全部椋田のせいだな。
0644デフォルトの名無しさん
垢版 |
2018/09/02(日) 23:21:32.95ID:owKXNyzr
>>643
> 昔の人は理解できて今の人には難しいと考えるのは傲慢ではなかろうか。
いや事実だ。理由は単純で、つまりは裾野が広がっているだけなのだが、以下。

1. C言語の難易度自体は昔と同じだが、C言語の問題点を修正したより簡単な言語が開発された。
2. 昔プログラミングをしてたのは理系の大学生/大卒だけだった。
 今は文系も含め、しかも中高生から始めようとしている。
 数学で培われる論理/抽象思考能力はプログラミングに不可欠なのだが、
 これらがまだ整っていない状態の中高生や文系にプログラミングを教えるってのがそもそもの間違い。

どのみち今の状況で計算機科学専攻ならCは必修だろうし、そういう連中には問題ない。
ただ、そうじゃない連中がCをやる必要はないってこと。
Pythonだけで済む世界ならそれもありだ。
0645デフォルトの名無しさん
垢版 |
2018/09/03(月) 00:24:24.13ID:gEsVL0BV
昔も中高生の頃からプログラミングは始めていたけどな
いわゆるベーマガ世代の年齢層がBASIC やアセンブラからC言語に流入してたので平均的レベルは比較的高かったように思う
0647デフォルトの名無しさん
垢版 |
2018/09/03(月) 00:35:18.97ID:wBpew+1c
プログラミングの学習は、最初電卓でやってた
ニーモニックが16進表示みたいなやつだったな
それで、ループや分岐、サブルーチンを覚えた
その後は、Z80のアセンブラに移ったっけ
高級言語やりたかったけど、
8ビットのプアなPCしか持ってなかったし
漢字モア使えないPCで漢字ROM買って取付け
漢字非対応のドットインパクトプリンタに
機械語プログラム使って漢字出力してた
0648デフォルトの名無しさん
垢版 |
2018/09/03(月) 01:05:18.32ID:co6OAOoM
>>645
ベーマガやってた連中はごく一部なのだから一般化するのは無理がある。
そしてそれに対応する連中は、今はもっと増えている。
家にPCがあるのが当たり前の時代だし、IDEも無料、
インターネットでOSSのソース見放題、質問も出来る。

昔の大学生も、大学で初めてプログラミングした連中はCで撃沈してた。
今は昔と比べてIDE等の環境が断然良くなっているが、
大学生の割合が増えた分、大学生の平均的頭は悪くなっている。
(昔は上位1/4が大学生だったが、今は上位1/2で、東京に至っては2/3じゃなかったっけ?
昔だと当然高卒だった連中が大学に行ってるのだから、Fランでは授業が成立しないのも当然)

だから今の「平均的大学生」が大学でプログラミングを始めても、当然Cでは撃沈する。
今の「上位半分の大学=国公立+有名どころ」(=昔の上位1/4の頃の大学生相当)の理系で、
昔の大学生と同様にCで撃沈するはず。
それを文系含めて全員プログラミングをやらせようってのだからかなり無理がある。

とはいえ、個人差の方が大きいし、やるのは自由だ。
ただ、もっといい言語(改良された言語)は沢山あるのだから、無理してCに拘る必要はない。
情報/計算機系はどうしても速度勝負になるから、どのみちCは外せないが。
0650デフォルトの名無しさん
垢版 |
2018/09/03(月) 01:38:17.54ID:y7r/YW4w
https://ja.m.wikipedia.org/wiki/%E3%82%86%E3%81%A8%E3%82%8A%E6%95%99%E8%82%B2

ゆとり教育(ゆとりきょういく)とは、日本において、1980年度(狭義では2002年度以降)から2010年代初期まで実施されていたゆとりある学校を目指した教育のことである。

1980年度から2010年代初期
1980年度から2010年代初期
1980年度から2010年代初期
1980年度から2010年代初期
1980年度から2010年代初期
0651デフォルトの名無しさん
垢版 |
2018/09/03(月) 01:45:48.17ID:dM1zEtwp
アセンブラ(マシン語)からやったほうが
イメージしやすいと思うんだけどな。ポインタ周りとか

現代はPythonやC#が潰しが利くから昔でいうCの位置かな
https://cpplover.blogspot.com/2016/05/mitsicp.html
0652デフォルトの名無しさん
垢版 |
2018/09/03(月) 02:48:03.81ID:WkDP4f9E
みなさんほんとうに色々な助言ありがとうございます。
目的はなにかといいますと,ゲームを作りたいのではなく,むしろ計算機の仕組みなどを学びたいと思っています。
やっぱり始めはPythonのほうがいいんですかね……。
(ちなみにガッツりゆとり世代です。中学あたりで土曜日通学が復活したかな?)
0653デフォルトの名無しさん
垢版 |
2018/09/03(月) 05:37:12.02ID:WkDP4f9E
調べただけですがRustもよさげですね。私が学びたいと思っている計算機の基礎的な部分に触れられると同時に
C99では非常に複雑で非本質的な努力を要求される,安全なメモリ管理やUnicodeに対応した文字列操作が
簡単に実現できるというのは魅力的です。また,Mozilla社が主導しているというのも好印象です。
難点は,かなり新規の言語なので,Cほど開発手法が洗練されておらず,
またコンパイラの実装が一つしかないことですかね。
しかし開発版ながらRust製のOSもあるようですし,私がCを通じて得たいなと思っていた知見や概念を
Cほど紆余曲折を経ずに取得できそうです。(学問に王道なしとは言いますがね……)

これ以上は(というか既に大分)スレチになってしまうので書き込むのはやめます
青二才に貴重な時間を割いて様々な助言を頂いたこと,ほんとうに感謝しています。
0654デフォルトの名無しさん
垢版 |
2018/09/03(月) 07:47:15.40ID:Sux6qqaT
別にCでいいと思うよ。
ただ何使うにしても、画面表示とかができないとモチベーション上がらないかもね。
GUIとまではいかなくてもコンソール上にテキストで簡易グラフィックくらいやらないと、動いてる様を眺める楽しみが半減だ。
エスケープシーケンスとかを一緒に勉強するといいかもな。
とりあえずライフゲームでも作って眺めてみたら。
0655デフォルトの名無しさん
垢版 |
2018/09/03(月) 08:01:08.87ID:gEsVL0BV
まあ手っ取り早くプログラミング全般を眺めるならマルチパラダイムの言語を最初に学ぶのも悪くはないと思うよ
手続き型、オブジェクト指向、関数型のマルチパラダイムなら、他にはC#やJavaScriptなどが環境が充実してるので手軽ではあるけどね
0656デフォルトの名無しさん
垢版 |
2018/09/03(月) 08:20:45.29ID:/AUwjj56
計算機の仕組み、つまりコンピュータの動作原理を学ぶならアセンブラだろうけど、普通のOSのAPIはCなので、やっぱりC言語を勉強するのはベストプラクティスだろうね。
PythonだったりC#だったりはプログラミングは習得できても動作原理は深く学べない。
果たしてC#等の高級言語しか使えない人の何割が割り込みやCPU動作モードやSFRについて正確に理解してるのやら。
0657デフォルトの名無しさん
垢版 |
2018/09/03(月) 08:30:03.31ID:4uYLlRfz
>>653
Rustの方が細かなノウハウでコケずにコンパイラが指摘してくれるというのはあるが今の目的ならCの方が素直でいいと思う
実機の動きを追える上に色々な機能が付いていて嬉しいという言語なので覚える事が滅茶苦茶多いよ
0658デフォルトの名無しさん
垢版 |
2018/09/03(月) 09:18:58.58ID:co6OAOoM
>>652
中高生なら学校の勉強しとけ。結果的にそっちの方が近道だから。

プログラミングは抽象思考が出来て自分でサイクルを回せる奴しか上達しない。
具体的に言うと、「○○→△△って事は●●→▲▲ってことだろ。
ならここをこう改造すればこうなるはず…ビンゴだぜ!俺って頭イー」
を『自分だけ』で勝手に繰り返せる奴だ。(β)
学校の教科でこれに最も近いのは物理で、次点で数学だ。
だからこのタイプの奴は物理と数学は『本人は特に努力した覚えが無くとも』無双出来る。
逆に言えば、そうなっていない奴は本質的にプログラミングに向いてない。
その場合は、そもそもプログラミングをやるべきではないと俺は思っているが、
それでもやるのなら、まず物理と数学の『勉強の仕方』を変えて『抽象思考』を身につけるべきだ。
(単に勉強するだけなら『暗記』でも一定まではカバー出来てしまうが、それでは意味がない)
プログラミングを始める前に、プログラミングが上達する基礎能力としての抽象思考を身につけないといけない。

次に、既にこれが出来ていたとすると、
教科自体の内容はプログラミングには直接は関係ないから、中高生でも出来るのは事実だ。
(ここら辺のことをわきまえず、『中高生でも出来る』とだけ見て全員に教えようとしてるから問題がある。
とはいえ、主導している馬鹿共はプログラミングが出来ない連中だから、話が通じないのも当然だが)
仮に君がここまでは到達しているとして、話を進めると、以下になる。

> むしろ計算機の仕組みなどを学びたい
現状、C以外に選択肢はない。

> Rust
止めとけ。今のRustはプログラミング初心者用には出来てない。C以上に確実に撃沈する。

> Python
海外では「関数呼び出し、ループ、条件分岐」等の基礎の基礎を学ぶのなら一番早いと言われている。
現実的にはAWK/Perl/Ruby/JavaScript等いわゆるスクリプト言語全般は全てこれに当てはまるが。
ただ、上記の「プログラミングが上達出来る奴」ならこの部分は数日〜数週間で通過してしまう為、
言うほど関係ない。「初心者ならどの言語でも同じ」とよく言われているのはこれ。
0659デフォルトの名無しさん
垢版 |
2018/09/03(月) 09:19:38.61ID:co6OAOoM
例えば体育、運動神経のいい奴は何をやってもそこそこ上手いし、一瞬で上達するだろ。
あれと同じで、「プログラミング神経」のいい奴はどの言語でも上手く行くし、すぐ上達するんだよ。
だから言語自体よりは「プログラミング神経」としての『抽象思考』能力の方が重要なんだよ。
そしてそれがない奴が頑張ってみたところで、
ちょっと運動神経のいいやつが遊びでやってるのを見たらスゲー上手くて萎える、みたいなことになる。
だから本当は基礎能力としての抽象思考を鍛えることが重要で、プログラミングの上達はその結果にすぎない。
そこを「プログラミングを『教えれば』上達する」と勘違いしている馬鹿が色々やろうとしてるからおかしなことになってる。
『教えれば』上達するのは暗記科目であって、
上達する状況を整えた上で『勝手にやらせる』と自然と上達するのが非暗記科目だ。

で、言っちゃ悪いが君は多分「抽象思考」型ではなく、「暗記」型だ。enumして全潰しというのがそれ。
君は本質的にプログラミングに向いてないタイプだと思うぞ。
教科の延長でプログラミングを学びたいと思ってるのなら止めとけ。

上記(β)タイプは主に一点突破で、むしろ勝手に突っ込んでいって自爆するのが多い。
最近出てきたのはGateboxだが、いい感じに突き抜けてるだろ。
https://gatebox.ai/home/
http://www.itmedia.co.jp/news/articles/1612/14/news092.html
こういうことを平気で出来る奴じゃないと上達しない。
君にはその臭いを感じない。
0660デフォルトの名無しさん
垢版 |
2018/09/03(月) 09:45:55.75ID:XmaAZlOW
https://ja.m.wikipedia.org/wiki/%E3%82%86%E3%81%A8%E3%82%8A%E4%B8%96%E4%BB%A3

ゆとり世代

ゆとり世代(ゆとりせだい)とは、ゆとり教育(ゆとりきょういく)を受けた世代のこと。

定義・範囲
ゆとり世代については明確な定義、範囲はなく諸説ある。

・小中学校において2002年度施行(高等学校は2003年度)の学習指導要領による教育を受けた世代(1987年4月2日 - 2004年4月1日生まれ)。

・小中学校において1980年度以降(高等学校は1982年度以降)の学習指導要領による教育を受けた世代。1966年度生まれ以降。
0661デフォルトの名無しさん
垢版 |
2018/09/03(月) 09:58:26.53ID:udP6IpNT
やっぱりプログラミングより数学の勉強の方が全然大事だと思うわ
無駄な時間を過ごしたおっさんの後悔からの発言だけど
若者は線形代数と物理いっぱいやった方がいいよ
0662デフォルトの名無しさん
垢版 |
2018/09/03(月) 11:14:17.43ID:sjKCXLyo
BIOSの割り込みサービスで画面に文字表示するやつよんだらどうなりますか?
0663デフォルトの名無しさん
垢版 |
2018/09/03(月) 11:36:38.73ID:CjQwreEv
>>653
これでも買っとけ

70年代のTRPGの生の感触がばりばり伝わってくるAD&Dの本

コンパイラ―原理・技法・ツール (Information & Computing) | A.V. エイホ, R. セシィ, J.D. ウルマン, M.S. ラム, Alfred V. Aho, Jeffery D. Ullman, Ravi Sethi, Monica S. Lam, 原田 賢一 |本 | 通販 | Amazon
https://www.amazon.co.jp/dp/478191229X
0665デフォルトの名無しさん
垢版 |
2018/09/03(月) 17:00:11.86ID:fBv9u5Bm
>>618

> そういう文法的になことには今は拘らない方がいい。

臭い物に蓋してんじゃねえ
無理に気になる必要はなくても
気になったのに誤魔化せって最低なアドバイスだ

学問そのものを全否定する暴論だ
0666デフォルトの名無しさん
垢版 |
2018/09/03(月) 17:42:03.71ID:kgEYN356
そんなに気になるならコンパイラを読めば良い
コンパイラを読まずにああだこうだと言ってそれを学問と言い張るのは今更ニーチェを読んで学問と言い張っているのと似ている
0669デフォルトの名無しさん
垢版 |
2018/09/03(月) 18:26:17.33ID:ttVcJTrG
組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006

この本は、日本の大企業から、C の専門家が数十人集まって作った。
この100ルールまで行かないと、教えられない

汎整数拡張・副作用完了点・短絡評価・bool とか、各概念が難しい。
とても初心者に教えられない

特に学生なんて、現実を知らないから、文法があっていれば正しいと思う、
固定概念があるから成長できない

現実には、MISRA-C、100ルールに従わないと話にならない。
学生にはそういう事はわからないから、アホみたいなコードを書く

コードは、正しい文法で書いても、ダメだから。
可読性・保守性・バグを起こさない、Ruby みたいなコーディングが大切

だから、Rubyでプログラミング学ぶのが大切。
学ぶのは文法規則じゃない!

システムを作る・保守するためのプログラミング!
0670669
垢版 |
2018/09/03(月) 18:34:29.69ID:ttVcJTrG
Ruby の女神・女優の池澤あやかも、同じことを言ってる。
慶応大学卒だけど、大学で、C の授業は無意味だって

山陰地方のRuby合宿へ行って、webアプリが作れるようになった

Cの開発時間の大半が、ポインタ・バグでつぶれるから、プログラミングを学べない。
文法がわかるだけで、ものを作れないから楽しくない

だから、Cの授業の評判が悪い。
無意味な授業だよなって

だから初心者は、Rubyから初めて、まず動くものを作る
0671デフォルトの名無しさん
垢版 |
2018/09/03(月) 18:58:25.85ID:LFbByM25
最初の質問者は計算機の仕組みを知りたいのであってWebアプリを作りたいわけでもMISRA Cルールを知りたいわけでもない件
0672デフォルトの名無しさん
垢版 |
2018/09/03(月) 20:30:15.22ID:E2St7m4+
典型的な超頭悪そうなヤツラが
ひたすら長文連投してる
0679デフォルトの名無しさん
垢版 |
2018/09/04(火) 00:45:19.60ID:LzYZ2uc7
Cのスレに不毛な喧嘩売ってくるのは大体Cで挫折して、
劣等感を何とか慰めようとするカーミング行動だから気にするな
0681デフォルトの名無しさん
垢版 |
2018/09/04(火) 06:21:50.26ID:4a01gUXa
>>663 にある本の紹介文なのか宣伝コピーなのか、
「70年代のTRPGの生の感触がばりばり伝わってくるAD&Dの本」て部分を
どう解釈したら良いのか分からないのだ。

Cや「ドラゴン・ブック」、TRPG, AD&D って言葉くらいは知ってる者に
解題してくれないか。
ひどく野暮な質問かも知れないけど、聞くは一時の恥とか言うし、敢えて頼む。
0682デフォルトの名無しさん
垢版 |
2018/09/04(火) 08:45:47.28ID:HIB3dDVe
>むしろ計算機の仕組みなどを学びたいと思っています。

それなら情報処理の基礎なんかをやった方が良い様な気がする
今は基本情報処理とか言うんだっけか?
資格とかのやつよ
0685デフォルトの名無しさん
垢版 |
2018/09/04(火) 15:15:50.63ID:FJBPHmlL
>>653
武内覚さんのLinuxの仕組み片手にCやるのがおすすめ
ファイルIOとかなら、システムコール、VFS、FS、Raid、デバドラ、スケジューラー、SCSiまでユーザーランドからデバイスまで一貫して、かつお手軽に触れる
0686デフォルトの名無しさん
垢版 |
2018/09/04(火) 16:39:04.23ID:gZnu4stV
cの文法で書けるだけの
無能を自覚できてない低学歴知恵遅れの高齢底辺ITどかたに多い
0687デフォルトの名無しさん
垢版 |
2018/09/04(火) 17:30:33.56ID:DgdW8Zal
お。半角文字の入ってない書き込みを久しぶりに見たような気がする。
0688デフォルトの名無しさん
垢版 |
2018/09/04(火) 17:53:50.88ID:gZnu4stV
底辺ITドカタさんたちは
今日みたいな台風の日も自宅待機ではなく
出勤でしたか

大変でしたね
0689デフォルトの名無しさん
垢版 |
2018/09/04(火) 18:52:18.48ID:Yl2cIsi8
台風で東海道線や環状線が止まるのはまあ想定内だったが阪急や京阪まで止まるのは想定外だったわ
0691デフォルトの名無しさん
垢版 |
2018/09/04(火) 20:22:39.67ID:GSpvNdv5
やっぱワンチップマイコンでアセンブラがいいよ。
クリスマスに向けてLEDチカチカさせてジングルベルでも鳴らしてみるとかどうよ。
0694デフォルトの名無しさん
垢版 |
2018/09/04(火) 21:54:25.98ID:Uy+TuYSZ
>>683
向いていないね。それは臭いから分かる。お前は本当の「天然」ではない。
以下参考だが、結局中身は同じだ。
> 一撃必殺!急にマンガ家だの声優だの絵師だのになりたいと言い出した子どもや大人を止める、オススメの方法
> https://togetter.com/li/1130025

今はプログラミングなんて本当に簡単に始められる。そのレベルでグダグダ質問している時点で向いてない。
本当の「天然」なら、もう既にとりあえず何かしらのコードを書いてる。
お前は勉強しないと何も出来ないと考えている「いい子ちゃん」タイプだ。
そういう奴は自分でサイクルを回せず(=暴走出来ない)、上手くなれない。
無理してプログラマになっても、後輩に簡単に抜かれ、馬鹿にされる、悲惨な人生になるぞ。止めとけ。
(ここ見るだけでも老害を馬鹿にしたがっている奴はいくらでもいるのが分かるだろ)

ベーマガ世代だって理解してやっていたわけではない。やりたくてやってただけだ。
先に数学をやった方が効率が良かったはずだが、そんな事は考えてもいない。

お前は、サッカーをやる前に、筋トレして体幹も作り上げ、万全の状態にしようとしている。
勿論そういうのもありだが、それはやはり「養殖」なんだよ。
「天然」はそうじゃない。サッカーをしながら、もっと上手くなりたいから筋トレして体幹も作っていく。
好きだから続けられるし、環境が多少酷くても我慢出来る。(これがIT産業がブラック化しやすい遠因にもなってる)
そういう「天然」向け仕様の環境で、「養殖」では悲惨なことになる。
(勿論、プログラミングをやってみてから好きになる、というのもありだが、それはかなり少数派だと思う)

向いてる/向いてないで言えば、
ちょっとコードを書けるようになって調子に乗ってここで俺ツエーしている馬鹿共の方が向いてると言える。
0695デフォルトの名無しさん
垢版 |
2018/09/04(火) 21:55:26.59ID:Uy+TuYSZ
今はプログラミングの裾野が広がって、絶対的な人数が全く足りてない。
だから文系をSEとして大量投入してみたものの、いい結果がでたとは言いがたい状況だ。
それで次は「小学生からプログラミングを教える」「国民全員がプログラミング出来るように」
みたいなアホなことをやろうとしているのだが、これは完全に愚策だ。
プログラミング出来ない/したこと無い奴らが仕切ってるからおかしなことになってる。
それにお前がつき合う必要はない。

教育改革ってのは取り返しが付かない人体実験になるから、性急にやっては駄目なんだ。
この認識すらなくゆとり教育を導入した文化省の連中は、
今からでも全員死刑に処すべきだと俺は思っている。
(それくらい罪深いし、社会に対して悪影響を及ぼしている。日本はミスリードに甘すぎだ)
今の「小学生からプログラミング」についてはどうやらお遊び程度だからまあいい。
やるにしても当初はこの程度で様子見しながら拡大するか取りやめるか試すべきなのさ。
(俺は意味無いから止めろと思っているが)

今時PCもスマホもない家なんて珍しいだろ。
なら初心者用のプログラミング環境はすぐに整えられるし、勝手に始められる。
だからそのレベルでこんな所に質問してる時点で間違ってる。

天然:何故プログラミングをするのか?そこにPCがあるからだ (単にいじくり回したいだけ)
幼稚園児:ケーキ屋さんになりたい!(だってケーキ大好きだしもっと食べたいから)

お前には幼稚園児が「ケーキ屋さんになりたい!だってお金儲かるし!」
みたいな事を言っている違和感がある。
初心者の癖に計画しすぎだ。必要があって否応なしに始めるわけでも無し、意味不明すぎる。
そういう奴も中にはいるのかもしれないけどさ。
ただ、確実に言えるのは、プログラミング界隈は良くも悪くも全般的にギーク向けに出来上がってる。
お前がギークになりきれないのなら、ずっとアウェイのままだ。
それは幸せなことではないと思うよ。
0699デフォルトの名無しさん
垢版 |
2018/09/04(火) 23:14:17.99ID:gZnu4stV
オレみたいに的確に要点をまとめてる長文なら読める
低学歴知恵遅れの長文は読めるシロモノじゃないからな

文章だけで低学歴知恵遅れかどうかは
簡単に判別できる

このスレに連投されてる長文の駄文は
低学歴知恵遅れが記述したと推認することに疑いの余地がない
0700デフォルトの名無しさん
垢版 |
2018/09/04(火) 23:17:12.74ID:Yl2cIsi8
必要なら数学の知識などなくても感覚で覚えるからな
座標計算の必要があれば三角関数など知らない小中学生でもsinやcosくらいは使う
0701 ◆QZaw55cn4c
垢版 |
2018/09/04(火) 23:26:47.20ID:lJV/Mb/R
>>700
小中学生に三角関数は無理でしょう…まず相似の概念を習うのが中学2〜3年くらいなのでは?
0702デフォルトの名無しさん
垢版 |
2018/09/04(火) 23:31:24.63ID:dqoEXQdt
数学は教科書で勉強しないとあかんよ
経験で得た知識なんてただの思いこみ
0703デフォルトの名無しさん
垢版 |
2018/09/04(火) 23:46:19.73ID:Yl2cIsi8
思い込みでも何でも使っているうちに覚える
自分の場合は30年以上前中学生の頃に画像処理のプログラミングしている間に三角関数(といってもX座標はcos、Y座標はsinといった程度)や
論理演算(RGBの合成はOR、反転はXORなど)を覚えた
その後になって高校の頃に教科書でまともに学んだ覚えがある
0704デフォルトの名無しさん
垢版 |
2018/09/05(水) 00:03:44.17ID:ElSUubWJ
>>701
三角関数が何なのかは分からなくても、sin と cos を使うだけなら小学生でも定型文的に覚えちゃうんじゃね(おれは中学の頃だったが)。
円を描くところから始まり、直径を変化させると渦巻きにできたり位相や周期を変えて橢円やらリサージュになることに気付いたりで、
パラメータをやみくもに変えて手探りで欲しい結果にたどり着くようになる。
もちろん円的な動きの元ネタは必要で、ベーマガみたいなののコードをパクって出発だな。
小学生の頃はファミリーベーシックだったので三角関数には行き着かず、中学生でMSXになって三角関数に出会ったが、小学生の頃にMSXがあれば手を出してたと思う。
0705デフォルトの名無しさん
垢版 |
2018/09/05(水) 00:11:58.72ID:ElSUubWJ
そういや小学生のころはスーパーマリオが出たころで、ファイアバーをどうしても再現したくてファミリーベーシックで頑張ってたわ。
三角関数に行きついてないから、角度の範囲毎の動きを個別に書いたな。
でも長さが伸び縮みしたり軌跡がカクカクで、結局将来の夢に据えてお仕舞いにしたw
0706デフォルトの名無しさん
垢版 |
2018/09/05(水) 00:29:02.76ID:TND9Xsam
ニュー速で話題にしていた、CLA Fortran プログラムですが、
C言語への移植が終わりました。
公開方法について、検討しています。
↓ここを使おう蚊と考えています。
https://ideone.com/

C言語へ書き換えたソースと、入力用データとパラメータの3つですが
入力用データとパラメータについては、サンプルに掲載したものと同一
なので公開は必要ないかも知れません。
ただし実行するには必要になります。どうしましょうか?
テキストファイル形式で単独でアップロードするか、
ソースの一番下にコメントとして載せるかどの方法が良いでしょうか?
あと、オリジナルFortranソースもアップロードした方が良いですか?
これは以前PDFを見つけてくれた方がソースに起こして頂いたものです。
0708デフォルトの名無しさん
垢版 |
2018/09/05(水) 00:56:31.50ID:8BhrS90z
>>694
>>695
よくわからんのだが、お前が相手をしてるそいつはなぜプログラミングを初めたいと思ってると思ってる?
よくわからんのだが、ギークとかなんやらの最初とそいつの最初の具体的な差がよく分からん
0709デフォルトの名無しさん
垢版 |
2018/09/05(水) 07:35:22.74ID:p5l66rRv
C言語ポインタ完全制覇っていう書籍が気になってるんだけどこれはどの程度の知識がある人を対象にしてるの?
0710デフォルトの名無しさん
垢版 |
2018/09/05(水) 08:20:43.64ID:2JdbfNpR
どの程度っても難しいなw
簡単なポインタは分かるけど、二重ポインタとか配列が絡むと混乱しちゃう程度の知識の人向け?
初心者なら悪い本じゃないから買っちゃえ。
0711デフォルトの名無しさん
垢版 |
2018/09/05(水) 10:04:35.05ID:TsbO/g0i
>>701
円を書く時に使えると聞いて確かに書けるので使っていて、後で高校生向けのやたらやさしく書いてある図と絵が満載の参考書を見てどういうことか詳細がわかった。俺が中2の時の話。

で、今思うに、これぐらいならちゃんと教えれば小学生でもわかるんじゃないか?俺としては単に教えてないからできないだけのような気がしてならないぞ。

しかし後々高校に入ってから数学の授業で「これ割るこれがsin」などと教師が言ってるのを見て、こんな説明だけでわかるやつはいないだろうとも思った。
ちゃんと教えられる人があまり居ない事もわからないやつを続出させる原因なのかもなと。
0713デフォルトの名無しさん
垢版 |
2018/09/05(水) 10:29:11.29ID:jTYdKpzW
sin,cos,tanそのものはアホな小学生でない限り余裕で理解できる。
ただ、それに付随した加法定理やらいろんな公式をセットにして教えたいし、それより先に教えることがたくさんあるので>>711の言っている通り教えてないだけだと思う。
0714デフォルトの名無しさん
垢版 |
2018/09/05(水) 10:29:52.26ID:TP9d0IJd
せんせい
「同じ授業を受けていい点数を取る生徒ももいるんだから、悪いのはIQの低い君達」
「分かる奴は塾に行ってる?じゃあ悪いのは君達の努力不足だ」
0722デフォルトの名無しさん
垢版 |
2018/09/05(水) 12:59:20.81ID:TsbO/g0i
三角関数の説明に三角形だけの図を描いてこれ割るこれとか言って済まそうってのは手抜きな感じがする。やはり円も描かねば。

ま、しかし、sin. cos 使って円が書けるのがわかったのは良いが、当時のマイコンは貧弱で浮動小数点演算なんかやらせてたら遅くて仕方がなかった。
しかしBASICでグラフィックに円を描かせると妙に速い。正数計算して描いてるからだが、どうするとそんなことができるのかを延々と探り続けてようやっとわかったのが高校生になってからだったかな。
今はもうほとんど覚えてないが二乗して足してってオーバーしたら引いてみたいな計算したと思った。
0723デフォルトの名無しさん
垢版 |
2018/09/05(水) 13:00:45.01ID:TsbO/g0i
>>717>>720
まあ40年ぐらい昔の話だからね。
0726デフォルトの名無しさん
垢版 |
2018/09/05(水) 13:15:30.75ID:Lw38WY1e
>>722
それってブレゼンハムやミッチェナーのDDAアルゴリズムを利用した直線や円周の高速描画だろ
懐かしいな
0727デフォルトの名無しさん
垢版 |
2018/09/05(水) 13:22:45.26ID:TsbO/g0i
>>726
何て言うのかは知らなかった。何かのプログラム解析してわかったんだったかな。その辺は忘れた。
直線も足してってオーバーしたら引くみたいなやり方だよね。今ではハードウェアで組み込まれてるんだろうな。
0728デフォルトの名無しさん
垢版 |
2018/09/05(水) 13:24:01.11ID:ElSUubWJ
>>725
ポインタが指す先が const の場合とかポインタそのものが const の場合とかさらに volatile が組合わさったりさらにそういうののポインタだったり配列だったり関数ポインタまで入り込んだりした場合に、
正確に型宣言したり読んだりするには結構修行が必要だからいろいろややこしいことが書いてあるんじゃないか
0729デフォルトの名無しさん
垢版 |
2018/09/05(水) 13:27:13.74ID:TND9Xsam
>>722
>当時のマイコンは貧弱で浮動小数点演算なんかやらせてたら遅くて仕方がなかった。

この辺は工夫次第
8bitPCが全盛だった頃、動く3Dオブジェクトを表示するのに機械語で演算処理組んでいた
全部整数化し、SIN関数値は全部テーブルで持たせていたな
試して見れば分かるが実際に必要なテーブル範囲は90度もいらない
0730デフォルトの名無しさん
垢版 |
2018/09/05(水) 13:37:21.57ID:7JsiFjUt
敵の弾が自分めがけて飛んでくる
ってたったそれだけでも中学の頃は大変だったな・・・
なつかしい
0731デフォルトの名無しさん
垢版 |
2018/09/05(水) 13:47:10.12ID:ElSUubWJ
>>730
大変だった
どんな式を立てたかは忘れたが、角度によって弾の速さが変わっちゃったりして試行錯誤してたな
0732デフォルトの名無しさん
垢版 |
2018/09/05(水) 13:51:42.60ID:mkiFi/5o
1フレームごとに最短距離で追尾してくる最も厄介なミサイルが実は一番簡単
0733デフォルトの名無しさん
垢版 |
2018/09/05(水) 14:58:15.54ID:jTYdKpzW
もうすでにC言語なんか関係なく回顧厨になっとるな。
俺も乗っかろう。
昔はBASIC標準のライン描画やらペイントルーチンが遅いので、いかに高速なアルゴリズムを作るかパソコン雑誌の特集になってたりしたな。
超高速中間色対応ペイントルーチン!みたいな。
ある意味、良い時代だった。
0741デフォルトの名無しさん
垢版 |
2018/09/05(水) 22:58:16.11ID:Lw38WY1e
重ねるというよりも隣接するドットを違う色で決まったパターンで表示することで
擬似的に色調表現するテクニック
基本的に8色しか使えなかった頃に多色表現するために開発された手法
複数ドットでひとつの点を表現するためにいかに自然に見せるかといかに高速化するかが
プログラム的に腕の見せ所だった
0742デフォルトの名無しさん
垢版 |
2018/09/05(水) 23:26:42.92ID:ElSUubWJ
cleartype はそういうのじゃなく、三原色の並びを利用して擬似的に横方向の解像度を上げる方法でしょ。
1画素内に三原色が RGB と並んでた場合、それを2画素並べると以下のように画素の分解能を超えた位置に白点を表示できる。

RGB___ 白黒 … 座標 0 に白点
_GBR__ シアン赤 … 座標 1/3 に白点
__BRG_ 青黄 … 座標 2/3 に白点
___RGB 黒白 … 座標 1 に白点
0745740
垢版 |
2018/09/06(木) 05:55:34.60ID:UQb09hzL
すまん、投稿が受け入れられたタイミングがマズくて
>>739 に対する反応みたいに並んでしもうた。
>>740>>739 の「マゼマゼする原理は同じ」に乗っかったネタ文だ。

R成分100%とB成分100%をマゼマゼして、HTMLの16進表記で#FF00FFの色を作ったら、
「そりゃ“マゼンタ”だよ、バカだねぇお前さんは」という想定(しかし破綻)。
0746740 == 745
垢版 |
2018/09/06(木) 06:16:09.23ID:UQb09hzL
もちろん「マゼマゼ」は >>738 だよ、引用アンカーを間違えるとは。
マゼマゼでダメダメ。再び「バカだねぇお前さんは」
0747デフォルトの名無しさん
垢版 |
2018/09/06(木) 09:31:52.28ID:/8o/0CpY
>>745
ん?俺は別に煽られたとは捉えてないし問題ないぞ。
そもそも話が通じないのは「抽象思考」が出来てないからだ。

三角関数で → 円も描ける、であって、(演繹)
円を描く為には → 三角関数、ではない。(暗記)

とはいえ適用する場合は大体お約束的だし、
大学入試なんて解けるように作ってあるのだから、「暗記」タイプでも努力すれば数学の点も上げられる。
しかしそれでは駄目なんだよ。意味がない。
そして小学生に三角関数を教えても「暗記」にしかならないから、その時点で教えるのはやはり間違っている。
> これ割るこれがsin (>>711)
これも、結局の所これ以外にどう表現しろと?という話だからね。

これが嫌だったのなら教育関係に就職して改革すべきだが、
実際ゆとり教育を先導した戦犯役人はこのタイプだった(はずな)ので救えない。
理解出来なかった奴が「俺が理解出来なかったから」という理由で主導するからおかしな事になる。
今現在の「プログラミング教育導入」もこれに近く、
そもそもプログラミングできない/やったこと無い奴らが主導してるから暴走してる。

三角関数なんて、円以外で適用される場合の方が多い。
それを過度に円に結びつけるのは数学としては間違っている。
単振動なんて、本来は円運動とは関係ないだろ。あれはma=kxの解がsinxだって話であって。
内積が|a||b|cosθになるのだって、円なんて全く関係ないし。
三角関数は、「偶々そういう関数を定義したら、何か知らんけど色々使える」であって、その見方だと
> これ割るこれがsin
になってしまう。これ以外に表現しようがない。
逆に、「宇宙の全ては円で出来ている」(なぜなら三角関数が適用出来る場合が多いから)
という捉え方も出来なくはないが、こっちの方がカルトだろ。
おそらく、数学の発達過程で他にも色々関数が定義されて、でも使えない物は淘汰されて、
結果的に今の三角関数だけが残ったのだと思うぜ。
0748デフォルトの名無しさん
垢版 |
2018/09/06(木) 09:33:21.82ID:/8o/0CpY
中間色/CoolType./AAも、俺にとっては「隣接するピクセルを用いて中間値を表現すること」で同じだ。
お前らはそれを
・フォントの場合
・色/ピクセルの場合
と別々に覚えてるから別物に見える。それはお前らの脳内が「暗記」ベースだからだよ。

暗記ベースでプログラミングの上達を目指すのは「デザインパターン」だ。
しかしこれも必要以上に細分化し、しかもJava文法が足りない点を必死で補っていたりで、
はっきり言ってポシャったろ。あれでは無理があるのさ。
勿論、「暗記」しかできない奴はいまだにそれにすがり続けているようだが。

ただ、実際の所、プログラミングは当然実装出来ると分かっている範囲で為されることが圧倒的に多いので、
「暗記」ベースの手法でもほぼ全ケースで何かしらの適用が出来、対応出来る。
だからそんなに問題にはならず、ある意味Javaプログラマが一定レベルまで順当に成長するのはこれがある。
ただ、「暗記」ベースだと、知らない事は発想出来ない。別物扱いだから。
中間色を「抽象思考」で捉えているのなら、
方向を変えて適用した結果がCoolTypeでありAAでしかなく、これらは自然に連結する。
この点がずいぶん違う。
0749デフォルトの名無しさん
垢版 |
2018/09/06(木) 09:34:16.38ID:/8o/0CpY
この点に於いて、「暗記」ベースの奴は文法リッチな言語、JavaやC++の方がいい。
というかな、プログラミングが上達する奴と全く上達しない奴が居て、
別段人間的に問題がある(全く努力をしてない)訳ではないのが不思議だったのだが、
今のところの俺の結論はこれだ。
「暗記」ベースの奴はCやJavaScript等の文法がスカスカな言語では上達しにくい。(上達出来ない)

文法リッチな言語だと、「この文法はこのときに使う」というやり方で、
「プログラミングパターン」を「暗記」で積み上げることが出来る。
(これは本来「デザインパターン」と呼ばれるべき物だが、
この用語は継承をこねくり回したゴミの呼称となってしまっているので、敢えて別に命名する)
だから、文法を一通り押さえれば、知識としてのプログラミングパターンを一定量積み上げることが出来、
結果、一定までは確実に上達するというわけだ。
Javaはこの手法で平均レベルのプログラマを大量確保出来ている。

ただし逆に、文法等の暗記事項に計上されてないと、彼等は上達出来ないので、過度に暗記にすがる。
これが今の「デザインパターン」の状態だ。必要以上に細分化し、また、無駄に増やし続けている。
彼等にとっては新規パターンの登録と暗記がすなわち上達であり、それ以外に方法がないからだ。
したがって、今後ともこの暴走は続く。

C++erで言えば、彼等は shared_ptr/unique_ptr/weak_ptr の使い方にはご執心だが、そこまでしか見えていない。
次に導入されようとしている observer_ptr については必要性も使い方も分かっておらず、理解も出来ない。
なぜなら、「暗記」出来るのはそれらが定義されて以降であり、
「暗記」では現在未定義の物を演繹的に作り出すことが出来ないからだ。
良くも悪くも、C++が文法リッチになる過程で、CerとC++erが自然発生的に分かれてきたのはこの辺だと思う。
Linusから見ると、C++の文法もデザインパターンと同様のゴミの山に見えているはず。
(JavaScriptなんて、たったあれだけの文法で、C++で表現出来る範囲を越えるのだから笑える)
0750デフォルトの名無しさん
垢版 |
2018/09/06(木) 09:35:06.90ID:/8o/0CpY
Cの場合には文法がスカスカだから、
ポインタで → 何でも出来る、とならないと上達しにくい。(演繹)
この場合は → shared_ptr、では無理だ。暴走出来ない。(暗記)
だから「暗記」ベースな奴は文法リッチな言語を選んだ方がいい。
(ただしポインタがあまりに汎用性がありすぎて最適化等に問題があり、
結果、他言語では色々制限を付けられてきたのはご存じの通り)

逆に「たったこれだけの文法で全て表現出来るなんてステキ」と思える奴は
CやJavaScript等の文法スカスカ言語の方が向いてる。
JavaScriptがゴミゴミ言われながらもここまで残っているのもこの点が大きい。
あれは使える奴が使ったら凄く使える言語だ。
ただ、今のJavaScriptプログラマの大半がゴミなのも事実だが。

Cの授業が全く無駄だ、という話も出所はここだ。
プログラミングなんて、結局、「代入、条件分岐、関数呼び出し、ループ」でしかなく、
ループですら代入と条件分岐で実装出来るのだから冗長だ。
一応チューリング完全であるbrainfuckは関数呼び出しすらないので、これも冗長とも言える。
そしてCの授業で行われるのはまさに「代入、条件分岐、関数呼び出し、ループ」だけであり、
これでどうやって初音ミクが歌って踊るのだ?と初心者には思えるだろう。
最終的にはGPUを介してVRAM上に代入(ラスタライズ)しているだけだとしても、
それが初心者に見えるはずもない。
(もっとも、今の3Dベースの2D《テクスチャとして貼ってるだけ》だと
ラスタライズ結果をVRAMに戻しているかも怪しいが)

ただ、MITがSICPを止めたのと同様、今時初心者がCをやる必要はない。
DrawLineで線が描ける、HTML出力したら絵が出る、で済む連中がCやるのが間違ってる。
逆に、デバイスドライバ等を書いたり、
計算機自体の専門家(HighPerformanceComputing)等を目指すならCは必修になる。
0753デフォルトの名無しさん
垢版 |
2018/09/06(木) 10:01:03.49ID:BRF//rri
メモリーリークについて質問です
プログラム終了時に残ってしまったものに関してはOSが解放してくれるから対処しなくていいと聞きました
今までデバッグしてメモリーリークが出ると無くなるまで結構あれこれやってたんですが全部無駄だったんでしょうか
0754デフォルトの名無しさん
垢版 |
2018/09/06(木) 10:10:29.24ID:2H4On29+
>>753
終了時には解放してもらえるけど、メモリリークしたままだと動き続けられないじゃん。
たまに再起動してもらうの?
0755デフォルトの名無しさん
垢版 |
2018/09/06(木) 10:21:17.68ID:BRF//rri
あーいや想定してるのはちょっとした処理を行って出力して落ちるだけのプログラムなんです
ループの中で何回もmallocしてメモリを食いつぶすとかそんなことも無くて、ただ終了時まで動的確保した変数が解放されてないみたいな
そういう状況でお願いします
0756デフォルトの名無しさん
垢版 |
2018/09/06(木) 10:37:52.78ID:2H4On29+
>>755
そういう限定的な条件では解放は省略するって方針もあるかもね。
終了パターンがいろいろあると解放するだけでも一苦労だったりするし。

ただせっかく作ったそのコードは制約が多く他には転用しづらかったりと資産としての価値は低いと思う。
そもそもデバッグでメモリリークを発見とか言ってるとなると、メモリの管理はしっかりしてて解放を省略していることも設計に入ってる、という状況ではないんじゃないの?
それはメモリを管理できてないってことじゃないのかな。
そんな場当たり的なことやってると大きなコード書けないよ。
メモリリークを潰させるのは、メモリを解放すること自体が目的というよりメモリを管理させる教育的な目的じゃないかね。
0757デフォルトの名無しさん
垢版 |
2018/09/06(木) 11:35:05.98ID:BRF//rri
いや教育というか、上司が作ったAPIを利用して機能作れって指示が出ててですね
そのAPIが上で説明したように変数解放しないままプログラム終了してたって状況です
んでこれいいんですかこうすれば治りますがみたいなこと言ったらいいんだ勝手に解放されるかと

ともあれそういう方針が有りだということは分かりました。どうもです
0761デフォルトの名無しさん
垢版 |
2018/09/06(木) 12:07:29.83ID:NrF/VtsZ
そのAPIを流用するのは難しいな。
しないつもりなのかも知れないが。

まあしかしできればメモリリークしない方が良いな。
そのままだと常駐するプログラムのループの中で使えないし。
0762デフォルトの名無しさん
垢版 |
2018/09/06(木) 12:44:35.90ID:5MBNHP4w
>>757
上司の指示ならそのままにしとけばいい
メモリーリークしてもプロセス終了で解放されるから問題なし
って言う奴は一定数いて説得しても改心しないから放置しとくしかない
後々何かで事故った時のためにドキュメントに書いとけ
0763デフォルトの名無しさん
垢版 |
2018/09/06(木) 13:36:44.44ID:N1zpzsdE
たいていドキュメントは失われるので俺ならソースコメントに書いておくな。
「2018/09/06 メモリ解放してないので注意(先輩の指示で改修見送り)」
0764デフォルトの名無しさん
垢版 |
2018/09/06(木) 14:37:14.38ID:3QzfQDga
そりゃ、そういう状況では解放処理は抽象的な書き方にすべきなんですよ。
freeがなければ安心できないのって病気に近いよ。
0765デフォルトの名無しさん
垢版 |
2018/09/06(木) 19:28:33.32ID:5MBNHP4w
どういう状況か知らんけど
> こうすれば治りますがみたいなこと
言ってるにも関わらず対応しないのは宗教に近いよ
0766デフォルトの名無しさん
垢版 |
2018/09/06(木) 19:34:20.37ID:hjZ1m3yx
>>755
mayersだったかdinkumの人だったか忘れたけど、これはリソースリークじゃないって力説してて、
自分も同じセリフを言ってみたくてmain関数で確保したものを開放せずにいたら、
あとからそのmainだった関数に再入しないといけない要件が増えて涙した。
(小物ツールだったのに…)

というわけでfreeしようぜ
0767デフォルトの名無しさん
垢版 |
2018/09/06(木) 19:56:53.52ID:/8o/0CpY
>>757
> ちょっとした処理を行って出力して落ちるだけのプログラム
> 上司が作ったAPIを利用して機能作れって指示
× API
○ ツール

上司が作ったちょっとした「ツール」を使って(データの一部を切り出してきて)パイプ等で受ける場合、
そのツールがプロセス終了時に解放してないと文句を言うのは煙たがられる。
それは「意識高い系」すぎるし、そもそも君の担当範囲に何も悪影響はない。
そんなことはいいからお前の担当部分のバグを直せ、と思われているはず。

一応言っておくとfreeもタダではないので速度は落ちる。
必ずその後にプロセスが終了すると分かり切っているのなら放置もありだし、そっちの方が速い。
大方、精々1000行以下の上から下までつるっと動くだけのプログラムで、
最初に1回ワーク領域としてmallocして終わり、のパターンだろ。
割とどうでもいいね。実行形式のみでの配布なら問題になることはない。
(俺ならfreeしておくが。理由は>>766と同じで、流用するときにバグるから)

なお「API」では通常、別プロセスを起動して呼び出すことはない。(俺の知る限り)
本来「ツール」と表現すべき所を意図的に「API」と言うなら、相当な悪意だと受け取られる。
ただ単に間違ったのなら、お前は上司に対していちいち文句を言わず、
指示されたようにやるべきレベルだ。わきまえた方がいい。

ソースコードにコメント、は止めた方がいい。そこは上司への不満を書く場所ではない。
直すなら「潜在バグ」として正式登録、その必要がないと判断するなら放置したほうがいい。
数年後、君によって後輩が助かれば君は讃えられるだろうし、
そうでなければ君は痛かった奴だなと思われる、ただそれだけの話だ。
コメントだけ残して修正してませんでした、ってのはマジで痛いだけだから止めとけ。
誰も助からないし、生産性がない。
(バグを踏んだ後輩から見れば責任逃れせずにちゃんと直しておいてくれ、としか見えない)
そもそもそのツールがバグってたのなら作った上司の責任だし、
上司がそれを面倒がるのなら、そのソースの管理責任を君が受け取って自由に出来るはず。
0768デフォルトの名無しさん
垢版 |
2018/09/06(木) 19:59:05.01ID:xdo6cDUj
そんなに速度のことが気になるなら、グローバルでドカッと変数確保すりゃ良いだろう
0769 ◆QZaw55cn4c
垢版 |
2018/09/06(木) 20:06:34.02ID:N2ZzCqNY
>>755
きちんと malloc() した領域を free() できているように、それを重点的に書き直していくだけでも、プログラムの構造がわかりやすくなり、バグも少なくなるとおもいます
0770 ◆QZaw55cn4c
垢版 |
2018/09/06(木) 20:08:11.19ID:N2ZzCqNY
>>768
そうそう、malloc() したポインタを線形リストに登録しておいて、最後にまとめて free() するとか…
0772デフォルトの名無しさん
垢版 |
2018/09/06(木) 20:12:16.01ID:xdo6cDUj
ツールに使う程度の小規模なプログラムなら、
グローバルで取ろうと気にしなくて良いと思うけどな
0773デフォルトの名無しさん
垢版 |
2018/09/06(木) 20:16:36.65ID:/8o/0CpY
>>768
さすがにプロセス起動/終了の方がfreeより100倍以上重いはずなので、
ここでfreeを速度の為にケチる、というのはナンセンス。
ただ、free一個分速いのは事実だし、Cは精神論的に速度を希求するからねえ。

多分、最初はグローバルで固定長バッファだったが、
もっと大きなサイズも必要になって、面倒だったからど頭でmallocに変更、だと思うよ。
割とありがちなパターンだし、この場合はfreeしない文化のような気もする。
0774デフォルトの名無しさん
垢版 |
2018/09/06(木) 20:32:13.62ID:5MBNHP4w
最近はあまりないけど実メモリーがカツカツの状態だとfree()する為にディスクからページを読み込む処理が大量に発生してなかなかアプリケーションが終了しないと言う事があったりする
0776デフォルトの名無しさん
垢版 |
2018/09/06(木) 20:38:25.83ID:64ZwjQvb
freeしてないコードを池沼が書いて

freeしてないコードを
実績があるコードといって池沼が確かめもせずそのままコピペして流用する

よくあること
0777デフォルトの名無しさん
垢版 |
2018/09/06(木) 20:40:44.45ID:64ZwjQvb
つまり池沼の代重ねで
どんどんメモリリークが酷くなっていく
0778デフォルトの名無しさん
垢版 |
2018/09/06(木) 20:49:38.63ID:u/2SwpDg
dtr は作るけど、コメントに「プロセス終了時にしか実行しないのでfreeしてない」と書いて放置してるわ
0779デフォルトの名無しさん
垢版 |
2018/09/06(木) 20:57:43.99ID:/8o/0CpY
>>774
ああ、なるほど。
そういえばスワップがある時にFireFoxを落とすだけでもずいぶんかかっていたのを思い出した。
なるほどそこでスラッシングしてたのか。
0780デフォルトの名無しさん
垢版 |
2018/09/06(木) 21:05:57.78ID:2H4On29+
>>779
うちの FireFox も終了時にモタモタしてるから、そうなるのが分かってる時はタスクマネージャーで殺したりするw

つかアプリは終了時に保存するもの保存したらリソースそのままで exit しちゃう方がいい気がしてきたわ。
0781デフォルトの名無しさん
垢版 |
2018/09/06(木) 21:22:48.78ID:lfEPMv1j
freeでスワップからページ読み込みするってマジ?
freeだけならdirtyページドロップするだけだと思ってたわ
0782デフォルトの名無しさん
垢版 |
2018/09/06(木) 21:38:33.95ID:iyjSCMca
freeがいちいちSVCなんかするわけねえだろ
それと、おまえスワップとページを混同してるな
0783デフォルトの名無しさん
垢版 |
2018/09/06(木) 21:42:11.21ID:RfogV38/
>>781
ポインタ書き換えたりするから一度ディスクからメモリに戻さざるを得ないのでは?
ものすごく大きい領域を一括で確保した場合は全部戻す必要ないけど細切れに沢山確保してあるのをバラバラにfreeしたらなりそうだよね。
0785デフォルトの名無しさん
垢版 |
2018/09/06(木) 21:52:07.32ID:SMB/Y5b1
ランタイムの実装とOSにどう伝えてるかの間のことを考え出すと激しく禿る思考停止
unix/linux な人はどう実装してるか確認してるの?
0786デフォルトの名無しさん
垢版 |
2018/09/06(木) 21:54:14.48ID:N6MGums/
>>782
そうなの?
例えばWindowsだとfreeは内部でHeapFreeをコールしてるのかと思ってた。
HeapFreeって恐らくSVC伴うよね?
0790デフォルトの名無しさん
垢版 |
2018/09/06(木) 23:53:41.06ID:iNL3W5R4
>>781
単純に free だけの話じゃなく、自分が作り上げたオブジェクトツリーを辿りながら free していく過程でその(結局解放する)オブジェクトをページインすることになる。
C でオブジェクトとか言うことの是非は置いといて。
0791デフォルトの名無しさん
垢版 |
2018/09/07(金) 00:04:11.13ID:oKo9UKIA
>>787
Windows7 で 3GB。
Linux な家サーバだと 1GB。
Cプログラミングスタイルも細かくブロック分けてスタック節約するようなセコセコ型が基本。
0792デフォルトの名無しさん
垢版 |
2018/09/07(金) 06:00:25.35ID:Pk3Mmzkj
個人で使うための大したことないツールだったか、
この件の実験用に作ったプログラムだったか忘れたけど…。

そこそこ沢山のデータを、ひとつ読み取ってはmallocで確保した領域に保存、
ハッシュテーブル(値が重複する要素はリンクド・リストでつなぐ)にブチ込んで
個々のデータはプログラム終了まで破棄しない、て条件。

終了前に真面目にfreeして回るのと、そのままexitしてOSに片付けてもらうのと、
比較してみたらfreeのループ処理が意外に重かったんで、
解放処理の関数を残したまま呼び出し部だけ注釈にして、
// 解放すべきだと思いつつも無駄に重いんでOSに上手いことやってもらう
みたいな自分用のメモを残したわ。我ながらどっちつかずの折衷案。
0793デフォルトの名無しさん
垢版 |
2018/09/07(金) 07:56:45.53ID:ZG8Bsw3G
>787
Win7以降で最低4G、可能なら8G。3Dゲームやるなら16G以上。
XP時代は2Gか3Gだった。
0795デフォルトの名無しさん
垢版 |
2018/09/07(金) 08:06:16.22ID:1SEeRaQU
メモリを確保しっぱなしでわざわざ明示的に解放コードを書かないことはある
C++じゃなくてCだと特に

組み込みだとそもそも終了処理なんて物が無かったりする
0796デフォルトの名無しさん
垢版 |
2018/09/07(金) 08:35:25.77ID:Ge6Y8svS
>>792
(俺はそういう状況に遭遇したことがないが、)やるなら、
freeを生かしたまま残し、その直前でexit、
exitに「// free が遅いからここで強制終了」とコメントかな。

そもそもCはやたらfreeするようには出来てない。それはK&Rのfree実装をみても明らかだ。
C++や他GC言語のようにインスタンスを個別にmalloc/freeした方が
プログラミング的に美しく、自由度があるのも確かだが、
古来C流なら
> 個々のデータはプログラム終了まで破棄しない、て条件。
が分かっている時点で纏めてmallocし、内部的に切り出して使う、とかじゃないかな?
大きなテキストを1発mallocで確保し、内部的に改行コードで区切って使うみたいに。
初期データはインミュータブル扱い、追加/変更はインスタンス毎個別に確保、だ。

ただこれだと結局コードは増えてしまうし、個別freeすべきかのフラグを導入するか、
解放関数でインミュータブル領域かどうかを判定する必要がある。
そういうのが面倒だと最初から全部C++流にインスタンス毎個別に確保になり、
その分動作が遅くなるが、コード自体は綺麗に(統一的に)保たれる。
結局、コードを取るか、手間かけてその分高速化するか、でしかない。
気にならない程度なら、俺はC++流の個別確保の方がコードが綺麗だからいいと思うが。
(つまり今の君の実装)
気になるのなら、選択の余地無く高速化するしかないし。
0797デフォルトの名無しさん
垢版 |
2018/09/07(金) 08:38:20.43ID:oKo9UKIA
>>795
むしろ C++ の方が気安く new するから、そっちの方が放置したくならないかね。
根っこのオブジェクトを delete すれば後のはデストラクタがやってくれるとかで面倒さは少ないのかもしれないが。

何にしても、許されるのはきちんと解放できるけどあえてしない、ってのだけだな。
なんだかよく分かんないし面倒からOSに尻拭いしてもらうなんてのはダメだ。
fork で起こした子プロセスがメモリを free せず終了しても問題無いが、それをスレッドにしましょうなんてなった瞬間に破綻する。
0798デフォルトの名無しさん
垢版 |
2018/09/07(金) 09:28:39.55ID:8HJNQC7B
商業プログラムだとラッパだらけで直接free呼ばんし。
freeなしという選択肢は常に確保しとけばよい。
0802デフォルトの名無しさん
垢版 |
2018/09/07(金) 12:28:11.67ID:veel+fh4
>>801
スーパーバイザコールを拡大解釈して、いわゆる特権モードを伴うシステムコールとして書いてたわ。
誤解があったらすまん。
0804デフォルトの名無しさん
垢版 |
2018/09/07(金) 12:51:04.62ID:/+XJI6DP
>>802
おk
じゃあ、その前提で話を戻そう
freeはISO/IEC9899では宣言と引数の意味のみが規定され実装は未規定だ
782でああ言ったのは、freeする度毎にタイムスライスを放棄するような実装は
まずなかろうということだ
0805デフォルトの名無しさん
垢版 |
2018/09/07(金) 14:34:23.02ID:lg5TGvmQ
>>804
まず、786で書いたようにあくまで「思ってた」だけで確固たる根拠はないことを前提に。

freeするならどこからか借りていたメモリ領域を返却するわけで、仮想メモリ返却にはMMUを使ったページ管理が必要だよね?
仮想メモリページ管理はメモリマネージャー的なカーネルモードドライバが必要なはずで、つまり解放時にはシステムコールを伴う。

ただ、HeapFree時に直接カーネルモードで解放が実行されずメモリマネージャがガーベジコレクション的に後々回収するなら、あなたの言うとおりfree時にユーザーモードで閉じて処理されるかも。

このへん、Linuxとかどういう実装になってるんだろうね?
0806デフォルトの名無しさん
垢版 |
2018/09/07(金) 14:55:15.04ID:Yr/2DouQ
画期的なメモリ確保方式とか出来ないかな
例えばさ、名前付きタグを付けてメモリ確保し、
名前指定で一気に解放できるようにするとか
0808デフォルトの名無しさん
垢版 |
2018/09/07(金) 15:56:06.95ID:/+XJI6DP
>>805
freeがメモリを返却する相手が何者なのかは未規定だぞ
いちいちOSへ直に返しているとおまえさんの言うとおりだが
スタティックリンクライブラリがOSから大口で借りたメモリを切り売りする
スタイルならシステムコールの回数をガクンと減らせる
よくある実装は1MiBあたりを境に小容量は切り売りで大容量は直にという形
0809デフォルトの名無しさん
垢版 |
2018/09/07(金) 16:07:14.96ID:lg5TGvmQ
>>808
いや、俺はANSI Cとかの規定の話してるんじゃなくて、SVCって単語からこの議論がスタートしてるのでモダンなOS上の一般的な実装の話をしてると思ってたんだけど、違ったのか。

確かにアプリ起動時にある程度のヒープを最初から用意ってのはありそう。
0810デフォルトの名無しさん
垢版 |
2018/09/07(金) 16:15:46.30ID:lg5TGvmQ
>>806
ソフトで実現で良いなら、簡単に実現できそうね。
てかsmbか何かでそういう実装見たことあるような?
0811デフォルトの名無しさん
垢版 |
2018/09/07(金) 17:07:55.49ID:+cI6iexZ
>>805
Linux+glibcの環境なら、mallocは昔ながらのbrkシステムコールの方法と
mmapシステムコールの方法が状況に応じて使われる
freeしたときmmapをmunmapしてOSに返されることもある
はず。…たしか
0812デフォルトの名無しさん
垢版 |
2018/09/07(金) 18:11:36.24ID:lg5TGvmQ
>>811
なるほど、勉強になります。
やっぱりOSのメモリ管理をちゃんと理解しようとしたら参考になるので最低限glibcとmmapを読まないといけないね。
0813デフォルトの名無しさん
垢版 |
2018/09/07(金) 20:33:47.92ID:lg5TGvmQ
ちらっとmmapとglibc斜め読みしてみた。
こんな世界があるんだとソフトエンジニア7年目にして新しい視点が開眼しそう。
色々気付きをくれた方々、ありがとうございました。
0814デフォルトの名無しさん
垢版 |
2018/09/07(金) 23:08:07.85ID:Ge6Y8svS
>>806
ゆとりりゅうのすごいめもりかくほ、まで読んだ。

マジレスすると、
> 名前付きタグ
このコストが分からない馬鹿はCを学ぶ意味はあるだろう。
スクリプト言語しか使ったことのない奴に多いが。(例:ハッシュはタダだと思ってる)


>>805
> 仮想メモリ返却にはMMUを使ったページ管理が必要だよね?
お前は中途半端に勉強してるな。まあ悪いことではないが。
ページの単位は今も昔も4KBだ。その方法ではインスタンス毎の確保は出来ないと分かるだろ。

>>812-813
読むのは勝手だが、あまり関係ないところに深入りしても意味はないぞ。
7年目なら業務関連は一通り出来るようになっており、知識を横に広げているのかもしれないが、
OS関連の知識があってもな。

時間が有り余っていて手当たり次第に知識を吸収するのも一つの手だが、
もし大きい(10,000行以上)のを書いたことがないのなら、
まずは規模の限界(複雑さの限界)に挑戦する方がいいと思うが。
0815 ◆QZaw55cn4c
垢版 |
2018/09/07(金) 23:21:41.29ID:WaHB6+zk
>>814
>もし大きい(10,000行以上)のを書いたことがないのなら、まずは規模の限界(複雑さの限界)に挑戦する方がいいと思うが。
そうですね…
1万行ですか…
せいぜい 1000 行程度までしかやったことがありません、モチベーションが続かない・燃料切れ、という感じです
0817デフォルトの名無しさん
垢版 |
2018/09/08(土) 00:16:36.09ID:L3ZkEci+
だいぶ初歩の質問なんだけどextern宣言って本当に必須なの?コンパイラというかリンカによるのかもしれないけど、つけなくても同じ動作するよね?
今まで疑問に思わず書いてたけど、これを聞かれて色々試してみると実際つけなくても同様の動きしてるように見えるし、ちゃんと答えられなかったわ
0820 ◆QZaw55cn4c
垢版 |
2018/09/08(土) 00:43:40.72ID:t7GfMYxV
>>817
ライブラリ関数をコールするだけなら extern は要らない子です、でもライブラリが独自の変数を定義して公開しているのならば extern がないと困ります
例えば <stdio.h> の stdin, stdout, stderr
0821デフォルトの名無しさん
垢版 |
2018/09/08(土) 01:03:55.35ID:Bduckbke
>>817
> 1. Declaration can be done any number of times but definition only once.
> 2. “extern” keyword is used to extend the visibility of variables/functions().
> 3. Since functions are visible through out the program by default. The use of extern is not needed in function declaration/definition. Its use is redundant.
> 4. When extern is used with a variable, it’s only declared not defined.
> 5. As an exception, when an extern variable is declared with initialization, it is taken as definition of the variable as well.
> https://www.geeksforgeeks.org/understanding-extern-keyword-in-c/
下のコード例が見やすい。
これが規格と合致しているのかは知らん。
0822 ◆QZaw55cn4c
垢版 |
2018/09/08(土) 01:26:25.96ID:t7GfMYxV
>>821
しかし C には仮定義 "tentative definition" があったりして混迷するのです
ISO/IEC 9899:1999 6.9.2.2
the behavior is exactly as if the translation unit contains a file scope declaration of that
identifier, with the composite type as of the end of the translation unit, with an initializer
equal to 0.

私には、これはリンカの仕業であってコンパイラが自ら行動しているようには見えないのですが…
0823デフォルトの名無しさん
垢版 |
2018/09/08(土) 04:02:52.50ID:5gcJr6RX
glibc は malloc だけで 5000行あるってね。
上級者スレに解説動画があったけど面白かったよ。
0824デフォルトの名無しさん
垢版 |
2018/09/08(土) 09:36:45.93ID:gGqp1fFu
>>814
>ページの単位は今も昔も4KBだ。その方法ではインスタンス毎の確保は出来ないと分かるだろ。
ごめん、これがよく分かんない。
MMUのページ単位が4KBなのと、インスタンス毎の確保はできないってのがつながらない。
てかここで言うインスタンスって何?
0826デフォルトの名無しさん
垢版 |
2018/09/08(土) 10:01:56.96ID:gGqp1fFu
>>825
別に1回のmallocで必ずしも毎回4KBのベージを割り当てる必要ないのでは?
mallocするのが小さいサイズなら確保済みの4KBの空いてるとこから割り当てれば良いし。
実際にはどういう実装になってるか知らんけど。
0827デフォルトの名無しさん
垢版 |
2018/09/08(土) 10:10:27.96ID:3yA/EH7F
そもそも動的メモリ確保/解放と仮想メモリ管理は直接関係ない話
組み込みだとMMUなんて存在しない環境もある
0828デフォルトの名無しさん
垢版 |
2018/09/08(土) 10:12:51.74ID:Bduckbke
>>826
それだとお前のレス
> freeするならどこからか借りていたメモリ領域を返却するわけで、仮想メモリ返却にはMMUを使ったページ管理が必要だよね?
> 仮想メモリページ管理はメモリマネージャー的なカーネルモードドライバが必要なはずで、つまり解放時にはシステムコールを伴う。
と矛盾するだろ。
お前は日本語が駄目なタイプか?
0829デフォルトの名無しさん
垢版 |
2018/09/08(土) 10:15:40.02ID:gGqp1fFu
>>828
そういう意味では、厳密には「4KB以上のfree」と書くべきだったかな?
ページサイズに言及したのは先の書き込みの後なので別に論理矛盾はないと思うけど。
0830デフォルトの名無しさん
垢版 |
2018/09/08(土) 10:25:31.57ID:+lRq1NsW
>>826
うん、俺もそう思うし
実際の実装もそうなっているのが多い
ただし4KBではなく1MiBとかだけど
0832デフォルトの名無しさん
垢版 |
2018/09/08(土) 10:29:54.08ID:gGqp1fFu
業務に関係なく完全に知的好奇心からのmalloc実装の想像だったので、やっぱりglibc読んでみよう。
色々レスくれた人、ありがとう。
0833デフォルトの名無しさん
垢版 |
2018/09/08(土) 10:38:55.04ID:LzkjeqyB
ファイルシステムの管理領域が大きくなりすぎて、
4KB以下のページサイズには出来ない

4MBで千個、4GBで百万個のページを管理しないといけないから、
管理領域だけでも、100MB以上になる

だから、ページサイズをもっと大きい、2MBにすると、
2GBで千個、2TBで百万個のページを管理できるから、今のHDD の容量に対応できる
0834デフォルトの名無しさん
垢版 |
2018/09/08(土) 10:43:05.81ID:+lRq1NsW
HDDだとシリンダ容量との親和性を考えないとね
だけどSSDが普及してる今どきの事情だとどうなんだろう
0835デフォルトの名無しさん
垢版 |
2018/09/08(土) 10:55:59.74ID:AeS6DVc8
>>833
> 4MBで千個、4GBで百万個のページを管理しないといけないから、
> 管理領域だけでも、100MB以上になる

管理領域ってどう計算してるの?
0839デフォルトの名無しさん
垢版 |
2018/09/08(土) 16:08:33.18ID:u7HqPj1f
utf8procというUnicodeライブラリを使いたいのですが、C99に準拠してるかどうかって分かりますか?
「emulate C99 bool」というコメントがソースコードにあったのでおそらくC89あたりからサポートしていると思うんですが。
https://github.com/JuliaStrings/utf8proc
0840デフォルトの名無しさん
垢版 |
2018/09/08(土) 17:17:58.22ID:AMMRWQYD
>>839
C99に準拠している
そのコメントの少し前に
「MSVC prior to 2013 lacked stdbool.h and inttypes.h」ってコメントがあるからWindowsの古い環境のためにboolとかを定義しているだけだね
0841デフォルトの名無しさん
垢版 |
2018/09/08(土) 18:36:43.66ID:LzkjeqyB
OSのすべての機能を学びたいなら、ムック本の
Linuxエンジニア養成読本、第3版、2016

カーネル、起動処理、仮想記憶、
ファイルシステム、シェルスクリプトなど

ファイルシステム・管理領域の仕組みなどを読んで
0843デフォルトの名無しさん
垢版 |
2018/09/08(土) 18:49:46.85ID:kiLcyFGE
なにそれ、すごい面白そう!
アラサーだけどまだまだ青二才だしとっても勉強になります!
0847デフォルトの名無しさん
垢版 |
2018/09/09(日) 15:31:42.46ID:pIlBTOwT
便利だよね
ただ役に立ってるときはクソコードを触ってるときでもあると思う
0848デフォルトの名無しさん
垢版 |
2018/09/09(日) 15:44:39.72ID:DwszjCT1
変数中の "1" のビット数を数える効率的方法ありますか?
aが32ビットとして
for (i = 0; i < 32; i++) {
j = j + a & 1;
a = a >> 1;
}
みたいに1ビットずつカウントするしかないでしょうか
あるいは、8bitとかで区切ってテーブルを引いて加算とかでしょうか(16ビットや32ビットのテーブルは現実的でないので)
0849デフォルトの名無しさん
垢版 |
2018/09/09(日) 15:50:52.78ID:V1LakR3i
a=(a&0a55555555)+(a>>1&0a55555555);
a=(a&0a33333333)+(a>>2&0a33333333);
a=(a&0a0F0F0F0F)+(a>>4&0a0F0F0F0F);
a=(a&0a00FF00FF)+(a>>8&0a00FF00FF);
a=(a&0a0000FFFF)+(a>>16&0a0000FFFF);
0850デフォルトの名無しさん
垢版 |
2018/09/09(日) 15:53:41.89ID:V1LakR3i
a = (a & 0x55555555) + (a >> 1 & 0x55555555);
a = (a & 0x33333333) + (a >> 2 & 0x33333333);
a = (a & 0x0F0F0F0F) + (a >> 4 & 0x0F0F0F0F);
a = (a & 0x00FF00FF) + (a >> 8 & 0x00FF00FF);
a = (a & 0x0000FFFF) + (a >> 16 & 0x0000FFFF);
0852デフォルトの名無しさん
垢版 |
2018/09/09(日) 16:54:40.77ID:V1LakR3i
https://ideone.com/FGqs1S
なにも問題ない
レスをコピペで普通に動く

アホがいちいち車輪の再発明するよりとりあえず↓コレ使っとけば間違いない
http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
Built-in Function: int __builtin_popcount (unsigned int x)
 Returns the number of 1-bits in x.
Built-in Function: int __builtin_popcountl (unsigned long)
 Similar to __builtin_popcount, except the argument type is unsigned long.
Built-in Function: int __builtin_parityll (unsigned long long)
 Similar to __builtin_parity, except the argument type is unsigned long long.
0853デフォルトの名無しさん
垢版 |
2018/09/09(日) 17:39:09.00ID:/XE3HNn6
>>847
自作ツールで無茶苦茶
役に立ってしまった。
そうか、クソコードだったかw

それはさておき今回の発端>>757は、
メモリリークなんか気にしはじめたら
修正コストがどれくらいかかるか
わからない、それだったら現状で
問題は表面化してないし、
そのままでいいじゃん、みたいな
状況だと思う。

Vargrindを導入して
手軽にメモリリークを
チェックできれるようになれば、
上司にもとりあえず直しましょう
という説得ができる
チャンスもあるかも。
0855デフォルトの名無しさん
垢版 |
2018/09/09(日) 17:57:22.00ID:lGJ+2GvF
>>850 この式は初めて見ると訳の分からない呪文みたいだけど、
落ち着いて考えると分割統治の技法を並列処理してるんだよね。
これで1の立ってるビットの数が分かる理由を考えるのは良い教材かと。
0856デフォルトの名無しさん
垢版 |
2018/09/09(日) 18:06:01.01ID:2r/FT+Vi
>>850
少なくとも最後の行だけは
a = (a + (a >> 16)) & 0x0000FFFF;
の方がよさそう。
正確には最大 32 にしかならないから & 0x0000001F でもよさそうだし、値の上限を考えながらだと途中の行ももう少し演算を減らせたりするかも?
0858デフォルトの名無しさん
垢版 |
2018/09/09(日) 20:35:00.38ID:2r/FT+Vi
>>850
a = (a & 0x55555555) + (a >> 1 & 0x55555555);
a = (a & 0x33333333) + (a >> 2 & 0x33333333);
a = (a + (a >> 4)) & 0x0F0F0F0F0F;
a += a >> 8;
a = (a + (a >> 16)) & 0x3F;

でも同じ結果が得られた。
最適化無しだと 9% くらい速くなった。
0861デフォルトの名無しさん
垢版 |
2018/09/09(日) 21:13:17.93ID:2r/FT+Vi
a = (a & 0x55555555) + (a >> 1 & 0x55555555);
a = (a & 0x33333333) + (a >> 2 & 0x33333333);
a = (a + (a >> 4)) & 0x0F0F0F0F;
a = (a * 0x101 * 0x10001) >> 24;

にしたら >>850 より 24% 速くなった(pentiumM linux)。
でも gcc の速度最適化を入れるとどれも変わらないね。
0867デフォルトの名無しさん
垢版 |
2018/09/10(月) 02:37:34.95ID:hUyLWeb6
ビットを数える・探すアルゴリズム
http://www.nminoru.jp/~nminoru/programming/bitcount.html
0868デフォルトの名無しさん
垢版 |
2018/09/10(月) 10:36:25.17ID:o5mvkory
ビット数の数えあげが欲しくなるのってパリティチェックで末尾付加したりするとき?
0870デフォルトの名無しさん
垢版 |
2018/09/10(月) 10:56:31.39ID:ddUFIgl6
符号とか暗号とかの世界ではしょっちゅう使うよ。
1の数で最適なアルゴリズムが変わるってケースもあるし、
暗号にサイドチャネル攻撃仕掛けるにはハミング距離とか重要。
0871デフォルトの名無しさん
垢版 |
2018/09/10(月) 11:27:01.59ID:o5mvkory
>>870 はなんとなく理解できるけど >>869 のほうは想像がつかないな
ビット管理されたフラグと ONしてるビット数による分岐や演算法が変わるのが直結しない感じ
0872デフォルトの名無しさん
垢版 |
2018/09/10(月) 11:51:19.73ID:kNISuHie
フラグは数えねえよな
性能重視でもなければビットフィールド使って読みやすくして欲しいわ
0873デフォルトの名無しさん
垢版 |
2018/09/10(月) 11:54:23.84ID:iqhXZjjt
バラで書くから読みにくいのであって
関数にしておけば外から見た仕様は変わらない
0874デフォルトの名無しさん
垢版 |
2018/09/10(月) 12:16:32.03ID:/R6yufrK
普通の通信でエラー検出以外の目的でビット数を数える必要性がわからない。
そんな特定のCPU以外は必ず無駄な計算が必要になる方式をなぜ使う?
0875デフォルトの名無しさん
垢版 |
2018/09/10(月) 12:46:33.22ID:x2RTnFiS
>>874
エラー検出、訂正目的以外の通信のためにビットの数え上げするって誰かレスしてたっけ?
0876デフォルトの名無しさん
垢版 |
2018/09/10(月) 15:09:59.53ID:rXvKnWV4
>>875
>>869はそうではないのか?ならば居ないな。
0877デフォルトの名無しさん
垢版 |
2018/09/10(月) 19:25:38.98ID:YAHzQjjo
>>821
んーこの文章読むと、よく教科書的な本に書かれてる関数に対してexternを書きましょうってのは冗長で不要って話なのね。確かに実際の動きとは合うし勉強になりました。

>>822
書いてる意図を汲めてるのか自信ないけど、他のサイトにもリンカ依存とあって、この話が全ての環境に対して正しい話なのか・・・若干不安はある感じ?
0878デフォルトの名無しさん
垢版 |
2018/09/10(月) 19:32:05.94ID:WVFJrP31
Common Lisp にビットを数える関数があるけどcでも同様のものがあったようなゔ
0879デフォルトの名無しさん
垢版 |
2018/09/10(月) 20:00:47.59ID:pZnz0RBT
int a=0;

printf("%p" ,a);

printf("%p",&a);

同じアドレスが表示されると思っていたのですが、上下で違う数字が出力されました。
アドレスを表示するのはどちらが正しいのでしょうか?
よろしくお願いします。
0881デフォルトの名無しさん
垢版 |
2018/09/10(月) 20:07:47.31ID:WGo2tHWR
>>879
&a の方。

ていうか同じになるわけがない。片方は printf() に a の内容である 0 を渡しているんだから。
0882デフォルトの名無しさん
垢版 |
2018/09/10(月) 20:26:02.04ID:6MAzJtEj
%p は ポインタを要求しているが
ポインタのサイズと intのサイズが違ってたら 鼻から悪魔
0883デフォルトの名無しさん
垢版 |
2018/09/10(月) 20:28:01.62ID:pZnz0RBT
>>880
>>881
>>882

指定子Pで&が付いてない方も変換されると思っていました。
ただの数値が表示されるだけなんですね。

int *a;
int b=0;

a=&b;

printf("%p",a);
この場合は&が付いてなくてもアドレスを渡してるのでokなんですね。

ありがとうございました。
0884デフォルトの名無しさん
垢版 |
2018/09/10(月) 20:29:18.90ID:WGo2tHWR
天文学的な値が出るかも知れんね
0885デフォルトの名無しさん
垢版 |
2018/09/10(月) 20:30:01.84ID:WGo2tHWR
>>883
そうそう。そういうこと。
0887デフォルトの名無しさん
垢版 |
2018/09/10(月) 21:01:01.97ID:XzQQxj6r
https://ideone.com/bsjclG

また、低学歴知恵遅れのクルクルパーがウソ書いてるわ。。。
64bitのアドレス空間を持ってて、intのサイズが32bitならちゃんと動くワケがないからな
0890デフォルトの名無しさん
垢版 |
2018/09/10(月) 21:12:59.71ID:XzQQxj6r
ID:WGo2tHWR ← コイツにきまってんだろ

なあにが

 そうそう。そういうこと。



なにも知らないムクなヤツ相手に
低学歴知恵遅れの分際でテキトーなことばっかり書き込んでる
0893デフォルトの名無しさん
垢版 |
2018/09/10(月) 21:19:36.92ID:XzQQxj6r
>>883 ← ムクな初心者
>>885 ← 低学歴知恵遅れ ID:WGo2tHWR 「そうそう。そういうこと。」 ← コレのコトだ

低学歴知恵遅れはレスもおえないの?
0895デフォルトの名無しさん
垢版 |
2018/09/10(月) 21:22:53.59ID:XzQQxj6r
https://ideone.com/bsjclG

この処理結果みても分からないなら
オツムに相当な問題がある
0897デフォルトの名無しさん
垢版 |
2018/09/10(月) 21:27:36.20ID:XzQQxj6r
で、処理結果みた?
で、処理結果みた?
で、処理結果みた?
0898デフォルトの名無しさん
垢版 |
2018/09/10(月) 21:29:43.88ID:XxqHEWUO
おたくのサンプルは64ビットアドレスをintにキャストしちゃてるやん。そりゃ実行結果違うわ。
0899デフォルトの名無しさん
垢版 |
2018/09/10(月) 21:31:35.87ID:XzQQxj6r
https://ideone.com/PGwK6j
キャストはずしたったぞ
当然、結果はかわらない

やっぱりなこの板は低学歴知恵遅れしかいない
この程度のこともわからずにいきってレスしてるワケだからな
0900デフォルトの名無しさん
垢版 |
2018/09/10(月) 21:31:51.59ID:6MAzJtEj
たまたま 足りない分 0 を引っ張ってきてるけど(レジスタで渡ったから?)
スタックに積んでるリターンアドレスの一部から足りないのを補ってると、もっとわけわかな数値に
未定儀の挙動を推測すすのもまたオツなもの か
0902デフォルトの名無しさん
垢版 |
2018/09/10(月) 21:33:36.29ID:XzQQxj6r
そんなことオレのしったことじゃないからな

 >>883 ← ムクな初心者
 >>885 ← 低学歴知恵遅れ ID:WGo2tHWR 「そうそう。そういうこと。」 ← コレのコトだ

低学歴知恵遅れはレスもおえないの?
0903デフォルトの名無しさん
垢版 |
2018/09/10(月) 21:40:38.56ID:lZ/O7dtJ
半角クンていつも周りを見ずに自分の思い込みだけでレスしちゃって誤り訂正できないから、恥ずかしい(*/□\*)

直進しかできない目隠しされたイノシシみたい
0904デフォルトの名無しさん
垢版 |
2018/09/10(月) 21:42:09.42ID:XzQQxj6r
なにが間違いなわけ
指摘してみ

一切間違ったこと書いてないからな
低学歴知恵遅れはそもそも認知能力に問題がある
0905デフォルトの名無しさん
垢版 |
2018/09/10(月) 21:47:36.63ID:XxqHEWUO
なぜ64ビットポインタをintに入れたの?
883ではそんなこと一切してないんだけど。

逆に
>printf() に a の内容である 0 を渡している
は整数リテラルがintなのに%pで受けてるので、64ビット環境なら4バイト分スタックのゴミを拾ってきそうだけど。
0906デフォルトの名無しさん
垢版 |
2018/09/10(月) 21:48:46.40ID:XzQQxj6r
はずかしくなって
こっち側にこようとしても
もう手遅れだからな
0909デフォルトの名無しさん
垢版 |
2018/09/11(火) 00:11:24.08ID:X6CualfE
>>887
>>883はちゃんと動くよ。
0910デフォルトの名無しさん
垢版 |
2018/09/11(火) 06:35:01.60ID:pvBPsgEg
>>909
半角野郎が数行のプログラムも理解できないくせに自分で改竄したコードが動かねぇって騒いでただけ。
半角野郎こそ低学歴知恵遅れクルクルパーで認知能力とオツムに相当な問題があるってことが証明されただけなので気にするな。
本人は顔真っ赤にして逃げたみたいだけど。
0911デフォルトの名無しさん
垢版 |
2018/09/11(火) 07:57:47.34ID:2zsIBj+S
ポインタを受け取るべき%p変換指定子に、ポインタでない値を与えることの
危険性は >>882 ですでに指摘されてるのに、後乗りで書いた >>887
こんだけ引っ張れるのは、ある意味で才能かもな。

汚い言葉遣いを我慢しながら拝聴するほど啓蒙的な内容でもないし。
0912デフォルトの名無しさん
垢版 |
2018/09/11(火) 08:11:06.15ID:NBDkJ3+C
>>911
半角クンのレスは、5%の真実と15%の間違い・思い込みと80%の繰り言・罵詈雑言でできてるからね。まっとうに読む価値はない。
0916デフォルトの名無しさん
垢版 |
2018/09/11(火) 20:05:08.62ID:YMBQMGAL
処理系って何?
cpuかコンパイラの事かなと思ってるんだけど。
間違ってる?
0917デフォルトの名無しさん
垢版 |
2018/09/11(火) 20:29:34.46ID:5X7KAgIC
処理系は、翻訳環境と、実行環境に大別される
翻訳環境とはコンパイラ等開発ツールを実行する環境
実行環境とはコンパイル結果のバイナリが稼働する環境、客先と言ってもよい
0918デフォルトの名無しさん
垢版 |
2018/09/11(火) 20:36:50.64ID:YMBQMGAL
>>917
バイナリが稼働する環境はcpuってことかな
どうもお世話になりました
0919デフォルトの名無しさん
垢版 |
2018/09/11(火) 20:45:37.73ID:5X7KAgIC
cpuだけじゃないメモリが実装されているアドレス
i/oが実装されているアドレス
osの挙動
など様々な要因が絡む
0920デフォルトの名無しさん
垢版 |
2018/09/11(火) 21:01:49.97ID:LZbcaZ/B
CPUが同じであっても、
Windowsでは動かせてもmacOSでは動かないとか
同じWindowsでも、64bit環境では動いても32bit環境だと動かないとか
0924デフォルトの名無しさん
垢版 |
2018/09/13(木) 21:21:47.72ID:1sKEH3Wo
昔の教科書には
C言語の原稿
↓プリプロセッサ
マクロ・ヘッダファイルが展開された原稿
↓翻訳機
アセンブリ言語の原稿
↓アセンブラ
機械語
↓リンカ
実行可能ファイル

っていう図がよく描かれてて,今でもWebを検索するとよく見掛けるんだけど,ほんとに今現在のコンパイラってこういうことやってんの?
gccやclangって,もはやC言語の原稿からほぼほぼ直接に実行可能ファイルを生成してるんじゃない?
さすがにプリプロセッサくらいはあるかもしれんが。
0925デフォルトの名無しさん
垢版 |
2018/09/13(木) 21:32:27.37ID:CY4XgXEU
-vつけて起動してみ。
プリプロcppはcc1に統合された。
gccだと、cc1とかasとかcollect2とかが動いてるはず。
clangはデフォルトだとasなしかも。
0926デフォルトの名無しさん
垢版 |
2018/09/13(木) 21:54:33.53ID:1sKEH3Wo
>>925
あざす
やっぱり減ってはいるんだな。
結構ああいう図を見掛けるんで,なんか(ほんとにこんな段階踏んでんのか?)ってモヤモヤしてた。
素人考えだが,あんな風に幾つも重ねてビルドしてたら最適化しにくい気がするし。
0928デフォルトの名無しさん
垢版 |
2018/09/13(木) 23:18:13.03ID:1sKEH3Wo
え そうなん
と思って空のファイルをgcc -vで処理したら
たしかにある程度進んでリンカの段階で エラーになったわ。
0929デフォルトの名無しさん
垢版 |
2018/09/13(木) 23:28:49.69ID:yqnwLH2V
bash-4.3$ gcc -v -o aho aho.c ←開始
/usr/lib/gcc/i586-slackware-linux/5.3.0/specs から spec を読み込んでいます
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/i586-slackware-linux/5.3.0/lto-wrapper
ターゲット: i586-slackware-linux
configure 設定: ../gcc-5.3.0/configure --prefix=/usr --libdir=/usr/lib --mandir
=/usr/man --infodir=/usr/info --enable-shared --enable-bootstrap --enable-langu
ages=ada,c,c++,fortran,go,java,lto,objc --enable-threads=posix --enable-checkin
g=release --enable-objc-gc --with-system-zlib --with-python-dir=/lib/python2.7/
site-packages --enable-libstdcxx-dual-abi --with-default-libstdcxx-abi=gcc4-com
patible --disable-libunwind-exceptions --enable-__cxa_atexit --enable-libssp --
enable-lto --disable-install-libiberty --with-gnu-ld --verbose --enable-java-ho
me --with-java-home=/usr/lib/jvm/jre --with-jvm-root-dir=/usr/lib/jvm --with-jv
m-jar-dir=/usr/lib/jvm/jvm-exports --with-arch-directory=i386 --with-antlr-jar=
/root/slackware-current/source/d/gcc/antlr-runtime-3.4.jar --enable-java-awt=gt
k --disable-gtktest --with-arch=i586 --target=i586-slackware-linux --build=i586
-slackware-linux --host=i586-slackware-linux
スレッドモデル: posix
gcc バージョン 5.3.0 (GCC)
(-続く-)
0930デフォルトの名無しさん
垢版 |
2018/09/13(木) 23:29:23.47ID:yqnwLH2V
(-続き-)
COLLECT_GCC_OPTIONS='-v' '-o' 'aho' '-mtune=pentium' '-march=i586'
/usr/libexec/gcc/i586-slackware-linux/5.3.0/cc1 -quiet -v aho.c -quiet -dumpba
se aho.c -mtune=pentium -march=i586 -auxbase aho -version -o /tmp/ccVi37md.s ← @プリプロセス
GNU C11 (GCC) version 5.3.0 (i586-slackware-linux)
compiled by GNU C version 5.3.0, GMP version 6.1.0, MPFR version 3.1.4, MPC
version 1.0.3
warning: GMP header version 6.1.0 differs from library version 6.1.2.
GGC heuristics: --param ggc-min-expand=63 --param ggc-min-heapsize=62246
存在しないディレクトリ "/usr/lib/gcc/i586-slackware-linux/5.3.0/../../../../i58
6-slackware-linux/include" を無視します
#include "..." の探索はここから始まります:
#include <...> の探索はここから始まります:
/usr/lib/gcc/i586-slackware-linux/5.3.0/include
/usr/local/include
/usr/lib/gcc/i586-slackware-linux/5.3.0/include-fixed
/usr/include
探索リストの終わりです。
(-続く-)
0931デフォルトの名無しさん
垢版 |
2018/09/13(木) 23:30:05.16ID:yqnwLH2V
(-続き-)
GNU C11 (GCC) version 5.3.0 (i586-slackware-linux) ← Aコンパイル
compiled by GNU C version 5.3.0, GMP version 6.1.0, MPFR version 3.1.4, MPC
version 1.0.3
MPC version 1.0.3
warning: GMP header version 6.1.0 differs from library version 6.1.2.
GGC heuristics: --param ggc-min-expand=63 --param ggc-min-heapsize=62246
Compiler executable checksum: c5a3ffed702d1cd048214b2b66d4a98a
(-続く-)
0932デフォルトの名無しさん
垢版 |
2018/09/13(木) 23:30:29.37ID:yqnwLH2V
(-続き-)
COLLECT_GCC_OPTIONS='-v' '-o' 'aho' '-mtune=pentium' '-march=i586'
/usr/lib/gcc/i586-slackware-linux/5.3.0/../../../../i586-slackware-linux/bin/a
s -v --32 -o /tmp/ccMFr9O6.o /tmp/ccVi37md.s ← Bアセンブル
GNU アセンブラ バージョン 2.26 (i586-slackware-linux)、BFD バージョン version 2
.26.20160125 を使用
(-続く-)
0933デフォルトの名無しさん
垢版 |
2018/09/13(木) 23:31:04.04ID:yqnwLH2V
(-続き-)
COMPILER_PATH=/usr/libexec/gcc/i586-slackware-linux/5.3.0/:/usr/libexec/gcc/i58
6-slackware-linux/5.3.0/:/usr/libexec/gcc/i586-slackware-linux/:/usr/lib/gcc/i5
86-slackware-linux/5.3.0/:/usr/lib/gcc/i586-slackware-linux/:/usr/lib/gcc/i586-
slackware-linux/5.3.0/../../../../i586-slackware-linux/bin/
LIBRARY_PATH=/usr/lib/gcc/i586-slackware-linux/5.3.0/:/usr/lib/gcc/i586-slackwa
re-linux/5.3.0/../../../../i586-slackware-linux/lib/:/usr/lib/gcc/i586-slackwar
e-linux/5.3.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'aho' '-mtune=pentium' '-march=i586'
/usr/libexec/gcc/i586-slackware-linux/5.3.0/collect2 -plugin /usr/libexec/gcc/
i586-slackware-linux/5.3.0/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/i586-s
lackware-linux/5.3.0/lto-wrapper -plugin-opt=-fresolution=/tmp/ccGuF6mf.res -pl
ugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pas
s-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s
--eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o aho /usr/lib/
gcc/i586-slackware-linux/5.3.0/../../../crt1.o /usr/lib/gcc/i586-slackware-linu
x/5.3.0/../../../crti.o /usr/lib/gcc/i586-slackware-linux/5.3.0/crtbegin.o -L/u
sr/lib/gcc/i586-slackware-linux/5.3.0 -L/usr/lib/gcc/i586-slackware-linux/5.3.0
/../../../../i586-slackware-linux/lib -L/usr/lib/gcc/i586-slackware-linux/5.3.0
/../../.. /tmp/ccMFr9O6.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --
as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i586-slackware-linux/5.3.0/crtend
.o /usr/lib/gcc/i586-slackware-linux/5.3.0/../../../crtn.o ← Cリンク
0934デフォルトの名無しさん
垢版 |
2018/09/13(木) 23:34:54.24ID:yqnwLH2V
普通に別々のモジュールで独立して処理されてる

@プリプロセス /usr/libexec/gcc/i586-slackware-linux/5.3.0/cc1
Aコンパイル /usr/bin/gcc
Bアセンブル /usr/lib/gcc/i586-slackware-linux/5.3.0/../../../../i586-slackware-linux/bin/as
Cリンク /usr/libexec/gcc/i586-slackware-linux/5.3.0/collect2
0936デフォルトの名無しさん
垢版 |
2018/09/14(金) 00:51:20.40ID:q3l06dS7
>>934
コンパイルは
/usr/lib/x86_64-linux-gnu/6/cc1
だな。俺の場合
0937デフォルトの名無しさん
垢版 |
2018/09/14(金) 00:58:32.39ID:fXySkelb
bash-4.3$ gcc -v -E -o aho_.c aho.c ←開始
/usr/lib/gcc/i586-slackware-linux/5.3.0/specs から spec を読み込んでいます
COLLECT_GCC=gcc
ターゲット: i586-slackware-linux
configure 設定: ../gcc-5.3.0/configure --prefix=/usr --libdir=/usr/lib --mandir
=/usr/man --infodir=/usr/info --enable-shared --enable-bootstrap --enable-langu
ages=ada,c,c++,fortran,go,java,lto,objc --enable-threads=posix --enable-checkin
g=release --enable-objc-gc --with-system-zlib --with-python-dir=/lib/python2.7/
site-packages --enable-libstdcxx-dual-abi --with-default-libstdcxx-abi=gcc4-com
patible --disable-libunwind-exceptions --enable-__cxa_atexit --enable-libssp --
enable-lto --disable-install-libiberty --with-gnu-ld --verbose --enable-java-ho
me --with-java-home=/usr/lib/jvm/jre --with-jvm-root-dir=/usr/lib/jvm --with-jv
m-jar-dir=/usr/lib/jvm/jvm-exports --with-arch-directory=i386 --with-antlr-jar=
/root/slackware-current/source/d/gcc/antlr-runtime-3.4.jar --enable-java-awt=gt
k --disable-gtktest --with-arch=i586 --target=i586-slackware-linux --build=i586
-slackware-linux --host=i586-slackware-linux
スレッドモデル: posix
(-続く-)
0938デフォルトの名無しさん
垢版 |
2018/09/14(金) 00:59:43.97ID:fXySkelb
(-続き-)
gcc バージョン 5.3.0 (GCC)
COLLECT_GCC_OPTIONS='-v' '-E' '-o' 'aho_.c' '-mtune=pentium' '-march=i586'
/usr/libexec/gcc/i586-slackware-linux/5.3.0/cc1 -E -quiet -v aho.c -o aho_.c -
mtune=pentium -march=i586
存在しないディレクトリ "/usr/lib/gcc/i586-slackware-linux/5.3.0/../../../../i58
6-slackware-linux/include" を無視します
#include "..." の探索はここから始まります:
#include <...> の探索はここから始まります:
/usr/lib/gcc/i586-slackware-linux/5.3.0/include
/usr/local/include
/usr/lib/gcc/i586-slackware-linux/5.3.0/include-fixed
/usr/include
探索リストの終わりです。
COMPILER_PATH=/usr/libexec/gcc/i586-slackware-linux/5.3.0/:/usr/libexec/gcc/i58
6-slackware-linux/5.3.0/:/usr/libexec/gcc/i586-slackware-linux/:/usr/lib/gcc/i5
86-slackware-linux/5.3.0/:/usr/lib/gcc/i586-slackware-linux/:/usr/lib/gcc/i586-
slackware-linux/5.3.0/../../../../i586-slackware-linux/bin/
LIBRARY_PATH=/usr/lib/gcc/i586-slackware-linux/5.3.0/:/usr/lib/gcc/i586-slackwa
re-linux/5.3.0/../../../../i586-slackware-linux/lib/:/usr/lib/gcc/i586-slackwar
e-linux/5.3.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-E' '-o' 'aho_.c' '-mtune=pentium' '-march=i586'

エラーなし
0939デフォルトの名無しさん
垢版 |
2018/09/14(金) 01:02:16.51ID:fXySkelb
プリプロセス前
bash-4.3$ cat aho.c
#include <stdio.h>
#define ahobaka "あほばか"
#define AHOBAKA aho##baka
#define LIT(str) #str
#define PRINT(f,...) fprintf(stdout, f, __VA_ARGS__)
#define SHINE PRINT("%s%s\n", AHOBAKA, LIT(a"b"c))

int main(void) {
SHINE;
return 0;
}

プリプロセス後
bash-4.3$ cat aho_.c
(-略-)
# 8 "aho.c"
int main(void) {
fprintf(
# 9 "aho.c" 3 4
stdout
# 9 "aho.c"
, "%s%s\n", "あほばか", "a\"b\"c");
return 0;
}
0941デフォルトの名無しさん
垢版 |
2018/09/14(金) 05:58:00.88ID:3Ef1q6jY
コンパイラが(プリプロセス済みの)ソースを処理する際、
直接にはアセンブリのソースに持っていかず、いったん中間言語に変換。
その中間言語の段階でも最適化を行ってから
アセンブリに変換してアセンブル・リンク。
……みたいな手順になってると聞いたことがある。
中間言語段階の中間ファイルを出力させることができるか知らんけど。

プリプロセッサ、コンパイラ、アセンブラ、リンカよりも
内部的な手順はむしろ増えてるのかも。
0943デフォルトの名無しさん
垢版 |
2018/09/14(金) 08:36:29.54ID:SYmkUqRw
JITとなんの関係が?
0944デフォルトの名無しさん
垢版 |
2018/09/14(金) 08:49:57.91ID:q3l06dS7
>>941

>>924 の図に倣うなら

C言語の原稿
↓プリプロセッサ
マクロ・ヘッダファイルが展開された原稿
↓翻訳機1
中間言語(最適化済み)
↓翻訳機2
アセンブリ言語の原稿
↓アセンブラ
機械語
↓リンカ
実行可能ファイル

みたいなかんじかね。
0945デフォルトの名無しさん
垢版 |
2018/09/14(金) 09:12:54.86ID:d02sSTx1
昔 LSIゲームってあったでしょ
ああいうゲームをCで書いてパソコンで遊びたいんだけど
技術的な情報が不足してんだ 特に画面を動かす方法
そういうのどこで手に入るか分かる人いる? 教えてくださいヽ(^o^)丿
0947デフォルトの名無しさん
垢版 |
2018/09/14(金) 10:39:42.96ID:i1kWv4b4
CでGUIまでやりたいということか?
うーん・・・
0949デフォルトの名無しさん
垢版 |
2018/09/14(金) 12:34:30.19ID:3Ef1q6jY
>>945 の言うLSIゲームってのが、
ドットマトリクスの汎用液晶パネルを使ったゲームじゃなくて、
ゲーム&ウォッチみたいな専用にデザインされた液晶のゲームだと
ちょいと変わってくるかもな。

大筋は同じだけど、少数のデカキャラ表示を点けたり消したり。
0950デフォルトの名無しさん
垢版 |
2018/09/14(金) 12:48:17.13ID:9XnUq3uB
イメージ伝えるためにLSIゲームと言うならドットマトリックスというよりゲームウォッチ式じゃないかな。
ただその趣旨は、簡易な操作と表示のゲームなんじゃないかと。
キャラクタ端末ゲームを知ればそっちに倒れるんじゃないかな?
0952デフォルトの名無しさん
垢版 |
2018/09/14(金) 13:39:29.18ID:GvbetZ+k
ゲームウォッチみたいなのってビットマップじゃないけど、表示する情報量どんくらいなんだろうね?
64bitくらい?
0953デフォルトの名無しさん
垢版 |
2018/09/14(金) 13:53:35.51ID:q3l06dS7
エスケープシーケンスの話が出たついでに質問なんだけど
コマンド名: エラーレベル: エラーメッセージ
↑こういう形式のエラーで、エラーレベルが赤や黄に色付けされてる場合があるんだけども
これってなにかライブラリがあるのかな。それとも各種アプリケーションが自力でやってんのかな。
0955デフォルトの名無しさん
垢版 |
2018/09/14(金) 15:19:32.14ID:d02sSTx1
>>949

そうそう ああいう感じでやれないかなと思ってる
別に3Dとかじゃないし そんなに高度な技術情報が必要とも思えないんだけどな
APIを勉強すればある程度分かるかな?
0956デフォルトの名無しさん
垢版 |
2018/09/14(金) 15:37:28.55ID:GvbetZ+k
色付けはほぼ自前なんじゃないかねえ。単に制御文字挟むたけだからね。

端末にお絵かきするならローグでも使った伝統あるcursesで。
0958デフォルトの名無しさん
垢版 |
2018/09/15(土) 10:24:40.59ID:RjcPqpvv
>>952
ttps://www.nintendo.co.jp/n10/interview/game_and_watch/vol1/index2.html
>というのも、ゲーム&ウオッチで採用したチップは、電卓で使われているのと同じものだったんです。
>そもそも電卓のディスプレイのひとつの数字は7セグメントで表示されるようになっていまして・・・。
(略)
>72セグメントの表示が可能だったそのチップを使って『ボール』をつくったんです。
0959デフォルトの名無しさん
垢版 |
2018/09/15(土) 12:30:45.82ID:WJY+K2bP
>>958
面白いな
しかしゲームウォッチって、液晶上の配線の都合もあって配置がぐちゃぐちゃになってそうだから、ビットのON/OFFだけとは言え面倒そうだな
0960デフォルトの名無しさん
垢版 |
2018/09/15(土) 12:52:26.12ID:rgCMOp4r
コンピュータというほど抽象化もされてないんだろうね。
コントローラではあるけども。
0962デフォルトの名無しさん
垢版 |
2018/09/15(土) 13:31:29.74ID:OUVvcRON
ゲームウオッチは知らんけど配線パターンの都合でビット配置が変則的になるとかはあるよ
0963デフォルトの名無しさん
垢版 |
2018/09/15(土) 18:43:35.47ID:8KftQgLD
蒸し返すようだが近代的な処理系でも,ビルドの各作業は分担して実行してると思っていいのね。

プリプロセッサで展開→中間言語に翻訳→アセンブリ言語に翻訳→機械語にアセンブラ→リンク
0964デフォルトの名無しさん
垢版 |
2018/09/15(土) 18:59:03.04ID:kl+My5NF
>>957
ありがとう すごい参考になった
0965デフォルトの名無しさん
垢版 |
2018/09/16(日) 06:08:26.07ID:QKaZz7Xi
>>963 そう考えて良いと思うよ。
ただし、各段階で実行されるツールが独立した実行ファイルか、とか
それぞれの段階で作られる中間状態をファイルとして取り出せるか、
という話なら「場合による」ってことになる。
0968デフォルトの名無しさん
垢版 |
2018/09/17(月) 06:09:25.28ID:5TL9cO8s
gcc -save-temps -o prog prog.c
と指定すると prog.i, prog.s, prog.o が残るのね。
それでもプリプロセス済みCとアセンブリとの中間段階は見られないか。

ちなみに -save-temps と -pipe を同時に指定すると、
gcc: 警告: -save-temps が指定されたため、-pipe は無視されました
……ですってよ、奥様。
0969デフォルトの名無しさん
垢版 |
2018/09/17(月) 07:57:34.69ID:SBpxj18K
>>968
> それでもプリプロセス済みCとアセンブリとの中間段階は見られないか。
prog.iとprog.sが一体なんだと思ってるんだろう…
0970デフォルトの名無しさん
垢版 |
2018/09/17(月) 08:09:11.53ID:hbuTlOjm
プリプロセスとかアセンブリとかがあるとなんか困るの?
なんでそんなに必死なのか分からん。
処理が過度に複雑にならないためとか、様々な言語やCPUといった対象に幅広く対応するためとか、いろんな理由で工程を分ける方が合理的でしょうに。
0971デフォルトの名無しさん
垢版 |
2018/09/17(月) 08:13:06.60ID:BwzrWhGR
鉄鉱石とボーキサイトと石油入れたら自動車が出てくる装置があると思ってるんでしょ
0972968
垢版 |
2018/09/17(月) 08:27:18.66ID:5TL9cO8s
.i がプリプロセス済みのC
.s がアセンブリ
ということは分かってるのよ、それらの間にある状態を
ファイルとして見ることができないという話。

GCC用語ではGENERICの段階てことになるかな。
GENERICとアセンブリの間にもまだあるみたいだけど。
0973デフォルトの名無しさん
垢版 |
2018/09/17(月) 08:28:59.23ID:SBpxj18K
>>970
単なる技術的興味だろ
このスレでうだうだやるなよって言うのならわかるけど必死とか意味わからん
0976デフォルトの名無しさん
垢版 |
2018/09/17(月) 09:19:33.19ID:5TL9cO8s
>>974 ありがとう。
でもオプションの数を見ただけでウンザリしてもうた。
コンパイラ開発者向けのレベルになると最適化処理のステップごとなのね。
0978デフォルトの名無しさん
垢版 |
2018/09/17(月) 11:58:09.09ID:5NB0QfSZ
たとえばpccなんかはものすごく外部コマンドにたよってるよね。
man pccとするとその解説が載ってる。
0979デフォルトの名無しさん
垢版 |
2018/09/17(月) 12:00:30.90ID:5NB0QfSZ
質問者はここを参照するといいかも
http://pcc.ludd.ltu.se/how-it-works/
ただ,PCCはGCCやらClangと違って小ささ,見通しのよさを重視してるから,
GCCとかClangとかはそんなことやってないかもしれん。
(ていうかGCCやClangにおける↑上のリンクみたいなドキュメントはないのかな)
0981デフォルトの名無しさん
垢版 |
2018/09/19(水) 05:40:46.68ID:6Ke1Nn09
C言語(じゃなくてもいいけど)をやってると
標準出力に出力するというのがいかに便利かを痛感するねぇ

下手にファイルやなんかに出力先を指定しようものなら一気に
パーミッションや属性値の問題が噴出するのに対して
標準出力ではそういう一切を気にせずに垂れ流せる
0982デフォルトの名無しさん
垢版 |
2018/09/19(水) 07:56:02.42ID:bRibFDbQ
C++の学習(入門レベル〜初心者レベル)をするのにC言語の知識って必須なんですか?
読んでるC++入門書が途中から分かりづらかったので独習C++って入門書を買おうとしたんですけど
とあるレビューにC言語を習得してるのが望ましいとか書いてあって気になったんですが…
プログラミング言語自体経験皆無なのですが、どうすればいいでしょうか?
0983デフォルトの名無しさん
垢版 |
2018/09/19(水) 08:04:03.02ID:37LGoDD1
>>982
C++はCの大半の部分を包含したような言語仕様になっているから、必然的にCの知識も必要になってくる。本を書く方も、Cと重複するような内容まですべて書いてると膨大になってくるから、Cを知っている前提になっている本は多い。
C++の流儀でコーディングするなら使われないCなりの書き方とかもあるけど、基本的にはCは避けて通れないはず。
頑張ってCも身に付けるか、もっと初心者が取っつきやすい言語から始めた方がいいかも。
0984デフォルトの名無しさん
垢版 |
2018/09/19(水) 08:29:50.54ID:t41Iifgl
じゃあCの知識を前提にしてないC++の本探せば
やさしいC++とかでいいんじゃね
0985デフォルトの名無しさん
垢版 |
2018/09/19(水) 08:47:40.49ID:OxeqQ4V7
全部やればいいと思うよ。pythonもlispも
C++の必要性を実感するのってプログラムが大規模になってからなので、最初はちょっとポイント絞るのが大変かもね
0986デフォルトの名無しさん
垢版 |
2018/09/19(水) 10:31:35.10ID:bRibFDbQ
>>983
回答ありがとうございます
ロベールって本読んでたんですが(クラスの章で読むの中断)今の所特にC言語などの前提知識は
要求されてなかったんですが、これから必要になっていく感じですかね・・
具体的にはどれくらいC言語のスキルを付けてからC++に逝くのが望ましいですか?苦しんで覚えるC言語って本はざっと読んだんですがこれじゃ弱いですよね・・
.....それともCに拘らずに何かpythonとかrubyみたいな人気そうで簡単そうな言語で何か作れるくらいまで覚えてからC言語に戻ってきたほうが
一見遠回りのように見えて近道なんでしょうか?質問ばかりですいません;
0988デフォルトの名無しさん
垢版 |
2018/09/19(水) 17:03:44.61ID:t41Iifgl
>プログラミング言語自体経験皆無なのですが
>クラスの章で読むの中断
>ざっと読んだんですがこれじゃ弱いですよね・・

C++にこだわる理由を知りたくなったw
そして読んでるだけ?手動かしてる?
0989デフォルトの名無しさん
垢版 |
2018/09/19(水) 17:18:24.07ID:5wa+YDhW
俺が禿1stを読み始めた当時も大した理由はなかったな
なんだか凄そう、その程度のことだった
0995デフォルトの名無しさん
垢版 |
2018/09/19(水) 22:48:46.48ID:xLP4ypV2
むしろ昔はC++のコードからCのコードを出力してたからな
Cは拡張性は抜群

ウンコスクリプトもCで書かれてる
C以外の言語が淘汰されることがあっても
Cが淘汰されることはない
0996デフォルトの名無しさん
垢版 |
2018/09/19(水) 23:00:14.31ID:XIk0tg++
C++で作っていいのは継続的な開発がない場合だけだな
継続的に開発やメンテナンスをするならC++は使っちゃいかん
0997デフォルトの名無しさん
垢版 |
2018/09/20(木) 02:32:23.68ID:v2140bTt
>>988
動かしてます。書きながらやってます
理由はあれですが最終的にC#とC++使いこなせるようになりたいです
他の簡単な言語やるとしたらどれくらいのまでスキルあげればいいんですかね・・
0998デフォルトの名無しさん
垢版 |
2018/09/20(木) 02:59:01.53ID:OZxd0eW0
たのしいRuby 第5版、2016
Effective Ruby、2015

さらに、JavaScript, jQuery をやっても、
C++ の1冊よりも、はるかに簡単だろ

C++ を読んでも、何も作れないし、長時間のムダ!
0999デフォルトの名無しさん
垢版 |
2018/09/20(木) 03:28:24.58ID:90KUJ2ts
>>997
C#とC++やりたいなら、まずはC#から入った方が良さそう。
rubyは全く方向性が違うし今(そしてこれからも)やる必要はない。
1000デフォルトの名無しさん
垢版 |
2018/09/20(木) 03:52:33.79ID:v2140bTt
>>998-999
ありがとうございます
C#からやったほうがいい理由も教えていただきたいところですが1000レス目ですね…
RubyもやってみたいんですがViisualSの導入出来てるのでそれで動くC#からやってみます
C言語から脱線してしまいすいませんでした
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 34日 4時間 16分 31秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。