C言語なら俺に聞け 162
1 :デフォルトの名無しさん :2023/10/30(月) 17:13:00.82 ID:hHEGE8Ol0.net !extend:checked:vvvvv:1000:512 (新スレ立ての際上記コマンドを2行書き込んでください) C言語の話題のみ取り扱います C++の話題はC++スレへ 質問には最低限の情報(ソース/コンパイラ/OS)を付ける 数行で収まらないソースは以下を適当に使ってURLを晒す https://paiza.io/ https://ideone.com/ http://codepad.org/ C17 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf C11 http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf C23 最新ドラフト https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.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言語なら俺に聞け 161 https://mevius.5ch.net/test/read.cgi/tech/1682053520/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2 :はちみつ餃子 :2023/10/30(月) 17:30:23.87 ID:I7fISnX+0.net 2get
3 :はちみつ餃子 :2023/10/30(月) 17:31:34.22 ID:I7fISnX+0.net C23 の最新ドラフトは N3096 に更新されてるでよ https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3096.pdf
4 :デフォルトの名無しさん (ワッチョイ eb63-c8RC) :2023/10/30(月) 19:05:35.74 ID:i+814vap0.net >>1 乙です
5 :デフォルトの名無しさん :2023/10/30(月) 19:40:56.11 ID:PfgrnUqg0.net いまどきPlain Cが使われる状況なんて限定的なんだから 高級アセンブラとして堂々としてればいいんですよ
6 :デフォルトの名無しさん :2023/10/30(月) 20:35:57.87 ID:YnJZjusKM.net トッピングは何になさいますか?
7 :デフォルトの名無しさん :2023/10/30(月) 21:04:03.03 ID:re6vYA8I0.net リモートワーク制度が削減・廃止されたら「転職や別案件を探す」が4割-- 「Offers」登録者調査 ITエンジニア/デザイナーの副業・転職サービス「Offers」を提供するoverflowは、 同社が運営する「Offersデジタル人材総研」にて「リモートワーク実態調査2023」 を公表した。 これによると、リモートワークになり、5人に1人が引っ越したと回答した。そのうち、 現職でリモートワーク制度が削減・廃止された場合、「転職や別案件を探す」という 回答が44.0%にものぼった。一方「会社と交渉する」という回答は40.0%、 「引っ越さず受け入れる」が12.0%となった。 さらにリモートワークを希望している理由として「通勤時間が無駄だと感じている」が 87.7%でトップとなった。このほか「個人の時間ができる」(62.3%)、「副業を続け やすいから」(39.6%)、「子育てができる」(35.8%)と続いた。
8 :デフォルトの名無しさん (ワッチョイ 194e-FUJr) :2023/10/31(火) 09:59:32.82 ID:DBRUqQAF0.net 前スレではちみつさんが書いてくれたリンク見ました。thx https://go.dev/tour/flowcontrol/13 曰くGOの defer は deferred function calls 遅延関数呼び出し で、関数脱出時にlast-in-fast 順で呼ぶもの とすると、C言語でdeferの仕様追加要求は却下すべきです。リンクリスト1個作れば済む話で、実際そうしてる人も多数いるだろうに、既存プログラムでdeferというシンボルを使ってるのをコンパイル通らなくしてまで仕様追加するのは利益が小さすぎる。 エラー処理で使うかは、直接関係ないですね。そうしたきゃすればいいけど、私は読みやすいコードとは思わない、です
9 :デフォルトの名無しさん (ワッチョイ 937c-cQ99) :2023/10/31(火) 12:23:13.16 ID:9gnUDJNP0.net >>8 >関数脱出時にlast-in-fast 順で呼ぶもの > >とすると、C言語でdeferの仕様追加要求は却下すべきです。 この「とすると」からの繋がりが意味不明。 >リンクリスト1個作れば済む話で、 だから何? 「却下 *すべき*」の理由になってない。 採用するほどでない、なら理解できる。 > 既存プログラムでdeferというシンボルを使ってるのをコンパイル通らなくしてまで仕様追加するのは利益が小さすぎる。 ここでのdeferは機能についての名称として使ってるだけで、そのままの文言じゃないことを理解できてないみたいだ。
10 :デフォルトの名無しさん :2023/10/31(火) 15:34:02.36 ID:DBRUqQAF0.net >>9 話が通じてないと思います C言語の建設的な議論なら応じたいけど
11 :デフォルトの名無しさん :2023/10/31(火) 15:38:26.62 ID:/TBQ8etM0.net ブログ立てて、そこでやれ
12 :デフォルトの名無しさん :2023/10/31(火) 15:39:17.26 ID:803Tgyvr0.net >>8 どうせコンパイルオプションで無効にすれば使えるだろ
13 :デフォルトの名無しさん :2023/10/31(火) 16:18:39.83 ID:9gnUDJNP0.net >>10 おまえの感想 >>8 のどこが建設的な議論よ?
14 :デフォルトの名無しさん :2023/10/31(火) 16:24:39.17 ID:1/1CCAX60.net ボクの考えた最強のC言語を語るスレはこちら 【超高速】C/C++に代わる低級言語を開発したい 8 http://mevius.5ch.net/test/read.cgi/tech/1345730580/
15 :デフォルトの名無しさん :2023/10/31(火) 16:36:27.63 ID:RXeEqnvz0.net deferは(素のものをじゃなくてもう少し高機能な)プリプロセッサで対応出来る breakやreturnの直前にdeferの内容を全部コピーしとけばいいだけ まぁそれ言い出すと、C++をCに変換するプリプロセッサが有れば全て解決だがなw
16 :デフォルトの名無しさん :2023/10/31(火) 16:37:42.80 ID:DBRUqQAF0.net ただのどこかのオッサンの意見が気に食わんなら別にそれでもいいよ… 各自自分の考えを語ればいいじゃん、そんな食いつくくらいならなんか一つくらいは「自分のアイデア」あるんでしょ?何もないの?
17 :デフォルトの名無しさん :2023/10/31(火) 16:39:39.94 ID:DBRUqQAF0.net >>13 既存の「正しいプログラム」が「正しいプログラムであり続ける」 そんなにおかしいことかね
18 :デフォルトの名無しさん :2023/10/31(火) 16:43:21.14 ID:5ddE/sJo0.net 既に進行中の「建設的な議論」をご用意しました 以降の議論はこれを前提として積み重ねていただくようお願い申し上げます https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2895.htm
19 :デフォルトの名無しさん :2023/10/31(火) 16:43:26.09 ID:5ddE/sJo0.net 既に進行中の「建設的な議論」をご用意しました 以降の議論はこれを前提として積み重ねていただくようお願い申し上げます https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2895.htm
20 :デフォルトの名無しさん :2023/10/31(火) 16:57:17.68 ID:C1aTagsw0.net >>19 なんか、機能はともかく見た目はだいぶ汚いコードになるね
21 :デフォルトの名無しさん :2023/10/31(火) 17:12:55.99 ID:9gnUDJNP0.net >>17 全然おかしく無いよ。 互換性は非常に重要。 でもおまえは新しい機能は追加するなって言ってるだけだよね。 おまえの言い分だとプロトタイプ宣言必須になるのは、過去の「正しいプログラム」が正しくあり続けることできないから「却下すべき」案なんだよな。
22 :デフォルトの名無しさん :2023/10/31(火) 17:17:03.54 ID:9gnUDJNP0.net >>21 プロトタイプ宣言とK&Rスタイルの関数定義がごっちゃになってるわ。 >>21 は回線切って首吊れば。
23 :デフォルトの名無しさん :2023/10/31(火) 17:41:26.94 ID:1/1CCAX60.net >>19 俺はGOで組んだことないからそこに書かれてる処理系依存のtry/finallyのが馴染みがあるしスマートに見えるわ キモい輩って世界中に居るんだな
24 :デフォルトの名無しさん :2023/10/31(火) 17:59:35.29 ID:iHc07kUm0.net >>23 君は中傷せずに会話できないのかね?
25 :デフォルトの名無しさん :2023/10/31(火) 21:23:39.92 ID:DBRUqQAF0.net 21 と 22 のワッチョイとIDが同じで表現が口汚いのはどう解釈したらいいの?私には難しくて分かりませぬ
26 :デフォルトの名無しさん :2023/11/01(水) 03:27:47.22 ID:3HySGS93d.net いつもの復オジωωω スルー決定ωωωωωωωωω
27 :デフォルトの名無しさん (ワッチョイ e110-H9h+) :2023/11/01(水) 07:56:22.02 ID:9FKdtRs60.net 容認→警告→禁止推奨 となった仕様が幾つあったか・・・。
28 :デフォルトの名無しさん :2023/11/01(水) 09:43:55.98 ID:g4eyJzirM.net 言語の設計思想と立ち位置考えれば手を入れる必要ないでしょ 細かいのはあるにしても関数プロトタイプの導入、データ型の追加、stdioのセキュリティ強化くらいでCとしては充分 構文追加とかバカすぎてANSI Cもまず取り込まんよw
29 :デフォルトの名無しさん (スプッッ Sd73-cQ99) :2023/11/01(水) 12:36:29.63 ID:YeBzjhT2d.net >>28 >細かいのはあるにしても関数プロトタイプの導入、データ型の追加、stdioのセキュリティ強化くらいでCとしては充分 その挙げ句MISRA-Cみたいなのがでてくる。 >構文追加とかバカすぎてANSI Cもまず取り込まんよw C23の属性とか知らんの?
30 :デフォルトの名無しさん (ワッチョイ 2945-kYJB) :2023/11/01(水) 13:21:32.97 ID:DFYs67SD0.net c23だと属性以外にも enum Colour : char { Red, Green, Blue }; とか auto i = 123L; とかも構文変更になる constexprもコンパイラにとってはかなり大きい 文字列のハッシュ値の計算とか、コンパイル時にCのコードを実行できる
31 :デフォルトの名無しさん (ワッチョイ 2945-kYJB) :2023/11/01(水) 13:30:10.50 ID:DFYs67SD0.net clangとかはconstexprを使わなくても、最適化で勝手に整数に置き換わってるとか普通に有るけどねw constexprはそれを確実に保証出来るので、精神衛生上良い
32 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 933e-g5YV) :2023/11/01(水) 15:17:19.83 ID:m2/+vlXa0.net >>30 C23 の constexpr は関数には付けられない。 高度なコンパイル時計算をするものではない。
33 :デフォルトの名無しさん (ワッチョイ 2945-kYJB) :2023/11/01(水) 17:07:45.92 ID:DFYs67SD0.net >>32 なるほど!ちょっと中途半端な状態なんだな…
34 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 933e-g5YV) :2023/11/01(水) 17:37:30.95 ID:m2/+vlXa0.net C++ の const 指定は初期化子が定数 (定数式) なら指定が付けられた変数も定数になるという規則なんだが C の const は単に書き換えが禁止されるだけで定数になることはない。 (処理系の拡張によって一部の状況で定数扱いされることはある。) C で定数を作ろうとすると #define を使うか enum を使うかしかなかったので 定数を定義するための直接的な方法として constexpr を導入しようという判断は納得できる。 定数を定義するまともな方法がないってのは C の明らかな欠陥なので それを改善するという話でしかなくて、 コンパイル時計算を推進する野心の始まりってわけではないと思う。 なので constexpr については (遠い将来はともかく現時点では) これで完了。 中途半端ってこたぁないというのが私の感覚だな。
35 :デフォルトの名無しさん (ワッチョイ 2985-g3nS) :2023/11/01(水) 21:28:22.72 ID:3Yx3b9sx0.net 気に入らないって理由なの?
36 :デフォルトの名無しさん :2023/11/01(水) 23:56:27.24 ID:DFYs67SD0.net 書き換えが禁止されても定数ではないとはこれいかに… ここでいう定数はコードに直接埋め込まれる値ということだろう ただ、C++もstatic constにしないと定数にならないと思ったけど、 constだけだとちゃんとメモリが確保されてると認識してたな
37 :はちみつ餃子 :2023/11/02(木) 01:38:41.62 ID:9IBKBW6G0.net 言語仕様上の用語としては定数は定数が要求される箇所に書くことが出来るもののことだよ。 単純な例で言えば、↓これは C++ ではアリだが C ではダメ。 (clang のデフォルトだと通してしまったりもするようだが……。) const int foo = 1; enum bar {baz = foo}; int main(void){} もちろん最適化によって効率的な扱いがされやすくなることも多いにせよ、直接には求められてない。 定数であってもアドレス演算子は適用が可能だし、あくまでも変数なので見かけ上はメモリ上にある。 C++ で static const にしないと定数にならないというのはデータメンバのとき。 普通のデータメンバはオブジェクトを生成するときまで初期化されていないことになっているので コンパイル時には確定できない。
38 :デフォルトの名無しさん :2023/11/02(木) 09:19:48.35 ID:kxWwWLf8a.net const int foo = 1; char hoge[foo]; int main(void){}
39 :デフォルトの名無しさん (スフッ Sd33-IqBQ) :2023/11/02(木) 10:39:43.14 ID:9MQ+Mdatd.net 2-pass コンパイルを実装してほしい struct Fuga; struct Hoge { struct Fuga *fuga; }; struct Fuga { ... こんなのとはおさらばしたい
40 :デフォルトの名無しさん (ワッチョイ eb63-c8RC) :2023/11/02(木) 10:41:08.08 ID:VWEHs6hL0.net そういう配列宣言でdefine使わないとどういうメリットがあるの?
41 :デフォルトの名無しさん :2023/11/02(木) 12:23:28.61 ID:R1/lC5p9d.net >>40 デバッグ時にシンボル表示できる。
42 :デフォルトの名無しさん :2023/11/02(木) 15:51:31.06 ID:7f41Qrwa0.net もしかしてそれって、C言語の仕様じゃなくてデバッガとかビルドシステム側の機能改善でできそうって気がしませんか? デバッガが読んで参考にできるかもしれない情報の豊富さの、なんとなくの並び ↓ ■実行形式にシンボル情報がない ■実行形式にシンボル情報がある ■ソースコードがあるけどデバッガはビルド情報知らない ■ソースコードがありデバッガがビルドの情報も知ってる clang とかLLVM界隈ってそういう情報(どういう?ビルド時しか分からん情報というか?)をうまく使おうぜ方向を目指してる気がします、知らんけど
43 :デフォルトの名無しさん :2023/11/03(金) 00:15:50.32 ID:M0kCm9U+0.net その例だとデバッグ時に数字で表示されたほうが安全じゃないか
44 :デフォルトの名無しさん (アウアウウー Sad5-g+2W) :2023/11/03(金) 08:01:57.68 ID:rVBPlXQLa.net >ソースコードがありデバッガがビルドの情報も知ってる 両方持ってるのは本物のプロと練習集の初心者素人と両極端に分かれそう
45 :デフォルトの名無しさん (ワッチョイ 29d7-WJPr) :2023/11/03(金) 09:53:21.84 ID:M0kCm9U+0.net 何言いたいんだか全くわからんが
46 :デフォルトの名無しさん :2023/11/03(金) 10:12:48.61 ID:R1GL3fqM0.net 生涯修行僧
47 :デフォルトの名無しさん (ワッチョイ 5324-zW/F) :2023/11/03(金) 11:32:32.93 ID:8bACdtpR0.net >>42 当然だけど規格の話じゃないよ 気がしませんかっていうかコンパイラとデバッガは何十年も前からそうやって連携してる
48 :デフォルトの名無しさん (ワッチョイ 5324-zW/F) :2023/11/03(金) 11:34:06.16 ID:8bACdtpR0.net >>43 数字で表示されないと具体的に何が非安全だと心配してるの?
49 :デフォルトの名無しさん (ワッチョイ 29d7-WJPr) :2023/11/03(金) 21:59:08.35 ID:M0kCm9U+0.net 次に実行するコード >hoge[2] = 0; となった時に char hoge[foo]; と表示されてると次にfooの値を探すので二度手間 char hoge[1]; と表示されてれば一度ですむ
50 :デフォルトの名無しさん (ワッチョイ 827c-RmzB) :2023/11/04(土) 00:06:31.86 ID:nDDUhOSB0.net >>49 何のためにシンボル使うのかわかってないな。 実際の値と値の持つ意味について考えたほうがいいぞ。
51 :デフォルトの名無しさん (ワッチョイ 6dd7-HQPe) :2023/11/04(土) 00:27:05.12 ID:uAZ656n/0.net 哲学には興味ない なんのためにデバッガ使うかわかっているので充分だ
52 :デフォルトの名無しさん :2023/11/04(土) 02:19:34.08 ID:nDDUhOSB0.net >>51 なんだ実際のデバッガ使ったことないのか。 普通はシンボルだけじゃなくて値も表示するんだが。
53 :デフォルトの名無しさん (ワッチョイ 6dd7-HQPe) :2023/11/04(土) 09:05:55.97 ID:uAZ656n/0.net ずいぶん安い煽りに転じたな 表示される情報は最小限のほうがいいんだよ 仕事で使っていればそうなる
54 :デフォルトの名無しさん (ワッチョイ 653d-2MVi) :2023/11/04(土) 10:09:07.16 ID:lvandghk0.net 自分はデバッガ使う段階なら定数は具体値が出てくれた方がいいです クロスコンパイル環境の構築からとか、Cならではの現場を辿って来た人と、今どきのGUIのデバッガが前提の人では話は合わなそう マウスかざせば済むじゃんと思ってるのでは
55 :デフォルトの名無しさん :2023/11/04(土) 11:08:29.93 ID:dBvv25rw0.net >>43 にアンカうったら>>49 で手間がどうこうって返ってきたんだがそういうのを安全って言うのか?? 個人的には>>52 と同感でマクロにしてもenumにしてもシンボル・値両方確認出来るもんだと思ってたから どんな環境を想定して言ってるのかちょっとよく話が掴めないな
56 :デフォルトの名無しさん :2023/11/04(土) 11:41:50.34 ID:A3cqUl0FH.net gdbなどのデバッガー使っていれば変数名と型と値は全て表示される 必要であれば配列は全ての要素を展開して表示も出来るけどな
57 :デフォルトの名無しさん :2023/11/04(土) 11:48:12.60 ID:4yCaeT2N0.net printfでOK
58 :デフォルトの名無しさん (アウアウウー Saa5-CWlg) :2023/11/04(土) 12:21:19.50 ID:KPpuxUoxa.net シンボルの方が意味が判って良いけどな 「マウスかざせば良い」はその通り 場合によっては watch 式
59 :デフォルトの名無しさん :2023/11/04(土) 13:42:18.42 ID:p2sqqR+o0.net デバッグ段階で意味がいるのか?
60 :はちみつ餃子 :2023/11/04(土) 13:50:23.07 ID:ocaBqo/v0.net デバッガもその設計思想によるだろう。 ソースレベルデバッグなら言語の評価モデルに一致するのが自然だと思う。 そうなるとシンボルのほうが主役で、評価されれば値になるし一部は事前にわかる場合もある。 バイナリ寄りのデバッガなら シンボル情報 (デバッグ情報) を扱えるものであってもまずそこにあるのは具体的な値であって、 値のほうをメインに見せる (シンボルは補助的な情報) のが筋に思える。
61 :デフォルトの名無しさん :2023/11/04(土) 14:07:46.76 ID:nDDUhOSB0.net >>53 お前はアドレスさえわかれば関数名も変数名も不要なんだろうな。 俺はソースレベルデバッグを想定してたけどお前は違うの?
62 :デフォルトの名無しさん :2023/11/04(土) 14:20:50.41 ID:nDDUhOSB0.net >>54 Cのソースレベルデバッガはgdbとそのラッパー(dddとかKDEのkdebug)しか使ったこと無いな。 お前は何使うの?gdb以外のデバッガにはちょっと興味あるかも。 あと、いつのまにかデバッグの話にすり変わってるけど、元は >>40 で *コード書くとき* の話だからな。 >>41 のせいだな。
63 :デフォルトの名無しさん :2023/11/04(土) 15:58:28.43 ID:lvandghk0.net 例の人ですか?
64 :デフォルトの名無しさん :2023/11/04(土) 19:42:10.24 ID:Q+jfxr6/0.net >>62 スレを私物化してないか?
65 :デフォルトの名無しさん :2023/11/04(土) 21:41:26.73 ID:W1fOq5zR0.net Cは単純だからぽいんた辺りで躓かない限り特に疑問は生まれずスーっと大脳皮質に浸透していく それに比べて自称モダン言語の気持ち悪さよ Cが無かったらプログラミングなんてやってなかったろうな
66 :デフォルトの名無しさん :2023/11/04(土) 21:47:47.71 ID:vTgEadDD0.net Cも関数ポインタとかたいがいきしょいぞ
67 :デフォルトの名無しさん :2023/11/04(土) 21:53:04.57 ID:W1fOq5zR0.net Cの関数ポインタはそれ以上でもそれ以下でもない セキュリティが緩い頃は関数ポインタを駆使すれば関数型言語で言う所の関数のファーストクラスも実現できた この時やはりコードとデータは分かれているべきと判りみ と同時にオブジェクト指向は間違った思想と気付く
68 :はちみつ餃子 :2023/11/04(土) 21:57:40.47 ID:ocaBqo/v0.net 少なくとも宣言については無茶苦茶な文法だけどな。
69 :デフォルトの名無しさん :2023/11/04(土) 22:08:52.30 ID:vTgEadDD0.net C++になると更にきしょいメンバ関数ポインタがあるが
70 :デフォルトの名無しさん :2023/11/04(土) 22:36:43.09 ID:vTgEadDD0.net #include <iostream> using namespace std; struct Hoge { int hage_; int mage () const {return hage_;} }; void func (const Hoge &obj, int (Hoge::*func) () const) { cout << (obj.*func) () << '\n'; } int main () { void (*f) (const Hoge &, int (Hoge::*) () const) {&func}; Hoge hoge {10}; (*f) (hoge, &Hoge::mage); return 0; } きめぇ
71 :デフォルトの名無しさん :2023/11/05(日) 00:14:17.78 ID:u007GASC0.net 次の仕様拡張で関数配列が導入されます(嘘)
72 :デフォルトの名無しさん (アウアウウー Saa5-CWlg) :2023/11/05(日) 10:34:57.51 ID:ol9bMVcca.net >>59 とか >>60 の後者の人とかは ゲーマーか逆アセか改造チートでもしてんのかなと思う
73 :デフォルトの名無しさん (ワッチョイ 2e63-sdYh) :2023/11/05(日) 10:45:42.91 ID:u007GASC0.net 定数はともかく変数の値の変化を監視するとなれば話は変わりますよ
74 :デフォルトの名無しさん (ワッチョイ c191-HQPe) :2023/11/05(日) 10:52:46.61 ID:dHgdjFj00.net >>66 単に機種依存なくしてユニバーサル化したアセンブラだからキモいも何もない 感覚的に受け付けないという方はもうすぐAIで自然言語でプログラムできるようになるからそれまで待てばいいじゃん
75 :デフォルトの名無しさん (アウアウウー Saa5-CWlg) :2023/11/05(日) 11:02:20.21 ID:ol9bMVcca.net >>70 こう描けばそこまでキモくない #include <iostream> using namespace std; struct Hoge { int hage_; int mage () const {return hage_;} }; void func (const Hoge &obj, int (Hoge::*p) () const) { cout << (obj.*p)() << '\n'; } int main () { void (*f) (const Hoge &obj, int (Hoge::*p) () const) = func; Hoge hoge {10}; f(hoge, &Hoge::mage); return 0; }
76 :デフォルトの名無しさん :2023/11/06(月) 13:51:35.97 ID:4BOQTpQoa.net >>75 using使えよ
77 :デフォルトの名無しさん :2023/11/08(水) 13:50:08.70 ID:ySVrNoqw0.net C++の話はスレチ
78 :デフォルトの名無しさん (ワッチョイ 4279-ztC3) :2023/11/08(水) 19:54:11.21 ID:5o5qiXKK0.net その言葉が聞きたかった
79 :デフォルトの名無しさん :2023/11/12(日) 06:38:57.26 ID:fPCCehcM0.net TikTok LiteでPayPayやAmazonギフトなどに変換可能な4000円分のポイントをプレゼント中! ※既存TikTokユーザーの方はTikTokアプリからログアウトしてアンインストールすればできる可能性があります 1.SIMの入ったスマホ・タブレットを用意する 2.以下のTikTok Litのサイトからアプリをダウンロード(ダウンロードだけでまだ起動しない) https://lite.tiktok.com/t/ZSNfDKQv2/ 3.ダウンロード完了後、もう一度上記アドレスのリンクからアプリを起動 4.アプリ内でTikTok未使用の電話番号かメールアドレスを使用して登禄 5.10日間連続のチェックインで合計で4000円分のポイントゲット ポイントはPayPayやAmazonギフト券に変換可能! 家族・友人に紹介したり通常タスクをこなせば更にポイントを追加でゲットできます。
80 :デフォルトの名無しさん :2023/11/12(日) 08:32:02.96 ID:d94Xl3Lo0.net >>79 おー、これはワクワクするな
81 :デフォルトの名無しさん :2023/11/12(日) 08:34:12.27 ID:GHx2Prj80.net >>80 アホ! 1レスくらい間にはさまないとリアリティが出ないだろw
82 :デフォルトの名無しさん :2023/11/12(日) 08:51:33.78 ID:It/c5vypM.net ここまで自演
83 :デフォルトの名無しさん :2023/11/13(月) 22:12:34.37 ID:6eyhepdG0.net はじめてのCってタイトル狙ってるよね?
84 :デフォルトの名無しさん (ワンミングク MMdf-P3L0) :2023/11/14(火) 12:53:07.86 ID:W6BGRK+OM.net なんかドキドキする💗
85 :デフォルトの名無しさん (ワッチョイ 1f10-Zoup) :2023/11/14(火) 15:40:13.41 ID:Pq1b8U9m0.net >はじめてのC 数十年前からの定番ネタだよね・・・今の中年向けの・・・。
86 :デフォルトの名無しさん (ワッチョイ 1ff0-Gf4c) :2023/11/14(火) 15:56:04.92 ID:B1tltd4R0.net お前らはAの経験もないだろ
87 :デフォルトの名無しさん :2023/11/14(火) 17:17:03.46 ID:Qm0S65Zf0.net 小さく投げAするときも左利き。
88 :デフォルトの名無しさん :2023/11/14(火) 17:23:51.01 ID:0+a8UjLX0.net 消えたD言語もw
89 :デフォルトの名無しさん :2023/11/14(火) 17:24:41.49 ID:ehFVRHwha.net APLは経験ないな
90 :デフォルトの名無しさん :2023/11/14(火) 17:26:26.82 ID:juKbspbB0.net 魔球は魔球はハリケーン♪
91 :デフォルトの名無しさん (ワッチョイ 7fad-beIL) :2023/11/15(水) 02:42:58.51 ID:FfQCTRFi0.net >>90 あなたの年齢は50歳以上ですね。
92 :デフォルトの名無しさん :2023/11/16(木) 19:17:29.74 ID:j+PNeGK90.net Cタ「バルス!」
93 :デフォルトの名無しさん :2023/11/16(木) 20:52:49.80 ID:oCahIYzp0.net C名「歌舞伎町の女王」
94 :デフォルトの名無しさん (ワッチョイ 465f-jMfl) :2023/11/18(土) 16:08:05.16 ID:rSBossZH0.net 今はABCって言っても通用しないよ
95 :デフォルトの名無しさん :2023/11/18(土) 17:12:35.80 ID:gr23gvrO0.net >>94 音階に倣って「イロハ」だったりするのかな。 プログラミング言語ハとか、ハ++とか、ハ長調とか。
96 :デフォルトの名無しさん :2023/11/24(金) 17:31:57.03 ID:yKOVmI8Pd.net 三等車か
97 :デフォルトの名無しさん (ワッチョイ a7bb-ayIT) :2023/11/25(土) 04:21:32.09 ID:qagB2RQA0.net Cの関数ポインタに慣れてしまってたんなに奇天烈に見えてたのに今じゃ可愛く見える
98 :デフォルトの名無しさん (ワッチョイ 5fad-1+JT) :2023/11/25(土) 04:36:14.81 ID:D3zQdbUT0.net ∧__∧ (´∀`) (⊃⌒*⌒⊂) /_ノωヽ_)
99 :デフォルトの名無しさん (ワッチョイ 7f63-YwKO) :2023/11/25(土) 10:00:22.54 ID:NdoBt+NA0.net 目標をせんたーに入れてスイッチ
100 :デフォルトの名無しさん :2023/11/27(月) 08:24:12.52 ID:554QjvZVd.net 左辺値と右辺値のことがよくわからない char *cp = "abcdefgの"abcdefg"は値を変更できないのに、 char cp[] = "abcdefg"の"abcdefg"は値を変更できる
101 :はちみつ餃子 :2023/11/27(月) 09:01:26.52 ID:HtoHgn5y0.net >>100 それは左辺値/右辺値とは関係ない。 「リテラルを書き換えようとしたら未定義」というルールが関与してる。 前者の場合は文字列の場所を示すアドレスが cp に格納されているので cp が指す先というのは文字列リテラルだが 後者の場合は確保された配列を初期化子の文字列で初期化するという理屈なので 配列と文字列リテラルとは別の実体を持ち、リテラルではない配列を書き換えることは問題にならない。 初期化子として文字列が出てくるときは初期化の文法としてちょっと特例があるのと (文字列を含む) 配列は暗黙の型変換で勝手にポインタに変換される特例があって そういう変則的なルールの積み重ねが分かり難い要因だと思う。 リテラルは書き換えたら駄目なのに型の上では文字列リテラルに const はつかない (C++ では const が付く) ので ごく単純な場合を除くと書き換えをコンパイラがコンパイル時にエラーとして検出できないこともある。 なるべく (前後の事情によっては出来ないこともあるけど) 変数には const を付けておくのが良い作法だと思う。 const char *cp = "abcdefg";
102 :デフォルトの名無しさん :2023/11/27(月) 09:03:50.85 ID:7/k6/GSga.net char *cpa = "abcdefg; char cpb[] = cpa; // 出来ない char cpc[] = "abcdefg"; char *cpd = cpc; // 出来る & abcdefgの中身も描き替え出来る
103 :デフォルトの名無しさん :2023/11/27(月) 11:14:55.99 ID:zMN468VW0.net 「大前提で文字列リテラルは書き換えたらダメ」があって 初期化と代入が同じ記号の = で行われてる 配列での代入操作は暗黙で先頭のポインタを渡す一方で 配列の初期化はあたかも複製をとったような形になる ここらへんにややこしさがあってめぐりめぐって1行目にヒットする
104 :デフォルトの名無しさん :2023/11/27(月) 11:25:24.57 ID:554QjvZVd.net >>101 ご親切にありがとうございます。標準的な本にもかいてあることを聞いてしまいました。
105 :デフォルトの名無しさん :2023/11/27(月) 12:06:42.49 ID:65C4jQRRF.net ポインタと配列(の先頭番地)は同じように使えるがまったく別のもの >>102 の例だとsizeof(cpc)は8で sizeof(cpa)はポインターサイズ
106 :デフォルトの名無しさん :2023/11/27(月) 12:39:47.73 ID:zMN468VW0.net "abcdefg"[2] = 'C'; これがNG
107 :デフォルトの名無しさん :2023/11/27(月) 19:49:45.68 ID:/cbu4sL+0.net >ポインタと配列(の先頭番地)は同じように使えるがまったく別のもの まったく別と言い切ってしまうのはちょっと語弊があるように思う 言い換えれば配列はアドレスが変更できないポインタとみなせる 後は参照先のメモリ領域が書き換え可能かそうでないかの違いでしかない
108 :デフォルトの名無しさん :2023/11/27(月) 19:53:12.61 ID:iryvQ0lx0.net 配列名は単に文字列が格納されている場所に付けられたラベル
109 :デフォルトの名無しさん (ワッチョイ 7f6a-l0Ve) :2023/11/27(月) 22:43:46.81 ID:LIfK37a60.net >>108 上で触れられているようにサイズ情報も持ってる
110 :デフォルトの名無しさん :2023/11/28(火) 08:18:33.76 ID:0HFLSmnDd.net >>109 それは別に配列だからってわけじゃない。
111 :はちみつ餃子 :2023/11/28(火) 09:29:06.38 ID:mRTkdYl90.net 配列の型は配列型だ。 char cpc[] = "abcdefg"; とあればこのときの cpc の型は char[8] をもつ。 式中に配列型の式が現れた場合には sizeof か & のオペランドであった場合を除いてその配列の先頭要素を指すポインタ (この場合は char*) に暗黙に型変換される。 変換が適用されればポインタだし、適用されない場面では配列。 配列自体は左辺値だが変更できる左辺値 (modifiable lvalue) ではないので代入演算子の左辺に現れることはできない。 配列を型変換を適用して出来るポインタは左辺値ではないのでやっぱり代入することは出来ない。
112 :デフォルトの名無しさん :2023/11/28(火) 10:56:51.80 ID:vcMwjchf0.net え?左辺値に出来るやん
113 :デフォルトの名無しさん :2023/11/28(火) 15:19:32.77 ID:87HNLOa+0.net 型の話って、実は結構難しいというか深いよね… 型を認識するプログラム作ってみるとわかるんだけど 「~のポインタである」と 「~の配列である」を同じ情報量では扱えなくて 「~の配列(要素数n)である」としないとだめなの ポインタである ことは1ビットで保持できるのに、配列である は要素数があるから必要なビット数がやたら多いのよ
114 :デフォルトの名無しさん :2023/11/28(火) 18:36:50.58 ID:0ouam6Fz0.net ((char*)cpc)++ で cpc[0] が 'b' を指すように移動できるの? これがポインタが左辺値になってるって意味の理解でOK?
115 :デフォルトの名無しさん :2023/11/28(火) 19:17:29.83 ID:7gZuadd+0.net ++は無理
116 :デフォルトの名無しさん :2023/11/28(火) 19:34:06.06 ID:7TmihfNz0.net アセンブラで考えるとよくわかる cpa: .dw cpa_static cpa_static: .db 'abcdef',0 cpc: db 'abcdef',0 こんな感じになるだろう cpaをインクリメントするのが可能だがcpcをインクリメントするのは無理なのがわかるだろう cpcはアセンブル後には値がなくなる固定値でcpaは領域が確保されてる変数だから
117 :デフォルトの名無しさん :2023/11/28(火) 19:42:59.12 ID:7gZuadd+0.net >((char*)cpc)++ こんな風な事をしたいなら、 *(char*)cpc+i これでどうだろうか cpcは固定値で、加算も減算も出来ないが、その位置からのオフセットならとれる でも、ふつうの人は cpc[i] こうするだろう
118 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN) :2023/11/28(火) 20:11:54.43 ID:mRTkdYl90.net >>114 代入可能であるためには左辺値であることは必要条件なのだけれど十分条件ではない。 配列が代入の対象になりえないにも関わらず (modifiable という概念を導入してまで) 左辺値という扱いにしていることからもわかるように、 代入できるかどうかで左辺値かどうかは語れない。 左辺値でも代入できないことはある。 右辺値はどこかに代入しない限り捨てられる (その式を超える寿命を持つことはない) という性質があるので 逆にそうでないものは左辺値という扱いにしないと辻褄が合わないからこうなってるんだと思う。
119 :デフォルトの名無しさん (ワッチョイ 5fdf-2qxF) :2023/11/28(火) 20:38:05.06 ID:h0hB0aZz0.net >>112 >>118 で「配列が代入の対象になりえないにも関わらず」なんて言い方してるくらいだから 多分左辺値とか右辺値がなんなのかよく分かってないんだろう まあいつも規約をだらだら載せてるだけだけのコテだしね
120 :デフォルトの名無しさん (アウアウウー Sa0b-6V65) :2023/11/29(水) 06:07:26.12 ID:n75oaT1ga.net なんでcpcを++したいと思うんだろ
121 :デフォルトの名無しさん :2023/11/29(水) 07:30:00.42 ID:Dj4oipus0.net 左辺値かどうかの簡単な切り分けだと思っただけで そういう欲求はない
122 :デフォルトの名無しさん :2023/11/29(水) 11:41:18.63 ID:5J3ZheQvd.net >>111 正確には、配列名のことをいっているんでしょ?
123 :デフォルトの名無しさん :2023/11/29(水) 11:43:26.36 ID:5J3ZheQvd.net でないと文章的につじつまが合わない
124 :はちみつ餃子 :2023/11/29(水) 12:08:25.16 ID:sncgHuaJ0.net 何を言ってるのだかわからん。 代入演算子の左辺に配列が現れることは出来ないという説明 に納得いかない (できる状況があると思っている) ということ?
125 :デフォルトの名無しさん :2023/11/29(水) 12:16:49.24 ID:5J3ZheQvd.net >>124 そういうことです
126 :デフォルトの名無しさん :2023/11/29(水) 12:18:51.59 ID:UMPQWy8o0.net 代入可能な左辺値一覧 ○…代入可能な左辺値 ×…代入可能な左辺値ではない 1 変数に代入 v=x ○ 2 変数のアドレスに代入 &v=x × 3 配列に代入 a[i]=x ○ 4 配列の名前に代入(2に相当) a=x × 5 ポインタ変数に代入 p=x ○ 5 ポインタ変数のアドレスに代入 &p=x × 7 ポインタ変数の参照先に代入 *p=x ○ ただし参照先が書き込み可能でなければランタイムエラー 理解できたかね?
127 :デフォルトの名無しさん :2023/11/29(水) 12:25:45.50 ID:5J3ZheQvd.net >>126 まだまだ浅学な者で、3と4の違いが分かれば十分です
128 :デフォルトの名無しさん :2023/11/29(水) 12:26:51.70 ID:5J3ZheQvd.net 右辺値と左辺値に関しては
129 :デフォルトの名無しさん :2023/11/29(水) 12:34:21.47 ID:5J3ZheQvd.net char ss[5]; char *p; p = ss; 〇 p = &ss[0]; 〇 ss = p; × p = ss + 2; 〇 p = &ss[2]; 〇
130 :はちみつ餃子 :2023/11/29(水) 12:41:04.72 ID:sncgHuaJ0.net 配列 a があるとき a[i]=x という式の左辺は配列に添字演算子を適用したもの (配列の要素) であって これのことを「配列に代入」と呼ぶと語弊がある。
131 :デフォルトの名無しさん (スフッ Sd7f-1fOb) :2023/11/29(水) 12:54:49.45 ID:5J3ZheQvd.net しかし、食べたらまずそうなコテハンですね('_')
132 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN) :2023/11/29(水) 13:01:54.89 ID:sncgHuaJ0.net 最初はSCHEME餃子と名乗ってたけどSCHEMEスレが過疎ってて暇だから CスレC++スレにも書く機会が多くて途中で変えた。 私としてはあり得なさそうな組み合わせの語を選んだつもりだったのだけど はちみつを使った餃子のレシピはあるみたいだよ。
133 :デフォルトの名無しさん :2023/11/29(水) 13:56:20.69 ID:5J3ZheQvd.net 配列には確かに構造体のようにごっそり代入できませんね
134 :デフォルトの名無しさん :2023/11/29(水) 14:07:08.49 ID:5SldHabaM.net 構造体に入れてしまえば解決
135 :デフォルトの名無しさん :2023/11/29(水) 15:10:46.39 ID:K/pKiYoT0.net 126 の表現を借りるなら 3 は配列の要素に代入 4 が配列に代入 こういう意識だわ
136 :デフォルトの名無しさん :2023/11/29(水) 15:15:32.07 ID:UMPQWy8o0.net 結局てめーの日本語が気に食わないって話かよ 長文は読む気が失せるわー
137 :はちみつ餃子 :2023/11/29(水) 16:16:32.90 ID:sncgHuaJ0.net 「配列は」という話をしているときに配列でなくする操作 (要素に対するアクセス) をすれば出来るみたいな話と混同されると困る。
138 :デフォルトの名無しさん :2023/11/29(水) 20:22:44.16 ID:odjcqh9C0.net 初心者のころ char text[] = "Answer is _"; text[10] = 'A' + ans; とか書こうとしてうろおぼえで char *text = "Answer is _"; text[10] = 'A' + ans; としたらエラーかワーニングになって なんでできないんだよ!とずっと悩んでいたことがあるが そういう話じゃないの?
139 :デフォルトの名無しさん :2023/11/30(木) 06:41:39.94 ID:yOmuxKyka.net char a[] = "A"; char *p = a; は別物(同じだと説明している入門書があるならクソ本) &a[0] を a と省略出来るだけ もちろん sizeof p と sizeof a[0] と sizeof a は違う
140 :デフォルトの名無しさん :2023/11/30(木) 13:09:50.69 ID:EuLMofdV0.net >>139 もう少しで完全に理解できそうなので ガンダムで例えてくれ
141 :はちみつ餃子 :2023/11/30(木) 14:54:30.13 ID:3QI4e6Tt0.net > &a[0] を a と省略出来るだけ 意味が同じなわけなので記法の上では省略と言えるんだけど a が &a[0] のことを意味しているというわけではなく、 言語仕様上の理屈としては a のほうにプリミティブな定義があって &a[0] のほうが構文糖という扱い。 @ E1[E2] は (*((E1)+(E2))) と等価である A & のオペランドが単項*演算子の結果の場合,*演算子も&演算子も評価せずに両演算子とも取り除いた場合と同じ (添字演算子の適用結果をオペランドとする場合も同様) B 配列 (結果が配列型となるような式) は sizeof か & のオペランドであるときを除いて先頭要素を指すポインタに変換される つまり &a[0] の場合を順番に当てはめるとまず &*(a+0) と同等と見做され、 &* は無かったことにされるので a+0 となり、 0 を足しても内容は変化しないから無視できて a と同じ。 そして a は配列の先頭要素を指すポインタに変換される。
142 :はちみつ餃子 :2023/11/30(木) 14:59:53.10 ID:3QI4e6Tt0.net (順序から言うと配列がポインタに変換されるほうが先だな……。 すまぬ)
143 :はちみつ餃子 :2023/11/30(木) 15:08:15.57 ID:3QI4e6Tt0.net 配列 a は a と書くだけで先頭要素を指すポインタなので &a[0] と書くってのは 0 を足すという要らんことをしているという扱いってこと。
144 :デフォルトの名無しさん (ワッチョイ 5f79-/KuA) :2023/11/30(木) 20:20:41.06 ID:4nwqW1NG0.net >>140 pがザビ家でaがジオン公国そのものと言ったら判りやすいだろうか ジオンはザビ家にNTRれたけど元のジオン・ダイクンが掲げた思想(長さとか)はNTRが完了した時点で失われた その後出てきたアクシズ(ネオ・ジオン)はもっと酷くてジオンと言える部分はNTRしたザビ家の跡取りとその傀儡だけでジオンとは一体何だったのか語れる人物は一人もいない
145 :デフォルトの名無しさん (ワッチョイ 47e7-xen6) :2023/11/30(木) 20:26:04.69 ID:SvZ2/mZg0.net >>143 そっちのほうが余計なギミックじゃない? a[]のアドレスが欲しければ&aと書くだけでいいのに aが自動的にa[]の先頭番地になってしまうからややこしい ちなみにBASICだと配列と同名の単純変数が作れてしまいこれも今思うと無茶苦茶だった
146 :デフォルトの名無しさん (アウアウウー Sa0b-6V65) :2023/11/30(木) 20:46:09.47 ID:h/B+JtY5a.net >>117 意味無いわ
147 :デフォルトの名無しさん (アウアウウー Sa0b-6V65) :2023/11/30(木) 20:47:46.07 ID:h/B+JtY5a.net 完全に理解した!!! ↓ https://ideone.com/g2912A #include <stdio.h> #define N 3 int main(int argc, char **argv) { char *hoge[] = {"abcd", "efg"}; char **hige = hoge; char hage[][N] = {"ab", "cd", "ef", "gh"}; char (*fuga)[N] = hage; char (*moga)[N] = {"ab", "cd", "ef", "gh"}; printf("%zd %s %s\n", sizeof(hoge), hoge[0], hoge[1]); printf("%zd %s %s\n", sizeof(hige), hige[0], hige[1]); printf("%zd %s %s %s %s\n", sizeof(hage), hage[0], hage[1], hage[2], hage[3]); printf("%zd %s %s %s %s\n", sizeof(fuga), fuga[0], fuga[1], fuga[2], fuga[3]); printf("%zd %s %s %s %s\n", sizeof(moga), moga[0], moga[1], moga[2], moga[3]); return 0; } ↓ 説明してみ
148 :デフォルトの名無しさん (アウアウウー Sa0b-6V65) :2023/11/30(木) 20:51:51.20 ID:h/B+JtY5a.net アンカ忘れた >>140
149 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-zy57) :2023/11/30(木) 21:26:27.48 ID:3QI4e6Tt0.net >>145 あくまでも言語仕様の理屈で言えばこうだという説明なのでその言語仕様が良いかどうかの意見は含んでないよ。 色々とアレな部分も多いってのは文句つけても仕方がないいまさらな話だし。
150 :デフォルトの名無しさん :2023/11/30(木) 22:06:24.41 ID:wy49Mw9yM.net いやいや何を言っとんの? 利便性のためにそういう仕様にしてるんだよ C書いてりゃさすがに分かんだろうよw
151 :はちみつ餃子 :2023/11/30(木) 22:36:56.23 ID:3QI4e6Tt0.net 感覚的にはそんなに不自然には感じないんだけど 仕様の規則が変則的なのも確かなので つまりは人間の感覚は不合理なものってことだ。
152 :デフォルトの名無しさん :2023/11/30(木) 22:41:39.63 ID:0Cr+jEwb0.net >>147 %zd は知らなかったわ。 勉強になった
153 :はちみつ餃子 :2023/12/01(金) 00:42:09.23 ID:U5xjJXbM0.net sizeof の結果の型は size_t で、 size_t は符号なし整数というだけしか規定されていない処理系定義なんだけど unsigned int や unsigned long int の別名として定義されていることが多いせいで それをあてにした形で説明している資料は割とある。
154 :デフォルトの名無しさん :2023/12/01(金) 02:30:56.67 ID:oKQshtme0.net >>145 > a[]のアドレスが欲しければ&aと書くだけでいいのに 俺はそっちのほうがややこしいと思うけどな むしろ*(a+10) を [] で表現するなら *a[10] みたいな書き方になるほうが、理解する上ではややこしくなかったかなとは思うけど(使う上では不便) [] って箱(マス)に見えるし、まあ直接箱の中身を示すものなのだなって覚えたけど
155 :デフォルトの名無しさん :2023/12/01(金) 05:52:03.14 ID:sCbOzpGc0.net 誰が誰なのかよく分からんけど、キッズが来て荒れた、という話ですか インデックスアドレッシングを [ ] 記号に当てただけと思うけど、そんなに難しいかね
156 :デフォルトの名無しさん :2023/12/01(金) 05:55:20.08 ID:sCbOzpGc0.net 型の話かと思ってたら、いつの間にか 入門者がポインタを理解できない話 になった印象
157 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN) :2023/12/01(金) 14:51:35.53 ID:U5xjJXbM0.net >>145 配列 a に &a としたときに得られるのは配列を指すポインタであって配列の先頭要素を指すポインタではない。 (型が違う。 アドレスを数値として見たら同じはずだけど。) 多次元配列にアクセスするとき (添字演算子を重ねて適用するとき) に仕様の通りに解釈していくと配列と先頭要素が都合よく切り替わって最終的にポインタ演算になるのが実に上手いこと出来てる。 配列の要素にアクセスするときの記法を現状のような形にするという前提でならなんだかんだでよく出来ている。 配列に & を付けたら配列を指すポインタになるというのは例外的ではない普通の挙動だからそこに別の意味を割り当てるならそれもやっぱり変則的なややこしい挙動ってことになってしまうよ。
158 :デフォルトの名無しさん :2023/12/01(金) 19:03:26.87 ID:Ga+233FE0.net >>157 ポインタ完全制覇でよーく理解できました。 20年以上やってきて配列へのポインタは一度だけ出番がありました。
159 :はちみつ餃子 :2023/12/01(金) 19:23:36.92 ID:U5xjJXbM0.net >>158 プログラマが直接的に書く機会はあんまりないだろうけど、 暗黙には頻繁に表れていてこのルールがないと上手いこと機能しないって話。 #include <stdio.h> int main(void) { int foo[2][3] = { {1, 2, 3}, {4, 5, 6}}; printf("%d\n", foo[1][2]); // ふたつの座標みたいに見えるけど // 式を各段階に分解すると…… int(*bar)[3] = foo; // 配列を指すポインタは出てきてる! int *baz = bar[1]; int qux = baz[2]; printf("%d\n", qux); }
160 :デフォルトの名無しさん (ワッチョイ 65d3-WD8q) :2023/12/05(火) 07:30:58.43 ID:72+QzLj/0.net c言語初心者です 質問させてください FILE *fpという宣言の「FILE」にどういった役割があるのでしょうか *fpは関数によってどこを読み書きするかを指定するためにアドレスを格納することは分かるのですが それならばint型のポインタで良いような気もします プログラムを書く上でどうでもいい内容なのですが教えていただければ今日の寝付きが良くなる気がします
161 :デフォルトの名無しさん (ワッチョイ eaad-snvD) :2023/12/05(火) 07:53:15.80 ID:kkEdYaZP0.net >>160 stdio.h の中身を見れば FILE がどう宣言されているか分かるのでは?
162 :デフォルトの名無しさん (スフッ Sd0a-Oc+E) :2023/12/05(火) 08:16:33.53 ID:64vzQPx0d.net >>160 FILE構造体っていうことだけは、どの本にも書いてある。
163 :デフォルトの名無しさん (ワッチョイ 66d6-8IwF) :2023/12/05(火) 08:26:33.63 ID:Sjl8/rh40.net 実際UNIXのfile descriptorはintでWindowsのファイルハンドルHANDLEはvoid*だ。 こいつらはシステムコールによってカーネルモードで操作されるから中身が完全に見えないようになってる それとは違って標準Cライブラリはユーザモードで動作するから 処理系依存で中身を操作してもいいように作ったのかもしれない
164 :デフォルトの名無しさん (スッップ Sd0a-Cw2Y) :2023/12/05(火) 08:33:57.88 ID:GHHZLCc/d.net >>160 確かに構造体の中身を使わないかぎり何のポインタでもいいんだけど 間違えて他のタイプへのポインタと混同した時にエラーが出るから気づきやすい それはけっこう重要だよ
165 :デフォルトの名無しさん (ワッチョイ 65d3-WD8q) :2023/12/05(火) 09:00:17.71 ID:72+QzLj/0.net >>160 です 普通の構造体の宣言とは異なり要素の記述はありませんが 「FILE」とは「ファイル構造体を使うよ」と宣言しているという意味で そうしてstdio.h上のFILE構造体の要素に開いたファイルの情報が代入されていくということでしょうか? 「FILE」を記述せずにfopenで開こうとした場合構造体メンバのptrに代入されている数値が使えないのでfopenから戻り値が受け取れず正しく*fpに座標が代入されない みたいな そして開くだけならfopenでも開けてしまうとか
166 :はちみつ餃子 :2023/12/05(火) 10:08:56.47 ID:z5PiblaY0.net 言語仕様的に見れば FILE はストリームを制御するのに十分な情報が入ったオブジェクト型であることと、 アドレス (FILE 型のオブジェクトがある場所) に意味がある場合もあるから オブジェクトをコピーして機能するとは限らないという程度のことしか書いてない。 FILE にどのような情報が格納されているのかといったことや 詳細な仕組みはホスト環境の事情に合わせて処理系の裁量で決めてよい部分なので、 具体的にどうなっているのかは各実行環境・開発環境ごとに違う。 特に環境依存の細かい部分に立ち入って制御をしたい事情があるのでない限りは fopen が「なんらかの方法」で FILE 構造体を構築してそのアドレスを返すものであるということだけ知っていれば 普通のプログラマにとって十分なように出来ている。
167 :デフォルトの名無しさん :2023/12/05(火) 10:36:22.34 ID:NYBtRI3Y0.net >>165 3行目から4行目の理解で大体あってるよ それ以降は何言ってんのか分かんねーから全部アタマの中から破棄していいよ 正確にはFILEってのは抽象データ型であんたは構造体って言ってるけど構造体かどうかは分からんし使う側は知る必要もない 提供者がわざわざ抽象型にして使い手側の負荷を下げてくれるとこを中身がどうとか役割がどうとかさぐんのは筋が悪いんだよ 使えって言われてんだから何も考えずにだまって使えばいいよ
168 :デフォルトの名無しさん :2023/12/05(火) 11:08:08.12 ID:h96fo3nj0.net FILE構造体ってOS毎に変わるし、コンパイラ実装でも又変わってた様な気がする
169 :デフォルトの名無しさん :2023/12/05(火) 12:35:58.10 ID:4VzMioa/0.net FILE*経由だとバッファリングされるから、バッファーのポインタとそこに含まれてるデータサイズも含んでいるだろう そもそもファイルのシーク位置も含まれてる まとめると ・ファイルディスクリプターやファイルハンドル ・シーク位置 ・バッファー(ポインタ、サイズ、含まれてるデータサイズ) となるかね
170 :デフォルトの名無しさん (アウアウウー Sa21-wVFe) :2023/12/05(火) 15:39:55.92 ID:QJai9ytva.net >>160 void *hoge = (void *)fopen("hoge", "wb"); fprintf((FILE *)hoge, "hoge\n"); fclose((FILE *)hoge);
171 :デフォルトの名無しさん (ワッチョイ 71cf-L1V1) :2023/12/05(火) 17:31:14.53 ID:4VzMioa/0.net FILE*互換の自前のストリームを実装できれば便利なんだがなぁ 継承が無いから、構造体に自前の関数をセットして、何らかの登録関数に渡す感じになるだろう
172 :デフォルトの名無しさん (JP 0Hf9-8IwF) :2023/12/05(火) 17:40:17.96 ID:oSX0a7FoH.net fopencookieとかfunopen
173 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03) :2023/12/05(火) 17:48:30.74 ID:z5PiblaY0.net パイプのインターフェイスをストリームとして開くことが出来るから 適当なスレッドを開いてパイプの受け取り口で受け取った情報を好きなように加工するようにすれば、 パイプに書込む側ではストリームに書き込んだらいい感じに処理してくれるように見える。 というのを Windows でやっているのをどっかで見た。
174 :デフォルトの名無しさん :2023/12/05(火) 18:11:37.45 ID:GHHZLCc/d.net >>165 開くだけで何が楽しいんだ? 読み取りも書き込みもクローズもできない exitで自動的にクローズはされるけど… >>163 HANDLEはポインタではなくただの整理券番号で実体は整数値だ しかしWindows SDKでは「架空の構造体へのポインタ」として定義されているので例えばウィンドウハンドルをファイルハンドルと混同するとType mismatchエラーになる これはかなり有用な仕組みでC言語が仕様に組み込んでほしいくらい
175 :デフォルトの名無しさん :2023/12/05(火) 23:44:52.07 ID:9c748LJ40.net ソケットディスクリプタってファイルポインタに転生できる?
176 :デフォルトの名無しさん :2023/12/05(火) 23:48:43.88 ID:4UYj/sQ80.net >>175 fdopen
177 :デフォルトの名無しさん :2023/12/06(水) 08:34:18.09 ID:hjosWl9s0.net >>160 です 皆さん大変参考になりました 今日はよく眠れそうです
178 :デフォルトの名無しさん (スフッ Sd0a-nvfk) :2023/12/06(水) 12:07:25.67 ID:dR0trs3yd.net 対策このままなら再発しそうね https://japan.zdnet.com/article/35212258/4/
179 :デフォルトの名無しさん :2023/12/06(水) 16:09:22.53 ID:JLoh059d0.net 仕事なくなったら困る人が大勢いるし
180 :デフォルトの名無しさん :2023/12/06(水) 20:24:47.29 ID:tBrgYtLt0.net free(NULL) は許されるのに fclose(NULL) は許されないんよな
181 :デフォルトの名無しさん :2023/12/06(水) 21:05:20.14 ID:gHtrZlY5a.net >>180 さらにfflush(NULL)は許されるという一貫性の無さ
182 :はちみつ餃子 :2023/12/06(水) 21:19:13.20 ID:+44Bjs460.net fflush の場合は全てのストリームを対象とするという特別なフラグとして NULL を活用しているので無効なポインタとしての NULL とは事情が違う気がするね。 それにしたってNULL を多義的に使っているという意味では一貫性はないけど。
183 :デフォルトの名無しさん :2023/12/06(水) 21:23:39.94 ID:bAVe0RWP0.net free(NULL)は、おバカなマの為に特別に許容したんだろ
184 :デフォルトの名無しさん :2023/12/07(木) 02:17:45.58 ID:NYiehhGh0.net 以前ネットでおすすめされていた「苦しんで学ぶc言語」の内容をしっかり理解する段階まできたのですが、次は何をすれば良いのでしょう。 猫でも分かるプログラミングも読んでみたのですが仕様が古すぎてトレースできないのと、私には作者さんの文章の作りが合わず困っています。 まずは簡単なソフトを作りながら学べればと思います。 入門書の次に読めるような本と、そこからアプリケーション開発のイロハが分かる本やサイトを教えていただけないでしょうか。
185 :デフォルトの名無しさん (ワッチョイ ea79-4utE) :2023/12/07(木) 07:17:00.47 ID:Y9iRVwaI0.net ↑みたいなのって目的ないのかね 今後C言語で特に何かやりたい事がないなら別に何もする必要ないよ
186 :はちみつ餃子 :2023/12/07(木) 08:27:05.09 ID:wi0prF2i0.net Cで現実的なアプリケーションを作るならホスト環境 (OS など) の事情は無視できないし、具体的な目標なく道筋は決まらないと私も思う。 何の情報もない他人に何かを勧めるというのはしづらい。 目標があるならその分野の既存のコードを「読む」という体験はためになるかもしれない。 実際のコードを見て意味がわからない部分があれば学習が必要な部分だというとっかかりになる。
187 :デフォルトの名無しさん (ワッチョイ 6646-wNAC) :2023/12/07(木) 09:28:19.84 ID:++8K4NmJ0.net >>184 > 「苦しんで学ぶc言語」 というのは、これ↓ ? https://9cguide.appspot.com/index.html > 苦しんで覚えるC言語 であれば文法解説のようなので、ファイル操作をしてはどう? cat コマンドを作るとか。
188 :デフォルトの名無しさん (ワッチョイ 65ff-WD8q) :2023/12/07(木) 10:04:58.60 ID:NYiehhGh0.net >>186 Windowsソフトを制作して当方の業務を効率化できればと考えています。 「既存コード」を読むですか、なんだか英語学酒のようで気が滅入りますね> >>187 失礼しました。「覚える」でしたか。 ファイル操作がどこまでを指すのかわかりませんが高低水準入出力はすでに可能です。
189 :デフォルトの名無しさん (ラクッペペ MM3e-8Sbt) :2023/12/07(木) 10:23:42.82 ID:aHfAXzyRM.net 業務効率の向上が目的ならC言語は回り道すぎる 他の言語選んだ方がいい気がする
190 :デフォルトの名無しさん (ワッチョイ 1163-8qzv) :2023/12/07(木) 10:31:24.83 ID:HPax2zCP0.net ファイル操作の課題出してあげようか 指定した二つのDirにあるファイルを同期させる 単にコピーするのではなく、タイムスタンプの新しいものだけをコピーする 新しいSubdirできていたら、中味があればDirごとコピーする とりあえずは、新しく作られてファイルの同期まで、 削除については考慮しなくて良い
191 :デフォルトの名無しさん (ワッチョイ b501-sZSb) :2023/12/07(木) 10:39:50.34 ID:3PWWuEZS0.net >>188 >Windowsソフトを制作して当方の業務を効率化できればと考えています。 早速これに取り組んだ方が良い 実用するものを作る方がモチベになる
192 :デフォルトの名無しさん (スプッッ Sdea-GtvU) :2023/12/07(木) 11:21:46.78 ID:6u4iKMo7d.net C言語のスレッドで言う事じゃないがC言語以外の生産性の高い言語を学んだほうがよさそう
193 :デフォルトの名無しさん :2023/12/07(木) 11:56:53.00 ID:QzDrEJVi0.net >>184 CはOSのAPIを直接叩けることがメリットでもあるので、Linuxのプログラミング本を読んでコード書いてみるのが一番良いだろう マルチプロセス、マルチスレッド、ソケットとか覚えるべき事は沢山ある Cでやれば根本から理解出来る
194 :はちみつ餃子 :2023/12/07(木) 12:04:11.70 ID:FWY3NSUg0.net (事務作業などの?) 業務効率化が目的なら Power Automate Desktop の活用を考えた方がいいと思う。 効率化の最初の段階は解決すべき問題を見つけることで、これをきちんと一度で洗い出すのは大抵の場合に出来ない。 雑に作って運用しながら改善するという手順をとるのがのぞましいが、 C で書くとそういう柔軟な体制がとりづらい。
195 :デフォルトの名無しさん (ワッチョイ 9a2b-ntmn) :2023/12/07(木) 13:30:05.55 ID:zYUoekf60.net 「なにを作りたいのかが大事」ってのは良く分かるんだけど、普通の人が作りたいものって大抵Cじゃない方が…ってなっちゃうんだよな
196 :デフォルトの名無しさん (ワッチョイ 65ff-WD8q) :2023/12/07(木) 13:42:19.21 ID:NYiehhGh0.net >>90 そういった事もできるんですねー >>191 取り組みたいのは山々なのですがuiの作り方からわからないので入手できるバーションで解説されている書籍が欲しいところです。 >>192 基礎を大切にしたいのでcをはじめのうちは使っていきたいと考えています。 >>193 仰る通り根本を理解できればと思います。Linux本ですね。可能であれば簡単なものでおすすめを添えていただけないでしょうか。 >>194 グラフィック系のソフトを使う上で不便なところを楽したい、と言いますか とにかく画像表示や文字列表示から進めていきたいと考えています。 前述の通り基礎を理解したいので可能であればcで作成したいのです。
197 :デフォルトの名無しさん (ワッチョイ 3514-I4o8) :2023/12/07(木) 13:42:44.77 ID:P4JhXVL60.net WindowsアプリならCじゃくて、せめてC++にしておけ
198 :デフォルトの名無しさん (ワッチョイ 6aa0-0M9k) :2023/12/07(木) 13:43:24.10 ID:n9+uyfFo0.net 楽したい奴にはCは向かない
199 :デフォルトの名無しさん (アウアウウー Sa21-wVFe) :2023/12/07(木) 14:18:01.05 ID:wNl2TimYa.net C++は変な癖がつく Cの方が絶対良い
200 :デフォルトの名無しさん (ワッチョイ b501-sZSb) :2023/12/07(木) 15:23:59.73 ID:3PWWuEZS0.net Cで全部書いてると大変だと思うよ 機能全部使わんでも良いからC++の方が現実的だよ
201 :デフォルトの名無しさん (ワッチョイ 1163-8qzv) :2023/12/07(木) 15:31:37.34 ID:HPax2zCP0.net 大変かどうかは、何を作るかによる
202 :デフォルトの名無しさん (ワッチョイ b501-sZSb) :2023/12/07(木) 15:35:13.86 ID:3PWWuEZS0.net >>201 >>196 を踏まえて大変だと思うよ
203 :デフォルトの名無しさん (ワッチョイ 71cf-Gt6m) :2023/12/07(木) 16:19:14.82 ID:QzDrEJVi0.net >>196 自分はUNIX Cプログラミング(いわゆるライオン本)で勉強して、めちゃくちゃ為になったけど、さすがにこれは古すぎる 詳解UNIXプログラミング 第3版は間違いのない名著 ふつうのLinuxプログラミング 第2版はLinux向けだし初心者向け Cで仕事をするようにはならないかもだけど、「ふつうの~」を理解出来て自分のものにすることがCを学ぶ意義だな
204 :デフォルトの名無しさん (ワッチョイ 66ab-XaJC) :2023/12/07(木) 16:23:44.20 ID:5AmCTrxW0.net >グラフィック系のソフトを使う上で不便なところを楽したい ソフト側でスクリプト等がサポートされてなければ できることは連続するショートカットを 1プッシュでまとめて出す キーロガー&再生系とか Joy2Key みたいなキーコード送出系ぐらいしか思い浮かばん
205 :はちみつ餃子 :2023/12/07(木) 17:03:32.49 ID:FWY3NSUg0.net >>196 具体的に対象になってるソフトの名前は言える? モダンな設計の Windows 用ソフトが外部から制御するために公開するインターフェイスは Component Object Model の技術をベースにしていることが多くて、 高度な開発環境の補助を得ながら使う分には便利なんだが C から使おうとするとすごく面倒くさい。 (出来なくはないけど。) ソフトが外部に対してインターフェイスを公開するのではなく 制御用のスクリプト言語を内蔵している場合もあるので C でのプログラミングに詳しくなってもあまり役に立たないこともある。 もしも外部に対してインターフェイスを用意していないなら ボタン操作のイベントを発生させるとかして制御する (つまりまさに人がする操作を代行させる) ということも可能だが、 それを可能にするような基礎技術というか Windows の動作モデルを理解したいのなら 「猫でもわかるWindowsプログラミング」はそれなりに有用だと思うよ。 私は書籍を読んだことは無いけどウェブ版は Windows がイベントを伝播させて操作させる構造を理解するのに十分な記述はある。 だけど、人が操作するときに Windows の中で何が起こっているのかを 初心者が根本から理解してきちんと使いこなせるまでになるハードルは割と高めなんだよ……。 Power Automate Desktop なら技術の根本を理解せずともそれが出来るようになってるし、 マイクロソフトが直接に提供していてしかも無料という神ソフトなのでオススメした次第。 UWSC とか AutoIt なんかも人気があるね。
206 :デフォルトの名無しさん :2023/12/07(木) 17:15:58.47 ID:ggcXWkJv0.net 関数のサイズというのは、関数の引数のサイズと同じと考えて良いのでしょうか? 中身に1万行使ってる関数があるとして、その1万行は関数のサイズとは全然関係ないんでしょうか? 構造体はなんとなく変数のバイト数の足し算なんだなってわかるけど、関数がピンとこないです・・・
207 :デフォルトの名無しさん :2023/12/07(木) 17:18:59.29 ID:Dmh4B19g0.net プリプロセッサメタプログラミングを覚えてからc言語の開発は楽になったわ 前は同じようなデータ構造でたくさんモジュール作ってたからな
208 :はちみつ餃子 :2023/12/07(木) 17:34:07.95 ID:FWY3NSUg0.net >>206 関数をデータとして扱うことはないので「大きさ」は定義されない。 C の言語仕様的には「関数はオブジェクトではない」という扱い。 関数に対して呼び出し以外の操作をする方法はない。 関数ポインタで関数の場所を指すということは出来るが、 型システム的にちょっと特殊な扱いになっていて関数ポインタ経由で値を取り出したりも出来ない。 もちろん実際にはなんらかの形でメモリ上には存在するし、 長いプログラムは大きい可能性が高いけど。 実際にどうなってるのかは生成された機械語を見ればいいんでね。
209 :デフォルトの名無しさん :2023/12/07(木) 17:41:37.50 ID:VEE9aIzl0.net >>206 質問文が謎すぎて、何を聞きたいのか解釈できない 関数のサイズって言ってるのがビルドしてできた実行ファイルのファイルサイズの事なら、コードの量が多ければ当然サイズは大きくなる
210 :デフォルトの名無しさん :2023/12/07(木) 17:41:59.31 ID:ggcXWkJv0.net >>208 ポインタのアクセス条件でメモリのサイズ・型が明確になっていること とあったので、関数ポインタもサイズや型が明確でないといけないなら ちゃんとわかっとかないといけないと思ったのですが、関数の扱いはわかってる人から見ても特殊なんですね ありがとうございます
211 :デフォルトの名無しさん :2023/12/07(木) 18:04:20.91 ID:Kvlx+aNw0.net >>206 あなたはどういう文脈で「関数のサイズ」が気になった・話題になったの?プアな組み込みとか? 俺は「関数のサイズ」が気になった・話題になった覚えがない まぁコンパイル後のコード量かなぁ、関数の行数は大きく関係する 引数はスタックに積むけど「関数のサイズ」とは言わない気がする
212 :デフォルトの名無しさん :2023/12/07(木) 18:19:55.87 ID:5AmCTrxW0.net サイズ云々は インクリメントしたときにどんだけ(何バイト)進むのかが確定してる型でないとポインタにならない → じゃ関数ポインタって 関数のサイズ(≒ コンパイル後の機械語化されたバイナリのサイズ) を知ってるのか? こういう思考の流れかな?
213 :デフォルトの名無しさん :2023/12/07(木) 19:14:37.61 ID:ggcXWkJv0.net >>212 まさにそれです! 関数ポインタを配列に格納した時インクリメントしたら何バイト進むのか分かってないといけないのではと
214 :デフォルトの名無しさん (ワッチョイ 8a71-yDrh) :2023/12/07(木) 19:46:05.37 ID:Avn/NPEq0.net >>213 その状況で必要になるのは関数のサイズじゃなくて関数ポインタのサイズや それは他のポインタと同じ、64bitPCなら8バイト 仮定の話として、もし「関数ポインタの配列」ではなく「関数の配列」が作成できるような言語仕様にするなら、関数のサイズも決めないといけなかっただろうね
215 :デフォルトの名無しさん (ワッチョイ c55f-tBUZ) :2023/12/07(木) 19:58:53.01 ID:ggcXWkJv0.net >>214 言われてみたらたしかにそうですねなんでポインタなのに普通の変数のように考えてしまってたんだろう・・・
216 :デフォルトの名無しさん (ワッチョイ 9140-JrwL) :2023/12/07(木) 21:12:50.21 ID:fQltjmnX0.net void*使えるやん
217 :デフォルトの名無しさん (ワッチョイ 65ff-WD8q) :2023/12/07(木) 21:34:16.53 ID:NYiehhGh0.net >>203 ありがとうございます。 >>204 メインのソフト除いて二窓三窓しているので欲しい機能だけ載せたソフトを自作したいなと。 >>205 204へのレスと同じです。 猫でも分かるは説明していない単語が出てきたり、UI作成の手順をトレースできなかったり わからない人向けではなく分かる人向けの解説のようで個人的には合いませんでした。
218 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 656b-1gjz) :2023/12/08(金) 03:48:38.29 ID:tzfGEsy80.net >>216 関数ポインタは void* に格納可能であると保証してないし、関数ポインタがオブジェクトを指すポインタより大きかったり表現が異なっていたりする環境はある。 出来る環境でなら使うのが悪いわけではないけど移植性は犠牲になる。
219 :デフォルトの名無しさん :2023/12/08(金) 06:53:57.90 ID:Mdse7dEX0.net >>218 >関数ポインタは void* に格納可能であると保証してないし そんなことありえるの?
220 :デフォルトの名無しさん :2023/12/08(金) 07:01:37.37 ID:g0YSKcXt0.net near ポインタモデル?だったかの 変数のアドレッシングサイズと プログラムカウンタのアドレッシングサイズが違うやつ
221 :デフォルトの名無しさん (ラクッペペ MM3e-VttM) :2023/12/08(金) 07:38:56.35 ID:qsjd2ZYcM.net ミディアムモデルとかコンパクトモデルとか まぁ過去の話だわな
222 :デフォルトの名無しさん (スップ Sdea-b4p5) :2023/12/08(金) 07:57:53.16 ID:m+qJyEe4d.net 関数のサイズは関数のポインタをアドレス順にソートすれば求められる そのサイズ分を実行可能領域にコピーすれば当然実行もできるよ dllインジェクションとかでたまに使われる
223 :デフォルトの名無しさん (スップ Sd0a-Cw2Y) :2023/12/08(金) 08:01:58.55 ID:ClTGg8d6d.net >>217 業務で使ってるような信頼性のソフトを自作するつもりなのか 一人で?予算は?期間は? まあ無理だろ 単純にメモリの大きなPCに買い替えればいいんじゃない
224 :はちみつ餃子 :2023/12/08(金) 09:53:49.26 ID:B2zBKDAb0.net >>217 マイクロソフトが出している公式のチュートリアルは C++ が基礎だけど 考え方としては C でも同じなのでそのへんは適当に読み替えながら…… https://learn.microsoft.com/ja-jp/windows/win32/ Win32 API は C で使ってもそんなに不便ではないように出来てる。 特に最も基礎のこのへんの例示のコードは (C++ とは書いてあるが) たぶん C としてコンパイルさせても通る。 https://learn.microsoft.com/ja-jp/windows/win32/learnwin32/your-first-windows-program 必要な知識の分量は初心者が想像するよりずっと多いと思う。 分かりやすいドキュメントがあったとしても (そして無いこともしばしばある!) 分量は減らないので 分量というハードルをクリアするのは単純に学習量しかないし、 学習量をこなすには時間をかけるしかしょうがない。 やりたいことを自由に出来るようになるまで何も生産しない時間 (業務なら人件費に換算されるだろう) をかける余裕があるの? というところを不安に思っちゃうわけだよ。 ここは C スレだから C プログラミングを支援したい気持ちはあるがそれがしんどい場合も多いってことも知ってる。 個人事業なら趣味と兼ねるのもアリかもしんないけど。
225 :デフォルトの名無しさん :2023/12/08(金) 10:13:43.24 ID:20YRNN5F0.net >>224 Cコンパイラに、C++ -> C トランスレート機能あるの?
226 :デフォルトの名無しさん :2023/12/08(金) 10:26:10.76 ID:vLixVDpZ0.net API はほとんど C インターフェースで C++をベターCとして利用してて C++のクラスの機構はほぼ使ってない (GDI+ とかAPIがはなっから C++ インターフェースの奴は別)
227 :デフォルトの名無しさん :2023/12/08(金) 10:34:54.49 ID:faKtyhh20.net >>218 ねえよ
228 :デフォルトの名無しさん :2023/12/08(金) 10:50:23.47 ID:k3Bpg+TDa.net ぶっちゃけGDI+もCから使えるけどね
229 :デフォルトの名無しさん :2023/12/08(金) 10:53:01.67 ID:vLixVDpZ0.net >>228 あれ Cインターフェース居るのか 最終的にはCOMになってるんやっけ?
230 :デフォルトの名無しさん :2023/12/08(金) 11:03:20.25 ID:Mdse7dEX0.net >>220-221 なんかそういうのあったかも
231 :デフォルトの名無しさん :2023/12/08(金) 11:04:41.36 ID:VEgZ7oNC0.net あれはPascalの呼出ではなかったかな
232 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03) :2023/12/08(金) 11:27:29.89 ID:B2zBKDAb0.net >>229 gdiplus.dll 自体は関数群を置いてあるだけっぽい。 それをラッパークラスで覆って C++ から使いやすくしているだけ。
233 :デフォルトの名無しさん :2023/12/08(金) 12:03:08.97 ID:7hcazM9a0.net >>224 兼任ですが個人事業主でお金と時間はそれなりに自由に使えます。 3〜5ヶ月くらいはまとまった時間を取ることも可能です。 公式チュートリアルは参考にはなりますが読みやすいかと言われると微妙ですね。 知識はもちろん身につけたいのですが、そこまでの道筋は他人のコードを読む方がやはり良いのでしょうか? 書籍やサイトなどでアプリの形になるまでのチュートリアルなどは無いのでしょうか。
234 :デフォルトの名無しさん :2023/12/08(金) 12:17:34.25 ID:k3Bpg+TDa.net Win32APIというよりそれ以前の C言語の知識が足りてないんじゃないのかな
235 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03) :2023/12/08(金) 13:05:38.60 ID:B2zBKDAb0.net >>233 何を学べば良いかすらわからないときのとっかかりとして 他人のコードを読む (何がわかってないかはわかる) ことを勧めたまでで、 良い資料があるならそれを読むにこしたことはないよ。 良い資料がないことも多いという現実はあるけど。 私は公式チュートリアルは良いほうだと思う。 知らないことを書いてあるんだからある程度は読みづらいこともあるのは当たり前のことで、 どれを読んだって似たようなもんじゃないかな。 専門的な内容をスラスラ読めるほうがおかしいでしょ。
236 :デフォルトの名無しさん (ワッチョイ 8a80-yDrh) :2023/12/08(金) 13:11:55.82 ID:0BufPgxy0.net さてはオメー ふらっとC#スレで他人のコードの読み方とか延々聞いてたヤツだな?
237 :デフォルトの名無しさん (アウアウウー Sa21-/D3x) :2023/12/08(金) 13:15:41.58 ID:o54AonyOa.net >>206 関数もメモリにロードされるのわからず? 関数はただのマシンコードなんだからここから始まりますよ、というラベルがついてるだけだぞ そして呼ばれた時はそこへジャンプするだけ 関数ポインタはそのマシンコードのラベルのアドレスを保持しているだけ ポインタ以前にコンピュータの仕組みからやった方が良さそう プログラム格納方式とか聞いたことない?
238 :デフォルトの名無しさん :2023/12/08(金) 13:31:18.44 ID:k3Bpg+TDa.net >>236 なんちゃらGPTがここでこっそり質問してたら笑う
239 :デフォルトの名無しさん :2023/12/08(金) 13:36:30.72 ID:SLmq2FCH0.net >>219 >>227 ググってみたらどうも>>218 が正しいらしい
240 :デフォルトの名無しさん (ワッチョイ 9140-JrwL) :2023/12/08(金) 15:42:45.24 ID:faKtyhh20.net だからねえよ そいつが勘違いしてるか、使い方が悪いかだろ
241 :デフォルトの名無しさん (ワッチョイ 5df0-/D3x) :2023/12/08(金) 16:03:05.13 ID:abnVL6FT0.net >>206 構造体もプログラムからしたらただのメモリ領域の塊だぞ そこに変数とかいう概念はない 構造体のメンバのオフセットでその位置を指定して書き込んだり読み込んだりするだけ その時のオフセットの計算に利用されるのが型 変数宣言すると構造体全体サイズのメモリ領域がスタックに確保される mallocで確保されるとヒープに確保されてそのアドレスが返る ただそれだけ
242 :デフォルトの名無しさん (アウアウウー Sa21-wVFe) :2023/12/08(金) 16:08:12.70 ID:k3Bpg+TDa.net 関数を malloc で確保するにはどうすれば良いですか?って言いそう
243 :デフォルトの名無しさん (ワッチョイ 5df0-/D3x) :2023/12/08(金) 16:21:49.56 ID:abnVL6FT0.net ちなみにメモリにロードされた関数の領域は現代のOSならば当然ながらアクセス不可能 昔はプログラム領域にアクセスできてその中のコードを動的に書き換えるという荒技をやってた人もいるらしいが
244 :デフォルトの名無しさん (ワッチョイ 5df0-/D3x) :2023/12/08(金) 16:24:27.68 ID:abnVL6FT0.net ちなみにメモリ領域にマシンコードを生成してそのメモリ領域のマシンコードを即時実行するということはできる これをJITという 最近のスクリプト言語ではこの手法がかなり用いられている やり方は普通にメモリにマシンコードを生成して実行可能属性を付加、各種CPUキャッシュをクリアしてから 関数ポインタにキャストして実行するだけ
245 :デフォルトの名無しさん (ワッチョイ 1163-8qzv) :2023/12/08(金) 16:31:30.89 ID:VEgZ7oNC0.net メモリ保護機構が動いて実行できないと思う 16ビットリアルモードOSだったらできたと思うが
246 :デフォルトの名無しさん (スッップ Sd0a-GtvU) :2023/12/08(金) 16:51:01.76 ID:9cA1ls6dd.net mprotectとかVirtualProtectで実行可能にすればできる
247 :デフォルトの名無しさん (ワッチョイ 1163-8qzv) :2023/12/08(金) 17:06:26.65 ID:VEgZ7oNC0.net しかし、それだと任意のコード実行が自由自在ってことになって・・・ まずくない?
248 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03) :2023/12/08(金) 17:24:04.59 ID:B2zBKDAb0.net >>247 許可を与えないと実行できないから問題にならないよ。 許可を与えられる前には実行できないんだから 外から注入されたものが自分で許可を出すということは出来ない。
249 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03) :2023/12/08(金) 17:24:33.32 ID:B2zBKDAb0.net >>247 許可を与えないと実行できないから問題にならないよ。 許可を与えられる前には実行できないんだから 外から注入されたものが自分で許可を出すということは出来ない。
250 :デフォルトの名無しさん (ワッチョイ 1163-8qzv) :2023/12/08(金) 17:35:36.56 ID:VEgZ7oNC0.net セキュリティって、身内も信じちゃまずいと思うよ
251 :デフォルトの名無しさん (ワッチョイ eaad-snvD) :2023/12/08(金) 20:25:30.65 ID:Bb4hYLfH0.net >>250 その理屈はOSすら信じられずPC使うなって発想にしかならん 信じた者が信じる者は正しい、セキュリティの基本やろ
252 :デフォルトの名無しさん (ワッチョイ 1163-8qzv) :2023/12/08(金) 20:31:27.89 ID:VEgZ7oNC0.net 企業でもそうなんですか? 管理者が望んでいないプログラムが動かせたら困るでしょう 管理者自身がやるってならちょっと違いますが
253 :デフォルトの名無しさん (ワッチョイ eaad-snvD) :2023/12/08(金) 20:41:26.51 ID:Bb4hYLfH0.net >>252 それはつまり「身内じゃないから動かない」なわけで身内も信じちゃまずいにはならんわけよ >>249 ではちみつ先輩が言っているのは「許可されたものは動く」なわけで 管理者が許可したものは動くし許可しなければ動かない たぶん「許可したプログラムが許可してないコードを実行したらどうすんの?」ってことだと思うけど そんなプログラムを許可した時点で間違ってる
254 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03) :2023/12/08(金) 20:48:50.56 ID:B2zBKDAb0.net ??? 私の理解だと >>247 は「機械語をその場で生成して即時実行するのって危なくないの?」という話だと思ってたんだけど違うの? そういう理解だったから実行の許可を出す (メモリの実行可能属性を ON にする API を呼び出す) ことなく実行できない、 プログラマの意図しない実行は防がれるということを応えたつもりだったんだけど、運用の話なの??? 「身内」ってのは「プログラムの中での機械語生成にミスったらめっちゃ暴走するやん?」という意味かと思ったけど 運用にかかわる人物という意味?
255 :デフォルトの名無しさん (ワッチョイ ea79-4utE) :2023/12/08(金) 21:24:15.38 ID:8rS6bPls0.net >>225 C++黎明期はC++トランスレーター付きのCを普通に使わされたもんだよ
256 :デフォルトの名無しさん :2023/12/09(土) 07:42:54.58 ID:Z2D8kHNzd.net >>250 それなら自作のプログラムをコンパイルして実行できる環境がすでにまずいだろw パソコンをゲーム機みたいにしたいのかい 読み書きできるメモリを実行可能属性にできるというだけで 書き込み不可能なシステムメモリに書き込めるようにできるわけではない
257 :デフォルトの名無しさん :2023/12/09(土) 08:06:29.62 ID:NnZXyC0n0.net 本日のWebは、 ・帝乃三姉妹は案外、チョロい。 → 本誌で既読 ・レッドブルー → 本誌で既読 ・からかい上手の高木さん → ゲッサンで既読 どうにかしてよ、A立。たとえば響5巻無料Webでもとか。 そういえば、高木さんの人の将棋のやつ、マガポケでも終わったね。
258 :デフォルトの名無しさん :2023/12/09(土) 08:12:11.03 ID:zYR2UmFI0.net いわゆるroot権限が必要な行為は実行出来ないね でも、mprotectの説明によると > 注意 Linux では、(カーネル vsyscall 領域以外の) 任意のプロセスアドレス空間において mprotect ()を呼び出すことが、常に許されている。 となってるから、Node.js(node)とかJITを行うプログラムがユーザー権限で動くのだろう 単に利便性の為だろう
259 :デフォルトの名無しさん :2023/12/12(火) 20:44:31.35 ID:3wiw5swR0.net staticグローバル変数を含んだ動的ライブラリーを動的リンクをする場合はグローバル変数が初期化されるのはmain実行前の認識です。 同じプロセス内で再度初期化したい場合は別途初期化の関数を用意してないと不可能でしょうか? 動的ロード(dlopen)を使用した場合はdlcloseして再度dlopenした場合は初期化されますか?
260 :デフォルトの名無しさん :2023/12/12(火) 21:01:30.67 ID:bMo3JLCK0.net >>259 やってみれば?
261 :デフォルトの名無しさん :2023/12/12(火) 21:15:07.81 ID:6C/zc+S/0.net 明示的に初期化処理を書くのが吉
262 :デフォルトの名無しさん (ワッチョイ d701-Qbcu) :2023/12/12(火) 21:58:30.38 ID:bMo3JLCK0.net >>259 >動的ロード(dlopen)を使用した場合はdlcloseして再度dlopenした場合は初期化されますか? Linuxの場合には初期化されたけど環境依存かも? $ cat hoge.c hage.c #include <stdio.h> static int a = 100; void increament_a () {++ a;} void print_a () {printf ("%d\n", a);} #include <dlfcn.h> typedef void (*Func) (); int main () { void *handle; Func func; handle = dlopen ("libhoge.so", RTLD_LAZY); func = (Func)dlsym (handle, "print_a"); (*func) (); func = (Func)dlsym (handle, "increament_a"); (*func) (); func = (Func)dlsym (handle, "print_a"); (*func) (); dlclose (handle); handle = dlopen ("libhoge.so", RTLD_LAZY); func = (Func)dlsym (handle, "print_a"); (*func) (); return 0; } $ gcc -shared -fPIC -o libhoge.so hoge.c $ gcc -o hage hage.c $ LD_LIBRARY_PATH=.; ./hage 100 101 100
263 :デフォルトの名無しさん (ワッチョイ 9f07-h0RM) :2023/12/12(火) 22:04:40.47 ID:3wiw5swR0.net >>261 ですよねぇ 数十万のレガシーコードで、リセットするにはプロセスのキルが前提なんだけど、移植対象のシステムはプロセスをキルできないので、なんとかリセットする方法はないかと…
264 :デフォルトの名無しさん (ワッチョイ 17f1-tASO) :2023/12/12(火) 22:10:06.55 ID:6C/zc+S/0.net 初期値代入くらい書くだろ普通 処理系によっちゃ不定な値から始まったりするのを防ぐ為にさ
265 :デフォルトの名無しさん (ワッチョイ 9f07-h0RM) :2023/12/12(火) 22:18:02.98 ID:3wiw5swR0.net >>262 検証ありがとう 自分の環境でも試してみます
266 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5705-ZkkM) :2023/12/12(火) 22:18:21.71 ID:Kje9ktjN0.net >>259 RTLD_NODELETE フラグで再初期化を止められる(というよりアンロードを妨げるのだけど)ので逆に言えば特に指定しなければ再初期化はされるのが通常動作という解釈でいいと思う。 >>263 わかってるだろうけどレガシーコードをそうやって延命させるとますますワヤになるでよ。
267 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5705-ZkkM) :2023/12/12(火) 22:39:58.31 ID:Kje9ktjN0.net >>264 言語仕様的にはグローバル変数 (記憶域期間が static) が不定になったりはしないことになっている (初期化子がなければゼロで初期化する) のでまともな開発環境があるところではそんな心配はしないよ。 心配が必要になるほど不確かな処理系しかない (または初期化処理も自分でかかなきゃいけないような低レイヤ) 分野もあるのは知ってるけどそれが普通ってことはない。
268 :デフォルトの名無しさん (ワッチョイ 9f79-1KRD) :2023/12/12(火) 23:05:45.63 ID:I4UWTUvH0.net >>267 言語仕様ではなく2度目のdlopenの初期化の話なんだからドキュメント化されてないなら何の保証もないでしょ
269 :はちみつ餃子 :2023/12/12(火) 23:55:24.16 ID:skpldDGw0.net >>268 そういう意味で言ってたのならわかる。 「どうして元から代入する処理を入れてなかった?それが普通だろ?」というニュアンスで受け取ってたから元は dlopen しなおしで対処する想定ではなかったからそういうことを心配してなかった (する必要がなかった) という反応になった。
270 :デフォルトの名無しさん (ワッチョイ 37f2-YdMO) :2023/12/15(金) 08:29:58.25 ID:a4YsmFKj0.net 板の名前変わった?
271 :デフォルトの名無しさん :2023/12/17(日) 18:23:47.21 ID:kc2HrTf20.net ポインタ変数にアドレスを代入するのはシャローコピーと言えると思いますか? char s[] = "abc"; char *p = s; // shallow copy
272 :デフォルトの名無しさん :2023/12/17(日) 18:40:34.16 ID:i7ihHaq10.net 果たしてコピーと呼んで良い操作ナノか
273 :デフォルトの名無しさん (ワッチョイ 1e5f-DkQ9) :2023/12/17(日) 19:27:43.64 ID:mH/O4qym0.net >>271 言えません
274 :デフォルトの名無しさん (ワッチョイ e34d-e8vO) :2023/12/17(日) 19:32:39.54 ID:MfQY7qyQ0.net >>273 ?
275 :デフォルトの名無しさん :2023/12/17(日) 22:10:52.33 ID:UmzU+/ux0.net シャローコピーはディープコピーと並べて語るときに区別するための用語であって、 代入は普通に代入と呼ぶのが、コミュニケーションにおいて適切だ、 と、自分が聞かれた場合なら答えるし、レビュー依頼された場合なら指摘します
276 :デフォルトの名無しさん :2023/12/18(月) 00:59:34.37 ID:Mvyif4Hn0.net >>275 シャローコピーと言えると思いますか?
277 :デフォルトの名無しさん :2023/12/18(月) 00:59:46.13 ID:Mvyif4Hn0.net 指摘する前に答えろよ無能
278 :デフォルトの名無しさん (ワッチョイ 63c9-/1Gs) :2023/12/18(月) 02:31:45.63 ID:BtLCMjh/0.net シャローコピーでしょ 2つのポインタが同じ内容になってる訳だから ちなみに、変数定義時の代入文はバインド(束縛する)と言った方が適切だな
279 :デフォルトの名無しさん :2023/12/18(月) 09:17:00.35 ID:qIC94rZG0.net >>276 言えません
280 :デフォルトの名無しさん :2023/12/18(月) 09:38:52.52 ID:RUscEa1Z0.net シャローコピーの要件からすると ポインタ変数にアドレスを代入するだけでは成立せずに リファレンス可能なオブジェクトを指してるポインタでないとまずい気がする char *p = (char *)0x000; /* アドレスを代入してるぞ */
281 :デフォルトの名無しさん :2023/12/18(月) 10:45:42.59 ID:RHsCrDES0.net 意見分かれますね ではstrdupはディープコピーだと言えますか?
282 :デフォルトの名無しさん :2023/12/18(月) 10:52:49.41 ID:kauj19Ts0.net C言語にはオブジェクトと言う概念がないからなあ お気持ちとしてどうかと聞かれれば、人それぞれで
283 :デフォルトの名無しさん :2023/12/18(月) 10:54:27.09 ID:PYgWDYAB0.net いやそれぬるぽ
284 :デフォルトの名無しさん :2023/12/18(月) 12:07:36.53 ID:ccgmPeZz0.net >>281 ファイルシステムや仮想記憶とか、コピーオンライトといって、書き込みが発生するまでは単なる参照先のコピーだけでコピー完了としてしまう 要するに何をもってコピーかを、先ずは定義してくれ
285 :はちみつ餃子 :2023/12/18(月) 12:57:51.87 ID:vbeDxg2G0.net それは C の概念モデルを前提にしていいだろ。
286 :デフォルトの名無しさん :2023/12/18(月) 14:16:20.90 ID:RUscEa1Z0.net C++ の 参照だったら概念含めてそのまんまだったんだろうな int a; int& b = a;
287 :デフォルトの名無しさん (ワッチョイ 12ad-9NgZ) :2023/12/18(月) 14:52:23.89 ID:kcYk1zSZ0.net >>271 言えると思う。
288 :デフォルトの名無しさん :2023/12/18(月) 16:19:13.36 ID:xiaHc48Fd.net 内容が値を表すメモリの位置 = オブジェクト
289 :デフォルトの名無しさん (ワッチョイ cb62-dXDU) :2023/12/18(月) 17:05:11.17 ID:pYYMlhZJ0.net >>276 「言わない」 代入をシャローコピーだとか言ってなにか騒いでる人があなたの周りにいるという話?なら、そいつバカだからあなたは相手にしなくていいよ。あなたはもっと大事な問題に取り組むべき
290 :デフォルトの名無しさん (ワッチョイ 4b63-3PPy) :2023/12/18(月) 17:09:52.77 ID:kauj19Ts0.net 代入元の配列がスタック上なのかどうか、そちらの方がC言語的には重要
291 :デフォルトの名無しさん (ワッチョイ 16ab-zIzn) :2023/12/18(月) 17:12:05.22 ID:RUscEa1Z0.net 関数内の自動変数へのポインタを関数の外へ持ち出したりすると…
292 :デフォルトの名無しさん :2023/12/18(月) 18:48:36.94 ID:epkANb1d0.net 何かのポインタをメンバに持つ構造体の実体の複写
293 :デフォルトの名無しさん :2023/12/18(月) 23:27:08.16 ID:ccgmPeZz0.net >>289 代入はコピーじゃないのか? 代入とコピーの本質的な違いは何だ?
294 :デフォルトの名無しさん :2023/12/18(月) 23:33:27.08 ID:a4PUOo8N0.net コピーには違いないけどディープとかシャローとか区別できるものじゃないってことだろ
295 :デフォルトの名無しさん :2023/12/18(月) 23:40:20.33 ID:6hD73gHu0.net >>293 代入は演算の種類 コピーは演算した結果起こる作用 用語を論理的に整理できてないとお話にならないだろう RustvsC++スレ辺りでまともな議論ができてないのはこれのせい
296 :デフォルトの名無しさん :2023/12/19(火) 08:23:42.15 ID:ijJJQ5/r0.net >>295 そういうコトなら、>>271 は アドレスを代入演算した結果を、シャローコピーと言えるか、 という質問じゃないの?
297 :デフォルトの名無しさん (スププ Sd32-3CSV) :2023/12/19(火) 09:34:26.09 ID:+6PK9xZxd.net シャローコピーとかディープコピーとかはもともとPythonの概念ですよね?
298 :デフォルトの名無しさん (ワッチョイ 2701-NGr8) :2023/12/19(火) 09:54:57.24 ID:hCROhcq70.net は?
299 :デフォルトの名無しさん (ワッチョイ 2701-3PPy) :2023/12/19(火) 10:05:08.86 ID:cwbunCZy0.net >>289 馬鹿ってすぐ断定するよな
300 :デフォルトの名無しさん (ワッチョイ 77cd-UNLj) :2023/12/19(火) 10:07:03.49 ID:KoTx3gw20.net コピーとクローンは違うよな?
301 :デフォルトの名無しさん (ラクッペペ MMde-Y9Ov) :2023/12/19(火) 10:13:44.25 ID:MIravlrKM.net >>297 C++やJavaあたりが元だと思うけど
302 :デフォルトの名無しさん (ワッチョイ 4b63-3PPy) :2023/12/19(火) 10:17:05.18 ID:gboy58yC0.net そういうことで、 Cにはシャローコピーとかディープコピーとかの概念はない
303 :デフォルトの名無しさん (ワッチョイ cb62-dXDU) :2023/12/19(火) 10:51:12.24 ID:E9BI8x9B0.net 少し前までスマートな人がたくさんいたのにいつの間にかバカしか居なくなった
304 :デフォルトの名無しさん (ワッチョイ cb62-dXDU) :2023/12/19(火) 10:55:10.13 ID:E9BI8x9B0.net >>297 違います
305 :デフォルトの名無しさん :2023/12/19(火) 11:32:45.68 ID:df21V+Ma0.net >>301 LISPじゃね?深いコピーは演習なんかの定番だった気がする
306 :デフォルトの名無しさん :2023/12/19(火) 13:45:42.10 ID:3Nu9QseCd.net >>305 比較の手段が参照と値と構造とで数種類あるしそうだろうね この手の大抵の起源はLispだよ
307 :デフォルトの名無しさん :2023/12/19(火) 15:01:13.02 ID:+6PK9xZxd.net Pythonの解説書には大概、ディープコピーとシャローコピーが載ってますよ
308 :はちみつ餃子 :2023/12/19(火) 15:28:24.33 ID:J0ExAcTK0.net >>305 もちろんそういう状況を扱っている事例は数多くある。 ただ、ざっと見た感じでは古いマニュアルでは「再帰的」とか「共有」とかいった語で説明するのが普通っぽい。 深い/浅いといった言い方が発生したのはもっと新しい言語でのことだと思う。
309 :デフォルトの名無しさん :2023/12/19(火) 19:44:57.82 ID:cwbunCZy0.net 複オジが粘着してそう
310 :デフォルトの名無しさん :2023/12/19(火) 19:48:51.51 ID:KoTx3gw20.net つか、Cは書いてる人にしか型が分からないからそんな器用な事は出来ないよな? どっちのコピーも自前でちまちま作るしか無い
311 :デフォルトの名無しさん :2023/12/19(火) 19:53:51.13 ID:nmJwtfK30.net 呼称にこだわってる限りCなんて使えない お上品な他の言語使ってりゃいいじゃん
312 :デフォルトの名無しさん (ワッチョイ cbd5-dXDU) :2023/12/20(水) 05:56:32.08 ID:r5p/Itr10.net >>310 その通りですよ 私はユーザが定義する集成型(structみたいなもの)を、PCをまたいでリモートコンピュータ上にコピーするもの(WindowsのC#とHP-UXのC)、を仕事で作った事があるのだけど、それをやるには型定義からガッツリ関わる仕組みを構築しないと無理なのよ。 自分はエクセルでやった(そして完璧にはできず特例処理だらけになった)けど、普通はDDLとか独自に作るでしょ 上の方で最初に話題出したヒトは多分、どういう問題空間でディープコピーとかシャローコピーを話題にする必要が生じるのか【すら】分かってないよ そうだね 複オジ とか言われてた人の雰囲気と似てるね
313 :デフォルトの名無しさん :2023/12/20(水) 09:35:46.96 ID:/uXb+00h0.net UPLIFT プレミアム・サービスのお知らせ https://uplift.5ch.net/ UPLIFT 主な特典 ・連続投稿の規制を緩和します。 ・スレッド作成時の規制を緩和します。 ・5ch.netのスレッド表示画面に表示される広告を除去します。 ・5ch.net専用ブラウザで5ch.netの過去ログを閲覧できるようになります。 ・海外からのアクセス・ホスト経由からでも書き込みができるようになります。 ・書き込みが規制されているプロバイダーからでも書き込みができるようになります。 ・5ch.netを安定して利用できるように運営を支援できます。 5ちゃんねるを存続させるためには、皆様のご協力が必要です。 最後まで御精読いただきありがとうございました。
314 :デフォルトの名無しさん (ワッチョイ e3f0-HAvR) :2023/12/23(土) 02:06:44.23 ID:cGlPuzRM0.net >>297 もちろん概念としてはCの時代からある しかし明確に言葉として定義したのはsmalltalkのはず shallowCopyメソッドとかがある
315 :デフォルトの名無しさん :2023/12/23(土) 10:35:35.90 ID:1vO40jtV0.net smalltalk、凄いな!私はバートランド・メイヤーさん、すごく尊敬してます javadocとかdoxygenみたいなシステムも、もうあの時代に彼はすでに形にして世に出してるんですよね 例外の説明とか、プログラムを契約の履行に例える話とかもそうだし、あとコメント論とかもイケてるんですよ 頭良すぎて周りが付いてくのに何年もかかってる気がする
316 :デフォルトの名無しさん :2023/12/23(土) 10:43:58.55 ID:1vO40jtV0.net てかまあ、Cのスレだね でもCで構造体リモートコピーするにはさ、みたいな話をしても、多分誰も乗ってきてくれないよね
317 :デフォルトの名無しさん :2023/12/23(土) 11:24:31.92 ID:MLKmoxlx0.net それは話の持ってき方。プレゼン上手ならできる
318 :デフォルトの名無しさん :2023/12/23(土) 11:28:28.28 ID:j8bI1ONF0.net そーゆーのに憧れてる層には土方言語のCはいらんだろw
319 :デフォルトの名無しさん :2023/12/23(土) 11:41:06.10 ID:PYuibGoS0.net だからさ、C言語の変数や構造体内の型宣言なんてイイカゲンなんだからそう言う話ははなから無理なんだよ
320 :デフォルトの名無しさん :2023/12/23(土) 11:42:27.32 ID:1vO40jtV0.net メッセージというか伝送パケットを作る話とかはどうですかね(皆さん興味ありますか) タグ・レングス・バリュー形式がー、とか バイナリvs文字列とか (文字列にして伝送するのって遅いと思うでしょ、意外と速度okだったりします) あと、message pack とか
321 :デフォルトの名無しさん :2023/12/23(土) 11:44:11.18 ID:PYuibGoS0.net ゼロ(0x00)が送れないから文字列は無理
322 :デフォルトの名無しさん :2023/12/23(土) 11:46:23.81 ID:PYuibGoS0.net 経路によっては7ビット+パリティに解釈されるからバイナリは無理
323 :デフォルトの名無しさん :2023/12/23(土) 11:49:57.82 ID:PYuibGoS0.net 結局、デバイスとかハードの特性を理解する必要があるんだよね
324 :デフォルトの名無しさん :2023/12/23(土) 11:54:07.08 ID:MLKmoxlx0.net メッセージの受け渡しでハードの特性まで理解する必要はないだろう
325 :デフォルトの名無しさん :2023/12/23(土) 11:57:42.36 ID:PYuibGoS0.net だっていまどきC言語使ってる人なんて、デバイス寄りのハードウェアコントロールとか、チープなCPUに搭載するソフトとかだろ?
326 :デフォルトの名無しさん :2023/12/23(土) 11:59:57.84 ID:1vO40jtV0.net >>321 おっと、反応サンキュー 0x00をデータとして送るのってあるある話題ですよねw 確かに「通信全部が」文字列で、nul文字終端だとすると無理。 でも、アタマにデータサイズがあって、それからデータがある形式ならば、仮に文字列が続いてると見える中に、まるでゴミ文字みたいに0x00が入っててもokなのよ 実は今のHTTPもそうなってたはず
327 :デフォルトの名無しさん :2023/12/23(土) 12:04:44.24 ID:PYuibGoS0.net >>326 途中のコードに文字列操作を一切使わないならいいが 改修はいって文字列操作する人が居たらアウトだよね?
328 :デフォルトの名無しさん :2023/12/23(土) 12:09:04.65 ID:PYuibGoS0.net 最初からunsignd charのポインタとサイズを構造体にして扱えば良いだけ
329 :デフォルトの名無しさん :2023/12/23(土) 12:09:04.99 ID:1vO40jtV0.net 大昔は7ビットしか通らない経路あったねw 5baseとかの時代でしょうか 今は、8ビットを8ビットで伝送するほうが稀でしょうね 8ビットを10ビットで符号化することで、ゼロやイチが連続する数が少なくなるようにすることで、データ自体でタイミングを取れる方法をIBMが発明したとかで だからこんなに速くなったそうです
330 :デフォルトの名無しさん :2023/12/23(土) 12:13:58.12 ID:1vO40jtV0.net >>327 多分あなたの危惧が伝わってないです 改修案件でバグを作り込んだのに動作確認せずリリースしてしまうっていう事なら、工程管理ができてないって話でプロとしてダメ メッセージ形式の仕様とは関係ないですね
331 :デフォルトの名無しさん :2023/12/23(土) 12:17:04.95 ID:1vO40jtV0.net (…もしや「複オジ」さんだったかな?)
332 :デフォルトの名無しさん :2023/12/23(土) 12:56:43.79 ID:j8bI1ONF0.net やっぱりめんどくさい奴だったかw あんたにレスがもらえないのはテーマのせいじゃないとわかれ
333 :デフォルトの名無しさん :2023/12/23(土) 18:17:03.63 ID:PYuibGoS0.net >>330 安易に文字列を使う仕様にしてるとバイナリ通らないの忘れるし思わぬバグを生む原因になるから、最初からバイナリ配列にするか文字列操作関数を一切使わない様にしないとな
334 :デフォルトの名無しさん (ワントンキン MM07-TKg5) :2023/12/24(日) 00:00:50.96 ID:B84K7ZI6M.net >>332 うん…(悲しい)
335 :デフォルトの名無しさん (ワッチョイ 4602-UkJf) :2024/01/05(金) 10:30:41.51 ID:ph0QLfWd0.net Perlとかで利用している設定ファイルがあるのですが、 Cで書いたプログラムでも同じファイルを設定ファイルとして読み込みたいです 設定ファイルですが、このような感じです val = abc str1 = $val/AAA Perlでは「$val」を展開し、str1に「abc/AAA」と設定してくれるのですが、 Cから読み込む場合は、自分で展開する必要があると思ってます それをやってくれるライブラリや関数等、ありますでしょうか
336 :デフォルトの名無しさん (ワッチョイ e563-7PFe) :2024/01/05(金) 10:49:08.39 ID:xgizPOi+0.net その程度なら、自作できるだろう
337 :デフォルトの名無しさん :2024/01/05(金) 11:38:06.91 ID:VxELzJcZd.net #define val abc
338 :デフォルトの名無しさん (スププ Sd62-Blk0) :2024/01/05(金) 12:10:00.56 ID:VxELzJcZd.net enum { val = abc }
339 :デフォルトの名無しさん (スププ Sd62-Blk0) :2024/01/05(金) 12:13:38.69 ID:VxELzJcZd.net enum の方はエラーになる
340 :デフォルトの名無しさん (スププ Sd62-Blk0) :2024/01/05(金) 12:27:56.38 ID:VxELzJcZd.net #define もエラーになる
341 :デフォルトの名無しさん (スププ Sd62-Blk0) :2024/01/05(金) 12:30:33.41 ID:VxELzJcZd.net #define val "abc"
342 :デフォルトの名無しさん (ワッチョイ 651a-R/a6) :2024/01/05(金) 12:30:55.30 ID:qVR6C9yQ0.net >>335 そういうのをどう解決するかを自分が考えて実現するのが楽しいのに… 自分なら 設定ファイルを「環境変数を設定する」に変更して、perlもCも環境変数から設定項目を読む に変更する。 そのために perl側を変更する権利を得る OSに依存して良い条件 を確保する様に、喫煙所に通う
343 :デフォルトの名無しさん :2024/01/05(金) 12:49:25.99 ID:qVR6C9yQ0.net >>335 別の解決案 ・Cに優しい形式(右辺を全部展開した形で、イコール前後のスペースもなし)で吐き直すツールを、perlで作る ・自分で全部Cで作る ・lex/yacc を使って軽言語解釈ルーチンを作る それぞれデメリットがあって、質問に直接答える「そういったライブラリはあるか」に一番合ってるのが、最後のlex/yaccだけど、それは一番バカらしい答えでもある。お好きに
344 :デフォルトの名無しさん :2024/01/05(金) 12:51:00.35 ID:qVR6C9yQ0.net >>337 君、答える側になれる実力ないだろ
345 :デフォルトの名無しさん :2024/01/05(金) 12:54:37.44 ID:KwPCWpVD0.net sscanfで読めばよかろうもん
346 :はちみつ餃子 :2024/01/05(金) 13:07:45.12 ID:t0UUGhQq0.net >>335 その説明では何をやりたいのか伝わってないので仕様書を書いてみて。 理想的なライブラリがあったとして、そのテストケースという形式でもいい。 曖昧模糊な要望だと説明が下手なだけでなく説明しようとしている内容が見当違いな可能性を疑う。 (いわゆるXY問題)
347 :デフォルトの名無しさん (ワッチョイ 2eab-zkkm) :2024/01/05(金) 13:32:24.69 ID:38bnxq2E0.net Cのソースでその展開もどきを行いたいのか Cで書いてるプログラムがとあるファイル食って文字処理するんだけど、同じことを実現したいのか
348 :デフォルトの名無しさん (ワッチョイ 45bb-dhuT) :2024/01/05(金) 13:37:38.46 ID:M4U6Kwpw0.net >>335 これは実装するとなると簡易言語になっちゃうな でも変数と変数参照だけだから大して難しくないよ たぶん1000行ぐらいに収まる
349 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-slPv) :2024/01/05(金) 14:59:38.28 ID:t0UUGhQq0.net どうしても既存の設定ファイルをそのまま使いたい、それを処理できるようなものが欲しいということなら そんな都合の良いものがあるわけない。 自分で書くしかしょうがない。 完璧にそのままのフォーマットでなくおおよそ似た機能があればよいなら TOML とか JSON とか YAML とかの広く使われているフォーマットを採用したほうが面倒が少ない。 Perl でも C でも処理できるライブラリがいくつもあるし。 これらには変数展開のような機能はないが、 設定ファイルで動的な操作を可能にするのは問題を引き起こしやすいと考えられていて、 アプリケーション側でやるかプリプロセッサでなんとかしたほうがよい。 (強いて言えば YAML のエイリアス機能は変数のようなものとも言えるけど文字列を結合したりは出来ない。) 逆に設定どころではなくユーザーによるカスタマイズをどんどんやってもらうようなものなら Lua とかのアプリケーション拡張言語を埋め込んでしまうという方法もとれる。
350 :デフォルトの名無しさん (ワッチョイ c2b5-R5Zd) :2024/01/05(金) 15:39:37.20 ID:mdj5x9Xd0.net Perlにそんな便利機能あったっけ
351 :デフォルトの名無しさん (ワッチョイ c6bb-bJ3A) :2024/01/05(金) 18:09:30.90 ID:xFVV62H30.net Cは遅延評価を積極的にやるための言語ではないからなあ C++やC#ならあるんだけどね lex/yacc はちょっと古くて 今なら flex/byson ですね
352 :デフォルトの名無しさん :2024/01/06(土) 15:06:00.15 ID:NPThFXTg0.net $ の変数展開しかやらないなら複雑な構文解析にはならないから全部自作した方が楽なのでは? 少し楽したいなら perl に読ませて $ 展開させた文字列に変換して出力したのを C の側で読むとかね。そうすると少し楽ができる。 これの問題は perl が使えない環境では動かないことかな。
353 :デフォルトの名無しさん :2024/01/06(土) 16:25:37.13 ID:2Gstkfh+0.net 今なら packcc おすすめ
354 :はちみつ餃子 :2024/01/06(土) 16:27:28.51 ID:iX+vez910.net 設定ファイルのデータ構造が key/value の組だけ、 value は単なる文字列という程度なら パーサジェネレータはかえって邪魔じゃないのかな。
355 :デフォルトの名無しさん :2024/01/06(土) 21:36:47.69 ID:8zwGVkiA0.net lex/yaccは使った事ない人にはハードル高いだろうね。逆に、使い方が分かると何でもそれでやりたがる時期が来る。どんなツールや言語でもそうだろうけど
356 :デフォルトの名無しさん :2024/01/06(土) 21:39:52.15 ID:YhaQaYGw0.net BNF書いても大した量にならないだろうし俺ならフルスクラッチで書いちゃうな
357 :デフォルトの名無しさん :2024/01/06(土) 21:45:36.68 ID:8zwGVkiA0.net で、設定ファイル、shで環境変数を設定すりゃ済む、という案に誰も反応してもらえないんだが、どうだい? windows ならcmdだろうけど 設定項目ってのは、パス文字列とか、メモリサイズとか、ほぼ固定だけどあとから変えたい場合もあろう、っていう定数だよね。環境変数ってまさにその目的だと思ってる。 ドル記号で一時値の展開もできる。Cからも簡単に読める。
358 :デフォルトの名無しさん :2024/01/06(土) 21:56:18.04 ID:8zwGVkiA0.net shで、設定ファイル兼、実行ファイル起動ラッパを書いて、利用者には直接実行ファイルじゃなくラッパを起動せよと説明して export XXX_ROOT=/var/xxx export XXX_INPUT_DIR=${XXX_ROOT}/in export XXX_OUTPUT_DIR=${XXX_ROOT}/out export XXX_READBUF_SIZE=32768 exec ${XXX_ROOT}/bin/xxx Cで読む処理は get_conf_str(...) //文字列項目用 get_conf_i64(...) //整数項目用 どっちもパラメータに (環境変数名, 環境変数が未設定時の具体値) って指定する。これが、ソース上の1箇所でズラッと並ぶと「設定項目名とハードコード値の、一覧表」風になるの。分かる?
359 :デフォルトの名無しさん :2024/01/06(土) 22:02:36.24 ID:8zwGVkiA0.net get_conf_str() と get_conf_i64() の中身は getenv() を使って簡単に実装できる、のは分かるよね?
360 :デフォルトの名無しさん :2024/01/06(土) 22:09:41.74 ID:LvNnK4+W0.net 単なる文字列だけなら正規表現の置換でいいだろ
361 :デフォルトの名無しさん :2024/01/06(土) 22:20:12.76 ID:8zwGVkiA0.net struct conf_t { char* input_dir char* output_dir; int64_t readbuf_size; } g_conf; 文字列項目はC++だとstd::string にする所だが、Cだとstrdup(的なもの)で実装しても良いんじゃないかい。 g_conf.inputdir = get_conf_str( "XXX_INPUT_DIR", "/var/xxx/in"); g_conf.outputdir = get_conf_str( "XXX_OUTPUT_DIR", "/var/xxx/out"); g_conf.readbuf_size = get_conf_i64( "XXX_READBUF_SIZE", 32768); とかってするとソース上で一覧表風になるでしょ。タブ文字も入れて桁そろえて。
362 :デフォルトの名無しさん (ワッチョイ 627a-JKp6) :2024/01/06(土) 23:25:47.33 ID:4fq2Cpkf0.net まあ落ち着けよ 質問者はそんなこと聞いとらんだろうよ
363 :デフォルトの名無しさん :2024/01/07(日) 00:35:50.01 ID:yw4Ulg6E0.net for(;;){ if((result = fgets(line, MAX_LEN, stream)) != NULL){ p1=result; p3=p1+strlen(line); p2=strtok(p1, "="); } } これで、p1とp2から左辺、p2とp3から右辺が取り出せる。 $の展開は、マクロ展開処理の要領で 右辺に$があるかチェックして、あったら定義値に置き換えるという 10ステップ程度の処理でできるだろ。
364 :デフォルトの名無しさん (ワッチョイ 7fb5-j9I8) :2024/01/07(日) 08:57:04.03 ID:4P3NNejl0.net >>335 >Cから読み込む場合は、自分で展開する必要があると思ってます その通りです >それをやってくれるライブラリや関数等、ありますでしょうか ありません 自作する必要があります >>363 p2=strtok(p1, "="); スペースやタブの処理が必要
365 :デフォルトの名無しさん (ワッチョイ 7f79-e2pS) :2024/01/07(日) 10:17:39.72 ID:gAwkeLQQ0.net せめて既存の気の利いた言語のstring型のメソッドやらを参考にしろよ ここで再発明しても誰も使わんだろ
366 :デフォルトの名無しさん (ワッチョイ 5f1a-nsdu) :2024/01/07(日) 10:25:56.11 ID:TVg93ufA0.net 質問者、もういない
367 :デフォルトの名無しさん (ワッチョイ df01-6482) :2024/01/07(日) 11:15:08.19 ID:SfiTOIyR0.net >>335 >それをやってくれるライブラリや関数等、ありますでしょうか perlはCで書かれてるけどね
368 :デフォルトの名無しさん (ワッチョイ 5f63-vNrU) :2024/01/07(日) 11:23:13.54 ID:XrTF2oph0.net 動かすCプログラムをperlに書き直す方が簡単そう
369 :デフォルトの名無しさん (ワッチョイ 7fad-ipwt) :2024/01/07(日) 16:24:59.67 ID:tTa6vFrs0.net こんな方法もある。しかし $ の変数展開しかしないなら無駄な感じはするね。それだけのためにここまでするのかという。 perlembed - C プログラムへの Perl の埋め込み方 https://perldoc.jp/docs/perl/5.10.0/perlembed.pod
370 :デフォルトの名無しさん :2024/01/10(水) 16:11:15.07 ID:PVZRGcug0.net $がリテラルとして入ってた時はどうするかとか、結構面倒そう
371 :デフォルトの名無しさん (ワッチョイ 5f1f-nsdu) :2024/01/10(水) 17:49:56.37 ID:C4OEbwTl0.net >>370 そうなんだよー、真面目にやるとバカみたいに面倒なのよ 文字列リテラルの中に $ やコメント開始終了記号が入る事もあるし コメントの中に $ や文字列開始終了記号が入る事もある # "#" $aaa = /* $コメント " */ "文字列/**/値"; なので、頭から読み始めて、状態を追いながら(現在の場所が 文を書く所か、コメント内か、文字列内か)読まないと、正しいファイルを正しく読めない んで、つまんないバグを作り込んだりするの。その、もういない誰かが作り込んだつまんないバグを、別の誰かが直すはめになる。そんなの嫌じゃね?
372 :デフォルトの名無しさん (ワッチョイ 5f1f-nsdu) :2024/01/10(水) 17:57:07.75 ID:C4OEbwTl0.net でも本当に、質問者はもうトンズラしたと思うよ。次の話をしよう
373 :デフォルトの名無しさん (ワッチョイ 5f63-vNrU) :2024/01/10(水) 18:00:48.10 ID:PVZRGcug0.net 次の患者さん、どうぞ
374 :デフォルトの名無しさん (ワッチョイ ffcf-mfjK) :2024/01/10(水) 21:56:41.19 ID:Qa3z5jue0.net >>327 どっちにしろ質問者のためにやってるわけじゃないからいいんだよ
375 :デフォルトの名無しさん (ワッチョイ 5ff5-j9I8) :2024/01/10(水) 22:25:04.83 ID:Gs+Ha8Nh0.net >>371 そこまでのコメント機能はいらんやろ シェルスクリプトの設定ファイル程度のことができればいいんだろうから #が来たら改行までをコメントとするぐらいで
376 :デフォルトの名無しさん (ワッチョイ 7fd9-EKXI) :2024/01/10(水) 23:20:02.65 ID:ZQ7M3ZpB0.net ちなみにCの識別子に$を使える 少なくともgcc, clang, msvcで使える int $val = 0; とか
377 :デフォルトの名無しさん (ワッチョイ 5f1f-nsdu) :2024/01/10(水) 23:20:30.43 ID:C4OEbwTl0.net >>375 環境変数設定で「十分」どころか、それがかなりきちんと対応している。 シェルは(shもcmdも)「改行までコメントとみなす」なんていういい加減な実装じゃないよ
378 :デフォルトの名無しさん (ワッチョイ 5f1f-nsdu) :2024/01/10(水) 23:36:31.88 ID:C4OEbwTl0.net パーサー実装の現実的な話がまともにできるニキはここにはいないねw
379 :デフォルトの名無しさん :2024/01/11(木) 02:31:42.07 ID:uSDU2aBB0.net ほらな、はちみつも黙るやろ 規格は詳しいけどな
380 :デフォルトの名無しさん :2024/01/11(木) 02:42:19.58 ID:WTkhFxto0.net パーサーなんて大して難しくないよ テスト書けば
381 :デフォルトの名無しさん :2024/01/11(木) 06:03:54.69 ID:ZajpDUJL0.net >>377 いやだからそんな本格的に作る必要ないって話 労力の投入場所を選定するのもプログラマの能力
382 :デフォルトの名無しさん :2024/01/11(木) 07:51:37.56 ID:7oF58mtI0.net >>371 みたいなので悩むならさくっと正規表現ライブラリやパーサージェネレータ使うな。 学習のために自分でパーサー書いてみたいってんなら別だが。
383 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-Cx9t) :2024/01/11(木) 09:41:05.64 ID:NL5Kg7pj0.net >>379 仕様が曖昧なのに実装の話をしても無意味だろ。 新しい情報が提示されないなら回答すべきこともない。
384 :デフォルトの名無しさん (ワッチョイ 5f63-vNrU) :2024/01/11(木) 09:42:53.45 ID:ZxeGb/wD0.net 誰か、作ってやれよ
385 :デフォルトの名無しさん :2024/01/12(金) 10:13:36.22 ID:Umd8uX9b0.net strcat() はダメなの?
386 :デフォルトの名無しさん :2024/01/13(土) 00:25:52.89 ID:suyQO94R0.net sscanfで十分だよ
387 :デフォルトの名無しさん (スッップ Sd9f-j9I8) :2024/01/13(土) 09:14:54.62 ID:mB7BPAPVd.net >>385 参加したかったの?
388 :デフォルトの名無しさん :2024/01/13(土) 09:41:46.29 ID:fMrSPcrk0.net ここに書けば参加したことになるよ
389 :デフォルトの名無しさん (ワッチョイ 5f59-P7l0) :2024/01/13(土) 13:22:56.37 ID:kmNIHanh0.net 参加することに意義がある
390 :デフォルトの名無しさん (スッップ Sd9f-+zra) :2024/01/13(土) 16:53:47.66 ID:8Ttuq2mzd.net C言語からJSON読み書きにオススメのライブラリやDLL教えてくれさい。 UTF-8↔ANSI変換はAPIでやれそうです。
391 :デフォルトの名無しさん :2024/01/13(土) 19:04:48.77 ID:suyQO94R0.net yyjsonで十分だよ
392 :デフォルトの名無しさん :2024/01/17(水) 13:51:26.07 ID:MxPcwzaVM.net 以下はmalloc()で割り当てた領域を開放してポインタをヌルポインタにするマクロである #define MYFREE(p) do {free(p); p = 0;} while(0) このマクロに不備があるかないか、ある場合はどんな不備か答えよ ただし処理系はANCI C準拠とし、stdlib.hがインクルードされていることとpが左辺値かつmallocで割り当てた領域を指す有効なポインタであることの2点は呼び出し側によって保障されているものとする
393 :デフォルトの名無しさん (ワッチョイ 427c-kX52) :2024/01/17(水) 16:32:50.55 ID:sbbnyjB/0.net 宿題は他所でやれ
394 :デフォルトの名無しさん :2024/01/17(水) 19:42:28.17 ID:bWv2IYcS0.net do-while文で回す意味ってあるの?
395 :デフォルトの名無しさん :2024/01/17(水) 19:44:52.19 ID:UA2B8Wur0.net 使った人に聞きなさい
396 :デフォルトの名無しさん :2024/01/17(水) 19:49:06.18 ID:dYqrLAA4M.net >>394 セミコロンをつけさせるため
397 :デフォルトの名無しさん :2024/01/17(水) 21:11:00.53 ID:DTNbW1I/0.net >>392 答えわかったけど教えない
398 :デフォルトの名無しさん :2024/01/17(水) 21:21:33.14 ID:Am4HUjmg0.net >>394 2つ以上の文をマクロ関数の形にするときに、C言語の仕様において最も合法安全とされるイディオムだよ
399 :デフォルトの名無しさん :2024/01/17(水) 21:47:57.64 ID:i5GqHIkod.net >>394 たとえば #define MYFREE(p) free(p); p = 0 と定義すると if( 条件 ) MYFREE( p ); と書くと if( 条件 ) free(p); p = 0; と展開されてしまいp = 0;は条件に関わらず実行されてしまう またこの後にelse節が続くとエラーになってしまうなど不具合の原因になる
400 :デフォルトの名無しさん (ワッチョイ f901-LNAd) :2024/01/17(水) 23:38:16.60 ID:bWv2IYcS0.net >>396 ,398,399 全然知らなかった アリガト
401 :デフォルトの名無しさん (ワッチョイ 2214-HXAs) :2024/01/18(木) 11:04:17.52 ID:0zoYvNSM0.net >>392 その条件下ならない でもpが左辺値という前提がなかったら変なコトになるコードが書けるね
402 :デフォルトの名無しさん (ワッチョイ 2214-HXAs) :2024/01/18(木) 11:04:49.16 ID:0zoYvNSM0.net >>400 396はゼンゼン関係ないんだけどホントに分かってんのか?w
403 :400ではないが :2024/01/18(木) 12:19:02.31 ID:5g03qqC30.net >>402 396 と 399 は異口同音と読んでいたが、主旨違うの?
404 :はちみつ餃子 :2024/01/18(木) 12:27:08.35 ID:LtdZIRKJ0.net >>402 ブロックではなく do / while にする理由としては関係がある。
405 :はちみつ餃子 :2024/01/18(木) 12:41:36.76 ID:LtdZIRKJ0.net 二つの文が分かれてしまわないようにするだけならブロックで包めばよくて #define MYFREE(p) {free(p); p = 0;} と定義しておけば if( 条件 ) MYFREE( p ); というような使い方で意図通り動作する。 問題になるのは else が付くときで、 if( 条件 ) MYFREE( p ); else foo(); みたいなことをすると if( 条件 ) {free(p); p = 0;}; else foo(); というように余計なセミコロンが if と else の対応付けを壊してしまう。 かといって MYFREE にはセミコロンを付けない使い方をせよというのも不格好なので do / while で囲むといい感じって話。
406 :デフォルトの名無しさん :2024/01/18(木) 13:15:24.78 ID:hXSenRUz0.net はちみつ餃子はいい加減改名しろよ、はちみつ先生によ どんだけタメになる話すりゃ気が済むんだ 目からウロボロスだぜまったく
407 :デフォルトの名無しさん :2024/01/18(木) 13:17:33.34 ID:opxINJAy0.net >>392 「せよ」ってなんだよ。何様のつもりだ?
408 :デフォルトの名無しさん :2024/01/18(木) 20:39:02.28 ID:r48d/DyKd.net #define MYFREE(p) (free(p), p = 0) のほうが単純
409 :デフォルトの名無しさん :2024/01/18(木) 22:45:02.99 ID:twAiz/ys0.net 今どきのCならマクロじゃないといけない場合以外はinline使え。
410 :はちみつ餃子 :2024/01/19(金) 08:59:45.95 ID:vjpbBz8R0.net >>409 C の関数は多相化できない。 void* と他のポインタは相互に変換可能なんだが void* 自体の表現や境界調整要求は環境依存なので #include <stddef.h> #include <stdlib.h> inline void my_free(void** x) { free(*x); *x=NULL; } int main(void) { int *x = malloc(sizeof(int)); my_free((void**)&x); } みたいなことをして正しく動作する保証はないはず。 この場合は「マクロじゃないといけない場合」だと思うよ。
411 :デフォルトの名無しさん :2024/01/19(金) 11:12:10.18 ID:Wkz3Ctqj0.net mallocが返すのはvoid*だし、freeが受け取るのもvoid*なのに?? 保証が無かったら俺達はこれからどうすればいいんだw
412 :デフォルトの名無しさん :2024/01/19(金) 11:13:32.08 ID:76FyHnUv0.net printf("Hello, work!");
413 :はちみつ餃子 :2024/01/19(金) 11:18:44.53 ID:vjpbBz8R0.net >>411 void* の話じゃなくて void** の話をしてる。
414 :デフォルトの名無しさん :2024/01/19(金) 11:42:42.67 ID:THNGxTXR0.net printf("Konyanyachiwa, Sekai no Kuni kara!");
415 :デフォルトの名無しさん :2024/01/19(金) 12:11:49.63 ID:Wkz3Ctqj0.net void**とvoid*は相互に変換可能じゃないのか?
416 :はちみつ餃子 :2024/01/19(金) 12:19:49.22 ID:vjpbBz8R0.net 変換が可能だということと同じ表現を持つことは別という話。 int* から void* への変換は変換に関するルールだが int** から void** への変換によって int* を void* として読もうとするのは type punning の問題。
417 :デフォルトの名無しさん :2024/01/19(金) 12:20:09.89 ID:Wkz3Ctqj0.net そうなると、 int** a = malloc(sizeof(int*) * 3); は、保証無いことになるな 俺達はどうすればいいんだw
418 :デフォルトの名無しさん :2024/01/19(金) 12:25:31.50 ID:Wkz3Ctqj0.net void** a = malloc(sizeof(void*) * 3); の方が適切だったか これで、a[0]の読み書きが保証されないのは困るよ
419 :はちみつ餃子 :2024/01/19(金) 12:27:15.27 ID:vjpbBz8R0.net >>417 繰り返すが変換の話と表現の話は異なる。 void* は全てのオブジェクトを指すポインタと相互に変は可能であることは保証され、 「malloc が返すポインタに限っては」いかなる型とも適合するように境界調整されていることが保証される。
420 :デフォルトの名無しさん :2024/01/19(金) 12:34:27.05 ID:3hcnICbb0.net 【AI】Googleの医療面接特化AI「AMIE」は人間よりも正確な診断が可能&患者への印象に優れるという研究結果 [すらいむ★] https://egg.5ch.net/test/read.cgi/scienceplus/1705583722/l50 【AI】Google DeepMindが数学オリンピックレベルの幾何学問題を解けるAIを発表、人間の金メダリストに近い性能を発揮 [すらいむ★] https://egg.5ch.net/test/read.cgi/scienceplus/1705583476/l50 【AI】大学入試共通テスト、3つのチャットAIに解かせてみたら? GPT-4はバケモノだった [すらいむ★] https://egg.5ch.net/test/read.cgi/scienceplus/1705585402/l50 【ナゾロジー】「株価の変動を粒子の振動として理解」量子力学で株式市場の法則を読む! [すらいむ★] https://egg.5ch.net/test/read.cgi/scienceplus/1705583580/l50 【AI】NTT、自分の分身AIを低コストで作る技術。自分の合成音声を簡単に作れる技術も [すらいむ★] https://egg.5ch.net/test/read.cgi/scienceplus/1705583313/l50 ボイス・トォ・スカルのコアプログラムの一部は上記を統合している
421 :デフォルトの名無しさん (スッップ Sd22-aNQv) :2024/01/19(金) 12:39:29.69 ID:S8ovIeWid.net 何を言ってるんだお前は案件 ポインタの中身は指す対象によってアラインが変わるが ポインタ自体のアラインは原則一種類しかない
422 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw) :2024/01/19(金) 12:51:29.04 ID:vjpbBz8R0.net >>421 ポインタは型ごとに異なる表現・境界調整要求を持つ可能性がある。 適合する型へのポインタ同士の場合など同じ表現・境界調整要求を持つ条件が定められているが 最後に「これ以外の型へのポインタは、同じ表現又は同じ境界調整要求をもつ必要はない」と仕様に明記されてる。 具体的な部分は処理系定義なので全部が同じ表現であることをあてにしていい環境ならそうすることは否定しなけど、 常にあてにできるわけでもない。
423 :デフォルトの名無しさん (ワッチョイ 463f-ggGG) :2024/01/19(金) 13:18:44.56 ID:Wkz3Ctqj0.net そうは言っても、 void* p = 0; と直接生成出来るわけで、void*は値としての意味もちゃんとある それがvoid**にすると元に戻せる保証が無いのは仕様の不備だろw
424 :デフォルトの名無しさん (スッップ Sd22-aNQv) :2024/01/19(金) 13:22:00.51 ID:S8ovIeWid.net >>422 それは「ポインタが指す対象」についての記述で ポインタ自体にはどんな適当な値を書き込むことも可能(そのポインタを使ってアクセスすると何が起こるかわからないというだけ) ただポインタにNULLを書き込むだけの関数になんの危険もない
425 :はちみつ餃子 :2024/01/19(金) 13:35:18.59 ID:vjpbBz8R0.net >>424 > それは「ポインタが指す対象」についての記述で この (>>410 ) 場合はポインタが指す対象に書き込もうとしている話だが。
426 :デフォルトの名無しさん (スッップ Sd22-aNQv) :2024/01/19(金) 15:18:43.59 ID:S8ovIeWid.net >>425 そのポインタは関数への引数であり すでにvoid*を表すものだと型は決まってるではないか それとは別に インライン関数で書いた場合はその場で展開されるから void* p = 0;と書いた場合と同様にコンパイラが適切な0を書き込んでくれるんじゃないの つまり(void**)をつけると逆に危険 my_free(&x); でよい
427 :デフォルトの名無しさん :2024/01/19(金) 16:04:16.95 ID:dJaf/W/GM.net ポインタで0リテラルだけは特殊でNULLと同義だったのではなかったっけ
428 :はちみつ餃子 :2024/01/19(金) 16:16:34.10 ID:vjpbBz8R0.net >>426 > (void**)をつけると逆に危険 これは暗黙に型変換されることが保証される文脈ではないので付けなければコンパイルが通らないだけ。 (コンパイラによっては黙って通すことはあるのかもしれない。) > インライン関数で書いた場合はその場で展開されるから 言語の意味論としてはインライン関数は ・ 同じ定義なら (翻訳単位を跨いだ場合でも) 複数回定義してもよい (定義が一回の場合と同じ挙動) ・ なるべく高速に呼び出して欲しいことを期待するヒントである (実現方法は規定しない) ということになってる。 インライン関数がインライン関数ではない関数と異なる動作にはならない。
429 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw) :2024/01/19(金) 16:39:47.61 ID:vjpbBz8R0.net >>427 せやで。 厳密に言えばリテラルだけじゃなくて「整数の 0 であるような定数 (定数式) をポインタに型変換したときは空ポインタ」というルール。 これも変換に関するルールであって表現に関するルールではないよね。 実際に空ポインタの内部表現が整数の 0 というわけではない環境は存在するが、 型が正しければ適切に変換される。
430 :デフォルトの名無しさん (ワッチョイ 25bb-ggGG) :2024/01/19(金) 16:53:05.15 ID:CCGmGKuQ0.net >>429 それ規格書に書いてあんの?知らんかったわ でも if (!ptr) みたいなポインタがゼロであることを期待するような式は処理系依存になるでしょ?
431 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw) :2024/01/19(金) 17:02:59.57 ID:vjpbBz8R0.net >>430 いや、それがよく出来てて、ポインタをそういう形で条件に使うのは問題ない。 単項演算子 ! について「式!Eは,(0==E)と等価とする」というルールになっていて 等価演算子 (==) はポインタと空ポインタ定数を比較したときの結果を規定してる。 空ポインタ定数のほうをもう一方のオペランドの型に合う空ポインタに型変換するルール。
432 :デフォルトの名無しさん (ワッチョイ 25bb-0zjl) :2024/01/19(金) 17:32:06.95 ID:CCGmGKuQ0.net >>431 規格書読んできたけど 6.3.2.3 値0をもつ整数定数式は空ポインタになる 6.5.3.1 式!Eは,(0==E)と等価 6.5.9 ==は空ポインタ定数をポインタの型へ型変換する ってことか なるほど、規格を解釈すれば!ptrは空ポインタと比較されることになるから問題ないのか 勉強になったわ
433 :デフォルトの名無しさん :2024/01/19(金) 18:55:00.05 ID:EWHtqHW90.net NULLは処理系定義だしこの辺はややこしいよね
434 :デフォルトの名無しさん (ワッチョイ 463f-ggGG) :2024/01/20(土) 00:57:56.71 ID:QcwVnceA0.net void*の値は作成出来るけど、表現や境界調整要求は未定義とか、おかしいだろ Cは現実に則した言語だと思ってたけど、妙な未定義だな ちなみに、インタープリター型言語を作ったら、オブジェクトはみんなvoid*になる void*の配列を作成したりとか普通に行われる もはや規格とか無意味 実装がどうなってるかだけが重要だ
435 :デフォルトの名無しさん :2024/01/20(土) 10:29:05.14 ID:ZDCHWjSD0.net >>433 全然ややこしくないでしょ
436 :デフォルトの名無しさん :2024/01/20(土) 10:30:19.13 ID:UfD1Ji0o0.net > 実装がどうなってるかだけが重要だ もちろんその通りだけど規格上未定義なわけだから実装がすべて統一されているとは限らないわけで その実装における「限らない」が問題なわけでしょ
437 :デフォルトの名無しさん :2024/01/20(土) 12:47:01.09 ID:Ttk7tIdd0.net 実際に使用する環境に合わせれば良いだけ
438 :デフォルトの名無しさん :2024/01/20(土) 13:33:03.85 ID:QcwVnceA0.net 各OS毎にABI(Application Binary Interface)が定義されてて、Cの規格で定義されてないところが明確に定義されてる 2つを合わせて現実のC言語なんだよな だから、JIS X 3010だけを取り上げてどうこう言っても混乱させるだけ
439 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw) :2024/01/20(土) 14:51:47.73 ID:k6CjZuQW0.net >>434 実際には void* と int* (などのポインタ) が同じ表現なことは多いので あまり問題 (type punning) にならないと考えるならそうかも。 ただ、表現が同じである環境ならかまわないのかというとそうでもない。 aliasing rules が絡んでくる。 言語仕様上で適合するとされる以外の読み書きをプログラマはやらない (やったら未定義だから) という仮定の元に最適化されることがある。 >>438 ABI はその名の通りインターフェイスを一貫させるための規定であって、 外部に公開しない (外部リンケージを持たない) 部分ではコンパイラは最適化するし、オブジェクトを除去することもある。 私は >>422 で「あてにしていい環境ならそうすることは否定しない」と述べたが、 あてになる確証を得るのは割とめんどい。 言語仕様を調べて分かる範囲で済むならそうする。 少なくとも >>392 をインライン関数にするために手間をかけるなんてことはしない。
440 :デフォルトの名無しさん :2024/01/20(土) 14:57:01.22 ID:UfD1Ji0o0.net だから、その環境が不明瞭なこういう場所で問題になるわけでしょ? 実際>>392 では「処理系はANCI C準拠」としか言っていないわけだし
441 :デフォルトの名無しさん :2024/01/20(土) 14:57:54.96 ID:UfD1Ji0o0.net おっと440は>>437-438 アテネ
442 :デフォルトの名無しさん (ワッチョイ 463f-ggGG) :2024/01/20(土) 15:58:08.13 ID:QcwVnceA0.net 未定義とは規格遊びには便利な言葉だなw 正解はconfigureスクリプトがやってるように、事前に環境を調査して前提にしていい事を明確にして最適な実装をする事だな なので、言語仕様のみで判断を下す事は不正解と言える その為にconfigureスクリプトがある 他の言語ではあまり必要ない Rustとか最近の言語は言語仕様に不明瞭な点は残さないのがトレンドだろう じゃなきゃそこが脆弱性を生んでしまう
443 :デフォルトの名無しさん (ワッチョイ 463f-ggGG) :2024/01/20(土) 16:03:47.86 ID:QcwVnceA0.net >>392 のマクロは、副作用のある式を渡したりするとおかしな事が起きる 全くもって脆弱なものだ そのままで良いのか? マクロのままにしておくとか、そっちの方が脆弱性を生む事になる ちゃんと関数化すべきだろ その為にすべき事は何だ? それを議論することが正解と言っている
444 :デフォルトの名無しさん :2024/01/20(土) 16:33:16.28 ID:7OBiWfZx0.net 副作用のある式とは例えば?
445 :デフォルトの名無しさん :2024/01/20(土) 19:48:07.23 ID:31IXtECu0.net p++じゃない?
446 :はちみつ餃子 :2024/01/20(土) 19:54:12.68 ID:k6CjZuQW0.net 関数で書いたら問題を避けられるわけ?
447 :デフォルトの名無しさん (ワッチョイ 0279-5stn) :2024/01/20(土) 21:49:35.15 ID:VgpxxxtV0.net C言語で今更議論することなんてないよ 気に入る要らないはモダン言語とかでやってなさい
448 :デフォルトの名無しさん (ワッチョイ 450a-rpIY) :2024/01/20(土) 22:17:38.62 ID:DXZ/M+lB0.net 使用済みのポインタ変数を変なやり方でクリアするとかクソどうでもいい
449 :デフォルトの名無しさん (ワッチョイ 22ec-HXAs) :2024/01/20(土) 22:21:19.13 ID:7OBiWfZx0.net >>445 それは考えなくていいでしょ
450 :デフォルトの名無しさん (ワッチョイ 463f-ggGG) :2024/01/20(土) 22:34:47.06 ID:QcwVnceA0.net >>446 え?本気でいってんの? 関数で書けば副作用(例えば++p)は1回で済む 当然副作用がある式を書くのはアホだと思うが、少なくとも書いた通りには動く
451 :デフォルトの名無しさん (ワッチョイ 463f-ggGG) :2024/01/20(土) 22:44:54.31 ID:QcwVnceA0.net 例えば、(uint8_t)malloc(...) + sizeof(int)を返す関数もあり得る これは前の方にデータを隠すテクニックだ 実はC++のコンパイラで普通に使われている これを解放する時は、free(p -= sizeof(int))とやらない事もない まぁ普通はp - sizeof(int)だろうから屁理屈だけどねw
452 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-3Dea) :2024/01/21(日) 00:53:03.43 ID:4rk7TZPC0.net >>450 解決したい問題はそれだけでいいのか。 それなら意図はわかる。 ただ現実に C の関数を多相化できないのは変えられない前提としてある。 異なる型で扱う必要があるんだから異なる関数を用意するしかないのはどうしようもなくない?
453 :デフォルトの名無しさん (ワッチョイ e785-6dvo) :2024/01/21(日) 11:37:01.81 ID:yYf7aVwb0.net 多相? 仮にポインタ変数のアドレス を引数で渡したい場合であってもvoid ** じゃなくvoid * を使って、 人間同士がドキュメントだろうが喫煙所だろうがで問題解決しろよってのが規画と整合する答えなんじゃないの どうせキャストするんでしょうに バカですか
454 :はちみつ餃子 :2024/01/21(日) 12:09:29.26 ID:4rk7TZPC0.net void* に変換したなら元の型にキャストしなおさないと保証された動作はほとんどない。 (逆に元の型に変換したときは変換前の値と一致することは保証される。) 元の型を知っているプログラマがキャストすることを期待できる qsort のような使い方なら問題にならないけど、 void* の形で受け取るだけでは関数が出来ることはほとんどない。 文字列を指すポインタに変換してバイト列として読み書きすることはアリなので オブジェクトの内容はどうでもいいメモリブロック操作系の関数 (memmove など) だとかでも問題はないかな。
455 :デフォルトの名無しさん :2024/01/21(日) 12:53:39.98 ID:+eMrRol8M.net 簡単な問題だったんだけど答えられる人ほとんどいないのか 相変わらず本題とは関係ない問答しだすアホらもいるし
456 :デフォルトの名無しさん :2024/01/21(日) 13:01:11.71 ID:fu4eKftF0.net 答えられる人はいるだろうけど、宿題丸投げするやつにエサを与えたくなくて 敢えて書かない人もいるだろう。
457 :デフォルトの名無しさん :2024/01/21(日) 16:35:59.78 ID:ocg3B/5o0.net ANCIとか頭悪そうな学校で相手したくなかった
458 :デフォルトの名無しさん :2024/01/21(日) 16:43:50.02 ID:WaBPg/nL0.net 誰も知らない新規格、か・・・
459 :デフォルトの名無しさん :2024/01/21(日) 16:44:16.43 ID:sYjtPxaw0.net 宿題スレは別にあった様な気がする
460 :デフォルトの名無しさん (ワッチョイ c7df-VcUz) :2024/01/21(日) 20:09:55.64 ID:BpmEGVkv0.net つ https://mevius.5ch.net/test/read.cgi/tech/1434079972/
461 :デフォルトの名無しさん (ワッチョイ 7f2a-Hmn+) :2024/01/21(日) 22:42:42.89 ID:fOwYJqZP0.net UNCI はどうだろう。
462 :デフォルトの名無しさん (ワッチョイ 7fab-JMeY) :2024/01/22(月) 09:16:06.10 ID:wwjNYCJK0.net >>445 free(p++); p++=0; ←ここで文法エラーになるから
463 :デフォルトの名無しさん :2024/01/22(月) 19:23:27.59 ID:sQG6cOu30.net このマクロでそんな心配せんでええやろ
464 :デフォルトの名無しさん (ワッチョイ 7f63-HLt9) :2024/01/22(月) 20:21:33.49 ID:oQuCuzrM0.net Cに引数の参照渡しってあったっけ? ないとしたら>>392 のMYFREE(p)をマクロではなく関数として書き その中でp=0としても呼び出した側の変数は変えられないわけで 関数にすることで動作が変わってしまうことになるはずだけど
465 :デフォルトの名無しさん :2024/01/23(火) 13:25:33.99 ID:DCTvqhlA0.net そんなこんなでp++マクロには問題が多いからC++が出来たってわけ
466 :デフォルトの名無しさん :2024/01/23(火) 14:30:32.20 ID:FpD2d5od0.net なんだそんな理由だったのか・・・
467 :デフォルトの名無しさん :2024/01/23(火) 14:41:04.92 ID:v+doC8dF0.net mallocとcallocの引数の指定の仕方が違うのが気になる これ別であることに理由あるの?
468 :はちみつ餃子 :2024/01/23(火) 15:14:53.60 ID:MIeJSKFF0.net >>467 言語仕様上は calloc が返すポインタ (によって表されるメモリ領域) は malloc が返すものと同じようにあらゆる型に対して適切に境界調整されることになっているし、 ゼロクリアするという違いも「全てのビットがゼロ」という意味なので型の性質を考慮しない。 つまりふたつの引数として指定することによって得られる恩恵はない。 実装がまともなら calloc(a, b) としたときの a*b が size_t の大きさを超えてしまうようなときでも ラップアラウンドして小さな領域を確保するのではなくエラーにしてくれることは期待できる (間違いを検出しやすい) が、それを理由として引数ふたつにしているというわけではなさそう。 最初に言語仕様をまとめたときに主要な処理系がだいたい準拠ということになるようにしたはずなので その頃の処理系でなんか理由はわからんがそうなってたって程度の話だと思う。 あまり意味ない。
469 :デフォルトの名無しさん :2024/01/23(火) 15:47:25.62 ID:v+doC8dF0.net メリット無いなら統一してほしかったよ
470 :デフォルトの名無しさん :2024/01/23(火) 16:35:32.21 ID:FpD2d5od0.net 好きな方を使いましょう
471 :デフォルトの名無しさん (ワッチョイ 5f8c-/eig) :2024/01/24(水) 09:58:59.16 ID:Xnuh8KFs0.net 統一したらゼロクリアするかしないかだけの違いにならん?
472 :デフォルトの名無しさん :2024/01/24(水) 16:48:12.72 ID:zBKRyD/E0.net zmallocというマクロを定義すれば解決
473 :デフォルトの名無しさん :2024/01/25(木) 18:11:36.02 ID:oxF0tkpI0.net callocはmallocのゼロクリア版として *も* 使えるがそもそもの使い方が違う。
474 :デフォルトの名無しさん :2024/01/25(木) 20:28:54.55 ID:DorHRoYW0.net ちなみに C には厳密にいうと価渡し(call by value)しかない 値としてアドレスを渡すので結果として参照渡し(call by reference) ができることになる
475 :デフォルトの名無しさん :2024/01/25(木) 20:55:09.83 ID:FFkj9zH80.net 参照って言うと色々誤解を受けるから Cの場合はアドレス渡しで良いと思う
476 :デフォルトの名無しさん :2024/01/25(木) 21:27:23.28 ID:xC/Yy1/j0.net ヘンな用語作るのやめて ポインタで渡しても値渡しのまま foo(int x) {int y = 0;x = y;} bar(int *p) {int *q = 0;p = q;} 呼び出し元の変数に作用が無いのは同じ 両者は等しく値渡しのまま baz(int *p) {int y = 0;*p = y;} これについては値渡しされたものがポインタ型だったため ポインタ型が持つデリファレンス機能によってポイント先に代入できただけ *** 値として渡し ***て、デリファレンスして、代入しただけ qux(ref int x) {int y = 0;x = y} // ウソ文法 みたいなことして呼び出し元に代入できるものが これのみが参照渡し 参照渡しがある言語ならこんな誤解はしなくてすむ https://www.gnu-pascal.de/gpc/Subroutine-Parameter-List-Declaration.html#Subroutine-Parameter-List-Declaration > procedure DoIt (x: SomeType); > Technical: The actual parameter is passed by value or reference, but if passed by reference, it is then copied to a local copy on the stack. > What it means: you can modify x inside the routine, but your changes will not affect the actual parameter (and vice versa). > procedure DoIt (var x: SomeType); > Technical: The actual parameter is passed by reference. > What it means: modifications to x inside the routine will change the actual parameter passed in. ポインタを含むあらゆる型に対して、値渡し/参照渡しが存在する
477 :はちみつ餃子 :2024/01/25(木) 21:48:36.73 ID:d9W0b5Ok0.net JIS の用語集やそのもとになった ISO 規格によれば call by address の定義はパラメタの場所を渡すこと。 ポインタの形であっても場所を渡しているには違いないからあてはまるし、勝手な創作用語というわけではない。 言語の理屈ではポインタもポインタという型の値だがそれの活用方法に名前が付いて悪いってこともない。 言語仕様の話をしているときに混ざってくると「んっ?」とは思うが。
478 :デフォルトの名無しさん :2024/01/25(木) 23:01:13.98 ID:NizTAU7c0.net ポインタなのに値渡しとか言ってる奴まだいるのかw そういうのはポインタ渡しで良いんだよ アドレスを値渡し→ポインタ渡しでいいんだよ
479 :デフォルトの名無しさん :2024/01/26(金) 00:30:31.26 ID:/aFBudAaa.net >>472 zalloc にしようぜ
480 :デフォルトの名無しさん :2024/01/26(金) 00:35:29.44 ID:xuVVqQKb0.net >>478 >アドレスを値渡し→ポインタ渡しでいいんだよ だよな。
481 :デフォルトの名無しさん (スププ Sd7f-MQtI) :2024/01/26(金) 08:38:30.55 ID:Nbs9AoGZd.net Cの文法規則がいいかげんなんだよ
482 :デフォルトの名無しさん (スプッッ Sdff-ytPG) :2024/01/26(金) 09:12:22.82 ID:f6TAFOdQd.net >>481 >Cの文法規則がいいかげんなんだよ だよな
483 :デフォルトの名無しさん (ササクッテロラ Sp7b-NMAD) :2024/01/26(金) 09:47:41.79 ID:5qejItpup.net アドレスと言う値を渡してるのだからどちらも同じ事だろ
484 :デフォルトの名無しさん :2024/01/26(金) 10:37:55.79 ID:mR+OAnS80.net いい加減なところが好かれる理由
485 :デフォルトの名無しさん :2024/01/26(金) 10:46:46.89 ID:Tqv1qsfwp.net アセンブラまんどくさいから作ったのがC だから型がイイカゲンなのはアセンブラやってる人が対象だから
486 :はちみつ餃子 :2024/01/26(金) 10:52:28.10 ID:6gE8lNl00.net イイカゲンにしてるとコンパイラの最適化を有効にしたときに破綻するぞ
487 :デフォルトの名無しさん :2024/01/26(金) 12:43:22.79 ID:IWVVekFc0.net >>483 構造体は値渡しとアドレスの値渡しがある どっちも値渡しというと訳が分からなくなる なので、構造体は値渡しとポインタ渡しが出来ると言えば便利だ そうすれば、配列は値渡しが出来ないとも言うことが出来る
488 :デフォルトの名無しさん :2024/01/26(金) 13:17:11.83 ID:hEzJutz20.net C++で参照が登場したので「アドレスの値渡し」とか言っている訳で C++を知らんと意味不明だし違和感あるだろうな
489 :デフォルトの名無しさん :2024/01/26(金) 14:03:32.73 ID:OnjHbhExM.net C++がどうのとかは全然関係ないでしょ
490 :はちみつ餃子 :2024/01/26(金) 14:07:19.39 ID:6gE8lNl00.net C++ とは関係ないと私も思う。 仮引数と実引数の関係は (型がポインタかどうかに関係なく) 値の代入であるということになっている。 繰り返すが言語仕様上の理屈では解釈の余地なく全ての引数は値呼びのメカニズムで規定されているよ。 C++ の参照と区別するための言い回しではなく仕様上の理屈通りに言えばそうなるってだけ。
491 :デフォルトの名無しさん :2024/01/26(金) 14:12:08.41 ID:u8n9O9U10.net それで結局 &var の値はポインタなの?アドレスなの? どっちでもいいんだよね?
492 :はちみつ餃子 :2024/01/26(金) 14:57:45.80 ID:6gE8lNl00.net 「アドレス」と「ポインタ」の使い分けはイマイチわからないんだよなー。どっちでもいいと思う。 単項演算子の & にはアドレス演算子という名前がついていてアドレスを返すとも書いてあるのでこれについてはアドレスと言っていいのは間違いない。 ポインタは型の種類のように使われてることもあるし、ポインタ型の値のことを指しているように見える箇所もある。 個人的感想としてはアドレスのほうが低レイヤ寄りの概念でポインタは型で意味付けしているような雰囲気を感じてるんだけどあまりはっきりしない。
493 :デフォルトの名無しさん (ササクッテロラ Sp7b-NMAD) :2024/01/26(金) 16:28:15.83 ID:TUEfKZ6Qp.net 参照渡しと実体渡しかw あれも、アドレス渡しとコピー渡しって言えばいいのにね
494 :デフォルトの名無しさん :2024/01/26(金) 16:55:28.58 ID:VvnpRsjB0.net アドレスは、数値が主体でそれが何を示しているかの説明の為の単語。 ポインタは変数の一つで *p や p->a 等の動作も含めての設計思想。 などと意味不明な(ry
495 :デフォルトの名無しさん :2024/01/26(金) 17:26:29.97 ID:CEoHa9Fg0.net アドレスは値 ポインタは型だよ 正確にはintのポインタ型とか言うけど
496 :デフォルトの名無しさん :2024/01/26(金) 17:35:02.08 ID:WoOISbdM0.net ポインタはポインタ値を格納する場所
497 :デフォルトの名無しさん :2024/01/26(金) 17:36:54.25 ID:CEoHa9Fg0.net 場所と言うのは曖昧な表現だな
498 :デフォルトの名無しさん (ワントンキン MM4f-NhvB) :2024/01/26(金) 18:03:51.31 ID:Vqpo1a/ZM.net アドレスは値で右辺値、ポインタは変数でオブジェクトで左辺値 こんな基本的なこと、頼むよ
499 :デフォルトの名無しさん :2024/01/26(金) 18:27:39.65 ID:GfgH9lD40.net >>498 正しくない。ポインタ型の変数 int* p に対して p + 1 もポインタだけど、変数でも左辺値でもない。
500 :デフォルトの名無しさん :2024/01/26(金) 18:29:01.58 ID:WoOISbdM0.net ある時はメモリーのサラリーマン、ある時はレジスターの探偵
501 :デフォルトの名無しさん :2024/01/26(金) 19:46:30.13 ID:XBTJ48xK0.net 規格上はどうなってるか知らんが ポインタでいいじゃん統一しろよ 変数へのポインタを取る時アドレスと言いたくなるんやろな 分からんでもないが使い分ける必要はないと思う アドレスといいつつ結局ポインタでしかないやろ? 場所だけじゃなくて型のサイズも持ってるでしょ? アドレスと聞くと番地だけってイメージだけど ポインタっつうのはそれに加えてサイズも持ってるのがミソ だから不必要にアドレスと言い直す必要はない だって実際にポインタしか扱わないんだから
502 :デフォルトの名無しさん :2024/01/26(金) 20:04:10.51 ID:Su75gAlu0.net アドレスっていう言葉は規格には出てこないと予想してた。 規格にはポインタだけあればよくて、アドレスは実装の仕方のイメージがある。アドレスは多くの場合整数になるが、文字や文字列でもいいというような。
503 :デフォルトの名無しさん (ササクッテロラ Sp7b-NMAD) :2024/01/26(金) 20:45:56.85 ID:wwCmUZ7Wp.net アドレスってアセンブラ屋さんが言う奴?
504 :デフォルトの名無しさん (ワッチョイ 5f36-zwhO) :2024/01/26(金) 21:05:55.41 ID:pu3OCH3K0.net バイナリーエディタやメモリエディタでも言うよな。
505 :デフォルトの名無しさん (ササクッテロラ Sp7b-NMAD) :2024/01/26(金) 21:07:17.18 ID:coh7wFVpp.net バイナリエディタのはアドレス違うよなぁ メモリーエディタはアドレスだからいいけど
506 :デフォルトの名無しさん :2024/01/26(金) 21:11:38.94 ID:Vqpo1a/ZM.net >>499 p+1はアドレスだよ
507 :デフォルトの名無しさん (ササクッテロラ Sp7b-NMAD) :2024/01/26(金) 22:21:03.31 ID:PDBFw7tbp.net ポインターだろ
508 :デフォルトの名無しさん (ワッチョイ e730-qZe7) :2024/01/26(金) 22:21:36.46 ID:XBTJ48xK0.net int a[4] = {0}, (*b)[4] = &a, *c = &a[0]; printf("%p %p\n", b, b + 1); printf("%p %p\n", c, c + 1); 0x7ffc2026d710 0x7ffc2026d720 0x7ffc2026d710 0x7ffc2026d714 アドレスと捉えると同じ番地だけど +1の結果が違う番地になるのは ポインタが大きさを知っているから これが単なる整数とは違うところ
509 :デフォルトの名無しさん (ササクッテロラ Sp7b-NMAD) :2024/01/26(金) 22:22:12.95 ID:8+XG8rAlp.net アドレスと言えるのは直接ハードウェアにアクセスするものだけだよな
510 :デフォルトの名無しさん (ワッチョイ e7bb-iTDz) :2024/01/26(金) 22:29:00.75 ID:kxxVAnT60.net 規格書の加減算のとこにはp + 1の結果が何になるか書いてある?
511 :デフォルトの名無しさん (ササクッテロラ Sp7b-NMAD) :2024/01/26(金) 22:36:52.96 ID:tuyRrB6Ip.net p+1の結果は、pの型によって違うやろ
512 :デフォルトの名無しさん (ワッチョイ e7bb-iTDz) :2024/01/26(金) 22:48:45.51 ID:kxxVAnT60.net 規格ちょっと読んだけど加減算のところには結果がアドレスになるかポインタになるか書いてなくね?
513 :デフォルトの名無しさん (ワッチョイ df20-NMAD) :2024/01/26(金) 22:49:56.05 ID:4G76jppe0.net >>512 アドレスはポインタのエイリアスだろ?
514 :デフォルトの名無しさん (ワッチョイ 5f10-iTDz) :2024/01/27(土) 00:39:52.91 ID:RxNi/RLS0.net だから、アドレスは値で、ポインタは型なんだ p + 1はpの型によって結果が決まる intかintのポインタ型かで結果が変わる
515 :デフォルトの名無しさん (ワッチョイ 5f7c-ytPG) :2024/01/27(土) 00:55:04.46 ID:3j95TwYq0.net >>514 >だから、アドレスは値で、ポインタは型なんだ >p + 1はpの型によって結果が決まる >intかintのポインタ型かで結果が変わる だよな
516 :デフォルトの名無しさん (ワッチョイ e7bb-iTDz) :2024/01/27(土) 01:15:46.64 ID:lTO1GYgs0.net >>514 規格読み直したら加算の結果はポインタになるって書いてあったわ
517 :デフォルトの名無しさん (ワッチョイ 5f7c-ytPG) :2024/01/27(土) 10:42:42.11 ID:3j95TwYq0.net >>516 何章?
518 :デフォルトの名無しさん (ワッチョイ 4710-zwhO) :2024/01/27(土) 14:54:07.21 ID:IaaZCBNA0.net (int)(p+1)-(int )(p) == sizeof (*p) だっけ?
519 :デフォルトの名無しさん (スプッッ Sdff-ytPG) :2024/01/27(土) 15:00:52.15 ID:Go/zq51jd.net >>518 intは32bitのLP64環境ではどうなるんだい?
520 :デフォルトの名無しさん (ワッチョイ 4710-zwhO) :2024/01/27(土) 15:08:44.06 ID:IaaZCBNA0.net コンパイルエラーか警告でて下位32bitのみ取得じゃね? sizeof (*p)がint_max超える設定でもなけりゃ目的は果たせそうだけど。
521 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-G0Zh) :2024/01/27(土) 16:02:39.58 ID:TmJLT/yO0.net ポインタは整数に型変換できるけどその値がどうなるかは処理系定義。 変換結果がその整数型で表現できなかったときは未定義。 gcc や clang だとポインタをより小さい整数型に変換しようとしたらエラーになった。 intptr_t や uintptr_t に限っては正しい void* はこれらの整数に変換可能、かつ void* に再び変換したら元の値と等しいことが保証される。 オブジェクトを指すポインタは void* に変換可能なので オブジェクトを指すポインタは intptr_t や uintptr_t に (情報の欠落なく、可逆な形で) 変換できる。 しかしポインタが整数でどのような表現を持つかは規定されていないし、 intptr_t や uintptr_t は提供されないこともありうる。 オブジェクトを指すポインタは文字型を指すポインタに型変換してバイト列としてアクセスできることは保証されているので オブジェクトの大きさを知るためにポインタ操作をするのであれば ↓ のような形にするのはアリなはず。 #include <assert.h> int main(void) { int obj; int *p=&obj; assert((char*)(p+1)-(char*)(p) == sizeof(*p)); }
522 :デフォルトの名無しさん (スッップ Sd7f-hxDZ) :2024/01/27(土) 17:07:11.96 ID:JGqkehCyd.net はちみつの説明はちっとも頭に入ってこん 3行にまとめてから貼れ
523 :デフォルトの名無しさん :2024/01/27(土) 17:46:47.32 ID:gXnDqsx80.net >>518 つまりこのコードはダメってこったね
524 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 478b-3Dea) :2024/01/27(土) 18:21:39.29 ID:ubKEU+Fr0.net >>522 関連する規則は関連する規則の数より減ることはない。 根拠不明でいいなら削るけどそんな説明を見たいのか?
525 :デフォルトの名無しさん (ワッチョイ e763-amFq) :2024/01/27(土) 18:27:31.62 ID:8jAlHp2M0.net 3行しか文章解読できないなら、コード書くのは辛いだろう
526 :デフォルトの名無しさん (ワッチョイ e7bb-iTDz) :2024/01/27(土) 18:41:16.06 ID:lTO1GYgs0.net >>517 「加算」でページ内検索すればすぐ見つかる
527 :デフォルトの名無しさん (ワッチョイ 6f5f-YGpO) :2024/02/22(木) 19:08:43.26 ID:rfW+Fz5e0.net errno ってどうしてスレッドごとに別々につかえるの?
528 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7332-tW/T) :2024/02/22(木) 19:34:35.22 ID:o0M/RgFs0.net >>527 「どうして」というのはそういう仕様になっている理由? それともそれを実現している方法のこと?
529 :デフォルトの名無しさん (ワッチョイ 6f5f-YGpO) :2024/02/22(木) 19:51:00.46 ID:rfW+Fz5e0.net >>528 方法のほうですね __thread ?とかってgcc固有?って聞いたけど gcc以外とか大昔とかどうやってんのかなーって
530 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7332-tW/T) :2024/02/22(木) 20:08:19.54 ID:o0M/RgFs0.net >>529 errno は型 int を持つ変更可能な左辺値に展開されるならマクロで定義されてもよいことになっている。 昔の C には記憶域期間の分類にスレッドは無かったが #define errno *__foo() みたいな感じで定義しておいて、 この関数がスレッドごとに適切な場所を返すように作っておけば辻褄は合う。
531 :デフォルトの名無しさん :2024/02/22(木) 21:32:39.53 ID:rfW+Fz5e0.net >>530 これでerrnoの初期化とかできるのか? なるほどできるのか。よくできてるね
532 :デフォルトの名無しさん :2024/02/22(木) 22:17:46.64 ID:3b0UfxEB0.net 結局、スレッド処理がいい具合にリンクしてくれてるって事だね
533 :デフォルトの名無しさん :2024/02/23(金) 15:59:36.95 ID:HdyUmXx/0.net >>529 別にTLSの文法がなくてもコンパイラにTLS相当の非公開機能があれば実現可能。
534 :デフォルトの名無しさん :2024/02/24(土) 16:12:18.49 ID:+4BfNMQz0.net TLSと言えばゲームの方やね バタ語を略したスレッドローカルストレージではないんや このスレの世代的にも半数以上がそう思って口に言わずとも突っ込んだ経験があるはずや
535 :デフォルトの名無しさん (ワッチョイ bfbd-X6hX) :2024/02/24(土) 16:17:18.15 ID:dGxq80rr0.net ゲーム? バタ語? 何を言ってるのか分からない。
536 :はちみつ餃子 :2024/02/24(土) 16:54:19.76 ID:felFEjYK0.net 「TLS ゲーム」でググったらトゥルー・ラブストーリーが出てきた。 タイトルは聞いたことがあるけどやったことないし、 TLS なんて略称にはなじみがないわ。 Transport Layer Security と被っとるやないけというツッコミはしたくなったことはあるが。 バタ語ってなんや?
537 :デフォルトの名無しさん (アウアウウー Sae7-LYxY) :2024/02/24(土) 23:04:08.46 ID:a3fFW9uua.net ここの人は並列計算についても答えるの? それともスレ違い?
538 :デフォルトの名無しさん (アウアウウー Sae7-LYxY) :2024/02/24(土) 23:05:48.99 ID:a3fFW9uua.net スレ違いなら何処が適してるの?
539 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f32-a3My) :2024/02/25(日) 01:01:43.21 ID:m/LZ7YZH0.net >>537 一応は C の名前を冠したスレだからその質問が言語仕様に関わる質問ならこのスレでいい。 C を使ったロジックの組み立てかたみたいなのもある程度は許容されると思う。 環境に固有の事情が絡むならそれぞれのスレのほうがいいこともある。 Win32api スレとか Unix スレとか。
540 :名無し兎と鰻の大乱闘 :2024/02/25(日) 23:17:51.95 ID:3BSAc3tW0.net しーげんごってなに?
541 :デフォルトの名無しさん :2024/02/26(月) 00:50:15.88 ID:mDObVK5g0.net tlsって毎回アクセスする度に初期化済みかどうかチェックされるんか? もしそうなら未初期化上等のc言語では特殊だな
542 :デフォルトの名無しさん :2024/02/26(月) 17:12:35.82 ID:hotfpUjh0.net 【AI】Stable Diffusion 3発表、Soraで話題の拡散トランスフォーマーを採用 [すらいむ★] http://egg.5ch.net/test/read.cgi/scienceplus/1708865670/l50 ボイス・トォ・スカるしている者も攻撃を受けるようになりました
543 :デフォルトの名無しさん (ワッチョイ 9e6d-EVRh) :2024/02/26(月) 19:38:00.95 ID:7RO6bLyL0.net こんな Web ページを作りました。ぜひどうぞ。 http://www7b.biglobe.ne.jp/~river_r/chs/
544 :デフォルトの名無しさん (ワッチョイ b301-43ji) :2024/02/27(火) 13:07:12.38 ID:gZVWnZ6O0.net アクセスしないほうがいいよ
545 :デフォルトの名無しさん (ワッチョイ 0a97-46dB) :2024/02/27(火) 13:33:45.24 ID:pm1A4e3U0.net 理由は?
546 :デフォルトの名無しさん (ワッチョイ 9eb5-EVRh) :2024/02/27(火) 17:32:18.89 ID:xGsMPO790.net >>543 ごめんなさい。言葉足らずでした。 「数値計算結果の画像化など」 という Web ページを作りました。 プログラミング、数値計算、カオス、画像作成と表示 などに興味がある方は、ぜひどうぞ。 http://www7b.biglobe.ne.jp/~river_r/chs/
547 :デフォルトの名無しさん (ワッチョイ 6763-9+AH) :2024/02/27(火) 17:46:48.10 ID:0/infknm0.net 空白のBMPなんて簡単に作れると思うよ 起動したときに自分で作ったら良いと思った
548 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f32-a3My) :2024/02/27(火) 18:03:33.97 ID:NfALWDmT0.net >>546 ここは C スレなんだから C で書いたほうが親切じゃないかな。 まあ実質的にはほとんど C みたいな書き方だけども……
549 :デフォルトの名無しさん :2024/02/29(木) 11:21:59.57 ID:lAXCV22P0.net >>0548 >546 です。C++ に特有な機能は、 全くと言っていいほど、使っていませんよ。 pow(x, y) というのは目新しいけど。
550 :デフォルトの名無しさん :2024/02/29(木) 11:51:17.73 ID:wasjN/NH0.net 30年前で時間が止まってんなこいつ
551 :デフォルトの名無しさん :2024/02/29(木) 13:30:21.68 ID:tTOuwN9N0.net 拡張子を.cにしてビルドしてみる
552 :はちみつ餃子 :2024/02/29(木) 14:03:45.25 ID:w6pA3tyf0.net >>549 C++ の機能をほとんど使ってないことはわかってるしそう言ってるじゃないの。 使わないのに C++ の形式をとって C スレに投下するのはちょっと不親切かもねという話をしてるんだよ。 pow (べき乗関数の総称版) は C にもあるし、 C の仕様に入ったのは C99 から。 それを知らなくて (しかし使いたくて?) C++ にしたという意味なのかな?
553 :デフォルトの名無しさん :2024/02/29(木) 15:54:08.56 ID:a+kbfZOT0.net pow()なんてx^y(yが変数)したい時だけでいい pow(x,2), pow(x,0.5)は、(x*x), sqrt(x)と書いた方がいい …まさか今時のコンパイラはこれも最適化したりする?
554 :デフォルトの名無しさん :2024/02/29(木) 16:10:58.46 ID:wvTonBo10.net しらんけど、今どきだと最適化されるかもしれんね 1+2+・・・+99+100 こんな計算も(1+100)x 50で最適化される記事が昔あったような
555 :デフォルトの名無しさん :2024/02/29(木) 16:38:23.25 ID:z2rRJOdi0.net こんな計算って、そのレベルでコンパイラ任せにしてるのか
556 :デフォルトの名無しさん :2024/02/29(木) 17:09:00.84 ID:QhPTi9Tjp.net >>554 知らんけど、今は定数は先に計算しちゃうから、その式は1発答えだけになるような
557 :デフォルトの名無しさん :2024/02/29(木) 17:09:33.30 ID:zz2EilBV0.net > 1+2+・・・+99+100 最適化というか、畳み込みで 5050に置き換えられるかと
558 :デフォルトの名無しさん :2024/02/29(木) 18:55:44.88 ID:wvTonBo10.net 例が悪かった、もちろん定数は一発計算してメモリに固定されるけど、 変数を含んでても、冗長計算を変形してくれるコンパイラが出て、gccもそのアルゴリズムを採用したことが昔あったような。
559 :はちみつ餃子 :2024/02/29(木) 19:13:29.86 ID:eV7kgdtT0.net 数値計算関連の関数はコンパイラによる最適化がなくても関数の内部が複雑な場合分けで対処してることが多いと思う。 GNU のやつとかだいぶんごちゃごちゃしてる。
560 :デフォルトの名無しさん :2024/02/29(木) 19:19:48.52 ID:z2rRJOdi0.net 人間が思いも付かなかったアルゴリズムで解いて見せたりして 人間が解析しても何故正しいかが分からなくなる
561 :デフォルトの名無しさん (ワッチョイ 4aae-8VSo) :2024/03/01(金) 02:42:07.06 ID:4OWvqJMX0.net floatが絡むと誤差の出方が変わって結果が変わるから、式を変形するような最適化は不要だ 変形しても良いよというのが-ffast-mathだな
562 :デフォルトの名無しさん :2024/03/07(木) 00:36:21.20 ID:D7Ff69360.net typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t sighandler); signal関数の第1引数のシグナル番号(signum)と第2引数のハンドラ関数が実際に呼ばれたときに引数に入るシグナル番号(1行目の引数のint)は必ず一致する認識ですがあっていますか? その場合はハンドラ関数では引数に入るシグナル番号は最初から分かっているはずですが、わざわざ引数にシグナル番号を取っている理由はなんでしょうか。シグナル番号によって処理を分岐するデカいハンドラ関数を作るくらいしか思いつきませんでした。
563 :デフォルトの名無しさん (ワッチョイ 9f79-rZWy) :2024/03/07(木) 01:20:52.75 ID:yhOhiWWp0.net 時間の無駄だからsignalのことは忘れなさい 時代遅れのCランタイムで本当に役立つものはごく少数しかない そんな化石はスルーしてOSに用意された目的に合うAPIを直接使いなさい Cランタイムのソースコードがある処理系なら読んでみると良い
564 :デフォルトの名無しさん :2024/03/07(木) 04:56:12.94 ID:3rDFlX/H0.net signalの代替は無理だろ ランタイム自作しろとか言うのか? sigalrm使うなぐらいならわかるが
565 :デフォルトの名無しさん (ササクッテロロ Sp4f-/BY0) :2024/03/07(木) 10:24:21.94 ID:m0jtu/KQp.net OS機能呼び出すとか移植性無視かw
566 :デフォルトの名無しさん (ワッチョイ efe7-Y1S9) :2024/03/07(木) 10:26:04.98 ID:u0AQ7cvO0.net >>565 今は環境に合わせて移植するのではなく、環境を移植するのが主流だよ
567 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3b32-FATS) :2024/03/07(木) 10:26:06.80 ID:Qh7cJyBm0.net >>562 > 必ず一致する認識ですがあっていますか? 正しい。 > わざわざ引数にシグナル番号を取っている理由 Rationale に書かれていないのではっきりしたことはわからない。 おそらく Unix でそうなってたのを追認しただけだと思う。
568 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3b32-FATS) :2024/03/07(木) 10:29:39.62 ID:Qh7cJyBm0.net >>565 シグナルまわりはどうせほとんど移植性はない。 言語仕様の範囲内だけで可能なものなら不必要に移植性を損なう必要もないけど大抵の場合に無理だと思う。
569 :デフォルトの名無しさん (スップ Sdbf-iW2Q) :2024/03/07(木) 12:06:04.83 ID:HvQLfDgAd.net 構造体やポインターを理解できたら、C言語をマスターしたと言えますか?
570 :はちみつ餃子 :2024/03/07(木) 12:44:05.75 ID:Qh7cJyBm0.net >>569 練習用の題材ではなく (自分なりに) 意味があるプログラムを書けたあたりが 一応のマスター (あくまで最低限の出発点だが!) だろうと個人的には思ってる。 プログラミング言語は道具なんだから道具として使えることが重要で、 言語の要素を何個理解したなんてのはたいした指標にならない。
571 :デフォルトの名無しさん :2024/03/07(木) 13:28:05.42 ID:GWVV9gt00.net 1000行程度のプログラムがすらすら一日で書けたら卒業
572 :デフォルトの名無しさん :2024/03/07(木) 14:06:12.94 ID:4AOndewA0.net 三行半で済む処理をダラダラ1万行ぐらいに増やすのは、得意なんだけどなあ。
573 :デフォルトの名無しさん :2024/03/07(木) 15:29:11.48 ID:MNNvXb/X0.net それはそれで才能
574 :デフォルトの名無しさん (ワッチョイ 1f5c-0W2u) :2024/03/07(木) 15:56:22.94 ID:tpHaFcPx0.net >>562 番号を渡す理由はその方が柔軟性があるから 柔軟性の中には>>562 で挙げてる理由も含まれる なおsignal()は時代遅れなのでsignal.hにある別の関数を使うこと
575 :デフォルトの名無しさん :2024/03/07(木) 20:44:25.94 ID:yfQHOJuW0.net >>564 signal()なんて使わず、せめてsigaction()にしろということでは?
576 :デフォルトの名無しさん :2024/03/08(金) 18:40:01.38 ID:6aUIMz1F0.net >>562 デカいハンドラ関数を作る意図はなくても 同じようで異なる処理(複数のsigal番号の処理をする場合とか)をする時に 入口は一つにしておいて入力パラメータで処理を振り分けるとか普通の設計だと思うが。 わかりやすい例がWIN32APIのWindowProc。 あれがメッセージ番号毎に関数エントリを登録する形式だったら煩雑なことこの上ないだろ。
577 :デフォルトの名無しさん :2024/03/08(金) 18:58:33.73 ID:iEWrXUyW0.net Windowってそんなsignalの使い方しないでしょう
578 :はちみつ餃子 :2024/03/08(金) 19:33:39.28 ID:KTmiotGH0.net >>577 そういう話じゃないから文脈を掴んで。
579 :デフォルトの名無しさん (スップ Sd02-R4O2) :2024/03/10(日) 23:22:14.50 ID:CPrZIOdkd.net >>570 >>571 ありがとうございます とりあえず何か作ってみます
580 :デフォルトの名無しさん :2024/03/11(月) 20:07:11.13 ID:comBc+xk0.net もうC言語は一旦終わりでいいから別の事やりなよ 結局Cだけの知識じゃ何もできんのよ Cの知識はいざ何か作ろうとなった時に活きてくるよ
581 :デフォルトの名無しさん :2024/03/11(月) 21:49:00.76 ID:QCWizl2S0.net プログラマ目指して挫折する人は、別に作りたいものがなくて文法ばかりを勉強するタイプかも。 文法は大事だけど、それ自体はあんまり役に立たないし調べれば済むことに時間をかけるのは程々に 合理的なアルゴリズムを瞬時に思いついて言語に落とし込めるかが大事で、これは経験。
582 :はちみつ餃子 :2024/03/11(月) 22:16:42.73 ID:lga6QF6v0.net 質問サイトとかで「どうすればいいですか?」みたいなのはちょくちょくあるけど「どうなればいいの?」と返したらまともにこたえられないのもよくある。 問題の解法を構築してプログラムの形に落とし込むのが大事だというのはそりゃそうなんだけど、大前提として解決すべき問題が何であるかを認識 (発見) しなきゃならなくて、そこんところで躓いてたら助けるのも難しい。
583 :デフォルトの名無しさん :2024/03/11(月) 23:43:57.21 ID:a8lYnTon0.net >>582 相手はその質問で問題提起してるんだろ、なのにお前からは、どうなればいいのって " 解答" を質問者に聞いてたら、そりゃ質問者だって混乱するだろよ。 問題把握以前にお前は国語からやり直すべき。
584 :はちみつ餃子 :2024/03/12(火) 00:26:36.89 ID:WtXn1sYk0.net >>583 目指すべき形がわからないのにどうすればいいかなんて答えようがないんだから訊くのはあたりまえじゃないの。 (ちなみに質問が不明瞭な場合などのために回答とは別にコメントを付ける機能が stackoverflow や teratail にはある)
585 :デフォルトの名無しさん :2024/03/12(火) 00:40:50.82 ID:JJnRauRa0.net 分からないのに答えると言うのもどうかと思う
586 :はちみつ餃子 :2024/03/12(火) 00:51:20.24 ID:WtXn1sYk0.net >>585 答えてない。
587 :デフォルトの名無しさん :2024/03/12(火) 00:54:27.51 ID:JJnRauRa0.net 相手にしているならば答えてるのと同じ
588 :デフォルトの名無しさん :2024/03/12(火) 04:56:46.76 ID:T3Ovkjsr0.net そして放置される と
589 :デフォルトの名無しさん :2024/03/12(火) 18:16:58.66 ID:TtsgUSZ70.net てすと
590 :デフォルトの名無しさん :2024/03/12(火) 18:17:16.76 ID:TtsgUSZ70.net てすと
591 :デフォルトの名無しさん :2024/03/13(水) 04:27:54.00 ID:fKc7/92tH.net Pythonから来たんですけど C言語では関数だけじゃなくifやforのブロック内部もローカルスコープって聞いて驚愕してます ループが終わった後のカウンター変数を後続処理で気軽に利用できないって困りませんか
592 :デフォルトの名無しさん :2024/03/13(水) 04:37:16.09 ID:VFn3B3DS0.net そうしたいときはスコープの外で宣言すれば値は保持されるので int i; for (i=0 ; i<10 ; i++) { }
593 :デフォルトの名無しさん :2024/03/13(水) 04:49:50.63 ID:fKc7/92tH.net >>592 マジっすか ChatGPTに聞いたら、そのやり方だと外のiと中のiはスコープが別って言われて混乱しとります --- 一方で、ループの外で事前に同名の変数が宣言されている場合、 forループの仮引数として宣言された変数と同名の変数は別のものとして扱われます。 この場合、forループの仮引数として宣言された変数がローカル変数として扱われ、ループの外で宣言された変数がグローバル変数として扱われます。 これは、C言語において名前の衝突を回避するための仕組みです。
594 :デフォルトの名無しさん :2024/03/13(水) 05:14:50.31 ID:7oOr7TQ5M.net ChatGPTあってもバカはバカのままってのがよくわかる
595 :デフォルトの名無しさん :2024/03/13(水) 07:16:46.92 ID:3+r/Br8X0.net >>593 int i; for (int i=0 ; i<10 ; i++) {...} と書くとそうなる 宣言すると新しい変数ができる ChatGPTって、機械が自然な応答をすることが目的で、辞書のように使うものではないんじゃないの? ChatGPTは得た情報がどの程度正しそうなのか重みづけできないんじゃないかな
596 :デフォルトの名無しさん :2024/03/13(水) 07:39:30.72 ID:DwruCvgD0.net やさしい
597 :デフォルトの名無しさん :2024/03/13(水) 08:06:43.61 ID:fKc7/92tH.net >>595 ありがとう AIの回答をよく見返したらfor(int i = 0...の解説だった サンプルコードを示してくれるのはいいけど、自分のような丸々素人だとその意図を理解できないでこういう誤解が生まれる余地はあるね 先生が優秀過ぎて学生がついていけない構図だわこれ
598 :デフォルトの名無しさん :2024/03/13(水) 08:35:23.86 ID:etRxrqP30.net ChatGPTを先生にする発想が間違い
599 :はちみつ餃子 :2024/03/13(水) 08:49:20.23 ID:ZL+6IClb0.net >>597 昔の C++ だとその書き方でも i のスコープは for 文の外側のブロックがスコープになる仕様だった。 (ISO で規格化される前のやつ。) その頃の C の仕様ではそもそもそこで変数の宣言を出来なかったが処理系の拡張として C++ 風のやりかたをできるようにしているものもあった。 後に C++ の仕様は変更されて、 C には C++ の変更後のやり方で導入されることになったんだが、しばらくはスコープの仕様に混乱があった。 数十年前の一時期の混乱に過ぎないからそれ自体は今では気にする必要はないんだけど言語仕様は変更されることもあるし、色々と歴史的事情もある。 古い仕様を根拠にした解説もあるから AI が区別せずに学習したら辻褄の合わないことも起こると思う。 まあ人間が書いた解説も変なのは少なからずあるから AI を批判するわけじゃないけど……まあ一番最初くらいは入門書を読んだほうがいいんじゃないかと個人的には思ってる。
600 :デフォルトの名無しさん (ワッチョイ f260-3wDj) :2024/03/13(水) 09:06:40.92 ID:hNY0+4ik0.net カウンター変数を気軽に使うのが間違い そういう時は何かが間違ってると思った方が良い 俺がGPTならそう回答するw
601 :デフォルトの名無しさん (ワッチョイ 82ad-g1JC) :2024/03/13(水) 09:49:08.95 ID:LIF5w4hC0.net ちょっと何言っているのか分からない
602 :デフォルトの名無しさん (ワッチョイ 692a-fdoY) :2024/03/13(水) 09:57:47.91 ID:X1fgAQyG0.net 気が重い中で使うのが正しい。獅子咆哮弾だね。
603 :デフォルトの名無しさん :2024/03/13(水) 10:34:26.85 ID:u8+Aa1acd.net >>597 ChatGPTは嘘言うので使うのやめたわ。 どこかの大学の調査で学生だか生徒だかが、ChatGPTの嘘情報で間違ったまま覚えてる弊害が出始めてるとか言ってたわ。
604 :デフォルトの名無しさん :2024/03/13(水) 10:46:18.64 ID:JwtpXuCEp.net あれは創作小説を生成する装置なのに なんで実用性あるんだと思うんだろ?
605 :デフォルトの名無しさん :2024/03/13(水) 10:57:53.06 ID:etRxrqP30.net 実用性はあるけどな 使い方の問題 現役でいたかったらgithub copilotぐらいさわっとけ
606 :デフォルトの名無しさん :2024/03/13(水) 11:09:39.04 ID:hk9QG/kC0.net >>603 自転車だってパンクするかも知れん ChatGPTも嘘言うことあるかも知れん わきまえて使えばどちらも強力なツールだ 自転車で転んだからって乗るのをやめるかい?
607 :デフォルトの名無しさん (ワッチョイ 8563-lhhw) :2024/03/13(水) 11:43:22.70 ID:WwA56xS10.net 嘘って言うのは人間が評価した上での話 ChatGPTに取っては与えらた入力データから もっともらしいものを出力しただけ ChatGPTに嘘をつかせるってのは、難しい 仮に知性というものが芽生えて、自意識が発生し そのことを人間に隠さないといけないと判断して そうするなら、それは初めて嘘をついたとなる
608 :デフォルトの名無しさん :2024/03/13(水) 11:51:20.55 ID:8jq/IdEqM.net 嘘であることと嘘をつこうと思ったかどうかは別だろ
609 :デフォルトの名無しさん :2024/03/13(水) 11:51:45.77 ID:LIF5w4hC0.net >>604 創作小説を生成することが「実用」ではないと? 君にとっての実用性とは何なのかね?
610 :デフォルトの名無しさん :2024/03/13(水) 12:01:22.65 ID:WwA56xS10.net 「この電卓は嘘つきだ!」
611 :はちみつ餃子 :2024/03/13(水) 12:20:13.23 ID:y7g8qbWf0.net ChatGPT の言語能力は高いがプログラミング教育を受けてるわけじゃないからなぁ。 頭のよい素人がググりながら要約したくらいの正確さだと思う。 根拠になる仕様の項目を問うたときにまるでデタラメを返したりするのはかなりあかんとこ。
612 :デフォルトの名無しさん :2024/03/13(水) 13:20:48.95 ID:I6g3m+gC0.net >>609 マ板で愚問w
613 :デフォルトの名無しさん :2024/03/13(水) 13:40:02.23 ID:hNY0+4ik0.net >>610 Windowsの電卓で嘘をつくバグが有ったなw
614 :デフォルトの名無しさん (ワッチョイ f260-3wDj) :2024/03/13(水) 13:53:23.57 ID:hNY0+4ik0.net >>601 ループ変数を後から参照する状況は、ループがbreakで中断したかを確認したい時だろう そういうのは別の関数に切り分けて、ループ内でbreakじゃなくreturn trueで返すようにすべきだな(関数の最後はreturn false) C++で言うstd::any_ofみたいな事が出来ないから、関数に切り分けるしかない
615 :デフォルトの名無しさん :2024/03/13(水) 15:56:31.82 ID:etRxrqP30.net 小さい関数ならちまちま切り出さなくていい 読みにくいだけ
616 :デフォルトの名無しさん :2024/03/17(日) 16:04:44.01 ID:k+jArioy0.net 最短経路問題で perl5 で書いたのがOut of memory! こんな時はC言語などで書き直すのが選択肢だけど みんなはいきなりC言語などで書きますか? それとも、最初は書きやすい言語で処理速度以外の所を決めてからC言語などで書きますか?
617 :デフォルトの名無しさん :2024/03/17(日) 16:19:49.43 ID:JxbO9kgq0.net perlの実装があるならそれを使って色々検討するんじゃないか
618 :デフォルトの名無しさん (ワッチョイ 8163-IOXH) :2024/03/17(日) 16:32:03.14 ID:WugnipTo0.net perl5って64ビット版もあるでしょう?
619 :デフォルトの名無しさん (ワッチョイ 292a-B9kV) :2024/03/17(日) 16:47:02.59 ID:8QBAFOMi0.net ここの人たちなら習わぬ Perlで下書きするより勝手知ったる Cで書くんじゃないの。 Perl開発上の問題はPerlスレで訊ねた方が、実情に即したレスが反りそう。
620 :デフォルトの名無しさん (ワッチョイ 8163-IOXH) :2024/03/17(日) 16:50:04.16 ID:WugnipTo0.net 問題文と、組み立てたであろうアルゴリズム聞かないと、何とも言えない
621 :デフォルトの名無しさん (ワッチョイ 8163-IOXH) :2024/03/17(日) 19:48:46.79 ID:WugnipTo0.net Perlスレ見てみたが、相談できそうな所が無かった 回答あるか分からないが、お題スレに問題文投げて解いてもらう いろんな言語に精通している猛者が多い(Perl達人もいたはず) PerlではなくC言語でと言うなら、ここで相談できるかもしれない
622 :デフォルトの名無しさん :2024/03/18(月) 10:33:19.79 ID:0IkoPQje0.net 最短経路・グラフ理論・ダイクストラとか? アルゴリズム系は、Python でしょ。Ruby も 有名な蟻本「プログラミング・コンテスト・チャレンジブック」は、C++ C は知らない
623 :デフォルトの名無しさん :2024/03/18(月) 10:37:04.28 ID:U2viu6Jop.net Pythonは、アルゴリズムって言うより マトリックス計算機
624 :デフォルトの名無しさん (ワッチョイ 59ad-FDlJ) :2024/03/18(月) 12:55:06.36 ID:09P0Fui10.net Perlは最短経路問題のライブラリもなく、速度が欲しければCで自分で書くしかない…ってコト!? 辞めたら? その言語で最短経路問題解こうとするの
625 :デフォルトの名無しさん (ワッチョイ 1384-8Hbo) :2024/03/18(月) 13:06:20.52 ID:mAsCIn7L0.net 依頼者の返答を待たないと
626 :デフォルトの名無しさん :2024/03/18(月) 20:11:03.72 ID:H3fBGUmk0.net perlスレでやれよ このスレは老害しかいないからperlの話しても通じんよ
627 :デフォルトの名無しさん :2024/03/18(月) 20:46:39.48 ID:LaT9Whu40.net perlの歴史は結構古いぞ 年寄りしか扱えないと思ってた
628 :はちみつ餃子 :2024/03/18(月) 21:09:19.87 ID:PY17qgzJ0.net >>616 は C のコードを書く前に他の言語でプロトタイプを書くことがあるかという質問していて Perl についての質問ではないぞ。 Perl の話は例というか前振りだろ。
629 :デフォルトの名無しさん (ワッチョイ 1379-7+fg) :2024/03/18(月) 23:52:06.11 ID:H3fBGUmk0.net そいう話か。1行目しか読んでないわ 最近は大体OS標準のpowershellでざっくり書いて必要なら一部C#だな pinvokeで恐らくC/C++製のDLLを利用することはあってもCコードを書く機会なんてなくなった
630 :デフォルトの名無しさん (ワッチョイ 8163-IOXH) :2024/03/18(月) 23:55:42.19 ID:LaT9Whu40.net じゃあ、だれかCで書いてあげて
631 :デフォルトの名無しさん (ワッチョイ b15f-FuGx) :2024/03/19(火) 08:32:58.20 ID:Z43bMenl0.net いきなりperlで書くのと いきなりCで書くのと何が違うんだろ? つか、俺は最初に日本語で手順を書くが
632 :デフォルトの名無しさん :2024/03/19(火) 08:57:10.07 ID:R8jeC9x+0.net awkが普通だと思ってた 今は違うのか
633 :デフォルトの名無しさん (ワッチョイ fbe7-7lhN) :2024/03/19(火) 09:24:56.59 ID:D/Ya4WHb0.net まずはBASICで書いて、速度が欲しいとこだけマシン語に置き換える感じ
634 :デフォルトの名無しさん (ワッチョイ 2910-ZAEI) :2024/03/19(火) 09:46:27.46 ID:DAgk/2JU0.net FD起動IPL設計からなのでまずアセンブラで。
635 :デフォルトの名無しさん :2024/03/19(火) 10:08:59.95 ID:Szfgw2D70.net FD起動 なんて贅沢なんだ
636 :デフォルトの名無しさん :2024/03/19(火) 10:39:11.21 ID:Fe9RIXyY0.net >>631 いきなり perlで書いたソースは既にあって、実行するとメモリ不足になるのでしょ。なので、 いきなり(perl以外の)書きやすい言語で書くのと いきなりCで書くのと何が違うんだろ? と訊くべき。
637 :デフォルトの名無しさん :2024/03/19(火) 11:11:47.95 ID:Szfgw2D70.net 昔MZシリーズなんていう8ビットPCがあって、 そのマニュアルにペントミノを解くというプログラムが載っていた しかし実行しても1日掛かっても回答が出ない 16ビットPC用のCで書き直したら、5分で終わった ついでにアセンブラにしたら、1分だった
638 :デフォルトの名無しさん :2024/03/19(火) 11:29:09.76 ID:FLREyswN0.net Perlでアルゴリズムのプロトタイプ書くおじいちゃん、まだ生きていたのか 普通の若者はプロトタイプはPythonで書くんだよな。何故ならネットにダイクストラでもなんでも落ちているから このおじいちゃんは新しい言語を勉強出来ない人間だし、かといってプロトタイプなしで初手Cで書けるような積み上げのある猛者というわけでもない 引退した方が良いのでは?
639 :デフォルトの名無しさん :2024/03/19(火) 11:32:03.00 ID:Szfgw2D70.net じゃあ、代わりに書いてあげて
640 :デフォルトの名無しさん :2024/03/19(火) 12:27:21.10 ID:h/UmP7BY0.net やるならせめてc++でやれよ わざわざcでやる意味ない
641 :デフォルトの名無しさん :2024/03/19(火) 12:37:23.65 ID:SMOg7wK30.net 翻訳先が Cなら、 Perl より Python の方がコスト(手間)高で、いっぱい損な気ガス # ダジャレに気付かないのはダレジャ
642 :デフォルトの名無しさん :2024/03/19(火) 14:22:26.70 ID:VlZcx0wQM.net 計算量や使用メモリがネックになるのわかってたら最初からc++かcuda インタラクティブかつビジュアライズして試行錯誤するときはpython(Jupyter)
643 :デフォルトの名無しさん :2024/03/19(火) 19:07:27.75 ID:qnPpFeXM0.net 最短経路問題をCudaで解くのはむずくね?
644 :デフォルトの名無しさん (ワッチョイ 7bc9-VMz+) :2024/03/20(水) 02:30:26.76 ID:yu5B8CqZ0.net 最短経路の解き方を聞かれてるわけじゃないだろ
645 :デフォルトの名無しさん :2024/03/20(水) 10:52:31.80 ID:+bbLi7EZ0.net 総当たりさせたらいいんだよw
646 :デフォルトの名無しさん (スフッ Sdb2-W6Ep) :2024/03/24(日) 18:06:00.35 ID:UMIIXnOjd.net 構造体変数の宣言の初期化のとき、ヌルポインタを,{ }でくくらないと、警告が出るのですが、なぜですか? 例えばこんな具合にしないと警告が出ます struct monster { char name[80]; int HP, MP; }; int main(void) { struct monster template = {{0}, 7, 4};
647 :デフォルトの名無しさん (ワッチョイ 1261-Juro) :2024/03/24(日) 18:20:00.72 ID:XqBtjkZY0.net >>646 char name[80];に入るのはポインタではなくchar型の配列か文字列
648 :デフォルトの名無しさん (スフッ Sdb2-rfcW) :2024/03/24(日) 18:24:20.57 ID:UMIIXnOjd.net >>647 よくわかりました ありがとうございます
649 :デフォルトの名無しさん (ワッチョイ 9279-uYHt) :2024/03/24(日) 18:43:42.86 ID:TrTyAT7D0.net なにもわかってなさそうでほほえましい
650 :デフォルトの名無しさん (ワッチョイ ad63-Juro) :2024/03/24(日) 18:46:07.25 ID:TfhtohDd0.net 構造体云々言う前に、配列の初期化方法についてまず調べろ
651 :デフォルトの名無しさん (スフッ Sdb2-rfcW) :2024/03/24(日) 18:47:29.73 ID:UMIIXnOjd.net 我ながら Lolです☺
652 :デフォルトの名無しさん (ワッチョイ 09f0-d20A) :2024/03/24(日) 18:57:40.29 ID:9Ye9tMrz0.net >>621 Perlでメモリ不足になるってことは循環参照が発生してメモリが解放されない(PerlはリファレンスカウントGC) もしくは深い再帰でPerl管理のVMスタックが枯渇したか どちらにしろCで書いてもメモリをバカ食いするのは間違いないから データ構造を見直すべき 循環参照を見直す、再帰をループに変えるなどを試してみてはどうか
653 :デフォルトの名無しさん (ワッチョイ 09f0-d20A) :2024/03/24(日) 19:10:42.18 ID:9Ye9tMrz0.net グラフ構造を使う場合は循環参照は容易に生まれるからな PerlのScalar::Util::weakenで変数をラップしてやる こうするとその変数は弱参照になる
654 :デフォルトの名無しさん :2024/03/25(月) 11:18:02.00 ID:YX1noK3i0.net 弱参照ビオレ
655 :デフォルトの名無しさん (ワッチョイ 6fb3-MjEX) :2024/04/11(木) 18:10:49.56 ID:h5i5y7Gi0.net #include <stdio.h> #include <string.h> void main(void) { char c[32]; char *pc; strcpy(c, "JAPAN-TOKYO-OSAKA"); pc = &c[0]; //for(int i=0; i<strlen(c); i++, *pc++){ for(int i=0; i<strlen(c); i++, pc++){ printf("%c", *pc); } printf("\n"); }
656 :デフォルトの名無しさん (ワッチョイ 6fb3-MjEX) :2024/04/11(木) 18:12:37.98 ID:h5i5y7Gi0.net コメントアウトしてる方のforにしても出力結果は同じになります *付きポインタ変数は、中身へアクセスを意味するからめちゃくちゃな文字列が出力されるはずじゃ・・・? どうしてなの?
657 :デフォルトの名無しさん (スッップ Sd02-nKjL) :2024/04/11(木) 19:02:47.99 ID:/0XH+klGd.net あなたが書いたのは*(pc++)を意味してます
658 :デフォルトの名無しさん (ワッチョイ 2363-Ky5X) :2024/04/11(木) 19:16:41.38 ID:GKY1RwiV0.net このソースを何という名前で保存して、何というコンパイラでコンパイルしたかとか、色々
659 :デフォルトの名無しさん (ワッチョイ 6fb3-MjEX) :2024/04/11(木) 20:20:43.87 ID:h5i5y7Gi0.net >>657 文句を行ってもしかたがない そういうものとして納得するしかないんだろうけど、”おかしい”と思ってるCプログラマーは世界中に2億人くらいいると思う
660 :デフォルトの名無しさん (ワッチョイ 4ef0-WBP1) :2024/04/11(木) 20:25:30.86 ID:RdqITFFi0.net *も++も単項演算子で適用される優先順位がある 優先順位を意識してコーディングしないと痛い目に合う a + b == cは想定通りだろうが、a & b == cは想定外の結果になるとかねw
661 :デフォルトの名無しさん (ワッチョイ af69-zSwZ) :2024/04/11(木) 20:54:35.96 ID:eGBAyvET0.net 足し算掛け算の掛け算をシフトに書き換えたら上手く動かなくなって焦った
662 :デフォルトの名無しさん :2024/04/11(木) 21:46:39.46 ID:6HtedQOj0.net >>661 え、なぜ。
663 :デフォルトの名無しさん :2024/04/11(木) 22:53:39.83 ID:/Kb1qQiM0.net シフト演算子は加減算より優先度低いのにカッコで囲わなかったって事でしょ
664 :デフォルトの名無しさん :2024/04/11(木) 23:28:45.21 ID:0Tmkq/lZ0.net まあ次がんばればいいよ
665 :デフォルトの名無しさん :2024/04/11(木) 23:29:31.03 ID:RdqITFFi0.net シフトは乗除っぽいイメージだから加減算よりも先でいいよなぁ ビット演算子が比較よりも後なのは完全に仕様バグだろ…
666 :デフォルトの名無しさん :2024/04/11(木) 23:37:48.49 ID:1F4I/FIC0.net 冴えてないときの自分のためにも、他人のためにも、なるべくカッコはつけるかな
667 :デフォルトの名無しさん (ワッチョイ e279-V3xu) :2024/04/11(木) 23:49:41.77 ID:0Tmkq/lZ0.net いまさら言って仕方ない事をいちいち書くなよ お前が次のC言語でも作って人生を棒に振ればいいだけだよ
668 :デフォルトの名無しさん (ワッチョイ 4ef0-WBP1) :2024/04/12(金) 00:17:11.46 ID:nGLEgXOo0.net >>667 便所の落書きにぶちギレw お前の人生はいつも焦燥感に満ちてんだろうなw
669 :デフォルトの名無しさん :2024/04/12(金) 00:21:54.57 ID:GtdzNQir0.net >>655 後に現れたC++のiostreamがシフト演算子をオーバーロードし入出力演算子として流用するのに 好都合で、思わぬ役に立つことになったからまあ良いだろ。もしシフト演算子が四則演算子より 優先順位が高かったら、cout << 1 + 2 * 3 << endl を cout << (1 + 2 * 3) << endl と 書かなければならず面倒だった。(C++がシフト演算子を全く別の機能に流用したのは不適切 だったという意見もあるが…)
670 :デフォルトの名無しさん :2024/04/12(金) 01:13:09.53 ID:nGLEgXOo0.net >>669 シェルのリダイレクトと概念が一致してるから、最初見た時は天才かよと感心したな でも、出力の整形が激ムズなんでやっぱり駄目じゃんと気付くまではそう思ってた
671 :デフォルトの名無しさん :2024/04/12(金) 02:09:51.24 ID:Wv2Zy+UZ0.net >>656 *pc++ はまず *pc の処理をする。これで pc の差している先にある値を取り出すことになる。その次に pc を一つ分進ませる(実際に加算される値は sizeof(*pc))。 では最初に *pc で取り出した値はどこへ行ってしまうのか? それは何にも使われずにただ捨てられる。
672 :デフォルトの名無しさん :2024/04/12(金) 07:08:32.50 ID:gi41fiD00.net *pc++の形はcやってたら所々で見るから否応なく慣れる 個人的にはケチくさい書き方で避けたい気持ちもあるがまぁそういう文化が根付いてるなら合わせざるを得ない
673 :デフォルトの名無しさん :2024/04/12(金) 07:39:02.10 ID:661KRJs/r.net >>665 初期のCでは||が無くて論理和も|使ってたためのはず KかRのどっちかが「後悔してるけど今さら変えられないし」とか言ってた
674 :デフォルトの名無しさん :2024/04/12(金) 12:25:07.52 ID:OadUyd3Md.net C言語の標準化委員はC++のほうも兼任してたりするから、ぶっちゃけC言語の改善にはやる気無しだから。
675 :デフォルトの名無しさん :2024/04/12(金) 13:28:21.08 ID:Lm13J0L60.net C++もやる気無しだろ
676 :デフォルトの名無しさん :2024/04/12(金) 14:41:57.50 ID:nGLEgXOo0.net C++はRustと比較されて安全性に劣るとレッテルを貼られて、どうしたもんか考えあぐねてるところだろうw 言語の拡張に対して完全に方向転換を強いられてるのは間違いない それはCも一緒だな
677 :デフォルトの名無しさん :2024/04/12(金) 14:53:32.51 ID:nGLEgXOo0.net パフォーマンスを損なわずにRustと同等の安全性を追加するか、もうこのままそっとしておくかw、の2択だろう
678 :デフォルトの名無しさん :2024/04/12(金) 15:20:27.37 ID:dUdcEEpod.net >>674 もはやbetter Cでも何でもないのに、このスレでも繰り返しc++の話題出す奴居るし、やっぱユーザーも被ってるんだろな まあCの設計の良否を他言語よりは比較的小さな差異から論じるのに有用だとは思う おれみたいにC++は書かずともcpprefとか読んで式や文、宣言など局所的な構文知識だけちょっとある人は多かろう(ClassとかCに無い概念は読み飛ばしてて無知) 生まれた順序が逆だけど、FortranがC++とすればF言語/JuliaがCだね 大体サブセット+独自進化、標準化コミュニティ丸被り
679 :デフォルトの名無しさん :2024/04/12(金) 16:33:17.52 ID:OadUyd3Md.net C++は好きじゃないからC言語はもっと改善していって欲しい。 nullptr型とか入るの遅すぎじゃね?
680 :デフォルトの名無しさん :2024/04/12(金) 22:48:41.07 ID:fQv3jEzD0.net C++はCの機能を保ったまま、ありとあらゆるプログラミングパラダイムを突っ込んだもの それがベターかどうかは人によるな ただ、Cと互換性を保ったままそこまで進化したのは奇跡に近い
681 :デフォルトの名無しさん :2024/04/12(金) 23:16:21.33 ID:pf6tTSyT0.net Cは概ねC++のサブセットだからしゃーない
682 :デフォルトの名無しさん :2024/04/13(土) 00:06:24.07 ID:c7UXCLXT0.net でも、Rustが安全性と性能は両立出来ることを証明してしまってから、一気に旗色が悪くなったw 今まで性能を免罪符にして、多少(かなり?)の安全性を犠牲にしてきたけど、もはや通用しない時代になった 今後どう進化するか見物だな Cだって対岸の火事ではない
683 :デフォルトの名無しさん :2024/04/13(土) 01:23:26.45 ID:c7UXCLXT0.net ちなみに、Rustは安全な代わりに書きたいコードを書けるとは思わない方がいいw これは書いてみないと分からん感覚だ 書きやすくて安全な言語は存在しないことも証明されたw
684 :デフォルトの名無しさん :2024/04/13(土) 07:18:38.29 ID:SxW/5mRR0.net 慣れの問題では?
685 :デフォルトの名無しさん (ワッチョイ bf5f-/8Es) :2024/04/15(月) 00:15:31.26 ID:kwd7Pf0A0.net 必ず遠回りをさせられる感覚は非常にムズムズするよな あれならgccでstack-protectorとかsanitizeとかガン盛りした方が 気分良く高効率に書けると思った
686 :デフォルトの名無しさん :2024/04/19(金) 20:19:37.90 ID:5JxGOdzk0.net 今日から戯れに数十年前のx86なGUIのソースをx64に移植し始めたんだが とりあえずエラーになるGetWindowsLongだかをx64用に書き換えていったらそこそこ動いてしまって、後は文字列が関係する処理だけだ 俺が書いた過去のコードがよっぽど優秀だったようだ やはり若い頃にソースを沢山書いといてよかった
687 :デフォルトの名無しさん :2024/04/19(金) 20:37:53.24 ID:5JxGOdzk0.net x64化でちょっとsize_tの扱いで躓いたので書いておこう ポインタが64bitだから、その差を取る場合もあるsize_tも64bitなのは理屈では理解できるんだが 明らかに64bit幅が不要な箇所でsize_tに出くわすとおいおいと思ってしまう これはbit数を明示した型を別に定義した方がよさそうだ ああまいったまいった
688 :デフォルトの名無しさん :2024/04/19(金) 23:35:27.85 ID:uO847wzt0.net >>686 Windows1.0のexeもWindows10(32bit版)でも動くからな 64bit版は16bitコードの実行が廃止されたから無理 APIの方は割と変わってるけど、それでもちょっと直せばビルドできる 優秀なのはMicrosoftの方だなw
689 :デフォルトの名無しさん (ワッチョイ 7763-hJEz) :2024/04/20(土) 09:49:57.99 ID:U6z53Ozt0.net 温泉旅館の増改築やらせたらMSに敵う奴はいない
690 :デフォルトの名無しさん (ワッチョイ 1e01-EjCi) :2024/04/21(日) 10:27:21.32 ID:Y4YQdA//0.net Windows11は最初から32bit版が無いんだよな… ポインターに64bitも必要ない 36bit(64GB)有れば十分 farとnearポインター復活しても良いよw
691 :デフォルトの名無しさん :2024/04/21(日) 10:58:55.51 ID:WM7IEXRid.net win10使ってるけどOffice 97をバイナリコピーして使ってるぞ、とうとう11では動かんのか…? 主にExcel使うが関数の数は劣ってもヘルプは古い方がよく出来てて一般ユーザとしては好み、一々ブラウザ起動されてたらい回しは嫌だ
692 :デフォルトの名無しさん :2024/04/21(日) 11:03:42.61 ID:z3GhIJnT0.net 可変長サイズのポインターは斬新
693 :デフォルトの名無しさん (ワッチョイ 66ad-6Ywt) :2024/04/21(日) 13:02:16.05 ID:kDNr1IJ/0.net Office97は32bitだから動くでしょ 駄目なのはWindows3.1までの16bitアプリ じぶんもフリーソフトをいくつか64bit化したけどほとんど修正してない 早めにUnicodeにしてたおかげもあるかな
694 :デフォルトの名無しさん :2024/04/29(月) 16:02:47.44 ID:JmumYEsm0.net 16bitアプリって、今も残ってたっけ?
695 :デフォルトの名無しさん :2024/04/29(月) 17:53:08.72 ID:Mi5d5RVO0.net あえて使う人もあんまりいないだろうけど、メンテナンスが止まってる(32bit 化、64bit 化されない)ようなソフトを使いたいってことはそれなりにあることじゃないの。 メーカーがつぶれて消えたりするのもよくあることだしな。
696 :名無し兎と鰻の大乱闘 :2024/04/29(月) 19:42:16.62 ID:Yc7GJpMD0.net そもそもしーげんごってなに?
697 :デフォルトの名無しさん :2024/04/29(月) 19:53:54.99 ID:D5HYHAbC0.net アプリは32bitだがインストーラが16bitなのが結構あるらしい
698 :デフォルトの名無しさん :2024/04/29(月) 20:59:16.06 ID:JmumYEsm0.net もしもそんなのがあったら、メチャクチャ話題になってると思うよ
699 :デフォルトの名無しさん :2024/04/29(月) 22:45:20.14 ID:c1TFMEcy0.net 知り合いにエミュレータ入れたりして凄く苦労してロータス123を動かして業務で使っている人が居る。
700 :デフォルトの名無しさん :2024/04/30(火) 00:46:15.48 ID:b4FWQSR70.net 使うのに手間はあるとはいえエミュレータが成熟してしまったので かなり古いソフトウェアを動かしたいならそっちでやれと言えてしまうようになったとも言える。 Windows の互換性維持システムも結局はエミュレータをサブシステムとして 組み込んでるようなもんだしな。
701 :デフォルトの名無しさん (ワッチョイ c7fa-WbgR) :2024/04/30(火) 10:07:58.44 ID:XgZjmbIB0.net >>697 ファーレントゥーガとかそのパターンだね
702 :デフォルトの名無しさん (ワッチョイ df79-V7Lt) :2024/04/30(火) 19:37:21.97 ID:6siWZQQV0.net なんで16bitの話になったのか理解不能
703 :デフォルトの名無しさん :2024/05/01(水) 16:53:57.29 ID:udfiR5VM0.net >>686 の辺りから?
704 :デフォルトの名無しさん :2024/05/01(水) 19:51:41.60 ID:nIC3qyB/0.net プリプロセッサでモジュール作れるようになるとC++使わなくてもCで十分だな もっと早めにマスターするべきだった
705 :デフォルトの名無しさん :2024/05/02(木) 23:28:34.67 ID:gN+cVuNV0.net CでCOMやれって言われても困るし 逆にC++のがマシってのはその程度か
706 :デフォルトの名無しさん :2024/05/03(金) 11:04:22.77 ID:RJtMknPi0.net cでもできるってのと、c++使ったほうが楽ってのでは全然意味違う チームで混乱を招くという理由以外でのc++ディスりは、大抵理解不足によるアレルギーから来るヒスのことが多い まあ、そういうヒス起こす人が多いからチームでは使用禁止とかになっちゃうわけだから、り繋がってはいるんだけど
707 :デフォルトの名無しさん :2024/05/03(金) 11:08:15.33 ID:9ebiuCIb0.net チャンスあると自分語りを始めるのは、病気だぞ
708 :デフォルトの名無しさん :2024/05/03(金) 11:51:54.49 ID:RJtMknPi0.net どういう理論だよ 普通の欲求だろ
709 :デフォルトの名無しさん :2024/05/03(金) 12:00:23.89 ID:KP5VxXzU0.net 普通じゃなくてガキの欲求
710 :デフォルトの名無しさん :2024/05/03(金) 13:30:44.34 ID:vhm3euJk0.net リーナスはガキ
711 :デフォルトの名無しさん :2024/05/03(金) 14:49:42.61 ID:lW+ShOaq0.net >>708 なわけ無いだろ 我慢ができないのはただのガキだぞ
712 :デフォルトの名無しさん :2024/05/03(金) 16:16:10.22 ID:RJtMknPi0.net >>711 そうやって我慢できずに突っかかってきてるのもどうかと思うけどな…
713 :デフォルトの名無しさん :2024/05/03(金) 16:35:03.08 ID:8UCXCtC4M.net linuxカーネル縛りと趣味以外でc言語使うってどういうプロジェクト? 実際仕事でそういう人いる? 組み込みでも今時c++使えるだろ
714 :デフォルトの名無しさん (ワッチョイ e701-E0+q) :2024/05/04(土) 01:34:33.71 ID:fPXjXaJw0.net 洗濯機や電子レンジなどは Cが最適じゃなかろうか
715 :デフォルトの名無しさん (ワッチョイ dfac-R43V) :2024/05/04(土) 01:40:48.74 ID:nSEmjq+y0.net メモリ構成が非常に小さいシステムの場合Cじゃない? 8bitのPICとか
716 :デフォルトの名無しさん (ワッチョイ ff2d-y8PE) :2024/05/04(土) 17:05:29.45 ID:VOfnZKej0.net こういうの考えたんだけどどうだろう? 実用性無いだろうか #include <stdio.h> typedef void (*exception_handler)(void); void register_exception_handler(exception_handler handler) { handler(); } void exception_occurred() { printf("例外が発生しました。\n"); } void may_throw_exception(int condition) { if (condition) { register_exception_handler(exception_occurred); } } int main() { may_throw_exception(1); return 0; }
717 :デフォルトの名無しさん (ワッチョイ bf4f-O08P) :2024/05/04(土) 17:59:35.95 ID:pTi4k8MI0.net ネタにしてもつまんない
718 :デフォルトの名無しさん (ワッチョイ e7f0-yODy) :2024/05/04(土) 18:34:27.18 ID:XXil6xAz0.net >>716 例外でもなくでもなくて草 Cで例外起こしたいならsetjmp/longjmpでやると決まってる
719 :デフォルトの名無しさん (ワッチョイ 7f63-Ufki) :2024/05/04(土) 18:38:32.56 ID:0cPYdG0t0.net あれは例外なのか?
720 :デフォルトの名無しさん (ワッチョイ c7bb-x43a) :2024/05/04(土) 18:45:30.78 ID:TbdOZmgm0.net 例外処理やりたいならsetjmpでも使えば
721 :はちみつ餃子 :2024/05/05(日) 00:00:07.41 ID:NN+M7fak0.net >>716 「こういうの」とは何であるか説明が必要。 提示されたコードは関数 exception_occurred の呼び出しを回りくどくやっているだけで、 途中のメカニズムに意味がない。 (このコードでの使い方の範囲では。) 言葉で説明しづらいならこれが有用になるような使い方の例を示して欲しい。
722 :デフォルトの名無しさん :2024/05/05(日) 00:01:55.61 ID:5Yjpxxvd0.net スタックの巻き戻しをどう実装するのか教えて欲しい
723 :はちみつ餃子 :2024/05/05(日) 00:22:13.83 ID:yEjzRI9b0.net >>722 C の言語仕様の範囲内でやる方法は setjmp/longjmp のみ。 setjmp/longjmp を自分で書きたいってことなら アセンブラ (またはインラインアセンブラや intrinsic 関数) を使って スタックポインタ操作したりレジスタの待避・復旧などをやる必要があるが……。 モダンな処理系だと最適化だのなんだのの都合でスタックフレームを省略したりだとかもあるので それらと協調しないとまともに動作しない。 たとえば gcc だと setjmp/longjmp の実体は 組み込み関数の __builtin_setjmp/__builtin_longjmp として提供されてる。 処理系自体の機能として持たないとちゃんと動作させられんのだ……。
724 :デフォルトの名無しさん :2024/05/05(日) 00:39:05.41 ID:eNHKeT630.net >>713 九州大学の人工衛星・イザナミ/イザナギは、mruby だから、C 言語 ベンチャーで上場したらしい
725 :デフォルトの名無しさん :2024/05/05(日) 03:04:42.71 ID:vcr/Jmru0.net Windows処理系の場合SEHがあるからsetjmp/longjmpをわざわざ使う事ないよ というか外部ライブラリ等から例外を受ける場合SEH必須だよ
200 KB
新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★
本文 スレッドタイトル 投稿者