X



C言語なら俺に聞け 162
0001デフォルトの名無しさん (ワッチョイ 2389-FUJr)
垢版 |
2023/10/30(月) 17:13:00.82ID:hHEGE8Ol0
!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
0007デフォルトの名無しさん (ワッチョイ 2901-CP9B)
垢版 |
2023/10/30(月) 21:04:03.03ID:re6vYA8I0
リモートワーク制度が削減・廃止されたら「転職や別案件を探す」が4割--
「Offers」登録者調査

ITエンジニア/デザイナーの副業・転職サービス「Offers」を提供するoverflowは、
同社が運営する「Offersデジタル人材総研」にて「リモートワーク実態調査2023」
を公表した。
これによると、リモートワークになり、5人に1人が引っ越したと回答した。そのうち、
現職でリモートワーク制度が削減・廃止された場合、「転職や別案件を探す」という
回答が44.0%にものぼった。一方「会社と交渉する」という回答は40.0%、
「引っ越さず受け入れる」が12.0%となった。
さらにリモートワークを希望している理由として「通勤時間が無駄だと感じている」が
87.7%でトップとなった。このほか「個人の時間ができる」(62.3%)、「副業を続け
やすいから」(39.6%)、「子育てができる」(35.8%)と続いた。
0008デフォルトの名無しさん (ワッチョイ 194e-FUJr)
垢版 |
2023/10/31(火) 09:59:32.82ID:DBRUqQAF0
前スレではちみつさんが書いてくれたリンク見ました。thx
https://go.dev/tour/flowcontrol/13

曰くGOの defer は
deferred function calls 遅延関数呼び出し で、関数脱出時にlast-in-fast 順で呼ぶもの

とすると、C言語でdeferの仕様追加要求は却下すべきです。リンクリスト1個作れば済む話で、実際そうしてる人も多数いるだろうに、既存プログラムでdeferというシンボルを使ってるのをコンパイル通らなくしてまで仕様追加するのは利益が小さすぎる。

エラー処理で使うかは、直接関係ないですね。そうしたきゃすればいいけど、私は読みやすいコードとは思わない、です
0009デフォルトの名無しさん (ワッチョイ 937c-cQ99)
垢版 |
2023/10/31(火) 12:23:13.16ID:9gnUDJNP0
>>8
>関数脱出時にlast-in-fast 順で呼ぶもの

>とすると、C言語でdeferの仕様追加要求は却下すべきです。

この「とすると」からの繋がりが意味不明。

>リンクリスト1個作れば済む話で、

だから何?
「却下 *すべき*」の理由になってない。
採用するほどでない、なら理解できる。


> 既存プログラムでdeferというシンボルを使ってるのをコンパイル通らなくしてまで仕様追加するのは利益が小さすぎる。

ここでのdeferは機能についての名称として使ってるだけで、そのままの文言じゃないことを理解できてないみたいだ。
0013デフォルトの名無しさん (ワッチョイ 937c-cQ99)
垢版 |
2023/10/31(火) 16:18:39.83ID:9gnUDJNP0
>>10
おまえの感想 >>8 のどこが建設的な議論よ?
0015デフォルトの名無しさん (ワッチョイ d95d-kYJB)
垢版 |
2023/10/31(火) 16:36:27.63ID:RXeEqnvz0
deferは(素のものをじゃなくてもう少し高機能な)プリプロセッサで対応出来る
breakやreturnの直前にdeferの内容を全部コピーしとけばいいだけ
まぁそれ言い出すと、C++をCに変換するプリプロセッサが有れば全て解決だがなw
0016デフォルトの名無しさん (ワッチョイ 194e-FUJr)
垢版 |
2023/10/31(火) 16:37:42.80ID:DBRUqQAF0
ただのどこかのオッサンの意見が気に食わんなら別にそれでもいいよ…

各自自分の考えを語ればいいじゃん、そんな食いつくくらいならなんか一つくらいは「自分のアイデア」あるんでしょ?何もないの?
0021デフォルトの名無しさん (ワッチョイ 937c-cQ99)
垢版 |
2023/10/31(火) 17:12:55.99ID:9gnUDJNP0
>>17
全然おかしく無いよ。
互換性は非常に重要。

でもおまえは新しい機能は追加するなって言ってるだけだよね。
おまえの言い分だとプロトタイプ宣言必須になるのは、過去の「正しいプログラム」が正しくあり続けることできないから「却下すべき」案なんだよな。
0022デフォルトの名無しさん (ワッチョイ 937c-cQ99)
垢版 |
2023/10/31(火) 17:17:03.54ID:9gnUDJNP0
>>21
プロトタイプ宣言とK&Rスタイルの関数定義がごっちゃになってるわ。
>>21 は回線切って首吊れば。
0026デフォルトの名無しさん (スププ Sd33-wFsA)
垢版 |
2023/11/01(水) 03:27:47.22ID:3HySGS93d
いつもの復オジωωω
スルー決定ωωωωωωωωω
0028デフォルトの名無しさん (ワントンキン MM53-wL8D)
垢版 |
2023/11/01(水) 09:43:55.98ID:g4eyJzirM
言語の設計思想と立ち位置考えれば手を入れる必要ないでしょ
細かいのはあるにしても関数プロトタイプの導入、データ型の追加、stdioのセキュリティ強化くらいでCとしては充分
構文追加とかバカすぎてANSI Cもまず取り込まんよw
0029デフォルトの名無しさん (スプッッ Sd73-cQ99)
垢版 |
2023/11/01(水) 12:36:29.63ID:YeBzjhT2d
>>28
>細かいのはあるにしても関数プロトタイプの導入、データ型の追加、stdioのセキュリティ強化くらいでCとしては充分

その挙げ句MISRA-Cみたいなのがでてくる。

>構文追加とかバカすぎてANSI Cもまず取り込まんよw

C23の属性とか知らんの?
0030デフォルトの名無しさん (ワッチョイ 2945-kYJB)
垢版 |
2023/11/01(水) 13:21:32.97ID:DFYs67SD0
c23だと属性以外にも
enum Colour : char {
Red,
Green,
Blue
};
とか
auto i = 123L;
とかも構文変更になる
constexprもコンパイラにとってはかなり大きい
文字列のハッシュ値の計算とか、コンパイル時にCのコードを実行できる
0034はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 933e-g5YV)
垢版 |
2023/11/01(水) 17:37:30.95ID:m2/+vlXa0
C++ の const 指定は初期化子が定数 (定数式) なら指定が付けられた変数も定数になるという規則なんだが
C の const は単に書き換えが禁止されるだけで定数になることはない。
(処理系の拡張によって一部の状況で定数扱いされることはある。)

C で定数を作ろうとすると #define を使うか enum を使うかしかなかったので
定数を定義するための直接的な方法として constexpr を導入しようという判断は納得できる。

定数を定義するまともな方法がないってのは C の明らかな欠陥なので
それを改善するという話でしかなくて、
コンパイル時計算を推進する野心の始まりってわけではないと思う。
なので constexpr については (遠い将来はともかく現時点では) これで完了。
中途半端ってこたぁないというのが私の感覚だな。
0036デフォルトの名無しさん (ワッチョイ 2945-kYJB)
垢版 |
2023/11/01(水) 23:56:27.24ID:DFYs67SD0
書き換えが禁止されても定数ではないとはこれいかに…
ここでいう定数はコードに直接埋め込まれる値ということだろう
ただ、C++もstatic constにしないと定数にならないと思ったけど、 constだけだとちゃんとメモリが確保されてると認識してたな
0037はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 933e-g5YV)
垢版 |
2023/11/02(木) 01:38:41.62ID:9IBKBW6G0
言語仕様上の用語としては定数は定数が要求される箇所に書くことが出来るもののことだよ。
単純な例で言えば、↓これは C++ ではアリだが C ではダメ。 (clang のデフォルトだと通してしまったりもするようだが……。)

const int foo = 1;

enum bar {baz = foo};

int main(void){}


もちろん最適化によって効率的な扱いがされやすくなることも多いにせよ、直接には求められてない。
定数であってもアドレス演算子は適用が可能だし、あくまでも変数なので見かけ上はメモリ上にある。

C++ で static const にしないと定数にならないというのはデータメンバのとき。
普通のデータメンバはオブジェクトを生成するときまで初期化されていないことになっているので
コンパイル時には確定できない。
0041デフォルトの名無しさん (スプッッ Sd73-cQ99)
垢版 |
2023/11/02(木) 12:23:28.61ID:R1/lC5p9d
>>40
デバッグ時にシンボル表示できる。
0042デフォルトの名無しさん (ワッチョイ 190d-FUJr)
垢版 |
2023/11/02(木) 15:51:31.06ID:7f41Qrwa0
もしかしてそれって、C言語の仕様じゃなくてデバッガとかビルドシステム側の機能改善でできそうって気がしませんか?


デバッガが読んで参考にできるかもしれない情報の豊富さの、なんとなくの並び

■実行形式にシンボル情報がない
■実行形式にシンボル情報がある
■ソースコードがあるけどデバッガはビルド情報知らない
■ソースコードがありデバッガがビルドの情報も知ってる

clang とかLLVM界隈ってそういう情報(どういう?ビルド時しか分からん情報というか?)をうまく使おうぜ方向を目指してる気がします、知らんけど
0044デフォルトの名無しさん (アウアウウー Sad5-g+2W)
垢版 |
2023/11/03(金) 08:01:57.68ID:rVBPlXQLa
>ソースコードがありデバッガがビルドの情報も知ってる

両方持ってるのは本物のプロと練習集の初心者素人と両極端に分かれそう
0047デフォルトの名無しさん (ワッチョイ 5324-zW/F)
垢版 |
2023/11/03(金) 11:32:32.93ID:8bACdtpR0
>>42
当然だけど規格の話じゃないよ
気がしませんかっていうかコンパイラとデバッガは何十年も前からそうやって連携してる
0048デフォルトの名無しさん (ワッチョイ 5324-zW/F)
垢版 |
2023/11/03(金) 11:34:06.16ID:8bACdtpR0
>>43
数字で表示されないと具体的に何が非安全だと心配してるの?
0050デフォルトの名無しさん (ワッチョイ 827c-RmzB)
垢版 |
2023/11/04(土) 00:06:31.86ID:nDDUhOSB0
>>49
何のためにシンボル使うのかわかってないな。
実際の値と値の持つ意味について考えたほうがいいぞ。
0052デフォルトの名無しさん (ワッチョイ 827c-RmzB)
垢版 |
2023/11/04(土) 02:19:34.08ID:nDDUhOSB0
>>51
なんだ実際のデバッガ使ったことないのか。
普通はシンボルだけじゃなくて値も表示するんだが。
0054デフォルトの名無しさん (ワッチョイ 653d-2MVi)
垢版 |
2023/11/04(土) 10:09:07.16ID:lvandghk0
自分はデバッガ使う段階なら定数は具体値が出てくれた方がいいです

クロスコンパイル環境の構築からとか、Cならではの現場を辿って来た人と、今どきのGUIのデバッガが前提の人では話は合わなそう

マウスかざせば済むじゃんと思ってるのでは
0055デフォルトの名無しさん (ワッチョイ 624f-ZTan)
垢版 |
2023/11/04(土) 11:08:29.93ID:dBvv25rw0
>>43にアンカうったら>>49で手間がどうこうって返ってきたんだがそういうのを安全って言うのか??
個人的には>>52と同感でマクロにしてもenumにしてもシンボル・値両方確認出来るもんだと思ってたから
どんな環境を想定して言ってるのかちょっとよく話が掴めないな
0056デフォルトの名無しさん (JP 0H09-q9sc)
垢版 |
2023/11/04(土) 11:41:50.34ID:A3cqUl0FH
gdbなどのデバッガー使っていれば変数名と型と値は全て表示される
必要であれば配列は全ての要素を展開して表示も出来るけどな
0058デフォルトの名無しさん (アウアウウー Saa5-CWlg)
垢版 |
2023/11/04(土) 12:21:19.50ID:KPpuxUoxa
シンボルの方が意味が判って良いけどな
「マウスかざせば良い」はその通り
場合によっては watch 式
0060はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-9NWm)
垢版 |
2023/11/04(土) 13:50:23.07ID:ocaBqo/v0
デバッガもその設計思想によるだろう。
ソースレベルデバッグなら言語の評価モデルに一致するのが自然だと思う。
そうなるとシンボルのほうが主役で、評価されれば値になるし一部は事前にわかる場合もある。

バイナリ寄りのデバッガなら
シンボル情報 (デバッグ情報) を扱えるものであってもまずそこにあるのは具体的な値であって、
値のほうをメインに見せる (シンボルは補助的な情報) のが筋に思える。
0061デフォルトの名無しさん (ワッチョイ 827c-RmzB)
垢版 |
2023/11/04(土) 14:07:46.76ID:nDDUhOSB0
>>53
お前はアドレスさえわかれば関数名も変数名も不要なんだろうな。
俺はソースレベルデバッグを想定してたけどお前は違うの?
0062デフォルトの名無しさん (ワッチョイ 827c-RmzB)
垢版 |
2023/11/04(土) 14:20:50.41ID:nDDUhOSB0
>>54
Cのソースレベルデバッガはgdbとそのラッパー(dddとかKDEのkdebug)しか使ったこと無いな。
お前は何使うの?gdb以外のデバッガにはちょっと興味あるかも。

あと、いつのまにかデバッグの話にすり変わってるけど、元は >>40 で *コード書くとき* の話だからな。
>>41 のせいだな。
0065デフォルトの名無しさん (ワッチョイ 4279-ztC3)
垢版 |
2023/11/04(土) 21:41:26.73ID:W1fOq5zR0
Cは単純だからぽいんた辺りで躓かない限り特に疑問は生まれずスーっと大脳皮質に浸透していく
それに比べて自称モダン言語の気持ち悪さよ
Cが無かったらプログラミングなんてやってなかったろうな
0067デフォルトの名無しさん (ワッチョイ 4279-ztC3)
垢版 |
2023/11/04(土) 21:53:04.57ID:W1fOq5zR0
Cの関数ポインタはそれ以上でもそれ以下でもない
セキュリティが緩い頃は関数ポインタを駆使すれば関数型言語で言う所の関数のファーストクラスも実現できた
この時やはりコードとデータは分かれているべきと判りみ
と同時にオブジェクト指向は間違った思想と気付く
0070デフォルトの名無しさん (ワッチョイ 9901-jPjl)
垢版 |
2023/11/04(土) 22:36:43.09ID:vTgEadDD0
#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;
}
きめぇ
0072デフォルトの名無しさん (アウアウウー Saa5-CWlg)
垢版 |
2023/11/05(日) 10:34:57.51ID:ol9bMVcca
>>59 とか
>>60 の後者の人とかは
ゲーマーか逆アセか改造チートでもしてんのかなと思う
0074デフォルトの名無しさん (ワッチョイ c191-HQPe)
垢版 |
2023/11/05(日) 10:52:46.61ID:dHgdjFj00
>>66
単に機種依存なくしてユニバーサル化したアセンブラだからキモいも何もない
感覚的に受け付けないという方はもうすぐAIで自然言語でプログラムできるようになるからそれまで待てばいいじゃん
0075デフォルトの名無しさん (アウアウウー Saa5-CWlg)
垢版 |
2023/11/05(日) 11:02:20.21ID:ol9bMVcca
>>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;
}
0077デフォルトの名無しさん (ワッチョイ 42ad-dLR+)
垢版 |
2023/11/08(水) 13:50:08.70ID:ySVrNoqw0
C++の話はスレチ
0083デフォルトの名無しさん (ワッチョイ 7f7c-aEnJ)
垢版 |
2023/11/13(月) 22:12:34.37ID:6eyhepdG0
はじめてのCってタイトル狙ってるよね?
0091デフォルトの名無しさん (ワッチョイ 7fad-beIL)
垢版 |
2023/11/15(水) 02:42:58.51ID:FfQCTRFi0
>>90
あなたの年齢は50歳以上ですね。
0093デフォルトの名無しさん (ワッチョイ ff46-uMtu)
垢版 |
2023/11/16(木) 20:52:49.80ID:oCahIYzp0
C名「歌舞伎町の女王」
0095デフォルトの名無しさん (ワッチョイ 6e46-4xZ8)
垢版 |
2023/11/18(土) 17:12:35.80ID:gr23gvrO0
>>94
音階に倣って「イロハ」だったりするのかな。
プログラミング言語ハとか、ハ++とか、ハ長調とか。
0096デフォルトの名無しさん (スップ Sd82-K/BJ)
垢版 |
2023/11/24(金) 17:31:57.03ID:yKOVmI8Pd
三等車か
0098デフォルトの名無しさん (ワッチョイ 5fad-1+JT)
垢版 |
2023/11/25(土) 04:36:14.81ID:D3zQdbUT0
  ∧__∧
 (´∀`)
  (⊃⌒*⌒⊂)
  /_ノωヽ_)
0100デフォルトの名無しさん (スププ Sd7f-RFe5)
垢版 |
2023/11/27(月) 08:24:12.52ID:554QjvZVd
左辺値と右辺値のことがよくわからない
char *cp = "abcdefgの"abcdefg"は値を変更できないのに、
char cp[] = "abcdefg"の"abcdefg"は値を変更できる
0101はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
垢版 |
2023/11/27(月) 09:01:26.52ID:HtoHgn5y0
>>100
それは左辺値/右辺値とは関係ない。
「リテラルを書き換えようとしたら未定義」というルールが関与してる。

前者の場合は文字列の場所を示すアドレスが cp に格納されているので
cp が指す先というのは文字列リテラルだが
後者の場合は確保された配列を初期化子の文字列で初期化するという理屈なので
配列と文字列リテラルとは別の実体を持ち、リテラルではない配列を書き換えることは問題にならない。

初期化子として文字列が出てくるときは初期化の文法としてちょっと特例があるのと
(文字列を含む) 配列は暗黙の型変換で勝手にポインタに変換される特例があって
そういう変則的なルールの積み重ねが分かり難い要因だと思う。

リテラルは書き換えたら駄目なのに型の上では文字列リテラルに const はつかない (C++ では const が付く) ので
ごく単純な場合を除くと書き換えをコンパイラがコンパイル時にエラーとして検出できないこともある。
なるべく (前後の事情によっては出来ないこともあるけど) 変数には const を付けておくのが良い作法だと思う。
const char *cp = "abcdefg";
0102デフォルトの名無しさん (アウアウウー Sa0b-6V65)
垢版 |
2023/11/27(月) 09:03:50.85ID:7/k6/GSga
char *cpa = "abcdefg;
char cpb[] = cpa; // 出来ない

char cpc[] = "abcdefg";
char *cpd = cpc; // 出来る & abcdefgの中身も描き替え出来る
0103デフォルトの名無しさん (ワッチョイ 7fab-LZ+J)
垢版 |
2023/11/27(月) 11:14:55.99ID:zMN468VW0
「大前提で文字列リテラルは書き換えたらダメ」があって

初期化と代入が同じ記号の = で行われてる
配列での代入操作は暗黙で先頭のポインタを渡す一方で
配列の初期化はあたかも複製をとったような形になる

ここらへんにややこしさがあってめぐりめぐって1行目にヒットする
0104デフォルトの名無しさん (スププ Sd7f-RFe5)
垢版 |
2023/11/27(月) 11:25:24.57ID:554QjvZVd
>>101 ご親切にありがとうございます。標準的な本にもかいてあることを聞いてしまいました。
0107デフォルトの名無しさん (ワッチョイ 5f79-/KuA)
垢版 |
2023/11/27(月) 19:49:45.68ID:/cbu4sL+0
>ポインタと配列(の先頭番地)は同じように使えるがまったく別のもの
まったく別と言い切ってしまうのはちょっと語弊があるように思う
言い換えれば配列はアドレスが変更できないポインタとみなせる
後は参照先のメモリ領域が書き換え可能かそうでないかの違いでしかない
0110デフォルトの名無しさん (スプッッ Sdff-z/Dz)
垢版 |
2023/11/28(火) 08:18:33.76ID:0HFLSmnDd
>>109
それは別に配列だからってわけじゃない。
0111はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
垢版 |
2023/11/28(火) 09:29:06.38ID:mRTkdYl90
配列の型は配列型だ。

char cpc[] = "abcdefg";

とあればこのときの cpc の型は char[8] をもつ。
式中に配列型の式が現れた場合には sizeof か & のオペランドであった場合を除いてその配列の先頭要素を指すポインタ (この場合は char*) に暗黙に型変換される。
変換が適用されればポインタだし、適用されない場面では配列。

配列自体は左辺値だが変更できる左辺値 (modifiable lvalue) ではないので代入演算子の左辺に現れることはできない。
配列を型変換を適用して出来るポインタは左辺値ではないのでやっぱり代入することは出来ない。
0112デフォルトの名無しさん (ワッチョイ dfc6-AnfR)
垢版 |
2023/11/28(火) 10:56:51.80ID:vcMwjchf0
え?左辺値に出来るやん
0113デフォルトの名無しさん (ワッチョイ a76b-onFz)
垢版 |
2023/11/28(火) 15:19:32.77ID:87HNLOa+0
型の話って、実は結構難しいというか深いよね…

型を認識するプログラム作ってみるとわかるんだけど
「~のポインタである」と
「~の配列である」を同じ情報量では扱えなくて
「~の配列(要素数n)である」としないとだめなの

ポインタである ことは1ビットで保持できるのに、配列である は要素数があるから必要なビット数がやたら多いのよ
0116デフォルトの名無しさん (ワッチョイ 47e7-xen6)
垢版 |
2023/11/28(火) 19:34:06.06ID:7TmihfNz0
アセンブラで考えるとよくわかる
cpa:
.dw cpa_static
cpa_static:
.db 'abcdef',0

cpc:
db 'abcdef',0

こんな感じになるだろう
cpaをインクリメントするのが可能だがcpcをインクリメントするのは無理なのがわかるだろう
cpcはアセンブル後には値がなくなる固定値でcpaは領域が確保されてる変数だから
0117デフォルトの名無しさん (ワッチョイ a763-YwKO)
垢版 |
2023/11/28(火) 19:42:59.12ID:7gZuadd+0
>((char*)cpc)++

こんな風な事をしたいなら、

*(char*)cpc+i

これでどうだろうか
cpcは固定値で、加算も減算も出来ないが、その位置からのオフセットならとれる

でも、ふつうの人は cpc[i] こうするだろう
0118はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
垢版 |
2023/11/28(火) 20:11:54.43ID:mRTkdYl90
>>114
代入可能であるためには左辺値であることは必要条件なのだけれど十分条件ではない。
配列が代入の対象になりえないにも関わらず
(modifiable という概念を導入してまで) 左辺値という扱いにしていることからもわかるように、
代入できるかどうかで左辺値かどうかは語れない。
左辺値でも代入できないことはある。

右辺値はどこかに代入しない限り捨てられる (その式を超える寿命を持つことはない) という性質があるので
逆にそうでないものは左辺値という扱いにしないと辻褄が合わないからこうなってるんだと思う。
0119デフォルトの名無しさん (ワッチョイ 5fdf-2qxF)
垢版 |
2023/11/28(火) 20:38:05.06ID:h0hB0aZz0
>>112
>>118で「配列が代入の対象になりえないにも関わらず」なんて言い方してるくらいだから
多分左辺値とか右辺値がなんなのかよく分かってないんだろう
まあいつも規約をだらだら載せてるだけだけのコテだしね
0122デフォルトの名無しさん (スフッ Sd7f-1fOb)
垢版 |
2023/11/29(水) 11:41:18.63ID:5J3ZheQvd
>>111 正確には、配列名のことをいっているんでしょ?
0123デフォルトの名無しさん (スフッ Sd7f-1fOb)
垢版 |
2023/11/29(水) 11:43:26.36ID:5J3ZheQvd
でないと文章的につじつまが合わない
0124はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
垢版 |
2023/11/29(水) 12:08:25.16ID:sncgHuaJ0
何を言ってるのだかわからん。
代入演算子の左辺に配列が現れることは出来ないという説明
に納得いかない (できる状況があると思っている) ということ?
0125デフォルトの名無しさん (スフッ Sd7f-1fOb)
垢版 |
2023/11/29(水) 12:16:49.24ID:5J3ZheQvd
>>124 そういうことです
0126デフォルトの名無しさん (ワッチョイ 5f79-/KuA)
垢版 |
2023/11/29(水) 12:18:51.59ID:UMPQWy8o0
代入可能な左辺値一覧

○…代入可能な左辺値
×…代入可能な左辺値ではない

1 変数に代入 v=x ○
2 変数のアドレスに代入 &v=x ×
3 配列に代入 a[i]=x ○
4 配列の名前に代入(2に相当) a=x ×
5 ポインタ変数に代入 p=x ○
5 ポインタ変数のアドレスに代入 &p=x ×
7 ポインタ変数の参照先に代入 *p=x ○ ただし参照先が書き込み可能でなければランタイムエラー

理解できたかね?
0127デフォルトの名無しさん (スフッ Sd7f-1fOb)
垢版 |
2023/11/29(水) 12:25:45.50ID:5J3ZheQvd
>>126 まだまだ浅学な者で、3と4の違いが分かれば十分です
0128デフォルトの名無しさん (スフッ Sd7f-1fOb)
垢版 |
2023/11/29(水) 12:26:51.70ID:5J3ZheQvd
右辺値と左辺値に関しては
0129デフォルトの名無しさん (スフッ Sd7f-1fOb)
垢版 |
2023/11/29(水) 12:34:21.47ID:5J3ZheQvd
char ss[5];
char *p;
p = ss; 〇
p = &ss[0]; 〇
ss = p; ×
p = ss + 2; 〇
p = &ss[2]; 〇
0131デフォルトの名無しさん (スフッ Sd7f-1fOb)
垢版 |
2023/11/29(水) 12:54:49.45ID:5J3ZheQvd
しかし、食べたらまずそうなコテハンですね('_')
0132はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
垢版 |
2023/11/29(水) 13:01:54.89ID:sncgHuaJ0
最初はSCHEME餃子と名乗ってたけどSCHEMEスレが過疎ってて暇だから
CスレC++スレにも書く機会が多くて途中で変えた。
私としてはあり得なさそうな組み合わせの語を選んだつもりだったのだけど
はちみつを使った餃子のレシピはあるみたいだよ。
0133デフォルトの名無しさん (スフッ Sd7f-RFe5)
垢版 |
2023/11/29(水) 13:56:20.69ID:5J3ZheQvd
配列には確かに構造体のようにごっそり代入できませんね
0138デフォルトの名無しさん (ワッチョイ 47e7-xen6)
垢版 |
2023/11/29(水) 20:22:44.16ID:odjcqh9C0
初心者のころ
char text[] = "Answer is _";
text[10] = 'A' + ans;

とか書こうとしてうろおぼえで

char *text = "Answer is _";
text[10] = 'A' + ans;

としたらエラーかワーニングになって
なんでできないんだよ!とずっと悩んでいたことがあるが
そういう話じゃないの?
0139デフォルトの名無しさん (アウアウウー Sa0b-6V65)
垢版 |
2023/11/30(木) 06:41:39.94ID:yOmuxKyka
char a[] = "A";
char *p = a;
は別物(同じだと説明している入門書があるならクソ本)
&a[0] を a と省略出来るだけ
もちろん sizeof p と sizeof a[0] と sizeof a は違う
0141はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
垢版 |
2023/11/30(木) 14:54:30.13ID:3QI4e6Tt0
> &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 は配列の先頭要素を指すポインタに変換される。
0144デフォルトの名無しさん (ワッチョイ 5f79-/KuA)
垢版 |
2023/11/30(木) 20:20:41.06ID:4nwqW1NG0
>>140
pがザビ家でaがジオン公国そのものと言ったら判りやすいだろうか
ジオンはザビ家にNTRれたけど元のジオン・ダイクンが掲げた思想(長さとか)はNTRが完了した時点で失われた
その後出てきたアクシズ(ネオ・ジオン)はもっと酷くてジオンと言える部分はNTRしたザビ家の跡取りとその傀儡だけでジオンとは一体何だったのか語れる人物は一人もいない
0145デフォルトの名無しさん (ワッチョイ 47e7-xen6)
垢版 |
2023/11/30(木) 20:26:04.69ID:SvZ2/mZg0
>>143
そっちのほうが余計なギミックじゃない?
a[]のアドレスが欲しければ&aと書くだけでいいのに
aが自動的にa[]の先頭番地になってしまうからややこしい
ちなみにBASICだと配列と同名の単純変数が作れてしまいこれも今思うと無茶苦茶だった
0147デフォルトの名無しさん (アウアウウー Sa0b-6V65)
垢版 |
2023/11/30(木) 20:47:46.07ID:h/B+JtY5a
完全に理解した!!!

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;
}

説明してみ
0148デフォルトの名無しさん (アウアウウー Sa0b-6V65)
垢版 |
2023/11/30(木) 20:51:51.20ID:h/B+JtY5a
アンカ忘れた
>>140
0149はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-zy57)
垢版 |
2023/11/30(木) 21:26:27.48ID:3QI4e6Tt0
>>145
あくまでも言語仕様の理屈で言えばこうだという説明なのでその言語仕様が良いかどうかの意見は含んでないよ。
色々とアレな部分も多いってのは文句つけても仕方がないいまさらな話だし。
0150デフォルトの名無しさん (ワントンキン MM3f-XlNP)
垢版 |
2023/11/30(木) 22:06:24.41ID:wy49Mw9yM
いやいや何を言っとんの?
利便性のためにそういう仕様にしてるんだよ
C書いてりゃさすがに分かんだろうよw
0153はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
垢版 |
2023/12/01(金) 00:42:09.23ID:U5xjJXbM0
sizeof の結果の型は size_t で、
size_t は符号なし整数というだけしか規定されていない処理系定義なんだけど
unsigned int や unsigned long int の別名として定義されていることが多いせいで
それをあてにした形で説明している資料は割とある。
0154デフォルトの名無しさん (ワッチョイ 5fad-F3mB)
垢版 |
2023/12/01(金) 02:30:56.67ID:oKQshtme0
>>145
> a[]のアドレスが欲しければ&aと書くだけでいいのに
俺はそっちのほうがややこしいと思うけどな

むしろ*(a+10) を [] で表現するなら *a[10] みたいな書き方になるほうが、理解する上ではややこしくなかったかなとは思うけど(使う上では不便)

[] って箱(マス)に見えるし、まあ直接箱の中身を示すものなのだなって覚えたけど
0157はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
垢版 |
2023/12/01(金) 14:51:35.53ID:U5xjJXbM0
>>145
配列 a に &a としたときに得られるのは配列を指すポインタであって配列の先頭要素を指すポインタではない。
(型が違う。 アドレスを数値として見たら同じはずだけど。)

多次元配列にアクセスするとき (添字演算子を重ねて適用するとき) に仕様の通りに解釈していくと配列と先頭要素が都合よく切り替わって最終的にポインタ演算になるのが実に上手いこと出来てる。
配列の要素にアクセスするときの記法を現状のような形にするという前提でならなんだかんだでよく出来ている。

配列に & を付けたら配列を指すポインタになるというのは例外的ではない普通の挙動だからそこに別の意味を割り当てるならそれもやっぱり変則的なややこしい挙動ってことになってしまうよ。
0159はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-d+hN)
垢版 |
2023/12/01(金) 19:23:36.92ID:U5xjJXbM0
>>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);
}
0160デフォルトの名無しさん (ワッチョイ 65d3-WD8q)
垢版 |
2023/12/05(火) 07:30:58.43ID:72+QzLj/0
c言語初心者です
質問させてください

FILE *fpという宣言の「FILE」にどういった役割があるのでしょうか
*fpは関数によってどこを読み書きするかを指定するためにアドレスを格納することは分かるのですが
それならばint型のポインタで良いような気もします
プログラムを書く上でどうでもいい内容なのですが教えていただければ今日の寝付きが良くなる気がします
0162デフォルトの名無しさん (スフッ Sd0a-Oc+E)
垢版 |
2023/12/05(火) 08:16:33.53ID:64vzQPx0d
>>160 FILE構造体っていうことだけは、どの本にも書いてある。
0163デフォルトの名無しさん (ワッチョイ 66d6-8IwF)
垢版 |
2023/12/05(火) 08:26:33.63ID:Sjl8/rh40
実際UNIXのfile descriptorはintでWindowsのファイルハンドルHANDLEはvoid*だ。
こいつらはシステムコールによってカーネルモードで操作されるから中身が完全に見えないようになってる
それとは違って標準Cライブラリはユーザモードで動作するから
処理系依存で中身を操作してもいいように作ったのかもしれない
0164デフォルトの名無しさん (スッップ Sd0a-Cw2Y)
垢版 |
2023/12/05(火) 08:33:57.88ID:GHHZLCc/d
>>160
確かに構造体の中身を使わないかぎり何のポインタでもいいんだけど
間違えて他のタイプへのポインタと混同した時にエラーが出るから気づきやすい
それはけっこう重要だよ
0165デフォルトの名無しさん (ワッチョイ 65d3-WD8q)
垢版 |
2023/12/05(火) 09:00:17.71ID:72+QzLj/0
>>160です
普通の構造体の宣言とは異なり要素の記述はありませんが
「FILE」とは「ファイル構造体を使うよ」と宣言しているという意味で
そうしてstdio.h上のFILE構造体の要素に開いたファイルの情報が代入されていくということでしょうか?
「FILE」を記述せずにfopenで開こうとした場合構造体メンバのptrに代入されている数値が使えないのでfopenから戻り値が受け取れず正しく*fpに座標が代入されない
みたいな
そして開くだけならfopenでも開けてしまうとか
0166はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03)
垢版 |
2023/12/05(火) 10:08:56.47ID:z5PiblaY0
言語仕様的に見れば FILE はストリームを制御するのに十分な情報が入ったオブジェクト型であることと、
アドレス (FILE 型のオブジェクトがある場所) に意味がある場合もあるから
オブジェクトをコピーして機能するとは限らないという程度のことしか書いてない。

FILE にどのような情報が格納されているのかといったことや
詳細な仕組みはホスト環境の事情に合わせて処理系の裁量で決めてよい部分なので、
具体的にどうなっているのかは各実行環境・開発環境ごとに違う。

特に環境依存の細かい部分に立ち入って制御をしたい事情があるのでない限りは
fopen が「なんらかの方法」で FILE 構造体を構築してそのアドレスを返すものであるということだけ知っていれば
普通のプログラマにとって十分なように出来ている。
0167デフォルトの名無しさん (ワッチョイ 8ac1-Vvnv)
垢版 |
2023/12/05(火) 10:36:22.34ID:NYBtRI3Y0
>>165
3行目から4行目の理解で大体あってるよ
それ以降は何言ってんのか分かんねーから全部アタマの中から破棄していいよ

正確にはFILEってのは抽象データ型であんたは構造体って言ってるけど構造体かどうかは分からんし使う側は知る必要もない
提供者がわざわざ抽象型にして使い手側の負荷を下げてくれるとこを中身がどうとか役割がどうとかさぐんのは筋が悪いんだよ
使えって言われてんだから何も考えずにだまって使えばいいよ
0169デフォルトの名無しさん (ワッチョイ 71cf-L1V1)
垢版 |
2023/12/05(火) 12:35:58.10ID:4VzMioa/0
FILE*経由だとバッファリングされるから、バッファーのポインタとそこに含まれてるデータサイズも含んでいるだろう
そもそもファイルのシーク位置も含まれてる
まとめると
・ファイルディスクリプターやファイルハンドル
・シーク位置
・バッファー(ポインタ、サイズ、含まれてるデータサイズ)
となるかね
0173はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03)
垢版 |
2023/12/05(火) 17:48:30.74ID:z5PiblaY0
パイプのインターフェイスをストリームとして開くことが出来るから
適当なスレッドを開いてパイプの受け取り口で受け取った情報を好きなように加工するようにすれば、
パイプに書込む側ではストリームに書き込んだらいい感じに処理してくれるように見える。

というのを Windows でやっているのをどっかで見た。
0174デフォルトの名無しさん (スッップ Sd0a-Cw2Y)
垢版 |
2023/12/05(火) 18:11:37.45ID:GHHZLCc/d
>>165
開くだけで何が楽しいんだ?
読み取りも書き込みもクローズもできない
exitで自動的にクローズはされるけど…

>>163
HANDLEはポインタではなくただの整理券番号で実体は整数値だ
しかしWindows SDKでは「架空の構造体へのポインタ」として定義されているので例えばウィンドウハンドルをファイルハンドルと混同するとType mismatchエラーになる
これはかなり有用な仕組みでC言語が仕様に組み込んでほしいくらい
0177デフォルトの名無しさん (ワッチョイ 65a4-WD8q)
垢版 |
2023/12/06(水) 08:34:18.09ID:hjosWl9s0
>>160です
皆さん大変参考になりました
今日はよく眠れそうです
0182はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 656a-1gjz)
垢版 |
2023/12/06(水) 21:19:13.20ID:+44Bjs460
fflush の場合は全てのストリームを対象とするという特別なフラグとして NULL を活用しているので無効なポインタとしての NULL とは事情が違う気がするね。
それにしたってNULL を多義的に使っているという意味では一貫性はないけど。
0183デフォルトの名無しさん (ワッチョイ 9140-JrwL)
垢版 |
2023/12/06(水) 21:23:39.94ID:bAVe0RWP0
free(NULL)は、おバカなマの為に特別に許容したんだろ
0184デフォルトの名無しさん (ワッチョイ 65a4-WD8q)
垢版 |
2023/12/07(木) 02:17:45.58ID:NYiehhGh0
以前ネットでおすすめされていた「苦しんで学ぶc言語」の内容をしっかり理解する段階まできたのですが、次は何をすれば良いのでしょう。
猫でも分かるプログラミングも読んでみたのですが仕様が古すぎてトレースできないのと、私には作者さんの文章の作りが合わず困っています。

まずは簡単なソフトを作りながら学べればと思います。
入門書の次に読めるような本と、そこからアプリケーション開発のイロハが分かる本やサイトを教えていただけないでしょうか。
0186はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 656a-1gjz)
垢版 |
2023/12/07(木) 08:27:05.09ID:wi0prF2i0
Cで現実的なアプリケーションを作るならホスト環境 (OS など) の事情は無視できないし、具体的な目標なく道筋は決まらないと私も思う。
何の情報もない他人に何かを勧めるというのはしづらい。
目標があるならその分野の既存のコードを「読む」という体験はためになるかもしれない。
実際のコードを見て意味がわからない部分があれば学習が必要な部分だというとっかかりになる。
0187デフォルトの名無しさん (ワッチョイ 6646-wNAC)
垢版 |
2023/12/07(木) 09:28:19.84ID:++8K4NmJ0
>>184
> 「苦しんで学ぶc言語」

というのは、これ↓ ?

https://9cguide.appspot.com/index.html
> 苦しんで覚えるC言語

であれば文法解説のようなので、ファイル操作をしてはどう?
cat コマンドを作るとか。
0188デフォルトの名無しさん (ワッチョイ 65ff-WD8q)
垢版 |
2023/12/07(木) 10:04:58.60ID:NYiehhGh0
>>186
Windowsソフトを制作して当方の業務を効率化できればと考えています。
「既存コード」を読むですか、なんだか英語学酒のようで気が滅入りますね>
>>187
失礼しました。「覚える」でしたか。
ファイル操作がどこまでを指すのかわかりませんが高低水準入出力はすでに可能です。
0190デフォルトの名無しさん (ワッチョイ 1163-8qzv)
垢版 |
2023/12/07(木) 10:31:24.83ID:HPax2zCP0
ファイル操作の課題出してあげようか
指定した二つのDirにあるファイルを同期させる
単にコピーするのではなく、タイムスタンプの新しいものだけをコピーする
新しいSubdirできていたら、中味があればDirごとコピーする
とりあえずは、新しく作られてファイルの同期まで、
削除については考慮しなくて良い
0193デフォルトの名無しさん (ワッチョイ 71cf-Gt6m)
垢版 |
2023/12/07(木) 11:56:53.00ID:QzDrEJVi0
>>184
CはOSのAPIを直接叩けることがメリットでもあるので、Linuxのプログラミング本を読んでコード書いてみるのが一番良いだろう
マルチプロセス、マルチスレッド、ソケットとか覚えるべき事は沢山ある
Cでやれば根本から理解出来る
0194はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-1gjz)
垢版 |
2023/12/07(木) 12:04:11.70ID:FWY3NSUg0
(事務作業などの?) 業務効率化が目的なら Power Automate Desktop の活用を考えた方がいいと思う。
効率化の最初の段階は解決すべき問題を見つけることで、これをきちんと一度で洗い出すのは大抵の場合に出来ない。
雑に作って運用しながら改善するという手順をとるのがのぞましいが、 C で書くとそういう柔軟な体制がとりづらい。
0196デフォルトの名無しさん (ワッチョイ 65ff-WD8q)
垢版 |
2023/12/07(木) 13:42:19.21ID:NYiehhGh0
>>90
そういった事もできるんですねー
>>191
取り組みたいのは山々なのですがuiの作り方からわからないので入手できるバーションで解説されている書籍が欲しいところです。
>>192
基礎を大切にしたいのでcをはじめのうちは使っていきたいと考えています。
>>193
仰る通り根本を理解できればと思います。Linux本ですね。可能であれば簡単なものでおすすめを添えていただけないでしょうか。
>>194
グラフィック系のソフトを使う上で不便なところを楽したい、と言いますか
とにかく画像表示や文字列表示から進めていきたいと考えています。
前述の通り基礎を理解したいので可能であればcで作成したいのです。
0199デフォルトの名無しさん (アウアウウー Sa21-wVFe)
垢版 |
2023/12/07(木) 14:18:01.05ID:wNl2TimYa
C++は変な癖がつく
Cの方が絶対良い
0203デフォルトの名無しさん (ワッチョイ 71cf-Gt6m)
垢版 |
2023/12/07(木) 16:19:14.82ID:QzDrEJVi0
>>196
自分はUNIX Cプログラミング(いわゆるライオン本)で勉強して、めちゃくちゃ為になったけど、さすがにこれは古すぎる
詳解UNIXプログラミング 第3版は間違いのない名著
ふつうのLinuxプログラミング 第2版はLinux向けだし初心者向け
Cで仕事をするようにはならないかもだけど、「ふつうの~」を理解出来て自分のものにすることがCを学ぶ意義だな
0204デフォルトの名無しさん (ワッチョイ 66ab-XaJC)
垢版 |
2023/12/07(木) 16:23:44.20ID:5AmCTrxW0
>グラフィック系のソフトを使う上で不便なところを楽したい
ソフト側でスクリプト等がサポートされてなければ
できることは連続するショートカットを 1プッシュでまとめて出す
キーロガー&再生系とか Joy2Key みたいなキーコード送出系ぐらいしか思い浮かばん
0205はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03)
垢版 |
2023/12/07(木) 17:03:32.49ID:FWY3NSUg0
>>196
具体的に対象になってるソフトの名前は言える?

モダンな設計の Windows 用ソフトが外部から制御するために公開するインターフェイスは
Component Object Model の技術をベースにしていることが多くて、
高度な開発環境の補助を得ながら使う分には便利なんだが
C から使おうとするとすごく面倒くさい。 (出来なくはないけど。)

ソフトが外部に対してインターフェイスを公開するのではなく
制御用のスクリプト言語を内蔵している場合もあるので
C でのプログラミングに詳しくなってもあまり役に立たないこともある。

もしも外部に対してインターフェイスを用意していないなら
ボタン操作のイベントを発生させるとかして制御する (つまりまさに人がする操作を代行させる) ということも可能だが、
それを可能にするような基礎技術というか Windows の動作モデルを理解したいのなら
「猫でもわかるWindowsプログラミング」はそれなりに有用だと思うよ。
私は書籍を読んだことは無いけどウェブ版は Windows がイベントを伝播させて操作させる構造を理解するのに十分な記述はある。

だけど、人が操作するときに Windows の中で何が起こっているのかを
初心者が根本から理解してきちんと使いこなせるまでになるハードルは割と高めなんだよ……。
Power Automate Desktop なら技術の根本を理解せずともそれが出来るようになってるし、
マイクロソフトが直接に提供していてしかも無料という神ソフトなのでオススメした次第。
UWSC とか AutoIt なんかも人気があるね。
0206デフォルトの名無しさん (ワッチョイ c55f-tBUZ)
垢版 |
2023/12/07(木) 17:15:58.47ID:ggcXWkJv0
関数のサイズというのは、関数の引数のサイズと同じと考えて良いのでしょうか?
中身に1万行使ってる関数があるとして、その1万行は関数のサイズとは全然関係ないんでしょうか?

構造体はなんとなく変数のバイト数の足し算なんだなってわかるけど、関数がピンとこないです・・・
0208はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03)
垢版 |
2023/12/07(木) 17:34:07.95ID:FWY3NSUg0
>>206
関数をデータとして扱うことはないので「大きさ」は定義されない。
C の言語仕様的には「関数はオブジェクトではない」という扱い。

関数に対して呼び出し以外の操作をする方法はない。
関数ポインタで関数の場所を指すということは出来るが、
型システム的にちょっと特殊な扱いになっていて関数ポインタ経由で値を取り出したりも出来ない。

もちろん実際にはなんらかの形でメモリ上には存在するし、
長いプログラムは大きい可能性が高いけど。
実際にどうなってるのかは生成された機械語を見ればいいんでね。
0209デフォルトの名無しさん (ワッチョイ 915b-rn9t)
垢版 |
2023/12/07(木) 17:41:37.50ID:VEE9aIzl0
>>206
質問文が謎すぎて、何を聞きたいのか解釈できない

関数のサイズって言ってるのがビルドしてできた実行ファイルのファイルサイズの事なら、コードの量が多ければ当然サイズは大きくなる
0210デフォルトの名無しさん (ワッチョイ c55f-tBUZ)
垢版 |
2023/12/07(木) 17:41:59.31ID:ggcXWkJv0
>>208
ポインタのアクセス条件でメモリのサイズ・型が明確になっていること
とあったので、関数ポインタもサイズや型が明確でないといけないなら
ちゃんとわかっとかないといけないと思ったのですが、関数の扱いはわかってる人から見ても特殊なんですね
ありがとうございます
0211デフォルトの名無しさん (ワッチョイ 1ec3-yDrh)
垢版 |
2023/12/07(木) 18:04:20.91ID:Kvlx+aNw0
>>206
あなたはどういう文脈で「関数のサイズ」が気になった・話題になったの?プアな組み込みとか?
俺は「関数のサイズ」が気になった・話題になった覚えがない
まぁコンパイル後のコード量かなぁ、関数の行数は大きく関係する
引数はスタックに積むけど「関数のサイズ」とは言わない気がする
0212デフォルトの名無しさん (ワッチョイ 66ab-XaJC)
垢版 |
2023/12/07(木) 18:19:55.87ID:5AmCTrxW0
サイズ云々は
インクリメントしたときにどんだけ(何バイト)進むのかが確定してる型でないとポインタにならない
→ じゃ関数ポインタって 関数のサイズ(≒ コンパイル後の機械語化されたバイナリのサイズ) を知ってるのか?

こういう思考の流れかな?
0214デフォルトの名無しさん (ワッチョイ 8a71-yDrh)
垢版 |
2023/12/07(木) 19:46:05.37ID:Avn/NPEq0
>>213
その状況で必要になるのは関数のサイズじゃなくて関数ポインタのサイズや
それは他のポインタと同じ、64bitPCなら8バイト

仮定の話として、もし「関数ポインタの配列」ではなく「関数の配列」が作成できるような言語仕様にするなら、関数のサイズも決めないといけなかっただろうね
0216デフォルトの名無しさん (ワッチョイ 9140-JrwL)
垢版 |
2023/12/07(木) 21:12:50.21ID:fQltjmnX0
void*使えるやん
0217デフォルトの名無しさん (ワッチョイ 65ff-WD8q)
垢版 |
2023/12/07(木) 21:34:16.53ID:NYiehhGh0
>>203
ありがとうございます。
>>204
メインのソフト除いて二窓三窓しているので欲しい機能だけ載せたソフトを自作したいなと。
>>205
204へのレスと同じです。
猫でも分かるは説明していない単語が出てきたり、UI作成の手順をトレースできなかったり
わからない人向けではなく分かる人向けの解説のようで個人的には合いませんでした。
0218はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 656b-1gjz)
垢版 |
2023/12/08(金) 03:48:38.29ID:tzfGEsy80
>>216
関数ポインタは void* に格納可能であると保証してないし、関数ポインタがオブジェクトを指すポインタより大きかったり表現が異なっていたりする環境はある。
出来る環境でなら使うのが悪いわけではないけど移植性は犠牲になる。
0222デフォルトの名無しさん (スップ Sdea-b4p5)
垢版 |
2023/12/08(金) 07:57:53.16ID:m+qJyEe4d
関数のサイズは関数のポインタをアドレス順にソートすれば求められる
そのサイズ分を実行可能領域にコピーすれば当然実行もできるよ
dllインジェクションとかでたまに使われる
0224はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03)
垢版 |
2023/12/08(金) 09:53:49.26ID:B2zBKDAb0
>>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 プログラミングを支援したい気持ちはあるがそれがしんどい場合も多いってことも知ってる。
個人事業なら趣味と兼ねるのもアリかもしんないけど。
0225デフォルトの名無しさん (ワッチョイ 6646-wNAC)
垢版 |
2023/12/08(金) 10:13:43.24ID:20YRNN5F0
>>224
Cコンパイラに、C++ -> C トランスレート機能あるの?
0226デフォルトの名無しさん (ワッチョイ 66ab-XaJC)
垢版 |
2023/12/08(金) 10:26:10.76ID:vLixVDpZ0
API はほとんど C インターフェースで
C++をベターCとして利用してて C++のクラスの機構はほぼ使ってない

(GDI+ とかAPIがはなっから C++ インターフェースの奴は別)
0227デフォルトの名無しさん (ワッチョイ 9140-JrwL)
垢版 |
2023/12/08(金) 10:34:54.49ID:faKtyhh20
>>218
ねえよ
0233デフォルトの名無しさん (ワッチョイ 6548-WD8q)
垢版 |
2023/12/08(金) 12:03:08.97ID:7hcazM9a0
>>224
兼任ですが個人事業主でお金と時間はそれなりに自由に使えます。
3〜5ヶ月くらいはまとまった時間を取ることも可能です。
公式チュートリアルは参考にはなりますが読みやすいかと言われると微妙ですね。

知識はもちろん身につけたいのですが、そこまでの道筋は他人のコードを読む方がやはり良いのでしょうか?
書籍やサイトなどでアプリの形になるまでのチュートリアルなどは無いのでしょうか。
0235はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03)
垢版 |
2023/12/08(金) 13:05:38.60ID:B2zBKDAb0
>>233
何を学べば良いかすらわからないときのとっかかりとして
他人のコードを読む (何がわかってないかはわかる) ことを勧めたまでで、
良い資料があるならそれを読むにこしたことはないよ。
良い資料がないことも多いという現実はあるけど。

私は公式チュートリアルは良いほうだと思う。
知らないことを書いてあるんだからある程度は読みづらいこともあるのは当たり前のことで、
どれを読んだって似たようなもんじゃないかな。
専門的な内容をスラスラ読めるほうがおかしいでしょ。
0237デフォルトの名無しさん (アウアウウー Sa21-/D3x)
垢版 |
2023/12/08(金) 13:15:41.58ID:o54AonyOa
>>206
関数もメモリにロードされるのわからず?
関数はただのマシンコードなんだからここから始まりますよ、というラベルがついてるだけだぞ
そして呼ばれた時はそこへジャンプするだけ
関数ポインタはそのマシンコードのラベルのアドレスを保持しているだけ
ポインタ以前にコンピュータの仕組みからやった方が良さそう
プログラム格納方式とか聞いたことない?
0240デフォルトの名無しさん (ワッチョイ 9140-JrwL)
垢版 |
2023/12/08(金) 15:42:45.24ID:faKtyhh20
だからねえよ
そいつが勘違いしてるか、使い方が悪いかだろ
0241デフォルトの名無しさん (ワッチョイ 5df0-/D3x)
垢版 |
2023/12/08(金) 16:03:05.13ID:abnVL6FT0
>>206
構造体もプログラムからしたらただのメモリ領域の塊だぞ
そこに変数とかいう概念はない
構造体のメンバのオフセットでその位置を指定して書き込んだり読み込んだりするだけ
その時のオフセットの計算に利用されるのが型
変数宣言すると構造体全体サイズのメモリ領域がスタックに確保される
mallocで確保されるとヒープに確保されてそのアドレスが返る
ただそれだけ
0242デフォルトの名無しさん (アウアウウー Sa21-wVFe)
垢版 |
2023/12/08(金) 16:08:12.70ID:k3Bpg+TDa
関数を malloc で確保するにはどうすれば良いですか?って言いそう
0243デフォルトの名無しさん (ワッチョイ 5df0-/D3x)
垢版 |
2023/12/08(金) 16:21:49.56ID:abnVL6FT0
ちなみにメモリにロードされた関数の領域は現代のOSならば当然ながらアクセス不可能
昔はプログラム領域にアクセスできてその中のコードを動的に書き換えるという荒技をやってた人もいるらしいが
0244デフォルトの名無しさん (ワッチョイ 5df0-/D3x)
垢版 |
2023/12/08(金) 16:24:27.68ID:abnVL6FT0
ちなみにメモリ領域にマシンコードを生成してそのメモリ領域のマシンコードを即時実行するということはできる
これをJITという
最近のスクリプト言語ではこの手法がかなり用いられている
やり方は普通にメモリにマシンコードを生成して実行可能属性を付加、各種CPUキャッシュをクリアしてから
関数ポインタにキャストして実行するだけ
0248はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03)
垢版 |
2023/12/08(金) 17:24:04.59ID:B2zBKDAb0
>>247
許可を与えないと実行できないから問題にならないよ。
許可を与えられる前には実行できないんだから
外から注入されたものが自分で許可を出すということは出来ない。
0249はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03)
垢版 |
2023/12/08(金) 17:24:33.32ID:B2zBKDAb0
>>247
許可を与えないと実行できないから問題にならないよ。
許可を与えられる前には実行できないんだから
外から注入されたものが自分で許可を出すということは出来ない。
0253デフォルトの名無しさん (ワッチョイ eaad-snvD)
垢版 |
2023/12/08(金) 20:41:26.51ID:Bb4hYLfH0
>>252
それはつまり「身内じゃないから動かない」なわけで身内も信じちゃまずいにはならんわけよ
>>249ではちみつ先輩が言っているのは「許可されたものは動く」なわけで
管理者が許可したものは動くし許可しなければ動かない

たぶん「許可したプログラムが許可してないコードを実行したらどうすんの?」ってことだと思うけど
そんなプログラムを許可した時点で間違ってる
0254はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03)
垢版 |
2023/12/08(金) 20:48:50.56ID:B2zBKDAb0
???
私の理解だと >>247 は「機械語をその場で生成して即時実行するのって危なくないの?」という話だと思ってたんだけど違うの?
そういう理解だったから実行の許可を出す (メモリの実行可能属性を ON にする API を呼び出す) ことなく実行できない、
プログラマの意図しない実行は防がれるということを応えたつもりだったんだけど、運用の話なの???

「身内」ってのは「プログラムの中での機械語生成にミスったらめっちゃ暴走するやん?」という意味かと思ったけど
運用にかかわる人物という意味?
0256デフォルトの名無しさん (スップ Sdbf-MP5X)
垢版 |
2023/12/09(土) 07:42:54.58ID:Z2D8kHNzd
>>250
それなら自作のプログラムをコンパイルして実行できる環境がすでにまずいだろw
パソコンをゲーム機みたいにしたいのかい

読み書きできるメモリを実行可能属性にできるというだけで
書き込み不可能なシステムメモリに書き込めるようにできるわけではない
0257デフォルトの名無しさん (ワッチョイ ff46-vhj2)
垢版 |
2023/12/09(土) 08:06:29.62ID:NnZXyC0n0
本日のWebは、
・帝乃三姉妹は案外、チョロい。 → 本誌で既読
・レッドブルー → 本誌で既読
・からかい上手の高木さん → ゲッサンで既読

どうにかしてよ、A立。たとえば響5巻無料Webでもとか。

そういえば、高木さんの人の将棋のやつ、マガポケでも終わったね。
0258デフォルトの名無しさん (ワッチョイ 97cf-TEND)
垢版 |
2023/12/09(土) 08:12:11.03ID:zYR2UmFI0
いわゆるroot権限が必要な行為は実行出来ないね
でも、mprotectの説明によると
> 注意
Linux では、(カーネル vsyscall 領域以外の) 任意のプロセスアドレス空間において mprotect ()を呼び出すことが、常に許されている。
となってるから、Node.js(node)とかJITを行うプログラムがユーザー権限で動くのだろう
単に利便性の為だろう
0259デフォルトの名無しさん (ワッチョイ 9f07-h0RM)
垢版 |
2023/12/12(火) 20:44:31.35ID:3wiw5swR0
staticグローバル変数を含んだ動的ライブラリーを動的リンクをする場合はグローバル変数が初期化されるのはmain実行前の認識です。
同じプロセス内で再度初期化したい場合は別途初期化の関数を用意してないと不可能でしょうか?
動的ロード(dlopen)を使用した場合はdlcloseして再度dlopenした場合は初期化されますか?
0261デフォルトの名無しさん (ワッチョイ 17f1-tASO)
垢版 |
2023/12/12(火) 21:15:07.81ID:6C/zc+S/0
明示的に初期化処理を書くのが吉
0262デフォルトの名無しさん (ワッチョイ d701-Qbcu)
垢版 |
2023/12/12(火) 21:58:30.38ID:bMo3JLCK0
>>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
0263デフォルトの名無しさん (ワッチョイ 9f07-h0RM)
垢版 |
2023/12/12(火) 22:04:40.47ID:3wiw5swR0
>>261
ですよねぇ
数十万のレガシーコードで、リセットするにはプロセスのキルが前提なんだけど、移植対象のシステムはプロセスをキルできないので、なんとかリセットする方法はないかと…
0264デフォルトの名無しさん (ワッチョイ 17f1-tASO)
垢版 |
2023/12/12(火) 22:10:06.55ID:6C/zc+S/0
初期値代入くらい書くだろ普通
処理系によっちゃ不定な値から始まったりするのを防ぐ為にさ
0265デフォルトの名無しさん (ワッチョイ 9f07-h0RM)
垢版 |
2023/12/12(火) 22:18:02.98ID:3wiw5swR0
>>262
検証ありがとう
自分の環境でも試してみます
0266はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5705-ZkkM)
垢版 |
2023/12/12(火) 22:18:21.71ID:Kje9ktjN0
>>259
RTLD_NODELETE フラグで再初期化を止められる(というよりアンロードを妨げるのだけど)ので逆に言えば特に指定しなければ再初期化はされるのが通常動作という解釈でいいと思う。

>>263
わかってるだろうけどレガシーコードをそうやって延命させるとますますワヤになるでよ。
0267はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5705-ZkkM)
垢版 |
2023/12/12(火) 22:39:58.31ID:Kje9ktjN0
>>264
言語仕様的にはグローバル変数 (記憶域期間が static) が不定になったりはしないことになっている (初期化子がなければゼロで初期化する) のでまともな開発環境があるところではそんな心配はしないよ。
心配が必要になるほど不確かな処理系しかない (または初期化処理も自分でかかなきゃいけないような低レイヤ) 分野もあるのは知ってるけどそれが普通ってことはない。
0269はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-ZkkM)
垢版 |
2023/12/12(火) 23:55:24.16ID:skpldDGw0
>>268
そういう意味で言ってたのならわかる。
「どうして元から代入する処理を入れてなかった?それが普通だろ?」というニュアンスで受け取ってたから元は dlopen しなおしで対処する想定ではなかったからそういうことを心配してなかった (する必要がなかった) という反応になった。
0274デフォルトの名無しさん (ワッチョイ e34d-e8vO)
垢版 |
2023/12/17(日) 19:32:39.54ID:MfQY7qyQ0
>>273
0275デフォルトの名無しさん (ワッチョイ cb62-dXDU)
垢版 |
2023/12/17(日) 22:10:52.33ID:UmzU+/ux0
シャローコピーはディープコピーと並べて語るときに区別するための用語であって、
代入は普通に代入と呼ぶのが、コミュニケーションにおいて適切だ、
と、自分が聞かれた場合なら答えるし、レビュー依頼された場合なら指摘します
0276デフォルトの名無しさん (ワッチョイ e34d-e8vO)
垢版 |
2023/12/18(月) 00:59:34.37ID:Mvyif4Hn0
>>275
シャローコピーと言えると思いますか?
0277デフォルトの名無しさん (ワッチョイ e34d-e8vO)
垢版 |
2023/12/18(月) 00:59:46.13ID:Mvyif4Hn0
指摘する前に答えろよ無能
0280デフォルトの名無しさん (ワッチョイ 16ab-zIzn)
垢版 |
2023/12/18(月) 09:38:52.52ID:RUscEa1Z0
シャローコピーの要件からすると
ポインタ変数にアドレスを代入するだけでは成立せずに
リファレンス可能なオブジェクトを指してるポインタでないとまずい気がする

char *p = (char *)0x000; /* アドレスを代入してるぞ */
0283デフォルトの名無しさん (ワッチョイ efc0-UNLj)
垢版 |
2023/12/18(月) 10:54:27.09ID:PYgWDYAB0
いやそれぬるぽ
0284デフォルトの名無しさん (ワッチョイ d663-/1Gs)
垢版 |
2023/12/18(月) 12:07:36.53ID:ccgmPeZz0
>>281
ファイルシステムや仮想記憶とか、コピーオンライトといって、書き込みが発生するまでは単なる参照先のコピーだけでコピー完了としてしまう
要するに何をもってコピーかを、先ずは定義してくれ
0287デフォルトの名無しさん (ワッチョイ 12ad-9NgZ)
垢版 |
2023/12/18(月) 14:52:23.89ID:kcYk1zSZ0
>>271
言えると思う。
0288デフォルトの名無しさん (スフッ Sd32-3CSV)
垢版 |
2023/12/18(月) 16:19:13.36ID:xiaHc48Fd
内容が値を表すメモリの位置 = オブジェクト
0289デフォルトの名無しさん (ワッチョイ cb62-dXDU)
垢版 |
2023/12/18(月) 17:05:11.17ID:pYYMlhZJ0
>>276
「言わない」

代入をシャローコピーだとか言ってなにか騒いでる人があなたの周りにいるという話?なら、そいつバカだからあなたは相手にしなくていいよ。あなたはもっと大事な問題に取り組むべき
0296デフォルトの名無しさん (ワッチョイ 4b46-AQ+F)
垢版 |
2023/12/19(火) 08:23:42.15ID:ijJJQ5/r0
>>295
そういうコトなら、>>271
アドレスを代入演算した結果を、シャローコピーと言えるか、
という質問じゃないの?
0297デフォルトの名無しさん (スププ Sd32-3CSV)
垢版 |
2023/12/19(火) 09:34:26.09ID:+6PK9xZxd
シャローコピーとかディープコピーとかはもともとPythonの概念ですよね?
0298デフォルトの名無しさん (ワッチョイ 2701-NGr8)
垢版 |
2023/12/19(火) 09:54:57.24ID:hCROhcq70
は?
0300デフォルトの名無しさん (ワッチョイ 77cd-UNLj)
垢版 |
2023/12/19(火) 10:07:03.49ID:KoTx3gw20
コピーとクローンは違うよな?
0307デフォルトの名無しさん (スププ Sd32-Hm2B)
垢版 |
2023/12/19(火) 15:01:13.02ID:+6PK9xZxd
Pythonの解説書には大概、ディープコピーとシャローコピーが載ってますよ
0308はちみつ餃子 ◆8X2XSCHEME (ワッチョイ d23e-/274)
垢版 |
2023/12/19(火) 15:28:24.33ID:J0ExAcTK0
>>305
もちろんそういう状況を扱っている事例は数多くある。
ただ、ざっと見た感じでは古いマニュアルでは「再帰的」とか「共有」とかいった語で説明するのが普通っぽい。
深い/浅いといった言い方が発生したのはもっと新しい言語でのことだと思う。
0310デフォルトの名無しさん (ワッチョイ 77cd-UNLj)
垢版 |
2023/12/19(火) 19:48:51.51ID:KoTx3gw20
つか、Cは書いてる人にしか型が分からないからそんな器用な事は出来ないよな?
どっちのコピーも自前でちまちま作るしか無い
0312デフォルトの名無しさん (ワッチョイ cbd5-dXDU)
垢版 |
2023/12/20(水) 05:56:32.08ID:r5p/Itr10
>>310
その通りですよ

私はユーザが定義する集成型(structみたいなもの)を、PCをまたいでリモートコンピュータ上にコピーするもの(WindowsのC#とHP-UXのC)、を仕事で作った事があるのだけど、それをやるには型定義からガッツリ関わる仕組みを構築しないと無理なのよ。
自分はエクセルでやった(そして完璧にはできず特例処理だらけになった)けど、普通はDDLとか独自に作るでしょ

上の方で最初に話題出したヒトは多分、どういう問題空間でディープコピーとかシャローコピーを話題にする必要が生じるのか【すら】分かってないよ

そうだね 複オジ とか言われてた人の雰囲気と似てるね
0313デフォルトの名無しさん (ワッチョイ b74b-gvj7)
垢版 |
2023/12/20(水) 09:35:46.96ID:/uXb+00h0
UPLIFT プレミアム・サービスのお知らせ

https://uplift.5ch.net/

UPLIFT 主な特典
・連続投稿の規制を緩和します。
・スレッド作成時の規制を緩和します。
・5ch.netのスレッド表示画面に表示される広告を除去します。
・5ch.net専用ブラウザで5ch.netの過去ログを閲覧できるようになります。
・海外からのアクセス・ホスト経由からでも書き込みができるようになります。
・書き込みが規制されているプロバイダーからでも書き込みができるようになります。
・5ch.netを安定して利用できるように運営を支援できます。

5ちゃんねるを存続させるためには、皆様のご協力が必要です。

最後まで御精読いただきありがとうございました。
0315デフォルトの名無しさん (ワッチョイ 53d2-TKg5)
垢版 |
2023/12/23(土) 10:35:35.90ID:1vO40jtV0
smalltalk、凄いな!私はバートランド・メイヤーさん、すごく尊敬してます
javadocとかdoxygenみたいなシステムも、もうあの時代に彼はすでに形にして世に出してるんですよね
例外の説明とか、プログラムを契約の履行に例える話とかもそうだし、あとコメント論とかもイケてるんですよ
頭良すぎて周りが付いてくのに何年もかかってる気がする
0319デフォルトの名無しさん (ワッチョイ 43a4-BWWG)
垢版 |
2023/12/23(土) 11:41:06.10ID:PYuibGoS0
だからさ、C言語の変数や構造体内の型宣言なんてイイカゲンなんだからそう言う話ははなから無理なんだよ
0320デフォルトの名無しさん (ワッチョイ 53d2-TKg5)
垢版 |
2023/12/23(土) 11:42:27.32ID:1vO40jtV0
メッセージというか伝送パケットを作る話とかはどうですかね(皆さん興味ありますか)

タグ・レングス・バリュー形式がー、とか
バイナリvs文字列とか
(文字列にして伝送するのって遅いと思うでしょ、意外と速度okだったりします)

あと、message pack とか
0321デフォルトの名無しさん (ワッチョイ 43a4-BWWG)
垢版 |
2023/12/23(土) 11:44:11.18ID:PYuibGoS0
ゼロ(0x00)が送れないから文字列は無理
0322デフォルトの名無しさん (ワッチョイ 43a4-BWWG)
垢版 |
2023/12/23(土) 11:46:23.81ID:PYuibGoS0
経路によっては7ビット+パリティに解釈されるからバイナリは無理
0323デフォルトの名無しさん (ワッチョイ 43a4-BWWG)
垢版 |
2023/12/23(土) 11:49:57.82ID:PYuibGoS0
結局、デバイスとかハードの特性を理解する必要があるんだよね
0325デフォルトの名無しさん (ワッチョイ 43a4-BWWG)
垢版 |
2023/12/23(土) 11:57:42.36ID:PYuibGoS0
だっていまどきC言語使ってる人なんて、デバイス寄りのハードウェアコントロールとか、チープなCPUに搭載するソフトとかだろ?
0326デフォルトの名無しさん (ワッチョイ 53d2-TKg5)
垢版 |
2023/12/23(土) 11:59:57.84ID:1vO40jtV0
>>321
おっと、反応サンキュー

0x00をデータとして送るのってあるある話題ですよねw
確かに「通信全部が」文字列で、nul文字終端だとすると無理。
でも、アタマにデータサイズがあって、それからデータがある形式ならば、仮に文字列が続いてると見える中に、まるでゴミ文字みたいに0x00が入っててもokなのよ

実は今のHTTPもそうなってたはず
0327デフォルトの名無しさん (ワッチョイ 43a4-BWWG)
垢版 |
2023/12/23(土) 12:04:44.24ID:PYuibGoS0
>>326
途中のコードに文字列操作を一切使わないならいいが
改修はいって文字列操作する人が居たらアウトだよね?
0328デフォルトの名無しさん (ワッチョイ 43a4-BWWG)
垢版 |
2023/12/23(土) 12:09:04.65ID:PYuibGoS0
最初からunsignd charのポインタとサイズを構造体にして扱えば良いだけ
0329デフォルトの名無しさん (ワッチョイ 53d2-TKg5)
垢版 |
2023/12/23(土) 12:09:04.99ID:1vO40jtV0
大昔は7ビットしか通らない経路あったねw
5baseとかの時代でしょうか

今は、8ビットを8ビットで伝送するほうが稀でしょうね
8ビットを10ビットで符号化することで、ゼロやイチが連続する数が少なくなるようにすることで、データ自体でタイミングを取れる方法をIBMが発明したとかで
だからこんなに速くなったそうです
0330デフォルトの名無しさん (ワッチョイ 53d2-TKg5)
垢版 |
2023/12/23(土) 12:13:58.12ID:1vO40jtV0
>>327
多分あなたの危惧が伝わってないです
改修案件でバグを作り込んだのに動作確認せずリリースしてしまうっていう事なら、工程管理ができてないって話でプロとしてダメ

メッセージ形式の仕様とは関係ないですね
0333デフォルトの名無しさん (ワッチョイ 43a4-BWWG)
垢版 |
2023/12/23(土) 18:17:03.63ID:PYuibGoS0
>>330
安易に文字列を使う仕様にしてるとバイナリ通らないの忘れるし思わぬバグを生む原因になるから、最初からバイナリ配列にするか文字列操作関数を一切使わない様にしないとな
0335デフォルトの名無しさん (ワッチョイ 4602-UkJf)
垢版 |
2024/01/05(金) 10:30:41.51ID:ph0QLfWd0
Perlとかで利用している設定ファイルがあるのですが、
Cで書いたプログラムでも同じファイルを設定ファイルとして読み込みたいです

設定ファイルですが、このような感じです

val = abc
str1 = $val/AAA

Perlでは「$val」を展開し、str1に「abc/AAA」と設定してくれるのですが、
Cから読み込む場合は、自分で展開する必要があると思ってます

それをやってくれるライブラリや関数等、ありますでしょうか
0337デフォルトの名無しさん (スププ Sd62-Blk0)
垢版 |
2024/01/05(金) 11:38:06.91ID:VxELzJcZd
#define val abc
0338デフォルトの名無しさん (スププ Sd62-Blk0)
垢版 |
2024/01/05(金) 12:10:00.56ID:VxELzJcZd
enum { val = abc }
0339デフォルトの名無しさん (スププ Sd62-Blk0)
垢版 |
2024/01/05(金) 12:13:38.69ID:VxELzJcZd
enum の方はエラーになる
0340デフォルトの名無しさん (スププ Sd62-Blk0)
垢版 |
2024/01/05(金) 12:27:56.38ID:VxELzJcZd
#define もエラーになる
0341デフォルトの名無しさん (スププ Sd62-Blk0)
垢版 |
2024/01/05(金) 12:30:33.41ID:VxELzJcZd
#define val "abc"
0342デフォルトの名無しさん (ワッチョイ 651a-R/a6)
垢版 |
2024/01/05(金) 12:30:55.30ID:qVR6C9yQ0
>>335
そういうのをどう解決するかを自分が考えて実現するのが楽しいのに…

自分なら
設定ファイルを「環境変数を設定する」に変更して、perlもCも環境変数から設定項目を読む に変更する。
そのために
perl側を変更する権利を得る
OSに依存して良い条件
を確保する様に、喫煙所に通う
0343デフォルトの名無しさん (ワッチョイ 651a-R/a6)
垢版 |
2024/01/05(金) 12:49:25.99ID:qVR6C9yQ0
>>335
別の解決案
・Cに優しい形式(右辺を全部展開した形で、イコール前後のスペースもなし)で吐き直すツールを、perlで作る
・自分で全部Cで作る
・lex/yacc を使って軽言語解釈ルーチンを作る

それぞれデメリットがあって、質問に直接答える「そういったライブラリはあるか」に一番合ってるのが、最後のlex/yaccだけど、それは一番バカらしい答えでもある。お好きに
0346はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-slPv)
垢版 |
2024/01/05(金) 13:07:45.12ID:t0UUGhQq0
>>335
その説明では何をやりたいのか伝わってないので仕様書を書いてみて。
理想的なライブラリがあったとして、そのテストケースという形式でもいい。
曖昧模糊な要望だと説明が下手なだけでなく説明しようとしている内容が見当違いな可能性を疑う。
(いわゆるXY問題)
0349はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-slPv)
垢版 |
2024/01/05(金) 14:59:38.28ID:t0UUGhQq0
どうしても既存の設定ファイルをそのまま使いたい、それを処理できるようなものが欲しいということなら
そんな都合の良いものがあるわけない。 自分で書くしかしょうがない。

完璧にそのままのフォーマットでなくおおよそ似た機能があればよいなら
TOML とか JSON とか YAML とかの広く使われているフォーマットを採用したほうが面倒が少ない。
Perl でも C でも処理できるライブラリがいくつもあるし。

これらには変数展開のような機能はないが、
設定ファイルで動的な操作を可能にするのは問題を引き起こしやすいと考えられていて、
アプリケーション側でやるかプリプロセッサでなんとかしたほうがよい。
(強いて言えば YAML のエイリアス機能は変数のようなものとも言えるけど文字列を結合したりは出来ない。)

逆に設定どころではなくユーザーによるカスタマイズをどんどんやってもらうようなものなら
Lua とかのアプリケーション拡張言語を埋め込んでしまうという方法もとれる。
0352デフォルトの名無しさん (ワッチョイ 42ad-nK/n)
垢版 |
2024/01/06(土) 15:06:00.15ID:NPThFXTg0
$ の変数展開しかやらないなら複雑な構文解析にはならないから全部自作した方が楽なのでは?
少し楽したいなら perl に読ませて $ 展開させた文字列に変換して出力したのを C の側で読むとかね。そうすると少し楽ができる。
これの問題は perl が使えない環境では動かないことかな。
0357デフォルトの名無しさん (ワッチョイ 651a-R/a6)
垢版 |
2024/01/06(土) 21:45:36.68ID:8zwGVkiA0
で、設定ファイル、shで環境変数を設定すりゃ済む、という案に誰も反応してもらえないんだが、どうだい? windows ならcmdだろうけど

設定項目ってのは、パス文字列とか、メモリサイズとか、ほぼ固定だけどあとから変えたい場合もあろう、っていう定数だよね。環境変数ってまさにその目的だと思ってる。

ドル記号で一時値の展開もできる。Cからも簡単に読める。
0358デフォルトの名無しさん (ワッチョイ 651a-R/a6)
垢版 |
2024/01/06(土) 21:56:18.04ID:8zwGVkiA0
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箇所でズラッと並ぶと「設定項目名とハードコード値の、一覧表」風になるの。分かる?
0361デフォルトの名無しさん (ワッチョイ 651a-R/a6)
垢版 |
2024/01/06(土) 22:20:12.76ID:8zwGVkiA0
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);

とかってするとソース上で一覧表風になるでしょ。タブ文字も入れて桁そろえて。
0362デフォルトの名無しさん (ワッチョイ 627a-JKp6)
垢版 |
2024/01/06(土) 23:25:47.33ID:4fq2Cpkf0
まあ落ち着けよ 質問者はそんなこと聞いとらんだろうよ
0363デフォルトの名無しさん (ワッチョイ ff7a-dvWY)
垢版 |
2024/01/07(日) 00:35:50.01ID:yw4Ulg6E0
for(;;){
if((result = fgets(line, MAX_LEN, stream)) != NULL){
p1=result;
p3=p1+strlen(line);
p2=strtok(p1, "=");
}
}

これで、p1とp2から左辺、p2とp3から右辺が取り出せる。
$の展開は、マクロ展開処理の要領で
右辺に$があるかチェックして、あったら定義値に置き換えるという
10ステップ程度の処理でできるだろ。
0364デフォルトの名無しさん (ワッチョイ 7fb5-j9I8)
垢版 |
2024/01/07(日) 08:57:04.03ID:4P3NNejl0
>>335
>Cから読み込む場合は、自分で展開する必要があると思ってます
その通りです

>それをやってくれるライブラリや関数等、ありますでしょうか
ありません
自作する必要があります


>>363
p2=strtok(p1, "=");
スペースやタブの処理が必要
0369デフォルトの名無しさん (ワッチョイ 7fad-ipwt)
垢版 |
2024/01/07(日) 16:24:59.67ID:tTa6vFrs0
こんな方法もある。しかし $ の変数展開しかしないなら無駄な感じはするね。それだけのためにここまでするのかという。

perlembed - C プログラムへの Perl の埋め込み方
https://perldoc.jp/docs/perl/5.10.0/perlembed.pod
0371デフォルトの名無しさん (ワッチョイ 5f1f-nsdu)
垢版 |
2024/01/10(水) 17:49:56.37ID:C4OEbwTl0
>>370
そうなんだよー、真面目にやるとバカみたいに面倒なのよ

文字列リテラルの中に $ やコメント開始終了記号が入る事もあるし
コメントの中に $ や文字列開始終了記号が入る事もある

# "#"
$aaa = /* $コメント " */ "文字列/**/値";


なので、頭から読み始めて、状態を追いながら(現在の場所が 文を書く所か、コメント内か、文字列内か)読まないと、正しいファイルを正しく読めない

んで、つまんないバグを作り込んだりするの。その、もういない誰かが作り込んだつまんないバグを、別の誰かが直すはめになる。そんなの嫌じゃね?
0392デフォルトの名無しさん (ワントンキン MM16-l2AN)
垢版 |
2024/01/17(水) 13:51:26.07ID:MxPcwzaVM
以下はmalloc()で割り当てた領域を開放してポインタをヌルポインタにするマクロである

#define MYFREE(p) do {free(p); p = 0;} while(0)

このマクロに不備があるかないか、ある場合はどんな不備か答えよ
ただし処理系はANCI C準拠とし、stdlib.hがインクルードされていることとpが左辺値かつmallocで割り当てた領域を指す有効なポインタであることの2点は呼び出し側によって保障されているものとする
0393デフォルトの名無しさん (ワッチョイ 427c-kX52)
垢版 |
2024/01/17(水) 16:32:50.55ID:sbbnyjB/0
宿題は他所でやれ
0399デフォルトの名無しさん (スッップ Sd22-aNQv)
垢版 |
2024/01/17(水) 21:47:57.64ID:i5GqHIkod
>>394
たとえば
#define MYFREE(p) free(p); p = 0
と定義すると

if( 条件 ) MYFREE( p );
と書くと

if( 条件 ) free(p); p = 0;
と展開されてしまいp = 0;は条件に関わらず実行されてしまう
またこの後にelse節が続くとエラーになってしまうなど不具合の原因になる
0401デフォルトの名無しさん (ワッチョイ 2214-HXAs)
垢版 |
2024/01/18(木) 11:04:17.52ID:0zoYvNSM0
>>392
その条件下ならない
でもpが左辺値という前提がなかったら変なコトになるコードが書けるね
0402デフォルトの名無しさん (ワッチョイ 2214-HXAs)
垢版 |
2024/01/18(木) 11:04:49.16ID:0zoYvNSM0
>>400
396はゼンゼン関係ないんだけどホントに分かってんのか?w
0403400ではないが (ワッチョイ 6e46-Y4mw)
垢版 |
2024/01/18(木) 12:19:02.31ID:5g03qqC30
>>402
396 と 399 は異口同音と読んでいたが、主旨違うの?
0405はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
垢版 |
2024/01/18(木) 12:41:36.76ID:LtdZIRKJ0
二つの文が分かれてしまわないようにするだけならブロックで包めばよくて

#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 で囲むといい感じって話。
0407デフォルトの名無しさん (ワッチョイ 02ad-6zsj)
垢版 |
2024/01/18(木) 13:17:33.34ID:opxINJAy0
>>392
「せよ」ってなんだよ。何様のつもりだ?
0409デフォルトの名無しさん (ワッチョイ 427c-kX52)
垢版 |
2024/01/18(木) 22:45:02.99ID:twAiz/ys0
今どきのCならマクロじゃないといけない場合以外はinline使え。
0410はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
垢版 |
2024/01/19(金) 08:59:45.95ID:vjpbBz8R0
>>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);
}

みたいなことをして正しく動作する保証はないはず。
この場合は「マクロじゃないといけない場合」だと思うよ。
0414デフォルトの名無しさん (ワッチョイ 6e2a-Y4mw)
垢版 |
2024/01/19(金) 11:42:42.67ID:THNGxTXR0
printf("Konyanyachiwa, Sekai no Kuni kara!");
0416はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
垢版 |
2024/01/19(金) 12:19:49.22ID:vjpbBz8R0
変換が可能だということと同じ表現を持つことは別という話。
int* から void* への変換は変換に関するルールだが
int** から void** への変換によって int* を void* として読もうとするのは type punning の問題。
0419はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
垢版 |
2024/01/19(金) 12:27:15.27ID:vjpbBz8R0
>>417
繰り返すが変換の話と表現の話は異なる。
void* は全てのオブジェクトを指すポインタと相互に変は可能であることは保証され、
「malloc が返すポインタに限っては」いかなる型とも適合するように境界調整されていることが保証される。
0420デフォルトの名無しさん (ワッチョイ 313a-xGnM)
垢版 |
2024/01/19(金) 12:34:27.05ID:3hcnICbb0
【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

ボイス・トォ・スカルのコアプログラムの一部は上記を統合している
0422はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
垢版 |
2024/01/19(金) 12:51:29.04ID:vjpbBz8R0
>>421
ポインタは型ごとに異なる表現・境界調整要求を持つ可能性がある。
適合する型へのポインタ同士の場合など同じ表現・境界調整要求を持つ条件が定められているが
最後に「これ以外の型へのポインタは、同じ表現又は同じ境界調整要求をもつ必要はない」と仕様に明記されてる。

具体的な部分は処理系定義なので全部が同じ表現であることをあてにしていい環境ならそうすることは否定しなけど、
常にあてにできるわけでもない。
0424デフォルトの名無しさん (スッップ Sd22-aNQv)
垢版 |
2024/01/19(金) 13:22:00.51ID:S8ovIeWid
>>422
それは「ポインタが指す対象」についての記述で
ポインタ自体にはどんな適当な値を書き込むことも可能(そのポインタを使ってアクセスすると何が起こるかわからないというだけ)
ただポインタにNULLを書き込むだけの関数になんの危険もない
0426デフォルトの名無しさん (スッップ Sd22-aNQv)
垢版 |
2024/01/19(金) 15:18:43.59ID:S8ovIeWid
>>425
そのポインタは関数への引数であり
すでにvoid*を表すものだと型は決まってるではないか


それとは別に
インライン関数で書いた場合はその場で展開されるから
void* p = 0;と書いた場合と同様にコンパイラが適切な0を書き込んでくれるんじゃないの
つまり(void**)をつけると逆に危険
my_free(&x);
でよい
0428はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
垢版 |
2024/01/19(金) 16:16:34.10ID:vjpbBz8R0
>>426
> (void**)をつけると逆に危険

これは暗黙に型変換されることが保証される文脈ではないので付けなければコンパイルが通らないだけ。
(コンパイラによっては黙って通すことはあるのかもしれない。)

> インライン関数で書いた場合はその場で展開されるから

言語の意味論としてはインライン関数は
・ 同じ定義なら (翻訳単位を跨いだ場合でも) 複数回定義してもよい (定義が一回の場合と同じ挙動)
・ なるべく高速に呼び出して欲しいことを期待するヒントである (実現方法は規定しない)

ということになってる。
インライン関数がインライン関数ではない関数と異なる動作にはならない。
0429はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
垢版 |
2024/01/19(金) 16:39:47.61ID:vjpbBz8R0
>>427
せやで。
厳密に言えばリテラルだけじゃなくて「整数の 0 であるような定数 (定数式) をポインタに型変換したときは空ポインタ」というルール。

これも変換に関するルールであって表現に関するルールではないよね。
実際に空ポインタの内部表現が整数の 0 というわけではない環境は存在するが、
型が正しければ適切に変換される。
0431はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
垢版 |
2024/01/19(金) 17:02:59.57ID:vjpbBz8R0
>>430
いや、それがよく出来てて、ポインタをそういう形で条件に使うのは問題ない。
単項演算子 ! について「式!Eは,(0==E)と等価とする」というルールになっていて
等価演算子 (==) はポインタと空ポインタ定数を比較したときの結果を規定してる。
空ポインタ定数のほうをもう一方のオペランドの型に合う空ポインタに型変換するルール。
0432デフォルトの名無しさん (ワッチョイ 25bb-0zjl)
垢版 |
2024/01/19(金) 17:32:06.95ID:CCGmGKuQ0
>>431
規格書読んできたけど
6.3.2.3 値0をもつ整数定数式は空ポインタになる
6.5.3.1 式!Eは,(0==E)と等価
6.5.9 ==は空ポインタ定数をポインタの型へ型変換する
ってことか
なるほど、規格を解釈すれば!ptrは空ポインタと比較されることになるから問題ないのか
勉強になったわ
0434デフォルトの名無しさん (ワッチョイ 463f-ggGG)
垢版 |
2024/01/20(土) 00:57:56.71ID:QcwVnceA0
void*の値は作成出来るけど、表現や境界調整要求は未定義とか、おかしいだろ
Cは現実に則した言語だと思ってたけど、妙な未定義だな
ちなみに、インタープリター型言語を作ったら、オブジェクトはみんなvoid*になる
void*の配列を作成したりとか普通に行われる
もはや規格とか無意味
実装がどうなってるかだけが重要だ
0436デフォルトの名無しさん (ワッチョイ 02ad-L3s4)
垢版 |
2024/01/20(土) 10:30:19.13ID:UfD1Ji0o0
> 実装がどうなってるかだけが重要だ
もちろんその通りだけど規格上未定義なわけだから実装がすべて統一されているとは限らないわけで
その実装における「限らない」が問題なわけでしょ
0438デフォルトの名無しさん (ワッチョイ 463f-ggGG)
垢版 |
2024/01/20(土) 13:33:03.85ID:QcwVnceA0
各OS毎にABI(Application Binary Interface)が定義されてて、Cの規格で定義されてないところが明確に定義されてる
2つを合わせて現実のC言語なんだよな
だから、JIS X 3010だけを取り上げてどうこう言っても混乱させるだけ
0439はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
垢版 |
2024/01/20(土) 14:51:47.73ID:k6CjZuQW0
>>434
実際には void* と int* (などのポインタ) が同じ表現なことは多いので
あまり問題 (type punning) にならないと考えるならそうかも。

ただ、表現が同じである環境ならかまわないのかというとそうでもない。
aliasing rules が絡んでくる。
言語仕様上で適合するとされる以外の読み書きをプログラマはやらない (やったら未定義だから) という仮定の元に最適化されることがある。

>>438
ABI はその名の通りインターフェイスを一貫させるための規定であって、
外部に公開しない (外部リンケージを持たない) 部分ではコンパイラは最適化するし、オブジェクトを除去することもある。

私は >>422 で「あてにしていい環境ならそうすることは否定しない」と述べたが、
あてになる確証を得るのは割とめんどい。
言語仕様を調べて分かる範囲で済むならそうする。
少なくとも >>392 をインライン関数にするために手間をかけるなんてことはしない。
0442デフォルトの名無しさん (ワッチョイ 463f-ggGG)
垢版 |
2024/01/20(土) 15:58:08.13ID:QcwVnceA0
未定義とは規格遊びには便利な言葉だなw
正解はconfigureスクリプトがやってるように、事前に環境を調査して前提にしていい事を明確にして最適な実装をする事だな
なので、言語仕様のみで判断を下す事は不正解と言える
その為にconfigureスクリプトがある
他の言語ではあまり必要ない
Rustとか最近の言語は言語仕様に不明瞭な点は残さないのがトレンドだろう
じゃなきゃそこが脆弱性を生んでしまう
0443デフォルトの名無しさん (ワッチョイ 463f-ggGG)
垢版 |
2024/01/20(土) 16:03:47.86ID:QcwVnceA0
>>392のマクロは、副作用のある式を渡したりするとおかしな事が起きる
全くもって脆弱なものだ
そのままで良いのか?
マクロのままにしておくとか、そっちの方が脆弱性を生む事になる
ちゃんと関数化すべきだろ
その為にすべき事は何だ?
それを議論することが正解と言っている
0444デフォルトの名無しさん (ワッチョイ 2205-l2AN)
垢版 |
2024/01/20(土) 16:33:16.28ID:7OBiWfZx0
副作用のある式とは例えば?
0449デフォルトの名無しさん (ワッチョイ 22ec-HXAs)
垢版 |
2024/01/20(土) 22:21:19.13ID:7OBiWfZx0
>>445
それは考えなくていいでしょ
0451デフォルトの名無しさん (ワッチョイ 463f-ggGG)
垢版 |
2024/01/20(土) 22:44:54.31ID:QcwVnceA0
例えば、(uint8_t)malloc(...) + sizeof(int)を返す関数もあり得る
これは前の方にデータを隠すテクニックだ
実はC++のコンパイラで普通に使われている
これを解放する時は、free(p -= sizeof(int))とやらない事もない
まぁ普通はp - sizeof(int)だろうから屁理屈だけどねw
0452はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-3Dea)
垢版 |
2024/01/21(日) 00:53:03.43ID:4rk7TZPC0
>>450
解決したい問題はそれだけでいいのか。
それなら意図はわかる。
ただ現実に C の関数を多相化できないのは変えられない前提としてある。
異なる型で扱う必要があるんだから異なる関数を用意するしかないのはどうしようもなくない?
0453デフォルトの名無しさん (ワッチョイ e785-6dvo)
垢版 |
2024/01/21(日) 11:37:01.81ID:yYf7aVwb0
多相?
仮にポインタ変数のアドレス を引数で渡したい場合であってもvoid ** じゃなくvoid * を使って、
人間同士がドキュメントだろうが喫煙所だろうがで問題解決しろよってのが規画と整合する答えなんじゃないの

どうせキャストするんでしょうに
バカですか
0454はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-G0Zh)
垢版 |
2024/01/21(日) 12:09:29.26ID:4rk7TZPC0
void* に変換したなら元の型にキャストしなおさないと保証された動作はほとんどない。
(逆に元の型に変換したときは変換前の値と一致することは保証される。)
元の型を知っているプログラマがキャストすることを期待できる qsort のような使い方なら問題にならないけど、
void* の形で受け取るだけでは関数が出来ることはほとんどない。

文字列を指すポインタに変換してバイト列として読み書きすることはアリなので
オブジェクトの内容はどうでもいいメモリブロック操作系の関数 (memmove など) だとかでも問題はないかな。
0455デフォルトの名無しさん (ワントンキン MM3f-NhvB)
垢版 |
2024/01/21(日) 12:53:39.98ID:+eMrRol8M
簡単な問題だったんだけど答えられる人ほとんどいないのか
相変わらず本題とは関係ない問答しだすアホらもいるし
0458デフォルトの名無しさん (ワッチョイ 5fad-zQB7)
垢版 |
2024/01/21(日) 16:43:50.02ID:WaBPg/nL0
誰も知らない新規格、か・・・
0463デフォルトの名無しさん (ワッチョイ 5fdb-0Ail)
垢版 |
2024/01/22(月) 19:23:27.59ID:sQG6cOu30
このマクロでそんな心配せんでええやろ
0464デフォルトの名無しさん (ワッチョイ 7f63-HLt9)
垢版 |
2024/01/22(月) 20:21:33.49ID:oQuCuzrM0
Cに引数の参照渡しってあったっけ?
ないとしたら>>392のMYFREE(p)をマクロではなく関数として書き
その中でp=0としても呼び出した側の変数は変えられないわけで
関数にすることで動作が変わってしまうことになるはずだけど
0468はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-G0Zh)
垢版 |
2024/01/23(火) 15:14:53.60ID:MIeJSKFF0
>>467
言語仕様上は calloc が返すポインタ (によって表されるメモリ領域) は
malloc が返すものと同じようにあらゆる型に対して適切に境界調整されることになっているし、
ゼロクリアするという違いも「全てのビットがゼロ」という意味なので型の性質を考慮しない。
つまりふたつの引数として指定することによって得られる恩恵はない。

実装がまともなら calloc(a, b) としたときの a*b が size_t の大きさを超えてしまうようなときでも
ラップアラウンドして小さな領域を確保するのではなくエラーにしてくれることは期待できる
(間違いを検出しやすい) が、それを理由として引数ふたつにしているというわけではなさそう。

最初に言語仕様をまとめたときに主要な処理系がだいたい準拠ということになるようにしたはずなので
その頃の処理系でなんか理由はわからんがそうなってたって程度の話だと思う。 あまり意味ない。
0469デフォルトの名無しさん (ワッチョイ df2d-EFyZ)
垢版 |
2024/01/23(火) 15:47:25.62ID:v+doC8dF0
メリット無いなら統一してほしかったよ
0473デフォルトの名無しさん (ワッチョイ 5f7c-ytPG)
垢版 |
2024/01/25(木) 18:11:36.02ID:oxF0tkpI0
callocはmallocのゼロクリア版として *も* 使えるがそもそもの使い方が違う。
0476デフォルトの名無しさん (ワッチョイ dfbf-qZe7)
垢版 |
2024/01/25(木) 21:27:23.28ID:xC/Yy1/j0
ヘンな用語作るのやめて
ポインタで渡しても値渡しのまま
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.

ポインタを含むあらゆる型に対して、値渡し/参照渡しが存在する
0477はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-3Dea)
垢版 |
2024/01/25(木) 21:48:36.73ID:d9W0b5Ok0
JIS の用語集やそのもとになった ISO 規格によれば call by address の定義はパラメタの場所を渡すこと。 ポインタの形であっても場所を渡しているには違いないからあてはまるし、勝手な創作用語というわけではない。
言語の理屈ではポインタもポインタという型の値だがそれの活用方法に名前が付いて悪いってこともない。
言語仕様の話をしているときに混ざってくると「んっ?」とは思うが。
0480デフォルトの名無しさん (ワッチョイ 5f7c-ytPG)
垢版 |
2024/01/26(金) 00:35:29.44ID:xuVVqQKb0
>>478
>アドレスを値渡し→ポインタ渡しでいいんだよ

だよな。
0481デフォルトの名無しさん (スププ Sd7f-MQtI)
垢版 |
2024/01/26(金) 08:38:30.55ID:Nbs9AoGZd
Cの文法規則がいいかげんなんだよ
0482デフォルトの名無しさん (スプッッ Sdff-ytPG)
垢版 |
2024/01/26(金) 09:12:22.82ID:f6TAFOdQd
>>481
>Cの文法規則がいいかげんなんだよ

だよな
0487デフォルトの名無しさん (ワッチョイ 5f10-iTDz)
垢版 |
2024/01/26(金) 12:43:22.79ID:IWVVekFc0
>>483
構造体は値渡しとアドレスの値渡しがある
どっちも値渡しというと訳が分からなくなる
なので、構造体は値渡しとポインタ渡しが出来ると言えば便利だ
そうすれば、配列は値渡しが出来ないとも言うことが出来る
0489デフォルトの名無しさん (ワントンキン MM4f-NhvB)
垢版 |
2024/01/26(金) 14:03:32.73ID:OnjHbhExM
C++がどうのとかは全然関係ないでしょ
0490はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-3Dea)
垢版 |
2024/01/26(金) 14:07:19.39ID:6gE8lNl00
C++ とは関係ないと私も思う。
仮引数と実引数の関係は (型がポインタかどうかに関係なく) 値の代入であるということになっている。
繰り返すが言語仕様上の理屈では解釈の余地なく全ての引数は値呼びのメカニズムで規定されているよ。
C++ の参照と区別するための言い回しではなく仕様上の理屈通りに言えばそうなるってだけ。
0492はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-3Dea)
垢版 |
2024/01/26(金) 14:57:45.80ID:6gE8lNl00
「アドレス」と「ポインタ」の使い分けはイマイチわからないんだよなー。どっちでもいいと思う。
単項演算子の & にはアドレス演算子という名前がついていてアドレスを返すとも書いてあるのでこれについてはアドレスと言っていいのは間違いない。
ポインタは型の種類のように使われてることもあるし、ポインタ型の値のことを指しているように見える箇所もある。
個人的感想としてはアドレスのほうが低レイヤ寄りの概念でポインタは型で意味付けしているような雰囲気を感じてるんだけどあまりはっきりしない。
0498デフォルトの名無しさん (ワントンキン MM4f-NhvB)
垢版 |
2024/01/26(金) 18:03:51.31ID:Vqpo1a/ZM
アドレスは値で右辺値、ポインタは変数でオブジェクトで左辺値
こんな基本的なこと、頼むよ
0501デフォルトの名無しさん (ワッチョイ e746-qZe7)
垢版 |
2024/01/26(金) 19:46:30.13ID:XBTJ48xK0
規格上はどうなってるか知らんが
ポインタでいいじゃん統一しろよ
変数へのポインタを取る時アドレスと言いたくなるんやろな
分からんでもないが使い分ける必要はないと思う

アドレスといいつつ結局ポインタでしかないやろ?
場所だけじゃなくて型のサイズも持ってるでしょ?
アドレスと聞くと番地だけってイメージだけど
ポインタっつうのはそれに加えてサイズも持ってるのがミソ

だから不必要にアドレスと言い直す必要はない
だって実際にポインタしか扱わないんだから
0502デフォルトの名無しさん (ワッチョイ 0791-RdP4)
垢版 |
2024/01/26(金) 20:04:10.51ID:Su75gAlu0
アドレスっていう言葉は規格には出てこないと予想してた。
規格にはポインタだけあればよくて、アドレスは実装の仕方のイメージがある。アドレスは多くの場合整数になるが、文字や文字列でもいいというような。
0506デフォルトの名無しさん (ワントンキン MM4f-NhvB)
垢版 |
2024/01/26(金) 21:11:38.94ID:Vqpo1a/ZM
>>499
p+1はアドレスだよ
0508デフォルトの名無しさん (ワッチョイ e730-qZe7)
垢版 |
2024/01/26(金) 22:21:36.46ID:XBTJ48xK0
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の結果が違う番地になるのは
ポインタが大きさを知っているから
これが単なる整数とは違うところ
0515デフォルトの名無しさん (ワッチョイ 5f7c-ytPG)
垢版 |
2024/01/27(土) 00:55:04.46ID:3j95TwYq0
>>514
>だから、アドレスは値で、ポインタは型なんだ
>p + 1はpの型によって結果が決まる
>intかintのポインタ型かで結果が変わる

だよな
0517デフォルトの名無しさん (ワッチョイ 5f7c-ytPG)
垢版 |
2024/01/27(土) 10:42:42.11ID:3j95TwYq0
>>516
何章?
0519デフォルトの名無しさん (スプッッ Sdff-ytPG)
垢版 |
2024/01/27(土) 15:00:52.15ID:Go/zq51jd
>>518
intは32bitのLP64環境ではどうなるんだい?
0521はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-G0Zh)
垢版 |
2024/01/27(土) 16:02:39.58ID:TmJLT/yO0
ポインタは整数に型変換できるけどその値がどうなるかは処理系定義。
変換結果がその整数型で表現できなかったときは未定義。
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));
}
0523デフォルトの名無しさん (ワッチョイ 5fb0-ytPG)
垢版 |
2024/01/27(土) 17:46:47.32ID:gXnDqsx80
>>518
つまりこのコードはダメってこったね
0527デフォルトの名無しさん (ワッチョイ 6f5f-YGpO)
垢版 |
2024/02/22(木) 19:08:43.26ID:rfW+Fz5e0
errno ってどうしてスレッドごとに別々につかえるの?
0530はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7332-tW/T)
垢版 |
2024/02/22(木) 20:08:19.54ID:o0M/RgFs0
>>529
errno は型 int を持つ変更可能な左辺値に展開されるならマクロで定義されてもよいことになっている。
昔の C には記憶域期間の分類にスレッドは無かったが
#define errno *__foo()
みたいな感じで定義しておいて、
この関数がスレッドごとに適切な場所を返すように作っておけば辻褄は合う。
0534デフォルトの名無しさん (ワッチョイ 8f0e-8Avu)
垢版 |
2024/02/24(土) 16:12:18.49ID:+4BfNMQz0
TLSと言えばゲームの方やね
バタ語を略したスレッドローカルストレージではないんや
このスレの世代的にも半数以上がそう思って口に言わずとも突っ込んだ経験があるはずや
0536はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7332-tW/T)
垢版 |
2024/02/24(土) 16:54:19.76ID:felFEjYK0
「TLS ゲーム」でググったらトゥルー・ラブストーリーが出てきた。
タイトルは聞いたことがあるけどやったことないし、 TLS なんて略称にはなじみがないわ。
Transport Layer Security と被っとるやないけというツッコミはしたくなったことはあるが。

バタ語ってなんや?
0539はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f32-a3My)
垢版 |
2024/02/25(日) 01:01:43.21ID:m/LZ7YZH0
>>537
一応は C の名前を冠したスレだからその質問が言語仕様に関わる質問ならこのスレでいい。
C を使ったロジックの組み立てかたみたいなのもある程度は許容されると思う。
環境に固有の事情が絡むならそれぞれのスレのほうがいいこともある。
Win32api スレとか Unix スレとか。
0540名無し兎と鰻の大乱闘 (ワッチョイ cafd-p5xT)
垢版 |
2024/02/25(日) 23:17:51.95ID:3BSAc3tW0
しーげんごってなに?
0542デフォルトの名無しさん (ワッチョイ 0aaa-g1P5)
垢版 |
2024/02/26(月) 17:12:35.82ID:hotfpUjh0
【AI】Stable Diffusion 3発表、Soraで話題の拡散トランスフォーマーを採用 [すらいむ★]
http://egg.5ch.net/test/read.cgi/scienceplus/1708865670/l50

ボイス・トォ・スカるしている者も攻撃を受けるようになりました
0543デフォルトの名無しさん (ワッチョイ 9e6d-EVRh)
垢版 |
2024/02/26(月) 19:38:00.95ID:7RO6bLyL0
こんな Web ページを作りました。ぜひどうぞ。
http://www7b.biglobe.ne.jp/~river_r/chs/
0546デフォルトの名無しさん (ワッチョイ 9eb5-EVRh)
垢版 |
2024/02/27(火) 17:32:18.89ID:xGsMPO790
>>543 ごめんなさい。言葉足らずでした。

「数値計算結果の画像化など」 という Web ページを作りました。
プログラミング、数値計算、カオス、画像作成と表示
などに興味がある方は、ぜひどうぞ。
http://www7b.biglobe.ne.jp/~river_r/chs/
0549デフォルトの名無しさん (ワッチョイ 9e07-EVRh)
垢版 |
2024/02/29(木) 11:21:59.57ID:lAXCV22P0
>>0548
>546 です。C++ に特有な機能は、
全くと言っていいほど、使っていませんよ。
pow(x, y) というのは目新しいけど。
0552はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f32-o3N8)
垢版 |
2024/02/29(木) 14:03:45.25ID:w6pA3tyf0
>>549
C++ の機能をほとんど使ってないことはわかってるしそう言ってるじゃないの。
使わないのに C++ の形式をとって C スレに投下するのはちょっと不親切かもねという話をしてるんだよ。

pow (べき乗関数の総称版) は C にもあるし、 C の仕様に入ったのは C99 から。
それを知らなくて (しかし使いたくて?) C++ にしたという意味なのかな?
0554デフォルトの名無しさん (ワッチョイ caac-o+si)
垢版 |
2024/02/29(木) 16:10:58.46ID:wvTonBo10
しらんけど、今どきだと最適化されるかもしれんね
1+2+・・・+99+100
こんな計算も(1+100)x 50で最適化される記事が昔あったような
0558デフォルトの名無しさん (ワッチョイ caac-o+si)
垢版 |
2024/02/29(木) 18:55:44.88ID:wvTonBo10
例が悪かった、もちろん定数は一発計算してメモリに固定されるけど、
変数を含んでても、冗長計算を変形してくれるコンパイラが出て、gccもそのアルゴリズムを採用したことが昔あったような。
0559はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 4350-a3My)
垢版 |
2024/02/29(木) 19:13:29.86ID:eV7kgdtT0
数値計算関連の関数はコンパイラによる最適化がなくても関数の内部が複雑な場合分けで対処してることが多いと思う。
GNU のやつとかだいぶんごちゃごちゃしてる。
0562デフォルトの名無しさん (ワッチョイ ab4e-7bv0)
垢版 |
2024/03/07(木) 00:36:21.20ID:D7Ff69360
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);

signal関数の第1引数のシグナル番号(signum)と第2引数のハンドラ関数が実際に呼ばれたときに引数に入るシグナル番号(1行目の引数のint)は必ず一致する認識ですがあっていますか?
その場合はハンドラ関数では引数に入るシグナル番号は最初から分かっているはずですが、わざわざ引数にシグナル番号を取っている理由はなんでしょうか。シグナル番号によって処理を分岐するデカいハンドラ関数を作るくらいしか思いつきませんでした。
0563デフォルトの名無しさん (ワッチョイ 9f79-rZWy)
垢版 |
2024/03/07(木) 01:20:52.75ID:yhOhiWWp0
時間の無駄だからsignalのことは忘れなさい
時代遅れのCランタイムで本当に役立つものはごく少数しかない
そんな化石はスルーしてOSに用意された目的に合うAPIを直接使いなさい
Cランタイムのソースコードがある処理系なら読んでみると良い
0567はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3b32-FATS)
垢版 |
2024/03/07(木) 10:26:06.80ID:Qh7cJyBm0
>>562
> 必ず一致する認識ですがあっていますか?

正しい。

> わざわざ引数にシグナル番号を取っている理由

Rationale に書かれていないのではっきりしたことはわからない。
おそらく Unix でそうなってたのを追認しただけだと思う。
0570はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3b32-FATS)
垢版 |
2024/03/07(木) 12:44:05.75ID:Qh7cJyBm0
>>569
練習用の題材ではなく (自分なりに) 意味があるプログラムを書けたあたりが
一応のマスター (あくまで最低限の出発点だが!) だろうと個人的には思ってる。

プログラミング言語は道具なんだから道具として使えることが重要で、
言語の要素を何個理解したなんてのはたいした指標にならない。
0572デフォルトの名無しさん (ワッチョイ 0f2a-AlNe)
垢版 |
2024/03/07(木) 14:06:12.94ID:4AOndewA0
三行半で済む処理をダラダラ1万行ぐらいに増やすのは、得意なんだけどなあ。
0574デフォルトの名無しさん (ワッチョイ 1f5c-0W2u)
垢版 |
2024/03/07(木) 15:56:22.94ID:tpHaFcPx0
>>562
番号を渡す理由はその方が柔軟性があるから
柔軟性の中には>>562で挙げてる理由も含まれる
なおsignal()は時代遅れなのでsignal.hにある別の関数を使うこと
0576デフォルトの名無しさん (ワッチョイ 4f4c-lvv7)
垢版 |
2024/03/08(金) 18:40:01.38ID:6aUIMz1F0
>>562
デカいハンドラ関数を作る意図はなくても
同じようで異なる処理(複数のsigal番号の処理をする場合とか)をする時に
入口は一つにしておいて入力パラメータで処理を振り分けるとか普通の設計だと思うが。
わかりやすい例がWIN32APIのWindowProc。
あれがメッセージ番号毎に関数エントリを登録する形式だったら煩雑なことこの上ないだろ。
0581デフォルトの名無しさん (ワッチョイ 82ac-sV0L)
垢版 |
2024/03/11(月) 21:49:00.76ID:QCWizl2S0
プログラマ目指して挫折する人は、別に作りたいものがなくて文法ばかりを勉強するタイプかも。
文法は大事だけど、それ自体はあんまり役に立たないし調べれば済むことに時間をかけるのは程々に
合理的なアルゴリズムを瞬時に思いついて言語に落とし込めるかが大事で、これは経験。
0582はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 8d32-SeR6)
垢版 |
2024/03/11(月) 22:16:42.73ID:lga6QF6v0
質問サイトとかで「どうすればいいですか?」みたいなのはちょくちょくあるけど「どうなればいいの?」と返したらまともにこたえられないのもよくある。
問題の解法を構築してプログラムの形に落とし込むのが大事だというのはそりゃそうなんだけど、大前提として解決すべき問題が何であるかを認識 (発見) しなきゃならなくて、そこんところで躓いてたら助けるのも難しい。
0583デフォルトの名無しさん (ワッチョイ c27c-WFGC)
垢版 |
2024/03/11(月) 23:43:57.21ID:a8lYnTon0
>>582
相手はその質問で問題提起してるんだろ、なのにお前からは、どうなればいいのって "
解答" を質問者に聞いてたら、そりゃ質問者だって混乱するだろよ。
問題把握以前にお前は国語からやり直すべき。
0584はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 8d32-SeR6)
垢版 |
2024/03/12(火) 00:26:36.89ID:WtXn1sYk0
>>583
目指すべき形がわからないのにどうすればいいかなんて答えようがないんだから訊くのはあたりまえじゃないの。
(ちなみに質問が不明瞭な場合などのために回答とは別にコメントを付ける機能が stackoverflow や teratail にはある)
0591デフォルトの名無しさん (JP 0He6-Cuda)
垢版 |
2024/03/13(水) 04:27:54.00ID:fKc7/92tH
Pythonから来たんですけど
C言語では関数だけじゃなくifやforのブロック内部もローカルスコープって聞いて驚愕してます
ループが終わった後のカウンター変数を後続処理で気軽に利用できないって困りませんか
0592デフォルトの名無しさん (ワッチョイ 82ac-sV0L)
垢版 |
2024/03/13(水) 04:37:16.09ID:VFn3B3DS0
そうしたいときはスコープの外で宣言すれば値は保持されるので
int i;
for (i=0 ; i<10 ; i++)
{

}
0593デフォルトの名無しさん (JP 0He6-Cuda)
垢版 |
2024/03/13(水) 04:49:50.63ID:fKc7/92tH
>>592
マジっすか
ChatGPTに聞いたら、そのやり方だと外のiと中のiはスコープが別って言われて混乱しとります

---
一方で、ループの外で事前に同名の変数が宣言されている場合、
forループの仮引数として宣言された変数と同名の変数は別のものとして扱われます。
この場合、forループの仮引数として宣言された変数がローカル変数として扱われ、ループの外で宣言された変数がグローバル変数として扱われます。
これは、C言語において名前の衝突を回避するための仕組みです。
0595デフォルトの名無しさん (ワッチョイ 8666-sV0L)
垢版 |
2024/03/13(水) 07:16:46.92ID:3+r/Br8X0
>>593
int i;
for (int i=0 ; i<10 ; i++) {...}
と書くとそうなる
宣言すると新しい変数ができる

ChatGPTって、機械が自然な応答をすることが目的で、辞書のように使うものではないんじゃないの?
ChatGPTは得た情報がどの程度正しそうなのか重みづけできないんじゃないかな
0597デフォルトの名無しさん (JP 0He6-Cuda)
垢版 |
2024/03/13(水) 08:06:43.61ID:fKc7/92tH
>>595
ありがとう
AIの回答をよく見返したらfor(int i = 0...の解説だった
サンプルコードを示してくれるのはいいけど、自分のような丸々素人だとその意図を理解できないでこういう誤解が生まれる余地はあるね
先生が優秀過ぎて学生がついていけない構図だわこれ
0599はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 29a4-SeR6)
垢版 |
2024/03/13(水) 08:49:20.23ID:ZL+6IClb0
>>597
昔の C++ だとその書き方でも i のスコープは for 文の外側のブロックがスコープになる仕様だった。 (ISO で規格化される前のやつ。)
その頃の C の仕様ではそもそもそこで変数の宣言を出来なかったが処理系の拡張として C++ 風のやりかたをできるようにしているものもあった。
後に C++ の仕様は変更されて、 C には C++ の変更後のやり方で導入されることになったんだが、しばらくはスコープの仕様に混乱があった。
数十年前の一時期の混乱に過ぎないからそれ自体は今では気にする必要はないんだけど言語仕様は変更されることもあるし、色々と歴史的事情もある。
古い仕様を根拠にした解説もあるから AI が区別せずに学習したら辻褄の合わないことも起こると思う。
まあ人間が書いた解説も変なのは少なからずあるから AI を批判するわけじゃないけど……まあ一番最初くらいは入門書を読んだほうがいいんじゃないかと個人的には思ってる。
0602デフォルトの名無しさん (ワッチョイ 692a-fdoY)
垢版 |
2024/03/13(水) 09:57:47.91ID:X1fgAQyG0
気が重い中で使うのが正しい。獅子咆哮弾だね。
0603デフォルトの名無しさん (スプッッ Sd01-WFGC)
垢版 |
2024/03/13(水) 10:34:26.85ID:u8+Aa1acd
>>597
ChatGPTは嘘言うので使うのやめたわ。
どこかの大学の調査で学生だか生徒だかが、ChatGPTの嘘情報で間違ったまま覚えてる弊害が出始めてるとか言ってたわ。
0607デフォルトの名無しさん (ワッチョイ 8563-lhhw)
垢版 |
2024/03/13(水) 11:43:22.70ID:WwA56xS10
嘘って言うのは人間が評価した上での話
ChatGPTに取っては与えらた入力データから
もっともらしいものを出力しただけ

ChatGPTに嘘をつかせるってのは、難しい
仮に知性というものが芽生えて、自意識が発生し
そのことを人間に隠さないといけないと判断して
そうするなら、それは初めて嘘をついたとなる
0611はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 8d32-hQEK)
垢版 |
2024/03/13(水) 12:20:13.23ID:y7g8qbWf0
ChatGPT の言語能力は高いがプログラミング教育を受けてるわけじゃないからなぁ。
頭のよい素人がググりながら要約したくらいの正確さだと思う。

根拠になる仕様の項目を問うたときにまるでデタラメを返したりするのはかなりあかんとこ。
0614デフォルトの名無しさん (ワッチョイ f260-3wDj)
垢版 |
2024/03/13(水) 13:53:23.57ID:hNY0+4ik0
>>601
ループ変数を後から参照する状況は、ループがbreakで中断したかを確認したい時だろう
そういうのは別の関数に切り分けて、ループ内でbreakじゃなくreturn trueで返すようにすべきだな(関数の最後はreturn false)
C++で言うstd::any_ofみたいな事が出来ないから、関数に切り分けるしかない
0616デフォルトの名無しさん (ワッチョイ fb4c-A0KB)
垢版 |
2024/03/17(日) 16:04:44.01ID:k+jArioy0
最短経路問題で perl5 で書いたのがOut of memory!

こんな時はC言語などで書き直すのが選択肢だけど
みんなはいきなりC言語などで書きますか?
それとも、最初は書きやすい言語で処理速度以外の所を決めてからC言語などで書きますか?
0619デフォルトの名無しさん (ワッチョイ 292a-B9kV)
垢版 |
2024/03/17(日) 16:47:02.59ID:8QBAFOMi0
ここの人たちなら習わぬ Perlで下書きするより勝手知ったる Cで書くんじゃないの。
Perl開発上の問題はPerlスレで訊ねた方が、実情に即したレスが反りそう。
0621デフォルトの名無しさん (ワッチョイ 8163-IOXH)
垢版 |
2024/03/17(日) 19:48:46.79ID:WugnipTo0
Perlスレ見てみたが、相談できそうな所が無かった
回答あるか分からないが、お題スレに問題文投げて解いてもらう
いろんな言語に精通している猛者が多い(Perl達人もいたはず)
PerlではなくC言語でと言うなら、ここで相談できるかもしれない
0622デフォルトの名無しさん (ワッチョイ 5134-0rOl)
垢版 |
2024/03/18(月) 10:33:19.79ID:0IkoPQje0
最短経路・グラフ理論・ダイクストラとか?
アルゴリズム系は、Python でしょ。Ruby も

有名な蟻本「プログラミング・コンテスト・チャレンジブック」は、C++

C は知らない
0624デフォルトの名無しさん (ワッチョイ 59ad-FDlJ)
垢版 |
2024/03/18(月) 12:55:06.36ID:09P0Fui10
Perlは最短経路問題のライブラリもなく、速度が欲しければCで自分で書くしかない…ってコト!?
辞めたら? その言語で最短経路問題解こうとするの
0629デフォルトの名無しさん (ワッチョイ 1379-7+fg)
垢版 |
2024/03/18(月) 23:52:06.11ID:H3fBGUmk0
そいう話か。1行目しか読んでないわ
最近は大体OS標準のpowershellでざっくり書いて必要なら一部C#だな
pinvokeで恐らくC/C++製のDLLを利用することはあってもCコードを書く機会なんてなくなった
0632デフォルトの名無しさん (ワッチョイ 73ae-yROb)
垢版 |
2024/03/19(火) 08:57:10.07ID:R8jeC9x+0
awkが普通だと思ってた
今は違うのか
0636デフォルトの名無しさん (ワッチョイ 8b2a-Rw/6)
垢版 |
2024/03/19(火) 10:39:11.21ID:Fe9RIXyY0
>>631
いきなり perlで書いたソースは既にあって、実行するとメモリ不足になるのでしょ。なので、

いきなり(perl以外の)書きやすい言語で書くのと
いきなりCで書くのと何が違うんだろ?

と訊くべき。
0637デフォルトの名無しさん (ワッチョイ 8163-IOXH)
垢版 |
2024/03/19(火) 11:11:47.95ID:Szfgw2D70
昔MZシリーズなんていう8ビットPCがあって、
そのマニュアルにペントミノを解くというプログラムが載っていた
しかし実行しても1日掛かっても回答が出ない
16ビットPC用のCで書き直したら、5分で終わった
ついでにアセンブラにしたら、1分だった
0638デフォルトの名無しさん (ワッチョイ 59ad-FDlJ)
垢版 |
2024/03/19(火) 11:29:09.76ID:FLREyswN0
Perlでアルゴリズムのプロトタイプ書くおじいちゃん、まだ生きていたのか
普通の若者はプロトタイプはPythonで書くんだよな。何故ならネットにダイクストラでもなんでも落ちているから

このおじいちゃんは新しい言語を勉強出来ない人間だし、かといってプロトタイプなしで初手Cで書けるような積み上げのある猛者というわけでもない
引退した方が良いのでは?
0641デフォルトの名無しさん (ワッチョイ 8b2a-B9kV)
垢版 |
2024/03/19(火) 12:37:23.65ID:SMOg7wK30
翻訳先が Cなら、
Perl より Python の方がコスト(手間)高で、いっぱい損な気ガス

# ダジャレに気付かないのはダレジャ
0643デフォルトの名無しさん (ワッチョイ 0bd0-FDlJ)
垢版 |
2024/03/19(火) 19:07:27.75ID:qnPpFeXM0
最短経路問題をCudaで解くのはむずくね?
0646デフォルトの名無しさん (スフッ Sdb2-W6Ep)
垢版 |
2024/03/24(日) 18:06:00.35ID:UMIIXnOjd
構造体変数の宣言の初期化のとき、ヌルポインタを,{ }でくくらないと、警告が出るのですが、なぜですか? 例えばこんな具合にしないと警告が出ます

struct monster {
char name[80];
int HP, MP;
};

int main(void)
{
struct monster template = {{0}, 7, 4};
0648デフォルトの名無しさん (スフッ Sdb2-rfcW)
垢版 |
2024/03/24(日) 18:24:20.57ID:UMIIXnOjd
>>647 よくわかりました ありがとうございます
0651デフォルトの名無しさん (スフッ Sdb2-rfcW)
垢版 |
2024/03/24(日) 18:47:29.73ID:UMIIXnOjd
我ながら Lolです☺
0652デフォルトの名無しさん (ワッチョイ 09f0-d20A)
垢版 |
2024/03/24(日) 18:57:40.29ID:9Ye9tMrz0
>>621
Perlでメモリ不足になるってことは循環参照が発生してメモリが解放されない(PerlはリファレンスカウントGC)
もしくは深い再帰でPerl管理のVMスタックが枯渇したか
どちらにしろCで書いてもメモリをバカ食いするのは間違いないから
データ構造を見直すべき
循環参照を見直す、再帰をループに変えるなどを試してみてはどうか
0655デフォルトの名無しさん (ワッチョイ 6fb3-MjEX)
垢版 |
2024/04/11(木) 18:10:49.56ID:h5i5y7Gi0
#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");
}
0656デフォルトの名無しさん (ワッチョイ 6fb3-MjEX)
垢版 |
2024/04/11(木) 18:12:37.98ID:h5i5y7Gi0
コメントアウトしてる方のforにしても出力結果は同じになります
*付きポインタ変数は、中身へアクセスを意味するからめちゃくちゃな文字列が出力されるはずじゃ・・・?

どうしてなの?
0660デフォルトの名無しさん (ワッチョイ 4ef0-WBP1)
垢版 |
2024/04/11(木) 20:25:30.86ID:RdqITFFi0
*も++も単項演算子で適用される優先順位がある
優先順位を意識してコーディングしないと痛い目に合う
a + b == cは想定通りだろうが、a & b == cは想定外の結果になるとかねw
0662デフォルトの名無しさん (ワッチョイ 6f2a-MjEX)
垢版 |
2024/04/11(木) 21:46:39.46ID:6HtedQOj0
>>661
え、なぜ。
0669デフォルトの名無しさん (ワッチョイ df01-B3tP)
垢版 |
2024/04/12(金) 00:21:54.57ID:GtdzNQir0
>>655
後に現れたC++のiostreamがシフト演算子をオーバーロードし入出力演算子として流用するのに
好都合で、思わぬ役に立つことになったからまあ良いだろ。もしシフト演算子が四則演算子より
優先順位が高かったら、cout << 1 + 2 * 3 << endl を cout << (1 + 2 * 3) << endl と
書かなければならず面倒だった。(C++がシフト演算子を全く別の機能に流用したのは不適切
だったという意見もあるが…)
0671デフォルトの名無しさん (ワッチョイ e2ad-lyNC)
垢版 |
2024/04/12(金) 02:09:51.24ID:Wv2Zy+UZ0
>>656
*pc++ はまず *pc の処理をする。これで pc の差している先にある値を取り出すことになる。その次に pc を一つ分進ませる(実際に加算される値は sizeof(*pc))。
では最初に *pc で取り出した値はどこへ行ってしまうのか? それは何にも使われずにただ捨てられる。
0672デフォルトの名無しさん (ワッチョイ 4e28-Nnmc)
垢版 |
2024/04/12(金) 07:08:32.50ID:gi41fiD00
*pc++の形はcやってたら所々で見るから否応なく慣れる
個人的にはケチくさい書き方で避けたい気持ちもあるがまぁそういう文化が根付いてるなら合わせざるを得ない
0674デフォルトの名無しさん (スッップ Sd02-3rFQ)
垢版 |
2024/04/12(金) 12:25:07.52ID:OadUyd3Md
C言語の標準化委員はC++のほうも兼任してたりするから、ぶっちゃけC言語の改善にはやる気無しだから。
0676デフォルトの名無しさん (ワッチョイ 4ef0-WBP1)
垢版 |
2024/04/12(金) 14:41:57.50ID:nGLEgXOo0
C++はRustと比較されて安全性に劣るとレッテルを貼られて、どうしたもんか考えあぐねてるところだろうw
言語の拡張に対して完全に方向転換を強いられてるのは間違いない
それはCも一緒だな
0678デフォルトの名無しさん (スフッ Sd02-L5r3)
垢版 |
2024/04/12(金) 15:20:27.37ID:dUdcEEpod
>>674
もはやbetter Cでも何でもないのに、このスレでも繰り返しc++の話題出す奴居るし、やっぱユーザーも被ってるんだろな

まあCの設計の良否を他言語よりは比較的小さな差異から論じるのに有用だとは思う
おれみたいにC++は書かずともcpprefとか読んで式や文、宣言など局所的な構文知識だけちょっとある人は多かろう(ClassとかCに無い概念は読み飛ばしてて無知)

生まれた順序が逆だけど、FortranがC++とすればF言語/JuliaがCだね
大体サブセット+独自進化、標準化コミュニティ丸被り
0679デフォルトの名無しさん (スッップ Sd02-3rFQ)
垢版 |
2024/04/12(金) 16:33:17.52ID:OadUyd3Md
C++は好きじゃないからC言語はもっと改善していって欲しい。
nullptr型とか入るの遅すぎじゃね?
0680デフォルトの名無しさん (ワッチョイ 62e3-WBP1)
垢版 |
2024/04/12(金) 22:48:41.07ID:fQv3jEzD0
C++はCの機能を保ったまま、ありとあらゆるプログラミングパラダイムを突っ込んだもの
それがベターかどうかは人によるな
ただ、Cと互換性を保ったままそこまで進化したのは奇跡に近い
0682デフォルトの名無しさん (ワッチョイ 62e3-WBP1)
垢版 |
2024/04/13(土) 00:06:24.07ID:c7UXCLXT0
でも、Rustが安全性と性能は両立出来ることを証明してしまってから、一気に旗色が悪くなったw
今まで性能を免罪符にして、多少(かなり?)の安全性を犠牲にしてきたけど、もはや通用しない時代になった
今後どう進化するか見物だな
Cだって対岸の火事ではない
0683デフォルトの名無しさん (ワッチョイ 62e3-WBP1)
垢版 |
2024/04/13(土) 01:23:26.45ID:c7UXCLXT0
ちなみに、Rustは安全な代わりに書きたいコードを書けるとは思わない方がいいw
これは書いてみないと分からん感覚だ
書きやすくて安全な言語は存在しないことも証明されたw
0684デフォルトの名無しさん (ワッチョイ e2ad-ZiZa)
垢版 |
2024/04/13(土) 07:18:38.29ID:SxW/5mRR0
慣れの問題では?
0686デフォルトの名無しさん (ワッチョイ 9f79-Zl9R)
垢版 |
2024/04/19(金) 20:19:37.90ID:5JxGOdzk0
今日から戯れに数十年前のx86なGUIのソースをx64に移植し始めたんだが
とりあえずエラーになるGetWindowsLongだかをx64用に書き換えていったらそこそこ動いてしまって、後は文字列が関係する処理だけだ
俺が書いた過去のコードがよっぽど優秀だったようだ
やはり若い頃にソースを沢山書いといてよかった
0687デフォルトの名無しさん (ワッチョイ 9f79-Zl9R)
垢版 |
2024/04/19(金) 20:37:53.24ID:5JxGOdzk0
x64化でちょっとsize_tの扱いで躓いたので書いておこう
ポインタが64bitだから、その差を取る場合もあるsize_tも64bitなのは理屈では理解できるんだが
明らかに64bit幅が不要な箇所でsize_tに出くわすとおいおいと思ってしまう
これはbit数を明示した型を別に定義した方がよさそうだ
ああまいったまいった
0688デフォルトの名無しさん (ワッチョイ 9f1c-A/o5)
垢版 |
2024/04/19(金) 23:35:27.85ID:uO847wzt0
>>686
Windows1.0のexeもWindows10(32bit版)でも動くからな
64bit版は16bitコードの実行が廃止されたから無理
APIの方は割と変わってるけど、それでもちょっと直せばビルドできる
優秀なのはMicrosoftの方だなw
0691デフォルトの名無しさん (スフッ Sd70-mNzP)
垢版 |
2024/04/21(日) 10:58:55.51ID:WM7IEXRid
win10使ってるけどOffice 97をバイナリコピーして使ってるぞ、とうとう11では動かんのか…?
主にExcel使うが関数の数は劣ってもヘルプは古い方がよく出来てて一般ユーザとしては好み、一々ブラウザ起動されてたらい回しは嫌だ
0693デフォルトの名無しさん (ワッチョイ 66ad-6Ywt)
垢版 |
2024/04/21(日) 13:02:16.05ID:kDNr1IJ/0
Office97は32bitだから動くでしょ
駄目なのはWindows3.1までの16bitアプリ

じぶんもフリーソフトをいくつか64bit化したけどほとんど修正してない
早めにUnicodeにしてたおかげもあるかな
0695デフォルトの名無しさん (ワッチョイ 8732-Q9m/)
垢版 |
2024/04/29(月) 17:53:08.72ID:Mi5d5RVO0
あえて使う人もあんまりいないだろうけど、メンテナンスが止まってる(32bit 化、64bit 化されない)ようなソフトを使いたいってことはそれなりにあることじゃないの。
メーカーがつぶれて消えたりするのもよくあることだしな。
0696名無し兎と鰻の大乱闘 (ワッチョイ dffd-02Vv)
垢版 |
2024/04/29(月) 19:42:16.62ID:Yc7GJpMD0
そもそもしーげんごってなに?
0699デフォルトの名無しさん (ワッチョイ dfad-b946)
垢版 |
2024/04/29(月) 22:45:20.14ID:c1TFMEcy0
知り合いにエミュレータ入れたりして凄く苦労してロータス123を動かして業務で使っている人が居る。
0700デフォルトの名無しさん (ワッチョイ 8732-nVjz)
垢版 |
2024/04/30(火) 00:46:15.48ID:b4FWQSR70
使うのに手間はあるとはいえエミュレータが成熟してしまったので
かなり古いソフトウェアを動かしたいならそっちでやれと言えてしまうようになったとも言える。
Windows の互換性維持システムも結局はエミュレータをサブシステムとして
組み込んでるようなもんだしな。
0702デフォルトの名無しさん (ワッチョイ df79-V7Lt)
垢版 |
2024/04/30(火) 19:37:21.97ID:6siWZQQV0
なんで16bitの話になったのか理解不能
0703デフォルトの名無しさん (ワッチョイ dfad-b946)
垢版 |
2024/05/01(水) 16:53:57.29ID:udfiR5VM0
>>686の辺りから?
0705デフォルトの名無しさん (ワッチョイ df79-V7Lt)
垢版 |
2024/05/02(木) 23:28:34.67ID:gN+cVuNV0
CでCOMやれって言われても困るし
逆にC++のがマシってのはその程度か
0706デフォルトの名無しさん (ワッチョイ 5ff4-NzXl)
垢版 |
2024/05/03(金) 11:04:22.77ID:RJtMknPi0
cでもできるってのと、c++使ったほうが楽ってのでは全然意味違う
チームで混乱を招くという理由以外でのc++ディスりは、大抵理解不足によるアレルギーから来るヒスのことが多い
まあ、そういうヒス起こす人が多いからチームでは使用禁止とかになっちゃうわけだから、り繋がってはいるんだけど
0715デフォルトの名無しさん (ワッチョイ dfac-R43V)
垢版 |
2024/05/04(土) 01:40:48.74ID:nSEmjq+y0
メモリ構成が非常に小さいシステムの場合Cじゃない?
8bitのPICとか
0716デフォルトの名無しさん (ワッチョイ ff2d-y8PE)
垢版 |
2024/05/04(土) 17:05:29.45ID:VOfnZKej0
こういうの考えたんだけどどうだろう?
実用性無いだろうか

#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;
}
0721はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 8f32-uq6a)
垢版 |
2024/05/05(日) 00:00:07.41ID:NN+M7fak0
>>716
「こういうの」とは何であるか説明が必要。
提示されたコードは関数 exception_occurred の呼び出しを回りくどくやっているだけで、
途中のメカニズムに意味がない。
(このコードでの使い方の範囲では。)

言葉で説明しづらいならこれが有用になるような使い方の例を示して欲しい。
0723はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 8f32-uq6a)
垢版 |
2024/05/05(日) 00:22:13.83ID:yEjzRI9b0
>>722
C の言語仕様の範囲内でやる方法は setjmp/longjmp のみ。
setjmp/longjmp を自分で書きたいってことなら
アセンブラ (またはインラインアセンブラや intrinsic 関数) を使って
スタックポインタ操作したりレジスタの待避・復旧などをやる必要があるが……。

モダンな処理系だと最適化だのなんだのの都合でスタックフレームを省略したりだとかもあるので
それらと協調しないとまともに動作しない。
たとえば gcc だと setjmp/longjmp の実体は
組み込み関数の __builtin_setjmp/__builtin_longjmp として提供されてる。
処理系自体の機能として持たないとちゃんと動作させられんのだ……。
レスを投稿する


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