128:デフォルトの名無しさん
22/01/28 12:25:59.28 6cofCgvGM.net
>>124
そんなフラグ初めて見たけど、仕様見たら確かに0以外の時に0xを付加するんだな
いまいち使いづらい
129:デフォルトの名無しさん
22/01/28 12:32:45.35 obJ/SPWt0.net
文字列のエスケープシーケンスでバイナリ直接したんだけど、例えば"\x10"の後に"a"という文字を続けようとして"\x10a"って書くと値が大きすぎるってエラーになる。
"\x10" "a"と分割するしかない?
130:デフォルトの名無しさん
22/01/28 12:35:51.06 grc2q108d.net
Cはプログラマを信頼する言語だ
悪いことをさせない制限より
自由度を優先させている
怠けるやつより進歩する者を優先するのもしかり
131:デフォルトの名無しさん
22/01/28 13:19:26.12 vyOOr9LZM.net
>>127
> "\x10" "a"と分割するしかない?
それしかなさげ
8進表現は最大3文字となってるから "\0123" は '\012' と '3' になるけど16進表現には桁数の制限がないので "\x10a" を1文字に解釈しようとしてエラーになる
char * の文字列は2文字、wchar_t の文字列は4文字までにすればいいと思うんだけど
132:デフォルトの名無しさん
22/01/28 13:57:54.02 obJ/SPWt0.net
>>129
ありがとう。やっぱりそうなのね。
ESCシーケンスが書きにくくてしょうがないわ。
133:はちみつ餃子
22/01/28 16:18:28.78 hT9TavA00.net
>>127,129
マイクロソフトのドキュメントにも言及があるのを見つけた。
URLリンク(docs.microsoft.com)
不格好だけど C はそういうもんだからしょうがないね。
134:デフォルトの名無しさん
22/01/28 16:49:19.01 obJ/SPWt0.net
>>131
わざわざ調べて頂いてありがとうございます。
#define ESC_UP "0x1b" "A"
のようにマクロで逃げることにしました。
使う側では
printf("今からUP" ESC_UP "UP完了");
と少し気持ち悪いですが。
135:デフォルトの名無しさん
22/01/28 17:55:44.80 sJpZ8snBM.net
ESC しか使わないなら
printf("今からUP\033AUP完了");
とかでもいいかも
今更8進数かよって感じもするけど…
もしく
136:は #define ESC(c) "\x1b" #c printf("今からUP" ESC(A) "UP完了"); くらいかなぁ
137:unko
22/01/29 18:53:20.85 cvNc/NLr0.net
ごめんなさい高校のc言語の課題で乱数とじゃんけん対決をして結果と手を動的配列に格納して最後にまとめて結果を表示するというやるをやってるんですが
whileループで代入した結果とその後のforループでカウントしながら表示している値が違うみたいでずっとプログラム見てても何が原因なのか分からないのでわかる方いたら教えて欲しいです.
URLリンク(github.com)
138:デフォルトの名無しさん
22/01/29 19:18:32.81 mAwlWFlr0.net
>>134
scanfで表示出力は出来ません。分けましょう。
printf("times: "); scanf("%d",&j);
しかし、それでもまだ問題がある。
139:デフォルトの名無しさん
22/01/29 19:22:51.55 wjo4lb340.net
44: どっから配列が出てきた
デバッガ使えばプログラムの動き見るの捗るから使え
使えないなら怪しそうなとこにひたすらprintfを埋めろ
140:デフォルトの名無しさん
22/01/29 20:13:03.39 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
22/01/29 20:51:58.61 cvNc/NLr0.net
>>137
ありがとうございます
break;忘れてたので実行結果変でしたね
ポインタとかは最近やり始めてまだよく分かってないのでちゃんと勉強しておきます
142:unko
22/01/29 20:54:58.88 cvNc/NLr0.net
>>136
一応whileの直前当たりでかろっくで配列確保してます
143:デフォルトの名無しさん
22/01/30 01:38:43.74 05k5AmyC0.net
44: (&janken->man)[i]
janken->man は配列ではない。
jankenは配列とみなせるポインタだが関係ない
たぶんコンパイルを通すためにこの形になってるんだろうけど
janken[i].man とするべき
144:デフォルトの名無しさん
22/01/30 07:23:03.99 qcbJpmhr0.net
ソケット関連の質問です。
この前ドメイン名取得してきたのですが、(練習のため)
webブラウザにurlを打ち込んだ時に自分のパソコン内のサーバーソケットにつなげて
htmlで”HelloWorld”と吐き出したいのですが、ドメイン名IPアドレスの紐づけ
ってどの段階でやればいいのでしょうか?
ソケットを作るときにするのかなと思っているのですがそもそもこの考え自体が間違っているでしょうか?
145:デフォルトの名無しさん
22/01/30 08:48:53.30 v3wXXGPY0.net
名前-IPを関連させる(D)DNSの話であって、ほぼソケット関係無いような
146:デフォルトの名無しさん
22/01/30 09:18:12.24 uPZ//xKSM.net
>>141
> ドメイン名IPアドレスの紐づけ
紐づけと言うか解決はgetaddrinfo()でやる
URLリンク(linuxjm.osdn.jp)
文字通りの紐づけなら>>142が言うようにDNSの話だからシステム管理者なりに聞いてくれ
てか、まずOS書いてくれ
147:unko
22/01/30 09:28:39.21 ft1MsLjp0.net
>>140
ありがとうございます
構造体のポインタを宣言してるのでその表現が正しそうですね
以前の課題だと構造体のメンバのポインタに配列を割り当てていたのでそれと同じように何も考えないでアロー演算子でアクセスしちゃってました
148:デフォルトの名無しさん
22/01/30 10:55:49.17 qcbJpmhr0.net
>>143
ありがとうございます。
Windows11とVC2021でc++です。
DNSもっと調べてきます。
149:デフォルトの名無しさん
22/01/30 11:46:45.94 qcbJpmhr0.net
VSやった・・・
150:デフォルトの名無しさん
22/01/30 12:38:44.79 x0r2XrqVM.net
VSに2021はない…
151:デフォルトの名無しさん
22/01/30 15:19:39.90 wVIChEm/0.net
>>134
33行目と34行目は入れ替えないと構造体の配列のメモリ確保が一つ分少なくなる。
152:デフォルトの名無しさん
22/01/30 15:27:39.02 wVIChEm/0.net
>>141
ソケットで connect() する前には接続先アドレスが分かっている必要があるが、
そのアドレスを調べるのは connect() 前のどの時点でやっても良い。
というか後々ソケットのconnect()で利用するかどうかとは無関係に調べて良い。
153:デフォルトの名無しさん
22/01/30 19:53:38.68 F7MhehSXM.net
このスレの猛者が書く>>134の課題ってどんなコードになるんやろ?
154:デフォルトの名無しさん
22/01/30 21:12:41.91 olbUxhsiM.net
初級クラスであっさり書ける
155:デフォルトの名無しさん
22/01/31 16:42:11.29 uGjzp6vA0.net
VisualStudioをつかっています。
_MSC_VER
これって(マクロ?)VSのバージョンを表す定数を返すと言うことで間違いないでしょうか?
156:デフォルトの名無しさん
22/01/31 16:56:08.70 uGjzp6vA0.net
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif
これの意味がよくわからないのですが
(_MSC_VER)というマクロが使えて
かつ
その値が1200以上であるなら
#endifまでをコンパイルする。
# pragma onceはこのコードが乗っているファイルと同名のファイルが
既にインクルードされているならこのファイルをインクルードしないと言うことで
合っているでしょうか?
157:デフォルトの名無しさん
22/01/31 17:32:45.71 eqy2NGbAd.net
合ってる
URLリンク(docs.microsoft.com)
VisualStudioの1200以降の環境ならごにょごにょするって時に使う
アンダーバー+大文字で始まるマクロ(変数も)はコンパイラ側で定義するので
勝手に定義してはいけない
158:デフォルトの名無しさん
22/01/31 17:46:24.93 uGjzp6vA0.net
ありがとうございます。
メンタルやられて退職してしまったので、のんびりとブースト読んでいきます。
159:デフォルトの名無しさん
22/01/31 18:19:27.99 JSQ8RYi00.net
自前でユニークな識別子考える必要のないインクルードガードがあるなら
そっち使ったほうが間違いないしね
160:デフォルトの名無しさん
22/01/31 18:47:08.25 uGjzp6vA0.net
ヘッダファイルの先をたどって行ってよくわからなくなったのですが
ヘッダファイルが全部コメントアウトされているのですが
これはインクルードするときにコンパイラに無視されますよね?
boost/config/user.hppをインクルードするときに最初にインクルードしますって
コメントして書かれてあるんですけど、使うかもしれないから一応置いておいているのでしょうか?
それとも//を外してコンパイルすることが出来るのでしょうか?
161:デフォルトの名無しさん
22/01/31 19:08:10.67 uGjzp6vA0.net
もしかしてその名前のファイルがインクルードされているかが重要で、
インクルードする中身は関係ない的な感じでしょうか?
162:デフォルトの名無しさん
22/02/13 15:26:31.67 SDlFynth0.net
C言語において配列のリテラルはchar型(文字列)以外存在しないのでしょうか?
例えば以下のようにchar型ポインタを初期化すると、リテラル値"test"の先頭アドレスがstrに格納されると思います。
char *str = "test";
ですが、これを次のようにint型にするとエラーになってしまいます。
int arr = {10, 20, 30};
これは{10, 20, 30}が配列を表していないということでしょうか?
163:デフォルトの名無しさん
22/02/13 15:48:05.55 YeyzPZAO0.net
初期化は普通の代入と違ってプログラムを書き易くするために特殊な表現になっていることがあると覚えておいた方が良い。
で、その int 型の初期化だが、{10, 20, 30} は int の配列変数に対する初期化ではないからエラーになる。
int arr[] = {10, 20, 30}; ならエラーにならない。
164:デフォルトの名無しさん
22/02/13 15:49:17.27 YeyzPZAO0.net
ごめん。間違えた。
> {10, 20, 30} は int の配列変数に対する初期化ではないから
↓
> {10, 20, 30} は int の配列変数に対する初期化だから
165:はちみつ餃子
22/02/13 16:21:43.07 nD0XyBZB0.net
>>159
一応はコンパウンドリテラル (複合リテラルとも言う) というものがあってこう書けなくもない。
int *arr = (int []){1, 2, 3};
だけど文字列リテラルの生存期間が常に static なのに対してコンパウンドリテラルは
それが現れる場面に応じて static な場合と automatic な場合があるのでちょっとわかり難いね。
166:デフォルトの名無しさん
22/02/13 17:48:50.08 SDlFynth0.net
配列型のリテラルは、char型のみ使用できる特殊な形と言うことですね。
ありがとうございました。
>>159の下の文のarrは*arrの間違いでした。失礼いたしました。
167:デフォルトの名無しさん
22/02/20 00:39:00.54 Pf4iignB0.net
文字列リテラルはアドレスを持つので左辺値ですよね?
いま読んでいる参考書に右辺値だと書いてあるのですが…
168:デフォルトの名無しさん
22/02/20 00:44:54.40 Pf4iignB0.net
というか、右辺値と左辺値の違いってアドレスを持つか持たないかの違いだと思っていたのですが
違うのでしょうか?
169:デフォルトの名無しさん
22/02/20 00:55:29.91 BGIr1fua0.net
え、右辺値と左辺値の違いってイコールの左辺になりえるかどうかじゃねーの?
170:デフォルトの名無しさん
22/02/20 01:39:48.34 e2U3ATgO0.net
>>164
左辺値です。「アドレスを持つか」という分類でだいたい間違いないと思います。
>>166
「イコールの左辺になりえるかどうか」は語源の話としては正しいですが、現状の語義は違ったものになっています。
規格の "lvalue" に対する脚注でも「オブジェクトに対する "locator value" を表すものと考えたほうがよいだろう」とされています。
171:デフォルトの名無しさん
22/02/20 06:54:02.60 uDi/Wll10.net
>>167
すみませぬ。
アドレスを持たないってどういうのを言うんですか。
172:デフォルトの名無しさん
22/02/20 08:47:32.72 liZElF75d.net
書き込み可能かどうかもあるだろ
173:はちみつ餃子
22/02/20 08:56:21.85 eF5vmZw/0.net
>>164
配列は lvalue だが、ポインタに変換する規則が適用された後は lvalue ではない。
174:デフォルトの名無しさん
22/02/20 09:33:21.73 e2U3ATgO0.net
>>168
たとえば数値リテラルや算術演算子の結果など。これらに対して "&" でアドレスを取ることはできない。
175:はちみつ餃子
22/02/20 09:45:32.09 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:デフォルトの名無しさん
22/02/20 10:14:14.54 bcGZeCSm0.net
>>168
int a;
&a //OK.これがlvalue
&1 //NG. これがrvalue
const int b = 1;
&b //OK.これもlvalue
b = 1; //NG. lvalueには書き込み可能でないものもある
177:デフォルトの名無しさん
22/02/21 00:31:16.06 Zv8l603i0.net
164です、ありがとうございます
以下の内容で理解しました
場所としての性質を持つのが左辺値、持たないものが右辺値
左辺値は場所としての性質を持つためアドレスを持つ
参考書には文字列リテラルと配列はアドレスを持つ右辺値だと書いてあります
誤植かもしれませんね
ちなみにですが関数も左辺値でしょうか?これもアドレスを持つ右辺値と書いてあります
178:はちみつ餃子
22/02/21 02:00:05.75 B02tltHQ0.net
>>174
関数については関数指示子という概念があらたに登場するのでちょっとややこしくなる。
「関数そのもの」は C では値として扱うことができないので左辺値でも右辺値でもない。
式中に関数名を書くとそれは関数ポインタに型変換されて、その関数ポインタは右辺値。
179:はちみつ餃子
22/02/21 02:20:48.63 B02tltHQ0.net
ついでの補足しておくと、
普通の関数呼出しも (言語仕様の理屈の上では) 関数ポインタに変換されてから解釈されている。
有名なネタとして
(**********printf)("hello,world\n");
というように * をいくつ付けても問題なく通る。
関数指示子が関数ポインタに (暗黙に) 変換されるという規則のせいで結局は関数ポインタとして解釈されるので。
180:デフォルトの名無しさん
22/02/21 15:15:43.51 031T4g5n0.net
C++だと関数も左辺値とされていて、そのことで互換性の問題が起こったりしていないので
性質の面で関数指示子は左辺値と大差無かったりする。
181:デフォルトの名無しさん
22/02/21 19:49:07.11 gBEocJIsd.net
宣言された関数(のポインタ)はconst左辺値の認識でいたけどC言語だと違うのか?
typedef double(*functype)(double);
functype f;
f=sin; // 可能
sin=f; //不可能
182:デフォルトの名無しさん
22/02/21 20:49:24.13 wtPLXwv80.net
関数は左辺値
ただしsizeofと代入を除きポインタに変換され
そのポインタは右辺値
183:デフォルトの名無しさん
22/02/21 23:36:20.06 Zv8l603i0.net
関数についてまとめると、
関数そのものは右辺値でも左辺値でもない、式中の関数名は関数ポインタに変換されて右辺値になる
(C++では関数は左辺値である)
初心者なので誤植があるとパニックになりますね…
どうもありがとうございました
184:デフォルトの名無しさん
22/02/22 12:55:52.35 4nLtmRUA0.net
C言語の範囲内なら用語に惑わされず振る舞いだけを考えれば
そこまで混乱することはないんじゃなかろうか (>>176 の例のような変態的なのはおいといて)
C++ の ムーブセマンティクスがなかなか なかなか
185:デフォルトの名無しさん
22/02/22 13:23:00.75 9avL3EWo0.net
URLリンク(www.toyokawa.jp)
初心者すぎる質問なんだが、C言語系のループは目的に応じて1始まりにする
必要があるとブログ記事で読んだんだが、実際はどちらが良いの?
このブログにように九九を計算して配列に入れる場合に九九だから1始まりで計算して、配列へのアクセスは-1する。
今までやっていたようにゼロからループして、計算するときに+1して、配列にはそのままアクセス。
現場だと何も考えずにゼロからループし、目的に応じてオフセットさせていたけど特にコードレビューで突っ込まれた経験も無いので。
186:デフォルトの名無しさん
22/02/22 13:27:08.07 XXijF8a20.net
プログラミング初心者なんやが、まずC言語の何からすればいいんや。
初歩的な質問ですまない。
187:デフォルトの名無しさん
22/02/22 13:27:08.07 XXijF8a20.net
プログラミング初心者なんやが、まずC言語の何からすればいいんや。
初歩的な質問ですまない。
188:デフォルトの名無しさん
22/02/22 13:27:23.55 9avL3EWo0.net
>>182
あと、比較するときも無意味だから<=や>=は使わずに<、>を使えば良いって指示は受けたことがある。
for(i=10;i<=20; じゃなく
for(i=10;i<21; とすれば文字が少なくなり間違えが減ると言ってた。
ただ、ブログをみると、21と言う数字は唐突なので10から20までループさせるのなら <=20を使うべきと書かれている。
どちらが正しいのか?
189:デフォルトの名無しさん
22/02/22 13:33:05.20 1CIJj7s5d.net
それC言語の仕様じゃなくて現場の慣例に従うべきだろ
190:デフォルトの名無しさん
22/02/22 13:44:24.82 4nLtmRUA0.net
変数を定数と比較するなら変数を右辺にもってこいとかの
文法外のコーディングルールは郷に従え としか
191:デフォルトの名無しさん
22/02/22 14:17:27.30 KAmBmnWqd.net
>>184
とりあえずHello world
これがなにか分からない場合は
カーニハン&リッチー著のプログラミング言語C
という本を何とかして手に入れろ
文庫本サイズの小さな本だが
Cの発明者が書いている本で
基本はこれでOK
192:デフォルトの名無しさん
22/02/22 15:24:23.33 9avL3EWo0.net
>>186
まあ、そうする
193:デフォルトの名無しさん
22/02/22 15:29:17.78 9avL3EWo0.net
C言語の構造体ってメモリーの割当って全てで保証されているのだろうか?
ビッグエンディアン、リトリエンディアンで異なるのは分かるのだが
全てリトル、Windowsで動くとして同じなのだろうか?
昔、アプリケーションの保存データを一つの構造体に収納し、それをそのままバイナリーとして
ディスクに出力していたのだが当時から気持ち悪く思っていた。
公式ドキュメントで保証でもされていれば良いのだが。
194:デフォルトの名無しさん
22/02/22 16:43:25.69 4nLtmRUA0.net
実行ファイルがそのままで、実行環境のOSのを行き来するならまず変わらんだろう
ソースをコンパイルしなおした結果として同じ配置になるかどうかは使ってるコンパイラ次第
ソースを別のコンパイラでコンパイルした時も同じ配置になるかどうかは使ってるコンパイラ次第
どんな場合においてもなんとかポータビリティを維持しようとするとテキスト化する羽目になる
195:デフォルトの名無しさん
22/02/22 17:47:31.50 HCzuhowO0.net
まあ
{
char ch0;
int int0;
}
みたいになるときは
{
char ch0;
char dummy[3];
int int0;
}
って入れてるよ俺は
196:デフォルトの名無しさん
22/02/22 17:53:48.17 FDkOG5bL0.net
[3]というマジックナンバーがイヤ
詰め物の不定がイヤならmemsetでゼロクリアすれば済むこと
197:デフォルトの名無しさん
22/02/22 17:57:32.88 FDkOG5bL0.net
エンディアンを合わせて読み書きなんて朝飯前だし
構造体を渡された関数は中でfread/fwriteを1回じゃなきゃいけないなんて縛りはナンセンス
構造体の中に構造体があるときは、その構造体の読み書きも関数化しておけば何も問題はない
198:デフォルトの名無しさん
22/02/22 18:33:22.53 XFNPZHqh0.net
パディングの距離、何バイトでアライメントされるかを制御したいとなると
コンパイラ依存の #pragma に頼るわ
199:デフォルトの名無しさん
22/02/22 18:40:08.78 9avL3EWo0.net
>>191
10人規模のプロジェクトだったが、構造体のデータをそのままファイル出力してた。
特にパフォーマンスを求められる部分でも無かったので、自分でマッピングして出力したかったのだが、現状できているからと言うことで却下。
ただ、気持ち悪さは残る。案の定といってもよいが、Sun Sparkが混在したときは当然問題が出たらしい。
関係ないが、そのソフトハウスって、OracleにInsertした順序でselect出来るって信じているところもあった。
実際、そうなるが気持ち悪い。
200:デフォルトの名無しさん
22/02/22 18:52:09.49 9avL3EWo0.net
C言語で冗長化と称して同じ内容を複数の変数に書き込みバックアップをするってプロジェクトが有ったが、意味有ったのだろうか?
今でも、変数ってプログラマが意図して変更しない限り値が変わることは無いし、仮に変わったとしたらもうプログラマレベルでは対処できない問題だと思う。
あと、そんな可能性があったらループ変数だってループ中に意図せずに変わると思うが。
(ハイレベルな一般的なアプリで、OS保護下で動くもの、DMAとか他ハードウェアとメモリを共有するような低レベルな話ではない)
201:デフォルトの名無しさん
22/02/22 19:02:11.86 pG+m+rIk0.net
昔、組込みやってた時は全部ではないけど特に動作中に変化すると致命的な箇所は同内容を複数の変数に保存していたことはある
製品評価でノイズ試験やサージ試験おこなっていると意外にマイコン内のメモリのデータはよく化ける
202:デフォルトの名無しさん
22/02/22 19:03:01.04 6JePgkF30.net
疑うことを知らずに一生を終える人は幸せである
203:デフォルトの名無しさん
22/02/22 19:21:24.62 IWqq52SNa.net
>>197,198
素朴な疑問なんたが、それ不一致起こしてた場合どっちが正しいと判断してたんだ?
204:はちみつ餃子
22/02/22 19:32:40.86 xH13yj0x0.net
>>190
言語仕様としての保証はあんまりないよ。
ABI (Application Binary Interface) と呼ばれる規格を作って同じアーキテクチャでは同じレイアウトにする通例はあるし、
既存のライブラリと組み合わせられないと不都合だからだいたいのコンパイラはそれに従ってる。
x86 (64ビットも含む) については歴史的事情で Windows はマイクロソフトが決めた ABI があって、
Windows 意外 (Linux とか BSD とか) はおおよそ System V ABI を採用してる。
で、自分が作るプログラムがターゲットにする範囲 (開発環境・実行環境) で ABI が共通ならそれでいいし、
違うなら適当に切り分けて対処するとかでも問題ない。
まあ結果的に問題なかったとしても検証せずにやってたんだとしたら良くはないけどな。
205:デフォルトの名無しさん
22/02/22 19:47:53.56 pG+m+rIk0.net
>>200
不一致が起きた場合はとにかく最優先でシステムを安全に停止させる
制御不能で暴走させることだけは何としても回避する
その後はソフトリセット処理を実行して再起動させていた
206:はちみつ餃子
22/02/22 19:51:42.70 xH13yj0x0.net
PC でもデータが化けることは思ったよりも頻繁に起きているらしい。
データ破損を検出して補正する ECC と呼ばれる機構を持ったメモリもあるんだが、
コンピュータの値下げの圧力と信頼性の高い現代のメモリでは ECC は必要ないという論から ECC を付けてない機種が増えてきてる。
でもリーナスは ECC は要るにきまってんだろという感じの発言をしてる。
URLリンク(linux.srad.jp)
実際問題として化けるんだよ、化けたことを検出したり補正したりする機構がいたるところに入ってるから
アプリケーションからは気にせずに済んでるだけで……。
207:デフォルトの名無しさん
22/02/22 20:27:20.57 x7wwxQmEK.net
>>192
よく見かける手法だな。ただ、後からメンバー追加したのか以下のようなアホな事になっている件もたまにあるw
{
char ch0;
char ch1;
char dummy[3];
int int0;
}
208:デフォルトの名無しさん
22/02/22 20:27:50.66 affn0mKeM.net
「メルキオール (MELCHIOR)」「バルタザール (BALTHASAR)」
「カスパー (CASPER)」 という3つの独立したシステムによる
合議制をとっていた。
209:デフォルトの名無しさん
22/02/22 20:56:32.44 IWqq52SNa.net
>>204
パックや共用体にしとこうぜ
210:デフォルトの名無しさん
22/02/22 21:00:04.31 mN73zrRIM.net
>>204
コンパイラによるけど警告レベル上げれば検出できるぞ
211:デフォルトの名無しさん
22/02/22 21:02:51.52 9avL3EWo0.net
>>200
3箇所の変数で多数決だった。3つ違う場合はアプリ終了。
ちなみにOSのメモリ保護された普通なプログラムです。
組み込みマイコンでも、DMAアクセスされるメモリーでも有りません。
212:デフォルトの名無しさん
22/02/22 21:10:15.11 9avL3EWo0.net
>>203
>>アプリケーションからは気にせずに済んでるだけで……
なのでOSで保護された上で動くアプリケーションはデータの冗長化は必要ないのでは?
というか、データを冗長化するという方針で作られたシステムもいわゆる神経質という
設計思想があり。 データ認定?された物は3重化されて変数に保管されるが
ループのi,j,kや一時的にデータを取得するaと言った変数は多重化されていなかった。
仮に変数の冗長化が重要だと言うことになった場合。なぜデータ認定されたものだけ冗長化され
ループ変数は冗長化せずに単体で使うのかって部分に気持ち悪さを感じる。
どの変数も「平等に」食らう可能性はあると思うから。
213:デフォルトの名無しさん
22/02/22 21:17:01.78 9avL3EWo0.net
>>201
「変数をバイナリーでファイルに出力する」と聞いてリーダーに求めたのは
メモリーマップ。当然、準備しているものだと思っていた。
ただ、メモリーマップなど知らないし意味も分からない、サンプルを見てくれ?
という指示だった。
バイナリーでのデータ交換をするのにメモリーマップを定めないことに関しては今でも気持ち悪さを感じている。
214:はちみつ餃子
22/02/22 21:27:02.48 xH13yj0x0.net
>>209
> OSで保護された上で動くアプリケーションは
OS では解決できない。 だからリーナスはインテルにマジムカという話。
変数を何か所にも増やすのが意味ないというのは、それはそう。
どうやったってどうにもならんので考えるだけ無駄。
職人技でどうにかできるような規模の小さな組み込み分野ならともかく、
複雑高度なコンピュータで低レイヤが信頼できないなら信頼できない箇所にコストをかけて改善すべき。
215:デフォルトの名無しさん
22/02/22 21:56:15.32 ntDF8W1ma.net
>>208
それなら気持ちは分かる
意味は解せぬが
216:デフォルトの名無しさん
22/02/22 21:59:25.84 fFHtSmjBd.net
>>209
ハードウェアエラーが原因ならプログラムの実行バイナリも平等に化ける可能性あるよね
217:デフォルトの名無しさん
22/02/22 22:00:17.02 FDkOG5bL0.net
>>204
そんなんテスト通るんか?
テストもせずに放置?
218:デフォルトの名無しさん
22/02/22 22:07:46.87 6JePgkF30.net
アポロ計画だったか、3台のコンピュータに計算させて多数決で決めてたな
219:デフォルトの名無しさん
22/02/22 22:18:57.41 6JePgkF30.net
それとCのようにロジックが追え、時間さえあれば
人でも答えが出せる場合ではなく、
AIシステムのようにブラックボックス化していると、
複数台による合議制もあるかも知れない
220:はちみつ餃子
22/02/22 22:31:59.79 xH13yj0x0.net
深層学習ってニューラルネットワークを多層構造にしたモデルなんだよね。
AI の仕組みの中に (重みづけされた) 多数決が既に組み込まれていると言えなくもない。
221:デフォルトの名無しさん
22/02/22 23:00:22.43 9avL3EWo0.net
>>215
それなら分かる。計算結果を多数決専用のワイヤロジックで決め
また、3台の入力に戻して計算していれば。
222:デフォルトの名無しさん
22/02/22 23:05:44.26 9avL3EWo0.net
>>213
そう思う。本当に冗長化するなら、ストアされているプログラムも
カウンタ変数も信頼性は平等だと思う。
レジスタに収納されてればより信頼性が上がると言われそうだが、
ループ変数だってメモリに退避されていることが多いから信頼性は同じだと思う。
223:デフォルトの名無しさん
22/02/22 23:14:07.01 AiPUeoxY0.net
>>211
> OS では解決できない。 だからリーナスはインテルにマジムカという話。
Xeon 使えばいいだけだろ
サーバーによってはECCだけじゃなくてミラーリングも使えたりするし
URLリンク(jp.fujitsu.com)
224:はちみつ餃子
22/02/22 23:21:36.39 xH13yj0x0.net
>>220
この場合は出来るハードウェアもあるってのは反論にならないんだよ。
出来ないハードウェアが世の中に溢れてるってのが問題なんだから。
225:デフォルトの名無しさん
22/02/22 23:34:31.66 AiPUeoxY0.net
>>221
溢れてて何が問題なんだ?
リーナスは金持ってるかもしれんが世の中ECCマシンを買える奴ばかりじゃないんだし
226:はちみつ餃子
22/02/23 00:08:53.35 o4j3GXmb0.net
>>222
安ければデメリットもあるのもしょうがないといえばしょうがない話ではあるけどね。
デメリットはない (あるいは十分に小さい) と言い張ってインテルは ECC なし製品を推し進めたけど、
実際にはそうじゃないことがわかったとなれば文句を言いたくもなるだろう。
227:デフォルトの名無しさん
22/02/23 07:03:47.68 6oKgGQho0.net
>>223
> 実際にはそうじゃないことがわかったとなれば文句を言いたくもなるだろう。
そうじゃないと言ってるけど実際どれくらいあるんだ?
仕事で上に書いたようなサーバーでシステム構築してたけどメモリーエラーなんて見たことないし
228:デフォルトの名無しさん
22/02/23 08:03:17.13 FxZT1eeTd.net
229:el="noopener noreferrer" target="_blank" class="reply_link">>>210 WindowsでのBITMAPFILEHEADERとか主要なファイルヘッダの構造は全部構造体で定義されてるから気にしたことないなあ ダミーパディング込みで 気になるなら定義部分を見てみるといい 余計なパディング入れないプラグマとかも使われているはず
230:デフォルトの名無しさん
22/02/23 08:27:04.99 JOM9/OKLa.net
URLリンク(www.itmedia.co.jp)
MS「ECCメモリを標準搭載にしろ」
インテル「やだ」
231:デフォルトの名無しさん
22/02/23 08:44:18.35 FxZT1eeTd.net
>>226
> それは、Microsoftは今調べているドライバの問題から、Windows XPのシステム・アプリケーションのクラッシュの主な原因がメモリの欠陥にあることを知ったからだ。
えっ?w
232:デフォルトの名無しさん
22/02/23 09:11:50.93 pngadACwM.net
リーナスもMSもECCメモリーがーって騒ぐ前にやることがあるだろw
233:デフォルトの名無しさん
22/02/23 09:34:02.54 vebGIGPQ0.net
>>224
20年間プログラマをやってたが、勝手に値が変わっていたことは一度もない。
(全てOSで保護されたアプリケーションレベルの経験)
234:デフォルトの名無しさん
22/02/23 09:37:11.21 vebGIGPQ0.net
>>225
URLリンク(docs.microsoft.com)
これでファイルの読み書きしても良いんだ。
MS公式文書で書かれているということで、今まで引っかかっているところが解消した感じ。
235:デフォルトの名無しさん
22/02/23 09:42:44.82 hrDKDc9G0.net
昔宇宙線だかなんだかがメモリデータを破壊するとかそんな記事を読んだ気がそこはかとなく(ry
236:デフォルトの名無しさん
22/02/23 10:39:13.43 6oKgGQho0.net
>>229
万が一書き換わってても気付かない事の方が多いだろ
237:デフォルトの名無しさん
22/02/23 10:44:14.42 6oKgGQho0.net
>>231
アルファ線とか宇宙線中性子とか
URLリンク(www.hitachi.co.jp)
メモリーを心配するならFPGAも心配しろよ
URLリンク(www.hitachi.co.jp)
238:はちみつ餃子
22/02/23 11:25:09.62 o4j3GXmb0.net
>>229
勝手に書き換わっているかどうかどうやって検証したんだ?
ICE とかでわかるもんなの?
239:デフォルトの名無しさん
22/02/23 12:31:11.32 v1sPphh80.net
Windowsならメモリーエラーでブ
240:ルースクリーンになるよな
241:デフォルトの名無しさん
22/02/23 12:39:56.12 stefKGxD0.net
ならねえよ
「何となく調子悪い」PCがmemtest86で問題発覚はあるけどな
242:デフォルトの名無しさん
22/02/23 12:54:35.71 FxZT1eeTd.net
再現性がまったくないから
端子の接触不良か熱暴走で片付けられると思う
243:デフォルトの名無しさん
22/02/23 13:35:22.91 vebGIGPQ0.net
Cで変数を分散するって話は人生で一回だけ。
それ以降は、どの言語でも意図して変更していなければ絶対に変数は変わらないという事を前提にコーディングしている。
でも、問題は無い。
244:デフォルトの名無しさん
22/02/23 13:42:56.07 n4QLtIZ70.net
eccメモリ積んだサーバー使えばいいじゃん
245:デフォルトの名無しさん
22/02/23 13:44:37.23 vebGIGPQ0.net
>>231
ケースをシールドしたり、信号ラインを絶縁して対応していると思われる。
246:デフォルトの名無しさん
22/02/23 16:46:51.15 vebGIGPQ0.net
while(1){
a(&x);
if(x==1) break;
b();
}
ってコーディングを禁止している案件もあった。break文じゃなく、しっかりと条件式がfalseになるように書けとのことだった。
ただ、このやり方って入門書にも書いてある普通な方法だと思うけど。ループの中間くらいで抜けたいときはその後の処理をifで実行できないようにしていたので可読性は悪かった。
もちろん continue も封印されていた。
while(x!=1){
a(&x);
if(x!=1) b();
}
みたいに
247:デフォルトの名無しさん
22/02/23 16:49:25.49 n4QLtIZ70.net
whileの中で関数呼べばいいじゃん
248:デフォルトの名無しさん
22/02/23 17:07:12.12 FxZT1eeTd.net
inline関数ならオーバーヘッドもないはずだしな
それで何が聞きたいんじゃ?
249:デフォルトの名無しさん
22/02/23 17:08:55.71 6oKgGQho0.net
俺なら
a(&x);
while(x == 1){
b();
a(&x);
}
って書くかな
250:デフォルトの名無しさん
22/02/23 19:16:45.48 Q2o1N4Td0.net
理不尽だと思われるコーディングルールも歴史があってそうなってたりするから
長いものに巻かれるしかない
251:デフォルトの名無しさん
22/02/23 22:15:21.75 PssNo99E0.net
俺なら嫌味のように
{
bool need_break=false;
while(... && !need_break){
//前半処理
if(!(need_break=...)){
//後半処理
}
}
}
とでも書くかな
252:デフォルトの名無しさん
22/02/23 22:33:27.74 ek+gncWLM.net
for (;;)
なんでみんなこれ使わないの?
253:デフォルトの名無しさん
22/02/23 22:36:06.79 v1sPphh80.net
泣いてるみたいで悲しい
254:デフォルトの名無しさん
22/02/23 23:22:31.05 lJym8p+qM.net
あと制御文の括弧前にスペース入れるのは少数派なんだろうか…
255:はちみつ餃子
22/02/23 23:26:41.88 o4j3GXmb0.net
個々の場面で不適切でもチーム全員が適切に判断できないようなら
比較的マシそうな側に統一するルールにも合理性はある。
それとか「わからんかったらこうしとけ」みたいな口伝が
拡大解釈されていったりするのもありそうな話だ。
256:はちみつ餃子
22/02/24 00:03:57.70 KIw+63Ii0.net
>>249
Google のガイドでは if や for の後に空白を入れる方針になってる。
私は入れないけど。
257:はちみつ餃子
22/02/24 00:21:21.22 KIw+63Ii0.net
>>247
それが無限ループになるというのが読み取り難いからではないかな。
初期化やインクリメントの部分を省略したら単に何もしないのだろうと類推できるけど、
省略された条件式が真に判定されるのか偽に判定されるのかというのは例外規則として知ってなきゃわからない。
慣用句 (イディオム) と化してるので慣れてしまうと普通に読めるけど、
while(1) のほうが明示的な分だけわかりやすいのかもしれない。
258:デフォルトの名無しさん
22/02/24 00:27:00.80 DLFV0+Dqa.net
関数っぽさをなくすためにスペース空ける方がいいと思う
259:デフォルトの名無しさん
22/02/24 02:22:52.59 9O+r6lMKM.net
>>252
while文で無限ループを作れるにも関わらず
Rustではloop式を導入してる点が興味深いよね
loop文ではなくloop式なのでbreak 値; で値を返せて凄く便利
260:はちみつ餃子
22/02/24 02:31:22.55 KIw+63Ii0.net
>>254
ループとしては無限ループにしておいて break で抜けるような構造は良くないといえばあんまり良くないんだけど、
そうは言っても存在する以上はその場合を明示的に表せるような構文があると便利ってのも確かで、
そのあたりは設計思想の違いとしか言いようがないよな……。
261:デフォルトの名無しさん
22/02/24 02:44:45.66 9O+r6lMKM.net
>>255
その構造が良くないというのは自分も昔はそうだったが単なる思い込みだと気付いたw
さらにwhileは先頭でif break、do whileは最後でif breakしているだけであるし
ある程度計算を進めてから途中でようやくif breakできないとwhileだと困ることもloop式で解決された
さらにループを抜けてbreakしたい時は値を返したい時が多いからloop文ではなくloop式が非常に便利
262:ハノン
22/02/24 05:13:17.42 SpBJKMB7H.net
>>251,249
K&R2 では if や for, switch の後にはスペースを入れますね
私は基本的に K&R2 に沿って書きますが、関数の始まりを示す { は例外的に宣言に続けて書きます
int main() {
return 0;
}
263:デフォルトの名無しさん
22/02/24 06:47:25.50 iDpw9I/70.net
>>247
俺は使うよ
while(1) だと警告出るから
264:デフォルトの名無しさん
22/02/24 06:53:42.23 MBzpszCI0.net
俺もマジックナンバーがないほうが好き
265:デフォルトの名無しさん
22/02/24 08:03:43.62 PbuedMT9d.net
#define FOREVER for(;;)
266:デフォルトの名無しさん
22/02/24 08:20:28.13 MBzpszCI0.net
>>260
こう書くとbreakやgotoが嘘つきに見えるな
267:デフォルトの名無しさん
22/02/24 11:30:55.34 XK2EQ9NF0.net
#define DEATH_MARCH for(;;)
268:デフォルトの名無しさん
22/02/24 12:02:15.07 7WoYZRJzd.net
#define DISALLOW_BREAK for(;;)
#define FOREVER for(;;)
DISALLOW_BREAK FOREVER{
...
if(...)break;
}
269:デフォルトの名無しさん
22/02/24 17:23:09.91 bIfpVEhP0.net
>>261
正規表現ライブラリとか使って、複雑な制御を見えなくするのも一つの手かも?
自分のところのbreak continueは嫌がられるが、他所なら見えないので。
結局機械語になれば、中でGoto(jmp)しまくっているわけなので。
270:デフォルトの名無しさん
22/02/24 17:32:25.81 MBzpszCI0.net
jmp命令は構造化プログラミングで問題視されるgotoとは違うぞ
271:はちみつ餃子
22/02/24 17:36:24.61 KIw+63Ii0.net
抽象度が違う話だからなぁ。
272:デフォルトの名無しさん
22/02/24 17:36:30.96 MBzpszCI0.net
ダイクストラは「高級言語では」という限定をつけてgotoを問題視していたのであって
アセンブラや機械語に出てくる分岐命令はあの議論の対象外だ
273:はちみつ餃子
22/02/24 17:38:56.51 KIw+63Ii0.net
>>267
だから >>264 は見えないところでやってる分には知らんって言ってるんだろ。
274:デフォルトの名無しさん
22/02/24 17:43:46.24 MBzpszCI0.net
>>268
てことは結局何も言ってないのと同じだな
Cを使えばjmpが見えなくなるなんてくだらん話は
break continueを禁止する理由とは無関係だ
275:デフォルトの名無しさん
22/02/24 17:44:23.55 5fQRd2wi0.net
SQL埋め込みのC言語goto使いまくってた
276:デフォルトの名無しさん
22/02/24 17:50:29.88 PbuedMT9d.net
K&Rでもgotoは醜いが使わないと余計な変数や不自然な構造が必要になるからねーとクギをさしてる
277:デフォルトの名無しさん
22/02/24 17:53:57.59 8VCxJpwXa.net
コードが80x120に収まれば俺はgotoなんて気にしない
278:デフォルトの名無しさん
22/02/24 17:55:30.50 9O+r6lMKM.net
>>271
そういうのもloop式導入で解決するから導入しよう
279:デフォルトの名無しさん
22/02/24 21:02:28.06 Qe3Dm4uv0.net
抜け出しgotoは分かる
飛び込みgotoはつらい
280:デフォルトの名無しさん
22/02/25 13:00:32.72 2Pynziee0.net
構造化プログラミングを盲信する気は毛頭ないが
それは違うぞ
抜けだしであろうが飛び込みであろうが
ループの端に設定された条件に従わない分岐は
ダイクストラが問題視する対象だ
281:デフォルトの名無しさん
22/02/25 13:19:00.10 Eg3DloqN0.net
MISRA-C でも、制御パスを変える、
goto, 複数return, (多重脱出からの?)break/continue などは禁止。
だから、ループ内で、やたらとフラグを持ち回る
でも、Linux では、
早期return, goto でエラー処理をまとめたりするから、フラグを持ち回らない
282:デフォルトの名無しさん
22/02/25 13:35:54.50 aDhOSI3tM.net
>>275
そんな無意味な制約を課しているとダメなプログラマーになってしまうね
>>276
MISRA-Cは本末転倒としか言いようがないね
結局その無意味な制約によって目的としたメモリ安全性などの成果を得られなかった
その長年の未解決だった課題はRustが全く別方向からようやく解決した
283:デフォルトの名無しさん
22/02/25 16:58:20.86 2Pynziee0.net
>>277
おまえさんもダイクストラみたいに学会誌に投稿したら?
284:デフォルトの名無しさん
22/03/01 11:42:38.47 iGO9Qf02a.net
break;とかcontinue;はいいの?
285:デフォルトの名無しさん
22/03/01 12:15:17.30 qblu1Z+O0.net
switch以外のbreakは制御式にない条件での脱出
continueは違う
286:デフォルトの名無しさん
22/03/01 12:24:02.66 QP0iZO8FM.net
どこでもexit
287:デフォルトの名無しさん
22/03/03 13:53:35.02 2Y1y5HDI0.net
グローバル変数禁止プロジェクトがあって、固定値が全てリテラルでばらまかれていたので、仕様変更でチーム員は苦労してた。
自分の担当箇所は謎関数を一つ作り、そこから値を得ていた。
288:デフォルトの名無しさん
22/03/03 14:05:48.79 o7MH0vY5M.net
グローバル変数禁止なのになんで定数まで禁止なんだ
289:デフォルトの名無しさん
22/03/03 14:16:38.79 bgg8zGG60.net
>>282
グローバル「変数」と「固定」値がリテラルでばら撒かれてるのは全然違う話だが?
苦労してるのはお前さんの能力に問題があるんじゃ…
290:デフォルトの名無しさん
22/03/03 14:18:42.95 iO+E/Lewd.net
マクロは使わんのか?
ただの素人のスパゲッティだな
291:デフォルトの名無しさん
22/03/03 15:16:49.50 dDnSjvDO0.net
センス悪いやつがいるせいで
必要なものまで制限されるんだよな
ロクに精査もせずに横暴な制限を作るやつらも
センス悪いやつの一員
292:デフォルトの名無しさん
22/03/03 15:48:11.59 NNobhPIrM.net
昔グローバル変数はなるべく使わないようにねってお願いしたら、グローバル変数が関数内のstatic変数になって返ってきて状況悪化させしまったことを思い出した…
依頼は正確でないとな
293:デフォルトの名無しさん
22/03/03 15:52:02.14 nN/xu0Sn0.net
>>287
望んだ改善ではないにしてもグローバル変数よりは関数内static変数のほうがマシで、悪化はしてないのでは?
294:デフォルトの名無しさん
22/03/03 15:55:02.85 7Ur+27OW0.net
必要なものが制限されるのは腹立たしいだろうけど、
現実にセンスないやつが今、現場にいる状況で比較的マシにしようと思ったら制限も已むなし。
295:デフォルトの名無しさん
22/03/03 15:55:56.96 9ZWmTo8BM.net
君は関数内static変数の破壊力を知らない
296:デフォルトの名無しさん
22/03/03 16:02:36.91 dDnSjvDO0.net
int *just_function(void)
{
static int not_global_variable;
return ¬_global_variable;
}
struct common_variables
{
int fool;
int jerk;
int idiot;
};
struct common_variables *a_function(void)
{
struct common_variables cv;
return &cv;
}
297:デフォルトの名無しさん
22/03/03 16:03:41.51 dDnSjvDO0.net
static struct common_variables cv;
だった
笑い処でミスってどうするw
298:はちみつ餃子
22/03/03 16:09:12.32 7Ur+27OW0.net
やりたいことは分割統治なんだよね。 プログラムを機能単位ごとに分割して部品にしたいの。
部品を束ねた部品があって、それを束ねて大きな部品にして……という綺麗に階層的な依存関係にしたいの。
色んなところからアクセスされるものがあるのが目に付くと綺麗に分割できてねぇなあと感じるという話であって
言語機能としての「グローバル変数」を使わないようにすれば綺麗になるというわけではない。
299:デフォルトの名無しさん
22/03/03 16:17:38.32 9ZWmTo8BM.net
グローバル変数一つ新規に作るのに何枚も書類を書かないといけないプロジェクトがあって、
その時は一つだけ管理テーブルという名称の構造体を作成登録した。
その後は必要に応じて構造体にメンバーを追加した。
追加の場合には許可がいらない。
300:デフォルトの名無しさん
22/03/03 16:23:37.12 dDnSjvDO0.net
俺のジョークそのまんまかw
301:デフォルトの名無しさん
22/03/03 16:28:52.42 rhQumEoNd.net
int型のグローバル変数が2つあればvoid*アドレスを分割して突っ込める
291みたいなstructへのポインタ突っ込んどきゃやりたい放題だよやったね!
302:デフォルトの名無しさん
22/03/04 08:30:10.22 kn6yruMU0.net
C++ の singleton クラスと
関数内static から戻ってくるのも 似たようなものになる?のか?
303:デフォルトの名無しさん
22/03/06 14:20:18.71 RiucPZY70.net
ref class SampleCls
{
internal:
property int A[int]
{
int get(int n)
{
int value = n * 100;
return value;
}
void set(int index,int n)
{
}
}
};
SampleCls objを実体化させた後に
s = s + "n= " + obj.A[i]+ "\n";
を5回繰り返したら0,100,200,300,400になったのですが
0に100をかけると100になるのでしょうか?
304:デフォルトの名無しさん
22/03/06 14:24:03.50 RiucPZY70.net
A[i]の値がどんなふうに決まっているのか知りたいのですがよくわかりません
どなたか教えていただければ幸いです。
305:デフォルトの名無しさん
22/03/06 14:42:22.06 RiucPZY70.net
すみません、解決しましたSet()とget()の動きをちゃんと理解していなかったことが
原因でした。
306:デフォルトの名無しさん
22/03/06 16:10:19.16 g5zD4gJoM.net
まず、自分が何の言語で書いてるか理解したらもっと早く答えが手に入ると思うよ…
307:デフォルトの名無しさん
22/03/07 04:27:05.03 t70FSnsj0.net
ダイクストラって名前を聞くたびに大工が屋根の上で仕事をしている姿が浮かんでしまう
308:デフォルトの名無しさん
22/03/07 06:18:54.97 RhJCMKRm0.net
キャスバルレム大工ん
309:デフォルトの名無しさん
22/03/08 12:29:53.09 Ki3D6geg0.net
アルゴリズム系でかっこいい名前はダイクストラとラグランジュ
310:デフォルトの名無しさん
22/03/08 14:05:47.68 0fUGXJlMd.net
構造化プログラミングはアルゴリズムじゃない
311:デフォルトの名無しさん
22/03/08 20:30:43.45 Ki3D6geg0.net
ダイクストラ法な
312:デフォルトの名無しさん
22/03/09 01:38:28.31 D4BPG9+J0.net
大屑虎
313:デフォルトの名無しさん
22/03/10 20:38:39.30 kXeE1dtK0.net
malloc,freeを多用すると断片化でいずれOSが落ちるってのは
Windows11やLinuxでも起きる問題ですか?
314:デフォルトの名無しさん
22/03/10 20:42:14.86 4CPsM6xv0.net
使い方間違えていればOS問わず不味いだろ
315:デフォルトの名無しさん
22/03/10 21:22:58.66 kXeE1dtK0.net
正しく使っていれば問題ないということでOK?
なんか、正しく使っていても断片化が発生するみたいなのを聞いたもので
316:デフォルトの名無しさん
22/03/10 21:47:12.08 0nt+oQbsF.net
昔のCPUならともかく
MMUを使ってるOSなら断片化しないだろ
317:デフォルトの名無しさん
22/03/10 22:40:12.59 iIk3GhqfM.net
MMUのページサイズとmalloc/freeの管理サイズは全然違うぞ
318:デフォルトの名無しさん
22/03/11 14:14:05.09 Yxv/2BSs0.net
>>308,310
断片化は発生するだろうけど、そのせいでOSが落ちるなんてことは最近のOSではたぶん無い。
断片化によるメモリ確保失敗によってアプリが落ちることはあるかもしれない。
「正しく使っていれば」という条件で質問されても何をもって正しいと言うのか示してもらわないと答えようがない。
319:デフォルトの名無しさん
22/03/11 21:28:24.41 FGXUCKCr0.net
1MiB以上と未満で挙動を分けているmallocはよく見かけるね
320:デフォルトの名無しさん
22/03/11 21:50:14.89 o502mXGNM.net
>>308
実装を知っていれば意図的にフラグメントは起こせる、という程度で気にしなければ普通起きない
321:デフォルトの名無しさん
22/03/12 00:08:34.44 NOu0XfGq0.net
>>310
32bit環境なら大きい領域は早めに確保するか、
あるいはmallocじゃなくAPIで確保したい領域のアドレスを逆方向から取得
322:デフォルトの名無しさん
22/03/12 01:41:51.18 NpUzvYny0.net
>>308
普通のアプリ動かしているだけなのにOSが落ちるとすると、そのOSは何かおかしい。OSにバグがあるのではないか?
323:デフォルトの名無しさん
22/03/12 13:07:51.07 aRaeBtiY0.net
普通に車を運転してたら事故った
車に欠陥があるはず
324:デフォルトの名無しさん
22/03/12 15:32:14.60 XvQpUkSW0.net
九州のタクシー暴走事故はプリウスのせいだと思っている。
325:デフォルトの名無しさん
22/03/12 16:34:06.63 aRaeBtiY0.net
プリウスの制御プログラムを書いた人、ここにいませんか?
326:デフォルトの名無しさん
22/03/12 18:00:40.48 WugjRoTQM.net
仮にいたとしても名乗り出ないだろw
327:デフォルトの名無しさん
22/03/12 18:10:20.20 kaM/Ypx70.net
>>318
当然、疑うことだね
328:デフォルトの名無しさん
22/03/12 18:29:57.19 0pfFD5zX0.net
ドライバーの単体テストは実施してたんですか?
329:デフォルトの名無しさん
22/03/12 23:53:51.20 NpUzvYny0.net
>>318
それは今回の話には当てはまらない。普通のアプリを動かしていたらアプリが落ちた、だったら当てはまる。
今回の話を喩えるなら普通の車を運転していたら道路が陥没したみたいになる。OSの方が落ちたんだから。
330:デフォルトの名無しさん
22/03/12 23:56:33.44 aRaeBtiY0.net
そうか?
池袋事故では最後まで車の欠陥を主張してたぞ
普通にって表現は、あくまでも本人の主観だからな
331:デフォルトの名無しさん
22/03/13 00:27:55.58 8TmiOcWs0.net
上級国民は医師に運転を止められていた欠陥アプリなので、譬喩に用いるには特殊すぐる。
332:デフォルトの名無しさん
22/03/13 00:30:40.49 giayljWn0.net
事故起こした奴って自分が原因だと思ってないだろう
333:デフォルトの名無しさん
22/03/13 06:05:08.20 g8VV1ENe0.net
常に自分を疑え、なんて根性論めいた主張には興味ないし
弁護士に譲歩的なことを言うなと指示されて本当に思っていることと違うことを陳述するのもこの議論とは関係ない
334:デフォルトの名無しさん
22/03/13 06:10:49.96 kdm08K3Td.net
>>308
多用、ってのがおかしいな
一ヶ月も動かし続けてたらどうしても多用になる
それで落ちるようなことはWin95とかの時代の話だろ
335:デフォルトの名無しさん
22/03/13 11:39:10.82 HQz48e8Z0.net
>>308
malloc,freeを多用すると
解放し忘れが多くなり
メモリが断片化して
新規メモリが確保できなくなってエラー吐いてんのに
エラーチェックもせずにポインターにアクセス
そしてプログラムが落ちる
さらにOSを巻き込んでPCごと落ちる
でも今時のOSは生半可なことでは巻き込まれない
336:デフォルトの名無しさん
22/03/13 17:40:39.42 5qwn5s+60.net
解放し忘れ(メモリリーク)と断片化は別概念
16byteを4回確保した後に1回目と3回目で確保したメモリだけ解放すると、
合計32byte空いてるのに飛び地になってるから32byte領域として扱えない
337:デフォルトの名無しさん
22/03/13 22:53:37.11 A2eUK16/a.net
malloc/freeを多用すると解放忘れが多くなるものなのか?
338:デフォルトの名無しさん
22/03/14 01:27:18.72 OOlFm33n0.net
そりゃプログラムがおかしいだけ
339:デフォルトの名無しさん
22/03/14 10:46:27.63 z8DyGqYY0.net
C言語ではなくスクリプトだが、
無限にSubdirを掘り続ける奴書いて動かしたら、OS落ちたな
XPだったが
340:デフォルトの名無しさん
22/03/14 11:00:21.69 GQP59fXj0.net
fork爆弾みたいな実験か
341:デフォルトの名無しさん
22/03/14 16:40:21.91 LP3GQSIPd.net
OS名はあえて書かないが
Visual C++のmallocで1GBを256回確保しただけで落ちたな
342:デフォルトの名無しさん
22/03/14 17:46:29.09 OOlFm33n0.net
Windowsは昔から落ちやすい印象
なんというか、OS自体もなんか少しユルい上にみんなして色んなドライバ作って組み込むもんだから余計に落ち易くなってんじゃないかな。
343:デフォルトの名無しさん
22/03/14 17:51:09.33 L/zgcwZ50.net
Win98で512バイトぐらいをいくつmalloc出来るかと試したことがあって、
10万回ちかくでNULL返した・・・いや、1万回だったかな?。
とりあえずOSもアプリも落ちなかった。
344:デフォルトの名無しさん
22/03/15 21:09:49.60 uaV7elHUM.net
>>249
教えられてないし誰も知らないしwhile(1)で事足りるから
::printfとかもな
わざわざ使ってるやつはアホだと思う
345:デフォルトの名無しさん
22/03/15 21:12:16.49 oV08M4Ak0.net
あなたの基準では世界中アホだらけやな
346:デフォルトの名無しさん
22/03/15 21:19:55.67 uaV7elHUM.net
一部のバカに対して言ってる
マジで::printfなんて使ってるやつなんて滅多にいない
347:デフォルトの名無しさん
22/03/15 21:22:08.63 uaV7elHUM.net
誰も使ってない表記法使うアホのせいで改めて調べないといけなくなる
使われてないから敢えて教科書に書かれてないし教科書に書かれてないんだから知らないやつが多数派ってことがわからんバカ
348:デフォルトの名無しさん
22/03/16 00:50:46.44 HRRT9pv8r.net
知らなくて馬鹿にされたのかな?辛かったね、大変だったね。カワイソウニ(´;ω;`)ウッ…
349:デフォルトの名無しさん
22/03/16 05:23:40.43 sZ1wd+Ly0.net
有効範囲解決演算子はスレ違いだぞ
350:デフォルトの名無しさん
22/03/16 13:21:40.48 IYkrMFX0r.net
Cに namespace の概念ってある?
351:デフォルトの名無しさん
22/03/16 13:45:31.87 EozDCnXud.net
gotoラベル
構造体のtag名
構造体のメンバ名
それ以外
という概念のnamespaceならある
typedef struct A{int A;} A;
int main(){ A: return 0;}
で4種類のAを区別できるというだけで、ns::A とかの話ではないが
352:デフォルトの名無しさん
22/03/16 14:57:34.41 IYkrMFX0r.net
ああ
それぞれで固有の識別子を記憶する空間があるから ぱっとみの文字が衝突しててもセーフ
という概念か
コンパイラ記述するときにめんどくさそうね
文意からこっちのテーブルを参照すべきとか
353:デフォルトの名無しさん
22/03/19 11:24:46.11 fvSihUDg0.net
初歩的な質問ですが、
b = a++;
という式はbにaの値を代入してからaをプラス1しますが、
演算子の優先度を考えると、++が優先度高く、=は右優先です
優先度の高い++をしてから代入するように感じるのですが
そうならない理由をご教示ください
354:デフォルトの名無しさん
22/03/19 11:57:41.89 VgIBj69P0.net
a++が返す値は、aをインクリメントする前の値だからだよ
355:デフォルトの名無しさん
22/03/19 12:07:43.36 X795CU5ld.net
b=a++;
のインクリメントが実行されるのは式を評価した後
356:デフォルトの名無しさん
22/03/19 12:40:35.63 fvSihUDg0.net
返信ありがとうございます
演算子の優先度を調べると++が=より優先度が高いはずです
式の処理は優先度の高い演算子から処理されると理解しています
そうすると、++が先に実行された後で=(代入)が実行されてもおかしくないと
考えたのですが、どこに誤りがあるのでしょうか?
357:デフォルトの名無しさん
22/03/19 12:53:26.53 UXt2lmR80.net
そういう時のために
++i
i++
ちゃんと2種類の書き方が用意されてるんだよ
358:デフォルトの名無しさん
22/03/19 12:55:08.49 d0FibUHe0.net
>>351
> 式の処理は優先度の高い演算子から処理されると理解しています
これが間違い。演算子の結合優先度と式の評価順は別。
359:デフォルトの名無しさん
22/03/19 12:56:54.66 X795CU5ld.net
演算子の結合順位と副作用完了点の概念は別
というか b=a;a=a+1; を1文で書くためにa++ 周りのの仕様を特別扱いして実現してる
360:デフォルトの名無しさん
22/03/19 13:30:03.55 fvSihUDg0.net
返信ありがとうございます
++、--の場合は、前置、後置で
式の評価順が通常と異なると覚えました
式の評価順を理論から理解していないので
忘れてしまって失敗するかもしれませんが、
そのうち定着すると思っています
361:デフォルトの名無しさん
22/03/19 15:38:29.74 CZI3HevE0.net
よくわからない場合や使うと分かり辛くなる場合は使わないで冗長な書き方した方が良いかも知れない。
使わなくても最近のコンパイラは最適化掛ければ適当にうまいことやって最終的に作られるコードは同じになる可能性が高いと思う。
362:デフォルトの名無しさん
22/03/19 17:00:25.72 mw5TX/57a.net
b = a++;
の右辺を評価した結果は aの元の値で、副作用として aのアドレスにあるオブジェクトをインクリメントしているのでは
代入されるのは aの内容でなく、アドレスを持たない値で
363:デフォルトの名無しさん
22/03/19 17:03:51.29 mw5TX/57a.net
a++ は右辺値で、 ++a は左辺値
364:デフォルトの名無しさん
22/03/19 17:12:51.80 X795CU5ld.net
どっちも右辺値としないとまずい
int main(){
int a=0;
int* p;
p=&(++a); // コンパイルエラー
p=&(a++); // こっちも
}
365:デフォルトの名無しさん
22/03/19 17:42:57.61 mw5TX/57a.net
そうだね、失礼しました
366:デフォルトの名無しさん
22/03/19 17:50:05.80 nPptgbtB0.net
: BassClass(
std::format (IdPrefix, index, numBank)),(
std::format (NamePrefix, ++index, numBank))
ちょうどこんな感じのコンストラクタでラッパーするコード書いてたんだけど
インクリメントしてない方までつられて増えちゃうんだよね
C++のコード片でスマソン
367:デフォルトの名無しさん
22/03/19 18:11:19.38 8Fsv/onud.net
d = ++a + b-- + --c + a++;
この結果は
++a;
--c;
d = a + b + c + a;
b--;
a++;
だよね
実際はこんな書き方しないほうがいいがw
368:デフォルトの名無しさん
22/03/19 18:25:12.86 d0FibUHe0.net
>>362
> d = ++a + b-- + --c + a++;
> この結果は
++a と a++ とが順序付けされないので未定義動作。
369:デフォルトの名無しさん
22/03/19 18:39:08.49 Uza1/JxDM.net
両方未定義じゃね?
>>361 の方はちょっと自信ないが >>362 の ++a + a++ はダメだったような気がする
370:デフォルトの名無しさん
22/03/19 19:05:15.57 9SMEw2CG0.net
以下のような関数がインラインで実行されてるだけで、評価自体は++が先に行われてるんでないの?知らんけど
int inc(int* a) {
int ret = *a;
*a = *a + 1;
return ret;
}
371:デフォルトの名無しさん
22/03/19 19:10:54.79 fJWxsuK3a.net
引数の評価順なんてCPUでも変わるだろ。
372:デフォルトの名無しさん
22/03/19 20:25:22.26 hj0ig94x0.net
未定義動作警察だ!
未定義動作の動作は定義されていないのでコンパイラは何をしてもいい
> d = ++a + b-- + --c + a++;
このコードの場合、
++a;--c;d=...; b--;a++;相当のコードを吐いてもいいし、
tmp=a;a=tmp+1;--c;d=...; b--;a=tmp+1; 相当のコードを吐いてもいい。
大抵は未定義動作がないことを前提に最適化をかけるが。
極端なことを言えば、d=42としてもいい。
この文の見た目の動作は定義されていないから
373:デフォルトの名無しさん
22/03/20 00:26:15.18 dAApHicf0.net
fgetsのファイル終了・エラー時の戻り値がNULLなのはなぜですか?
他の入出力関係の関数の戻り値はEOFになっています
いま入出力の勉強をしてるんですが、関数の引数や戻り値が少しずつ違うので覚えるのが難しいです
使っていくうちに覚えていくものでしょうか?
374:デフォルトの名無しさん
22/03/20 00:53:13.92 tmhbCmKs0.net
細かな仕様はよく使うもの以外は毎度調べるよ
まあCの関数は数が少ないから全部覚えてるって人も少なくないかも
375:デフォルトの名無しさん
22/03/20 00:57:50.69 rKPZjyik0.net
よく使う関数の戻り値調べると面白いぞ
printfが何を返しているかとか、それは何故なのかとか
戻り値を使っている人を見たことがないけれど
376:はちみつ餃子
22/03/20 01:37:41.92 u4Grkyrm0.net
>>361
こういう場合については未定義ではないが未規定の動作が含まれる。
副作用完了点の間で同一のオブジェクトに複数回の書き換えが生じた場合には未定義の動作となるが、
書き換えが一度の場合はその書き換えがどのタイミングで起こるかわからないというだけで、
未定義の挙動にはならない。
377:デフォルトの名無しさん
22/03/20 08:21:37.14 e7HuEm7id.net
>>368
fgetsの戻り値は文字列へのポインタであり
いっぽうEOFは文字(じゃなくてintだけど気分的には)なのだ
378:デフォルトの名無しさん
22/03/20 10:46:46.29 +oGVYZOT0.net
組み込みのソフトしていると
使わない関数が多くて忘れていきます
379:デフォルトの名無しさん
22/03/20 11:48:15.83 w4XPcyomd.net
<stdio.h>は使えないとして組み込み系って使える標準ライブラリあるの?
380:デフォルトの名無しさん
22/03/20 12:55:28.41 DiBIkIVz0.net
windows.h
381:デフォルトの名無しさん
22/03/20 13:05:34.82 w4XPcyomd.net
使える標準ライブラリを聞いたつもりなんだが
あと<Windows.h>はOS依存のライブラリな
382:蟻人間
22/03/20 13:25:28.64 y5NxTTYed.net
標準っていっても何の標準かわからん。
ANSI CとかC89とかあるだろ。
383:デフォルトの名無しさん
22/03/20 13:41:32.19
384:ID:w4XPcyomd.net
385:デフォルトの名無しさん
22/03/20 13:42:12.13 e7HuEm7id.net
それぞれ組み込むシステムに付属してるだろ
一元的な名前はない
ひょっとしたらstdio.hという名前かもしれない
386:デフォルトの名無しさん
22/03/20 14:14:31.30 4KnLtgrc0.net
組み込みって言っても小さくても Linux 動いちゃうようなのもあるし、何とも言えんな。
387:デフォルトの名無しさん
22/03/20 14:19:28.79 BOo0cJz/a.net
string.h は普通に使えた
388:はちみつ餃子
22/03/20 17:31:23.40 u4Grkyrm0.net
C の規格は「規格合致ホスト処理系」「規格合致フリースタンディング処理系」を規定していて、
フリースタンディング処理系はライブラリとして float.h iso646.h limits.h stdarg.h stdbool.h stddef.h stdint.h の内容に限定している。
この範囲なら実行環境に左右されずに用意できるはずという判断なんだろう。
389:デフォルトの名無しさん
22/03/20 19:31:33.68 w4XPcyomd.net
組み込み向けの最低限の規格があるのか
#defineとtypedefしかないが
なるほどこれなら環境がどんなにショボくても用意できそう
390:デフォルトの名無しさん
22/03/20 20:07:23.09 mxx3UMQ+0.net
ファイルディスクリプタを使ってEOFを知りたいんだけどどうしたらいい?
普通にreadすりゃ0になるからわかるし、そもそもファイルなら
391:求めたサイズより小さく読めるからわかるけど ちょうどぴったりでreadしたあとに、つぎのreadをせずに知りたい feofとかファイルポインタだで使えんがや
392:デフォルトの名無しさん
22/03/20 20:57:34.02 cOd2oDpEM.net
unblocking modeでopenしたfdをreadして判定すれば
393:デフォルトの名無しさん
22/03/20 22:28:44.17 aLyHOWc60.net
ファイルのサイズを取得して、そこへseek するとか?
そもそも、ファイルを開いて、ファイルの終わりにseek できるかも。
元々、ファイルの追記モードもあるぐらいだから
394:デフォルトの名無しさん
22/03/20 22:54:16.07 pl7vy6aed.net
>ちょうどぴったりでreadしたあとに、つぎのreadをせずに知りたい
そもそもreadが終端まで来たらつぎにreadしてもファイルアクセスせずに0を返すから同じだろう
395:デフォルトの名無しさん
22/03/20 23:19:06.05 dAApHicf0.net
>>372
よく分かりました
ありがとうございます
396:384
22/03/21 16:21:59.97 nqBLTVDb0.net
>>387
後出し情報であれやけど
readしたデータをどこかに送信、最後のデータには最後フラグを立てる
みたいなやつなので、ぴったりのときに困ってたんよ
バッファを2面用意して、すぐ送信せず常に1回貯めて送信するのが
正解なんだろうなぁ・・・ まあいいけど
397:デフォルトの名無しさん
22/03/21 17:02:36.51 geQt3ukX0.net
ファイルサイズと読み出し位置から残りサイズ計算するぐらいか?
398:デフォルトの名無しさん
22/03/21 18:07:17.68 bPJRBgFUM.net
>>389
ファイルサイズわかってるならlseek(fd, 0, SEEK_CUR) で現在位置調べりゃいいだけかと
399:デフォルトの名無しさん
22/03/21 21:41:26.44 nqBLTVDb0.net
一応、ファイルじゃないときのことも考慮したかった
400:デフォルトの名無しさん
22/03/21 22:38:50.94 j56ex+kVd.net
ファイルディスクリプタが0とか"/dev/stdin"という名前のファイルを考慮し始めたらそれはもう無理じゃ?
401:デフォルトの名無しさん
22/03/21 23:41:34.24 /12E7ImH0.net
なんかバグやセキュリティホールの温床になりそうだな。
402:デフォルトの名無しさん
22/03/21 23:55:00.11 avj/Dp0k0.net
キャッシュとか、同期・非同期処理とか、ブロックされる・されないとか、
ブロックデバイス・シーケンシャルかとか、リダイレクト・パイプとか、
共有の有無とか、メモリ内共有かどうかとか、
そんな事を考えだしたら、キリがない
なんせ、Linux API の7割は、IO の説明だから、10年以上掛かる
403:デフォルトの名無しさん
22/03/22 02:05:16.87 vyk85loe0.net
1バイト単位なら fdopen() しちゃって FILE * でバッファリングさせた方が楽だな。feof() も使えるし。
1バイト単位ではなく1000バイト単位とか、大きい塊でバッファリングする必要がある場合は自作して feof() みたいなチェックができるようにする。
(それでも FILE * でのバッファリングがあった方が遅いストレージにあるファイルなら読み出し効率上がると思うが)。
404:デフォルトの名無しさん
22/03/24 22:37:34.92 jD8pMP9K0.net
以下はライブラリバージョンが1より大きければ処理を有効する例です
#if LIBRARY_VERSION > 1
…
#endif
この「LIBRARY_VERSION」は何者ですか?
どこに定義されているのでしょうか?
405:デフォルトの名無しさん
22/03/24 23:58:11.94 ItLF0V9z0.net
>>397
少なくとも標準仕様ではどこにも定義されてないです
説明のための例では?
406:デフォルトの名無しさん
22/03/24 23:59:45.82 bdM8JANZ0.net
MSVC環境ならカーソル合わせてF12キー押せばいい
gccとかは知らん
407:デフォルトの名無しさん
22/03/25 00:14:08.19 sET9XTXv0.net
>>397
独習Cからの抜粋と予想して記載します
複数の開発環境で同じヘッダファイルを使用する際の
�
408:宴Cブラリバージョンの差異でエラーとなるのを防ぐための テクニックです 各自が自分の開発環境に合わせて #define LIBRARY_VERSION 1などと 定義する必要があります
409:デフォルトの名無しさん
22/03/25 06:50:38.08 0hAphrOld.net
いえ、それはそのライブラリの作者(メンテナンスしてる人)が標準ヘッダ内で定義すべき内容です
ユーザーは>>397を自分のファイル内で使用してバージョンの差異を吸収できます
410:デフォルトの名無しさん
22/03/26 01:22:16.42 EYuSPLit0.net
>>398,400,401
説明のための例のようですね、失礼しました
あと、この定数が未定義の場合の値は0になるのですね
そのあたりを理解していませんでした
どうもありがとうございました
411:デフォルトの名無しさん
22/03/26 16:05:05.08 EYuSPLit0.net
コンパイル(リンク)時に、同じプロジェクト内の別ソースの関数などを呼び出せるのはなぜ?
インクルードして教えてる訳でもないのに、もしかして全ソースを探しに行ってるんですか?
412:デフォルトの名無しさん
22/03/26 17:27:18.26 T/pJeR6z0.net
全ソースから探し出すのがリンク
includeとかで関数宣言だけは見えるようにする必要はあるが。
main.c
-----------
char* func(int size);
int main(){
char* p=func(16);
}
-----------
funcという名前の関数は、
前方宣言(1行目)してるのでリンク時に探しに行く。
リンク時の解決用に定義した関数(とその実装)を.objファイルに一覧としてまとめる。
リンクという作業では、.objと.libと.dllから"func"という名前の関数を探し出す。
見つからなかったり2つ以上見つかったらリンクエラーになる。
古いCだと前方宣言がなければ int func(); 決め打ちで前方宣言扱いしたりする。
413:デフォルトの名無しさん
22/03/26 18:26:49.41 kmPIEuI7d.net
>>403
(古典的な)Cではアセンブラソースに変換してアセンブル→リンクされるが
通常の関数名や変数名はアセンブラのグローバルシンボルに変換され
リンク時に他のアセンブラソースから参照できるようになる
一方関数内のローカル変数やstatic宣言された関数や変数はローカルシンボルとして扱われ他のアセンブラソースからは参照できなくなる
414:デフォルトの名無しさん
22/03/26 23:45:36.64 EYuSPLit0.net
よく分かりました、ありがとうございました
415:デフォルトの名無しさん
22/03/27 21:02:14.58 angONFKk0.net
グローバル変数の修飾子の意味は次の意味で合っているでしょうか?
修飾子なし:変数の実体を定義
extern修飾子:定義済みの変数を参照する
static修飾子:変数の実体を定義して、その変数を他のファイルからexternさせない
416:デフォルトの名無しさん
22/03/28 11:08:20.21 c4HYTfCO0.net
適当にググって見つかったexternとstaticの解説
URLリンク(daeudaeu.com)
URLリンク(daeudaeu.com)
417:デフォルトの名無しさん
22/03/29 00:24:04.59 c+1KPnOj0.net
>>408
そのサイト含めいろいろ見て、それをまとめたのが>>407です
念のためどなたかに確認していただこうかと思って書き込みました
418:デフォルトの名無しさん
22/03/29 06:11:36.84 7UUvIzLId.net
そんなに信用されてもw
419:デフォルトの名無しさん
22/03/29 08:18:01.14 C0VnxRTv0.net
自分で色々なパターンでコンパイルして確認しないのかな?って思う。
420:デフォルトの名無しさん
22/03/29 08:55:46.71 tKmNrPY6d.net
正確な意味を知るには解説サイト見て回るより規格書見るほうがいい
URLリンク(real-c.info)
421:デフォルトの名無しさん
22/03/29 13:03:41.11 M0Gs9C4cM.net
llvm-14 の、ソースツリーの外にcmake ディレクトリができる下品な感じ、なんとかならないの?
422:デフォルトの名無しさん
22/03/29 15:17:04.78 X58TTE+20.net
>>413
cloneしたディレクトリの直下にbuildディレクトリ作ってそこでcmake ~ ../llvmじゃいかんの?
今どきソースのディレクトリで直接ビルドしないのは下品というより上品ではないですか
423:デフォルトの名無しさん
22/03/29 18:15:06.70 U1DxU1KgM.net
>>414
>ソースツリーの外に
下品
424:デフォルトの名無しさん
22/03/29 18:20:46.45 1zZAboUWM.net
ソースツリーの中にbuildフォルダ作るのは上品なん?
425:はちみつ餃子
22/03/29 18:47:55.98 4oPH291+0.net
autotools でも out-of-tree build は出来るようにするのが一般的な作法。
あらゆるプロジェクトでそうしているというほどではないと思うけど、ごく普通にある。
426:デフォルトの名無しさん
22/03/29 22:23:02.11 X58TTE+20.net
URLリンク(llvm.org) を見るとソースフォルダの外でビルドしなきゃいけないような感じに書いてあるけど、
URLリンク(clang.llvm.org) を見るとリポジトリ直下にbuild作ってそこでビルドすればいいように書いてあるから、llvmはお上品にビルドできるのですわ
427:デフォルトの名無しさん
22/04/01 12:18:00.47 BXJ/mUbsM.net
llvm-14
まだゴミw
色んなものがダメになるw
428:デフォルトの名無しさん (ワッチョイ 6fb3-7L1B)
22/04/12 19:31:59 B1tFLWvv0.net
char buf[256];
memset(buf, NULL, sizeof(buf));・・・(1)
memset(buf, 0, sizeof(buf));・・・(2)
(1)と(2)同じ事をしていると思うのですが、どっちで記述するのがメジャーですか?
429:蟻人間 ◆T6xkBnTXz7B0 (スフッ Sd02-qTly)
22/04/12 19:35:46 Dt0TGPDOd.net
NULLはポインタだから(2)が正しいよ。
430:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a23e-vtdv)
22/04/12 20:06:33 5njWaFr40.net
>>420
言語仕様に厳密にいうと前者で初期化しようとした場合に buf が 0 で初期化されることは保証されないし、
コンパイルエラーになることもありうる。
整数定数式の 0 がポインタに変換したときに空ポインタになることは保証されるので
NULL が単に #define NULL 0 として定義している環境もよくあるんだが、
仕様上の NULL は「処理系定義の空ポインタ定数に展開する」ということになっていて
整数の 0 を書ける文脈に NULL を書いて通るとは限らないんだ。
そんで「整数定数式の 0」がポインタに変換されたときに空ポインタになることは保証されるが、
定数式ではない文脈での整数の 0 は空ポインタになることは保証されていないし、
逆に空ポインタを整数に変換したときに 0 であるとも限らない。
if 文などの制御式としてポインタを置いても問題ないのは C の制御式は !=0 が補われたかのように動作するというルールのおかげ。
431:デフォルトの名無しさん (ワッチョイ 6fb3-7L1B)
22/04/12 20:07:57 B1tFLWvv0.net
>>421-422
お早いレスサンクス
わかりました
432:ハノン
22/04/20 22:16:48.28 vxzn/db60.net
>>422
>整数の 0 を書ける文脈に NULL を書いて通るとは限らないんだ。
可変長引数にあるあるの最後に (char *)0 (なんで char * なんだ?)なんかがいい例ですね
433:デフォルトの名無しさん (ワッチョイ 97b3-4qoo)
22/04/22 15:01:50 YxI2bgUE0.net
(ソースtt.c)
#include <stdio.h>
#include <math.h>
void main()
{
double d;
int a;
d = 1.234;
a = round(d);
printf("%d\n", a);
}
$gcc tt.c
/tmp/cc0NPwg6.o: 関数 `main' 内:
tt.c:(.text+0x23): `round' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
こんな短いソースなのに解決できない。助けてー(´・ω・`)
OSはLinuxです
434:デフォルトの名無しさん
22/04/22 15:04:48.71 SxzvmxoM0.net
どうせリンクしてないとかそんなんだろ
435:蟻人間
22/04/22 15:05:51.08 BJPJNuGwd.net
>>425
古いコンパイラにはroundがないかもしれない。
436:蟻人間
22/04/22 15:06:16.30 BJPJNuGwd.net
-lm
437:デフォルトの名無しさん
22/04/22 15:12:16.74 SxzvmxoM0.net
gccなら -lmで動的リンクする簡易オプションがある、プログラム内だけで完結したいならコンパイラ付属のmathライブラリのソースも含めてコンパイル
438:デフォルトの名無しさん
22/04/22 15:14:29.72 SxzvmxoM0.net
動的リンクだとmathは浮動小数点の扱いが実行環境に依存するので静的リンク推奨
439:デフォルトの名無しさん
22/04/22 15:26:22.00 YxI2bgUE0.net
ありがとう
gcc tt.c -lm
でコンパイル通りました。
440:デフォルトの名無しさん (スププ Sdbf-DCm/)
22/04/22 15:44:53 I04xh82td.net
割とよく使う標準ライブラリなのに一々リンク方法をユーザーに選択させるという事の意義を考えるように、おまじないじゃないぞ
441:デフォルトの名無しさん
22/04/22 17:13:59.15 RFW8R+x+d.net
roundかtruncかfloorかはたまたceilかもしれないrintとその一味のヤバいやつら
こんなもんさっさと追放しろよ
442:デフォルトの名無しさん
22/04/22 17:31:11.41 SxzvmxoM0.net
整数型で表せない整数をdoubleで表したい時も稀にある
どうせ前後の整数(±1)は表せない不連続すきっ歯領域だし、どう丸まろうが影響無い部分だよ、って意図の明示に
443:デフォルトの名無しさん
22/04/22 17:49:02.83 SxzvmxoM0.net
用途は思い浮かばないでもないが、適切に使われてないケースが多分99%
444:デフォルトの名無しさん
22/04/23 13:45:19.22 +Gd9xYyP0.net
表せないときは整数型多倍長処理作る
445:デフォルトの名無しさん
22/04/24 11:54:23.21 S9c+iUdl0.net
GMPでそ
C++じゃないとちょっと使いにくいけど
446:デフォルトの名無しさん (ワッチョイ 51e6-DWDP)
22/04/24 15:18:10 Qwrn6LYl0.net
>>437
激しく同意
スレリンク(tech板:84番)
447:デフォルトの名無しさん (スフッ Sd94-6n8/)
22/04/25 03:24:41 LAuA6+3Dd.net
多倍長整数とか言ってる人は意図汲めてなくね?
正確性も表現力も不要だけど、それでも整数に相当する巨大数が要るのは極を利用した求根アルゴリズム(方程式解法)とかでしょうよ
たとえば、求めたい関数fの根がその逆数関数1/fの極と等しい事を利用するとか
もしdoubleの範囲を多倍長整数/任意桁数演算で308桁を陽に扱必要があるけど、そもそも極判定は指数部のみで行えるわけで、各桁の数字を陽に保持する意味が無い
一方で指数が巨大なdoubleを生で足すのは悪手
丸めれば各々の積分経路での評価値は真値から一旦遠ざかるけど、一貫した丸めを行う限りは10000万回も足せば互いに相殺されて均される
448:デフォルトの名無しさん
22/04/25 03:38:21.89 LAuA6+3Dd.net
ちょっと拵えすぎたような設定だったかもしれないけど、300桁を陽に保持して、ハードウェアの恩恵も無しに一万回加算とか、向かないどころかあまりにも非現実的過ぎる例もある
という例程度に
あとdouble使ってればinfが返ってくる可能性があるのが最大の利点
もしinfを引き当てられれば、それを与正入力がその浮動小数点実装における最高精度の解だと理論的に保証される
449:デフォルトの名無しさん
22/04/25 03:44:18.07 LAuA6+3Dd.net
訂正と補足
それを与正→与えた入力
(1/f)(x)→inf
と
f(x) → 0
と
fの根はそのx
は論理的に同値
450:デフォルトの名無しさん
22/04/25 05:05:51.34 ueJIdSJ50.net
INF見付かれば恣意的に収束/発散閾値を調整しなくてエレガントだよな
俺は素性の事前に分かってて留数定理使えるような関数くらいしか扱わないから、気にせずそのまま足しちゃうわ
積分経路は(楽だから)正方形に取り、均等に4分割して極のある範囲を再帰的に絞り込んでる、下手にニアミスしたりするとかえって桁落ちしたりして整数倍からズレる
±0.1くらいなら、きっと極を囲めてるものと想定
Cで数値計算入門みたいな本で勉強してるけど、浮動小数点の特殊値とかエラーの扱いとかの記述が一切抜け落ちてて困る
451:デフォルトの名無しさん (スフッ Sd70-6n8/)
22/04/25 19:15:48 o7ajKrF0d.net
実質ハードの実装に収束(発散)判定任せて綺麗に見えてるだけだがな
しかし比較無しに符号、複素数なら東西南北まで得られるのは便利
452:デフォルトの名無しさん (ワッチョイ 73b3-jUKb)
22/05/09 06:57:39 Egg1/KgR0.net
20年くらい前、Windows98が使われてた頃なんですが
char s = ''; // ←シングルクォーテーション2個
っという書き方が許されてた記憶があるんですが、記憶違いかな?
今Linux上のgccでコレをコンパイルすると「error: empty character constant」になる
453:デフォルトの名無しさん
22/05/09 07:35:16.71 QnLN+NJ0a.net
あえてなのかバグなのかは知らんけど20年前のコンパイラがそういう記法を通してたってだけだろ
454:デフォルトの名無しさん
22/05/09 08:27:27.53 Egg1/KgR0.net
>>445
冷静に考えてみたらコンパイラもOSも違うからそういうことだな
455:デフォルトの名無しさん
22/05/09 10:42:17.80 qGH53jdv0.net
''で何が代入されるの?
456:デフォルトの名無しさん
22/05/09 11:12:38.36 DLFHVgdp0.net
'\0' や 0 と同等の動作なんかねぇ
457:デフォルトの名無しさん
22/05/09 11:15:27.95 DuxsXAR8M.net
普通に考えれば空文字だと思う
458:デフォルトの名無しさん
22/05/09 11:35:54.50 lTlzTKNA0.net
NULL 「何もないよー」な意味をあらわす単語
空文字 長さ0文字の文字列のこと
この解釈でOK?
459:デフォルトの名無しさん
22/05/09 11:37:44.15 DLFHVgdp0.net
文字と文字列は違う 今話題に上がってるのは文字のほう
460:デフォルトの名無しさん (ラクッペペ MMe6-PUK/)
22/05/09 12:02:23 ItS/vT2KM.net
長さ0文字の文字列なら""(ダブルコーテーション)では?
461:デフォルトの名無しさん (アウアウウー Sa1f-KEdX)
22/05/09 14:03:39 KBCMvYUWa.net
>>448
まあそれが一番ありがちかと
462:はちみつ餃子
22/05/09 17:13:19.74 9vSL2/iz0.net
>>444
言語仕様にはそれを通す規定は見つからないな。
少なくとも一文字は必要であることになってる。
C89 ではすでにそうなってるし、後の仕様でも変更はない。
出来る処理系があったのだとしたらあくまで処理系の拡張。
「たとえば 'ab' などのように二文字以上を含む場合は処理系定義」という意味の規定はあるので
雑に任意個の文字を受け付けるようにしたらうっかり 0 個も通してしまったとか、
意図的ではない挙動 (コンパイラのバグ) だった可能性もあるし。
463:デフォルトの名無しさん
22/05/09 17:32:30.12 x5IK3MV30.net
立方根を自作関数で求める方法教えてください、、、、、
464:はちみつ餃子
22/05/09 17:46:08.50 9vSL2/iz0.net
>>455
要件次第だけど実装が一番簡単なのは log を使うことだと思う。
465:デフォルトの名無しさん
22/05/09 17:47:02.53 x5IK3MV30.net
>>456
ニュートン法を使いたいです、、
466:はちみつ餃子
22/05/09 17:50:27.78 9vSL2/iz0.net
>>457
方法がわかってるなら何をききたいの?
467:デフォルトの名無しさん
22/05/09 18:03:26.90 jsi1f5HY0.net
何も入っていない変数が作れます
468:デフォルトの名無しさん
22/05/09 18:36:55.77 4JqWZIdB0.net
だからその
> 何も入っていない
は0から0xffのうちの何なのよ。
1 Byteの領域はあるんでそ。
469:デフォルトの名無しさん
22/05/09 18:39:59.52 jsi1f5HY0.net
そこは未知の領域
470:デフォルトの名無しさん
22/05/09 19:59:08.45 UxqgrJa1a.net
>>460
ネタに全力で食いつくなよw
471:デフォルトの名無しさん (ワッチョイ ea02-zDU0)
22/05/09 20:46:46 poYUryAv0.net
一番簡単なのは挟み撃ちだと思うけどな
1の三乗は
0.5の三乗は
と1/2づつ狭めていく
472:デフォルトの名無しさん
22/05/10 09:30:11.65 79aB+w7Md.net
>>450
NULLはポインターに代入できる「無意味な位置」を表すアドレス
473:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-PvPk)
22/05/10 11:28:15 dIEMLhL70.net
だいぶんボケたことを書いてしまった。 (>>456)
式変形をする必要すらなく pow ひとつで良かった。
double cube_root(double x) {
return pow(x, 1.0/3);
}
474:デフォルトの名無しさん
22/05/10 19:36:27.76 gxi5OEx30.net
それを自作関数で求めるとは言わんやろ
475:デフォルトの名無しさん (ワッチョイ 6aad-zDU0)
22/05/10 23:29:45 CQsKbFR90.net
言うだろう
476:デフォルトの名無しさん
22/05/11 06:53:21.08 zyEQjrH3d.net
コンビニ弁当買ってきて料理したというレベル
477:デフォルトの名無しさん
22/05/11 10:08:25.28 jCepvp6u0.net
通はコンパイラの自作から始める?
478:デフォルトの名無しさん (ブーイモ MMd6-RieT)
22/05/11 10:35:21 a8uVrD+/M.net
情報学科ならCPU設計からだよ
479:デフォルトの名無しさん (ラクッペペ MMe6-PUK/)
22/05/11 10:39:55 3yHJq16kM.net
CPU設計だと情報学科なのか電子工学科なのか微妙なところ
480:デフォルトの名無しさん (ワッチョイ be63-PvPk)
22/05/11 10:43:04 jCepvp6u0.net
CPU設計ソフトを作る事から
481:デフォルトの名無しさん
22/05/11 12:00:05.99 2wozbOYLd.net
普通は自作関数作りたいんですって言ったら
>>463みたいなアルゴリズムを求めてるだろ
何の用途かは知らんが
482:デフォルトの名無しさん
22/05/11 12:53:38.63 rJ/SGv8Sa.net
>>471
素子の物理設計からなら電子工学
アーキテクチャからなら情報工学
じゃね?
まあ素子の物理設計なんてやってる学校があるかどうかは知らんけど
483:デフォルトの名無しさん
22/05/11 12:57:11.03 3n2UFvlUM.net
CPU設計の半導体物性や加工技術は情報学科の範疇外だと思う
484:デフォルトの名無しさん
22/05/11 21:22:30.22 Uorg83Yar.net
>>455
もう解決したってことでいいよね
485:デフォルトの名無しさん (ワッチョイ 7e02-jKFb)
22/05/11 23:25:04 eEErnLrt0.net
>>457
精度を組み込み関数より高めたいのかな?
なら一回で十分だよ、ループする必要も収束を確かめる必要もなくて、
y-=fx / f'x
だけで数桁精度が上がる
486:デフォルトの名無しさん
22/05/12 00:07:01.33 a2iZs8ls0.net
たぶんニュートン法を使いたいけどアルゴリズムを実装できないだけだと思うな