- 1 名前:デフォルトの名無しさん mailto:sage [2021/12/25(土) 12:11:46.61 ID:xxeaCAplM.net]
- !extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください) C言語の話題のみ取り扱います C++の話題はC++スレへ 質問には最低限の情報(ソース/コンパイラ/OS)を付ける 数行で収まらないソースは以下を適当に使ってURLを晒す https://paiza.io/ https://ideone.com/ codepad.org/ C17 www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf C11 www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf C99 www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf kikakurui.com/x3/X3010-2003-01.html C FAQ 日本語訳 www.kouno.jp/home/c_faq/ JPCERT C コーディングスタンダード https://www.jpcert.or.jp/sc-rules/ ※前スレ C言語なら俺に聞け 157 https://mevius.5ch.net/test/read.cgi/tech/1624846971/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
- 136 名前:は
#define ESC(c) "\x1b" #c printf("今からUP" ESC(A) "UP完了"); くらいかなぁ [] - [ここ壊れてます]
- 137 名前:unko [2022/01/29(土) 18:53:20.85 ID:cvNc/NLr0.net]
- ごめんなさい高校のc言語の課題で乱数とじゃんけん対決をして結果と手を動的配列に格納して最後にまとめて結果を表示するというやるをやってるんですが
whileループで代入した結果とその後のforループでカウントしながら表示している値が違うみたいでずっとプログラム見てても何が原因なのか分からないのでわかる方いたら教えて欲しいです. https://github.com/unko-c/kadai/blob/main/kadai.c
- 138 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 19:18:32.81 ID:mAwlWFlr0.net]
- >>134
scanfで表示出力は出来ません。分けましょう。 printf("times: "); scanf("%d",&j); しかし、それでもまだ問題がある。
- 139 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 19:22:51.55 ID:wjo4lb340.net]
- 44: どっから配列が出てきた
デバッガ使えばプログラムの動き見るの捗るから使え 使えないなら怪しそうなとこにひたすらprintfを埋めろ
- 140 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 20:13:03.39 ID:mAwlWFlr0.net]
- (&janken->man)[i] = man;
printf("man:%2d ",(&janken->man)[i]); 構造体配列のメンバーアクセス方法が間違ってる case 0: countDraw++; この直後にはbreak;を入れること(全てのcase文に適用) while(i<=j && man<=2 && man>=0) { ここにmanを入れる意味は? 入力範囲チェックを意図するなら、ここではなく scanf直後に、範囲外ならcontinueさせる方が良い 無駄もあるけれど、この辺を直せば動くんではないか?
- 141 名前:unko [2022/01/29(土) 20:51:58.61 ID:cvNc/NLr0.net]
- >>137
ありがとうございます break;忘れてたので実行結果変でしたね ポインタとかは最近やり始めてまだよく分かってないのでちゃんと勉強しておきます
- 142 名前:unko [2022/01/29(土) 20:54:58.88 ID:cvNc/NLr0.net]
- >>136
一応whileの直前当たりでかろっくで配列確保してます
- 143 名前:デフォルトの名無しさん mailto:sage [2022/01/30(日) 01:38:43.74 ID:05k5AmyC0.net]
- 44: (&janken->man)[i]
janken->man は配列ではない。 jankenは配列とみなせるポインタだが関係ない たぶんコンパイルを通すためにこの形になってるんだろうけど janken[i].man とするべき
- 144 名前:デフォルトの名無しさん [2022/01/30(日) 07:23:03.99 ID:qcbJpmhr0.net]
- ソケット関連の質問です。
この前ドメイン名取得してきたのですが、(練習のため) webブラウザにurlを打ち込んだ時に自分のパソコン内のサーバーソケットにつなげて htmlで”HelloWorld”と吐き出したいのですが、ドメイン名IPアドレスの紐づけ ってどの段階でやればいいのでしょうか? ソケットを作るときにするのかなと思っているのですがそもそもこの考え自体が間違っているでしょうか?
- 145 名前:デフォルトの名無しさん mailto:sage [2022/01/30(日) 08:48:53.30 ID:v3wXXGPY0.net]
- 名前-IPを関連させる(D)DNSの話であって、ほぼソケット関係無いような
- 146 名前:デフォルトの名無しさん mailto:sage [2022/01/30(日) 09:18:12.24 ID:uPZ//xKSM.net]
- >>141
> ドメイン名IPアドレスの紐づけ 紐づけと言うか解決はgetaddrinfo()でやる https://linuxjm.osdn.jp/html/LDP_man-pages/man3/getaddrinfo.3.html 文字通りの紐づけなら>>142が言うようにDNSの話だからシステム管理者なりに聞いてくれ てか、まずOS書いてくれ
- 147 名前:unko [2022/01/30(日) 09:28:39.21 ID:ft1MsLjp0.net]
- >>140
ありがとうございます 構造体のポインタを宣言してるのでその表現が正しそうですね 以前の課題だと構造体のメンバのポインタに配列を割り当てていたのでそれと同じように何も考えないでアロー演算子でアクセスしちゃってました
- 148 名前:デフォルトの名無しさん [2022/01/30(日) 10:55:49.17 ID:qcbJpmhr0.net]
- >>142>>143
ありがとうございます。 Windows11とVC2021でc++です。 DNSもっと調べてきます。
- 149 名前:デフォルトの名無しさん [2022/01/30(日) 11:46:45.94 ID:qcbJpmhr0.net]
- VSやった・・・
- 150 名前:デフォルトの名無しさん mailto:sage [2022/01/30(日) 12:38:44.79 ID:x0r2XrqVM.net]
- VSに2021はない…
- 151 名前:デフォルトの名無しさん [2022/01/30(日) 15:19:39.90 ID:wVIChEm/0.net]
- >>134
33行目と34行目は入れ替えないと構造体の配列のメモリ確保が一つ分少なくなる。
- 152 名前:デフォルトの名無しさん mailto:sage [2022/01/30(日) 15:27:39.02 ID:wVIChEm/0.net]
- >>141
ソケットで connect() する前には接続先アドレスが分かっている必要があるが、 そのアドレスを調べるのは connect() 前のどの時点でやっても良い。 というか後々ソケットのconnect()で利用するかどうかとは無関係に調べて良い。
- 153 名前:デフォルトの名無しさん mailto:sage [2022/01/30(日) 19:53:38.68 ID:F7MhehSXM.net]
- このスレの猛者が書く>>134の課題ってどんなコードになるんやろ?
- 154 名前:デフォルトの名無しさん mailto:sage [2022/01/30(日) 21:12:41.91 ID:olbUxhsiM.net]
- 初級クラスであっさり書ける
- 155 名前:デフォルトの名無しさん [2022/01/31(月) 16:42:11.29 ID:uGjzp6vA0.net]
- VisualStudioをつかっています。
_MSC_VER これって(マクロ?)VSのバージョンを表す定数を返すと言うことで間違いないでしょうか?
- 156 名前:デフォルトの名無しさん [2022/01/31(月) 16:56:08.70 ID:uGjzp6vA0.net]
- #if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once #endif これの意味がよくわからないのですが (_MSC_VER)というマクロが使えて かつ その値が1200以上であるなら #endifまでをコンパイルする。 # pragma onceはこのコードが乗っているファイルと同名のファイルが 既にインクルードされているならこのファイルをインクルードしないと言うことで 合っているでしょうか?
- 157 名前:デフォルトの名無しさん mailto:sage [2022/01/31(月) 17:32:45.71 ID:eqy2NGbAd.net]
- 合ってる
https://docs.microsoft.com/ja-jp/cpp/preprocessor/predefined-macros?view=msvc-170 VisualStudioの1200以降の環境ならごにょごにょするって時に使う アンダーバー+大文字で始まるマクロ(変数も)はコンパイラ側で定義するので 勝手に定義してはいけない
- 158 名前:デフォルトの名無しさん [2022/01/31(月) 17:46:24.93 ID:uGjzp6vA0.net]
- ありがとうございます。
メンタルやられて退職してしまったので、のんびりとブースト読んでいきます。
- 159 名前:デフォルトの名無しさん mailto:sage [2022/01/31(月) 18:19:27.99 ID:JSQ8RYi00.net]
- 自前でユニークな識別子考える必要のないインクルードガードがあるなら
そっち使ったほうが間違いないしね
- 160 名前:デフォルトの名無しさん [2022/01/31(月) 18:47:08.25 ID:uGjzp6vA0.net]
- ヘッダファイルの先をたどって行ってよくわからなくなったのですが
ヘッダファイルが全部コメントアウトされているのですが これはインクルードするときにコンパイラに無視されますよね? boost/config/user.hppをインクルードするときに最初にインクルードしますって コメントして書かれてあるんですけど、使うかもしれないから一応置いておいているのでしょうか? それとも//を外してコンパイルすることが出来るのでしょうか?
- 161 名前:デフォルトの名無しさん [2022/01/31(月) 19:08:10.67 ID:uGjzp6vA0.net]
- もしかしてその名前のファイルがインクルードされているかが重要で、
インクルードする中身は関係ない的な感じでしょうか?
- 162 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 15:26:31.67 ID:SDlFynth0.net]
- C言語において配列のリテラルはchar型(文字列)以外存在しないのでしょうか?
例えば以下のようにchar型ポインタを初期化すると、リテラル値"test"の先頭アドレスがstrに格納されると思います。 char *str = "test"; ですが、これを次のようにint型にするとエラーになってしまいます。 int arr = {10, 20, 30}; これは{10, 20, 30}が配列を表していないということでしょうか?
- 163 名前:デフォルトの名無しさん [2022/02/13(日) 15:48:05.55 ID:YeyzPZAO0.net]
- 初期化は普通の代入と違ってプログラムを書き易くするために特殊な表現になっていることがあると覚えておいた方が良い。
で、その int 型の初期化だが、{10, 20, 30} は int の配列変数に対する初期化ではないからエラーになる。 int arr[] = {10, 20, 30}; ならエラーにならない。
- 164 名前:デフォルトの名無しさん [2022/02/13(日) 15:49:17.27 ID:YeyzPZAO0.net]
- ごめん。間違えた。
> {10, 20, 30} は int の配列変数に対する初期化ではないから ↓ > {10, 20, 30} は int の配列変数に対する初期化だから
- 165 名前:はちみつ餃子 mailto:sage [2022/02/13(日) 16:21:43.07 ID:nD0XyBZB0.net]
- >>159
一応はコンパウンドリテラル (複合リテラルとも言う) というものがあってこう書けなくもない。 int *arr = (int []){1, 2, 3}; だけど文字列リテラルの生存期間が常に static なのに対してコンパウンドリテラルは それが現れる場面に応じて static な場合と automatic な場合があるのでちょっとわかり難いね。
- 166 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 17:48:50.08 ID:SDlFynth0.net]
- 配列型のリテラルは、char型のみ使用できる特殊な形と言うことですね。
ありがとうございました。 >>159の下の文のarrは*arrの間違いでした。失礼いたしました。
- 167 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 00:39:00.54 ID:Pf4iignB0.net]
- 文字列リテラルはアドレスを持つので左辺値ですよね?
いま読んでいる参考書に右辺値だと書いてあるのですが…
- 168 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 00:44:54.40 ID:Pf4iignB0.net]
- というか、右辺値と左辺値の違いってアドレスを持つか持たないかの違いだと思っていたのですが
違うのでしょうか?
- 169 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 00:55:29.91 ID:BGIr1fua0.net]
- え、右辺値と左辺値の違いってイコールの左辺になりえるかどうかじゃねーの?
- 170 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 01:39:48.34 ID:e2U3ATgO0.net]
- >>164
左辺値です。「アドレスを持つか」という分類でだいたい間違いないと思います。 >>166 「イコールの左辺になりえるかどうか」は語源の話としては正しいですが、現状の語義は違ったものになっています。 規格の "lvalue" に対する脚注でも「オブジェクトに対する "locator value" を表すものと考えたほうがよいだろう」とされています。
- 171 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 06:54:02.60 ID:uDi/Wll10.net]
- >>167
すみませぬ。 アドレスを持たないってどういうのを言うんですか。
- 172 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 08:47:32.72 ID:liZElF75d.net]
- 書き込み可能かどうかもあるだろ
- 173 名前:はちみつ餃子 mailto:sage [2022/02/20(日) 08:56:21.85 ID:eF5vmZw/0.net]
- >>164
配列は lvalue だが、ポインタに変換する規則が適用された後は lvalue ではない。
- 174 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 09:33:21.73 ID:e2U3ATgO0.net]
- >>168
たとえば数値リテラルや算術演算子の結果など。これらに対して "&" でアドレスを取ることはできない。
- 175 名前:はちみつ餃子 mailto:sage [2022/02/20(日) 09:45:32.09 ID:eF5vmZw/0.net]
- >>168
仕様上の理屈ではアドレスをもたないものが右辺値 (rvalue) なんじゃなくて右辺値がアドレスを持たないので逆なんだが……。 たとえば int a=1; a=2; というように変数に代入できるが、 1=2; という式がおかしいことは感覚的にわかるだろう。 a には 1 が入っているんだから a を評価すれば 1 になるはずなのに 1=2; と同じではない。 このとき a は a に入っている値のことであると同時に場所としての性質を持つ。 アドレスを持たないのが右辺値であるのとは対照的にアドレスを持つ (場所としての性質を持つ) のが左辺値だ。 左辺値は現れる文脈によって「値 (右辺値)」に変換される。 左辺値が値に変換される場合とされない場合が上手く使い分けられているから代入が成立するわけ。 一例をあげると以下のような式の途中経過として現れる一時的な値は右辺値であるので、 単項 & を適用できずにエラーになる。 #include <stdio.h> int main(void) { int a=1, b=2; printf("%p\n", &(a+b)); // a+b の結果は rvalue なので & を適用してアドレスを知ることは出来ない }
- 176 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 10:14:14.54 ID:bcGZeCSm0.net]
- >>168
int a; &a //OK.これがlvalue &1 //NG. これがrvalue const int b = 1; &b //OK.これもlvalue b = 1; //NG. lvalueには書き込み可能でないものもある
- 177 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 00:31:16.06 ID:Zv8l603i0.net]
- 164です、ありがとうございます
以下の内容で理解しました 場所としての性質を持つのが左辺値、持たないものが右辺値 左辺値は場所としての性質を持つためアドレスを持つ 参考書には文字列リテラルと配列はアドレスを持つ右辺値だと書いてあります 誤植かもしれませんね ちなみにですが関数も左辺値でしょうか?これもアドレスを持つ右辺値と書いてあります
- 178 名前:はちみつ餃子 mailto:sage [2022/02/21(月) 02:00:05.75 ID:B02tltHQ0.net]
- >>174
関数については関数指示子という概念があらたに登場するのでちょっとややこしくなる。 「関数そのもの」は C では値として扱うことができないので左辺値でも右辺値でもない。 式中に関数名を書くとそれは関数ポインタに型変換されて、その関数ポインタは右辺値。
- 179 名前:はちみつ餃子 mailto:sage [2022/02/21(月) 02:20:48.63 ID:B02tltHQ0.net]
- ついでの補足しておくと、
普通の関数呼出しも (言語仕様の理屈の上では) 関数ポインタに変換されてから解釈されている。 有名なネタとして (**********printf)("hello,world\n"); というように * をいくつ付けても問題なく通る。 関数指示子が関数ポインタに (暗黙に) 変換されるという規則のせいで結局は関数ポインタとして解釈されるので。
- 180 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 15:15:43.51 ID:031T4g5n0.net]
- C++だと関数も左辺値とされていて、そのことで互換性の問題が起こったりしていないので
性質の面で関数指示子は左辺値と大差無かったりする。
- 181 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 19:49:07.11 ID:gBEocJIsd.net]
- 宣言された関数(のポインタ)はconst左辺値の認識でいたけどC言語だと違うのか?
typedef double(*functype)(double); functype f; f=sin; // 可能 sin=f; //不可能
- 182 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 20:49:24.13 ID:wtPLXwv80.net]
- 関数は左辺値
ただしsizeofと代入を除きポインタに変換され そのポインタは右辺値
- 183 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 23:36:20.06 ID:Zv8l603i0.net]
- 関数についてまとめると、
関数そのものは右辺値でも左辺値でもない、式中の関数名は関数ポインタに変換されて右辺値になる (C++では関数は左辺値である) 初心者なので誤植があるとパニックになりますね… どうもありがとうございました
- 184 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 12:55:52.35 ID:4nLtmRUA0.net]
- C言語の範囲内なら用語に惑わされず振る舞いだけを考えれば
そこまで混乱することはないんじゃなかろうか (>>176 の例のような変態的なのはおいといて) C++ の ムーブセマンティクスがなかなか なかなか
- 185 名前:デフォルトの名無しさん [2022/02/22(火) 13:23:00.75 ID:9avL3EWo0.net]
- https://www.toyokawa.jp/
初心者すぎる質問なんだが、C言語系のループは目的に応じて1始まりにする 必要があるとブログ記事で読んだんだが、実際はどちらが良いの? このブログにように九九を計算して配列に入れる場合に九九だから1始まりで計算して、配列へのアクセスは−1する。 今までやっていたようにゼロからループして、計算するときに+1して、配列にはそのままアクセス。 現場だと何も考えずにゼロからループし、目的に応じてオフセットさせていたけど特にコードレビューで突っ込まれた経験も無いので。
- 186 名前:デフォルトの名無しさん [2022/02/22(火) 13:27:08.07 ID:XXijF8a20.net]
- プログラミング初心者なんやが、まずC言語の何からすればいいんや。
初歩的な質問ですまない。
- 187 名前:デフォルトの名無しさん [2022/02/22(火) 13:27:08.07 ID:XXijF8a20.net]
- プログラミング初心者なんやが、まずC言語の何からすればいいんや。
初歩的な質問ですまない。
- 188 名前:デフォルトの名無しさん [2022/02/22(火) 13:27:23.55 ID:9avL3EWo0.net]
- >>182
あと、比較するときも無意味だから<=や>=は使わずに<、>を使えば良いって指示は受けたことがある。 for(i=10;i<=20; じゃなく for(i=10;i<21; とすれば文字が少なくなり間違えが減ると言ってた。 ただ、ブログをみると、21と言う数字は唐突なので10から20までループさせるのなら <=20を使うべきと書かれている。 どちらが正しいのか?
- 189 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 13:33:05.20 ID:1CIJj7s5d.net]
- それC言語の仕様じゃなくて現場の慣例に従うべきだろ
- 190 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 13:44:24.82 ID:4nLtmRUA0.net]
- 変数を定数と比較するなら変数を右辺にもってこいとかの
文法外のコーディングルールは郷に従え としか
- 191 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 14:17:27.30 ID:KAmBmnWqd.net]
- >>184
とりあえずHello world これがなにか分からない場合は カーニハン&リッチー著のプログラミング言語C という本を何とかして手に入れろ 文庫本サイズの小さな本だが Cの発明者が書いている本で 基本はこれでOK
- 192 名前:デフォルトの名無しさん [2022/02/22(火) 15:24:23.33 ID:9avL3EWo0.net]
- >>186
まあ、そうする
- 193 名前:デフォルトの名無しさん [2022/02/22(火) 15:29:17.78 ID:9avL3EWo0.net]
- C言語の構造体ってメモリーの割当って全てで保証されているのだろうか?
ビッグエンディアン、リトリエンディアンで異なるのは分かるのだが 全てリトル、Windowsで動くとして同じなのだろうか? 昔、アプリケーションの保存データを一つの構造体に収納し、それをそのままバイナリーとして ディスクに出力していたのだが当時から気持ち悪く思っていた。 公式ドキュメントで保証でもされていれば良いのだが。
- 194 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 16:43:25.69 ID:4nLtmRUA0.net]
- 実行ファイルがそのままで、実行環境のOSのを行き来するならまず変わらんだろう
ソースをコンパイルしなおした結果として同じ配置になるかどうかは使ってるコンパイラ次第 ソースを別のコンパイラでコンパイルした時も同じ配置になるかどうかは使ってるコンパイラ次第 どんな場合においてもなんとかポータビリティを維持しようとするとテキスト化する羽目になる
- 195 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 17:47:31.50 ID:HCzuhowO0.net]
- まあ
{ char ch0; int int0; } みたいになるときは { char ch0; char dummy[3]; int int0; } って入れてるよ俺は
- 196 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 17:53:48.17 ID:FDkOG5bL0.net]
- [3]というマジックナンバーがイヤ
詰め物の不定がイヤならmemsetでゼロクリアすれば済むこと
- 197 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 17:57:32.88 ID:FDkOG5bL0.net]
- エンディアンを合わせて読み書きなんて朝飯前だし
構造体を渡された関数は中でfread/fwriteを1回じゃなきゃいけないなんて縛りはナンセンス 構造体の中に構造体があるときは、その構造体の読み書きも関数化しておけば何も問題はない
- 198 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 18:33:22.53 ID:XFNPZHqh0.net]
- パディングの距離、何バイトでアライメントされるかを制御したいとなると
コンパイラ依存の #pragma に頼るわ
- 199 名前:デフォルトの名無しさん [2022/02/22(火) 18:40:08.78 ID:9avL3EWo0.net]
- >>191
10人規模のプロジェクトだったが、構造体のデータをそのままファイル出力してた。 特にパフォーマンスを求められる部分でも無かったので、自分でマッピングして出力したかったのだが、現状できているからと言うことで却下。 ただ、気持ち悪さは残る。案の定といってもよいが、Sun Sparkが混在したときは当然問題が出たらしい。 関係ないが、そのソフトハウスって、OracleにInsertした順序でselect出来るって信じているところもあった。 実際、そうなるが気持ち悪い。
- 200 名前:デフォルトの名無しさん [2022/02/22(火) 18:52:09.49 ID:9avL3EWo0.net]
- C言語で冗長化と称して同じ内容を複数の変数に書き込みバックアップをするってプロジェクトが有ったが、意味有ったのだろうか?
今でも、変数ってプログラマが意図して変更しない限り値が変わることは無いし、仮に変わったとしたらもうプログラマレベルでは対処できない問題だと思う。 あと、そんな可能性があったらループ変数だってループ中に意図せずに変わると思うが。 (ハイレベルな一般的なアプリで、OS保護下で動くもの、DMAとか他ハードウェアとメモリを共有するような低レベルな話ではない)
- 201 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 19:02:11.86 ID:pG+m+rIk0.net]
- 昔、組込みやってた時は全部ではないけど特に動作中に変化すると致命的な箇所は同内容を複数の変数に保存していたことはある
製品評価でノイズ試験やサージ試験おこなっていると意外にマイコン内のメモリのデータはよく化ける
- 202 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 19:03:01.04 ID:6JePgkF30.net]
- 疑うことを知らずに一生を終える人は幸せである
- 203 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 19:21:24.62 ID:IWqq52SNa.net]
- >>197,198
素朴な疑問なんたが、それ不一致起こしてた場合どっちが正しいと判断してたんだ?
- 204 名前:はちみつ餃子 mailto:sage [2022/02/22(火) 19:32:40.86 ID:xH13yj0x0.net]
- >>190
言語仕様としての保証はあんまりないよ。 ABI (Application Binary Interface) と呼ばれる規格を作って同じアーキテクチャでは同じレイアウトにする通例はあるし、 既存のライブラリと組み合わせられないと不都合だからだいたいのコンパイラはそれに従ってる。 x86 (64ビットも含む) については歴史的事情で Windows はマイクロソフトが決めた ABI があって、 Windows 意外 (Linux とか BSD とか) はおおよそ System V ABI を採用してる。 で、自分が作るプログラムがターゲットにする範囲 (開発環境・実行環境) で ABI が共通ならそれでいいし、 違うなら適当に切り分けて対処するとかでも問題ない。 まあ結果的に問題なかったとしても検証せずにやってたんだとしたら良くはないけどな。
- 205 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 19:47:53.56 ID:pG+m+rIk0.net]
- >>200
不一致が起きた場合はとにかく最優先でシステムを安全に停止させる 制御不能で暴走させることだけは何としても回避する その後はソフトリセット処理を実行して再起動させていた
- 206 名前:はちみつ餃子 mailto:sage [2022/02/22(火) 19:51:42.70 ID:xH13yj0x0.net]
- PC でもデータが化けることは思ったよりも頻繁に起きているらしい。
データ破損を検出して補正する ECC と呼ばれる機構を持ったメモリもあるんだが、 コンピュータの値下げの圧力と信頼性の高い現代のメモリでは ECC は必要ないという論から ECC を付けてない機種が増えてきてる。 でもリーナスは ECC は要るにきまってんだろという感じの発言をしてる。 https://linux.srad.jp/story/21/01/05/0240202/ 実際問題として化けるんだよ、化けたことを検出したり補正したりする機構がいたるところに入ってるから アプリケーションからは気にせずに済んでるだけで……。
- 207 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 20:27:20.57 ID:x7wwxQmEK.net]
- >>192
よく見かける手法だな。ただ、後からメンバー追加したのか以下のようなアホな事になっている件もたまにあるw { char ch0; char ch1; char dummy[3]; int int0; }
- 208 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 20:27:50.66 ID:affn0mKeM.net]
- 「メルキオール (MELCHIOR)」「バルタザール (BALTHASAR)」
「カスパー (CASPER)」 という3つの独立したシステムによる 合議制をとっていた。
- 209 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 20:56:32.44 ID:IWqq52SNa.net]
- >>202
チェッサムやパリティビット的な用途なんか なぜチェックサムを使わないのか……って聞くのは野暮? >>192>>204 パックや共用体にしとこうぜ
- 210 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 21:00:04.31 ID:mN73zrRIM.net]
- >>204
コンパイラによるけど警告レベル上げれば検出できるぞ
- 211 名前:デフォルトの名無しさん [2022/02/22(火) 21:02:51.52 ID:9avL3EWo0.net]
- >>200
3箇所の変数で多数決だった。3つ違う場合はアプリ終了。 ちなみにOSのメモリ保護された普通なプログラムです。 組み込みマイコンでも、DMAアクセスされるメモリーでも有りません。
- 212 名前:デフォルトの名無しさん [2022/02/22(火) 21:10:15.11 ID:9avL3EWo0.net]
- >>203
>>アプリケーションからは気にせずに済んでるだけで…… なのでOSで保護された上で動くアプリケーションはデータの冗長化は必要ないのでは? というか、データを冗長化するという方針で作られたシステムもいわゆる神経質という 設計思想があり。 データ認定?された物は3重化されて変数に保管されるが ループのi,j,kや一時的にデータを取得するaと言った変数は多重化されていなかった。 仮に変数の冗長化が重要だと言うことになった場合。なぜデータ認定されたものだけ冗長化され ループ変数は冗長化せずに単体で使うのかって部分に気持ち悪さを感じる。 どの変数も「平等に」食らう可能性はあると思うから。
- 213 名前:デフォルトの名無しさん [2022/02/22(火) 21:17:01.78 ID:9avL3EWo0.net]
- >>201
「変数をバイナリーでファイルに出力する」と聞いてリーダーに求めたのは メモリーマップ。当然、準備しているものだと思っていた。 ただ、メモリーマップなど知らないし意味も分からない、サンプルを見てくれ? という指示だった。 バイナリーでのデータ交換をするのにメモリーマップを定めないことに関しては今でも気持ち悪さを感じている。
- 214 名前:はちみつ餃子 mailto:sage [2022/02/22(火) 21:27:02.48 ID:xH13yj0x0.net]
- >>209
> OSで保護された上で動くアプリケーションは OS では解決できない。 だからリーナスはインテルにマジムカという話。 変数を何か所にも増やすのが意味ないというのは、それはそう。 どうやったってどうにもならんので考えるだけ無駄。 職人技でどうにかできるような規模の小さな組み込み分野ならともかく、 複雑高度なコンピュータで低レイヤが信頼できないなら信頼できない箇所にコストをかけて改善すべき。
- 215 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 21:56:15.32 ID:ntDF8W1ma.net]
- >>208
それなら気持ちは分かる 意味は解せぬが
- 216 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 21:59:25.84 ID:fFHtSmjBd.net]
- >>209
ハードウェアエラーが原因ならプログラムの実行バイナリも平等に化ける可能性あるよね
- 217 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 22:00:17.02 ID:FDkOG5bL0.net]
- >>204
そんなんテスト通るんか? テストもせずに放置?
- 218 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 22:07:46.87 ID:6JePgkF30.net]
- アポロ計画だったか、3台のコンピュータに計算させて多数決で決めてたな
- 219 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 22:18:57.41 ID:6JePgkF30.net]
- それとCのようにロジックが追え、時間さえあれば
人でも答えが出せる場合ではなく、 AIシステムのようにブラックボックス化していると、 複数台による合議制もあるかも知れない
- 220 名前:はちみつ餃子 mailto:sage [2022/02/22(火) 22:31:59.79 ID:xH13yj0x0.net]
- 深層学習ってニューラルネットワークを多層構造にしたモデルなんだよね。
AI の仕組みの中に (重みづけされた) 多数決が既に組み込まれていると言えなくもない。
- 221 名前:デフォルトの名無しさん [2022/02/22(火) 23:00:22.43 ID:9avL3EWo0.net]
- >>215
それなら分かる。計算結果を多数決専用のワイヤロジックで決め また、3台の入力に戻して計算していれば。
- 222 名前:デフォルトの名無しさん [2022/02/22(火) 23:05:44.26 ID:9avL3EWo0.net]
- >>213
そう思う。本当に冗長化するなら、ストアされているプログラムも カウンタ変数も信頼性は平等だと思う。 レジスタに収納されてればより信頼性が上がると言われそうだが、 ループ変数だってメモリに退避されていることが多いから信頼性は同じだと思う。
- 223 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 23:14:07.01 ID:AiPUeoxY0.net]
- >>211
> OS では解決できない。 だからリーナスはインテルにマジムカという話。 Xeon 使えばいいだけだろ サーバーによってはECCだけじゃなくてミラーリングも使えたりするし https://jp.fujitsu.com/platform/server/primergy/technical/pcserver-description/memory.html
- 224 名前:はちみつ餃子 mailto:sage [2022/02/22(火) 23:21:36.39 ID:xH13yj0x0.net]
- >>220
この場合は出来るハードウェアもあるってのは反論にならないんだよ。 出来ないハードウェアが世の中に溢れてるってのが問題なんだから。
- 225 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 23:34:31.66 ID:AiPUeoxY0.net]
- >>221
溢れてて何が問題なんだ? リーナスは金持ってるかもしれんが世の中ECCマシンを買える奴ばかりじゃないんだし
- 226 名前:はちみつ餃子 mailto:sage [2022/02/23(水) 00:08:53.35 ID:o4j3GXmb0.net]
- >>222
安ければデメリットもあるのもしょうがないといえばしょうがない話ではあるけどね。 デメリットはない (あるいは十分に小さい) と言い張ってインテルは ECC なし製品を推し進めたけど、 実際にはそうじゃないことがわかったとなれば文句を言いたくもなるだろう。
- 227 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 07:03:47.68 ID:6oKgGQho0.net]
- >>223
> 実際にはそうじゃないことがわかったとなれば文句を言いたくもなるだろう。 そうじゃないと言ってるけど実際どれくらいあるんだ? 仕事で上に書いたようなサーバーでシステム構築してたけどメモリーエラーなんて見たことないし
- 228 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 08:03:17.13 ID:FxZT1eeTd.net]
-
- 229 名前:el="noopener noreferrer" target="_blank" class="reply_link">>>210
WindowsでのBITMAPFILEHEADERとか主要なファイルヘッダの構造は全部構造体で定義されてるから気にしたことないなあ ダミーパディング込みで 気になるなら定義部分を見てみるといい 余計なパディング入れないプラグマとかも使われているはず []- [ここ壊れてます]
- 230 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 08:27:04.99 ID:JOM9/OKLa.net]
- https://www.itmedia.co.jp/news/articles/0602/13/news037.html
MS「ECCメモリを標準搭載にしろ」 インテル「やだ」
- 231 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 08:44:18.35 ID:FxZT1eeTd.net]
- >>226
> それは、Microsoftは今調べているドライバの問題から、Windows XPのシステム・アプリケーションのクラッシュの主な原因がメモリの欠陥にあることを知ったからだ。 えっ?w
- 232 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 09:11:50.93 ID:pngadACwM.net]
- リーナスもMSもECCメモリーがーって騒ぐ前にやることがあるだろw
- 233 名前:デフォルトの名無しさん [2022/02/23(水) 09:34:02.54 ID:vebGIGPQ0.net]
- >>224
20年間プログラマをやってたが、勝手に値が変わっていたことは一度もない。 (全てOSで保護されたアプリケーションレベルの経験)
- 234 名前:デフォルトの名無しさん [2022/02/23(水) 09:37:11.21 ID:vebGIGPQ0.net]
- >>225
https://docs.microsoft.com/ja-jp/windows/win32/api/wingdi/ns-wingdi-bitmapfileheader これでファイルの読み書きしても良いんだ。 MS公式文書で書かれているということで、今まで引っかかっているところが解消した感じ。
- 235 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 09:42:44.82 ID:hrDKDc9G0.net]
- 昔宇宙線だかなんだかがメモリデータを破壊するとかそんな記事を読んだ気がそこはかとなく(ry
- 236 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 10:39:13.43 ID:6oKgGQho0.net]
- >>229
万が一書き換わってても気付かない事の方が多いだろ
|

|