X



C言語なら俺に聞け 157
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん (ワッチョイ 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
0002デフォルトの名無しさん (ワッチョイ 0f45-Sffs)
垢版 |
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だけでいいものをそう記述してるのが気持ち悪い。
0003デフォルトの名無しさん (ワッチョイ 0f45-Sffs)
垢版 |
2021/06/28(月) 11:28:49.59ID:so+vl3vs0
>>前スレ1000

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

Cはchar変数の値を使おうとするとintに拡張するし文字定数もint型なので
char型の値を持つ式なんてあるのかって
0005デフォルトの名無しさん (ワッチョイ 0f45-Sffs)
垢版 |
2021/06/28(月) 11:58:43.53ID:so+vl3vs0
脚注2は俺が気持ち悪いと言ったことと似てるけどsizeof(int)*pが
(sizeof(int)) * pという算術乗算になるという話なら単項式のsizeofより優先順位が低いからまだわかる
0007デフォルトの名無しさん (ワッチョイ 0f45-Sffs)
垢版 |
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ではないってことか
0008デフォルトの名無しさん (ワッチョイ 3fad-wfqF)
垢版 |
2021/06/29(火) 00:32:13.44ID:jRoYjmsV0
ところで sizeof((char) 123) と sizeof(char) って同じことだよな?
0012デフォルトの名無しさん (ワッチョイ 3fad-wfqF)
垢版 |
2021/06/29(火) 02:00:52.74ID:jRoYjmsV0
>>10
ていうかやるまでもなく結果が同じにならないとおかしいよね。
一方は値を char 型にキャストしているんだから sizeof の結果は char 型のサイズになる。
もう一方は char 型のサイズを求めているから char 型のサイズになる。
0014デフォルトの名無しさん (ワッチョイ 0fd2-hdpQ)
垢版 |
2021/06/29(火) 08:37:44.49ID:F75/2W0I0
char型 + char型 の式でもint型に拡張されるんだっけ?
0019デフォルトの名無しさん (ワッチョイ 0f01-htoQ)
垢版 |
2021/06/29(火) 20:52:30.02ID:0ahpifum0
構文解析の後 typedef と認知したうえで、シンボルのテーブルに追加してかないと
置換?読み替え?はできないよねぇ…

C言語は、その構造上1回の通読では解決できないんだっけ?
0021デフォルトの名無しさん (ワッチョイ 3f66-j5Ba)
垢版 |
2021/06/29(火) 22:00:49.44ID:NxeKtV2S0
だからぁw
構文解析ってのはパーサね?w←これは例えばbisonで作るやつね?w
字句解析ってのはレキシカルアナライザね?w←これは例えばflexで作るやつね?w
レキシカルアナライザかパーサかって、そもそもレキシカルアナライザってのは
字句区切るだけだよwそれをどんな命令であるかを解釈を決めるのが構文解析ねw

コンパイルの1pass,2passって話なら、まあそれでもいいけどさw
用語がでたらめすぎんでしょ。
だいたいそんなこと知ってどうするんだよ?w
0024デフォルトの名無しさん (ワッチョイ 3f66-YS6X)
垢版 |
2021/06/29(火) 23:57:55.23ID:NxeKtV2S0
>>23
またぁw
BNF関係ないでしょうw

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

typedef struct {...};

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

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

>>25
あー!そういうことですか
なるほど疑問が解けました
typedefをspecifierで扱ってるわけですね
ありがとうございます
0029デフォルトの名無しさん (ワッチョイ b6da-xL6t)
垢版 |
2021/07/17(土) 09:12:05.75ID:17h8nqYk0
リスト型構造体配列って他の言語でもあるのでしょうか?
現在職業訓練で勉強中なのですが、独学でやらないといけない範囲のようでして、
時間的余裕があまりない状態です。

他言語でも似たような考えが出てきて、Cで覚えておくと役立つなど
ございましたら、頑張って挑戦してみようと思っています。
0033デフォルトの名無しさん (ワッチョイ c628-0cQV)
垢版 |
2021/07/17(土) 16:17:40.91ID:USprSk230
C99かそれ以降の標準的な環境において

(bool)someval



!!someval

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

前者はJISX3010の6.3.1.2などで「値が0になるなら0,それ以外なら1」と書かれている一方,
後者は(初学者なので経験がなく,正しい認識ではないかもしれませんが)慣用的な書き方なので
規格票にも書かれておらず,正確に同じ意味なのかどうかを確かめられませんでした。
0035デフォルトの名無しさん (アウアウウー Sa39-rGUB)
垢版 |
2021/07/18(日) 01:19:32.77ID:euqgtMPHa
bool型が導入されたことで得られるメリットはは何かあるでしょうか
またデメリットはあるでしょうか
0037ハノン ◆QZaw55cn4c (ワッチョイ aee9-6rOL)
垢版 |
2021/07/18(日) 09:54:45.66ID:9YAoR/6C0
>>35
ctypes.h の isalpha() とか islower() とかその他大勢は、偽のときは 0 を必ず返しますが、真のときは 1 とは限らない 0 でない別の数を返したりするんですよ
そういうのは紛らわしいので、そういう紛らわしさが減る bool の存在はありがたいですね
0038デフォルトの名無しさん (エムゾネ FFfa-E0YB)
垢版 |
2021/07/18(日) 16:58:13.77ID:jPlpwmsoF
関数の () は演算子
キャストの () は演算子
だそうですが
数学の数式で優先度上げるのに相当する () は演算子ですか?
0042はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 693e-xL6t)
垢版 |
2021/07/18(日) 21:49:36.58ID:+Ch+KzUq0
>>33
真偽値型にキャストした結果の型は _Bool で、 !! を通した型は int という違いはある。

https://wandbox.org/permlink/zlxhRTGr5Sj8IsiH

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

ちなみに C++ では整数に ! を適用した結果は bool なので、
もちろん !! の結果も bool になる。
0045デフォルトの名無しさん (ワッチョイ c628-Tv+1)
垢版 |
2021/07/18(日) 22:44:22.95ID:4j3GDjyk0
>>38
ほとんど関係ないけど,Haskelだと優先度を上げる()記法を
$演算子で代用できるから,
「優先度を上げる()を演算子としてみる」というのはそう不自然ではないかも。

でも(たぶん)C言語だとそういうことはない。
0049デフォルトの名無しさん (エムゾネ 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で保存してください。
※指定した保存形式で保存されていない場合は、採点の対象となりません。

・・・なんだかなぁ
0055デフォルトの名無しさん (ワッチョイ 4545-zSg9)
垢版 |
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なのに
うっかり使うと減点されるという陰険な罠だな
0062デフォルトの名無しさん (ワッチョイ c628-Tv+1)
垢版 |
2021/07/22(木) 00:04:04.57ID:0pHC70l40
今日,O'rellyの『Lex & Yacc』で「自己参照型構造体」という概念を知ったんだけど,
これが動作する理屈とかこういう書き方をする利点がマジでわからなくて苦戦してる。

でもこれを理解できるようになればメモリ確保やポインタ参照の話がわかるようになる……
と期待してがんばる。
0063はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 693e-xL6t)
垢版 |
2021/07/22(木) 00:13:03.51ID:r7I3CYuM0
基本的なメモリ管理をわからない段階で yacc の本を読んでるのか。
実用を通して理解するのもひとつの道ではあるだろうけど、
最初はもっと単純な事例集みたいなのを見るほうがいいと思う。
0066デフォルトの名無しさん (エムゾネ FFfa-E0YB)
垢版 |
2021/07/22(木) 10:14:39.29ID:I7nexIleF
struct A { A a; }; ではないからな
struct A { A *p; }; ならただのポインタ
0068デフォルトの名無しさん (ワッチョイ c628-Tv+1)
垢版 |
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ったりしてました。
0070デフォルトの名無しさん (エムゾネ FFfa-E0YB)
垢版 |
2021/07/22(木) 14:18:45.83ID:I7nexIleF
「自己参照型」っていうのが
誤訳なんじゃないかって思ってる

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

>>69 君には伝わってるから良いよ
0074はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 693e-xL6t)
垢版 |
2021/07/22(木) 16:19:06.28ID:r7I3CYuM0
わざわざ「自己参照する構造体」という用語が与えられているのは構造体タグのスコープを
説明する文法解説上の都合じゃないかな。

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

組み込み系とかだとメモリ少しでも節約するためにリストにしたりするの?
0076デフォルトの名無しさん (ワッチョイ 4545-zSg9)
垢版 |
2021/07/22(木) 16:55:22.66ID:MMqyZQ9/0
> 組み込み系とかだとメモリ少しでも節約するためにリストにしたりするの?

意味がよくわからんが
組み込みでもリストもmallocも普通に使うぞ
OSがなきゃmalloc使えんとでも思っているのか?
0077デフォルトの名無しさん (ワッチョイ daad-n9Kp)
垢版 |
2021/07/22(木) 17:03:27.91ID:zX6Mldkk0
>>76
いや一般的にリソース制約の多い組み込み系だからこそmallocとリスト構造使って
本当に使う分だけメモリ確保するのかなと思ったんだけど
なんか気に触ったのならすみません
0079はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 693e-xL6t)
垢版 |
2021/07/22(木) 17:27:11.52ID:r7I3CYuM0
>>75
ワイはプロではないし組み込みのこともよう知らんけど
言語処理系を作ったときに当然ながら構文木を組み立てたりはしたし、
宣言した名前を保存するハッシュテーブルはチェイン法を使ったのでリストの一種でもあるわな。
(今なら面倒くさいので C++ で書いてしまう (標準ライブラリのコンテナを使う) だろうけど。)

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

昨今の32bitのARMマイコンやらESPやら最近触ってるけどmallocも普通にあるし、
サポートライブラリにlistのソース付いてたり(それを使うべきかは悩む)。
更にc++なんかも普通に使えるから、なんか落ち着かんw
0082デフォルトの名無しさん (アウアウウー Sa5d-Hgw+)
垢版 |
2021/07/23(金) 00:04:27.67ID:efwzK8IKa
っsed
0088デフォルトの名無しさん (ワッチョイ 2b28-h4Fy)
垢版 |
2021/07/23(金) 18:17:37.42ID:kuO5Sx1T0
よくUnixについての記事や書籍に,
「sedは入力全体を一度に読み込まず一行ごとに処理するから
動作が遅くならず,メモリ容量も気にしなくていい」
みたいなことが書いてあって,それは概ね事実だと思うんだけど,
C言語でsedを実装するときもviを実装するときに比べて
メモリ確保とかが楽なんだろうか。
0093デフォルトの名無しさん (ワッチョイ b963-3Z6B)
垢版 |
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.
009462 (ガックシ 06eb-qCnf)
垢版 |
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: ちょっと違う気がするけど,書籍にはそう書いてあった。
0096デフォルトの名無しさん (エムゾネ FF33-Hgw+)
垢版 |
2021/07/26(月) 14:22:50.46ID:9MzzzjGrF
>『C実践プログラミング』の17章「高度なポインタ」にある解説が

君にとって判り易かったのかも知れないが
君の感想文を読むとあまり良い本ではなさそう
0097デフォルトの名無しさん (ワッチョイ b15f-5PYr)
垢版 |
2021/07/26(月) 14:35:32.21ID:5u5J/MDS0
ama zon 4900900648

2冊目か3冊目に読む本
2005年6月21日に日本でレビュー済み
以前、某雑誌の特集で、Cがわかればすべてがわかるというのがあり
ましたが、まぁヨイショのし過ぎな文句なのかもしれませんが、依然
として、知っておいたほうがよい言語だと思います。
Cでプログラムするような機会は、ほんとここしばらく全くないです
けど、Cを勉強していたおかげで今までかなり助かってます。なんと
いってもCの影響を受けた言語は多いですからね、色々応用がきくも
のなのですよ。
で、肝心のこの本ですが、前訳本でも書きましたが、初心者を脱しよ
うとしている人にとっては最適だと思います。よくありがちな、Cの
文法やテクをただ書いているだけの本とは違います。プログラムのス
タイルやプログラムの仕方についての記述が数多くあります。
Cのような言語の場合、どのようにコーディングするのか、言い換え
るとWHATだけでなくHOWについて必ず考えなくてはならないと思いま
す。この本は常に、HOWについて意識した記述をしており、そういった
点が、この本を推奨する大きな理由です。
ただ、この本だけで、ポインタとかのキモはさすがに理解できません
でしたので、別の本を読む必要があります。
0098デフォルトの名無しさん (エムゾネ FF33-Hgw+)
垢版 |
2021/07/26(月) 14:52:24.77ID:9wDqt6nuF
>>74
>(データ構造、また、その管理においては) 指している型が同じなのか違うのかで
>ことさらに区別して考える意味はあまりないように思う。

それ

>>94
>C言語の演算子に自己参照型構造体の操作に非常に便利な演算子
>構造体ポインタ演算子->が用意されているということが決め手なのかな。

まだ誤解してると思う
0099デフォルトの名無しさん (ワッチョイ b15f-5PYr)
垢版 |
2021/07/26(月) 14:57:02.20ID:5u5J/MDS0
不充分。この本だけでは足りない。
2019年4月13日に日本でレビュー済み
敢えてこの本を買う意味が分からない。
20世紀に買ったが、この本だけでは解決できない問題があり、投げた。

よくある fgets & sscanf のコードの部分では、入力バッファのクリアを行う方法が書かれていなかった。
当時はインターネットのコンテンツが今ほど発達しておらず独学ではお手上げ。
他にも何か問題点があった気がするし、今や様々な解説サイト、また「よくある解説サイトの誤りを指摘するサイト」で足りる。

セキュリティ対策についても、wikipediaのサンプルコードやjpcertの「CERT セキュアコーディングスタンダード」など、今では豊富な資料がネットで入手できる。必要なら英文資料だってネットで容易に入手できる(もちろんC99の規格文書も)。
0100デフォルトの名無しさん (アウアウウー Sa5d-HpcZ)
垢版 |
2021/07/26(月) 16:06:22.39ID:+kNv7glZa
諸々のコンパイラや環境がC11に準拠するようになって久しく、また業務やOSSでもC11で導入された新機能を使うようになってきてる印象があるんだけど(要出典w)、こと並列処理に関してはまだまだC99+POSIXスレッドを使ってた方が良さそうね。
久しぶりに並列処理を書いてみようと思ったんだけど、C11で標準規格として導入されたthread.hに対応してるコンパイラが現時点でも(特にUnix系で)ほとんどないことが意外だった。
今のところthread.hをUnixで使いたかったらmusl Cくらいしか選択肢がないし、
ttps://www.etalabs.net/compare_libcs.html
3年前の電子掲示板の書き込み(要は典拠性が低い)ではあるけど
ttps://www.reddit.com/r/C_Programming/comments/94acpl/c11_vs_pthreads/
ほとんどの人がC11ではなくPOSIXが定めてるスレッド使ってるみたいだし。

せっかく汎OS的に並列処理がかけそうな規格なのに、もったいないというかなんというか。。。
0101ハノン ◆QZaw55cn4c (ワッチョイ 7be9-8Qmj)
垢版 |
2021/07/26(月) 20:52:03.28ID:PhHFyA7M0
>>99
>入力バッファのクリアを行う方法
入力バッファのフラッシュは確か MS のコンパイラだけでしか使えない環境依存だったかと
行末に \n が在る、とかのルールがあれば、それが出るまで読み捨てればいいのですが、そういうルールがなければどうしようもない気が
0102ハノン ◆QZaw55cn4c (ワッチョイ 7be9-8Qmj)
垢版 |
2021/07/26(月) 20:54:03.66ID:PhHFyA7M0
>>100
>せっかく汎OS的に並列処理がかけそうな規格

C11 は調べていませんが、C++ と比べてどうですか?私は C++11 以降でそういうのを書いています‥‥
0103はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 413e-QsN2)
垢版 |
2021/07/26(月) 21:07:00.92ID:afAoM3cN0
>>100
C11 のスレッドはオプショナルなのでスレッドを提供しなくても C11 準拠を名乗れる。
C の立場からすれば標準ではあまり高レイヤな機能を要求するのは気が引けるだろうし、
かといっていまどきスレッドに全く触れないでいるというわけにもいかないという妥協なんじゃないかな。

C11 のスレッドの基本的なモデルは POSIX のスレッドとそんなに違いがない (名前が違う程度) ので、
かえって乗り換える強い動機にならないのかも。
010462 (ワッチョイ 2b28-h4Fy)
垢版 |
2021/07/26(月) 22:30:44.17ID:sOMY1Y2o0
>>96
>>98

ご指摘ありがとうございます。
構造体リストについてもう一度 勉強しようと思います。
(他の方も書評の引用などありがとうございます)
『C実践プログラミング』のAmazon書評にあった
『Cクイックリファレンス 第2版』というのを試しに読んでみたところ,
かなり規格網羅的で丁寧だと感じたので,
当面はこれで勉強してみようと思います。
こちらの書籍には「
struct data {
// some code...
struct data *next
}
」という形のコードの解説そのものはありませんが,
ポインタの解説をCの規格に沿ってしてくれているので
かなり良い教科書として使えそうです。

以後言い訳::
いまのところ,まだC言語の規格が全て頭に入っている状態ですらなく,
ましてや実際のプログラミング作法も分かっていない段階なので,
ある書籍を見たときの(現代における)正確性・信頼性の判断が
できないんですよね……。
『C実践プログラミング』は昔のO'Reillyが出している書籍なので
ある程度信頼できるかな,と思って読み進めていたんですが,
(実際,本質を突いていて分かりやすいと感じる部分も多くありました)
時代的にも正味の内容的にも現代において参考にすべき
良書とはいいがたいのかな……?
0105デフォルトの名無しさん (ワッチョイ 532c-MYQi)
垢版 |
2021/07/27(火) 05:25:18.45ID:x4yitIm80
ポインターで次へつないでいく、リストみたいな自己参照型。next pointer。
同じ構造体のリスト。
動的関数型のElixir は、片方向リストを使う

a → b → c → d

struct data {
struct data *next
}

これが両方向リストなら、struct data *prev も持たなければならない。
次・前の2方向へ、たどれなければならないから

a ←→ b ←→ c ←→ d

ポインターに、null を代入すれば、次・前は存在しない。
つまり、終端を表す

詳細は、アルゴリズム・データ構造を参照
0110デフォルトの名無しさん (エムゾネ FF33-Hgw+)
垢版 |
2021/07/27(火) 16:12:06.91ID:Dog97BpdF
>>106
屁理屈
0112デフォルトの名無しさん (エムゾネ FF33-Hgw+)
垢版 |
2021/07/27(火) 18:25:54.21ID:Dog97BpdF
そもそも話がかみあってない
こっちは気付いてるけど
君は気付いていない
ただそれだけ
だから屁理屈
0114デフォルトの名無しさん (ワッチョイ d901-RnSF)
垢版 |
2021/07/27(火) 18:52:50.94ID:S/tVMF6N0
自己参照型の構造体で固定段数のリンク手繰るのに便利にはなってるけど
自己参照型の構造体があるがゆえに -> ができたんじゃなく
単にポインタの指し先(構造体)のメンバを (*). じゃ遠回りなので直接指定したいがための存在だと思ってる
0116はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 413e-QsN2)
垢版 |
2021/07/27(火) 23:09:50.37ID:eiJldbv00
>>115
Rust ではそうしてるんだから C でも最初からそういう選択も出来たはずではあると思う。
だけど違うことをするのに同じ見た目にするのが良いかどうかというのは微妙なところ。
どちらが良いと一概に言えるもんではないからな。
0120デフォルトの名無しさん (ワッチョイ 2b28-h4Fy)
垢版 |
2021/07/28(水) 01:00:09.40ID:nkHrLyVI0
うーん?

ある構文(範疇としては演算子の形態論?)について,
「他の言語での採用例があるからC言語がそういう構文を持っていても不思議じゃなかった」
という話が展開されていたと思うんですけど,
どうして「RustはCの派生」とかFortranやCOBOLの構文の話になったんですかね……?
0122デフォルトの名無しさん (JP 0Heb-qCnf)
垢版 |
2021/07/28(水) 09:52:29.36ID:M/k1RjyqH
C99以降で真偽型をboolのように表記したいときは<stdbool.h>を読み込みますが,
規格票には「型boolはマクロとして定義しろ」とあります。
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n2596.pdf#section.7.18

一般に既存の型から新しい表記の型を定義するときはtypedefを使うべきだと
(典拠は失念したのですが)聞いたことがあります。
たしか,コンパイラによる検査があったりより構文的に厳密になったりするから,
というような理由だったはずです。
真偽型boolがtypedefではなくマクロで定義されている理由ってなんでしょうか。

思い当たる理由としては,C++との互換性がありますが,それをC言語の規格で考慮する意味がない
(というか,C++の規格をC側から参照すると循環的になってしまう気がする)
気がします…。
C規格の論理的根拠の真偽型にかんする節も読みましたが,
「typedefではなくマクロを使う理由」は記載されていませんでした。
http://www.open-std.org/JTC1/SC22/WG14/www/docs/C99RationaleV5.10.pdf
0123デフォルトの名無しさん (ワッチョイ d901-bSA8)
垢版 |
2021/07/28(水) 10:26:19.41ID:vTqcwKkg0
マクロだと#undefできるから自分でboolを定義してる古いコードのための移行措置っぽいね
<stdbool.h>をincludeしなければいいと思うけど間接的にincludeされるケースもあるんだろう
_Boolの方は予約語になってる

7.18 (4)
..., a program may undefine and perhaps then redefine the macros bool, true, and false.
プログラムはbool、true、falseマクロをundefineして再定義することができる

7.31.11 (1)
The ability to undefine and perhaps then redefine the macros bool, true, and false is an obsolescent
feature.
⇒ bool、true、falseをundefineして再定義できる特性は廃止されつつある
0129デフォルトの名無しさん (アウアウウー Sa5d-UreN)
垢版 |
2021/07/28(水) 12:35:40.50ID:uGnpdH8xa
Windows という書き方はよくないかな
シェルの実装によると思います
なので、WSLに持っていくと期待通りに動かなかったりするかもしれません
ここでは Windows限定でよさそうだけど
0131デフォルトの名無しさん (ワッチョイ 8b61-QsN2)
垢版 |
2021/07/28(水) 13:41:10.64ID:4VQYix970
powershellはフルパスだけどcmdは入力のまま
結局はCreateProcessに渡した文字列なのでフルパス前提にしちゃだめよ

OSに依存しない方法で確実なのはないよなぁ
argv[0]が
ファイル名のみ:カレント+環境変数pathを走査
相対パス:カレントと連結
絶対パス:そのまま
とかやればそこそこいけるだろうけどめんどくさいな
0132デフォルトの名無しさん (ワッチョイ d901-bSA8)
垢版 |
2021/07/28(水) 13:54:41.98ID:vTqcwKkg0
純粋なC標準の範囲では不可能な気がする
カレントディレクトリをとるgetcwd()もPOSIX(unistd.h)だし
C言語の標準ライブラリにはディレクトリ階層の概念自体がなさそう
0136デフォルトの名無しさん (ガックシ 06eb-qCnf)
垢版 |
2021/07/28(水) 14:21:25.34ID:tV9+c+Bb6
これ解決策じゃなくて愚痴なんだが、main()関数が使えるのはホスト環境で、つまりmain()関数のargv[]引数は「OSによる支援」を前提にできるんだから、実装依存じゃなくて「argv[0]には実行されたファイルのOSにおけるパス名が格納される」みたいな仕様にしてもよかった気がする。
それこそstdint.hみたいに、多種多様な機器への対応を考えなくてもいい関数なんだから、実行環境のファイルシステムやらをある程度は仮定しちゃってもいいわけで。
0137デフォルトの名無しさん (ワッチョイ 13ad-9C7i)
垢版 |
2021/07/28(水) 16:21:41.95ID:6qacKWPx0
ファイルシステムもOSもない組み込み機器もあるわけで・・・
0138はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 413e-QsN2)
垢版 |
2021/07/28(水) 16:21:59.41ID:0ASLy6H40
>>136
どんな OS でも Unix 風のファイルシステムを採用しているというわけではなくて、
たとえば BTRON が採用しているファイルシステムでは
同名のファイルが存在してよく、ディレクトリのような階層化は存在しない。
全体で唯一に区別できる名前 (フルパスに相当するもの) がない。

OS だってファイルシステムだって多種多様なんで、
起動時に「なんらかの」文字列で情報が与えられるということ以上は
環境依存にならざるを得ないよ。
0139はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 413e-QsN2)
垢版 |
2021/07/28(水) 16:25:16.04ID:0ASLy6H40
>>137
その場合は通常の main 関数からの起動にはならない (main に意味のある引数が渡されないか特別なスタートアップ経由で起動される)
ので、「main に値が渡されるならば」それなりの OS が仮定できるというのが >>136 の言ってることやで。
0142デフォルトの名無しさん (ワッチョイ 2b28-h4Fy)
垢版 |
2021/07/28(水) 18:43:00.22ID:nkHrLyVI0
>>138
> BTRON が採用しているファイルシステムでは
> 同名のファイルが存在してよく、ディレクトリのような階層化は存在しない

知らんかった……。
調べたところBTRONは組込み機器向けのファームウェアじゃなさそうだし,
ホスト環境=「それなりのOSが期待できる」環境あっても,
「あるファイルのパス名が存在して,その絶対値が文字列として一意に定まる」
ことさえ期待できないのか……。
0144デフォルトの名無しさん (ワッチョイ 2b28-h4Fy)
垢版 |
2021/07/28(水) 18:56:43.36ID:nkHrLyVI0
> [...] the array members argv[0] through argv[argc-1] inclusive shall contain pointers to strings, which are given implementation-defined values by the host environment prior to program startup.

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n2596.pdf#section.5.1.2.2.1

C2xでもargv[0]に何が格納されるかは「実装依存」って書いてあるね……めちゃくちゃ残念だ。
あとこれ読んでて気が付いたけど,「ホスト環境」ってhost environmentじゃないのね。
hosted enviromentだから,正確に訳すなら「ホスト済み環境」とかのほうが良いのかな?
0145デフォルトの名無しさん (ワッチョイ d901-bSA8)
垢版 |
2021/07/28(水) 22:12:53.76ID:vTqcwKkg0
そのhosted environmentはプログラムの実行環境(execution environments)を
・freestanding(自立した環境=OS無しの組み込み系)
・hosted(OSにhostされた環境)
に分けたものだからOSとかプラットフォームを指すホスト環境とはたぶん別の意味
0148はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 213e-Gkqf)
垢版 |
2021/08/01(日) 11:25:29.19ID:grRzUWQ80
>>147
性能とかじゃなくてモデル化の仕方が多様という話。

たとえば古い時代の BASIC (N-BASIC など) は環境変数やコマンドラインという概念は持たないが、
違う形でデータを受け渡す方法は持っていて、どちらが高性能かというようなものではない。
0149デフォルトの名無しさん (ワッチョイ 2628-8ZXO)
垢版 |
2021/08/01(日) 18:29:17.83ID:1DStn3/B0
>>148
今 調べた知識なのでいろいろ間違っているとは思うのですが,
N-BASICとかってそもそも「OS」なんですかね……?

「hosted environmentという概念はUnixを想定したもので,
古いBASICでは通用しない」
という話からは,
1. Unixと古いBASICが同列の概念である
2. hosted environmentは「OSがある環境」を指している
ようなことが読み取れるんですが,

1. N-BASICはUnixのような
「機器→抽象化層1 (HAL/OS) →カーネル→シェル」
みたいな構造では表わせない位置にあるため
Unixと同列(あるいは類似)の概念として扱うのは
違うような気がすること

2. そもそもhosted environmentは
C2x規格の5.1.2.2で規定されている動作を実装した処理環境であって
「OSがある環境」を指してはいないこと
(だからUnixがどう,みたいな話は関係ない?)
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n2596.pdf#paragraph.5.1.2.2

などから,ちょっと納得しがたいです……。
0150デフォルトの名無しさん (ワッチョイ 1545-Xvfy)
垢版 |
2021/08/01(日) 18:40:30.22ID:4Ph4Dvnc0
IPLで起動して、ハードウエアへのアクセスを代行し、
コマンドをタイプして結果を文字で表示するCUI
という観点からはUNIXとBASICは同列だよ

MS-DOSでのデバドラはお行儀でしかなく
アプリが直接I/Oなんて珍しくもなんともないが
一応argc, argvという概念はあった

言い出すとマイクロカーネルをヨイショする連中を嘲笑うように
モノリシックカーネルでいったLinuxは、じゃあOSに非ずなのかと

OSとは何か、何が該当し、何が該当しないのかは
見方が色々で誰もが認める基準はなかなかできない
0153はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 213e-Gkqf)
垢版 |
2021/08/01(日) 20:46:27.86ID:grRzUWQ80
>>149
> N-BASICとかってそもそも「OS」なんですかね……?

---------- JIS X 0001-1994 ----------
オペレーティングシステム, OS(省略形)

プログラムの実行を制御するソフトウェアであって,
資源割振り,スケジューリング,入出力制御,
データ管理などのサービスを提供するもの。

備考
オペレーティングシステムは,ソフトウェアが主体であるが,
部分的にハードウェア化することも可能である。
-------------------------------------

まあ要するに OS がどのような構成を持つものなのかというのは曖昧で、
Unix 的な立ち位置も OS が持ちうる構成のひとつでしかないんよ。

> Unixと同列(あるいは類似)の概念として扱うのは
> 違うような気がすること

「モデル化の仕方は多様」という例のひとつとして N-BASIC を出している。
違うように感じられるならそれは提示した意図通り。
0156デフォルトの名無しさん (ワッチョイ fa02-Gkqf)
垢版 |
2021/08/01(日) 21:37:13.51ID:dQpg7mz50
N-BASICは確かにハードウエアを直接制御できるという意味では
OSに近い。ただ今のOSとは全然違う。BASICだと遅すぎるので
大半はマシン語で直接書いてある。今のOSとは考え方が違う。
0158デフォルトの名無しさん (ワッチョイ 2628-8ZXO)
垢版 |
2021/08/01(日) 21:54:08.54ID:1DStn3/B0
>>156
たしかにそういう意味では「OS」といえるのかもしれないですね。
ただ,それだと組込み機器のファームウェアだって
機器を操作できる,対人インターフェースがあるという点ではOSといえることになりません?
0160はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 213e-Gkqf)
垢版 |
2021/08/01(日) 22:05:54.64ID:grRzUWQ80
>>158
はっきりした基準はないという前提だけどぼんやりとした概念的な部分では
OS はアプリケーションソフトの対比的なものだと思う。
用途ごとのアプリケーションソフトを起動するという前提がないなら機能的に OS 相当のものを
含んでいても普通は OS とは言わないんじゃないかな。
0166デフォルトの名無しさん (ワッチョイ d6d2-MjzU)
垢版 |
2021/08/02(月) 07:46:31.20ID:HO5h+jLQ0
最近はスマホのカメラ部品にTRON OS入ってるんだって?
もうBIOSやファームウェアもOSになるんじゃないかとも思っちゃう。
0171デフォルトの名無しさん (エムゾネ FF9a-By/s)
垢版 |
2021/08/02(月) 13:13:02.28ID:y7YH8RaeF
Basic Interpreter OS
0172デフォルトの名無しさん (エムゾネ FF9a-By/s)
垢版 |
2021/08/02(月) 13:17:25.48ID:y7YH8RaeF
質問です
int flagA = 3 == 3;
int flagB = 3 == 3 == 3;
int flagC = 3 == 3 == 1;
の結果が
flagA : 1
flagB : 0
flagC : 1
になるのですが
flag B とか flag C は何が怒っているのでしょうか?
0173デフォルトの名無しさん (ワッチョイ d6d2-By/s)
垢版 |
2021/08/02(月) 13:31:37.39ID:HO5h+jLQ0
>int flagB = 3 == 3 == 3;

int flagB = (3 == 3) == 3;

int flagB = (1) == 3;

int flagB = 0;

>int flagC = 3 == 3 == 1;

int flagC = (3 == 3) == 1;

int flagC = ( 1 ) == 1;

int flagC = 1;
0175デフォルトの名無しさん (ワッチョイ 1545-Xvfy)
垢版 |
2021/08/02(月) 13:31:46.39ID:59KH06XU0
タイホするっ!! ダーン ダーン

int flagB =
ここまでと
3 == 3 == 3
が別のパーツになっていて
== は左から結合するので
(3 == 3) == 3 となり真は1になるので
1 == 3 で偽すなわち0だ
0177デフォルトの名無しさん (ワッチョイ 7aad-ePXc)
垢版 |
2021/08/02(月) 16:38:34.45ID:qdvnGLBb0
俺が怒っている
0182デフォルトの名無しさん (アウアウウー Sa09-Vs42)
垢版 |
2021/08/03(火) 10:01:19.19ID:Z1msEN+ba
結合の優先度は、自分が分かっていても
記憶があやふやな人が不安になるといけないから
結局カッコを明示的に描くかな…
0187デフォルトの名無しさん (ワッチョイ 1545-Xvfy)
垢版 |
2021/08/03(火) 14:30:35.30ID:wbx4PwZT0
typedef struct iunknown iunknown;

struct vtable
{
int (*query_interface)(iunknown*, int, void**);
int (*add_ref)(iunknown*);
int (*release)(iunknown*);
};

struct iunknown
{
long count;
vtable* vtbl;
};

みたいなことか?
0191デフォルトの名無しさん (ワッチョイ d510-IKHw)
垢版 |
2021/08/03(火) 20:41:05.50ID:kdIV+1e00
>>187
スゴーイ 感謝感激 ありがとうございます。

typedef struct {
void (*interface_a)();
void (*interface_b();
,
.
} TINTERFACEXXX;

typedef struct {
TINTERFACE ia;

} TOBJA;

なんてリレーションスタイルも考えたんですが、
いずれにしろ、クリーンアーキテクチャーのCでのSOLID原則ができるというところまでこぎつけました。
ありがとうございます。
0193デフォルトの名無しさん (JP 0Hee-YhuA)
垢版 |
2021/08/05(木) 14:10:06.71ID:9IiPo8vtH
奥村晴彦 『改訂新版 C言語による標準アルゴリズム事典』の
「改訂新版 序」に、
> 現代の慣習に従って、[…] EXIT_SUCCESSを0にしたりした
とあるのですが、EXIT_SUCCESSマクロ変数を使った方が
定数即値を決め打ちするよりも可搬的であり、
それこそ「現代の慣習」であるように思うのですが、
実際はEXIT_SUCCESSより0を使う方が「現代的」なんですかね。

なお、誤植も疑ったのですが、集録されている実際のコードにおいても
return 0;と書かれていました。
0196はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 213e-Gkqf)
垢版 |
2021/08/05(木) 15:20:09.93ID:igzlcjJl0
>>193
思想的にはともかく、その件については習慣として定着してるという事実があるんで、
事実に逆らってもしょうがない。

ちなみに main 関数だけは return 文を通過せずに } に到達した場合には
return 0; と同じになるという仕様になってるんで、 return 文自体を省略するという
スタイルもある。
0197デフォルトの名無しさん (ワッチョイ 1545-Xvfy)
垢版 |
2021/08/05(木) 16:18:55.16ID:TenuDSkO0
>>193
mainの出口は仕方ないんだよ
enumなんて考え方ができる遙か前に決まったことで今さら変えられないというのが現実だ

mainの第2引数だって今ならconst付けそうなところだけど
これまたconstなんかなかった頃に決まったことだ
0198デフォルトの名無しさん (アウアウウー Sa09-YhuA)
垢版 |
2021/08/05(木) 17:17:51.97ID:lrEA3gELa
>>197
歴史的にはそうなのかもしれないけど、それだと「EXIT_SUCCESSを0に」することが「現代の慣習」であることの説明になってなくないような
なんでEXIT_SUCCESSと書いてたのを0と書くようにしたのかが知りたいんでは
もう納得してるみたいなんでアレだけども
0209はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 693e-yyuh)
垢版 |
2021/08/06(金) 00:25:46.52ID:xkvwFph10
>>202
基本的には否だが、許容される場合はありうる。
main の型は以下のいずれか。

@ int main(void);
A int main(int argc, char * argv[]);
B 以上の二つのいずれかと等価 †1
C 以上の三つのいずれでもない処理系定義の方法

それとは別に
「main関数の返却値の型がintと適合しない場合,ホスト環境に戻される終了状態は,未規定とする。」†2
とするという文言もある。
C で言う「未規定」というのは処理系が挙動を選択して良いことを意味するので、
適合しなくても適合したときと同等の処理になるように実装している処理系はあるかもしれない。

enum で定義した型 (列挙型) は
「char,符号付き整数型又は符号無し整数型と適合する型とする。型の選択は,処理系定義とする」 †3
とあり、列挙型が int と適合する可能性はある。

また、上述のCとして処理系が main の返却値の型が列挙型であったときを許容するような定義をしているかもしれない。

-------------------------
†1 typedef やマクロによる別名、あるいは型調整などで同等になるものという意味
†2 「適合」に関する規則は複雑なのでここでは説明しない
†3 個別の列挙型ごとに選択してよい
0210デフォルトの名無しさん (ワッチョイ b145-IIsV)
垢版 |
2021/08/06(金) 07:01:45.65ID:QgUKHcUo0
>>206
おまえさんこそ何かわかってなさそうだな
なぜ、その値なのか由来が不明な定数は
スペルが0であろうがEXIT_SUCCESSであろうが
0x00であろうが本質的に同じことだぞ
UNIXを背景とせずにreturn 0;が説明できるか?

おまえさんみたいにググって拾った情報を丸呑みしてると
わかってないやつの間違った理解が伝搬するだけだぜ
0211デフォルトの名無しさん (ワッチョイ 1301-bikt)
垢版 |
2021/08/06(金) 08:15:51.79ID:3zvDecHz0
>>210
EXIT_SUCCESSがどういう意味かもわからないなら英語からやり直せよw
値の話じゃないことぐらい理解しろ

非常に稀な例としてEXIT_SUCCESSが0でないシステムが存在する
例えばOpenVMSでは
EXIT_SUCCESS = 1
EXIT_FAILURE = 2
だったりする
http://fafner.dyndns.org/cgi-bin/conan.com?key=CRTL~exit%2C_exit~Argument&title=VMS%20Help

なのでそういうシステムへの移植を考えてるなら意味はあるけどそんな人はほとんどいないからreturn 0;でいいやんって話

そもそもunixでも0, 1以外の値を返すコマンドは多数あってその場合は自分でEXIT_xxxを定義する必要あるから0, 1だけ定義されててもねぇって感じもあるし
0213はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 693e-yyuh)
垢版 |
2021/08/06(金) 09:12:19.75ID:xkvwFph10
>>211
関係ない。 言語仕様としては 0 が成功を表すというのは保証された動作で、
もしもホスト環境の都合と食い違うならランタイムサポート (スタートアップルーチン) で補正すべきこと。
EXIT_SUCCESS 「も」成功を意味する値として使えるというのとは独立した話。
0214デフォルトの名無しさん (ワッチョイ 1301-bikt)
垢版 |
2021/08/06(金) 09:17:08.98ID:3zvDecHz0
>>212
まじでマジックナンバー知らんのか?

0じゃ何を意味するかわからんから名前をつけるって話だぞ
EXIT_SUCCESSが英語だから英語の勉強しろって言ってるだけ
日本語使える環境なら
 正常終了 = 0
でもいい

で、>>193の件はそうは言っても正常終了で0以外なんてまずないし、たいていの人はmain()が0を返したら正常終了ってわかるからreturn 0;でいいやってなってるだけ
0217デフォルトの名無しさん (ワッチョイ 1be7-mBWR)
垢版 |
2021/08/06(金) 09:26:12.98ID:9vf9CEgT0
>>215
mainの戻り値がデフォルトで正常なときは 0 なのは言語仕様に規定されてるね

0又はEXIT_SUCCESSの場合,成功終了
この「又は」はほんとにORなので、EXIT_SUCCESS=1 のときは 0でも1でも正常よ
0218はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 693e-yyuh)
垢版 |
2021/08/06(金) 09:44:11.58ID:xkvwFph10
>>215
繰り返すが EXIT_SUCCESS 「も」成功を表すことは保証されている。
それとは関係なく 0 が成功なのは保証された動作

以下は C99 からの抜粋 (日本語は JIS から対応箇所を抜粋)

5.1.2.2.3 Program termination

If the return type of the main function is a type compatible with int,areturn from the
initial call to the main function is equivalent to calling the exit function with the value
returned by the main function as its argument

main関数の返却値の型がintと適合する場合,main関数の最初の呼出しからの復帰は,
main関数が返す値を実引数としてもつexit関数の呼出しと等価とする

7.20.4.3 7.20.4.3 The exit function

If the value of status is zero or
EXIT_SUCCESS, an implementation-defined form of the status successful termination is
returned. If the value of status is EXIT_FAILURE, an implementation-defined form
of the status unsuccessful termination is returned. Otherwise the status returned is
implementation-defined.

statusの値が0又はEXIT?SUCCESSの場合,成功終了(successful termination)状態を処理系定義の形式で返す。
statusの値がEXIT?FAILUREの場合,失敗終了(unsuccessful termination)状態を処理系定義の形式で返す。
それ以外の場合,返される状態は処理系定義とする。
0219デフォルトの名無しさん (ワッチョイ b145-IIsV)
垢版 |
2021/08/06(金) 10:06:15.17ID:QgUKHcUo0
>>214

#define AHO_NO_3zvDecHz0 0
int main(void)
{
return AHO_NO_3zvDecHz0;
}
こう書いてもなぜ0なのかはわからない
マジックナンバーとはこういうことだぞ

extern int svc_get_success_code();
int main(void)
{
return svc_get_success_code();
}
こういうのと違うからな
0220デフォルトの名無しさん (ワッチョイ 1301-bikt)
垢版 |
2021/08/06(金) 10:38:06.15ID:3zvDecHz0
>>216
ほとんどの環境で 0 を正常と解釈できるからマジックナンバー扱いでなくてもいいだろって言う判断を奥村晴彦氏がしたってだけの話だと思う

>>217
途中でreturnせずにmain()の最後まで到達したら0を返す(これは言語仕様)という話と返された0が正常終了とみなすかどうかは別の話

> 0又はEXIT_SUCCESSの場合,成功終了
と主張するなら規格のどこで規定されてるのか書いてくれ
0221デフォルトの名無しさん (ワッチョイ b145-IIsV)
垢版 |
2021/08/06(金) 10:53:05.07ID:QgUKHcUo0
5.1.2.2.3 プログラム終了処理
 main 関数の返却値の型がint と適合する場合,main 関数の最初の呼出しからの復帰は,main 関数が返す値を実引数としてもつexit 関数の呼出しと等価とする。main 関数を終了する}に到達した場合,main 関数は,値0 を返す。

7.20 一般ユーティリティ<stdlib.h>
EXIT_FAILURE
及び
EXIT_SUCCESS
は,整数定数式に展開され,それぞれホスト環境に失敗終了状態又は成功終了状態を返すために,exit関数の実引数として使用することができる。
0225デフォルトの名無しさん (ワッチョイ b145-IIsV)
垢版 |
2021/08/06(金) 12:04:06.56ID:QgUKHcUo0
は? EXIT_SUCCESSの意味を英語で理解しろとか言ってきたのおまえさんだぜ
NO_PROBLEMなんてオレオレマクロでもおまえさんは満足なんだろ
どうりで規格票もロクに読まねえわけだ
プログラマ辞めちまえをそのまま返すぜドスカタン
0226デフォルトの名無しさん (ワッチョイ 1301-bikt)
垢版 |
2021/08/06(金) 13:43:09.92ID:3zvDecHz0
> は? EXIT_SUCCESSの意味を英語で理解しろとか言ってきたのおまえさんだぜ
EXITもSUCCESSも英語だから英語「を」理解しろって言ってるんだが?
英語の前にお前は日本語を理解できるようになならないと駄目だなw
0227デフォルトの名無しさん (ワッチョイ b145-IIsV)
垢版 |
2021/08/06(金) 14:26:52.67ID:QgUKHcUo0
知らねえやつがまずいない英単語でドヤってて恥ずかしくねえの? ちょっと神経わからんなw
Cを使う以上はISO/IEC 9899に書かれていることが前提だからこそEXIT_SUCCESSというスペルの意味を知っているべきだが
おまえさんが露呈したアレこそがプログラマにあるまじき姿だろうがよ
0229デフォルトの名無しさん (ワッチョイ 1301-bikt)
垢版 |
2021/08/06(金) 15:10:51.95ID:3zvDecHz0
>>227
> 知らねえやつがまずいない英単語でドヤってて恥ずかしくねえの?
どこを見たらドヤッてるように見えるんだよ…

> ちょっと神経わからんなw
そもそもドヤるという神経がわからんわw
0233デフォルトの名無しさん (ワッチョイ b145-IIsV)
垢版 |
2021/08/06(金) 15:37:08.92ID:QgUKHcUo0
スルーすれば逃げられると思っているようなのでもう一度言ってやる

Cを使う以上はISO/IEC 9899に書かれていることが前提だからこそEXIT_SUCCESSというスペルの意味を知っているべきだが
おまえさんが露呈したアレこそがプログラマにあるまじき姿だろうがよ
0240はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1b3e-yyuh)
垢版 |
2021/08/07(土) 00:16:24.99ID:YBZ7G4A60
>>236
規定はないけどある程度の習慣はあって、おおざっぱにまとめると

・関数が受け持つ機能が副作用であり、
 返却値は成功or失敗のみを通知すればよいときは 0 を成功値とする
・関数が意味のある値を返すときはありうる値の範囲ではない値を失敗値とする
 (0、ヌルポインタ、負数、無限、NaNなど)
・入力値 (関数の引数) が正しい限り失敗がないことを見込めるときは
 不正な入力があった場合を未定義とする
 (呼出し前にチェックされているか、ロジック上正しいことをプログラマが保証することを期待する)

という感じだと思う。

あくまでも標準ライブラリやそれを踏襲した習慣をまとめるとこんな感じだろうという私なりのまとめなので
常に正しい選択というわけではないということはことわっておくが、
標準ライブラリを全く使わないようなプログラムもないだろうし
標準ライブラリを真似ておけば全体として一貫性が出て綺麗なんじゃないかな。
0241デフォルトの名無しさん (ワッチョイ 6985-6hcM)
垢版 |
2021/08/07(土) 00:29:33.44ID:rXkekRAR0
strcmp
0249デフォルトの名無しさん (ワッチョイ 13ad-E1rX)
垢版 |
2021/08/07(土) 17:43:31.00ID:efxonHum0
どこから終わっても良いのか?それとも出口は一つにすべきか?
0250ハノン ◆QZaw55cn4c
垢版 |
2021/08/07(土) 18:13:40.12
>>249
どこからでも return してよいのか?それとも return 文の記述は一箇所に限定するべきか?
0252デフォルトの名無しさん (ワッチョイ 13ad-Z6Ah)
垢版 |
2021/08/07(土) 18:31:09.62ID:efxonHum0
Cなので仕方がないな。他の言語のように例外処理が try ... catch とかで使えれば gogo なくしても見易く書けるだろうけど。
0254デフォルトの名無しさん (ワッチョイ 13ad-Z6Ah)
垢版 |
2021/08/07(土) 18:36:21.14ID:efxonHum0
goto なしでやる方法は色々あるが、30年ぐらい前に何も参考にせずに俺が考えついたのは for (;;) のブロックに入れて途中で条件により break する方式。
0257デフォルトの名無しさん (ワッチョイ 13ad-E1rX)
垢版 |
2021/08/07(土) 18:54:27.54ID:efxonHum0
>>255
最後のbreakを忘れたらそうなるのでそれだけは注意が必要
0258デフォルトの名無しさん (ワッチョイ 13ad-E1rX)
垢版 |
2021/08/07(土) 18:58:54.78ID:efxonHum0
ま、しかし、今はそういう例外処理的なやつは躊躇せずにgoto使うけどね。そうしないと見づらいし分かり難くなるから。
0262デフォルトの名無しさん (ワッチョイ b145-mBWR)
垢版 |
2021/08/07(土) 21:20:33.45ID:ZNSsPCBy0
>>245
あ、じゃあ違うんだな?

> EXIT_SUCCESSがどういう意味かもわからないなら英語からやり直せよw

規格票もロクに読まないからEXIT_SUCCESSがどういう意味かわからんやつが
英語がどうたら言うのは確たる根拠もなく言ってた戯れ言てことだな

PC画面に映ってるアフォはオモロイなwww
0263デフォルトの名無しさん (ワッチョイ 1301-bikt)
垢版 |
2021/08/07(土) 21:41:58.88ID:AEz+LKNR0
まずマジックナンバーの話なのか規格の話なのかはっきりさせようか…
あと「〇〇がわからないなら□□しろ」と言うのは「〇〇がわからない」と言ってる訳じゃないぞw
0270デフォルトの名無しさん (ワッチョイ b145-mBWR)
垢版 |
2021/08/08(日) 10:56:31.55ID:X9nZYb130
前提を間違ってるのをどんなに言い訳しても無駄だよ

         ,,-―--、
        |:::::::::::::;;;ノ  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
        |::::::::::( 」 <仮定法仮定法仮定法仮定法・・・・
        ノノノ ヽ_l   \______________
       ,,-┴―┴- 、    ∩_
     /,|┌-[]─┐| \  (  ノ
      / ヽ| |  バ  | '、/\ / /
     / `./| |  カ  |  |\   /
     \ ヽ| lゝ    |  |  \__/
     \ |  ̄ ̄ ̄   |
      ⊂|______|
       |l_l i l_l |
       |   ┬    |
0273デフォルトの名無しさん (ワッチョイ b145-mBWR)
垢版 |
2021/08/08(日) 11:45:29.53ID:X9nZYb130
> EXIT_SUCCESSがどういう意味かもわからないなら英語からやり直せよw

前提: EXIT_SUCCESSがどういう意味かわからない
主張: 英語からやり直せ

該当者がいないんだが
あ、1人いたな規格票読まねえやつがw
0285ハノン ◆QZaw55cn4c
垢版 |
2021/08/08(日) 15:56:39.95
>>280,281
うーん、手元の cygwin gcc 10.2.0 では while (1) も while (42) もウォーニングは出ませんね、コメントありがとうございます‥‥昭和は遠くなりにけり
0286デフォルトの名無しさん (ワッチョイ d1da-+f9r)
垢版 |
2021/08/08(日) 22:32:52.55ID:19kZVfwv0
>>282
アメリカ人だと ゥワーニン って言ってた
インド人(会話は英語)は ウォニング ってグまではっきり言ってた

こっちから言うときは片仮名で「ワーニング」って言っても余裕で通じた
まあエンジニアどうしで通じりゃ適当でいいんだよ
0290デフォルトの名無しさん (ワッチョイ ebd2-NW/4)
垢版 |
2021/08/09(月) 11:51:07.90ID:Lb8CQXvk0
>282
「ア」と「オ」の発音の違いは曖昧。
…というのをトリビアの泉でやってた。
0301はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1b3e-yyuh)
垢版 |
2021/08/09(月) 16:04:49.05ID:OWI9S7jW0
>>300
条件式 (conditional expression) については C99 なら 6.5.15 に記述がある。
制御式 (controlling expression) という言葉は当たり前のように出現して
明確に定義を与えているらしい箇所がみつからないんだけど
仕様では >>295 の意味で使われていることは自明。
0304はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1b3e-yyuh)
垢版 |
2021/08/09(月) 16:36:37.59ID:OWI9S7jW0
>>302
構文規則としては

等価式:
  関係式
  等価式 == 関係式
  等価式 != 関係式

と書いてあるからその考え方でも間違いとは言い切れないけど
それを言うなら

シフト式:
  加減式
  シフト式 << 加減式
  シフト式 >> 加減式

だからといって 加減式 ⊂ シフト式 と言ってしまうと (日常的な感覚としては) ちょっと違和感があるし、
このへんの言葉はシンタクスを定義する上での便宜的な概念 (BNF で書くとそうなるってだけ)
だから、演算子の機能上の意味付けとは分けて考える必要がある。
0309デフォルトの名無しさん (ワッチョイ b145-mBWR)
垢版 |
2021/08/09(月) 17:02:47.61ID:eF2Q2UUf0
6.8.5.1 while 文 制御式の評価は,ループ本体の各実行の前に行う。
6.8.5.2 do 文 制御式の評価は,ループ本体の各実行の後に行う。
6.8.5.3 for 文 文
for ( 節1 ; 式2 ; 式3 ) 文
の動作は次のとおりとする。式2 は制御式とし,ループ本体の各実行の前に評価する。
0313293 (ワッチョイ 532c-Lto6)
垢版 |
2021/08/09(月) 18:00:51.96ID:78aLRiJY0
if ( 条件式 )

Ruby では、条件式にオブジェクトを書いても、
偽になるのは、nil, false の2つだけだが、

他の動的言語では、各型に偽がある。
空文字列・空配列・空辞書、0, 0.0 など

あまりに、バグの組み合わせが多いために、
実質的なブール値・真偽値しか使えないのが普通

それで、TypeScript みたいに型チェックが流行るようになった。
C も同じで、型チェック必須言語

これらが無いと、バグが多すぎて、製品レベルの品質基準にならない
0320はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1b3e-yyuh)
垢版 |
2021/08/10(火) 01:18:25.50ID:7+xjomdk0
プログラミング言語C 第2版 (いわゆる K&R) に載っているくらいなので C では珍しくないのは確か。
日本語版の 129 ページあたりに「こうした慣用法はマスターすべきである」と書いてある。
0323293 (ワッチョイ 532c-Lto6)
垢版 |
2021/08/10(火) 11:49:11.43ID:9wi/dlAk0
++, -- は、バグが多いから、Ruby から排除された

Go でも、単独文でしか書けない。
組み合わせることができない

これらを組み合わせると、MISRA-C 違反。
MISRA-C に則っていないものは、製品レベルとして使えない

Andrew Koenig のC Traps and Pitfalls「Cプログラミングの落とし穴」、
組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、2006、MISRA‐C研究会

こういう本を読んでいないだろ
0331ハノン ◆QZaw55cn4c
垢版 |
2021/08/10(火) 18:45:30.07
>>327
何をやっているのか努力しないと読めないのが辛いです、そういう曲芸を仕事でやられたらボロクソなのも仕方がないとおもいますね
0335デフォルトの名無しさん (ワッチョイ 9910-qxAg)
垢版 |
2021/08/11(水) 13:02:40.93ID:c2ypq8+M0
レスありがとうございました。

>>327は、

https://medaka.5ch.net/test/read.cgi/prog/1625843192/

というスレで、初心者の1が質問を投げるとこから始まります。
入力された文字を逆順で表示したいという内容です。
それで1が貼ったコードを巡り、いつしか省力化の流れになって、
そして投下されたのが>>327です。
0336デフォルトの名無しさん (ワッチョイ 33bd-kkkT)
垢版 |
2021/08/11(水) 13:57:42.27ID:EWMgwFeS0
なるほどなあ
とりあえず文字列としてしか使われない領域に意味ありげにint配列使ってるのと、バイトオーダーに依存している、の2点が最大のクソポイントか
0337デフォルトの名無しさん (ワッチョイ ebd2-dtsT)
垢版 |
2021/08/11(水) 16:04:17.52ID:fvD2fRTR0
>334
>{{ ... }/*コメ*/}というコーディングもなんかキモイ。
Chromeのせいか?
なんか変な文字化け(変換?)起こしてるっぽい。

>char len,i;
が char len、i; ってなるとか。
FireFoxで開いたら正常表示された。

>335
>入力された文字を逆順で表示したいという内容です。
把握

>327
>Stdin
>abcdefg
7文字ってことは

>printf("%c%c%c%c",...
の最初のループの1文字目は "\0"が出力されてるのかな?それでいいのか?
int t[25];が0クリアされてるならいいけど、
ゴミが残ってると正しく表示されないんじゃないか?
0338デフォルトの名無しさん (ワッチョイ d101-mBWR)
垢版 |
2021/08/11(水) 16:25:45.76ID:91mms/zJ0
バイトオーダー決め打ちなのと
sizeof(int) == sizeof(char) * 4 前提にしつつ 4文字づつパックで処理してる工夫なんだろうけど

わざわざ難しくしてってのおふざけ暴走が生んだ結果だな
0339デフォルトの名無しさん (ワッチョイ 13ad-E1rX)
垢版 |
2021/08/12(木) 04:13:22.60ID:zN4hKecF0
>>327
それって入力した文字をただ出力したいだけ?
なんでそんなに複雑に書いたの?
0340デフォルトの名無しさん (ワッチョイ 13ad-E1rX)
垢版 |
2021/08/12(木) 04:15:08.28ID:zN4hKecF0
あ、逆順に出すの?それにしても複雑怪奇だなあ。どうしてそうなった?
0341デフォルトの名無しさん (ワッチョイ 13ad-Z6Ah)
垢版 |
2021/08/12(木) 06:20:29.21ID:zN4hKecF0
>>335
そっちのスレにまともなやつのURLを貼っといた。
0345デフォルトの名無しさん (ワッチョイ 532c-Lto6)
垢版 |
2021/08/12(木) 17:14:43.67ID:s+UN3BdM0
8ビットを、32ビットに変換するのは汎整数拡張

実際のCPU でも、8ビットでは処理できないので、
32ビットに変換してから処理して、8ビットに戻す

つまり汎整数拡張は、ほぼ無害
0347デフォルトの名無しさん (ワッチョイ 49a6-NW/4)
垢版 |
2021/08/12(木) 19:28:25.65ID:PwkehoUJ0
処理系によってcharがunsignedだったりするから
ライブラリのポーティングでえらい目にあったりするのよね
0348デフォルトの名無しさん (ワッチョイ 532c-Lto6)
垢版 |
2021/08/12(木) 20:05:44.88ID:s+UN3BdM0
MISRA-C でも、単なるchar 型は使用禁止。
-128〜127 か、0〜255 か、どちらか分からないから

signed char か、unsigned char を、明示して使わなければならない。
または、int8 か、uint8
0355デフォルトの名無しさん (ワッチョイ 42ad-Iu++)
垢版 |
2021/08/14(土) 01:39:23.05ID:Znm3fqvr0
きゃら
0357はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 463e-cJil)
垢版 |
2021/08/14(土) 16:51:07.63ID:xM4RG8+90
語源というか原形は character でその綴りを縮めたのだと考えれば、
(そしてあえて発音をカタカナに当てはめようとするのであれば)
キャー、もしくはキャラが順当なんじゃないかな。
0358ハノン ◆QZaw55cn4c
垢版 |
2021/08/14(土) 19:03:43.32
欧米人なら letter を使いそうなものを、それを character(=象形文字系統)としたその心が知りたい‥‥どうでもいい話ですみません
0359デフォルトの名無しさん (ワッチョイ e269-cJil)
垢版 |
2021/08/14(土) 20:55:06.51ID:kmQRiZG00
characterはcharと略せるけどletterは略せないとか?
一文字でも縮めることにやっきになってたみたいだし

charは「きゃら」だけど、enumを「いなむ」って言っちゃう
enumerateは「あにゅむれい」なのに
0361デフォルトの名無しさん (ワッチョイ 42ad-Iu++)
垢版 |
2021/08/14(土) 22:34:56.70ID:Znm3fqvr0
性格,性質,気質,特質,特性,特色,人格,品性,高潔さ,正直さ
0363デフォルトの名無しさん (ワッチョイ 4d85-/ojN)
垢版 |
2021/08/14(土) 23:51:39.71ID:lbIZmRLc0
>>358
letterだとletになりそうだから嫌ったんだろ
0370デフォルトの名無しさん (アウアウウー Saa5-ZsKU)
垢版 |
2021/08/15(日) 06:18:12.36ID:0d93Uofwa
char siu

チャーシュー
0373デフォルトの名無しさん (ワッチョイ aebb-eplb)
垢版 |
2021/08/15(日) 19:39:25.14ID:Jy6PA5Os0
>>371
英語設定でググってみるといいよ
チャー派とカー派がいてチャー派が優勢のように見える。
reddit見るとお前ガンダム見たことないんか?シャーーー!とかlisperが混乱するだろがってコメントがあってワロ
0375デフォルトの名無しさん (アウアウクー MMb1-9nCG)
垢版 |
2021/08/15(日) 21:05:49.36ID:g44nIVaSM
プログラムを書くのに読み方なんて意味が通じればどっちでもいいやん
0376デフォルトの名無しさん (ワッチョイ 4d36-pBez)
垢版 |
2021/08/16(月) 00:02:13.11ID:r0BCUeQy0
初心者です、stdio.hの保存場所が知りたいです

Visual Studio Communuty 2018を使っており、標準ライブラリはインクルードディレクトリに指定された場所にあるということでした
プロパティでインクルードディレクトリを確認したところ、以下のようになっていましたが意味が分かりません
$(VC_IncludePath);$(WindowsSDK_IncludePath);

変数になっているようですが、どこかで確認できるのでしょうか?
0377デフォルトの名無しさん (アウアウウー Saa5-PlbL)
垢版 |
2021/08/16(月) 00:13:21.48ID:x3HJsFala
間違っていたらごめんなさい

その $() で囲まれた文字列をコマンドプロンプトから
echo %文字列%
として表示される文字列はどうでしょう
0378デフォルトの名無しさん (ワッチョイ 8101-pBez)
垢版 |
2021/08/16(月) 00:14:50.67ID:wg/zbZxl0
その値のところをクリックして<編集...>を選べば評価された値が見えると思う
その画面の右下の「マクロ>>」ってボタンを押せば使われてる変数の値も見える
上の構成がDebugかReleaseかで値が違う変数もあるけどIncludePathはたぶん同じ

2019で確認したから微妙に違うかもしれない
0384デフォルトの名無しさん (ワッチョイ 42ad-Iu++)
垢版 |
2021/08/16(月) 10:19:54.49ID:sZNsU9Vp0
すてすて
0386デフォルトの名無しさん (ワッチョイ e95f-/m/d)
垢版 |
2021/08/16(月) 20:10:17.02ID:BeGCPKkC0
visual studioが覇権取ってからプログラミングが嫌になりました・・・
プログラミングが嫌というかvisual studioの設定とか使い方とかそういうのを覚えるのが・・・
LSI C+メモ帳で良かったのに・・・
0390デフォルトの名無しさん (ワッチョイ 4d36-pBez)
垢版 |
2021/08/16(月) 22:55:54.30ID:r0BCUeQy0
素朴な疑問でprintfでdouble型を表示させようとしたとき%lfでなく%fにする理由なんですが、
floatを引数とするとdouble型にキャストされるので、printfではfloat型もdouble型も同じ%fと記述すればいいことになっている
と言う理解で合ってますか?
0392はちみつ餃子 ◆8X2XSCHEME (ワッチョイ e23e-cJil)
垢版 |
2021/08/17(火) 03:49:27.19ID:yPn/BtRt0
>>390
あってる。
printf ではというか可変長引数では既定の実引数拡張のルールで float は double に拡張されるから区別しようがない。
よくわかってないやつが %lf って書いちゃうから C99 から仕様に入れることになったみたいな話だったはず。
(逆に言えばそれまでは無かった。)

でも引数に double を与えるつもりなら意味的にそれがわかるにこしたことはないので、
人間が読み書きする都合を考えるなら積極的に区別したほうがいいと思う。
0399デフォルトの名無しさん (ワッチョイ 42ad-Iu++)
垢版 |
2021/08/17(火) 16:52:28.09ID:5M+zf85m0
>>396
倍精度ってのを表したかったんだろうな。
0402デフォルトの名無しさん (ワッチョイ 4201-VYeI)
垢版 |
2021/08/17(火) 22:24:11.58ID:oC68rP2o0
そもそも
> 可変長引数では既定の実引数拡張のルールで float は double に拡張される
って言うのがよくわからん
普通にfloatはfloatのまま渡しゃいいじゃんと思うんだけどなんか理由あったのかな?
0403はちみつ餃子 ◆8X2XSCHEME (ワッチョイ e23e-cJil)
垢版 |
2021/08/17(火) 22:44:19.25ID:yPn/BtRt0
引数の受け渡しにスタックを使う場合でもレジスタを使う場合でも
ワードサイズより小さい型はどうせそのワードサイズに調整して積むことになるので切り詰める意味がない。
(ワードにたくさん情報を詰め込むことも出来るといえば出来るけどかえって非効率になる。)
だから int より小さい型を int に調整するというのはハードウェア的
な都合が反映されていると思う。

昔は浮動書数点演算ユニット (FPU) は CPU の外に持っているのが普通だったんだが
その時代でも FPU のレジスタは大きめなサイズを持っていた。
double が収まるレジスタがあるなら double で受け渡すほうが都合が良かったんだろう。

※ この場合の「ワード」は2バイトという意味ではなく各アーキテクチャにおける基本サイズという意味なので注意
0408ハノン ◆QZaw55cn4c
垢版 |
2021/08/18(水) 19:55:50.38
>>403
>その時代でも FPU のレジスタは大きめなサイズを持っていた。
80bit でしたっけ、そのうち仮数部が何ビットだったかは思い出せません
0410デフォルトの名無しさん (ワッチョイ ff02-VfHF)
垢版 |
2021/08/22(日) 01:54:25.30ID:0Cz6ueFz0
Rustのメモリ安全性はボローチェッカーによって担保されているが、
Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と
C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています

Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、
GC無しのView typesで参照の有効性を検証することによってメモリ安全性を保証しつつ
限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます

Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ

なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか?

Nimの実験的特徴
著者: アンドレアス・ルンプ
バージョン: 1.5.1
http://nim-lang.github.io/Nim/manual_experimental.html


Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し
ているにもかかわらず、高速なCのソースコードを吐き出せるのでC言語でリモートワーク
されている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる

「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
0412デフォルトの名無しさん (ワッチョイ ffe7-Awm0)
垢版 |
2021/08/23(月) 11:13:34.28ID:4N/X7GO90
char *b = "0123456";

printf("%x\n", 3[b]);
// 33

これって、どうしてこういう書き方 3[b] ができるんだっけか
シンタックスシュガーとかじゃなく、明確な理屈があって出来ちゃうんだよね?
0413デフォルトの名無しさん (エムゾネ FF9f-tXhk)
垢版 |
2021/08/23(月) 11:39:17.23ID:JYwdk8yBF
*(3 + b)
0414デフォルトの名無しさん (ワッチョイ 7fad-WNkQ)
垢版 |
2021/08/23(月) 11:42:03.51ID:UaBHP8Yo0
>>412
いやあ、それ、シンタックスシュガーでしかないと思うが。
[の左側+[]の内側で計算した結果をポインタ扱いにするってだけなので。
0416デフォルトの名無しさん (ワッチョイ 9fda-FcIJ)
垢版 |
2021/08/23(月) 22:51:00.15ID:qUWlnfUi0
標準でもそのまんまだなぁ

> A postfix expression followed by an expression in square brackets [] is a subscripted designation of an element of an array object.
> The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))).
> Because of the conversion rules that apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th element of E1 (counting from zero).
0421デフォルトの名無しさん (ワッチョイ 7f81-WQfa)
垢版 |
2021/08/24(火) 19:44:16.50ID:KCG/N/Sb0
stack領域で確保したポインタをfreeしたらどうなるんですか?
0424デフォルトの名無しさん (ワッチョイ 7f81-WQfa)
垢版 |
2021/08/25(水) 01:30:07.26ID:6n+Di1sM0
>>423
どういうことですか?
0425デフォルトの名無しさん (アウアウウー Sa63-wElo)
垢版 |
2021/08/25(水) 01:52:34.44ID:7J8MKXIfa
>>421
酔ってるからかもしれないけど、質問の意味からして分からない
実装によるだろうけど、動的に確保されるオブジェクトはヒープに確保されるだろうし
黙ってれば確保したメモリへのアドレスを保持するポインタはスタックに置かれるし
実装によるけど
0426デフォルトの名無しさん (ワッチョイ 7fad-WNkQ)
垢版 |
2021/08/25(水) 02:58:06.66ID:kk6d2P3X0
>>422
定番って言えそうなほど使われているソースを見たことないなあ。
0427デフォルトの名無しさん (ワッチョイ 7fad-WNkQ)
垢版 |
2021/08/25(水) 03:01:55.29ID:kk6d2P3X0
>>421
alloca()でメモり確保した場合のことを言ってるの?だとすればfree()しちゃダメだよ。やってしまった場合にどうなるかは使っているライブラリによるんじゃないかな。そういう呼び出しを想定していないライブラリだと落ちるかも知れない。
0428はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-T33Q)
垢版 |
2021/08/25(水) 03:30:51.31ID:BzERENYF0
>>424
未定義のこと。
C における未定義は何が起きても構わないことを意味する。

あるときネットニュース上でそれを説明するやりとりがあって、
あらゆることが起こりうるという例として鼻から悪魔が出てくる
ことも含まれるというような言い回しが使われた。
https://groups.google.com/g/comp.std.c/c/ycpVKxTZkgw/m/S2hHdTbv4d8J

それが定着して未定義のことを鼻から悪魔というのが通例になっている。
0430デフォルトの名無しさん (エムゾネ FF9f-tXhk)
垢版 |
2021/08/25(水) 09:19:52.23ID:U8ZXR+0VF
>>421
やってみろ
ほとんどの場合は何も起こらない
0431デフォルトの名無しさん (ガラプー KK8f-qz4m)
垢版 |
2021/08/25(水) 09:57:31.74ID:U3t+QZRrK
>>421
スタック…と言うかmalloc(calloc/realloc)で確保したポインタ以外をfreeすると何がおこるか判らない(鼻から悪魔)。
実際の話だと、大抵の実装ではmallocは確保した領域に管理情報を埋めて返し、freeはその管理情報を見て解放処理をする。この場合、管理情報がデタラメになるのでメモリアクセス違反でプログラムが落ちる事が多い。
0434デフォルトの名無しさん (ワッチョイ 7f81-WQfa)
垢版 |
2021/08/25(水) 12:30:15.33ID:6n+Di1sM0
僕はc言語自体初心者だったのですが、stack領域で確保したポインタをfreeするというのは以下のコードを指すつもりで言ってました。
int a;
free(&a);
鼻から悪魔が出るというのは未定義動作になると言うのを言うんですね。また一つ勉強になりました。
0437デフォルトの名無しさん (ワッチョイ 7f81-WQfa)
垢版 |
2021/08/25(水) 13:41:27.53ID:6n+Di1sM0
>>435
ポインタとアドレス同じ意味で使ってます
0438デフォルトの名無しさん (オッペケ Sr73-qjSG)
垢版 |
2021/08/25(水) 13:46:43.33ID:f+OmsRJCr
>>434
ちなC++触りだすとスコープ{}内で宣言したものはスコープ出たところで
勝手に始末されるちゅー理屈で実装することも増えると思う。
でかい一時配列とかスタックに置きたくもないしいちいちfreeとかdeleteのこと考えたくないから。
変な所でreturnとかしたらfree忘れちゃう。C言語だとその辺は厳格にしないといけない。

あと、ローカル変数のアドレスをあまり気安く使ってると、そのうち関数抜けて廃棄された
アドレスを参照してしまうバグをだしちゃうかも。一度位は通る道かもね。
0439デフォルトの名無しさん (ワッチョイ 1f85-tXhk)
垢版 |
2021/08/25(水) 19:45:37.21ID:s4bO6YKI0
>>433
中國のロケットの落下騒ぎを思い出したわ
0443はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-T33Q)
垢版 |
2021/08/25(水) 23:25:02.44ID:/Q8zinJC0
>>442
いいえ。 ポインタ型の値がポインタです。 (See C99 6.2.5)

C の用語ではメモリ (ストレージ) を占めるものがはオブジェクトで、それを型で意味付けしたものを値 (value) と言います。
実体としては同じですがレイヤによって呼び方が変わる場合があり、アドレスとポインタの違いも同様のものと考えられます。
0445デフォルトの名無しさん (ワッチョイ 1fbb-T33Q)
垢版 |
2021/08/26(木) 01:58:36.79ID:aNUIA15f0
int *p; // ポインタ変数またはポインタ
int a;
&a; // アドレスまたはポインタ
int b = &a; // bはアドレス値の入った整数
int *c = &a; // cはポインタ

こういうこと?
アドレスとポインタは明確に区別されてるの?
0448デフォルトの名無しさん (ワッチョイ 1fbb-T33Q)
垢版 |
2021/08/26(木) 02:37:50.30ID:aNUIA15f0
>6.5.3.2 アドレス及び間接演算子
>単項&演算子は,そのオペランドのアドレスを返す。オペランドが型“?型”をもっている場合,結果は,型“?型へのポインタ”をもつ。

だからアドレスとポインタどっちでも良いんじゃないの
0449デフォルトの名無しさん (ワッチョイ 9f21-qjSG)
垢版 |
2021/08/26(木) 07:03:21.90ID:H9rsGF960
&aはint*型のアドレス値(右辺値)で、変数ではないから代入は出来ない。
言葉の厳密な定義は知らんが、自分はポインタは型に紐付いたアドレスと理解してる。

組み込みなんかで
uint32_t a = 0x4020000;
...
*(int*)a = 1;
とか書くけどa自体はただの整数値だしね。
0453デフォルトの名無しさん (ワッチョイ 7f81-WQfa)
垢版 |
2021/08/26(木) 14:51:44.03ID:BSY6c8/C0
>>441
みればわかりますよね?
0454デフォルトの名無しさん (ワッチョイ 7f3e-T33Q)
垢版 |
2021/08/26(木) 16:05:40.12ID:oVdr9HnU0
言語仕様の文面の上ではアドレスとポインタの区別ははっきりしないので同一視してもかまわないとは思う。
少なくともポインタという用語がポインタ型の変数を指すという主張には賛成できないというだけ。

ただ、言語仕様の範囲内ではそれでいいんだけども言語仕様の範囲外というか実装上の理屈では区別している場合がある。
言語仕様上はポインタの比較は同一の配列 (または集成体オブジェクト) 内の要素を比較した場合や
ヌルポインタとの比較についてしか定義されておらず、それ以外は未定義であると明記 (C99 6.5.8 参照) されていて
関連のない場所のポインタの比較であることが静的に把握できるときは定数に置き換える最適化が適用されることもあるんで
アドレスを比較した通りの結果になるとは限らない。
https://wandbox.org/permlink/SqW5wzZM3fD912Nh
そんなわけでポインタが素朴なアドレス (実体が整数値) だと思っていると思わぬ結果を生むことも有る。
0470デフォルトの名無しさん (ワッチョイ 8269-JMbW)
垢版 |
2021/08/27(金) 10:21:47.24ID:TRiQmtYg0
わかってないのに短絡で int は危ないけど
LP64 やら LLP64 やら ILP64 やら
自分のがどうなってるかわかっててやるか、ポータビリティを鑑みて気を使った書き方するか
0473はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-3Axr)
垢版 |
2021/08/27(金) 11:13:41.38ID:i+fGpSJz0
>>471
6.3.2.3 では「結果は何らかの整数型の値の範囲に含まれているとは限らない」とあるし、
7.18.1.4 では intptr_t は省略可能であるともあるので保証はないと解釈すべきだと思う。
0480デフォルトの名無しさん (ワッチョイ 4281-bHCE)
垢版 |
2021/08/27(金) 19:45:46.03ID:dNdDj0y10
>>479
○すぞ
0484デフォルトの名無しさん (アウアウクー MM11-bmw4)
垢版 |
2021/08/28(土) 00:56:23.65ID:TAUITiELM
>>479
諭すぞ
0486デフォルトの名無しさん (ワッチョイ 3d5f-uZV+)
垢版 |
2021/08/28(土) 02:24:48.25ID:Kasf1Z4n0
>>358
レターは文字の集合。キャラクターとしたのは文字として認識していない記号等を含めたため。
0487デフォルトの名無しさん (ワッチョイ 4281-bHCE)
垢版 |
2021/08/28(土) 14:36:23.66ID:0ROz2KLh0
>>486
なるほど
0488デフォルトの名無しさん (ワッチョイ 3d5f-uZV+)
垢版 |
2021/08/28(土) 19:25:44.91ID:Kasf1Z4n0
>>487
制御文字を含めたのも理由かな
0489デフォルトの名無しさん (ワッチョイ 4281-bHCE)
垢版 |
2021/08/28(土) 19:26:13.75ID:0ROz2KLh0
>>488
なるほど
0490デフォルトの名無しさん (ワッチョイ 3d5f-uZV+)
垢版 |
2021/08/28(土) 19:38:40.56ID:Kasf1Z4n0
文字のことをキャラクターと呼び始めたのはC言語じゃねえよ。

13年前にできたCOBOLですらキャラクターと呼んでんだぜ?
0491デフォルトの名無しさん (ワッチョイ fdad-9F4v)
垢版 |
2021/08/28(土) 19:51:11.77ID:foB6MXRR0
俺に聞けって言われてもな
なに聞いたらいいかわからん
変に言語のマニアックな知識つけるより、アルゴリズム沢山知ってた方がいいと思うから言語や開発環境についてはvalgrindとかcmakeとか基本的なことを身に付いてればそれで十分だと思ってるわ
だからすまんけど聞きたいことはない
0495デフォルトの名無しさん (ワッチョイ 3d5f-uZV+)
垢版 |
2021/08/28(土) 21:27:40.38ID:Kasf1Z4n0
キャラクターの本来の意味は文字じゃないんだぜ?
あたりまえなんだぜえ?
0496デフォルトの名無しさん (ワッチョイ ad85-Wwpo)
垢版 |
2021/08/29(日) 01:18:09.40ID:TPHdi4yb0
>言いたいのでは無いか?

ここの「無い」に漢字を使うことに違和感感じるのは漏れだけ?
0497デフォルトの名無しさん (ワッチョイ 3d5f-uZV+)
垢版 |
2021/08/29(日) 01:49:09.89ID:HDdtcjYC0
「〇〇ではないのか。」の「ない」は形容詞。

ただし、これは形容詞を代用した言い回しなので、「無い」とはっきり形容とわかる使い方以外の場合は、日本語のおかしさが出てしまうので違和感がある。

そもそもわざわざ「ない」を「無い」と書く必要がない。戦後教育では漢字で書かなくてもわかることは仮名で書くと決めて、学校では漢字で書かないよう指導しているのに、漢字で書くやつはそれをすっかり忘れているだけだ。
0500デフォルトの名無しさん (ワッチョイ 3d5f-uZV+)
垢版 |
2021/08/29(日) 02:48:49.23ID:HDdtcjYC0
>>499
それもネチネチ30年以上も言われたが、単に字面が醜いという話で終わった。

覚えるも感じるも同じ意味で使っている。日本語は同じ漢字が続くときれいに見えないので変えたくなる。
0501デフォルトの名無しさん (ワッチョイ 02ad-U7Lh)
垢版 |
2021/08/29(日) 04:28:31.20ID:Lt7wAmk40
無いと言えばこの前ドイツ語の映画で Nein って言ってる時に日本語字幕に「無い」と出ていて一致していて笑った。
0502デフォルトの名無しさん (ワッチョイ 3d5f-uZV+)
垢版 |
2021/08/29(日) 05:28:11.66ID:HDdtcjYC0
>>501
否定の言葉の発音がNで始まるのは人類共通
0503デフォルトの名無しさん (ワッチョイ 3d5f-uZV+)
垢版 |
2021/08/29(日) 05:30:35.87ID:HDdtcjYC0
人類が言葉を話す前の拒否を表す叫びが言葉になったのだろう。
0507デフォルトの名無しさん (ワッチョイ 2236-u6Y8)
垢版 |
2021/08/29(日) 08:46:40.86ID:XBz6dM210
離散データを連続データのように見せかけるフィルターを作りたい。
アルゴリズム名を教えてください。
0510デフォルトの名無しさん (ワッチョイ 3d5f-Wwpo)
垢版 |
2021/08/29(日) 10:01:34.24ID:Qq6uUubw0
>>502
フランス語には何故 pas があるの?
0515デフォルトの名無しさん (ワッチョイ ada2-m34F)
垢版 |
2021/08/29(日) 18:16:18.76ID:jyQ+I+xW0
   ( ・∀・)   | | ガッ
  と    )    | |
    Y /ノ    人
     / )    <  >__Λ∩
   _/し' //. V`Д´)/ ←>>514
  (_フ彡        /
0517507 (ワッチョイ 2236-u6Y8)
垢版 |
2021/08/29(日) 19:19:21.76ID:XBz6dM210
投稿するスレッドを間違えてしまったかもしれません。>>507
それ以後、いろいろ調べつづけましたが、
どうやら内挿法とか補間法とか呼ばれていることが分かりました。
そのためのアルゴリズムを探してみます。
ありがとうございました。
0519507 (ワッチョイ 2236-u6Y8)
垢版 |
2021/08/29(日) 19:40:59.03ID:XBz6dM210
離散的なデータのプロットから滑らかな曲線を得たいのですが、
ベジェ曲線を使う必要があるため、それも計算する必要があります。
ではこの辺でさようなら。
0520デフォルトの名無しさん (アウウィフ FF85-4thN)
垢版 |
2021/08/30(月) 14:56:32.12ID:a7szkEqkF
FFT
0529デフォルトの名無しさん (ワッチョイ 0a69-wHYb)
垢版 |
2021/09/11(土) 19:49:04.18ID:UoYK8G+w0
変数は(多くの場合)メモリ上に置かれる
a=bの式をコンパイラは「bのアドレスのメモリにある値をaのアドレスのメモリにコピーする」と解釈する

でもそれをソースコード上で&a=&bと書かせてもお得なことはないよね
言語上では「a, bは(抽象化された)変数」で、その変数への代入は「a=b」でいいよね
0530デフォルトの名無しさん (ワッチョイ e521-se0r)
垢版 |
2021/09/11(土) 20:30:31.76ID:IpYcp5mx0
>>527
C++だと参照型が近いけど、あれはあれで窮屈ながらも、便利っちゃ便利かもな。
でもポインタ幅きかせてるCであえて拡張したい記法かといえば微妙よね。
void func(char &c) { c *= 2; }
みたいなのね。
0531デフォルトの名無しさん (ワッチョイ 595e-xJJl)
垢版 |
2021/09/11(土) 22:33:45.82ID:H4dj0oy10
皆さんありがとう
scanfで変数に&を付ける理由はいろんなとこに書いてあるんだけど、
それならなんで普通の代入の時に&を付けないんだ?
って疑問に思ってました
0533デフォルトの名無しさん (ワッチョイ 6d63-dGLa)
垢版 |
2021/09/12(日) 00:21:46.80ID:F+ZN0nvA0
scanfに限らず、関数に変数を渡すと、その関数は、
渡された変数の値を受け取れるだけで、
変数の値の書き換えは出来ません
書き換えて欲しいときは、書き換える場所を関数に教えます

普通の代入の時は、その変数を直接操作できるので
あえてアドレス表記する必要が無いです
0534デフォルトの名無しさん (ワッチョイ eaad-pW2y)
垢版 |
2021/09/12(日) 02:58:55.75ID:zHKafq1A0
memcpy(&a, &b, sizeof(a));

なんてことを、昔々構造体の変数の代入が出来ないCのサブセットのコンパイラでやったことがあったような気がするが、もはや記憶も曖昧になるぐらいの大昔。時の経つのは早いものぢゃ。
0536デフォルトの名無しさん (ワッチョイ e521-se0r)
垢版 |
2021/09/12(日) 14:36:50.48ID:Yq9DVfRn0
>>531
int c;に対して&c = 100という記述はだめなのって疑問かな?
代入演算子は左辺に変数を置いて値を書き込む特別な演算子だけど、
それをその変数の型を含むアドレス値を左辺に置いてそのアドレスに
書き込むという定義とするわけだ。

定義自体がややこしいし、
アドレス全面押しにする理由がない(むしろ遮蔽したい)、
頻繁に用いる演算子ゆえタイプ数が増えたりするのは好まない、
などメリットがないのだろうね。

=と==を=にまとめてしまって、代入時は&付けるという方向は
あるかも知れませんが、コード中代入のが多いでしょうから、
代入をシンプルにしたのではと。
0538デフォルトの名無しさん (ワッチョイ eaad-dGLa)
垢版 |
2021/09/13(月) 01:06:14.49ID:MTzB4xqO0
>>535
あ。そうだったっけ。忘れてた。
0539デフォルトの名無しさん (ワッチョイ eaad-dGLa)
垢版 |
2021/09/13(月) 01:13:16.73ID:MTzB4xqO0
int c;
*(&c) = 1;
ていうのなら出来る。
コンパイラは何の警告も出さずにコンパイルするかも知れないが、結局 c = 1; をやっているのと同じコードが出力されると思う。
0540はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-wHYb)
垢版 |
2021/09/13(月) 01:28:42.84ID:b2LY5t5P0
代入演算子の左辺に現れることが出来るのは変更可能な左辺値 (modifiable lvalue) で、
>>539 の例はその条件を満たす。

>>527
たとえば
int c = 1;
a = 2;
というのは C では有効なコードだけれど、変数を評価すると格納されている値になるというルールを
そのまま適用すると
1 = 2;
になってしまっておかしい、左辺は「場所」でないといけないという感覚はとても良い感性なのだけれど、
左辺がアドレスということにしたとしてもアドレスはポインタ型の「値」でしかないのでそれはそれで
なんだか変なことになる。
結局は特別な規則を導入必要はあって、 C においてはそれが lvalue という概念というわけ。
0542デフォルトの名無しさん (スプッッ Sd12-dgdc)
垢版 |
2021/09/13(月) 09:12:44.29ID:BLplThEad
>>531
C++は面倒なことになったな
#include <iostream>

using namespace std;

int main(int ac, char **av)
{
int a = 3;
int &b = a;
cout << a << b << endl;
return 0;
}
0548はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-wHYb)
垢版 |
2021/09/13(月) 17:52:01.78ID:b2LY5t5P0
C の仕様では引数は一貫して値渡しで、その値の型がポインタ型のこともあるという理屈になってる。
(仕様の理屈はともかくポインタの活用の仕方としてポインタ渡しと呼ぶことを否定するわけではない。)
0549デフォルトの名無しさん (ワッチョイ a95f-q+67)
垢版 |
2021/09/13(月) 17:58:15.13ID:+BvkCNRX0
C言語は昔からアドレス渡しと言っているけどな。
0550デフォルトの名無しさん (ワッチョイ a95f-q+67)
垢版 |
2021/09/13(月) 18:00:26.00ID:+BvkCNRX0
ポインタ渡しだとポインタ変数限定みたいに捉えてしまいそうだなw
0551デフォルトの名無しさん (ワッチョイ 5985-dgdc)
垢版 |
2021/09/13(月) 20:02:35.33ID:LTFifztG0
「アドレス渡し」の方がアセンブラに近い
ただしポインタ型のサイズで加減するアドレッシング機能付き
「ポインタ渡し」はPASCAL由来やろ

あと配列のサイズも一緒に渡す機能は付いてたらよかったのになーともたまに思う
0552デフォルトの名無しさん (ワッチョイ a95f-q+67)
垢版 |
2021/09/13(月) 21:18:13.15ID:+BvkCNRX0
OSを作るために作られたのに
0554デフォルトの名無しさん (ワッチョイ a95f-q+67)
垢版 |
2021/09/14(火) 06:05:05.77ID:48wIBTET0
>>553
型はあってないようなもの
0562デフォルトの名無しさん (エムゾネ FF0a-dgdc)
垢版 |
2021/09/14(火) 13:58:37.43ID:eQ96wDaCF
>>557
Matz の論文は I hate C++ だぞω
0563デフォルトの名無しさん (ワッチョイ a95f-q+67)
垢版 |
2021/09/14(火) 15:48:56.00ID:48wIBTET0
>>556
性能重視の部分は考え方の違いだな。UNIXを作るにあたって不要な部分を取り除いた結果がC。
0564デフォルトの名無しさん (ワッチョイ a95f-q+67)
垢版 |
2021/09/14(火) 15:51:55.83ID:48wIBTET0
>>560
メモリのアドレスを直接、渡すから、呼び出し元の領域をそういうふうに直接、触ることになる。
0566デフォルトの名無しさん (ワッチョイ eaad-pW2y)
垢版 |
2021/09/14(火) 23:42:22.10ID:/drSXHoF0
Delphiは昔使ってたな。拡張しまくったPascalというかなんというか。
0567デフォルトの名無しさん (ワッチョイ a95f-q+67)
垢版 |
2021/09/15(水) 00:41:20.00ID:h1CB84tY0
アセンブラのようなことができた方がいいというのが出発点だからなあ
0568はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-wHYb)
垢版 |
2021/09/15(水) 01:36:14.40ID:/JHaU2Oz0
今でこそ C は低レイヤ寄りと見做されるけど「高級言語で OS を書きたい」というモチベーションから作られている。
おそらく当時の感覚からすればむしろアセンブラ的な世界からの脱却だったんじゃないかな。
歴史的経緯はある程度は記録を辿れるけど時代を背景にした「感覚」というのは現代人からはなかなか掴みづらくてあくまでも想像だけど。
0569デフォルトの名無しさん (ワッチョイ a95f-q+67)
垢版 |
2021/09/15(水) 05:11:14.87ID:h1CB84tY0
おおざっぱに言うとアセンブラの見た目を変更したのがC
0571ハノン ◆QZaw55cn4c
垢版 |
2021/09/15(水) 14:05:30.69
それはどうでしょうか‥
turbo c の asm 文抜きのいきなりインラインはよく使っていましたが、そんな turbo c でもキャリーフラグを直接使えなかった気がします、そんな記憶がふつふつと
0572デフォルトの名無しさん (ワッチョイ ad45-m40g)
垢版 |
2021/09/15(水) 14:16:20.72ID:+suq2kti0
ローテート命令はキャリーありの9bit循環とキャリーなしの8bit循環があるから
そこまで言語では面倒見きれなかったってだけ
ステータスレジスタを陽に記述すると移植性なくなるが
そんなことしなくても当時のUNIXの95%を記述できたしな
0577ハノン ◆QZaw55cn4c
垢版 |
2021/09/15(水) 17:16:31.92
>>576
そうなんですね、なんちゃって多倍長をやっていて、ここでローテート&キャリーが使えればなぁぁぁ、とつくづく
0578はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-wHYb)
垢版 |
2021/09/15(水) 17:52:22.20ID:/JHaU2Oz0
>>576-577
TL/1 はあくまでも演算子がキャリー/ボロー付き演算の命令にそのままコンパイルされるってだけなんで、
配列アクセスなどのときに勝手にアドレス計算でフラグが設定されてしまうといった意図しない影響があって
あまり使い勝手は良くない。

あまり詳しくないけど LLVM はキャリーフラグを扱う方法があって
かつレキシカルな伝播として記述できたはずなんで、
たぶん LLVM IR でならなんとか記述できるんじゃないかな。
LLVM IR を高級といえるかどうかはたいへん微妙な話だが……。
0580デフォルトの名無しさん (テテンテンテン MM8f-vJdV)
垢版 |
2021/09/17(金) 10:32:07.44ID:+c0nDJY5M
>>578
例えばこんなを高級言語って言う?
define i32 @main(i32 %argc, i8** %argv) #0 {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
%3 = alloca i8**, align 8
store i32 0, i32* %1
store i32 %argc, i32* %2, align 4
store i8** %argv, i8*** %3, align 8
%4 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([15 x i8]* @.str, i32 0, i32 0))
ret i32 2
}

>>579
ごめん、意味分からん
単なるVTL (Very Tiny Language) の話にしか見えない
0582はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-IhC7)
垢版 |
2021/09/17(金) 14:42:13.05ID:hv2MZm4l0
>>580
そこから様々なターゲットの機械語を生成しうるという意味では
ハードウェアにベッタリと紐付いているわけではなくて
LLVM IR を低水準言語と呼ぶのはなんか違うなって思うけど、
だからといって日常的に人間が直接書くことを前提においてるわけでもない
という点では高級とも言いにくいかな……という意味で「微妙」と評した。
0583デフォルトの名無しさん (ワッチョイ 171d-QiSa)
垢版 |
2021/09/17(金) 16:26:05.73ID:J/w/zJeW0
シリコンバレーで働いて気付いた「技術力向上」だけに固執するエンジニアのダメさ【Sansan CTO 藤倉成太】
https://type.jp/et/feature/9402/
DeNA×メルカリ×サイバーエージェント人事担当が面接で必ずする質問とは?「技術力だけアピールしても内定は出ない」
https://type.jp/et/feature/10236/
DeNA・メルカリ・CA人事が証言! スキルはあるのに“面接で落ちる”エンジニアに足りないもの
https://type.jp/et/feature/10402/
0590デフォルトの名無しさん (エムゾネ FFbf-hED7)
垢版 |
2021/09/18(土) 08:52:55.38ID:bA/qQPAiF
バイトコードをいい加減に扱い過ぎ
0598ハノン ◆QZaw55cn4c (ワッチョイ 9f47-o3tO)
垢版 |
2021/09/18(土) 19:55:00.96ID:/DXMasS60
>>592
いいえ
定義では格納場所を確保しますが、宣言では存在のみ指示しても格納場所は確保されません、私は気が向けば宣言には extern をつけるようにしないわけではない、という感じかな
なおその例は少し変で、代入を伴えば定義というわけでも、代入がなければ宣言というわけでもない、というのが個人的感覚です、詳しい人の解説を希望します

例外は、リンカが頑張って格納場所を作ってくれる例の何とかとかいうキーワードがあったのですがおもいだせません、今日モデルナを射った後転んで頭を打ってしまった、結果、いっそう馬鹿になってしまいました‥‥
0599ハノン ◆QZaw55cn4c (ワッチョイ 9f47-o3tO)
垢版 |
2021/09/18(土) 20:04:32.98ID:/DXMasS60
>>592
宣言か定義か、という問題は、単一モジュールでプログラムを構成している段階ではあまり気にしなくてもいいと思います
複数の c ソースを分割コンパイルし、最後に得られたオブジェクトをライブラリともあわせて結合する、という作法に進めば自然に理解できるようになりますのでご心配なさらなくともいいでしょう

私も昔は「extern は要らない子!」とか馬鹿をいっていましたが、これは撤回します、extern がどうしても必要な場面に遭遇したのです
まあそういうわけで一度にいっぺんに賢くなるのは私には難しいことのようです
0600デフォルトの名無しさん (ワッチョイ b7bb-qDHA)
垢版 |
2021/09/18(土) 20:41:39.21ID:RjbxwxKL0
>>598
たとえば

int a;
printf("%d\n", a);

なんですが、この場合のaは定義されているということですか?
代入式があるのが定義だと思ってました
宣言と定義の文脈はコードによって変わるということなんですかね
0601デフォルトの名無しさん (テテンテンテン MM8f-vJdV)
垢版 |
2021/09/18(土) 21:25:06.90ID:JTl7f6jwM
簡単に言えば宣言はその名前をコンパイラに伝えるもの
定義はその実体を確保するためのもの
>>592の例は両方共に宣言であり定義でもある
C言語では定義のみすると言うのはできないと思う
宣言のみはexternとか前方参照のためのstruct xxx;とかで使われる
0603デフォルトの名無しさん (ワッチョイ bfe9-IhC7)
垢版 |
2021/09/18(土) 22:06:39.93ID:jTQBMDyZ0
..>>597
「下位概念」という言葉をあてるのは不自然な気がするけど、C言語において定義は宣言のサブセットだよ。

>>600
その2行がコンパイルできる文脈に置かれているなら、 a は定義されている。
(初期化されていない自動変数になるので後続の printf での読み取りは未定義動作になるけど。)
「宣言と定義の文脈はコードによって変わる」は意味が分からないので否定も肯定もできない。
同じ int a; といった記述が宣言か定義か文脈によって変わる、ということならありえる。(構造体メンバの宣言とか。)
0604デフォルトの名無しさん (ワッチョイ b7bb-qDHA)
垢版 |
2021/09/18(土) 22:22:54.90ID:RjbxwxKL0
>>601
>>603
メモリが確保されているかどうか?という点で定義か宣言か判断すればいいということですね
printf()で参照している場合はaはメモリが確保されているのでaは定義されている状態
printf()で参照しない場合はaはただの宣言になると
0607デフォルトの名無しさん (ワッチョイ b7bb-qDHA)
垢版 |
2021/09/18(土) 22:53:55.61ID:RjbxwxKL0
>>605
>>606

理解しました!

int main(void) {
int a;
return 0;
}

↑のaは定義されていてメモリが確保されている状態ってことですね
また定義は宣言のサブセットだから、この状態を宣言と呼んでもいいということですね
0608デフォルトの名無しさん (アウアウウー Sa5b-XGHE)
垢版 |
2021/09/18(土) 23:32:59.41ID:vqHZXwmna
aは定義されている、でよいと思います
ちなみに、自分は宣言とか定義とか「言葉」は意識しないです
ただ、ここにオブジェクトが実在するのか、他のどこかにあるオブジェクトを使うのかは明確に意識しなければなりません

int main(void) {
int a;
extern int x:
return 0;
}

ここで xは、関数外のどこかで定義された int型のオブジェクを参照します、という宣言
0609ハノン ◆QZaw55cn4c (ワッチョイ 9f47-o3tO)
垢版 |
2021/09/18(土) 23:37:35.98ID:/DXMasS60
>>607
そうですね
それに、そのコードは関数 int main(void) も宣言かつ定義していますね
関数の場合は、関数の中身が書いておれば宣言かつ定義、関数の呼び出され方だけしか書いていなければ宣言、とすぐにわかるので、キーワード extern は省かれる傾向にありますね

詳しい人に解説いただき私も感謝します
0610デフォルトの名無しさん (ワッチョイ 1763-qDHA)
垢版 |
2021/09/18(土) 23:38:56.69ID:bsPUoCV00
質問
externを関数内で宣言したとき、有効範囲は次のどれになりますか?
1.宣言した関数のスコープ内で有効
2.宣言したソースの後続行で有効
3.宣言を書いたソースの全体で有効
0613はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-IhC7)
垢版 |
2021/09/19(日) 00:58:34.79ID:aMl1OG4b0
JISX3010:2003 の 6.7 から抜粋

> 宣言は、幾つかの識別子の解釈及び属性を指定する。
> 識別子の定義 (definition) とは、宣言のうち次のものをいう。
> ・オブジェクトに対しては、そのオブジェクトの記憶域を確保する宣言
> ・関数に対しては、関数本体を含む宣言
> ・列挙定数又は型定義名に対しては、その識別子の(唯一の)宣言
0614デフォルトの名無しさん (アウアウウー Sa5b-hED7)
垢版 |
2021/09/19(日) 12:56:33.95ID:/yxUr6Cya
関数の中とか{}ブロックの中とかで
#include とか #define 出来れば良いのにと思うことはある
(いや出来ることは出来るけど)
0618デフォルトの名無しさん (アウアウウー Sa5b-XGHE)
垢版 |
2021/09/19(日) 16:19:30.05ID:gqeRua+ma
// foo.c
#include <stdio.h>

int f(void)
{
extern int glob:
return glob + 1;
}

int main()
{
printf("%d\n", f()); // 124(次行がないとき)
printf("%d\n", glob); // エラー
return 0:
}

// bar.c
int glob = 123;

でした
勘違いだったらごめんなさい
0621デフォルトの名無しさん (アウアウウー Sa5b-XGHE)
垢版 |
2021/09/19(日) 19:48:44.86ID:gqeRua+ma
>>620
>>608だけど、(関数スコープ内の)宣言のうまい例を思いつきませんでした
自分でもこのような記述はしたことがないです

>>614
ブロック内でも、#includeや#defineは使えるには使えるのでは
使ったことはないけど
ただし、#defineは同じスコープ内で #undefで閉じておかべきだけど
リーダブルコードという本で、define〜undefの例を見たような
0623621 (アウアウウー Sa5b-XGHE)
垢版 |
2021/09/19(日) 20:02:10.63ID:gqeRua+ma
>>614
「できるにはできるけど」と、ちゃんと書いてありますね
大変失礼しました、ごめんなさい!!
0626621 (アウアウウー Sa5b-XGHE)
垢版 |
2021/09/19(日) 20:42:46.70ID:gqeRua+ma
#includeとか #defineとか、プリプロセッサが処理する時点では、スコープとか、C言語の文法すら関知しないかも
トークンの
識別くらいで
0627デフォルトの名無しさん (ワッチョイ d721-uvbS)
垢版 |
2021/09/19(日) 21:23:46.86ID:AMdE/BCe0
こんな #define 見たくないけど・・・

---------------------------------------
void func() {
 #define A 100
}
int main() {
 int i = A;
}
---------------------------------------

gcc -E prepro.c
---------------------------------------
# 1 "prepro.c"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 384 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "prepro.c" 2
void func() {

}
int main() {
 int i = 100;
}
---------------------------------------
0631デフォルトの名無しさん (ワッチョイ 9fad-qDHA)
垢版 |
2021/09/20(月) 17:39:30.67ID:WNFThOB/0
CはCのままで良い。他の言語で実現出来ているんだし。その機能を使いたいならそちらの言語を使えば良い。
それでは何かが足りないというのなら新言語作れば良い。
自分では作る技術力がなくても仕様を考えてネットで公開しておけばやがて暇と技術力のある誰かが作ってくれるだろう。
0635デフォルトの名無しさん (ワッチョイ 1fbd-SDcz)
垢版 |
2021/09/20(月) 19:57:31.48ID:LO5PkHvF0
>>633
前スレより

975 デフォルトの名無しさん (ワッチョイ b363-19dE) sage 2021/06/21(月) 23:06:35.04 ID:jHz8GYW10
// b.c
int b[] = {123, 456};

// a.c
#include <stdio.h>

int a[] = {123, 456};
int main()
{
  extern int *b;
  printf("val b\n");
  printf("%d\n", *(b + 1));

// printf("val a\n");
// printf("%d\n", *(a + 1));

 return 0;
}

こういう分割ソースをコンパイル、リンクして実行すると、何も表示無しで終了する
デバッガー使って実行してみると、SEGVになってる
0636ハノン ◆QZaw55cn4c (ワッチョイ 9f47-o3tO)
垢版 |
2021/09/20(月) 20:10:17.55ID:+hQanlE40
>>634
>ミスする可能性が上がるから各コードでexternせずに必要ならヘッダに書いてもらえってことじゃね?
そうそう、extern による宣言と定義とが食い違うとエラーがでますから、そのためのヘッダの分離ということですね

>そもそもexternなんてextern "C"以外滅多に使わないけどな
関数の宣言は extern 省略可能ですし、ライブラリ側で共用のメモリを確保することは滅多にないです私は
0638621 (アウアウウー Sa5b-XGHE)
垢版 |
2021/09/21(火) 00:23:33.65ID:7n0ZYlgRa
>>635
これってリンク時にエラーにする方法はないのかね….
あればとっくにやってるんだろうけど…
0639デフォルトの名無しさん (ワッチョイ 1fbd-SDcz)
垢版 |
2021/09/21(火) 00:26:56.39ID:aEoN/PBD0
>>637
同じですね

そもそもexternを明示的に書く必要がある状況って、
あるソースで定義されているグローバル変数を他のソースに公開して使えるようにするために、
ヘッダにextern int a;のように書いておいて、他のソースにはそれを#includeさせる
(すると他のソースでは余計な領域が確保されない)
のパターンが基本だと思っています

だからそもそもブロックスコープでexternするのってなんで? 覗き魔? って思ってしまう
0642ハノン ◆QZaw55cn4c (ワッチョイ 9f47-o3tO)
垢版 |
2021/09/21(火) 03:36:19.96ID:9i80hc760
>>639
>ヘッダにextern int a;のように書いておいて、他のソースにはそれを#includeさせる
「他のソース」でないソースも、そのヘッダを #include しておけばダチェックにもなるし
0644621 (アウアウウー Sa5b-XGHE)
垢版 |
2021/09/21(火) 22:41:16.78ID:rS8f3YVDa
// b.c
char a[] = { 0, 1 };

// a.c
int main()
{
__extern int *a;
__printf("%d\n", a[1]):
__return 0;
}

不勉強でした
上のコードは警告もなしにコンパイルが通りますね
実行すると segmentation fault ですが

リンク時はデータ型はチェックされず、名前だけで参照を解決してるのですかね……

古い仕様で、今さら変更はできないんでしょうね、チェックができたとしても
0645デフォルトの名無しさん (ワッチョイ 1745-I/Yj)
垢版 |
2021/09/21(火) 22:46:25.12ID:rkkhSUpi0
型システムを持たずラベルの綴りのみを手がかりに参照解決するリンカを操るツールの1つだからねCは
リンカにあれもこれもと機能を持たせるのはメインフレームのファイルシステムにあれもこれも持たせようとしたVSAMの再来だ
インフラ的なものにアプリの都合を無闇に押しつけるべきではないことを歴史から学ぶべきだぞ
0646はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-IhC7)
垢版 |
2021/09/21(火) 23:19:06.05ID:tYtQqya30
C には「プロトタイプ (関数原型) を持たない関数宣言」があって、
関数の型が曖昧なまま関数が存在することだけを宣言できる。

プロトタイプ (プロトタイプ宣言) がある場合にはその関数を呼出すにあたって実引数と仮引数の間では代入と同じ規則
で (可能な場合には) 暗黙の型変換が適用されるが、プロトタイプがない場合には
既定の実引数拡張 (可変長引数に実引数を渡すときと同じ規則) が適用されて実引数と仮引数の辻褄が
あってないときは未定義という扱いになる。

更には C89 は暗黙の関数宣言という規則があって (C99 では廃止されている)
関数を呼出そうとした時点で関数が宣言されていない場合には実引数の型から一定の規則に基づいて
関数の型を推測し、関数が宣言されたかのように振る舞うことになっている。
なので関数宣言が存在しなくても二度以上の関数呼出しの型に矛盾があれば検出はされる。
もちろん関数定義の実体と辻褄があってなかったらそれは未定義だけど。

このあたりのクソみたいな規則は「C++ では採用しなかった仕様」として D&E でちょっと触れられてる。
0649はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-IhC7)
垢版 |
2021/09/21(火) 23:34:12.47ID:tYtQqya30
>>647
あ、ほんまやな。
仕様上のルールは「extern int func(); が書かれていたものとみなす」というだけで、
具体的なチェックをどこまでするかは処理系次第 (たぶんあまり真面目にやってなかったと思うけど) だな。
0651デフォルトの名無しさん (ワッチョイ 9fad-QxrA)
垢版 |
2021/09/22(水) 14:25:23.40ID:Te29kBsr0
どうだったっけなあ?
0652はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-IhC7)
垢版 |
2021/09/22(水) 14:32:16.52ID:1hd+XsHu0
The C programming language (いわゆる K&R 第一版) の
APPENDIX A 8.3 Declarators を見る限りでは
引数リストが空の形式しかないように見える。
関数であるということは宣言できるが型チェックはガバガバっぽい。

D&E の 2.6 静的タイプチェック の項では

> C with Classes のシンタクスとルールはその後 ANSI C の規格にも採用されたが
> C with Classes の最初の実装の時点ですでに完全な形をしていた。

という一文があるので C の型チェックは C++ (の前身である C with Classes)
からの影響ということで間違いないと思う。
0653デフォルトの名無しさん (エムゾネ FFbf-hED7)
垢版 |
2021/09/22(水) 14:42:52.46ID:KzVGjGnLF
初耳だわ
はちみつは何歳?
0655ハノン ◆QZaw55cn4c (ワッチョイ 9f47-o3tO)
垢版 |
2021/09/22(水) 17:51:09.10ID:z5uxQYPx0
>>644
そのコード、仮に a.c で
extern int *a;
ではなくて
extern char *a;
であってもセグフォが出ると思います、試してませんけど‥‥

なにか二重に勘違いしてませんか?それとも私が二重に勘違いしているのか?
0659621 (アウアウウー Sa5b-XGHE)
垢版 |
2021/09/22(水) 19:31:52.27ID:u8cZI69ma
>>655
ありがとうございます

はい、char と char でもダメですね
データ型がことなれば、リンケージできないのではと思い実験してみました

定義側でメモリに配置されているのは値で、extern宣言で参照する側が期待するのはポインタが配置されていることなのでうまくいきませんね(違うかな)
0665はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-IhC7)
垢版 |
2021/09/23(木) 16:56:05.29ID:pKS1sRJG0
COFF フォーマットを見てるんだが、
関数が返す値の型を格納するところは有っても引数の型については無いみたいだ。
http://delorie.com/djgpp/doc/coff/symtab.html
ヘッダファイルで型情報をやりとりする前提なんだな。

ELF だとたぶん詳細な型も入れられそうな雰囲気があるんだけど複雑でようわからん……。
0666デフォルトの名無しさん (ワッチョイ d31b-QjBH)
垢版 |
2021/09/24(金) 19:26:12.39ID:bEXGgTP60
もしかしてc言語って新たにブロック文つくったら構造体の二重定義って可能になるんですか?
試しに
{
struct a{};
{
struct a{};
}
}
ってcompiler explorerで打ち込んだらcompile通りました。
こんなの初耳です。
ちなみに同じブロック文で二重定義したらcompile errorが起こりました。
0667ハノン ◆QZaw55cn4c (ワッチョイ b247-+9yW)
垢版 |
2021/09/24(金) 20:31:56.55ID:B0dAhYuN0
>>659
今回の例でもわかるように、無節操にバンバン extern 宣言を複数の C ソースファイルのあちこちに混入させるのは非常にマズイので、
普通はサブモジュールの extern 宣言だけを別のファイルにまとめておいて、そのサブモジュールを使用するソースで #include するのが標準的です
この extern 宣言だけをまとめたファイルを特にヘッダファイルと呼びます
https://ideone.com/rdbae2
実体を定義したサブモジュールもヘッダを #include するようにしておけば、ヘッダの誤りも検出することができます

なにかこういう基本文法を終えた後に位置するべき基本的な作法集をまとめたアドバンス教科書、みたいなものはないものでしょうか?
0668621 (アウアウウー Sa43-LUZf)
垢版 |
2021/09/24(金) 20:48:31.47ID:PKobCCv1a
>>667
ありがとうございます
>>659 == >>621 です

621にもあるとおり、僕もこのような extern宣言を使用したことがありません
他に変数の宣言の例が思いつきませんでした…
0670デフォルトの名無しさん (ワッチョイ d31b-QjBH)
垢版 |
2021/09/24(金) 22:23:44.15ID:bEXGgTP60
>>669
レスありがとうございます
確認してみましたが
この例でなされてるのはdeclarator中の構文要素であるidentifierの例であって、>>666でなされているようなstructトークンとleft-braceトークンの間にあるidentifierを同じのを二度使っている例にはなっていないとおもいます。
僕は後者の仕様は、同じ変数名が複数ソース上にあるとき現在の位置から見て最も内側のブロックで宣言されたものの方で解決するという当たり前の規則だと認識してます
僕にとって謎だと感じるのは前者の仕様です。cの規格のどこからきているのか気になります
0671デフォルトの名無しさん (ワッチョイ d31b-QjBH)
垢版 |
2021/09/24(金) 22:25:13.81ID:bEXGgTP60
>>670
すみません。
このレスの前者は後者に、後者は前者に読み替えてください
間違えました
0673デフォルトの名無しさん (ワッチョイ 1ee9-2Lmd)
垢版 |
2021/09/25(土) 11:02:06.77ID:dAtBdpVF0
>>670
> 同じ変数名が複数ソース上にあるとき現在の位置から見て最も内側のブロックで宣言されたものの方で解決するという当たり前の規則だと認識してます

その「当たり前」の規則は変数名に限ったものじゃくて構造体タグ名についても同じ規則が適用される。
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf
6.2.1 Scopes of identifiers
> A label name is the only kind of identifier that has function scope. ...
>
> Every other identifier has scope determined by the placement of its declaration (in a declarator or
> type specifier). ...
> ...
> ... the scope of one entity (the inner scope) will end strictly before the scope of the other
> entity (the outer scope). Within the inner scope, the identifier designates the entity declared in the
> inner scope; the entity declared in the outer scope is hidden (and not visible) within the inner scope.

ただし変数名とタグ名とでは名前空間 (name space) が異なる。
0674デフォルトの名無しさん (エムゾネ FF32-kEnG)
垢版 |
2021/09/25(土) 11:05:50.70ID:lBxoEpbFF
{
int a;
{
int a;
}
}
とやってることは同じ
0675デフォルトの名無しさん (ワッチョイ f2a4-X0+7)
垢版 |
2021/09/25(土) 16:07:19.71ID:Uwq7lnPV0
>>666
二重定義じゃなくて、入れ子構造の中での定義にすぎないからでは?
イメージとしては、コンパイラとしては、外側の構造体は
struct XX_a {}
内側の構造体は
struct X_a_a{}
みたいな感じで管理してコード展開してるだけ。
0676デフォルトの名無しさん (ワッチョイ d31b-QjBH)
垢版 |
2021/09/25(土) 16:37:10.46ID:g8iabg1P0
>>673
出典出してくださってありがとうございます
declarator内かtype specifier内かどっちかで現れたかにも関わらず識別子には同じような規則が適用されるのですね
この知見を趣味のコンパイラづくりに役立てたいと思います
ありがとうございました
0677デフォルトの名無しさん (エムゾネ FF1f-jOtc)
垢版 |
2021/10/04(月) 14:36:02.21ID:ly3pkK+7F
int a = -4 % 3; // -1
int b = -3 % 3; // 0
int c = -2 % 3; // -2
int d = -1 % 3; // -1
int e = (-4) % 3; // -1
int f = (-3) % 3; // 0
int g = (-2) % 3; // -2
int h = (-1) % 3; // -1

これは仕様ですか?環境依存ですか?
0678デフォルトの名無しさん (ワッチョイ ff69-Uy5C)
垢版 |
2021/10/04(月) 14:53:49.95ID:DbNnxaRn0
C90は実装による
C99は被除数と同じ符号 ((ISO/IEC 9899:1999) の 6.5.5 見ろ)ってwiki に書いてあったけど

6節の (a/b) * b + a % b === a と
整数化に際しての丸めの方向から結果的にそう解釈すればいいってことなのかな
0681デフォルトの名無しさん (スップ Sdea-N/QG)
垢版 |
2021/10/12(火) 19:07:27.42ID:4loHRlApd
配列から数個おきに取得するとき、なにかアルゴリズムとかライブラリ関数みたいなものってありませんか?
↓みたいなコードです。nが大きく、物凄い時間掛かっていて...

for(i=0; i<n; i++) a[i] = b[i*3];
0686デフォルトの名無しさん (ワッチョイ 4f2c-Mxyx)
垢版 |
2021/10/12(火) 21:57:57.62ID:TH86hbHp0
皆様ありがとうございます、Cだとなかなか難しそうですね...
データは数百MBくらいの画像で、mallocで確保した領域にあります。

RGBRGBRGB・・・からRだけを取り出す、みたいな処理で、
頻出しそうだし何かうまい方法あるんじゃないかと思ったんですが。
0687デフォルトの名無しさん (ワッチョイ 4a63-JSxF)
垢版 |
2021/10/13(水) 00:46:23.98ID:5Y743A290
>>686
ちょっと試してみた
a[] 100MB, b[] 300MB の配列確保して、
配列bを適当に初期化したあと
a[i] = b[i*3]; を実行してみた
それしかしていないが処理は1秒程度だった

64bit環境でメモリ16GB、i7 6700k skylake 4GHz
手持ちのコンパイラは Microsoft(R) 32-bit C/C++
Optimizing Compiler Version 16.00.40219.01 for 80x86

参考になるかな
0692デフォルトの名無しさん (ワッチョイ 0fbd-N/QG)
垢版 |
2021/10/13(水) 12:24:48.28ID:89OLuObV0
ループ内で他の事をすると格段に遅くなったので(コンパイラの最適化の関係でしょうか?)
他の処理はすべて外に出して、書いた処理だけにしてる状況です。

ちょっとした実験に使いたいコードで、装置からの出力がだいたいGByte/sくらいなので、それに追い付く処理速度が理想なんですが...
並列化勉強しないと無理ですかね...

>>687
テストまでありがとうございます、こちらでもそれくらいのオーダーでした。
環境のせいではなさそうで安心しました。
0695デフォルトの名無しさん (ワントンキン MM56-e7Yh)
垢版 |
2021/10/14(木) 08:48:28.90ID:RLbfxynZM
サイズが全然違って参考にならないかもしれないけど、以前テスト用の音声データのサンプリングレート落とす時に似たような事やった時は、a[i] b[j]でi++,j+=3みたいにやった方が早かった記憶。
0696デフォルトの名無しさん (ワッチョイ 4f54-e7Yh)
垢版 |
2021/10/14(木) 16:42:28.33ID:1iGiane/0
>>692
コード見てないからなんとも言えないけど、本当にそのループだけで1秒ってのは時間かかりすぎじゃないかな。
このコードでgcc 最適化オプションなしでも0.3秒、-O2なら0.000002秒。
5年くらい前のCore i7 3.3GHz メモリ16GB

勘違いしてないか心配だけどコード。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
int count = 100*1024*1024;

unsigned char *a = (unsigned char*)malloc(count * sizeof(unsigned char));
unsigned char *b = (unsigned char*)malloc(3 * count * sizeof(unsigned char));

clock_t t = clock();
for(int i = 0;i<count;i++){
a[i] = b[i*3];
}
t = clock() - t;
printf("%f\n",(double)t/CLOCKS_PER_SEC);
return 0;
}
0697デフォルトの名無しさん (ワッチョイ 4a63-JSxF)
垢版 |
2021/10/14(木) 17:04:51.16ID:LTwSvEh70
>>687 だが、正確に測定したわけではない

>物凄い時間掛かっていて...

こういう質問だったので、そんなにかからないよという程度の返事
ものすごい時間が掛かると言う処理の内容が分からないとこれ以上は・・・
0699デフォルトの名無しさん (ワッチョイ 4f54-e7Yh)
垢版 |
2021/10/14(木) 18:45:28.00ID:1iGiane/0
>>698
ですよねw -O2で0.18秒。
0704デフォルトの名無しさん (アウアウウー Sacf-PkDM)
垢版 |
2021/10/15(金) 01:46:57.39ID:vumwfiEZa
まったく自信がないのにチャチャ入れるようで申し訳ないのだけど、volatile を書く位置によっても結果がことなるかなと

おそらく a の * の左側に記述したのだと思うけど、動的に確保したメモリに対して有効なのかな…

誰か詳しい人いませんか?
0705はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ef3e-an4T)
垢版 |
2021/10/15(金) 02:01:35.27ID:2ebxtk1m0
・ volatile で修飾された変数 (メモリ領域) は初期系にとって未知の方法で更新されうるというプログラマから処理系に対するヒント
・ (未知の方法で更新されていても) 言語仕様で定めるところの抽象計算機の動作に厳密に従わなければならない

という規則なので volatile の修飾先が変数 a であってもポインタ a が指す先であってもこの場合は結果的に最適化は抑制されると思う。
0707デフォルトの名無しさん (ワントンキン MM7f-t/lv)
垢版 |
2021/10/15(金) 07:55:14.31ID:Svg6ZUXsM
>>686
画像だけならopenCVにsplitというのがあってrgb に分割された配列を返してくれるんだけど、後のレスから察するにどんどん流し込まれて来るみたいだからそのまま使えるかわからないです。
そのsplitではインデックスの計算にOpenCLを使っていますが、もちろん他の処理にも使えるから、ソース読んでみて損は無いと思います。
0710デフォルトの名無しさん (ワッチョイ 6b01-Avck)
垢版 |
2021/10/15(金) 09:44:49.60ID:FX8yed990
すみません、マジの初心者で申し訳ないんですけど、
今サンプルコードを写したりしながら勉強しているんですが、
毎回#includeとかint main(void)とかって書かなくて済む方法
ってありますか?
visual studio 2019を使ってます。
良ければ誰か教えてください。
0713デフォルトの名無しさん (ワッチョイ 6b01-Avck)
垢版 |
2021/10/15(金) 10:23:34.05ID:FX8yed990
>>712

ありがとうございます!
元々それらを使っていたのですが、今使っているサンプルコードが書かれている本が
コマンドプロンプトで実行することを想定して作られているのか、
よく途中でscanfを使って入力の読み取りをするのですが、オンライン上だとそれができないのです。
visual studio 2019で、テンプレを自分で作っておいてそれを
読み込むような技があれば教えてほしいです。
0714デフォルトの名無しさん (ワッチョイ 6b01-Avck)
垢版 |
2021/10/15(金) 10:53:31.08ID:FX8yed990
自力で調べて解決できました。
ありがとうございました。
0716デフォルトの名無しさん (ワッチョイ bb5f-akk3)
垢版 |
2021/10/16(土) 13:51:30.67ID:0CjYy/Ai0
C言語初学者です
for文を使って1からnまでの総和を求め、
さらに答えを例えばn==3なら
1+2+3=6と表示したいのですが、この表示の仕方がわかりません
ご教授お願い致します
0720はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ef3e-ZO17)
垢版 |
2021/10/16(土) 17:51:52.16ID:E+4r+lYs0
>>719
基本的には不要。
 ・ 改行を表すものは (C の規格の範囲内では) 文字であるかのように扱う
 ・ テキストモードでの入出力ではホスト環境の都合に合わせて変換してよい
ということになっていて、改行を2バイトの符号で扱うホスト環境では \n という一文字を
その2バイトに変換するのは入出力関数の仕事。

ただし、標準出力をバイナリモードで開き直している場合だとか、
改行を1バイトの符号で表すホスト環境で2バイトの符号で表す環境のために出力したい
といった事情で改行を \r\n と書くことが無いとは言い切れない。
0721デフォルトの名無しさん (ワッチョイ bb5f-an4T)
垢版 |
2021/10/16(土) 22:25:40.97ID:0CjYy/Ai0
質問です
入力された文字列と文字数を表示するプログラムで
Enterキーのみが入力されるまでループして入力要求をするようにしたいのですが
1〜4文字の入力はループするのですが5文字入力するとループが終わってしまいます
どうなおせばいいでしょうか?
よろしくお願いします
/*************************************/
#include <stdio.h>
#include <string.h>
int main(void){
char str[] = "Hello";
fgets(str,sizeof(str),stdin);
while (str[0] !='\n'){
if (str[0] != '\n'){
printf("文字列%s\n",str);
printf("文字数%d\n",strlen(str));
fgets(str,sizeof(str),stdin);
}else{
break;
}
}
}
/*************************************/
0724デフォルトの名無しさん (ワッチョイ 9f63-ZO17)
垢版 |
2021/10/16(土) 22:39:04.82ID:j08Y/8ma0
>>721
>1〜4文字の入力はループするのですが5文字入力するとループが終わってしまいます

設問として、何文字までの入力を受け付けるようにし、
それを越える文字数入力された場合はどうすると指示されてます?
0728デフォルトの名無しさん (ワッチョイ bb5f-akk3)
垢版 |
2021/10/16(土) 23:00:22.34ID:0CjYy/Ai0
>>726
配列の箱増やしたらループするようになりました
ありがとうございます
あと1つ問題が残っていて文字列表示のあとに改行が無駄に1つ入ってしまいます
どうにかできないでしょうか?
現状
abcde
です
したい表示
abcdeです
0733デフォルトの名無しさん (ワッチョイ 3b54-t/lv)
垢版 |
2021/10/16(土) 23:13:30.42ID:D7GMWgGE0
Hello!って!付ければいいよ。元気が足りない。
さらにこれfgetsの動作の理解を問う良問なんだから、無駄な改行なんぞ気にする余裕があるならfretsのドキュメント読んだ方がいいぞ。
0734デフォルトの名無しさん (ワッチョイ 3b54-t/lv)
垢版 |
2021/10/16(土) 23:14:42.85ID:D7GMWgGE0
>>733
偉そうに言ってスペルミスですね。fgets です
0735デフォルトの名無しさん (ワッチョイ bb5f-akk3)
垢版 |
2021/10/16(土) 23:26:16.40ID:0CjYy/Ai0
>>732
ご親切にありがとうございます!
>>730頂いてから調べててまたわからないことが増えたーって思っていたところでした笑
上の問題は無事解決しました
ありがとうございます

>>729
スマートな初期化方法があれば教えて欲しいです
0737デフォルトの名無しさん (ワッチョイ 1f36-ZO17)
垢版 |
2021/10/17(日) 00:24:13.17ID:IGrhvydt0
>スマートな初期化方法があれば教えて欲しいです
バッファサイズをちゃんと決めておくぐらいか?
ギリギリのサイズじゃなく余裕をもって(最大文字数+1(終端NULL)かつ32bitOSなら4バイト、64bitOSなら8バイト単位とか)。
定義後すぐにfgetsに渡すなら初期化も要らないと思うけど、念のためにやるなら
char str[8]="";

char str[8]={0};
かな。
0738デフォルトの名無しさん (ワッチョイ 9fad-ZO17)
垢版 |
2021/10/17(日) 06:25:57.65ID:atjZW8su0
>>731
そうやって初期化した str[] の内容を後で書き換えるのは普通ではないと思う。
可能だが気を付けてないとバグの元になりそうだしね。

似たようなのに char *p = "hoge"; があるが、これはコンパイラによっては文字列をリードオンリーになるようにコード作って *p = 'A'; なんて後でやるとOSがプログラム停止させたりする。
しかしCの文法としては間違いではないのでコンパイルエラーにならない。
0739ハノン ◆QZaw55cn4c (NZ 0H3f-9L2Q)
垢版 |
2021/10/17(日) 07:57:57.94ID:iZHfLY3SH
>>721
>char str[] = "Hello";

>>738
> str[] の内容を後で書き換えるのは普通ではないと思う。

私は「配列であるかぎり」それを後から書き換えるのは、初期化方法に関係なく文脈・表現として違和感なしと感じます
0744デフォルトの名無しさん (エムゾネ FFbf-mxW8)
垢版 |
2021/10/18(月) 16:00:11.31ID:r9t2S6+pF
char **hoge;
char *hage[];
好き嫌いが判れるな
0749デフォルトの名無しさん (ワントンキン MMbf-t/lv)
垢版 |
2021/10/19(火) 07:28:30.98ID:KQylMF0MM
>>738
終端文字忘れてるからじゃないの?
0750デフォルトの名無しさん (ワントンキン MMbf-t/lv)
垢版 |
2021/10/19(火) 08:18:32.37ID:KQylMF0MM
>>749
char *pか、勘違いすみません。
0751デフォルトの名無しさん (アウアウウー Sacf-mxW8)
垢版 |
2021/10/20(水) 09:23:25.20ID:OEiI06HQa
すごい勘違いレス
0752デフォルトの名無しさん (スップ Sdbf-IIM9)
垢版 |
2021/10/20(水) 18:53:19.81ID:X+tmlWS+d
if ((ss == 0) || (ss == 5) || (ss == 10) || (ss == 15) || (ss ==20) || (ss == 25) || (ss == 30) || (ss == 35) || (ss == 40) || (ss == 45) || (ss == 50) || (ss == 55)) {
hogehoge();
}
だいぶん無駄な書き方だと思いました
一桁の値が0が5の時に実行したいです
アドバイスお願いします
0756デフォルトの名無しさん (ワッチョイ 2b21-NRqJ)
垢版 |
2021/10/20(水) 19:41:14.72ID:+2OzLQ7p0
>>754
節子それ余りやない。ssss=ss-sss*10とかやらんと。

組み込みマイコンだと/,%なしで頑張る縛りプレーもあるで。自分がよくやるのは対応する値域を限定して、
掛け算と >> による割り算で計算する。それより難しいの頭がついてこん。
0758デフォルトの名無しさん (ワッチョイ 2b21-NRqJ)
垢版 |
2021/10/20(水) 20:19:57.63ID:+2OzLQ7p0
>>757
ArduinoってUnoあたりは弱いマイコンなのにadafruitのサンプルとか浮動小数点演算してたり感覚おかしくなる。
1秒ごとの処理なら、1秒ごとにカウンタ増やして5になったら何かするって処理でもいいと思う。
使ってるマイコンが除算回路持ってるかは調べといたほうがいい。32bitマイコンでも割り算は省略されたり。
まぁ動きゃいいので効率や速度も捨てるのも、それが能動的な選択なら構わないとは思う。

ちなArduinoのスケッチは、古めのC++だったりするので、たまCで見慣れん文法が出て来る。
0761デフォルトの名無しさん (スップ Sda2-ysAg)
垢版 |
2021/10/22(金) 14:51:19.29ID:xwM6FSoTd
>>759
難しそうで理解できないです><

>>758
mmが2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57の時に実行したい

int mm;
if (mm = 2) || (mm = 7) || (mm = 12) 略 {
hoge();
}

こう言った場合はカウンター使うんでしょうか?
0767デフォルトの名無しさん (ワッチョイ e910-kr9p)
垢版 |
2021/10/22(金) 17:17:41.96ID:ZQZyZs9H0
if( (mm>1) &&
(mm<58 ) &&
!( (mm-2)%5) ) {.....}
かな?
0770デフォルトの名無しさん (ワッチョイ 5d1b-gYUW)
垢版 |
2021/10/24(日) 23:50:25.11ID:P21IrDZK0
今から数年前はc言語マスターっていうコテハンがいたような覚えがあるんだけど今は見る影もなくなっちゃったな
今でも覗いているのかな
いなくなったらいなくなったで寂しいもんだ
0771デフォルトの名無しさん (ワッチョイ 5d1b-gYUW)
垢版 |
2021/10/24(日) 23:54:50.86ID:P21IrDZK0
あと片山博文って奴もいたがあいつはtwitterで元気にやってるね
すっかりtwitterのit畑に馴染んでいる
0772デフォルトの名無しさん (エムゾネ FFa2-iXiw)
垢版 |
2021/10/25(月) 10:50:24.50ID:vmRZrQEpF
ここは人減り杉たな
0782デフォルトの名無しさん (ワッチョイ e910-kr9p)
垢版 |
2021/10/26(火) 11:41:12.20ID:4NkYNYny0
ふんばっても何も出なかったからそのまま出てきたわ。
0783デフォルトの名無しさん (ワッチョイ 81da-0EqD)
垢版 |
2021/10/26(火) 17:15:10.74ID:rbEPHvg70
なぜC言語は「言語」までつけて呼ぶのでしょうか
PASCAL言語とかFORTRAN言語とかPython言語とかいう言い方は聞いたことがないので気になりました
一文字で語呂が良くないから?
0784デフォルトの名無しさん (オッペケ Sr11-gYUW)
垢版 |
2021/10/26(火) 17:16:53.12ID:iznG3/8mr
音節が一つだけだからでしょ
goと一緒
0788デフォルトの名無しさん (オッペケ Sr11-gYUW)
垢版 |
2021/10/26(火) 17:43:08.10ID:iznG3/8mr
>>785
fって一音節でしょ?
馬鹿なの?
0798デフォルトの名無しさん (ワッチョイ 13ad-BvZE)
垢版 |
2021/10/30(土) 00:17:48.25ID:0q4JizrL0
もう英字一文字の言語は飽和状態だからこれからは平仮名一文字とか漢字一文字の言語名にした方が良いな。
0799デフォルトの名無しさん (ワッチョイ 13ad-OgfA)
垢版 |
2021/10/30(土) 00:23:08.83ID:0q4JizrL0
ʗ言語
0801デフォルトの名無しさん (スップ Sd73-fCHU)
垢版 |
2021/10/30(土) 11:53:47.66ID:A30JUN42d
>>784
日本語(外来語含む)の音韻は音節ではなくモーラ(=拍。俳句の数え方)で数えるべきで、
C(しい)もGo(ごお)も2モーラ
>>785>>788
F(えふ)も同じく2モーラ

まあ、別に2モーラ以下なら「言語」を付けるという規則性もなさそうだけどね
Java(じゃば)やLua(るあ)も2モーラだし
0802デフォルトの名無しさん (ワッチョイ 13ad-BvZE)
垢版 |
2021/10/30(土) 17:29:52.20ID:0q4JizrL0
私意言語
0803デフォルトの名無しさん (ワッチョイ b11b-lV4V)
垢版 |
2021/10/30(土) 18:01:56.38ID:zJlZfWf60
>>801
普通英語で検索するよね?
c languageとかgolangとか
0804デフォルトの名無しさん (ワッチョイ b11b-lV4V)
垢版 |
2021/10/30(土) 18:03:58.48ID:zJlZfWf60
luaって調べたら月の画像が出てきてめちゃくちゃ怖いぞ
0806デフォルトの名無しさん (アウアウウー Sa9d-48dE)
垢版 |
2021/10/30(土) 19:51:07.93ID:lpthGY+1a
月を怖がる人ってたまにいるけど
前世とか今世で悪いことでもしたんかね
0807デフォルトの名無しさん (ワッチョイ b11b-lV4V)
垢版 |
2021/10/30(土) 20:22:41.40ID:zJlZfWf60
天体の画像が怖い
0808ハノン ◆QZaw55cn4c (NZ 0H63-jJ2N)
垢版 |
2021/10/30(土) 20:27:03.94ID:nIglmucmH
>>806
欧米では、月の光は人を基地外にする、とかいうそうですよ
確か狼男も満月だったっけ、いや、それは送り狼だったっけ?
0810デフォルトの名無しさん (ワッチョイ b11b-lV4V)
垢版 |
2021/10/30(土) 21:01:00.69ID:zJlZfWf60
天体恐怖症なんやワイ
木星とか海王星とか怖い
0813デフォルトの名無しさん (ワッチョイ b11b-lV4V)
垢版 |
2021/10/30(土) 23:41:41.51ID:zJlZfWf60
>>811
地球も太陽も怖いです
あと小惑星も怖い
あと月の裏側もマジでこわい
0814デフォルトの名無しさん (ワッチョイ b11b-lV4V)
垢版 |
2021/10/30(土) 23:42:05.22ID:zJlZfWf60
火星の衛星とかも怖いです
歪な形してるやつ
0815デフォルトの名無しさん (ワッチョイ b11b-lV4V)
垢版 |
2021/10/30(土) 23:43:09.25ID:zJlZfWf60
冥王星の最新画像見たけどめちゃくちゃ怖くて直視できなかった
0817デフォルトの名無しさん (アウアウウー Sa9d-48dE)
垢版 |
2021/10/31(日) 11:07:20.50ID:dKAtRzTxa
乙py
乙py
0819デフォルトの名無しさん (ワッチョイ b11b-lV4V)
垢版 |
2021/10/31(日) 11:33:04.24ID:xmsO/hLH0
>>818
グロ
0821デフォルトの名無しさん (ワッチョイ b11b-lV4V)
垢版 |
2021/10/31(日) 14:17:04.25ID:xmsO/hLH0
>>820
地球の中心コアへの旅っていう関連動画がグロい
0822デフォルトの名無しさん (ワッチョイ 13ad-BvZE)
垢版 |
2021/11/01(月) 03:55:44.21ID:6HuVbq6K0
饅頭怖い
0823デフォルトの名無しさん (ワッチョイ 2bbd-ruXn)
垢版 |
2021/11/01(月) 11:25:10.37ID:/Zy4WfCe0
lu分解をc言語でやりたく、次のようなコード(1部分になります)を書いたのですが、y0の値が0.8になるはずなのに全く違うものとなってしまいます。原因が全くわからないのですが、どこを改良すればよいのでしょうか。

for(int n = 1; n <= M+1; n++){
t = n*dt;

for(int i = 0; i <= N; i++){
x[i] = 0.0;
}

/* Ax = uを解く */
/* Ly = u */
y[0] = u[0]/l[0][0];
for (int i = 1; i <= N; i++){
y[i] = (u[i] - l[1][i]*y[i-1])/l[0][i];
}

/* Ux = y */
x[N] = y[N];
for (int i = N-1; i >= 0; i--){
x[i] = y[i] - m[i]*y[i+1];
}

/* 更新 */
for(int i = 0; i <= N; i++){
u[i] = x[i];
}
}
0824デフォルトの名無しさん (エムゾネ FF33-48dE)
垢版 |
2021/11/01(月) 12:00:24.14ID:z/x9VzKbF
int → double または float
0825デフォルトの名無しさん (ワッチョイ 1369-flnY)
垢版 |
2021/11/01(月) 13:05:24.25ID:qmVDupeY0
x, y, l, m, u の宣言で添え字のとりえる範囲分はちゃんと確保してる?

(lu分解として正しいかどうかはおいといて)ループのコードから
x 0..N まで → 最低限 double x[N+1];
y 0..N まで → 最低限 double y[N+1];
u 0..N まで → 最低限 double m[N+1];
m 0..N-1 まで → 最低限 double m[N];
l [0][0]..[1][N] まで → 最低限 double l[2][N+1];
0826デフォルトの名無しさん (ワッチョイ 2bbd-ruXn)
垢版 |
2021/11/01(月) 15:07:15.16ID:/Zy4WfCe0
最初に宣言して確保してるので、大丈夫だと思うんですが、、
いちおうx,y,l,m,uをそれぞれ出力してみたのですが、yだけ間違えた値になってしまいます。
ループの順番とかがおかしいんですかね?
0827デフォルトの名無しさん (ワッチョイ 13ad-BvZE)
垢版 |
2021/11/01(月) 19:03:15.19ID:6HuVbq6K0
全ての変数の宣言を書け
0829デフォルトの名無しさん (ワッチョイ 6910-7alp)
垢版 |
2021/11/02(火) 07:44:51.26ID:I7k+rE/i0
>lu分解
java版?なら見つかった。
ttps://qiita.com/edo_m18/items/1d67532bed4a083cddb3
0832デフォルトの名無しさん (ワッチョイ 515f-Ds5/)
垢版 |
2021/11/07(日) 10:08:30.22ID:gNBrcBZD0
サイコパスゲイ病人菊永裕太郎
0834デフォルトの名無しさん (ワッチョイ a37d-IZSS)
垢版 |
2021/11/13(土) 19:10:26.04ID:EXpCOp4b0
int main() {
return 0;
}

いきなりこれの意味がわかりません。解説によるとゼロを返して正常終了する。
とかなんとかなんですが、どういう意味でしょうか。
オンライン上にゼロの意味の解説が見つかりません。
0835デフォルトの名無しさん (ワッチョイ e336-wd7R)
垢版 |
2021/11/13(土) 19:43:45.28ID:Q3rklS0i0
大抵の解説では「OSに返す値」となってる。

プログラムが正常終了したら 0。
異常終了や目的の処理が出来なかったときには0以外を返すのが慣例。

Linuxならシェルで echo $?
Windowsならコマンドプロンプト/バッチファイルで echo %ERRORLEVEL%
で確認できる・・・らしい。

0以外を受け取ったからとOSが何か特別な処理をするわけではない。
0836デフォルトの名無しさん (ワッチョイ a5da-WW/G)
垢版 |
2021/11/13(土) 19:53:04.62ID:NDPTYcvp0
>>834
エラーで終了するときは0以外で帰しておくと
数年後の未来の自分を助けることができるぞ!
0838はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2b3e-wd7R)
垢版 |
2021/11/13(土) 20:56:10.46ID:FTD0k+Bx0
>>834-835
厳密にいえば、言語仕様上では

・ 0 又は EXIT_SUCCESS の場合は成功終了であることを処理系定義の方法で返す
・ EXIT_FAILURE の場合は失敗終了であることを処理系定義の方法で返す
・ それら意外の場合には返される状態は処理系定義とする

という規則になっている。
どのように解釈されるかは言語仕様の側でははっきりとは決めずにホスト環境 (普通は OS のこと) や処理系の都合次第なので、
言語よりは OS の資料にあたるほうがわかりやすいかもしれない。
言語仕様として確実に保証してるのは少なくとも成功したのか失敗したのかだけは返せる (受け取るかどうかは知らんけど) ってだけだね。

POSIX (Unix 系 OS) では exit status と呼んでるけど、
Windows では error level とか exit code と言ってる。
0839デフォルトの名無しさん (JP 0Hab-x5sK)
垢版 |
2021/11/13(土) 22:33:17.66ID:uR+eQ86NH
単独で使う場合は関係ないけど
シェルとかバッチファイルから呼び出す場合にエラーや望まない結果だったら処理を中断とかしたい場合に
ちゃんと値を返しておくと便利になる
0843デフォルトの名無しさん (ワッチョイ 9521-EbYB)
垢版 |
2021/11/14(日) 09:01:01.66ID:TENET21t0
>>834
補足として、CのAPIにも失敗時に0を割り当てる場合と、成功時に0を割り当てる場合がある。
エラーの要因なんかを意識したい体系では後者も普通に使われるが、同じコード内で前者と
混在せざえるをえない事もある。マクロなんかを使った記述を意識しないとハマるぞw
0847ハノン ◆QZaw55cn4c (ワッチョイ 9be9-KVNp)
垢版 |
2021/11/14(日) 14:07:31.05ID:5CSGBVhH0
>>846
リンクされるスタートアップが返り値の存在を前提にしているというのに、main() ごときが返り値の有無を指定するなんて傲慢じゃないですかぁぁぁぁ!
0848はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a53e-wd7R)
垢版 |
2021/11/14(日) 15:32:15.51ID:A4GQ1/1N0
main の型を変則的にするくらいなら main をエントリーポイントにしない
(エントリーポイントの関数を別の名前にする) ほうが好ましいと個人的には思う。
言語仕様の外 (処理系定義) で定義された方法を使おうとしていることがわかりやすいので。
0852デフォルトの名無しさん (ワッチョイ 1554-WW/G)
垢版 |
2021/11/15(月) 19:21:59.60ID:BFf+frEV0
C言語初心者です。sleepを使って一文字ずつ
2秒ごとに表示したいのですが
Windowsの端末だとうまくいくのですが、
Ubuntuだと8秒後にまとめてHelloと一度に
表示されてしまいます。ubuntuでも
windowsのように一文字ずつ表示させたいのですが
できないのでしょうか?コンパイラはGCCです。

#include <stdio.h>
#include <unistd.h>

int main (){

printf("H");
sleep(2);
printf("e");
sleep(2);
printf("l");
sleep(2);
printf("l");
sleep(2);
printf("o\n");

return 0;
}
0856はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a53e-wd7R)
垢版 |
2021/11/15(月) 23:18:43.35ID:LEZCO+bp0
>>852
どちらの挙動も言語仕様的にはアリ。
ストリームが対話型装置を参照していると判定できて、かつその場合に限り完全バッファリングすることになっていて、
逆に言えば対話型装置 (この場合はコンソール) に繋がっているときはラインバッファリングかもしれないし、
バッファリング無しかもしれない。

フラッシュを明示的に指示するのでもよいが、 setvbuf 関数でバッファリングをしないように設定することもできる。
0859デフォルトの名無しさん (ワッチョイ 4b46-Itmb)
垢版 |
2021/11/16(火) 21:41:05.99ID:vUDwceGd0
lintの無い事い今更気付いたのだが、代替何?
0861デフォルトの名無しさん (アウアウウー Saa9-09aj)
垢版 |
2021/11/17(水) 02:29:57.06ID:+JwFzM8Ra
>>851
int main(){
int a=0;
return a;
}

void main(){
int a=0;
}
をそれぞれ asm 付きでコンパイルして比較してみ
判ったら次は a=0; を inline にしてみ
0863はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a53e-wd7R)
垢版 |
2021/11/17(水) 17:37:06.80ID:R6z6I7690
>>859
コンパイラが細かくチェックするようになったから lint の出番がなくなった。

gcc や clang なら -fsyntax-only オプションを付けると文法のチェックまでで段階を止める。
必要な警告オプションを付けた上でこれを使えば古い時代の lint より厳しいくらいだと思う。
(ちなみに -Wall や -Wextra を付けても全ての警告が有効になるわけではない。)
0867デフォルトの名無しさん (ワッチョイ dd10-+irO)
垢版 |
2021/11/18(木) 00:32:41.46ID:HOoxCKRv0
入門サイトで勉強しててこんな感じのコードがエラーになって
{
int a = 100;
printf("数値:%d アドレス:%x", a, &a);
}
gccのエラーをコピペで検索すると、&aはポインタだから、アドレス:%pだと回答がヒット。
コンパイラやバージョンによって挙動が違うのでしょうか?
0868はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a53e-wd7R)
垢版 |
2021/11/18(木) 00:55:33.69ID:ku1GvVZm0
>>867
言語仕様で未規定や処理系定義としている場合があって、
そういうのは処理系や実行環境の都合に合わせて決めていいことになってる。
そして「未定義」とされている場合は何が起こってもいいことになってるので、
暴走するかもしれないし、 OS が止めてくれるかもしれないし、しれっと意味不明の結果を出力するかもしれない。
たぶんそれは未定義に該当すると思う。

C の可変長引数は型チェックをゆるゆるにすることで実現されていて、
処理系の内実をわかってる人は言語仕様上の保証がない (けど実態としては問題がない) コードを書くのは普通にある。
パソコンで一般的に使われている呼び出し規約 (関数を呼出す機械語レベルの挙動の規則) だと
ポインタと (レジスタの幅以下の大きさの) 整数は同じ方法で渡すので問題にならないんだけど、
言語仕様では保証がない。

可変長引数の型チェックはゆるゆるなんだけど printf は頻出するからコンパイラが特別扱いで
少しチェックを厳しくしているのでエラーになることもあったりする。

まあ基本的には保証されてないのでやらないほうがいいよ。
0869867 (ワッチョイ dd10-+irO)
垢版 |
2021/11/18(木) 01:52:34.49ID:HOoxCKRv0
>>868
詳しい説明ありがとうございます。
実際にターミナルに出力されたのはerrorではなくwarningで、試したらそのままでも実行できていました。
用心しながら学習続けていこうと思います。
0870はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a53e-wd7R)
垢版 |
2021/11/18(木) 02:23:30.05ID:ku1GvVZm0
逆に完全に言語仕様に沿っていても警告になる場合もあるし、
(基本的には警告が出ないようなコードのほうが綺麗ではあるが)
言語仕様的に OK なのか NG なのか、
とりあえず自分の実行環境で OK なのか NG なのかを正確に把握するのはかなり分かり難いと思う。
0873デフォルトの名無しさん (スプッッ Sd93-HWhl)
垢版 |
2021/11/18(木) 10:39:42.31ID:7kNuqccRd
うまくいかないのは過程を出力する処理の過程なのですが、どうしたらよいですか。

コードは以下です。

#include <stdio.h>

int main()
{
int i,sum=0;

for(i=17; i<=100; i=i+17) {
sum=sum+i;
printf("途中計算→%d\n", sum);
}
printf("合計=%d\n",sum);

return 0;
}
0878デフォルトの名無しさん (エムゾネ FF43-09aj)
垢版 |
2021/11/18(木) 14:40:44.78ID:/He/baLSF
>>869
昔のソース(コンパイラ)は %x で通るのが多い
今から勉強するなら %p の方が良いし新しい教科書使った方が良い
0879デフォルトの名無しさん (エムゾネ FF43-09aj)
垢版 |
2021/11/18(木) 14:45:21.17ID:/He/baLSF
>>873
printf("途中計算→%d, %d, %d\n", i / 17, i, sum);
0881デフォルトの名無しさん (スッップ Sd43-x5sK)
垢版 |
2021/11/18(木) 18:35:31.06ID:CfNf7HSld
>>867
伝統的にポインタはintと同じメモリサイズなので昔はそう書いてた

そうなんだよな最近のコンパイラはprintfのフォーマットと引数をチェックしてるんだよな
もう慣れたが最初不思議な気がした
組み込みだと自分でprintf関数作ったり(標準だと使わない機能が多くて重すぎるから)するけどそんな時はどうなるのだろうとか
0882デフォルトの名無しさん (ワッチョイ e2ad-+VBe)
垢版 |
2021/11/19(金) 00:07:30.77ID:tkL53aTR0
>>872
( ´_ゝ`)フーン
0883デフォルトの名無しさん (ワッチョイ e2ad-+VBe)
垢版 |
2021/11/19(金) 00:11:12.00ID:tkL53aTR0
>>873
それでいいのでは?
0884はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 573e-+VBe)
垢版 |
2021/11/19(金) 00:18:54.40ID:bln5kEpJ0
64 ビット環境では LP64 や LLP64 (int とポインタの大きさが違う) が標準的になってしまったから
古いコードをそのまま持ってきたら通らないってことは割とよくあるよね。
0885デフォルトの名無しさん (ワッチョイ e2ad-+VBe)
垢版 |
2021/11/19(金) 00:37:21.78ID:tkL53aTR0
long と int (及び char *)を全て32bitとして扱っていて、辛うじてコンパイルは通るが決してまともに動かない
プログラムがあったので、しょうがないから gcc の -m32 と32bit用ライブラリで何とかした。何せ量が膨大で、
人力で直してたら多分何人か死んでたと思う。
0887デフォルトの名無しさん (エムゾネ FF02-iUmB)
垢版 |
2021/11/19(金) 10:15:17.36ID:eyeX0xyMF
long が int に追い越されたのかと思った
0892デフォルトの名無しさん (ワッチョイ ef63-YZaJ)
垢版 |
2021/11/20(土) 22:45:40.83ID:LAgO+4EW0
当時300kを越える配列を処理したくて使いました
使うというか、複数のセグメントに分割して割り当て、
自前で配列インデックスを計算してアクセスしただけですが
0893はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 573e-+VBe)
垢版 |
2021/11/21(日) 00:46:36.95ID:mkw0m2hl0
違う場所が同じ値になるような場合があっても言語仕様が保証している範囲ではちゃんと仕様通りだったりするんだよな。
というより保証が可能な範囲をうまいこと言語仕様にまとめたって感じなんだと思う。
0895ハノン ◆QZaw55cn4c (ワッチョイ 4ee9-XdqU)
垢版 |
2021/11/21(日) 12:42:55.44ID:ODZrEgDk0
>>891
さらに年寄りの繰言を続けますが、

>違う値が同じアドレスになる事あるし。

というのは far ポインタでも同じです、far と hage じゃなかった huge の違いは、オフセットの繰り上がりがセグメントに反映されるかされないか
私は余計なことはしてほしくないので、繰り上がりがない far を愛用していました、huge はいまいち信用できませんでした
0898ハノン ◆QZaw55cn4c (ワッチョイ bfe9-Dsww)
垢版 |
2021/12/01(水) 02:24:50.55ID:VU8XmWVx0
>>897
パディングの状況に依存するコードを書くのはよろしくない、というのが一般論だったかと
ファイル入出力で問題になりますが、私はもう、ちまちま fwrite() fread() で「1 byte ずつ」やるしかない、とまで諦めています
環境がバッファリングしてくれますし
0899はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-D8AZ)
垢版 |
2021/12/01(水) 02:53:05.18ID:Y6HO3vrm0
未規定であるしパディングの大きさに依存するようなコードは避けるのが行儀のよいコードであるのは間違いないけど、
対象にしている処理系での挙動がはっきりしていて移植の可能性もない (または移植のコストをかける覚悟がある)
のなら依存するコードを書くことはそれなりにあると思う。

マクロで切り分けて configure (とか cmake とかのメタビルドツール) で各アーキテクチャの都合に対処することは可能だし。

良くはない。 良くはないがそういう良くないことも出来るのが C ってもんなわけで。
0900デフォルトの名無しさん (ワッチョイ d763-HfRa)
垢版 |
2021/12/01(水) 11:58:37.67ID:Jc7L6V7f0
昔、構造体の扱いで失敗した事がある
あるサイトで構造体を引数にして削除処理を行う関数を提供されたが、
実際に使おうとすると引数エラーを返されてしまい途方に暮れた
構造体メンバーには仕様書通りに必要な値をセットしている

しばらくして原因が分かった
関数側は引数が正しくセットされているかを、
処理対象の領域に格納されている同一の構造体と比較しチェックしていた
その比較に memcmp を使っていた
呼び出すこちら側は、構造体を自動変数として領域確保していた
0902デフォルトの名無しさん (ブーイモ MMdb-sYxR)
垢版 |
2021/12/01(水) 20:37:38.80ID:sYF3bwwtM
横着したくなるというか識別子増やすの躊躇させる言語仕様が招く面倒ね
メンバメソッド系はオブ臭く棲み分けに反し今更入れる必要ないと思うけど
一層にぶち撒かず妥当なルールでツール類で拾いやすいサポートネームスペース括りみたいなのがあれば

void bossy(struct *a);
bool bossy.supporter(struct const*a);
0905デフォルトの名無しさん (スップ Sd3f-hol4)
垢版 |
2021/12/02(木) 15:56:03.63ID:NxRkNBX1d
バブルの頃に努力?修練?ぎやはははだっせー
と言ってたのが結局、日本の致命傷になっちまったな
それを今まだ言ってる堀江みたいなぶっ飛んだキチガイもいるし
どーすんだこれ
0907デフォルトの名無しさん (ワッチョイ ff0e-eHdc)
垢版 |
2021/12/02(木) 18:59:50.96ID:boATToTk0
植民地支配がどんなに恐ろしいことか知らないようだな
朝鮮半島に先進国並みのインフラを作ったり
狭い島国に世界最大のメガロポリスができるのと
フィリピンのバナナ農家が受けている仕打ちの違いわかる?
0918デフォルトの名無しさん (ワッチョイ aee9-BBtJ)
垢版 |
2021/12/04(土) 00:32:09.23ID:d5QmhWSv0
>>915
補足すると自前でC++を使ってやる方法も win16 初期には見られたが、
https://www.aa;mazon.co.jp/dp/4774100544/
結局みんな MFC ばかり使うようになりました、もうひとつのメーカー製の OWL ですら滅びたようです
MFC の使い方の本は私は持っていない…
0932デフォルトの名無しさん (ワッチョイ e2ad-Z6Z9)
垢版 |
2021/12/05(日) 02:12:34.65ID:NlN9zBro0
>>930
本が100円でも送料が300円以上だったりするので、古本は要注意。
メルカリで送料込みで安いやつ探した方が良いかも知れない。
(但し、300円以下はあまりない。理由は自分で出品してみると分かる)
0937デフォルトの名無しさん (ワッチョイ aee9-BBtJ)
垢版 |
2021/12/07(火) 05:13:43.34ID:WxNsBn2X0
>>934
金子氏の書籍より、VC++ から C++Builder に GUI の変更を目的に変えた、との記述を見つけました
Borland C++ Builder 4.0, および 5.0 であれば OWL5.0 をサポートしていますが、VCL の可能性のほうが高いですね
0940デフォルトの名無しさん (ワッチョイ d02c-oWHg)
垢版 |
2021/12/08(水) 18:59:09.17ID:GPDURn2W0
Ruby on Rails では、WSL2, Linux, Docker, VSCode(Remote Container, Remote WSL)など、
本物のLinux(CUI)で開発できる。
MSYS2/MinGW みたいなWindows でコンパイルした、日本語でバグるものを使う必要もない

Dockerを使わずに、日本人が作った、バージョンマネージャーのanyenv で、
rbenv, nodenv, pyenv など、多言語を統一的に扱う事もできる

組み込み用mruby の本には、Virtualbox, Vagrant を使う。
WSLはサポートしないと書いてあるけど、WSLでも使えるかも?

Webで使えるmrubyシステムプログラミング入門、近藤宇智朗、2020/11

宇宙開発などの組み込み用、MicroPython, Lua, Squirrel の代替になる。
Ubuntu 18.04, C99 対応

人工衛星イザナギ・イザナミで、使っている
0941デフォルトの名無しさん (ワッチョイ ce01-1kDn)
垢版 |
2021/12/08(水) 20:28:27.76ID:pzF9gjPk0
>>940
キヤノンが打ち上げた光学衛星が夜間撮影に成功したそうです。
夜間撮影が出来るとなると、もはや立派なスパイ衛星。
何を撮影しましょう。
0942デフォルトの名無しさん (ワッチョイ d910-PP5C)
垢版 |
2021/12/09(木) 11:14:02.01ID:89810ylo0
実用的なところで夜間に移動する北のミサイル発射トラック追尾。

個人的希望でgoogleカーの追尾。
0945デフォルトの名無しさん (ワッチョイ dfad-8/hI)
垢版 |
2021/12/10(金) 02:07:06.32ID:Uh57IFJZ0
そう言えば以前 Windows で動く IDE で Linux で動くプログラムの編集をしてそのまま
リモートで Linux 側でコンパイルして更にリモートでデバッグまでできれば良いなと
思ったが、どうやらそれができるものはなさそうなので諦めて Linux 上で IDE を動かした。

まあでもクロス開発というか、リモートデバッグというか、そういうのが出来ると便利だよな。
0946デフォルトの名無しさん (ワッチョイ bfe7-4DaK)
垢版 |
2021/12/10(金) 09:42:22.14ID:bMtT4XMq0
>>944
Linuxにインストールしてあるgccでコンパイルしたい
ビルドボタン押したらssh経由でmakeできたら素敵だが

使ってるgccのバージョンがちょっとどころじゃなく古いので
できればMinGW gccとかじゃなくて現物のgcc使いたい感じ
0952デフォルトの名無しさん (ワッチョイ dfad-8/hI)
垢版 |
2021/12/11(土) 03:38:45.47ID:LF8J+dNV0
>>945 を昨日書いたが、さっきこんなの見つけた。有料だけどな。

JetBrains、リモート開発機能と軽量IDE「Fleet」を発表
https://japan.zdnet.com/article/35180131/
0953940 (ワッチョイ 7f2c-yjVA)
垢版 |
2021/12/11(土) 13:26:00.16ID:iDGs+tOs0
漏れは、Ruby on Rails, WSL2, Ubuntu 18.04 で、
Web Socket など、Railsで使う各モジュールがネイティブコンパイルされるけど、

build-essential とか入れておけば、
Rails のインストール時に、勝手にコンパイルされる

build-essential には、
gcc(GNU C compiler), g++(GNU C++ compiler), libc6-dev(GNU C Library), make などが入っています

パッケージ: build-essential
https://packages.ubuntu.com/ja/bionic/build-essential

43.0 MB のアーカイブを取得して、165 MB のディスク容量が使われます
0954デフォルトの名無しさん (スプッッ Sd7f-9zNQ)
垢版 |
2021/12/11(土) 22:36:35.78ID:KvUnFidtd
VS2022に昔のプログラム持ってったら
isspace()とかに80h以上の文字入れると例外になるけど
いいのかこれ
テーブルで処理してて80h以上は負だからテーブル外になるって理由はわかるんだけどさあ
昔のはなんとかうまくやってた気がするんだけど
0957ハノン ◆QZaw55cn4c (ワッチョイ bfe9-cB3R)
垢版 |
2021/12/12(日) 06:11:48.38ID:i1KpRZU20
>>954
int isspace(int c)
ですよ、ちゃんと int の正の数で渡してます?char をまんま渡してたらまずいっすよ

>>956
「unsigned char にキャストして、暗黙の型変換(プロモーション)に頼る」ってかなりアクロバットに見えますね
0958はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 873e-8/hI)
垢版 |
2021/12/12(日) 11:16:13.91ID:553p9mhC0
char が符号付か符号無しかは処理系定義で、
符号無しであるような処理系では char が int に拡張されたときに負数になることはない。
(考慮する必要はない。)

C にはそういう処理系定義とか未規定とか未定義がもりだくさんなので
ある処理系の定義では未定義を踏まずに済むプログラムでも
別の処理系では (処理系定義のコンボで結果的に) 未定義に引っかかることはよくある。

C のプログラムで完全に処理系定義や未規定を避けるというのは困難な話だし、
(可能なら環境依存を避けるように意識するのは良い作法ではあるけど)
違う環境に持ってきたらその程度の修正は必要なものだと思って諦めるしかしょうがない。
0961デフォルトの名無しさん (ワッチョイ 7f0e-4DaK)
垢版 |
2021/12/12(日) 17:33:46.14ID:0XY4m15b0
違う。

たとえば
int f1(), f2();
int a = f1() - f2();
のようなことをしているとき、
f1とf2の評価順序は未規定
f1とf2の評価順序によりaに入る値が変動する場合は未定義の動作だ
0966はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 873e-8/hI)
垢版 |
2021/12/12(日) 18:09:59.00ID:553p9mhC0
>>962
未規定な動作を含むプログラムは正しい。
あり得る動作の内のどれかにはなる。

未定義はどんな保証もない。
未定義の挙動を含むプログラムはプログラム全体がどんな動作をするかわからん。
全然関係ないと思う箇所でわけわからん動作になることもあるし、
未定義を踏んでる箇所より前に問題が表れることもないとはいえない。

>>963
処理系定義は「未規定の動作のうち,各処理系が選択した動作を文書化するもの。」ということになっている。
つまり処理系定義は未規定の一種という扱い。
0969デフォルトの名無しさん (ワッチョイ bf66-cB3R)
垢版 |
2021/12/12(日) 23:13:30.38ID:VXD697/Q0
>>968
いやあってる
演算子の結合規則・優先順位は、あくまでも複数の演算子があったときにどの演算子を先に処理するか、に過ぎない
オペランドを二つ持つ演算子一つに限れば、どっちのオペランドを先に評価するかは処理系依存だったと思う
これは関数の引数についても同じ
0970デフォルトの名無しさん (ワッチョイ bfe9-4iyA)
垢版 |
2021/12/12(日) 23:20:10.63ID:xqkchTt80
>>969
だれも結合優先度の話はしてないと思う。

> f1とf2の評価順序は未規定
これについては未規定で異論は無いんだよ。
> f1とf2の評価順序によりaに入る値が変動する場合は未定義の動作だ
でも、こっちは嘘じゃね?という話。そんな規定文面確認できない。
0971デフォルトの名無しさん (ワッチョイ a7da-u2LQ)
垢版 |
2021/12/13(月) 00:34:13.21ID:0Z9P9uJp0
C17Draftのpp.65 6.5 1では?

> If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined.
> If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side effect occurs in any of the orderings.
0972デフォルトの名無しさん (ワッチョイ bfe9-4iyA)
垢版 |
2021/12/13(月) 01:22:45.02ID:aR9zk0xx0
>>971
複数の関数呼び出し先にある評価同士、あるいは呼び出し元と呼び出し先にある評価同士は
indeterminately sequenced となり、 unsequenced にはならない。
6.5.2.2 Function calls p10
> ... Every evaluation in the calling function (including other function calls)
> that is not otherwise specifically sequenced before or after the execution of the body of the called
> function is indeterminately sequenced with respect to the execution of the called function. 96)
...
> 96) In other words, function executions do not “interleave” with each other.

>961 の f1, f2 は関数なので、 f1() - f2() の結果が未規定だからといって未定義動作にはならない。
0973デフォルトの名無しさん (ワッチョイ a7da-u2LQ)
垢版 |
2021/12/13(月) 02:53:30.01ID:0Z9P9uJp0
>>972
OK, 関数呼び出しを噛ませたことで評価順序が未規定ではなく不定(一方が他方の後(先)であることは保証される)になるので, 呼出先関数で副作用があっても(結果は未規定だが)未定義動作ではない, と
確かによくある a = i++ + ++i; みたいな例が適切だったか
0974デフォルトの名無しさん (ワッチョイ bfe9-4iyA)
垢版 |
2021/12/13(月) 03:50:46.86ID:aR9zk0xx0
>>973
あともう1点念のため。
その例 a = i++ + ++i は未定義動作になる例として適切なんだけど、未定義動作になる理由は >971 の規定であって、
>961 の「評価順序によりaに入る値が変動する場合」というような理由じゃない。
例えば a = (i = 0) + (i = 0) は、どっちの i = 0 を先に評価しても a に入る値は 0 で変動しないけど、未定義動作となる。
0975デフォルトの名無しさん (ワッチョイ bfe7-4DaK)
垢版 |
2021/12/14(火) 17:26:28.72ID:LP8Fmqr90
自作ライブラリのヘッダと標準関数のヘッダの読み込み順って
なにか決まりごとはあるの?

#include "jisaku.h"
#include <stdio.h>
ってやってたらキモイって言われたんだけど、これなんかおかしいか?

インクルードガード利いてるし順番なんてどうでもいいだろ っていうか
だったら自作のヘッダが先に来るべきだろ って思うんだけど
0976はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 873e-8/hI)
垢版 |
2021/12/14(火) 18:00:24.76ID:+JRF3Q+g0
>>975
たとえば assert.h を #include する前にマクロ NDEBUG が定義されていると assert が無効になるといったように
動作の切り替えをするマクロというものが存在する。
標準ではそういうマクロは下線で始まる名前になってることが多いから自分のコードの中の名前がたまたま衝突するということは
そうそうないんだけど、各処理系やライブラリに固有の切り替え用マクロが雑な短い名前だったら意図せず影響を与えるかもしれない。

単なる習慣としてもプロジェクト内のヘッダは後に書くのが定着しているね。
0987はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 873e-8/hI)
垢版 |
2021/12/16(木) 11:05:28.00ID:78Qrz9F+0
ヘッダのインクルードは全て .c の側でやる (ヘッダ内でインクルードしない) という流儀もある。
既にほとんど滅びた流儀だろうし、現代的ではないと断っておくがこの考え方を取るのであれば
インクルードの順序は重要になる。

// foo.h
struct foo{};

// bar.h
// ここで foo.h や stdint.h をインクルードしない
void bar(foo, uint32_t);

// bar.c
#include <stdint.h>
#include "foo.h"
#include "bar.h"
void bar(foo x, uint32_t y) { printf("bar\n"); }

// main.c
#include <stdio.h>
#include <stdint.h>
#include "foo.h"
#include "bar.h"
int main(void) { struct foo x; bar(x); }

メインの側で適切な順序にしないといけないから抽象不足だが、
インクルードガードしてても読み込んでプリプロセスの手順を通すという処理は発生してしまうので
それすらも最低限であるのが好ましいなどの思惑があるのだと思う。
(いまどきのコンパイラではインクルードガードのパターンを検出して
二度目にはファイルを読むことすらしないものもあるらしい。)
まあリソースをケチるのが正義だった昔の話やね。
0990デフォルトの名無しさん (ワッチョイ a34c-ch9D)
垢版 |
2021/12/24(金) 05:09:46.99ID:ZnDQBfvC0
なんか違和感ある言い方だな
「読む」とはCPUへの入力、「書き込む」がCPUからの出力で
たとえばメモリリードはメモリからの出力、メモリライトはメモリへの入力を意味する

「コピー」はそれで合ってる
「ムーブ」になる場合は必ずそう断るから
0991デフォルトの名無しさん (ワッチョイ c5bb-t0J7)
垢版 |
2021/12/24(金) 05:42:34.84ID:TL6ByUiE0
>>990
たとえば

int a = 1;
int b = a + 2;

この「a + 2」の「a」の部分はメモリリードしてるということですよね
このとき計算のためにCPUに値を入力(コピー)しているという理解で合ってますか?
0992デフォルトの名無しさん (ワッチョイ 17da-zE/T)
垢版 |
2021/12/24(金) 05:43:27.34ID:+etymfSa0
レジスタからの読み出しは読み出しという操作自体に副作用がある(レジスタに対する読み出しを検知してデバイスが何かを行う)場合があるので, 必ずしも同義とは言えない
0996デフォルトの名無しさん (ワッチョイ c5bb-t0J7)
垢版 |
2021/12/25(土) 01:01:40.65ID:s/Gdf1X50
>>995
アセンブラよくわからないんですが

mov ax, 1 // axレジスタに1をコピー
add ax, 2 // axレジスタの値に2を加算
mov ptr[b], ax // axレジスタの値をptr[b]にコピー

でしょうか
ptr[b]っていうのはなんですか?
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 180日 0時間 29分 20秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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