C言語なら俺に聞け 149

■ このスレッドは過去ログ倉庫に格納されています
2018/10/28(日) 22:01:44.38ID:D9Gt7gmT0
!extend:checked:vvvvv:1000:512

次スレを作る時は上記1行をコピーして2行に増やして必ず1行目に入るようにしてください。

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言語なら俺に聞け 148
https://mevius.5ch.net/test/read.cgi/tech/1537347410/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2018/11/27(火) 00:17:38.39ID:sRUlwxGC0
SERNをハックしてLHCでマイクロブラックホールを作ってどうたらこうたらするとかなり圧縮できるよ
2018/11/27(火) 00:21:47.09ID:E9za3JrpM
綴りを間違えるとホワイトホールができちゃうかもしれんぞ
2018/11/27(火) 00:22:04.16ID:ugyzpzqZ0
圧縮は出来ても、復元が出来なさそうw
2018/11/27(火) 01:23:33.76ID:UHpiRGCo0
マジレスすると情報っていうのは消失しないと考えられているので
BH表面にエネルギー運動量テンソルの波動として,飲み込まれた物質郡の属性
(電荷など)が記録される……筈w
少なくとも現状の場の量子論と重力宇宙論ではそういう結論が出てる。
C言語とは関係ないけど,BHを記憶装置として用いるっていう考えは
突拍子もないけど理論的には可能だよねぇ,上記の理屈が正しいとすると。
200デフォルトの名無しさん (ワッチョイ 6f9f-KQkZ)
垢版 |
2018/11/27(火) 01:29:33.86ID:IxTjeZ9T0
みんなが何を言っているのかよくわからない
2018/11/27(火) 02:18:13.33ID:enNfKuoe0
C言語でok
2018/11/27(火) 22:26:43.87ID:/aKqcH8H0
>>195
例えば100bitの長さのデータは全部で2^100種類作ることができる
50bitの長さのデータは全部で2^50種類作ることができる

任意のデータを半分に圧縮できる方法があるとして
100bitで作れる2^100種類のデータをすべて圧縮したなら
50bitの長さで2^100種類の異なるデータができなくてはいけないがそれは不可能
203デフォルトの名無しさん (ワッチョイ 6f9f-zhOP)
垢版 |
2018/11/28(水) 01:13:46.19ID:BkKDQWNJ0
いやいや、ちょっと待て。ここは発想の転換が必要だ。例えば8インチのフロッピーディスクから3.5インチの

いや、なんでもない。みんなには内緒にしておいてくれ。
2018/11/28(水) 02:27:03.19ID:iOF+GVq50
「任意の」データを半分に圧縮できるとすると
圧縮した後のデータもさらに半分に圧縮できるはず
そうやって圧縮を繰り返せば最後には全てのデータは1ビットになる
よってそのような圧縮法がないことは明らか
可逆でないならそれでもいいかw
2018/11/28(水) 05:46:42.41ID:N04UITTm0
しかしソースコードとかって圧縮率高いよね。
やっぱり同じような文字が続いたりインデントに空白文字が続いたりするからだろうか。
2018/11/28(水) 07:08:14.21ID:82iiMHmWa
コルモゴロフの複雑性もあります
207デフォルトの名無しさん (ワッチョイ ffd2-f63u)
垢版 |
2018/11/28(水) 09:24:07.52ID:seMAmMUm0
そこでTHCompですよ
2018/11/28(水) 09:40:55.66ID:0XeeIlyH0
情報のエントロピー
2018/11/28(水) 13:43:56.99ID:rECr01ZDM
今から趣味でプログラミング始めます!激励してください!!
2018/11/28(水) 17:27:07.00ID:N04UITTm0
悪いこと言わないからPython3やれ
2018/11/28(水) 17:57:49.24ID:Vqd4vFOqM
趣味で初プログラミングなら、俺からもpythonを勧める。
GUIが手軽だとモチベーション違うよ。
2018/11/28(水) 18:00:54.28ID:rECr01ZDM
分かった!いやよくわかんないけどそっちから始める!
XCodeでできるかな、ありがとう!
2018/11/28(水) 18:48:28.91ID:N04UITTm0
$ brew install python
とやって
$ python
これで起動する。もうスレチだし「macOS Python3」とかでググれ。
214デフォルトの名無しさん (アウアウウー Sa27-ml8p)
垢版 |
2018/11/28(水) 19:51:31.92ID:wHjpMIAFa
Kotlinもよろしく
2018/11/28(水) 20:05:07.50ID:Vqd4vFOqM
まだマイナーすぎ。入門書があふれてきたら推すよ
2018/11/28(水) 22:31:15.42ID:xsmtECg3a
ttps://bituse.info/c/kadai/44

上記のサイトなどを参考に
簡単な九九の表を作ると

1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15...
...
...
(略)


このようになると思いますが、

隣の数字を参照にして足して
3 5 7 9 11 13 15 17
6 10 14 18 22 26 30 34
9 15 21 27 33...
...
...
(略)


と、表示するには上記のサイトの様なプログラムをどのようにすれば良いのでしょうか?
宜しくお願いします。
2018/11/28(水) 22:37:30.42ID:IOIePrN/0
>>216
死ね
2018/11/28(水) 23:13:58.25ID:MBR3DrMT0
puts("3 5 7 9 11 13 15 17\n");
puts("6 10 14 18 22 26 30 34\n");
puts("9 15 21 27 33...\n");
2018/11/28(水) 23:24:49.65ID:30WXuBf5p
>>218
puts は改行するので、文字列の末尾に \n を付けると2回改行することになる
2018/11/28(水) 23:26:32.45ID:MBR3DrMT0
あっー  指摘ありがと
2018/11/29(木) 02:39:17.93ID:d0mF96D3a
>>216

#include <stdio.h>
int main(void){
int i, j, k, n, m;
n = 0;
m = 0;
for (i = 1; i <= 9; i++){
n += 3;
m += 2;
k = n;
printf("%3d", k);
for (j = 1; j <= 9; j++){
k = k + m;
printf(" %3d", k);
}
printf("\n");
}
return 0;
}
222デフォルトの名無しさん (ワッチョイ 0bb3-C0zt)
垢版 |
2018/11/29(木) 04:25:22.53ID:+QhJBOyD0
int main() {
char *ary[] = { "AAAA" , "BBBB" , "CCCC" };
printf("%s\n%s\n%s\n" , ary[0], ary[1], ary[2]);
printf("%x\n%x\n%x\n" , ary[0] , ary[1] , ary[2]);
printf("%x\n%x\n%x\n" , &ary[0] , &ary[1] , &ary[2]);
return 0;
}
実行結果
AAAA
BBBB
CCCC
405064
405069
40506e
61ff24
61ff28
61ff2c

っていうのでよくわからなくなったんですが
0061FF24==00405064で00405064==41414141
なのに、同じary[n]で参照?してるアドレスが違うのは%sが特別だからですか?
それと、AAAA,BBBB,CCCCはどの変数にも格納されていなくて、ただポインタがその文字列たちを指しているっていう理解であってます?
*がよくわからない・・・・・
223デフォルトの名無しさん (ワッチョイ 0bb3-C0zt)
垢版 |
2018/11/29(木) 04:37:33.83ID:+QhJBOyD0
ああ直接ポインタを作っててそれで変数がある必要もないのかな?
AAAA,BBBB,CCCCを普通に配列で作って、それを1つのポインタでオフセットを指定して選ぶ。みたいなのってCでできるんですか?
2018/11/29(木) 05:10:38.21ID:ljP5qN1x0
any[]には各文字列のアドレスが格納される。文字列へのポインターの配列。
%sはポインターが指すアドレスの文字列を、%xはポインターに格納されたアドレスを表示する。
&any[]とすると、ポインターそのもののアドレスを取得して表示する。

61ff24 -> 405064 -> "AAAA"

みたいになってる。
2018/11/29(木) 05:25:57.02ID:ljP5qN1x0
一つのポインターでオフセットを指定することはできるけど、
"AAAA"はAAAAの4byteではなくて、文字列の終端である0を含めた5byteになる。

char *any = "AAAABBBBCCCC";

こういうイメージで+4や+8でアクセスしようとしたら
%sで表示したとき意図する結果にならないかもしれない。
文字列として扱わなければ問題ないです。

char *any = "AAAA\0BBBB\0CCCC";

こんな書き方もできますが、*を理解したほうがよいと思います。
アドレスやオフセットの概念は理解しているようですので。
2018/11/29(木) 07:00:11.93ID:f12HiZt90
>>222 の実行結果を解釈すると...

文字列 "AAAA" "BBBB" "CCCC" の実体は 0x405064 から格納されていて、
16進ダンプだと
0x405064: 41 41 41 41 00 ; {'A', 'A', 'A', 'A', '\0'}
0x405069: 42 42 42 42 00 ; {'B', 'B', 'B', 'B', '\0'}
0x40506e: 43 43 43 43 00 ; {'C', 'C', 'C', 'C', '\0'}
という具合に(アラインメントのためのパディングなしに)詰め込まれている。
行分けせずに
0x405064: 41 41 41 41 00 42 42 42 42 00 43 43 43 43 00
と書けば「詰め込む」のイメージが分かりやすいかも。

charへのポインタの配列 ary[] は 0x61ff24 から配置されていて
番地: 0x61ff24 == &ary[0], 値: 0x00405064 == ary[0] (== "AAAA"の先頭番地)
番地: 0x61ff28 == &ary[1], 値: 0x00405069 == ary[1] (== "BBBB"の先頭番地)
番地: 0x61ff2c == &ary[2], 値: 0x0040506e == ary[2] (== "CCCC"の先頭番地)


これで分からんかな。
ポインタが指す実体(文字列)の番地、その(文字列の)番地が格納された配列の値、
(値としてポインタが格納された)配列要素の番地。
2018/11/29(木) 09:05:40.33ID:Msn7clch0
どうでもいいけど略すならaryじゃなくて,arrでは。
2018/11/29(木) 09:24:21.59ID:b4PauqdMx
>>227
aryもまれによく見る。
229デフォルトの名無しさん (ワッチョイ 0bb3-C0zt)
垢版 |
2018/11/29(木) 12:11:40.55ID:+QhJBOyD0
ありがとうございます。
読んでみてなんとなくは理解できるようになりました

>>225
NULLのことはすっかり忘れてました
*を理解できるように頑張ります、ご丁寧にありがとうございました。
2018/11/29(木) 16:00:56.19ID:Pq9K3tWa0
>>216-221
Ruby で作った

NUMBERS = ( 1..5 ).to_a
Count = NUMBERS.length

# 九九の表、Times Table ( Multiplication table ) を作る。
# map は1次元配列を作るので、each_slice で、2次元配列にする
Multiplication_table = NUMBERS.product( NUMBERS ).map { | x, y | x * y }
.each_slice( Count ).to_a

result = [ ]

Multiplication_table.each do | ary | # 1行ずつ処理する
result.push ary.each_cons( 2 ).map { | x, y | x + y } # 隣同士を足す
end

p result

結果
[[3, 5, 7, 9], [6, 10, 14, 18], [9, 15, 21, 27], [12, 20, 28, 36], [15, 25, 35, 45]]
2018/11/29(木) 16:15:48.88ID:qd4rCcG0M
>>230
Rubyすげぇ〜!!!

https://gigazine.net/news/20181116-top-programming-languages-2018/
https://www.softantenna.com/wp/software/the-state-of-the-octoverse-2018/
https://www.softantenna.com/wp/software/ieee-spectrum-top-programming-languages-2018/
https://findy-code.io/engineer-lab/github-programming-language-ranking

大人気Ruby!
Ruby大人気!!
2018/11/29(木) 16:20:18.55ID:Msn7clch0
>>231
やめてさしあげろw

まあ擁護するなら人気のありなしで言語の優劣は測れないと思うけどね。
IOなんてドマイナーだけど俺は好きだし,素晴しい言語だと思っている。
なおRuby
2018/11/29(木) 18:14:40.72ID:ljP5qN1x0
(´-`).oO(aryだったのね……)
2018/11/29(木) 18:49:51.71ID:Msn7clch0
いやarrやろ(しつこい)
235デフォルトの名無しさん (アウアウウー Sa47-2q9Y)
垢版 |
2018/11/29(木) 19:09:36.82ID:8tueZiBHa
array
2018/11/29(木) 19:12:17.70ID:sIB7nB920
いいやaryもまれによく見る。
俺は省略せずarray派だが。
2018/11/29(木) 19:19:19.48ID:Msn7clch0
まあarrayくらい省略するなって話よな
creatじゃないんだからw
238デフォルトの名無しさん (アウアウウー Sa47-2q9Y)
垢版 |
2018/11/29(木) 19:46:28.81ID:8tueZiBHa
>>236
「まれによく見る」とは?
2018/11/29(木) 19:51:20.93ID:lt3dDpp60
総体としての頻度は稀だが、とある人の書いたソースには悉く ary として書かれており、
その書いた人というスコープ内においては良く見る
2018/11/29(木) 19:53:37.10ID:sIB7nB920
>>238
weblio辞書より

まれによくある
別表記:稀によくある、稀に良くある

起こり得る事柄を形容して用いられることのある言い回し。
滑稽な表現であるが、あからさまな形容矛盾であり、日本語としては意味をなさない。
「ブロント語」として広まったインターネットスラング。

「まれによくある」の語のニュアンスは、使用者や使用場面によって異なるといえるが、
「頻繁に起こるとも言えるし、めったに起きないとも言える」といった意味合いだったり、「特定の人においてはよくあるが、その他の人には起こらない」といった意味合いだったり、あるいは、いわゆる「あるあるネタ」を指していたりする。
241デフォルトの名無しさん (ワッチョイ 0bb3-C0zt)
垢版 |
2018/11/29(木) 20:38:21.77ID:+QhJBOyD0
ちなみに>>222のやつは入門サイトにあったやつを少しいじったやつです
2018/11/29(木) 21:38:47.98ID:FncUCYw3a
スッキリわかるC言語と苦しんで覚えるC言語
どちらで勉強するか迷ってるんですがどっちがいいと思いますか?
2018/11/29(木) 22:00:55.64ID:yDZ234lo0
>>242
>スッキリわかるC言語
胡散臭いです…

>苦しんで覚えるC言語
正直で好感を持てる題名ですね
2018/11/29(木) 22:01:35.59ID:kX/wXhND0
>>242
立ち読みして自分にとって説明が理解しやすいと思った方を選んだら?
245デフォルトの名無しさん (ワッチョイ 0bb3-C0zt)
垢版 |
2018/11/29(木) 22:30:54.22ID:+QhJBOyD0
苦CのほうはWebにサイトがあるのでそっちを見ては?
2018/11/29(木) 22:40:45.52ID:FncUCYw3a
まだ新しいスッキリわかるC言語をベースにウェブで分からない時に苦しーも見る方針に決めました
皆さんありがとうございます
2018/11/29(木) 22:48:01.10ID:TPe/tu+/0
>>241
IDEを使ってメモリウインドウから>>226の内容を納得いくまで確認しろ。

> AAAA,BBBB,CCCCを普通に配列で作って、それを1つのポインタでオフセットを指定して選ぶ。みたいなのってCでできるんですか?
それを222で君がやっているように見えるが。
書き方が気に入らないのなら、以下でも多分行ける。
for (int i=0;i<3;i++) printf("%s", *(ary+i));

他言語とは文字列の扱いが異なる。Cの方がより原始的で、はっきり言って使いにくい。
他言語:文字は長さ1の文字列
C言語:文字はcharで、文字列はcharの配列

ただ、char周りなんてどうせ大して使わないから飛ばしていい。さらに言うと、
> AAAA,BBBB,CCCCを普通に配列で作って、それを1つのポインタでオフセットを指定して選ぶ。
なんてのはbotとかでも作るわけでなければ使わない。
printfべた書きで大体事足りる。
248デフォルトの名無しさん (ワッチョイ 0bb3-C0zt)
垢版 |
2018/11/29(木) 23:07:20.28ID:+QhJBOyD0
>>247
一応プロセスメモリエディタとか使いながらやってたんですよ、それでも混乱するので聞きました。
多言語はやったことないのでよくわかりませんが、高級言語のよくわからずに使う感じが苦手なので、むしろ原始的なのは好きです。

> AAAA,BBBB,CCCCを普通に配列で作って、それを1つのポインタでオフセットを指定して選ぶ。
っていうのがbotを作るうえで必要というのは初めて知りましたが、botは作りたいと思ってました。
2018/11/30(金) 00:06:17.84ID:tn7d6mNM0
>>248
> プロセスメモリエディタ
なんじゃそりゃ?と思ってみてみたが、どっちかというとハッキングツールだな。
マジな話、IDE使え。個人開発レベルの糞ツールとは次元が違うから。
俺はVSがいいと思うが。
言い忘れてたが当然return文にブレークポイントを当てて止めて見るんだよ。

というか他に何言語やってるんだ?
> AAAA,BBBB,CCCCを普通に配列で作って、それを1つのポインタでオフセットを指定して選ぶ。
これは全くの初心者の発想ではないはず。
明らかに他言語ではこう書ける、これをCでやりたい、というように読めるが。

> っていうのがbotを作るうえで必要というのは初めて知りましたが
というか、文字列を配列に持って切換ながら使う=それらの文字列は同列に扱うべき、
という使い方をすることがほぼ無いんだよ。他の言語でも、アプリでも。
大体文字列なんてリテラルでその場で使って終わり、が殆どだ。
それ以前に、charを主として使うアプリ(bot含む)をCでやろうというのも間違いだが。

char出力は結局UIであって、どうせI/Oで引っかかるから、Cの優位性(速度)が生かせない。
そして原始的な分、生産性自体は悪いから、そのデメリットだけ受けてしまう。
AIbotとかで演算部分に相当速度が必要でない限り、スクリプト言語で作った方がいいと思うぞ。
この意味で、Cでの文字出力はほぼログ生成でしかなく、
だからこそ貧弱なライブラリでも間に合ってる訳だが。

> 高級言語のよくわからずに使う感じが苦手
いやこれは違う。
「余計なことを考えなくて済む」という意味で後発言語はよく出来てるんだよ。
まあこれはじきに分かるだろうさ。
2018/11/30(金) 01:05:40.46ID:qUT8id4/0
void君は相変わらずだな
251デフォルトの名無しさん (ワッチョイ 0bb3-C0zt)
垢版 |
2018/11/30(金) 01:14:13.61ID:dHzryZqK0
プログラミングというより解析系に興味があっていろいろ調べてただけです。
Cのこともプログラミングのこともまだ全然わからないです
2018/11/30(金) 01:40:17.87ID:ZZJKHSVT0
puts()関数とかの「s」ってストリングのsなんだね。
今までずっとputの三単現だと思ってたわw
2018/11/30(金) 08:28:07.36ID:VjmtC3o00
>>242-246
スッキリJava は、250ページにも及ぶ、猿向けにオブジェクト指向を解説した、伝説の書。
単純な言語の文法書ではない

前半はフレームワークを使う人の立場で、後半はフレームワークを作る人の立場での解説。
だから初心者は、後半を読まなくてもよい

苦しんでC は、手順書。
14歳以下とか、中学生に教えるたぐいの本。手順を教えるだけ。
たいていのAndroid アプリの本と同じ

なぜ、こういうデザインパターンをするのかとか、概念の説明などはない。
漏れは、2時間で読める。
理解して考える要素がないから、ライトノベルと同じ
2018/11/30(金) 08:32:59.05ID:xQIq6Uyn0
理解して考える脳の無いRuby厨であった
2018/11/30(金) 08:36:47.97ID:VjmtC3o00
例えば、WEB+DB 106号の「実践 Android/iOS アプリ設計」を読んでみ

DI, MVVM, Flux とか、なぜこういうデザインパターンを使うのか、
自分で理解して考えないといけないから、こういう概念の話は難しい

デザインパターンを参考にして、Ruby などでいじくり回すのが、最も身につく。
ポインターのバグ取りに、時間を取られないし
2018/11/30(金) 09:22:30.92ID:KWzr3gbka
DIって外部の設定を使いましょうって話なんですか?
2018/11/30(金) 09:39:20.17ID:vcs52++Va
>>253
スッキリわかるC言語はパズドラ作りながらC言語が学べるみたいです
2018/11/30(金) 10:35:00.21ID:VjmtC3o00
DI は、C++ の、p-impl パターン。
外部から、後に作られる、依存性を注入する

class A { new B(引数); }
class A { b = 構築メソッド }

上のように、クラスA 内で、直接B を作らず、
構築メソッドで、Bインスタンスを作る

例えば、クラスBの引数の変更が、クラスAに及ばないように、疎結合にしている。
クラスA・Bの作者が、同一でない場合に、効果が大きい

間接的に、Duck Typing, Interface を使う事で、インターフェース・構築メソッドが固定されるが、
同じ構築メソッドを使うことで、似たようなクラスを扱いやすい
259デフォルトの名無しさん (ワッチョイ a79f-C0zt)
垢版 |
2018/11/30(金) 14:03:17.31ID:wR5wJL4H0
苦Cから入ったけどつまずいて1年くらい何も触らなかったおもひで
2018/11/30(金) 16:07:52.38ID:cYaYTjx50
何もわからんうちからえり好みしないでK&R
これですんなり入れることが適性試験
2018/11/30(金) 17:16:53.52ID:fQi4U1HQH
ループとか条件分岐とか関数とかは別言語で十分習得したという前提でならそれでよい。
262デフォルトの名無しさん (ワッチョイ a79f-C0zt)
垢版 |
2018/11/30(金) 17:20:44.30ID:wR5wJL4H0
アセンブラの入門かじった程度でもイメージはつかめるしCで躓くことはかなり減ると思う
2018/11/30(金) 18:19:25.99ID:cYaYTjx50
俺はサブルーチンが関数な言語を1つも知らずにK&Rで憶えた
強いて言うならBASICのUSR関数くらいか
264デフォルトの名無しさん (アウアウウー Sa47-2q9Y)
垢版 |
2018/11/30(金) 18:33:32.23ID:vx8Iixcxa
BASICの全てグローバル変数だとか行番号に苦しんでいた時に徐々にMS-DOSでCが使える状態になってきて、PC-98でMS-DOSが使えるようになり、TurboCとかも出て俺は救われた。

しかしその後UNIX関係の仕事になったのでCができて当たり前の環境になってしまった。
2018/11/30(金) 19:07:15.02ID:m3TSK4YL0
大学でunixでCをやるようになってvim系の操作が気持ち悪かったからノリで大学を辞めた
人生で最悪の選択をしてしまった
2018/11/30(金) 19:17:21.91ID:9hh85ykUM
>>263
BASICならGOSUBだろ。
2018/11/30(金) 21:49:44.97ID:cYaYTjx50
>>266
GOSUBが、どのように関数なんだ?
2018/11/30(金) 22:03:56.69ID:5CDqtXe60
関数と言えるのは、DEF FN かな?
2018/11/30(金) 23:31:23.55ID:MkfLpznc0
>>253
>スッキリJava は、250ページにも及ぶ、猿向けにオブジェクト指向を解説した、伝説の書。
私が知りたいのはスッキリC++(そんなものが存在するのですか?限りなく胡散臭いですね)の話です
2018/11/30(金) 23:33:27.03ID:MkfLpznc0
>>258
おっしゃることがよくわからないので、ちょっと書いていただけますか?http://ideone.com
271デフォルトの名無しさん (ワッチョイ b3af-C0zt)
垢版 |
2018/11/30(金) 23:34:56.47ID:PIchVJHi0
#define C Java
2018/11/30(金) 23:50:06.20ID:MkfLpznc0
>>263
下準備にはPEEK/POKEも重要
私は CALL で呼んでいた記憶がありますが、もしかするとNとN88とN88(86)とでは違っていたかもしれません…
2018/12/01(土) 07:43:03.30ID:7EJdQB2R0
PC6001でBASICを覚えてPLAY,SOUNDで音楽作ってたな
PSGの音を聞くだけで懐かしい気分になる
そしてMSXでMSX-Cを覚えた
cursesがあったからローグもどきのゲーム作って遊んでたよ
2018/12/01(土) 07:47:36.67ID:+NY+xI8A0
サブルーチンって用語はもう消えた?
2018/12/01(土) 09:16:07.78ID:4Hoi4/y50
C言語以降関数と手続きを区別しない言語が増えたこととOOPでは一部がメソッドと呼ばれるようになったので使用頻度は下がったな
なくなってはいないけど
2018/12/01(土) 09:27:06.02ID:TOuK5lWF0
関数と手続きを総称して、「メインルーチン」に対して「サブルーチン」って
言い方なら今でも使うんじゃないかな。
プログラミング教育の初期の段階での説明。

BASICでの「サブルーチン」は言語仕様での用語だっけ?
2018/12/01(土) 09:27:25.60ID:piawvWud0
サブルーチンと関数って違うのか(無知)
2018/12/01(土) 09:55:16.44ID:J8cQMvWo0
>>276
GOSUB 命令がありました
2018/12/01(土) 10:14:48.66ID:/TQ/ikyba
ラベルはなかったね
2018/12/01(土) 10:27:11.17ID:tI2T+oTI0
>>277
処理をまとめたのがサブルーチンで
値を返すのが関数…とかなんかあった気がする
2018/12/01(土) 16:05:57.68ID:piawvWud0
>>280
その定義だとvoid func(void)
はサブルーチンになるな
ちょっと難癖っぽいけどw
282デフォルトの名無しさん (ワッチョイ 0bb3-C0zt)
垢版 |
2018/12/01(土) 16:11:09.57ID:oMoZEV7I0
アセンブラだと値返していようがいまいがサブルーチンっていうよね
今曖昧だってことは元々曖昧だったのかな
2018/12/01(土) 16:42:04.42ID:mW7z3f7A0
もともとは呼び出しがステートメントであって返値というものが存在しないサブルーチンと、
値を返して式の一部となる関数という区別だね。
式+;が文になるという単純化を行ったCではその区別もなくなってそれが主流になった。
副作用のないものが関数、ありえるのがサブルーチン、と定義を変えて復活はあるかも。
2018/12/01(土) 16:58:01.89ID:6zv/O1Bm0
void以外は関数って事だな
2018/12/01(土) 17:11:46.73ID:FtOkB0gI0
言語(VBとか)によっては明確な違いがあったりするけど、概念的にはサブルーチン⊃関数というイメージあるわ。
2018/12/01(土) 18:36:37.73ID:qSa8BGaMp
副作用のある手続きをほんとは関数とは呼ばないのだろうけど
Cではそんなことに頓着せず全て関数に単純化したからね

ただ本来サブルーチンとはメインルーチンと対立する文脈で語られていたものかと
これは単なる呼び出し関係だけでなく、古い言語では変数のスコープなども異なる
Cではこれも単純化してしまった
main は単にスタートアップルーチンから最初に呼び出されるという以外は
特別なスコープを持つわけでもなく、他の関数と何ら違いがない
他の関数から main を呼ぶことも、普通やらないだけで問題なく可能だ
Cでサブルーチンという名前がしっくりこないのはこの辺が理由でもあるかと
2018/12/01(土) 19:00:11.99ID:mW7z3f7A0
ああ、関数と対比されるのはサブルーチンじゃなくて正しくはプロシージャ(手続き)だね。
2018/12/01(土) 19:53:46.70ID:qSa8BGaMp
>>287
そうだけと、その辺の用語も統一されてるとは言い難いところがあるよ
AdaなどのPascal系の言語ではprocedureとfunctionという区別があるよね
まぁ値を返すかどうかという違いでしかないわけだけど
VBではPascalのprocedureに相当するのはSubであって、SubとFunctionをまとめた
上位概念としてプロシージャと言うからね
2018/12/01(土) 21:37:27.03ID:piawvWud0
mainが特別扱いされてると言えばOSが受け取れる返り値は0--255なのにint型を指定するってところとかかな。
2018/12/01(土) 22:24:12.87ID:3EVAE8120
Perl ではサブルーチンは sub で始まる。これはCの関数のようにも使える。
2018/12/01(土) 22:38:01.02ID:VxENaYkZ0
>>286
> 副作用のある手続きをほんとは関数とは呼ばないのだろうけど
> Cではそんなことに頓着せず全て関数に単純化したからね
逆だぞ。関数型が馬鹿やったから「副作用」なんて言葉が必要になったのであって。

元々Cの関数は副作用がない。これは単純に、Cの場合は引数で渡すしかないからだ。
(当たり前だがグローバルは使わないとする)
だからC全盛の時代には「副作用」なんて言っている奴すら居なかった。
関数型の連中が副作用(キリッとか気にする必要がでてきたのは、クロージャを濫用したからだ。

単純に言えば、関数に対しての値の渡し方は、
・引数
・グローバル
・this(OOPの)(=インスタンス内グローバル)
・クロージャ(=レキシカルスコープの場合は階層内グローバル)
とあって、クロージャは使い方を間違えば結合を強めてしまうんだよ。
(thisの場合は最初からクラス界面で切る《=public/privateを意識して設計する》
からそこまで酷くはならない)
Cはそれがないから、便利に書けない反面、無駄に結合するって事もない。
(少なくとも、結合していることは明示的に見える)
伊達に50年近く現役な訳でもないのさ。現役で居続けられた理由がある。

>>288
AdaとかPascalとか、最早死んで誰も使わないし使う価値もない言語を持ち出しても、
何の意味も無いと思うぜ。
それらが死んだのは、それなりの理由があるんだよ。
2018/12/01(土) 22:43:10.84ID:6zv/O1Bm0
>>291
ねえねえ、Fortranは?
2018/12/01(土) 22:58:40.52ID:fkjVwInMM
なんだCの関数には副作用なかったのか。これで安心してprintfできる
2018/12/01(土) 23:00:40.61ID:piawvWud0
Cに副作用の概念はないって……それは流石に嘘でしょう。
箇所は失念してしまったがK&Rにも関数を指して「文字列を出力したりする場合もあるので純粋な関数とは呼べない」
みたいな記述あるくらいだし。
2018/12/01(土) 23:07:56.71ID:8rj5PksfM
void君は今日も平常運転
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況