C言語なら俺に聞け 157

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 0345-kMi9)
垢版 |
2021/06/28(月) 11:22:51.50ID:so+vl3vs0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/

※前スレ
C言語なら俺に聞け 156
https://mevius.5ch.net/test/read.cgi/tech/1601271690/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2021/06/28(月) 11:26:33.76ID:so+vl3vs0
前スレ末期の流れを再掲
> 996 自分:デフォルトの名無しさん (ワッチョイ 0f45-Sffs)[sage] 投稿日:2021/06/28(月) 09:33:23.09 ID:so+vl3vs0 [1/2]
> printf("%d", sizeof (char)123); とやろうとしたら
> キャストのカッコがsizeofのカッコと解釈されてエラーになるのな
> printf("%d", sizeof((char)123)); ならおkなんだけど
> なんだか気持ち悪い
>
> 997 返信:デフォルトの名無しさん (ワッチョイ cf05-Ibo0)[sage] 投稿日:2021/06/28(月) 10:13:18.97 ID:x/UkG1ge0
> >>996
> sizeofって括弧なしで使えるの? 知らなかった
>
> 998 返信:デフォルトの名無しさん (ワッチョイ 0fda-qjGA)[sage] 投稿日:2021/06/28(月) 10:20:43.69 ID:WejOUFlX0
> >>996
> sizeof演算子の優先順位はcast演算子の優先順位より高いので、括弧がないと
> まず最初にsizeofと数値リテラルが評価されてその後でその結果をcastで評価するという
> おかしな状態になるのでエラーになったのでは?
>
> 999 自分:デフォルトの名無しさん (ワッチョイ 0f45-Sffs)[sage] 投稿日:2021/06/28(月) 10:38:03.51 ID:so+vl3vs0 [2/2]
> sizeofとキャストはどちらも単項式なので右から結合するはず
> にも関わらずキャストが先に読まれないので気持ち悪いと言ったんだ
> 字句解析と意味解析ってことかな
>
> 1000 名前:デフォルトの名無しさん (ワッチョイ 0fd2-kMi9)[] 投稿日:2021/06/28(月) 11:05:48.75 ID:HW6dR9O/0
> そもそも
> sizeof (char)
> paだけでいいものをそう記述してるのが気持ち悪い。
2021/06/28(月) 11:28:49.59ID:so+vl3vs0
>>前スレ1000

いやcharのサイズが知りたいのではなく
キャスト式(char)123のサイズを調べようとしたんだ

Cはchar変数の値を使おうとするとintに拡張するし文字定数もint型なので
char型の値を持つ式なんてあるのかって
2021/06/28(月) 11:37:03.08ID:XSoi24UgM
cppreferenceのc operator precedenceの項の注釈によるとオペアンドはtype castにはできないって書いてあるね。ただ仕様書の該当箇所は探せなかった
2021/06/28(月) 11:58:43.53ID:so+vl3vs0
脚注2は俺が気持ち悪いと言ったことと似てるけどsizeof(int)*pが
(sizeof(int)) * pという算術乗算になるという話なら単項式のsizeofより優先順位が低いからまだわかる
2021/06/28(月) 12:57:31.08ID:XSoi24UgM
A.2.1が引用元みたいなんで読んでみるとsizeof (int)123はダメだね。
sizeof +(int)123なら動くようだ。sizeof (int){1}も動きそう。
2021/06/28(月) 15:54:14.85ID:so+vl3vs0
あーそうか
A.2.1. (6.5.3)では
unary-expressionに該当するものの1つに
unary-operator cast-expressionがあるけど
unary-operatorにキーワードsizeofが含まれず、
カッコなしのキャスト式は
sizeof unary-expressionとなっていて
sizeof cast-expressionではないってことか
8デフォルトの名無しさん (ワッチョイ 3fad-wfqF)
垢版 |
2021/06/29(火) 00:32:13.44ID:jRoYjmsV0
ところで sizeof((char) 123) と sizeof(char) って同じことだよな?
2021/06/29(火) 01:01:59.00ID:cYz04uBKM
ポインタキャストは敷居線さえ跨がなきゃ思い通りの値出てくるけど
数値キャストは難しいんだよな
2021/06/29(火) 01:04:11.67ID:lZY/6JCta
>>8
GCC 9.3.0 では両方とも 1 でした
2021/06/29(火) 01:05:05.10ID:cYz04uBKM
printf さんの独自性もあるし
12デフォルトの名無しさん (ワッチョイ 3fad-wfqF)
垢版 |
2021/06/29(火) 02:00:52.74ID:jRoYjmsV0
>>10
ていうかやるまでもなく結果が同じにならないとおかしいよね。
一方は値を char 型にキャストしているんだから sizeof の結果は char 型のサイズになる。
もう一方は char 型のサイズを求めているから char 型のサイズになる。
2021/06/29(火) 04:29:15.93ID:OP5z1lEO0
二項演算子のいくつかでは汎整数拡張が適用されることになっているが
sizeof に渡す分には char のオブジェクトは char のオブジェクトだよ。
14デフォルトの名無しさん (ワッチョイ 0fd2-hdpQ)
垢版 |
2021/06/29(火) 08:37:44.49ID:F75/2W0I0
char型 + char型 の式でもint型に拡張されるんだっけ?
2021/06/29(火) 13:20:32.79ID:f0Xm8hptd
もち
単項プラスでさえ拡張する
2021/06/29(火) 13:41:07.94ID:dKjX5GmV0
typedefによる新しい型の定義って、コンパイラの工程的にはどの工程で定義されるの?
字句解析?構文解析?プリプロセスじゃないよね
2021/06/29(火) 14:16:01.66ID:NxeKtV2S0
質問が間違ってる気がするけどね。
コンパイルレベルで処理されるのか、リンクするまで処理されないのか、でしょ。
で、typedefは前者
2021/06/29(火) 20:18:28.43ID:SX14oDOe0
翻訳段階の何番目でやってんのかって質問だろ
2021/06/29(火) 20:52:30.02ID:0ahpifum0
構文解析の後 typedef と認知したうえで、シンボルのテーブルに追加してかないと
置換?読み替え?はできないよねぇ…

C言語は、その構造上1回の通読では解決できないんだっけ?
2021/06/29(火) 21:06:15.61ID:SX14oDOe0
5.1.1.2 Translation phasesくらい読んでから来いよ
2021/06/29(火) 22:00:49.44ID:NxeKtV2S0
だからぁw
構文解析ってのはパーサね?w←これは例えばbisonで作るやつね?w
字句解析ってのはレキシカルアナライザね?w←これは例えばflexで作るやつね?w
レキシカルアナライザかパーサかって、そもそもレキシカルアナライザってのは
字句区切るだけだよwそれをどんな命令であるかを解釈を決めるのが構文解析ねw

コンパイルの1pass,2passって話なら、まあそれでもいいけどさw
用語がでたらめすぎんでしょ。
だいたいそんなこと知ってどうするんだよ?w
2021/06/29(火) 22:05:17.86ID:gp7v5PNW0
セキュリティホール探し?
2021/06/29(火) 23:35:14.00ID:dKjX5GmV0
Cの構文解析器実装してるんだけどBNFのtypedefの扱いがイミフなんだよねー
2021/06/29(火) 23:57:55.23ID:NxeKtV2S0
>>23
またぁw
BNF関係ないでしょうw

つか、typedefなんて意味不明なんてことはないと思うけど。
特定の記法のことを指してるの?BNFで書かれた
typedefの規則が読みとれないって言ってるの?w

typedef struct {...};

struct {...} xxx;
を区別できないとかそんな話?
よくわかんないけど、変に切り出すんじゃなくて、
ストレートにこれがやりたいけど、これどうしたらいいか
わかんない、って聞く方がいいと思うんだが。
なにいってんだか、知ってる人ほど却ってわかんねーと思うんだが。
2021/06/30(水) 00:35:54.93ID:dsegDYOD0
typedefがstorage-class specifierに属してることを言ってるなら
構文上の便宜のためだけ(for syntactic convenience only)って6.7.1(5)に書いてあるけど
Annexのsyntax summaryだけ見てる感じかな

かなりエスパーしてるから的外れだったらすまぬ
2021/06/30(水) 01:02:59.78ID:xHlidKVh0
みなさんレスありがとう
「C BNF」でググって一番上に出るBNFを参考に実装しているんだけど、BNFが古いせいかtypedefの構文が欠落してるような気がして(気のせいでした。↓のレス参照)
でも<typedef-name>という要素はあるからtypedef機能自体はあるらしい
BNFに書いてないってことは構文解析以前の処理になるのかもしれないと思ってここで聞いてみたんだけど
混乱した人もいるみたいですまない

>>25
あー!そういうことですか
なるほど疑問が解けました
typedefをspecifierで扱ってるわけですね
ありがとうございます
2021/06/30(水) 06:48:58.92ID:tpFz8l2w0
typedefがないってことはK&R Cか

規格票でもドラフトでもいいから拾って読んでみ
http://www.open-std.org/jtc1/sc22/wg14/
2021/06/30(水) 09:43:56.46ID:xHlidKVh0
>>27
参照してるBNFはおそらくK&R Cですね
関数の宣言が古いスタイルになっているので
ありがとうございます、参照してみます
2021/07/17(土) 09:12:05.75ID:17h8nqYk0
リスト型構造体配列って他の言語でもあるのでしょうか?
現在職業訓練で勉強中なのですが、独学でやらないといけない範囲のようでして、
時間的余裕があまりない状態です。

他言語でも似たような考えが出てきて、Cで覚えておくと役立つなど
ございましたら、頑張って挑戦してみようと思っています。
2021/07/17(土) 12:16:52.25ID:xP6i4weKM
リスト型構造体配列ってのは講師の人の自作用語?
それなら定義を示してもらわんと。
2021/07/17(土) 12:38:05.00ID:+M7J9sQi0
リンクリストなら他の言語にもある
普通は配列とは言わないからその言葉は謎だけど……
2021/07/17(土) 13:34:21.36ID:e6axNbpd0
ポインタの代わりに配列のインデックスを保持してるような感じなのかね?
リスト型構造体配列
33デフォルトの名無しさん (ワッチョイ c628-0cQV)
垢版 |
2021/07/17(土) 16:17:40.91ID:USprSk230
C99かそれ以降の標準的な環境において

(bool)someval



!!someval

って(例外なしに)全くおなじ効果を生むと思っていいですか。

前者はJISX3010の6.3.1.2などで「値が0になるなら0,それ以外なら1」と書かれている一方,
後者は(初学者なので経験がなく,正しい認識ではないかもしれませんが)慣用的な書き方なので
規格票にも書かれておらず,正確に同じ意味なのかどうかを確かめられませんでした。
2021/07/18(日) 00:36:46.74ID:vIcCvIPT0
>>33
「意味するところは全く違うが、結果だけ見れば全く同じ」です。
35デフォルトの名無しさん (アウアウウー Sa39-rGUB)
垢版 |
2021/07/18(日) 01:19:32.77ID:euqgtMPHa
bool型が導入されたことで得られるメリットはは何かあるでしょうか
またデメリットはあるでしょうか
2021/07/18(日) 07:53:07.50ID:OEfNT0QGM
メリットは、必ず真偽値になること

デメリットは、必ず真偽値になってしまうこと
例えばエラーコードのようにいい加減な経緯で拡張していくことはできない
2021/07/18(日) 09:54:45.66ID:9YAoR/6C0
>>35
ctypes.h の isalpha() とか islower() とかその他大勢は、偽のときは 0 を必ず返しますが、真のときは 1 とは限らない 0 でない別の数を返したりするんですよ
そういうのは紛らわしいので、そういう紛らわしさが減る bool の存在はありがたいですね
38デフォルトの名無しさん (エムゾネ FFfa-E0YB)
垢版 |
2021/07/18(日) 16:58:13.77ID:jPlpwmsoF
関数の () は演算子
キャストの () は演算子
だそうですが
数学の数式で優先度上げるのに相当する () は演算子ですか?
2021/07/18(日) 17:14:40.88ID:6AMrYKMS0
いいえ
2021/07/18(日) 20:03:28.13ID:i83/r50ia
>>34
ありがとうございます!
2021/07/18(日) 20:08:43.08ID:i83/r50ia
>>34
すんません
入力欄間違えました。
2021/07/18(日) 21:49:36.58ID:+Ch+KzUq0
>>33
真偽値型にキャストした結果の型は _Bool で、 !! を通した型は int という違いはある。

https://wandbox.org/permlink/zlxhRTGr5Sj8IsiH

整数を扱う多くの場合では整数拡張が入ったりして違いが吸収
されてしまうからどちらでもいい場合がほとんどだと思うけど、
あらゆる状況で完全に同じとは言い切れない。

ちなみに C++ では整数に ! を適用した結果は bool なので、
もちろん !! の結果も bool になる。
2021/07/18(日) 21:52:36.39ID:V2Gw1I3v0
>>38
違う
一次式を囲む()は
後置式に属する関数呼び出しの()でも
単項式に属するキャスト記法のキャストの()でもない
2021/07/18(日) 22:42:35.27ID:4j3GDjyk0
>>42
_Generic 便利ですね……。C11から追加されたんだ。
2021/07/18(日) 22:44:22.95ID:4j3GDjyk0
>>38
ほとんど関係ないけど,Haskelだと優先度を上げる()記法を
$演算子で代用できるから,
「優先度を上げる()を演算子としてみる」というのはそう不自然ではないかも。

でも(たぶん)C言語だとそういうことはない。
2021/07/19(月) 17:37:03.07ID:3YhpibAgF
こういう認定試験用にC言語勉強するときって
https://www.sikaku.gr.jp/js/cpjv/
32bit版のコンパイラの方が良いんでしょうか?
64bit版でintとかsize_tとかサイズ変わると困りませんか?
2021/07/19(月) 17:41:05.09ID:GP2gJIPC0
逆にsizeof(size_t)が返す値が処理系定義であることを考え落とす癖がつくと
そこを弱点として狙われるぞ
2021/07/20(火) 15:47:40.82ID:BjsPOMc70
変わって困ることならむしろ困ってみたほうが勉強になるんじゃね。
49デフォルトの名無しさん (エムゾネ FFfa-E0YB)
垢版 |
2021/07/20(火) 17:03:23.21ID:2ecX9oPqF
> 1級で使用する環境について(公開試験)
コンパイラ Borland C++ Compiler 5.5
JIS X 3010-1993に対応
エディタ TeraPadまたはメモ帳
文字コード:SHIFT-JIS、改行コード:CR+LF

※当コンパイラの操作にはコマンドプロンプトの知識が必要です。
※解答用のソースプログラムは、SHIFT-JISで保存してください。
※指定した保存形式で保存されていない場合は、採点の対象となりません。

・・・なんだかなぁ
2021/07/20(火) 18:27:33.17ID:rDNdpvsmK
せめてC99対応コンパイラにしようよ
2021/07/20(火) 18:37:29.47ID:LjuPHZpl0
JISX 3010 1993で使えない構文や関数を回避して回答する能力を受験者に課すなんてなかなか高度な試験だね
2021/07/20(火) 20:03:33.02ID:Plw9uEZeM
BCCってまだVSの無料版が無かった頃に無料で使えるコンパイラとして粂井氏のHPで紹介されてて使ってたなあ
その時代から何も進化してない資格なんだろうな……
2021/07/21(水) 00:20:28.07ID:fGno+40ia
bccとかLSI-C(試食版)とか、Cマガの付録で
2021/07/21(水) 07:39:41.26ID:A0/pIuIc0
BCCは知ってても それだけじゃ困ります
2021/07/21(水) 09:12:39.48ID:+0/niNvm0
> JIS X 3010-1993に対応

つーことは
int main(void)
{
printf("");
int x; /* これがダメ */
//このコメントもダメ
for(int y = 0; y < 1; y++) ; //これもダメ
}
今どきのコンパイラはみんなOKなのに
うっかり使うと減点されるという陰険な罠だな
2021/07/21(水) 09:45:21.46ID:DbniEar00
検定する側が時代遅れで
しかもこんなレベルじゃ
最早コボちゃん世代を嗤えませんね?
2021/07/21(水) 10:08:36.90ID:tIqEOSex0
まあそういう時代もあったというのは知識として有るに越したことは無いが、
前提とされるとだいぶんしんどいな。
2021/07/21(水) 11:16:37.45ID:CAhJ9aCx0
じじい度検定になっとる
2021/07/21(水) 20:55:54.33ID:NQ6A/S1F0
Cの範囲内なのにえらいストレスフルやな
//コメントや for 内の変数宣言が禁じられると辛い
2021/07/21(水) 21:11:33.77ID:kmyfY3M8M
だんだんいじくり回されてワケわからん言語になるんだろうな
2021/07/21(水) 22:43:38.51ID:tIqEOSex0
>>60
あまり変更するのもどうかと思うけど
昔のままで良しというわけにもいかん部分もあるし、
現実的な妥協点をさぐりながら改定していくしか仕方がないだろ。
2021/07/22(木) 00:04:04.57ID:0pHC70l40
今日,O'rellyの『Lex & Yacc』で「自己参照型構造体」という概念を知ったんだけど,
これが動作する理屈とかこういう書き方をする利点がマジでわからなくて苦戦してる。

でもこれを理解できるようになればメモリ確保やポインタ参照の話がわかるようになる……
と期待してがんばる。
2021/07/22(木) 00:13:03.51ID:r7I3CYuM0
基本的なメモリ管理をわからない段階で yacc の本を読んでるのか。
実用を通して理解するのもひとつの道ではあるだろうけど、
最初はもっと単純な事例集みたいなのを見るほうがいいと思う。
2021/07/22(木) 00:14:52.69ID:24/oAOWdd
>>62
言わば再帰的定義の産物だよ。
論理的に入れ子の構造にする訳。
ヌルポインタで終わり。
2021/07/22(木) 09:38:36.05ID:ERrrf0sq0
自分が興味あることから掘り下げて行くのはいいと思うよ
とりあえず C言語 リスト構造 とかでググってみて
66デフォルトの名無しさん (エムゾネ FFfa-E0YB)
垢版 |
2021/07/22(木) 10:14:39.29ID:I7nexIleF
struct A { A a; }; ではないからな
struct A { A *p; }; ならただのポインタ
2021/07/22(木) 10:53:20.02ID:kFdJ5CFB0
Ruby は、Bison, flex だったか?
2021/07/22(木) 12:38:58.69ID:0pHC70l40
>>63
「勉強不足」といわれればそれはその通りなんだけど
寧ろC言語のやっかいな部分にできるだけ触らないですむように
という動機でlexとyaccを学んでるんですよね……。
↑まあこういう考え方が間違ってるかもということに
『Lex & Yacc』を読んでいて気付きはじめていますが……

>>65
こういう↓ことですよね。
https://dev.grapecity.co.jp/support/powernews/column/clang/031/page02.htm
実は『Lex & Yacc』内ではそのコード概念の名前はでてこなくて
コード断片でggったりしてました。
2021/07/22(木) 12:48:57.06ID:MMqyZQ9/0
>>66
- A *p;
+ struct A *p;
ここはCスレだぞ

struct A
{
struct A a; //incomplete typeなのでオブジェクトは定義できない
};
70デフォルトの名無しさん (エムゾネ FFfa-E0YB)
垢版 |
2021/07/22(木) 14:18:45.83ID:I7nexIleF
「自己参照型」っていうのが
誤訳なんじゃないかって思ってる

実際には「自己型参照型」でしかない
ポインタを代入するときに自分自身(オブジェクト)のポインタを代入する訳じゃないから
自己を参照してる訳じゃないんだ
ここを誤解するから理解が進まない

>>69 君には伝わってるから良いよ
2021/07/22(木) 14:34:42.13ID:MMqyZQ9/0
ISO: self-referential structure
JIS: 自己参照する構造体

誤訳かねえ
2021/07/22(木) 14:50:14.55ID:G9vEgy1w0
int arg;
p = (*p)(arg);

戻りが関数(A)のポインタとなる 引数int を取る関数(A) の宣言もまた
記述が無理な事案ですかの
2021/07/22(木) 15:29:46.76ID:kFdJ5CFB0
自己参照型は、2分木とか?

親は、2つの子のポインターを持っていて、それが再帰的に続くもので、
親子は同じ構造をしているもの
2021/07/22(木) 16:19:06.28ID:r7I3CYuM0
わざわざ「自己参照する構造体」という用語が与えられているのは構造体タグのスコープを
説明する文法解説上の都合じゃないかな。

ノードを直列に接続すればリストになったり複数の接続を持てば木になったりというデータ構造のことと、
他のノードへの接続には C ではポインタを使うのが自然だというふたつの事柄を併せると
結果的に自分自身 (を含む構造体) と同じ型のオブジェクトを指すポインタが現れることもあるというだけのことで、
(データ構造、また、その管理においては) 指している型が同じなのか違うのかで
ことさらに区別して考える意味はあまりないように思う。
2021/07/22(木) 16:44:22.00ID:zX6Mldkk0
C言語の勉強中にリスト構造とかの部分でポインタがよくわからない!って人良く見るけど
実際のところC言語で仕事するときにリストとか二分木ってあんま使わなくね?
構造体の配列は良く見るけど

組み込み系とかだとメモリ少しでも節約するためにリストにしたりするの?
2021/07/22(木) 16:55:22.66ID:MMqyZQ9/0
> 組み込み系とかだとメモリ少しでも節約するためにリストにしたりするの?

意味がよくわからんが
組み込みでもリストもmallocも普通に使うぞ
OSがなきゃmalloc使えんとでも思っているのか?
2021/07/22(木) 17:03:27.91ID:zX6Mldkk0
>>76
いや一般的にリソース制約の多い組み込み系だからこそmallocとリスト構造使って
本当に使う分だけメモリ確保するのかなと思ったんだけど
なんか気に触ったのならすみません
2021/07/22(木) 17:12:18.33ID:MMqyZQ9/0
> C言語で仕事するときにリストとか二分木ってあんま使わなくね?

気に障るってか、数秒えってなった
2021/07/22(木) 17:27:11.52ID:r7I3CYuM0
>>75
ワイはプロではないし組み込みのこともよう知らんけど
言語処理系を作ったときに当然ながら構文木を組み立てたりはしたし、
宣言した名前を保存するハッシュテーブルはチェイン法を使ったのでリストの一種でもあるわな。
(今なら面倒くさいので C++ で書いてしまう (標準ライブラリのコンテナを使う) だろうけど。)

分野によるとは思うけど、リストや木がそんなにほとんど目にしないというほうが不自然な気がする。
2021/07/22(木) 17:58:20.48ID:4yFOTvD80
>>77
横からだけどマイコン次第だわな。メモリの動的確保なんて、
そもそも無理ーって処理系もある。コンパイル時にメモリは固定しちゃう。

昨今の32bitのARMマイコンやらESPやら最近触ってるけどmallocも普通にあるし、
サポートライブラリにlistのソース付いてたり(それを使うべきかは悩む)。
更にc++なんかも普通に使えるから、なんか落ち着かんw
2021/07/22(木) 21:02:00.87ID:NQdyjX4FM
簡単なテキストエディタ作ってみてください
82デフォルトの名無しさん (アウアウウー Sa5d-Hgw+)
垢版 |
2021/07/23(金) 00:04:27.67ID:efwzK8IKa
っsed
2021/07/23(金) 00:26:23.76ID:IkF8M4100
あれは簡単なのか?w
コマンド自由に操れる人、果たしているのかな?
2021/07/23(金) 06:51:28.40ID:U6L8J7vD0
作るのが簡単 ≠ 使うのが簡単
2021/07/23(金) 07:52:07.52ID:/J+0ROXX0
えー? sed禁止とか言われたら立ち直れんぞ
2021/07/23(金) 09:04:13.56ID:/WZbwRMt0
sed awkして(ry
2021/07/23(金) 09:41:53.92ID:lst4CtWH0
Screen EDitor ですねわかります
2021/07/23(金) 18:17:37.42ID:kuO5Sx1T0
よくUnixについての記事や書籍に,
「sedは入力全体を一度に読み込まず一行ごとに処理するから
動作が遅くならず,メモリ容量も気にしなくていい」
みたいなことが書いてあって,それは概ね事実だと思うんだけど,
C言語でsedを実装するときもviを実装するときに比べて
メモリ確保とかが楽なんだろうか。
2021/07/23(金) 19:24:45.90ID:Nx0yKcVz0
Ruby では、

IO.readlines は、ファイル内のすべてを読み込むが、
IO#each_line は、1行ずつ読み込む
2021/07/23(金) 19:49:44.19ID:IkF8M4100
sedにもホールドスペースがあるから、テキスト全体を読み込んで処理する事も出来る
2021/07/23(金) 23:06:00.86ID:kreL/CiTK
>>88
そらviよりは楽だろうが、Nコマンドとかで複数行抱える必要はあるし、そもそも数百万桁の行食わされるかもしれんし。
オリジナルsedは確か桁数制限あったよね?
2021/07/24(土) 00:40:19.89ID:osiAYP280
>>91
最新の標準Unixだとsedは最低8192バイトだけ読み込めばいいみたいよ。
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html
2021/07/24(土) 01:03:44.23ID:3ie/V+ee0
POSIX標準は満たすべき最低レベルを規定しているって事ではないかな?
GNU sed の実装はこうみたいだ

For those who want to write portable sed scripts, be aware that some implementations have been known
to limit line lengths (for the pattern and hold spaces) to be no more than 4000 bytes. The POSIX standard
specifies that conforming sed implementations shall support at least 8192 byte line lengths. GNU sed has
no built-in limit on line length; as long as it can malloc() more (virtual) memory, you can feed or construct
lines as long as you like.
2021/07/26(月) 12:30:48.85ID:yVSFJZsJ6
自己参照型構造体(用語法的に正しくないという指摘もあるけど…)がちょっとわかったかも。

はじめは『もう一度基礎からC言語』の第31回「データ構造(10)〜構造体をポインタでつなぐ」
https://dev.grapecity.co.jp/support/powernews/column/clang/031/page02.htm
を参考にしてたんだけど,記事集の題名からも察せる通り「初めてC言語を学んでいる」
という状態で読むには向いていなかった。

図書館でそれっぽい本を漁って見つけた,
『C実践プログラミング』の17章「高度なポインタ」にある解説が
初学者としては一番わかりやすかった。
わざわざこのスレで報告する需要はないかもしれないけど,
将来に,おなじような概念の理解で詰まっているひとの
助けになるかもしれないからという言い訳でもって書き込ませてください。

--

C言語でデータ構造を作ろうと思ったら,
基本的にコンパイル時から大きさを決め打ちして用意せざる得ないけれど,
無から有を作り出せるー*1]malloc関数を用いることで
コンパイル時ではなく実行時に自由に拡大できるという,
記憶領域を食いにくいのに大規模な情報を格納できるデータ構造を作れる。
なぜ構造体を使うのかは自明すぎるためか書籍では明言されていなかった。
あえて言葉にするなら,
C言語において 複雑な情報を格納できるデータ構造を作るにあたって
「構造体を定義する」ことはもっとも一般的な慣行であることと,
C言語の演算子に自己参照型構造体の操作に非常に便利な演算子
構造体ポインタ演算子->が用意されているということが決め手なのかな。

*1: ちょっと違う気がするけど,書籍にはそう書いてあった。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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