C言語なら俺に聞け 162

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

>>263
わかってるだろうけどレガシーコードをそうやって延命させるとますますワヤになるでよ。
2023/12/12(火) 22:39:58.31ID:Kje9ktjN0
>>264
言語仕様的にはグローバル変数 (記憶域期間が static) が不定になったりはしないことになっている (初期化子がなければゼロで初期化する) のでまともな開発環境があるところではそんな心配はしないよ。
心配が必要になるほど不確かな処理系しかない (または初期化処理も自分でかかなきゃいけないような低レイヤ) 分野もあるのは知ってるけどそれが普通ってことはない。
2023/12/12(火) 23:05:45.63ID:I4UWTUvH0
>>267
言語仕様ではなく2度目のdlopenの初期化の話なんだからドキュメント化されてないなら何の保証もないでしょ
2023/12/12(火) 23:55:24.16ID:skpldDGw0
>>268
そういう意味で言ってたのならわかる。
「どうして元から代入する処理を入れてなかった?それが普通だろ?」というニュアンスで受け取ってたから元は dlopen しなおしで対処する想定ではなかったからそういうことを心配してなかった (する必要がなかった) という反応になった。
2023/12/15(金) 08:29:58.25ID:a4YsmFKj0
板の名前変わった?
2023/12/17(日) 18:23:47.21ID:kc2HrTf20
ポインタ変数にアドレスを代入するのはシャローコピーと言えると思いますか?

char s[] = "abc";
char *p = s; // shallow copy
2023/12/17(日) 18:40:34.16ID:i7ihHaq10
果たしてコピーと呼んで良い操作ナノか
2023/12/17(日) 19:27:43.64ID:mH/O4qym0
>>271
言えません
274デフォルトの名無しさん (ワッチョイ e34d-e8vO)
垢版 |
2023/12/17(日) 19:32:39.54ID:MfQY7qyQ0
>>273
2023/12/17(日) 22:10:52.33ID:UmzU+/ux0
シャローコピーはディープコピーと並べて語るときに区別するための用語であって、
代入は普通に代入と呼ぶのが、コミュニケーションにおいて適切だ、
と、自分が聞かれた場合なら答えるし、レビュー依頼された場合なら指摘します
276デフォルトの名無しさん (ワッチョイ e34d-e8vO)
垢版 |
2023/12/18(月) 00:59:34.37ID:Mvyif4Hn0
>>275
シャローコピーと言えると思いますか?
277デフォルトの名無しさん (ワッチョイ e34d-e8vO)
垢版 |
2023/12/18(月) 00:59:46.13ID:Mvyif4Hn0
指摘する前に答えろよ無能
2023/12/18(月) 02:31:45.63ID:BtLCMjh/0
シャローコピーでしょ
2つのポインタが同じ内容になってる訳だから
ちなみに、変数定義時の代入文はバインド(束縛する)と言った方が適切だな
2023/12/18(月) 09:17:00.35ID:qIC94rZG0
>>276
言えません
2023/12/18(月) 09:38:52.52ID:RUscEa1Z0
シャローコピーの要件からすると
ポインタ変数にアドレスを代入するだけでは成立せずに
リファレンス可能なオブジェクトを指してるポインタでないとまずい気がする

char *p = (char *)0x000; /* アドレスを代入してるぞ */
2023/12/18(月) 10:45:42.59ID:RHsCrDES0
意見分かれますね
ではstrdupはディープコピーだと言えますか?
2023/12/18(月) 10:52:49.41ID:kauj19Ts0
C言語にはオブジェクトと言う概念がないからなあ
お気持ちとしてどうかと聞かれれば、人それぞれで
283デフォルトの名無しさん (ワッチョイ efc0-UNLj)
垢版 |
2023/12/18(月) 10:54:27.09ID:PYgWDYAB0
いやそれぬるぽ
2023/12/18(月) 12:07:36.53ID:ccgmPeZz0
>>281
ファイルシステムや仮想記憶とか、コピーオンライトといって、書き込みが発生するまでは単なる参照先のコピーだけでコピー完了としてしまう
要するに何をもってコピーかを、先ずは定義してくれ
2023/12/18(月) 12:57:51.87ID:vbeDxg2G0
それは C の概念モデルを前提にしていいだろ。
2023/12/18(月) 14:16:20.90ID:RUscEa1Z0
C++ の 参照だったら概念含めてそのまんまだったんだろうな
int a;
int& b = a;
287デフォルトの名無しさん (ワッチョイ 12ad-9NgZ)
垢版 |
2023/12/18(月) 14:52:23.89ID:kcYk1zSZ0
>>271
言えると思う。
288デフォルトの名無しさん (スフッ Sd32-3CSV)
垢版 |
2023/12/18(月) 16:19:13.36ID:xiaHc48Fd
内容が値を表すメモリの位置 = オブジェクト
2023/12/18(月) 17:05:11.17ID:pYYMlhZJ0
>>276
「言わない」

代入をシャローコピーだとか言ってなにか騒いでる人があなたの周りにいるという話?なら、そいつバカだからあなたは相手にしなくていいよ。あなたはもっと大事な問題に取り組むべき
2023/12/18(月) 17:09:52.77ID:kauj19Ts0
代入元の配列がスタック上なのかどうか、そちらの方がC言語的には重要
2023/12/18(月) 17:12:05.22ID:RUscEa1Z0
関数内の自動変数へのポインタを関数の外へ持ち出したりすると…
2023/12/18(月) 18:48:36.94ID:epkANb1d0
何かのポインタをメンバに持つ構造体の実体の複写
2023/12/18(月) 23:27:08.16ID:ccgmPeZz0
>>289
代入はコピーじゃないのか?
代入とコピーの本質的な違いは何だ?
2023/12/18(月) 23:33:27.08ID:a4PUOo8N0
コピーには違いないけどディープとかシャローとか区別できるものじゃないってことだろ
2023/12/18(月) 23:40:20.33ID:6hD73gHu0
>>293
代入は演算の種類
コピーは演算した結果起こる作用
用語を論理的に整理できてないとお話にならないだろう
RustvsC++スレ辺りでまともな議論ができてないのはこれのせい
296デフォルトの名無しさん (ワッチョイ 4b46-AQ+F)
垢版 |
2023/12/19(火) 08:23:42.15ID:ijJJQ5/r0
>>295
そういうコトなら、>>271
アドレスを代入演算した結果を、シャローコピーと言えるか、
という質問じゃないの?
297デフォルトの名無しさん (スププ Sd32-3CSV)
垢版 |
2023/12/19(火) 09:34:26.09ID:+6PK9xZxd
シャローコピーとかディープコピーとかはもともとPythonの概念ですよね?
298デフォルトの名無しさん (ワッチョイ 2701-NGr8)
垢版 |
2023/12/19(火) 09:54:57.24ID:hCROhcq70
は?
2023/12/19(火) 10:05:08.86ID:cwbunCZy0
>>289
馬鹿ってすぐ断定するよな
300デフォルトの名無しさん (ワッチョイ 77cd-UNLj)
垢版 |
2023/12/19(火) 10:07:03.49ID:KoTx3gw20
コピーとクローンは違うよな?
2023/12/19(火) 10:13:44.25ID:MIravlrKM
>>297
C++やJavaあたりが元だと思うけど
2023/12/19(火) 10:17:05.18ID:gboy58yC0
そういうことで、
Cにはシャローコピーとかディープコピーとかの概念はない
2023/12/19(火) 10:51:12.24ID:E9BI8x9B0
少し前までスマートな人がたくさんいたのにいつの間にかバカしか居なくなった
2023/12/19(火) 10:55:10.13ID:E9BI8x9B0
>>297
違います
2023/12/19(火) 11:32:45.68ID:df21V+Ma0
>>301
LISPじゃね?深いコピーは演習なんかの定番だった気がする
2023/12/19(火) 13:45:42.10ID:3Nu9QseCd
>>305
比較の手段が参照と値と構造とで数種類あるしそうだろうね
この手の大抵の起源はLispだよ
307デフォルトの名無しさん (スププ Sd32-Hm2B)
垢版 |
2023/12/19(火) 15:01:13.02ID:+6PK9xZxd
Pythonの解説書には大概、ディープコピーとシャローコピーが載ってますよ
2023/12/19(火) 15:28:24.33ID:J0ExAcTK0
>>305
もちろんそういう状況を扱っている事例は数多くある。
ただ、ざっと見た感じでは古いマニュアルでは「再帰的」とか「共有」とかいった語で説明するのが普通っぽい。
深い/浅いといった言い方が発生したのはもっと新しい言語でのことだと思う。
2023/12/19(火) 19:44:57.82ID:cwbunCZy0
複オジが粘着してそう
310デフォルトの名無しさん (ワッチョイ 77cd-UNLj)
垢版 |
2023/12/19(火) 19:48:51.51ID:KoTx3gw20
つか、Cは書いてる人にしか型が分からないからそんな器用な事は出来ないよな?
どっちのコピーも自前でちまちま作るしか無い
2023/12/19(火) 19:53:51.13ID:nmJwtfK30
呼称にこだわってる限りCなんて使えない
お上品な他の言語使ってりゃいいじゃん
2023/12/20(水) 05:56:32.08ID:r5p/Itr10
>>310
その通りですよ

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

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

そうだね 複オジ とか言われてた人の雰囲気と似てるね
2023/12/20(水) 09:35:46.96ID:/uXb+00h0
UPLIFT プレミアム・サービスのお知らせ

https://uplift.5ch.net/

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

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

最後まで御精読いただきありがとうございました。
2023/12/23(土) 02:06:44.23ID:cGlPuzRM0
>>297
もちろん概念としてはCの時代からある
しかし明確に言葉として定義したのはsmalltalkのはず
shallowCopyメソッドとかがある
2023/12/23(土) 10:35:35.90ID:1vO40jtV0
smalltalk、凄いな!私はバートランド・メイヤーさん、すごく尊敬してます
javadocとかdoxygenみたいなシステムも、もうあの時代に彼はすでに形にして世に出してるんですよね
例外の説明とか、プログラムを契約の履行に例える話とかもそうだし、あとコメント論とかもイケてるんですよ
頭良すぎて周りが付いてくのに何年もかかってる気がする
2023/12/23(土) 10:43:58.55ID:1vO40jtV0
てかまあ、Cのスレだね
でもCで構造体リモートコピーするにはさ、みたいな話をしても、多分誰も乗ってきてくれないよね
2023/12/23(土) 11:24:31.92ID:MLKmoxlx0
それは話の持ってき方。プレゼン上手ならできる
2023/12/23(土) 11:28:28.28ID:j8bI1ONF0
そーゆーのに憧れてる層には土方言語のCはいらんだろw
319デフォルトの名無しさん (ワッチョイ 43a4-BWWG)
垢版 |
2023/12/23(土) 11:41:06.10ID:PYuibGoS0
だからさ、C言語の変数や構造体内の型宣言なんてイイカゲンなんだからそう言う話ははなから無理なんだよ
2023/12/23(土) 11:42:27.32ID:1vO40jtV0
メッセージというか伝送パケットを作る話とかはどうですかね(皆さん興味ありますか)

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

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

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

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

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

メッセージ形式の仕様とは関係ないですね
2023/12/23(土) 12:17:04.95ID:1vO40jtV0
(…もしや「複オジ」さんだったかな?)
2023/12/23(土) 12:56:43.79ID:j8bI1ONF0
やっぱりめんどくさい奴だったかw
あんたにレスがもらえないのはテーマのせいじゃないとわかれ
333デフォルトの名無しさん (ワッチョイ 43a4-BWWG)
垢版 |
2023/12/23(土) 18:17:03.63ID:PYuibGoS0
>>330
安易に文字列を使う仕様にしてるとバイナリ通らないの忘れるし思わぬバグを生む原因になるから、最初からバイナリ配列にするか文字列操作関数を一切使わない様にしないとな
2023/12/24(日) 00:00:50.96ID:B84K7ZI6M
>>332
うん…(悲しい)
2024/01/05(金) 10:30:41.51ID:ph0QLfWd0
Perlとかで利用している設定ファイルがあるのですが、
Cで書いたプログラムでも同じファイルを設定ファイルとして読み込みたいです

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

val = abc
str1 = $val/AAA

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

それをやってくれるライブラリや関数等、ありますでしょうか
2024/01/05(金) 10:49:08.39ID:xgizPOi+0
その程度なら、自作できるだろう
337デフォルトの名無しさん (スププ Sd62-Blk0)
垢版 |
2024/01/05(金) 11:38:06.91ID:VxELzJcZd
#define val abc
338デフォルトの名無しさん (スププ Sd62-Blk0)
垢版 |
2024/01/05(金) 12:10:00.56ID:VxELzJcZd
enum { val = abc }
339デフォルトの名無しさん (スププ Sd62-Blk0)
垢版 |
2024/01/05(金) 12:13:38.69ID:VxELzJcZd
enum の方はエラーになる
340デフォルトの名無しさん (スププ Sd62-Blk0)
垢版 |
2024/01/05(金) 12:27:56.38ID:VxELzJcZd
#define もエラーになる
341デフォルトの名無しさん (スププ Sd62-Blk0)
垢版 |
2024/01/05(金) 12:30:33.41ID:VxELzJcZd
#define val "abc"
2024/01/05(金) 12:30:55.30ID:qVR6C9yQ0
>>335
そういうのをどう解決するかを自分が考えて実現するのが楽しいのに…

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

それぞれデメリットがあって、質問に直接答える「そういったライブラリはあるか」に一番合ってるのが、最後のlex/yaccだけど、それは一番バカらしい答えでもある。お好きに
2024/01/05(金) 12:51:00.35ID:qVR6C9yQ0
>>337
君、答える側になれる実力ないだろ
2024/01/05(金) 12:54:37.44ID:KwPCWpVD0
sscanfで読めばよかろうもん
2024/01/05(金) 13:07:45.12ID:t0UUGhQq0
>>335
その説明では何をやりたいのか伝わってないので仕様書を書いてみて。
理想的なライブラリがあったとして、そのテストケースという形式でもいい。
曖昧模糊な要望だと説明が下手なだけでなく説明しようとしている内容が見当違いな可能性を疑う。
(いわゆるXY問題)
2024/01/05(金) 13:32:24.69ID:38bnxq2E0
Cのソースでその展開もどきを行いたいのか
Cで書いてるプログラムがとあるファイル食って文字処理するんだけど、同じことを実現したいのか
2024/01/05(金) 13:37:38.46ID:M4U6Kwpw0
>>335
これは実装するとなると簡易言語になっちゃうな
でも変数と変数参照だけだから大して難しくないよ
たぶん1000行ぐらいに収まる
2024/01/05(金) 14:59:38.28ID:t0UUGhQq0
どうしても既存の設定ファイルをそのまま使いたい、それを処理できるようなものが欲しいということなら
そんな都合の良いものがあるわけない。 自分で書くしかしょうがない。

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

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

逆に設定どころではなくユーザーによるカスタマイズをどんどんやってもらうようなものなら
Lua とかのアプリケーション拡張言語を埋め込んでしまうという方法もとれる。
2024/01/05(金) 15:39:37.20ID:mdj5x9Xd0
Perlにそんな便利機能あったっけ
2024/01/05(金) 18:09:30.90ID:xFVV62H30
Cは遅延評価を積極的にやるための言語ではないからなあ
C++やC#ならあるんだけどね
lex/yacc はちょっと古くて
今なら flex/byson ですね
352デフォルトの名無しさん (ワッチョイ 42ad-nK/n)
垢版 |
2024/01/06(土) 15:06:00.15ID:NPThFXTg0
$ の変数展開しかやらないなら複雑な構文解析にはならないから全部自作した方が楽なのでは?
少し楽したいなら perl に読ませて $ 展開させた文字列に変換して出力したのを C の側で読むとかね。そうすると少し楽ができる。
これの問題は perl が使えない環境では動かないことかな。
2024/01/06(土) 16:25:37.13ID:2Gstkfh+0
今なら packcc おすすめ
2024/01/06(土) 16:27:28.51ID:iX+vez910
設定ファイルのデータ構造が key/value の組だけ、 value は単なる文字列という程度なら
パーサジェネレータはかえって邪魔じゃないのかな。
2024/01/06(土) 21:36:47.69ID:8zwGVkiA0
lex/yaccは使った事ない人にはハードル高いだろうね。逆に、使い方が分かると何でもそれでやりたがる時期が来る。どんなツールや言語でもそうだろうけど
2024/01/06(土) 21:39:52.15ID:YhaQaYGw0
BNF書いても大した量にならないだろうし俺ならフルスクラッチで書いちゃうな
2024/01/06(土) 21:45:36.68ID:8zwGVkiA0
で、設定ファイル、shで環境変数を設定すりゃ済む、という案に誰も反応してもらえないんだが、どうだい? windows ならcmdだろうけど

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

ドル記号で一時値の展開もできる。Cからも簡単に読める。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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