C言語なら俺に聞け 151

レス数が950を超えています。1000を超えると書き込みができなくなります。
1デフォルトの名無しさん (ワッチョイ cf8f-fy95)
垢版 |
2019/04/02(火) 11:23:37.62ID:SQXqRaAc0
!extend:checked:vvvvv:1000:512
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/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2019/06/14(金) 18:52:58.09ID:Js4PARtC0
1バイトなんか
まあそりゃそうか
2019/06/14(金) 21:41:25.35ID:WbpzR08B0
void*なんていらなくね?char*でいいじゃん
構造のわからないものは「バイト列」って意識でしょ?
2019/06/14(金) 21:47:11.03ID:Qn7Uv1x90
>>900
void *がないとmemcpyに引数を渡すとき面倒。
2019/06/14(金) 21:51:26.70ID:6z9b86iK0
double * には double * だけを許し char * や strucut foo * を渡したらアカンと
要求される型を厳しくチェックしようとすると

「ポインタだったら実体の型は何でもいい」 という指示を char * に含ますわけにはいかない
2019/06/14(金) 21:52:14.30ID:sIZagWQx0
汎用ポインタがchar*型になってたらコードレビューは絶対に通さないわ
2019/06/14(金) 22:42:50.69ID:6se/aPBa0
汎用ポインタというかvoid型という概念そのものが嫌い。
全てを厳密にやれ。言語を作る時点でまず関数に戻り値を強制すべきだったんだ。
ポインタわからん軍の原因はvoid型とかいう曖昧なせいなのがあるせいなのも一理あろうて。
2019/06/14(金) 23:06:06.10ID:sIZagWQx0
>>904
関数型言語に行ってらっしゃい
906デフォルトの名無しさん (ワッチョイ 7602-byPh)
垢版 |
2019/06/15(土) 00:02:16.99ID:n7CfuAo60
Kotlin もよろしく
2019/06/15(土) 01:25:34.80ID:RN+u9pJY0
windowsにおいて

setLocale(LC_ALL, "en_US.UTF-8");

が成功する環境と失敗する環境があるのですが何が原因かわかりません。。何かご存じの方いらっしゃらないでしょうか?
2019/06/15(土) 09:25:25.61ID:oZ4xCIwS0
>>904
お前の好き嫌いなんてどうでもいいし、よくわからん時点ならvoid*なんて無視しとけばいいだけ
この手の人は何故か全部を一気に理解しようとするけど今どきの言語仕様でそれやったら終わらんよ
2019/06/15(土) 09:37:31.78ID:pAE5sudp0
「俺の考える最強に分かりやすいポインタの説明」




・・・無理
2019/06/15(土) 10:05:45.19ID:QD7Sd0bs0
>>907
OSは?両方ともWindows10?
2019/06/15(土) 10:23:13.60ID:T0BSudQv0
>>908 void君だろ

C言語なら俺に聞け 148
https://mevius.5ch.net/test/read.cgi/tech/1537347410/37
37 名前:デフォルトの名無しさん (ワッチョイ f94f-yqSl)[sage] 投稿日:2018/09/22(土) 01:42:06.64 ID:16ZpsTnK0
>>36
マジでIDE使え。
そして貼るときはlanguageをCにしとけ。シンタックスハイライトが変わるから。
で、どれが分からんの?

> enter
> find
> delete
> show_all
> delete_all

mainはこの際分からなくていい。
最初に理解しないといけないのは show_all だ。

ただし細かいことを言ってもキリがないが、

> void show_all(void)

なんだこれ?引数 void って初めて見たぞ。文法的にありなのかこれ?
さらに酷いのは show_all 内でグローバル変数 address を掴んでいること。
普通は void show_all(tag_address* ta) だよ。
そうじゃないと複数のリストがあったときに使い物にならないだろ。

マジな話、このソースのレベルの本なら捨てた方がいい。
俺は大学の教材がいいと思うぞ。
(読んでないが)リストならググったら東工大とか出てきた。
http://www.is.titech.ac.jp/compview/clang/chap11.html
2019/06/15(土) 11:55:35.29ID:hahimQeS0
懐かしいな、void君
2019/06/15(土) 13:59:23.10ID:RN+u9pJY0
>>910
コメントありがとうございます。
8と10で成功する端末があることを確認しています。失敗する端末は今のところ10だけです。

そして

SetConsoleOutputCP(65001);

を使用することで失敗する端末でもUTF-8をコンソールに表示でき、一応目的は達成できました。

調べてみると、結局のところwindowsではsetlocaleで2バイト以上文字は設定できないとのことだったのですが、ではなぜ成功する端末があるのか……
2019/06/15(土) 15:49:06.56ID:fUxHfD4R0
謎だな
2019/06/15(土) 16:57:06.86ID:RWV4c9qt0
引数voidって古いシステムの保守でたまに見るな
2019/06/15(土) 16:59:05.33ID:5ne/m9/q0
と、古いシステムの保守なんかやったことねえやつがぬかすか
2019/06/15(土) 18:17:17.87ID:ulIUfSMj0
引数voidは今でも普通に使うけどな
2019/06/15(土) 18:22:29.22ID:5ne/m9/q0
void show_all(); なんて書くやつ見かけたらなるべく距離を置く
2019/06/15(土) 18:40:21.75ID:8bW7ANPO0
>>918
C++ ではそれは当たり前ですが…
2019/06/15(土) 18:42:04.96ID:fAAVk5UIM
>>918の場合
C++なら問題ない
C言語だとちょっと不味い
2019/06/15(土) 18:46:57.27ID:5ne/m9/q0
おまえからも距離を置きたいぜ
ここをどこだと思っている
C++なら無問題などと言わねばわからぬ者がいるとでも思っているのか
2019/06/15(土) 22:30:32.42ID:BY4KYcRQ0
とりあえず、シングルステートでも返り値をboolにする俺がやってきましたよ。
2019/06/16(日) 02:14:21.54ID:wRD2pOBha
ケースバイケースで使い分ける
2019/06/16(日) 08:10:06.75ID:ORkp7ynDM
>>921
>>918の意図が分かってない者がいるぞ
さあどうする?
2019/06/16(日) 10:35:26.32ID:jvyHVZd00
>>924
世も末だな
困ったもんだ
2019/06/16(日) 11:22:43.26ID:RqGVrKm70
大丈夫だよ
ここを見ながらシステム作っている奴はいないから
2019/06/16(日) 13:20:19.90ID:X7GbKeYn0
Cはvoid省略すると可変長引数扱いになるんじゃなかったっけ?
C++は省略してもvoidだけど
2019/06/16(日) 13:35:27.88ID:gDHKfsB60
>>927
無指定でどうこう、というのは確か C89 までの話だったかと
C99 では C++ と同じく省略しても void と記憶しています
2019/06/16(日) 13:51:25.10ID:Mp4zqsM90
>>928
破壊的変更が行われた仕様が回避できるなら回避すべきだな
2019/06/16(日) 13:58:56.49ID:VBKycPxl0
>>928
記憶違いでしょ。変わってないよ。違うと言うなら出典確認してから来てね。
http://kikakurui.com/x3/X3010-2003-01.html#93
> ...関数定義の一部でない関数宣言子の識別子並びが
> 空の場合,仮引数の個数及び型の情報がないことを指定する。
931デフォルトの名無しさん (アウアウウー Sac7-7DQ/)
垢版 |
2019/06/16(日) 15:14:33.98ID:+bML8jLFa
>>915
新しく作るプログラムでも引数なしならvoidにするよ。
まあこの頃Cで作ることそのものが減ったけどな。
2019/06/16(日) 15:41:14.25ID:rIa5AgZza
入力がない関数ってのは関数ではないな
2019/06/16(日) 15:51:28.54ID:eI7bdJXk0
>なんだこれ?引数 void って初めて見たぞ。文法的にありなのかこれ?
こんな汚物が上から目線で何かもの言ってるかと思うと反吐が出る
さっさと消えてほしい
2019/06/16(日) 16:33:52.45ID:wZzXbGgB0
>>932
なぜ入力がないと思ったんだ?
2019/06/16(日) 16:48:40.62ID:xMbXVdd30
DCL20-C. 引数を受け付けない関数の場合も必ず void を指定する
ttps://www.jpcert.or.jp/sc-rules/c-dcl20-c.html
を見ると(かなり読み解きにくいんだけど)…

プロトタイプ宣言では
int func(void); ... 引数0個
int func(); ... 関数呼び出しでの引数の整合をチェックしない

関数定義では
int func(void) {...} ... 引数0個
int func() {...} ... 引数0個

って具合に func() の解釈が一貫していない、
だから引数0個の関数は同じ形になるようにvoidをつけましょう、
という話に思える。
この辺が議論の混乱を生んでるんじゃないかな。

ついでに関数定義の int func() {...} の形式は廃止予定とも出てる。
プロトタイプの方は廃止予定ではない、ってことかな。
2019/06/16(日) 17:08:16.47ID:jvyHVZd00
そこでjpcertを持ち出すのは興醒めだ
どっかの馬の骨が「こうすべき」と主張してるってだけな話は
現実のマシンの動きとそれ束縛しているiso/iec9899でどうなのかという話とは論点が違う
2019/06/16(日) 17:32:48.77ID:xMbXVdd30
>>936
JPCERTを引用したのは「プロトタイプ宣言と関数定義とで
引数部が空の関数 func() の引数の解釈が違う」って話を
根拠つきで引き出すためでな。 >>927-930 あたりの流れを受けて。
規格の文章が並べて載ってるので都合が良いのだ(読みにくいけど)。

実際のところ、JPCERTのルールっていうか提案には
俺も全面的に賛成してるわけじゃない。むしろ強く反発する部分もあったり。
2019/06/16(日) 19:00:02.87ID:jvyHVZd00
必要ねえじゃん
iso/iec9899の条文を引用して
その箇所がどのように解釈できると
自分の言葉で言えばいいのを
虎の威を借る形でサボる怠慢を
読まされる側は付き合ってらんねー
939デフォルトの名無しさん (アウアウウー Sac7-7DQ/)
垢版 |
2019/06/16(日) 19:52:17.11ID:5fyh92Dva
>>932
そうだね。関数ではないね。しかしCだと処理をまとめる方法が関数しかないから仕方がないね。
940デフォルトの名無しさん (アウアウウー Sac7-7DQ/)
垢版 |
2019/06/16(日) 20:02:46.68ID:5fyh92Dva
まあしかし getchar() みたいにプログラムとは無関係な所から取ってきた値を返すとか、バッファやstatic変数で外部からアクセスできない変数の内容を返すみたいな処理は必要だから引数なしも必要だ。
グローバル変数やハードウエアの初期化処理だけまとめて書きたいなんて時にも使える。
2019/06/16(日) 20:22:18.78ID:6QFVwEqYd
○○Initialize()
的な関数の存在に違和感ないんだが
2019/06/16(日) 20:26:17.96ID:rIa5AgZza
クラスのメンバーの操作だとしても、だったらそのクラスのコンテキストを渡すのが正しいだろうとは思うけどね。
現実としてはまあ規模による。
2019/06/16(日) 20:40:48.32ID:Mp4zqsM90
プログラムの関数は数学の関数とは微妙に違うから仕方ない
仕方ないと思えない奴らが関数型言語を作った

兎に角Cでは本来の関数に制限するのは事実上不可能
2019/06/16(日) 20:47:50.76ID:EhqtZL1+0
functionって関数の他に機能って意味もあるけど、英語圏の人はどちらの意味で使ってるんだろうね?
2019/06/16(日) 21:15:12.39ID:gDHKfsB60
>>944
多分語義をわざわざ意識していないと思われ
946デフォルトの名無しさん (アウアウウー Sac7-7DQ/)
垢版 |
2019/06/16(日) 21:19:48.09ID:paRCIAHRa
>>942
オブジェクト指向言語のクラスだとプロパティでゲッターやセッター作る事があるが、ゲッターは普通は引数なしだな。
で、そういう言語ではだいたいはメソッドの引数なしで ()にしとけばC言語での(void)と同じ意味になる。
2019/06/16(日) 21:39:10.07ID:KLVL0nwc0
機能という意味で言いたいときは、functionalityという単語もある。
2019/06/16(日) 22:26:00.96ID:rIa5AgZza
ゲッターセッター自体が、本当にそれ要るのかって思うこと多いよ。
手元にインスタンス持ってるわけだしさ。
2019/06/16(日) 23:14:47.03ID:2lhSAUjOM
ゲッターセッターはインスタンス変数を隠蔽化することでインスタンス間の結合強度を下げるのが目的
なんでもなんでもインスタンス内部の構造に直接アクセスするとOOPの意味がない
2019/06/16(日) 23:22:32.20ID:rIa5AgZza
いや、ゲッター使うんだったら隠蔽できてないじゃん。
2019/06/16(日) 23:34:39.49ID:Fv7+hlk/0
昔ゲッターセッターってスレッドセーフにするための仕組みだと思ってた。
それくらいしか意味が思いつかなかった…
2019/06/16(日) 23:43:48.77ID:3o8UCwiCa
そうね、なんか前後に処理を入れるくらいの使い方はある。
でもそもそもその値を使う処理をそのクラスに持たせるのが隠蔽ということだね。
2019/06/16(日) 23:45:38.60ID:7nwjMCFt0
今の仕組み上での利点としては
GetterSetter作ることで
インターフェースに適合させれるようになる

Cは知らん
2019/06/17(月) 00:04:18.25ID:0K02i6cy0
Cのスレで言っても仕方ないが
オブジェクト指向においてクラス外からフィールドに直接アクセスするのは禁じ手だぞ
2019/06/17(月) 00:10:42.98ID:seiOMGnS0
getter/setterなんてうざいだけだぜ
メンバ変数直でいいじゃん
2019/06/17(月) 00:23:14.51ID:YSrJE9j8a
>>954
そうそう、だからゲッターは駄目なんだよね。
C++でclassとstructのアクセス範囲が異なる理由がわかってない人が多すぎる。
2019/06/17(月) 00:26:17.86ID:0K02i6cy0
>>955
お前には一生オブジェクト指向は無理だな
2019/06/17(月) 00:39:11.63ID:YSrJE9j8a
まあ、ゲッター使うのはバカ。
データとメソッドを集約しないのはオブジェクト指向ではない。
ゲッターとセッターしかないオブジェクトなんて構造体で充分。
2019/06/17(月) 01:11:23.59ID:J2deS77t0
たしかPythonだとgetterもsetterも推奨されてないんだっけ?
960デフォルトの名無しさん (ワッチョイ 7602-byPh)
垢版 |
2019/06/17(月) 02:13:20.34ID:BSqpudUb0
文字列クラスで文字数返すやつなんかはゲッターの一種だが、ああいうのは必用だよな。
文字数指定する事が出来るようにする場合もセッター必用だよな。
2019/06/17(月) 06:18:25.03ID:6C3tyyZH0
データメンバ直でもラッパーを挟めるなら問題なし
2019/06/17(月) 07:27:38.45ID:yl5KJ/vEM
問題ないというよりも下手な設計をとりあえずカプセル化する時はラッパー被せて誤魔化すしかない
2019/06/17(月) 08:27:04.42ID:ikLTlFyV0
ゲッタって仮想関数にする?
2019/06/17(月) 08:52:31.79ID:sn1adIo3a
ラッパーって関数に対して被せるもんだろ?
メンバー変数のラッパーってなんだよ
2019/06/17(月) 08:57:03.61ID:mR1b1vjg0
「メンバ書き換えたから更新よろしくな関数」の呼び出しで
やっと内部状態が変更するようなしくみ?
2019/06/17(月) 09:09:34.98ID:8UjaS7YF0
>>960
ゲッターとセッターは使わないのが主流

とくにゲッターとか名前からしておっかねーだろ
2019/06/17(月) 09:34:11.11ID:sn1adIo3a
真とかエンペラーとかいろいろあるしな
968デフォルトの名無しさん (アウアウウー Sac7-7DQ/)
垢版 |
2019/06/17(月) 12:37:41.39ID:WHxj8IY7a
>>966
え?でも値のセットや取得時に何か処理が必要なやつはゲッターやセッターではないの?
名前がそれっぽくなくて普通のメソッドだったとしても機能としてはそうなるよな。
2019/06/17(月) 12:44:11.30ID:6pEy3XEna
>>968
だから、何故値を取得する必要があるのかと
2019/06/17(月) 13:06:30.69ID:0K02i6cy0
値を取得する必要ガーとか馬鹿なのか?
主要言語の標準ライブラリにGetterを含まないクラスとかまず無いぞ
2019/06/17(月) 13:27:51.70ID:6pEy3XEna
>>970
引数のvoid見たこともないのによくそんなこと言えるな…
972デフォルトの名無しさん (アウアウウー Sac7-7DQ/)
垢版 |
2019/06/17(月) 13:33:44.73ID:WHxj8IY7a
>>969
例えばファイルデスクリプタのようなものもそのデスクリプタによって識別されるファイルに関する情報の読み書きをするオブジェクトと言えるが、それ使ってファイルのバイト数を取得するとかデータを読み書きするとか、普通にやるよね。
2019/06/17(月) 13:42:27.76ID:qKjcjk6x0
猿でもわかるポインタって本誰か出せよ
2019/06/17(月) 14:24:17.06ID:6pEy3XEna
>>968
そのオブジェクトの中で密接にデータと関連する処理だったらゲッターは使わんでしょう。this->hogeを直接使うだけ。
あとたぶんあなたの場合はセッターゲッターの神髄を知らんと思う。単に構造体のメンバーにアクセスするだけのメソッドをイメージしてもらえれば。
2019/06/17(月) 14:25:01.27ID:6pEy3XEna
974は972あてね
2019/06/17(月) 14:25:36.67ID:FBMbqlks0
>>968
https://dotup.org/uploda/dotup.org1874697.jpg
ゲッターはあぶない
2019/06/17(月) 14:40:56.45ID:lfEwbGXOM
同一インスタンス内なら余計なことしなくても直接アクセスできる
セッターゲッターは他のインスタンスの変数にアクセスするための手段
オブジェクト間のメッセージパッシングにセッターやゲッターを利用する
978デフォルトの名無しさん (アウアウウー Sac7-7DQ/)
垢版 |
2019/06/17(月) 14:41:55.67ID:WHxj8IY7a
>>974
あー。それでもリードオンリーにしたい時に言語にその機能がないならゲッターだけ作るよね。
Kotlinの場合はvalで済んじゃってしかも自動でゲッター作られてるけど。

で、真髄って何?
2019/06/17(月) 15:00:44.76ID:6pEy3XEna
>>978
リードオンリーとか言わず、読ませなきゃいいじゃん
980デフォルトの名無しさん (アウアウウー Sac7-7DQ/)
垢版 |
2019/06/17(月) 15:49:21.53ID:WHxj8IY7a
>>979
上で書いた文字列クラスの場合の文字数とかファイルのバイト数とか、外部から読めないとまずいものがあると思うんだが。
2019/06/17(月) 15:57:28.98ID:6pEy3XEna
>>980
たとえばstd::stringのメソッドでgetってついてるのget_allocatorとgetlineくらいだよね。setなんてないし。
ゲッター感のあるやつ無くない?要らないのでは?
2019/06/17(月) 16:10:03.98ID:qeDnhEK2M
メンバー変数はreadonlyなどの属性ではなくてprivateアクセス権限を設定して他オブジェクトから隠蔽するのが一般的
2019/06/17(月) 17:25:37.86ID:0K02i6cy0
なんでC++とかいう後付けのオブジェクト指向もどき言語で延々と語ってるんだろうか…
2019/06/17(月) 17:48:43.23ID:6pEy3XEna
>>983
そりゃもう、javaについで保守的だから。
他の意識高い感じの言語だとゲッターセッターなんて発想はありえないでしょ。
2019/06/17(月) 17:52:05.72ID:0K02i6cy0
>>984
保守的?単なる継ぎ接ぎの欠陥言語だぞ

C#だとプロパティで隠蔽されてるが結局はGetter/Setterだな
2019/06/17(月) 18:00:37.93ID:6pEy3XEna
>>985
つまり、Cの構造体アクセスは実質ゲッターセッターだという主張か?
2019/06/17(月) 18:01:53.33ID:0K02i6cy0
>>986
お前は何を言ってるんだ…
2019/06/17(月) 18:11:27.38ID:6pEy3XEna
>>987
引数void馬鹿を馬鹿にしてんだよ。わからんか?
2019/06/17(月) 18:13:51.25ID:Qf1//+vQd
そろそろ次のスレ
990デフォルトの名無しさん (アウアウウー Sac7-7DQ/)
垢版 |
2019/06/17(月) 18:24:49.71ID:3L1/L9kLa
>>981
うーん。C++のクラスで喩えられてもすがわからんなあ。C++この頃全然やってないし。
昔ちょっとC++Builder使ったことあるがDelphiの延長線上の使い方しかしなかったし。

とりあえずJavaで言うとそれは何にあたるんだ?
Kotlinでもいいぞ。
991デフォルトの名無しさん (アウアウウー Sac7-7DQ/)
垢版 |
2019/06/17(月) 18:26:16.26ID:3L1/L9kLa
すが、じゃねえ、すぐだ。
スマホだと間違いが変になるな。
992デフォルトの名無しさん (アウアウウー Sac7-7DQ/)
垢版 |
2019/06/17(月) 18:28:01.53ID:3L1/L9kLa
次スレ

C言語なら俺に聞け 152
https://mevius.5ch.net/test/read.cgi/tech/1560763630/
2019/06/17(月) 19:42:03.79ID:biel+EqR0
>>992
>>2-3 あたりの
「次スレを作るときは…」の説明を書き足さなくて良いのかしら?
自分、その辺の正しい立て方を知らず下手に書き加えられないので指摘だけ。
2019/06/17(月) 20:01:23.71ID:vIcnvKOP0
IDを非表示にする場合
!extend:none::1000:512

IDを表示し、強制コテハンは表示しない(5ch標準設定と同じ)
!extend:checked::1000:512

IDを表示し、IPアドレスを表示
!extend:checked:vvvv:1000:512

IDを表示し、強制コテハンを表示
(レスの名前欄に「ワッチョイ」「スプー」「ササクッテロ 」などのニックネームがつく)
!extend:checked:vvvvv:1000:512 ← 今はこれ

IDを表示し、IPアドレスと強制コテハンを表示
!extend:checked:vvvvvv:1000:512

RONIN使えばまた表示を消せるので、強制とは言いがたいが
2019/06/17(月) 20:16:07.33ID:/ODDlXVN0
ああワッチョイ消してる奴ってRONIN使ってるのか
知らなかったな
2019/06/17(月) 20:27:33.84ID:IK9o4iD50
密結合を避ける
2019/06/17(月) 20:55:12.93ID:mDiaA7dQ0
>>995
RONIN 餅ですがワッチョイの消し方がわからないのです、消すつもりもないのですが…
2019/06/17(月) 21:23:19.93ID:J2deS77t0
名前欄に!slip:verboseじゃないの?
コテハンとかはどうなるかまでは知らないけど
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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