C言語なら俺に聞け 155

レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん (ワッチョイ 76ba-P5bm)
垢版 |
2020/05/10(日) 23:20:27.99ID:Z3WQBr9X0
!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言語なら俺に聞け 154
https://mevius.5ch.net/test/read.cgi/tech/1578997950/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2020/07/21(火) 18:13:57.71ID:zwiBtbEn0
独学で始めたからリンカの使い方とかよく分からず、C のソースを全部 include してたな。
2020/07/21(火) 19:46:32.95ID:tvr2GUf40
>>581
nanisore. 面白い。詳しく。
2020/07/21(火) 20:00:00.53ID:bmKYQrdR0
多分分割コンパイルのやり方を知らなかった頃の話だろう
2020/07/21(火) 20:10:11.93ID:zwiBtbEn0
>>583
そそ、そういうこと。
んで複数のソースを include するだけのファイルを作って、それのことを makeファイルと言うんだと思ってた。
585デフォルトの名無しさん (アウアウエー Sa02-rGUB)
垢版 |
2020/07/21(火) 22:42:16.68ID:nbzaQebba
依存ファイル集める方がよほど知識が要りそう
586デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 15:51:53.55ID:xRlBM5RB0
このコード最適化の余地ある?-O3でやっても1900msとかかかるんだけど

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

int f(int size, int *data1, int *data2) {
int r = 0;
for (int j = 0; j < 100; j++) {
for (int i = 0; i < size; i++) {
r ^= data1[i] & data2[i];
}
}
return r;
}
587デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 15:52:29.23ID:xRlBM5RB0
int main(int argc, char *argv[]) {
int size = 1000 * 1000 * 100;
int *data1 = (int*) malloc(size * sizeof(int));
int *data2 = (int*) malloc(size * sizeof(int));

//setup test data
srand((int) time(NULL));
for (int i = 0; i < size; i++) {
data1[i] = rand();
data2[i] = rand();
}

int sec, millisec;
struct timeb timebuffer;

//start
ftime(&timebuffer);
sec = timebuffer.time;
millisec = timebuffer.millitm;
588デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 15:52:35.64ID:xRlBM5RB0
// benchmark
int r = f(size, data1, data2);

// end
ftime(&timebuffer);
sec = timebuffer.time - sec;
millisec = timebuffer.millitm - millisec;
millisec += sec * 1000;

printf("%d ms \n %d", millisec, r);

free(data1);
free(data2);
}
2020/07/22(水) 16:01:48.88ID:lGyqioywH
f()で0返せばいいんじゃね?
590デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 16:06:36.57ID:xRlBM5RB0
たしかにrが0になるが
たぶんsrand, randで値の分布が一様じゃないせいか?
Javaとの性能比較してたんだけど乱数生成法が合わせれないな
591デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 16:07:57.00ID:xRlBM5RB0
あ違うなsizeがでかすぎると0になっちゃうのか
2020/07/22(水) 16:11:34.79ID:1buRSft90
Java(VM)とCという言語の比較をしたいのかこのソースを最適化したいのかrandの仕様を統一したいのか意味不明だわ
593デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 16:21:46.25ID:xRlBM5RB0
JavaとCの性能比較で「Javaは高速だCに負けてない」とか
「JITやGCが動作する時に遅くなるだけだ」とか良く言われてる。
でもこういう単純な配列処理でCの方が3倍くらい速いよな、と思って。
この処理は計測中にヒープ割当が無いからGC関係ない(Javaでオブジェクトを作成するとGCのためのオーバーヘッドがあるらしい)。
JavaでJIT効かせてから計測してもCが4倍弱速かった。
最初1900msもかかるといってたのは勘違い。Cの方が4倍弱速いから予想通りの性能だった。

Javaの性能に関する言説を見渡しても、なぜこういう処理でJavaが遅いのか説明が無い。

大量のデータを処理しつつ特定の値に収束しない良いベンチマークコードがあればいいんだが。
足す引きを交互に繰り返すか。
2020/07/22(水) 16:24:26.21ID:t6q0HDDX0
>>586
data1[i] & data2[i] の計算を100回もやることはないから
int f(int size, int *data1, int *data2) {
int *data3 = (int*) malloc(size * sizeof(int));
for (int i = 0; i < size; i++) {
data3[i] = data1[i] & data2[i];
}
int r = 0;
for (int j = 0; j < 100; j++) {
for (int i = 0; i < size; i++) {
r ^= data3[i];
}
}
free(data3);
return r;
}
ってやると多少速くなるかも
あとは分割してスレッドで並行して実行するとかかな
595デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 16:26:57.20ID:xRlBM5RB0
これで収束しないし毎回ランダムな結果になる。

long f(int size, int *data1, int *data2) {
long r = 0;
for (int j = 0; j < 100; j++) {
for (int i = 0; i < size; i++) {
r += data1[i] - data2[i];//ここ変えた
}
}
return r;
}
2020/07/22(水) 16:34:17.16ID:lGyqioywH
なんだ、^ の意味わかってなかったのか。
ていうか、コードの最適化を求めるなら、
そのコードの目的のほうが先に存在するはずじゃないのか?
コロコロ変えてさあ最適化しろとかおかしいだろ。
597デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 16:39:25.22ID:xRlBM5RB0
0になってたのは^じゃなくて&が原因だろ
2020/07/22(水) 16:42:01.87ID:lGyqioywH
^ だよ
最後のやつで + を ^ にしたらどうなる?
599デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 16:44:20.78ID:xRlBM5RB0
あr=0でr^=使ってたからか
演算子の意味じゃなくてr=0で始めてる事との整合性に気付いてなかった
r = rand();
r ^= data1[i] ^ data2[i]
これなら収束しないはず
2020/07/22(水) 16:46:16.22ID:lGyqioywH
それ、最初の rand の値が返るだけだから。
601デフォルトの名無しさん (エムゾネ FF33-keh3)
垢版 |
2020/07/22(水) 16:56:43.54ID:J+LKPgcIF
もしかして残念なベンチ
2020/07/22(水) 17:05:53.92ID:lGyqioywH
目的の明確でないベンチマーク作っても無駄だよね。
何を調べたいの?
2020/07/22(水) 17:19:08.68ID:1buRSft90
> この処理は計測中にヒープ割当が無い
って書いてあるけどガッツリ malloc してるし本当に何がしたいのか良く分からない
2020/07/22(水) 17:34:24.16ID:Y73iWKLTd
全ての値を偶数回^すれば答えは0になって当然
605デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 17:58:11.98ID:xRlBM5RB0
>>600
なんで代入されないんだ?

>>602
>>593
>こういう単純な配列処理でCの方が3倍くらい速い

>>603
「計測中に」はstartとendの間にという意味。
2020/07/22(水) 17:59:58.58ID:HrEyCXiAd
>>586
大いに改善の余地あり
0になることを仮定せずに真面目に計算するとして

データがメモリがキャッシュに入るとすると
計算の依存関係ありまくりだから
ほぼレイテンシ待ちになる

ループ4周を展開して
rを4個に分けるだけで速くなりそう

SIMD命令が使えるなら
非常に効果がある形なので
使えるなら使う
この場合も演算の依存関係は減らすこと

データがキャッシュに収まらないなら
メモリ速度で決まるからあまり関係ない
607デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 18:03:43.69ID:xRlBM5RB0
代入されないんじゃなくて偶数回^すると元に戻るのか
2020/07/22(水) 18:04:59.81ID:YNla03BQM
>>605
> なんで代入されないんだ?

代入はされているが、100が偶数だから >>604 の言うように0に戻ってるだけ。
609デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 18:09:25.81ID:xRlBM5RB0
二重ループにして外側が偶数回だからか。
「同じ乱数列を偶数回XOR走らせたら元に戻る」と。
>>600>>604が言ってるのはそういうことか

勉強になった
610デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 18:12:28.77ID:xRlBM5RB0
あーじゃあr=0で始めてたことは関係無くて、
単に二重ループの外側が偶数回だと無意味だと。
r=0で始めてもXORならちゃんとビット列変わってたけどXORの性質から元に戻ってたと。
コンパイラがそれ知ってたら最適化して処理消しちゃうから良くないな。
XORのその性質を知らなかった
611デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 18:26:49.94ID:xRlBM5RB0
より正しく述べておこう
・1回でも101回でも同じ結果なのでXOR版では二重ループの外側が無意味
・data1, data2がどんな数列でもXORの性質は同様にある

ID:lGyqioywHとID:YNla03BQMはこれを言ってたんだな
612デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 18:26:50.13ID:xRlBM5RB0
より正しく述べておこう
・1回でも101回でも同じ結果なのでXOR版では二重ループの外側が無意味
・data1, data2がどんな数列でもXORの性質は同様にある

ID:lGyqioywHとID:YNla03BQMはこれを言ってたんだな
2020/07/22(水) 19:03:36.52ID:YNla03BQM
かようにベンチマークっていうのは難しいんだ。
CPUの比較をするだけでもいろんな提案があって
SPECとかはなんとか信頼されているが、
言語間の性能比較とか素人が適当にでっち上げても、
そのプログラムが悪いだけじゃねってなるのがオチ。
2020/07/22(水) 21:28:34.34ID:EzFbgF7R0
最終的に 0 になるだろけど、この計算は愚直に行われるんでしょ。
答えが 0 にしかならないことと C と Java の速度差がそうなることとはまた別の話だよね。

って、コードの最適化の話だったんだっけ?
615デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 22:22:42.43ID:xRlBM5RB0
Cがこの処理でJavaより3〜4倍速い事は確認できた。
0に収束する事とそれは無関係。

以下、一応書くけど完全にスレ違い。

このような単純な配列処理でCとJavaの速度差がなぜ生じるか?はまだ分かってない。
・HotSpotは配列の境界チェックを除去できる
・一般論としてJavaが遅くなる原因としてJITやGCが挙げられるがこの単純なプログラムではそれらの影響はない

予想
・1命令で処理できるサイズが違っている?約4倍の速度差はベクトル演算の差で説明できそう。
だとしたらなぜJavaのJITはそれをやらないか?
・CPUキャッシュの問題?Javaの場合CPUキャッシュが別の何かで埋まってしまっている可能性
616デフォルトの名無しさん (ワッチョイ 69e6-A04g)
垢版 |
2020/07/22(水) 22:30:57.82ID:1buRSft90
自分のブログでやって
2020/07/22(水) 23:08:24.67ID:G9I2XdZp0
そもそもjavaがc/c++並に速いとか、かなり嘘や誤魔化し入っているから
速度差3-4倍で済むなら十分健闘している

javaのコードを移植して、無駄にmalloc freeしまくったりする糞コードならもっと迫れるだろうけど
2020/07/23(木) 02:25:27.91ID:tfGyNQFW0
>>615
そもそもJITが吐くバイナリを逆アセンブルして比較しなきゃしょうがないんでね?
そのようなことが可能かは知らないけど、処理中にデバッガで無理矢理止めればわかりそうな気はする
2020/07/23(木) 04:09:18.13ID:NaEhWCW1K
最初の>>586の問いがベンチマークを意図してるとは思われてなかったから{return 0;}で良いんじゃね?ってなったんでは
2020/07/23(木) 11:21:03.05ID:TTqTgaIL0
javaの配列は特別な宣言無しに別スレッドでこっそり書き換えてもちゃんと反映されるわけだから、単純処理であっても最適化にも限界があるだろうな。
Cの場合は、他で書き換えられるかもと指定しておかなければ他所のことなんておかまいなしに処理できるから、その点だけでも有利だよね。
>>586 のコードのなら、i のループに入る前に data[j] を変数に取り置いて i のループ内で使用するようにすれば、java の方では高速化されるんじゃね。
C ならそれをコンパイラがやってくれてそう。
2020/07/23(木) 11:24:21.68ID:TTqTgaIL0
逆にCの側で配列を volatile にしておけば Java との速度差は小さくなるかもね。
2020/07/23(木) 11:26:24.50ID:V2V2cZYad
data[j]なんかないけど
2020/07/23(木) 11:46:46.14ID:vtZyy6ICM
じゃあjava.util.concurrent.atomic以下にある配列クラスは全部廃止だな
624デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/23(木) 12:46:54.76ID:tYvDqilk0
ベクトル演算の未適用が原因だとほぼ特定できた。
2020/07/23(木) 13:17:22.41ID:V2V2cZYad
>>587
巨大サイズメモリで簡単な演算だから
ほとんどがメモリアクセス時間だろ
2020/07/23(木) 13:19:58.21ID:V2V2cZYad
簡単な処理のために巨大メモリをスキャンするのは超無駄
627デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/23(木) 13:51:39.59ID:tYvDqilk0
C版
size
1000*1000 * 1 20ms
1000*1000 * 10 191ms
1000*1000 * 100 1893ms
線形な変化だからCPUキャッシュに載り切るかで性能が分かれるという事が生じてない。
たぶんCPUキャッシュは「繰り返し使うデータ」じゃないと有意義じゃない。
この処理だとCPUキャッシュ上のデータを排除可能になるまでの時間がボトルネックで、
つまり「CPU上のデータを処理しきって次の要素を受け付けれるようになるまでの時間」が支配的なはずで
そこがベクトル演算で高速化してる。

Java版も線形に変化した。

で、Javaのコードでr += data1[i] + data2[i]のところでdata1のみにしたら2倍速になったからベクトル演算未適用が原因でほぼ間違いない。
その行で+か-か^か&かは結論に影響しない。
2020/07/23(木) 13:55:19.10ID:TTqTgaIL0
>>622
ほんとだw
data1 か data2 かは置いといてもどっちも i を添字とするループか。
マトリクス状に組み合わせてるんだと錯覚してたすまん
2020/07/23(木) 14:11:44.83ID:TTqTgaIL0
>>623
値が volatile なことと操作が atomic なことは別の話だよ。
自分が書き換えない同じ領域を複数参照するとき、それを他の誰も書き換えないならその参照は一度目の値と同じになる前提で最適化できるけど、他の誰かがいつの間にか書き換えることがあるならそういう最適化はできなくなる。
そういう領域であることを明示するのが volatile。
atomic は同じ領域を誰かが書き換える前提なので基本的にその領域は volatile だけど、それに加えて値を参照して手を加えて書き戻すなどの一連の手続きの途中で他の誰かにいじられないことを保証すること。
それを CPUレベルの命令で行うかソフトウェア的なロックで行うかで色分けされてるだけ。
2020/07/23(木) 14:28:36.26ID:V2V2cZYad
>>627
CPUは何?
2020/07/23(木) 14:33:33.27ID:V2V2cZYad
メモリアクセスの影響がないなら

iとjのループを入れ換える
ループアンロール
rを偶数奇数で分ける
SIMD

などが有効
2020/07/23(木) 14:36:26.08ID:V2V2cZYad
>>627
同じメモリに100回アクセスしてるんだから
メモリサイズが小さければキャッシュが効くはず
633デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/23(木) 14:42:55.39ID:tYvDqilk0
>>632
確かにそうだ。
でも1000 * 100も試してみたが2msで線形だった。
2020/07/23(木) 14:44:16.58ID:V2V2cZYad
CPUは何?
2020/07/23(木) 16:21:21.26ID:WGvvEAFm0
>>629
別スレッドからの値の書き換えについて話をしていたよね?
だったらvolatileは何も保証してくれないよ
2020/07/23(木) 16:39:16.32ID:TTqTgaIL0
>>635
保証ってなんの話?
2020/07/23(木) 20:41:12.28ID:j3eQi4Nn0
>>629
分かってると思うけど誤解なきよう勝手に補足するけどvolatileの最適化抑制はreadだけではなくてwriteに対してもな。
ドライバ書いてる人には常識レベルだけど。
638デフォルトの名無しさん (ワッチョイ 13ad-5TCi)
垢版 |
2020/07/24(金) 03:10:38.82ID:6ZonvnML0
volatile ってスレッドに限らず値が知らない内に変化する可能性のある何かの入力でも使うよね。
例えばマイクから拾った音を A/D 変換した値がメモリマップドI/Oで特定のアドレスのメモリ読む方法で読める場合。
CPUが予想不能な形で値がコロコロ変わるので volatile にせざるを得ない。(volatile って揮発性とか不安定って意味だし、言葉の意味そのままだ)。
これは読む側だけど書いて何かを出力する場合も、書いた値を読めないような作りになっている場合もある。
1を書いたのに直後に読むと0だったりなんていう事はあり得る。要するに一々覚えていない。または覚えていても読み出しに対応していない。
そんなハードウェアが接続されていたらそうなる。
2020/07/24(金) 04:44:18.69ID:So4dssPK0
そりゃ、外部装置と連動しているから、値がいつ変わるか分からない

外部装置が読み書きしたら、合図として、0.1ms 後に、値を反転させたりとか、
色んな事をするから、予測できない
2020/07/24(金) 09:33:19.23ID:ASBY7bf4M
volatileは変数(I/Oアドレス)に対するアクセス行為は保障するけど値そのものに対しては何の意味もない
そもそも外部要因で変化する値に対して干渉するのは不可能
2020/07/24(金) 10:20:02.92ID:4h264/iA0
どこから干渉するとか出てきたんだ…
知ってる知識を開陳したくてしょうがないんだろうなw
2020/07/24(金) 15:22:34.69ID:jNVRIcub0
volatileな変数を読むのは怖いよね
ワード単位ならいいけど、構造体読むときはチェックサム欲しくなるよね
2020/07/24(金) 18:25:04.01ID:ogZVfXfN0
別に怖くはないだろ。
他所と排他するなりしかるべきタイミングでアクセスすればいいだけなんだから。
排他や同期が必要な領域にそれをせずにアクセスするならただのアホってだけで、volatile がどうとかいう話じゃない。
2020/07/24(金) 20:10:16.16ID:Cmq7VG8v0
LL/SC命令が結構使える
2020/07/25(土) 04:21:09.10ID:qNFJliza0
>>642
それはatomicとかクリティカルセクションの話であって
volatileで何とかしようという発想がそもそも間違いだ
2020/07/26(日) 03:07:46.88ID:4oXiyEBn0
「書きこんだものの読み込んでないからコードから消しちまえ」
「読み込んでるけど、代入以降値がかわる気配がないから、読み込みを止めて固定値にしちまえ」
これを抑制するだけ
書き込や読み込みを記述通り生き残らせる
2020/07/26(日) 08:34:28.91ID:M65fvK3w0
W=>R : R省略
R1=>R2 : R2省略
W1=>W2 : W1省略
2020/07/26(日) 10:41:35.23ID:3q3cv3BJ0
volatile覚えて嬉しいのはわかるけど…
2020/07/26(日) 11:55:59.05ID:7t5aGHPkd
volatileの意味を知らない人 vs volatileを覚えたての人
2020/07/26(日) 12:24:46.27ID:oYG2ZyVyM
vs 30年前の常識で語る人
2020/07/26(日) 13:35:18.59ID:6eSsd+mZ0
ANSIは邪道。
652デフォルトの名無しさん (ワッチョイ 13ad-5TCi)
垢版 |
2020/07/26(日) 18:14:24.05ID:hRZi6+cn0
あんししー
2020/07/26(日) 20:08:24.24ID:VBmKLhih0
アンジー、なんてこと言うの
シー
2020/07/27(月) 02:57:00.46ID:BRKetx390
30年くらい前までドヤる人が好んで口にしてたけどね
そういう人はC89ができたらピタリとやめた

今まだ言ってる珍獣って何なん?
2020/07/27(月) 08:26:00.92ID:IvOd7acF0
姫宮アンシー
2020/07/27(月) 16:25:16.57ID:BRKetx390
C89以前のK&R Cは個人的には好きなので
gcc -traditional復活して欲しい
2020/07/27(月) 16:41:53.18ID:euzbjA/F0
関数定義で引数が()の外に書かれる記述みると、
今は違和感が湧いてしまう
2020/07/27(月) 16:45:47.58ID:IvOd7acF0
書き方が違うだけなら古いスタイルでもいいんだけど、型チェックが緩いんだよな。
2020/07/27(月) 17:14:06.93ID:BRKetx390
アセンブラ屋出身の俺っちにはどうでもいいことだ
2020/07/27(月) 17:35:58.30ID:IvOd7acF0
引数の数を間違えているのに黙って通してしまう例。

https://wandbox.org/permlink/FEu474UVSsilTq0L

最適化オプションを付けたらフロー解析も強まるのか警告してくれたけど。
661デフォルトの名無しさん (ワッチョイ 13ad-5TCi)
垢版 |
2020/07/27(月) 18:50:57.45ID:8GZ2GqSj0
その他の例
https://wandbox.org/permlink/gz8u1YkarV3RuM1M
2020/07/27(月) 23:59:05.30ID:UIY75t8S0
スタックが壊れないならまあいいんじゃね?
2020/07/28(火) 03:43:48.32ID:JnUAmZD/0
あのなあ、おまえら。。。。
K&R Cに対する批判なんて今さらドヤるか?
規格Cを憶えるときにプロトタイプは何のためか
説明受けてないやつがここにいるとでも思うのか?
664デフォルトの名無しさん (アウアウウー Sa5d-d0Nl)
垢版 |
2020/07/28(火) 13:28:44.28ID:DVrEteyfa
(キリッ
2020/07/28(火) 19:40:24.44ID:1JEs8/dl0
"#C-PLA" という店名をどう思いますか。
2020/07/28(火) 19:48:32.54ID:cWad1kwo0
>>663
やっぱり C99 or later を叩くのがかっこいいですよね
2020/07/28(火) 20:02:16.84ID:geCJz7H80
>>665
オブジェクトをカプセル化・・・?
668デフォルトの名無しさん (ワッチョイ fa94-UdrD)
垢版 |
2020/07/29(水) 17:10:37.12ID:tqWMyndD0
浮動小数の演算で生じる誤差は常に絶対値が小さくなるように行われる、
という前提は正しい?
669デフォルトの名無しさん (ワッチョイ fa94-UdrD)
垢版 |
2020/07/29(水) 17:11:14.42ID:tqWMyndD0
C限定の話じゃないからスレ違いか
670デフォルトの名無しさん (ワイーワ2 FF62-lIev)
垢版 |
2020/07/29(水) 17:12:49.06ID:hY/5h1XOF
日本語として可笑しいのでgoto語学板へ
2020/07/29(水) 17:14:56.87ID://053udPa
>>668
正しい気がする
2020/07/29(水) 17:18:22.13ID://053udPa
>>668
ごめん嘘ついた。
2020/07/29(水) 17:21:06.57ID:8sSsdFab0
>>668
ライブラリやFPUの実装の話だね

例えばだけどIEEE754の定義では
仮数部は1.xxxxxxと、整数部が常に1なので
整数部を省き、その分の1bitを小数部に回す「ケチ表現」で
誤差がなるべく小さくなるように工夫している
2020/07/29(水) 17:25:55.07ID:Bu6uxHFv0
>>668
浮動小数点制御ワードの設定によっては丸め方向が変わるから、必ずしもそうだとは言えないかも。環境によるのかもしれないけど、詳しくは知らない。
_controlfp_sとかでググってみて。
675デフォルトの名無しさん (ワッチョイ fa94-UdrD)
垢版 |
2020/07/29(水) 17:28:44.72ID:tqWMyndD0
doubleを分解(0.1や0.3とかでかけて複数のdouble値にする)して足し合わせて比較、
という処理を無限回繰り返して元の絶対値を超えていたら停止、
みたいなテストコードを書いてみたけど、低確率で元の絶対値を超える。
この誤差が分解と足すときどちらで生じているか分からないが
なんにせよ浮動小数点数演算の誤差で絶対値が増加する場合があるようだ。
2020/07/29(水) 17:45:17.74ID:8sSsdFab0
あ、誤差の絶対値ではなく、結果の絶対値ということ?
俺の勘違いだったら悪いんだけど、それじゃ意味なくね?
結果が正数ならともかく負数の場合デメリットだけやん
2020/07/29(水) 18:11:52.28ID:+Q7sP3F+d
丸めモードによって変わるだろうに
絶対値が小さくなるのはround toward zeroにしたときだな
2020/07/30(木) 05:23:55.72ID:82YOHtIh0
Cのソースコードを解析するツールで有名なものって何かありますでしょうか?
679デフォルトの名無しさん (ワッチョイ ce8c-LW7E)
垢版 |
2020/07/30(木) 06:42:57.43ID:ixil7w/z0
上司がこっそり使っていた cflow
2020/07/30(木) 07:04:40.85ID:SsIpxIlu0
>>668
加減乗算のほとんどの実装ではそう
681デフォルトの名無しさん (ワッチョイ 0101-iVY1)
垢版 |
2020/08/10(月) 04:07:37.60ID:SKFyjjt90
デファクトスタンダードなCのコーディング作法を手っ取り早く
身につけるために何をすべきですか?
682デフォルトの名無しさん (ワッチョイ 0101-Ea0s)
垢版 |
2020/08/10(月) 04:47:16.15ID:o5h87VM/0
所属がわからないと何とも言えませんね。
社名と部署お願いします。
2020/08/10(月) 04:53:08.55ID:P+mDn/zj0
車載の組み込み系以外は
それぞれの会社にコーディング規約あるんじゃない?
知らんけど
684デフォルトの名無しさん (ワッチョイ 1b8c-oftG)
垢版 |
2020/08/10(月) 06:50:01.64ID:ruBmk/3z0
お手本のプログラムを上司に見せてもらい完コピする。
2020/08/10(月) 06:53:36.45ID:k2ud7k4K0
>>681
組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006

この研究会は、トヨタなど大企業から、数十人のベテが集まって、
欧州人に聞きながら、作った本

未だに、コーディングルールのバイブルだろ

元々は、Andrew Koenig の本

C Traps and Pitfalls, 1988, c1989
Cプログラミングの落とし穴
2020/08/10(月) 07:14:44.55ID:JYoLJZbsH
>>685
>数十人のベテ
司法試験板をみると「ベテ」というのは30代以降の複数回受験者のことらしいですよ
文脈によっては veteran は階級を問わず退役軍人を意味することもありますし‥‥「わしが現役の頃には」を壊れたレコード盤のように繰り返すイメージとか
ベテランという言葉に必ずしもプラスイメージが伴っているとは限らないことはしっておいたほうがいいんじゃないですか?
2020/08/10(月) 07:23:02.78ID:tfnxCl0S0
能書きはいいから内容を見ろや

あれを見てくだらねえと思うことが何もないやつは
自分がなさすぎだ
688デフォルトの名無しさん (ワッチョイ 0101-iVY1)
垢版 |
2020/08/10(月) 09:47:53.28ID:SKFyjjt90
>>682-684
なるほど,やっぱり利用場面とか会社の文化などで
全然違ってくるんでしょうかね

>>685
ありがとうございます.見てみます.
689デフォルトの名無しさん (エムゾネ FF33-SiUo)
垢版 |
2020/08/10(月) 11:57:46.08ID:wInlBSoOF
何も知らないなら手あたり次第写経してみ
それで何でこんな描きかたになってんの?
ってここで質問繰り返せば良い
みんな暇だから答えてくれるはず
690デフォルトの名無しさん (ワッチョイ 895f-Ea0s)
垢版 |
2020/08/10(月) 14:56:52.81ID:xpVmb7Uo0
printfってどれだけメモリ使うんですか?
2020/08/10(月) 15:00:54.55ID:tfnxCl0S0
実装による
以上
2020/08/10(月) 15:02:14.80ID:7NjJFrXk0
printf()の戻り値は本当に捨てて良いんですか?
とか
2020/08/10(月) 15:36:42.46ID:tfnxCl0S0
返却値の意味くらい知ってる?
2020/08/10(月) 15:44:16.59ID:cUENozhv0
だいたいの戻り値は無視してよいよ
2020/08/10(月) 15:50:24.83ID:tfnxCl0S0
アホ
2020/08/10(月) 16:38:24.39ID:BXZAjCBt0
>>692
捨てては駄目だな。答えが表示できなくなる。

#include <stdio.h>
int main()
{
 printf("%d\n",printf("1+2+3="));
 return 0;
}
2020/08/10(月) 18:19:20.30ID:tfnxCl0S0
返却値を捨てて良いか否かを他人に聞いて
そこに固執する教条主義者か
いかにもMISRA大好きそうだな
2020/08/10(月) 21:28:34.35ID:CQsKBDF30
MISRA〜ヤ MISRA〜
2020/08/10(月) 21:32:33.10ID:JYoLJZbsH
MISRA も、MISRA 対応性的解析ツールを公開してくれていてもよさそうなものですが‥‥ただで
2020/08/10(月) 22:13:11.57ID:DZgybkpe0
性的解析...
2020/08/11(火) 01:09:34.46ID:EJAYjJkN0
MISRA だって MISRA を採用する場合に何がなんでも全ての項目に準拠しなければならないというわけではない。
(逸脱する場合には文書化しておくことを推奨してはいるが。)

ただ、気を付けなければならない箇所がまとめられているというのも間違いないので、
目を通すくらいのことはしたらいいんじゃないの。
俺は読んだことないけど。
2020/08/11(火) 07:47:01.13ID:SWJYIPbx0
規格、仕様の奴隷
2020/08/11(火) 07:50:09.41ID:RSsrE9PW0
俺は規格や仕様に縛られないで自由にプログラミングするのさ
翼が生えた蛙みたいにケロケロいいながら大空を羽ばたくのさ
2020/08/11(火) 08:12:17.68ID:cZN35xi70
いや規格は守らなきゃ
工業人の法律みたいなもんだから

MISRAの話がどう化けると仕様になるのかは意味不明
2020/08/11(火) 09:12:05.23ID:02tHA6AW0
>>704
規格が法律に例えられるように、MISRAは憲法になぞらえることができる
2020/08/11(火) 09:29:25.90ID:nKBbqh2w0
>>705
なんでMISRAの方が規格より上位なんだよw
せいぜい一地方都市の条例程度のものだろう
707デフォルトの名無しさん (ワッチョイ 13a5-w77N)
垢版 |
2020/08/11(火) 11:41:57.49ID:l01whKN50
でもやっぱりどれくらいMISRAに準拠してるかチェックするツールが全く出てないのは不自然
もしかしてMISRAって目視チェックを前提にした規格なのか?
それとも企業で門外不出のツールになってんのか?
2020/08/11(火) 11:44:29.40ID:cZN35xi70
【手を挙げて】横断歩道を渡りましょう
 ↑
この程度だよ

憲法だの条例だのと違い司法機関は相手にしない
2020/08/11(火) 11:46:02.07ID:XFONBlSQM
小池百合子が掲げるフリップみたいなもんだろ
今年の夏は特別な夏です、破廉恥なコードは自粛しましょう
2020/08/11(火) 12:17:39.96ID:gJF+/AhQ0
「警報!侵蝕されてます!パターン青です!コードを切り離せません!」

夏はこれ
2020/08/11(火) 12:28:40.57ID:RcrtMjNU0
>>707
全くて、市販の静的解析ツールならいくつかあるじゃん。
2020/08/11(火) 13:59:44.70ID:QMJ1Ew+q0
おまえらミスラの話と見せかけて髻(みずら)の話につなげようとしてんだろ
どうせここで髪の話して俺の悪口言う魂胆なんだろ
おまえら最悪だな
2020/08/11(火) 14:47:19.21ID:nKBbqh2w0
>>712
髻なんて糞、そんな下らないものを気にする奴は馬鹿、という流れでお前さんへのエールのはずだったんだ
714デフォルトの名無しさん (アウアウウー Sa55-1t4k)
垢版 |
2020/08/11(火) 18:54:59.41ID:j5xuOst8a
きみはこう言いたいのでしょう
ヅラはどこだ!
2020/08/11(火) 19:18:03.85ID:IiIy4i0JH
>>711
MISRA の対応するコメントを付けてくれる性的解析ツールは、無料で提供されるべきでしょう、業界標準を目指すのなら
2020/08/11(火) 20:25:37.46ID:RcrtMjNU0
>>715
規格書の類すらみんな有償なのに夢見すぎ。
そもそもMISRAって金も出せないアマチュアに使ってもらうようなものでもないしね。
2020/08/11(火) 20:31:23.80ID:IiIy4i0JH
>>716
でも MISRA の対象者レベル設定ってアマチュアレベルでしょう?
2020/08/11(火) 21:02:15.95ID:RcrtMjNU0
金取るかどうかの話をしているのにレベルの話を持ち出したのは意図的に話をそらしたわけ?
それとも日本語をちゃんと理解できない?
2020/08/11(火) 21:19:03.39ID:IiIy4i0JH
>>718
無論、前者ですね、というかモノの値段はその価値と深い相関があるのが普通でありマトモだとも思いますから、
支払う価値の話に対して対象レベルの話を持ち出すことは、あながち間違っているとはいえないでしょう?
2020/08/11(火) 21:46:45.35ID:RcrtMjNU0
言ってることがむちゃくちゃすぎw
やっぱり日本語もダメだろ
2020/08/11(火) 23:30:38.44ID:X5c8vKvD0
VSCode の拡張機能で、misra で検索すると、これが見つかる

Parasoft C/C++test Standard
https://marketplace.visualstudio.com/items?itemName=parasoft.vscode-cpptest
https://docs.parasoft.com/display/CPPTEST20201

C/C++ Static Analysis, Safety and Security Coding Standards,
MISRA C 2012, AUTOSAR C++ 14, CERT C/C++, and others.
2020/08/12(水) 05:43:26.21ID:/aSZJl0C0
>>717
アマチュアとアマチュア以外の定義を述べよ。
2020/08/12(水) 08:33:57.98ID:YginzyYa0
プロってどの位のレベルなのかに興味津々なんだろうな
サンプルがなくてw
2020/08/12(水) 09:52:08.77ID:3JHviGe70
複雑になっても自分で何を作っているのか理解しているかしていないかぐらいの差じゃないの?
2020/08/12(水) 13:20:01.63ID:UG+oufucH
>>722
トータル 1 万ステップ以上のプロジェクトを扱ったことがあればプロ、そうでなければアマ、というのはどうでしょうか?
無論、私は後者です
2020/08/12(水) 13:35:54.95ID:+rovT3b20
ステップ数なんて飾りだよ
2020/08/12(水) 14:22:01.62ID:XADAagqaM
業として行っている個人やそのような組織に属しているのがプロ
728デフォルトの名無しさん (ワッチョイ 468c-1RiF)
垢版 |
2020/08/12(水) 15:57:15.32ID:yGflmyFx0
捕まる泥棒はアマ、捕まらないのはプロ。
2020/08/12(水) 16:07:40.09ID:YginzyYa0
ステップ数って・・・まさかマジで言ってるのか?
2020/08/12(水) 16:15:20.08ID:aKiWlwPm0
それを生業にしてるならヘボかろうがプロではあるな。
んで世の中ヘボが相当数いる。
百人単位のプロジェクトになると7割はヘボ。
入社したてのほとんど何もできない新人君とかも混ぜ混んでくるし、本当にひどい。
でもみんなプロ。
731デフォルトの名無しさん (エムゾネ FF62-jwrZ)
垢版 |
2020/08/12(水) 16:20:10.06ID:mptqcK2nF
人件費稼ぐために頭数合わせてるだけ
2020/08/12(水) 17:46:51.14ID:wD9I21LT0
プロアマの基準にステップ数なんざ関係ないが1万程度1人で組める規模じゃん
成果物で金稼いでりゃプロで良いと思うし、プロでもひどいの居ればアマでもすごいのは居る
2020/08/12(水) 17:56:25.37ID:UG+oufucH
>>732
>成果物で金稼いでりゃプロ
なるほど‥‥感心しました
2020/08/12(水) 18:20:24.44ID:WoaeeAs50
長時間労働に耐えられる体力があるのかもしれんし、
有力者に取り入る能力が高いのかもしれんし、
幸運値が高くてなんとなくやっていけてるのかもしれん。

それも成果。
2020/08/12(水) 23:23:26.75ID:/aSZJl0C0
ユーザーからしたら、どんなクソコードが走ってようがテストされ尽くして品質保証がされていてちゃんと動いてるならどうでもいいよ。
開発者からしたら、クソコードは工数が膨れ上がる原因になるからやめて欲しいけど。
そして品質保証プロセスがあると面倒臭いルールだらけで足止めを食らうからそういう世界では開発したくない。
でも、MISRAとかはそういう面倒臭いルールで品質を保証するためのもので、辛い開発プロセスを我慢して製品を作り上げられるのはプロの開発者だと思うよ。
それなりに優秀な人、ぐらいだとアーキテクチャを知り尽くしているところまでは行ってないと思うし、
思わぬところで不具合を発生させてしまうものだから。
エレガントなコードかつ、品質の保証範囲も広いコードを書ける開発者なんか極少数なんだからミッションクリティカルなところでは規約で縛ってくしかないと思うよ。
2020/08/13(木) 06:04:03.36ID:UjRsJ9BY0
本書いてるやつらの個人的な好みだの
大事にしたところで結局使えねえバカに合わせろだのと
くだらねえことばかり分厚い本1冊渡してすべて読んで従えなんてやると
やる気なくさせるだけだ
737デフォルトの名無しさん (ワイーワ2 FF8a-jwrZ)
垢版 |
2020/08/13(木) 10:30:22.58ID:m1xh97jBF
他人を騙すのが上手いのがプロっていうイメージ
2020/08/13(木) 10:37:21.72ID:b3k2BUbg0
著者の好みとか、そういう次元ではない

日本の大企業のトップ、50人が集まっても、誰も規格を知らない。
規格の研究は、それだけで何十年も掛かるから、開発者ができない

基本、企業には、そういう開発しない人は、いらない

だから日本には、規格に精通した研究者がいなくなった。
江添亮ぐらい

だから、欧州のMisra-C に聞きながら、作った。
でも、欧州側にも詳しい香具師がいないのは、同じ。
日本側が、欧州側の間違いを訂正したりもしてる

企業としては、規格だけを何十年も研究しているような香具師を雇わないのだろう。
だから、まぎれなく書かないと、誰も規格を調べられないから、困る
2020/08/13(木) 11:16:30.65ID:UjRsJ9BY0
馬鹿か
家電量販店くらい覗いてみろ
新規格が発表されるたびにメーカー各社いち早く対応製品出してるだろ
740デフォルトの名無しさん (ワッチョイ 9901-E2Bm)
垢版 |
2020/08/13(木) 11:32:05.85ID:VDPM7Buu0
成果物という言い方に違和感。

普通に製品で良いのでは?
2020/08/13(木) 11:37:09.38ID:YgH3wASL0
>>740
製品作ってるわけじゃないからな
2020/08/13(木) 11:37:44.29ID:nPN4GQVV0
コンパイラの新しい規格が決まりました
対応する新製品、本日発売です
2020/08/13(木) 12:02:05.37ID:oBQ5L51M0
>>738
前々から馬鹿だとは思ってたが、ここまで馬鹿だとは
2020/08/13(木) 12:25:23.76ID:UjRsJ9BY0
>>742
まさかとは思うがイヤミのつもりか?
2020/08/13(木) 12:35:10.28ID:l61yvHm+0
社内で使うツールなんかも製品なんていうのか?
むしろ成果物のほうが一般的に使う用語だと思うぞ
もしかしたら業界によって違うかもしれんが
大体の業界でプログラムだけで製品にならんからな
2020/08/13(木) 12:37:35.56ID:jTOLwBsaM
>>740
成果物は製品に限らんから
テストコードや、テストデータ、テスト結果のドキュメントとかもあるし
747デフォルトの名無しさん (ワッチョイ c2a5-by2p)
垢版 |
2020/08/13(木) 13:13:16.97ID:CM5c4LB70
つまり間接成果物か。

作る意味あんのそれ
一銭たりとも稼いでないじゃん

それとも中間体なの
748デフォルトの名無しさん (ワイーワ2 FF8a-jwrZ)
垢版 |
2020/08/13(木) 13:20:07.07ID:KaPqduB6F
言葉遊びだしどうでも良いけど

副産物って言うかな
2020/08/13(木) 13:21:11.74ID:sAiv34b1d
稼いでるでしょw
そういうのでお金もらったこと無いの?
お仕事知らなすぎでしょ
750デフォルトの名無しさん (ワッチョイ c2a5-by2p)
垢版 |
2020/08/13(木) 13:41:31.84ID:CM5c4LB70
やっぱり視点がここまで違うんだな
お前にやるカネなんてどうでもいいよ
製品が稼いでくるカネに興味あるんだよ

だから間接成果物だろ

経理の奴らにだって給料渡してんのは誰でも知ってるよ
2020/08/13(木) 13:52:23.74ID:3qG7aIhA0
青果物だろ。八百屋の自覚があるのかねキミたちは。
2020/08/13(木) 14:04:17.63ID:TgMttUh/0
テストもされていない作りっぱなしの製品にお金払ってくれる顧客ばかりじゃないしなぁ
2020/08/13(木) 14:08:20.70ID:RDWqdqfD0
>>748
> 副産物って言うかな
言葉遊び以前にそれ全然違う言葉だぞw
2020/08/13(木) 14:12:24.56ID:RDWqdqfD0
>>750
まじで知らんのか?
設計とかテストだけ受託というお仕事もあるんだよ
もちろん納入したドキュメントに対してお代はいただくけど、設計書とかテスト結果報告書を製品とか言う奴はいないだろ
2020/08/13(木) 14:23:51.21ID:BqAuLMN60
会社から外に出るあらゆるものがすべて製品である、ってのなら言いたいことはわかるよ
でも個人的な感覚ではすべてを製品というのは言葉のとる範囲が広すぎる
設計書やテスト関連のドキュメントなんかを製品とは言いづらい

そういうふわっとしたもの含めてプログラマのアウトプットを一言で表すものとして成果物って単語を使ったにすぎない
2020/08/13(木) 15:20:08.51ID:UjRsJ9BY0
>>747
おまえPGとかいう以前に工業人でさえなさそうに見えるぞ
757デフォルトの名無しさん (ワッチョイ 468c-1RiF)
垢版 |
2020/08/13(木) 16:24:26.08ID:GUNSShX60
データベースかプロジェクトデータで話が通るように初めからやっとけ。
後でこれがないあれがないあるのが常識やろは馬鹿な日の丸会社に多い。
2020/08/13(木) 16:34:29.68ID:UjRsJ9BY0
PGは納品用のコードだけ書いてるわけじゃない
納品に至るまでの内輪で必要になるコードが色々あるかんな

PG経験ないやつに舞台裏の事情がわからんのは当たり前
759デフォルトの名無しさん (ワッチョイ e9e6-wj9T)
垢版 |
2020/08/13(木) 20:33:00.03ID:5JTzAfSL0
間接成果物www
2020/08/13(木) 22:12:33.85ID:uUPpxsEe0
言葉があやふやな人って本当に仕事してんのか不安になるね
761デフォルトの名無しさん (ワッチョイ 9901-E2Bm)
垢版 |
2020/08/14(金) 05:26:27.88ID:a6sLiNyt0
でもProductを成果物と訳してるじゃないですか。

これ、オープンソースは無料なので、製品と訳せなかったんですよね?

無料でも製品で良いのでは?
762デフォルトの名無しさん (ワッチョイ 9901-E2Bm)
垢版 |
2020/08/14(金) 06:17:07.84ID:a6sLiNyt0
念のため記しておきますが、成果物という言い回しは昔からよく使われていたものではなく、JFから始まったスタイルです。

つまり翻訳に起源があります。
763デフォルトの名無しさん (ワッチョイ 468c-1RiF)
垢版 |
2020/08/14(金) 06:26:00.09ID:rGV5Pz8z0
開発費だけの受け取りは不正の温床となるので必ず物の納品を義務化しています。
764デフォルトの名無しさん (ワッチョイ 9901-E2Bm)
垢版 |
2020/08/14(金) 06:39:27.33ID:a6sLiNyt0
そういう場合は、JIS用語である中間製品、半製品と言ってるじゃないですか。

オープンソースのときだけ成果物というのは違和感がある。
2020/08/14(金) 06:50:36.22ID:dINeHZlk0
>>762
我が社では、成果物という言い回しはJF以前からよく使われていたなあ。
2020/08/14(金) 09:55:53.25ID:JGhukcXO0
大企業間の契約書でも実担当者間の会話でも普通に使われる言葉だし、違和感があるのは単に自分の周りで使われてなかっただけでないかと。
767デフォルトの名無しさん (ワッチョイ c2a5-by2p)
垢版 |
2020/08/14(金) 10:01:34.96ID:SEg+bPfj0
>>754
本当に話が分らんヤツだな
先方に納めたテストは、先方で『稼働』して直接はカネ稼いでないだろ

お前がいくら貰ってようとそんなの関係ない
作ったモン書いたモンが納入先で金稼ぎのツールとして動いてるかどうか、だ
ツール使ってる側から見て、それが直接稼いでるから直接成果物だ

書いてる側の視点なんてのは本当にどうでもいい
お前がどんだけ苦労して作ったとか、作るためにカネ貰ったとか、全くそういうのは関係ないし、不要で、いらないんだ
主観まみれの感情論や精神論は気持ち悪すぎていらないんだよ

で、顧客は、エンジニアが作った器械装置やプログラムを使って稼ぎ出すカネの方に興味がある
2020/08/14(金) 10:26:56.96ID:Us3wnTKB0
マ板に移動しろ、クソども
2020/08/14(金) 10:35:04.04ID:sRXPDhxm0
>>767
>>743w
2020/08/14(金) 10:55:52.26ID:P4eFhUvDM
>>768
ルールが理解出来ない
ルールは理解出来るが守れないまたは守る気がない
こういう人は頭の悪い人だから話が通じると思っちゃ駄目だよ
2020/08/14(金) 14:35:53.28ID:5R1OsKN50
アマチュアのプロジェクトにへっぽこプログラマは参加できないが
プロのプロジェクトはへっぽこプログラマの方が多い
2020/08/14(金) 14:41:42.13ID:2wR+X/g+0
確かにハッカー集団にボーガスは入れてもらえないね
773デフォルトの名無しさん (ワッチョイ 468c-1RiF)
垢版 |
2020/08/14(金) 15:33:21.13ID:Z47jWul30
>>772
中国の方ですか
やりたいことが金もうけだけなら不動産屋はどうですか
2020/08/14(金) 15:41:56.15ID:Z2/UjnqU0
間接成果物を作るのは無駄、というのは、
顧客が絶対チェックしないんだけどなぜか成果物として要求される、
中間工程を納品用にドキュメント化したもの、を作るのが無駄と言ってるのかな

まあ、わからんでもないけどそれがあれば顧客に引き継げる場合もあるし、ケースバイケースのような。
2020/08/14(金) 16:23:44.04ID:2wR+X/g+0
>>773
???
なんで支那の話になるんだ?

もしかしてクラッカーのことをハッカーと呼ぶ手合いか?
2020/08/14(金) 17:59:05.92ID:txNZsWd8H
>>773
>やりたいことが金もうけだけなら不動産屋はどうですか
不動産は儲かるのですか?とても信じられませんね
むしろ株でしょう、それも米国株が儲かるのでは?
2020/08/14(金) 17:59:52.43ID:txNZsWd8H
>>775
あなたの世界ではどうだか知りませんが、世間一般ではハッカーとクラッカーは区別せずに両者とも単にハッカーといいます
ご存じなかったのですか?馬鹿ですね
2020/08/14(金) 18:05:29.78ID:8V/zklnR0
>>777
どこの一般だよ
お前らドカタの世界か?
2020/08/14(金) 18:05:35.24ID:2wR+X/g+0
>>777
手合いかと聞いているのを知らないからと思ってしまう
おまえさんの脳味噌こそ深刻なバグ抱えてるぜ

PGの世界でどうだか知らねえのか
マジでトーシロだな
この板では家畜以下の身分てことを自覚しろな
780デフォルトの名無しさん (エムゾネ FF62-jwrZ)
垢版 |
2020/08/14(金) 18:16:58.51ID:zY2s9ydfF
投機的な不動産投資は儲からんかも知れんが
マンションとか土地持ってて他人に貸すのは儲かるで
2020/08/14(金) 18:22:40.86ID:txNZsWd8H
>>778-779
世間一般ではハッカーとクラッカーとは区別しません、両者ともハッカーといいますね
狭い業界ではハッカーとクラッカーを区別して、いいニュアンスを持つものだけをハッカーとしたいようですが、世間はそうは見ておらずハッカーもクラッカーもどちらも危ないものという認識だから両者を区別していないのです
狭い蛸壺で自分勝手にルールを決めても、そんなことはパンピーには通用しないという、いい例でしょう、ことわざにもありますよね「井の中の蛙大海を知らず」もっとも海水に耐える蛙は私もしりませんが

そうそう、どうしてもハッカーとクラッカーを区別したいんだったら「ホワイトハッカー」という言葉はある程度認知されているようですから、それを使いなさい
早く馬鹿が治るといいですね
2020/08/14(金) 18:33:09.65ID:2wR+X/g+0
>>781
まさにパンピーには通じてねえな
おまえだよ、おまえ

ボーガスにすらなれない家畜以下のおまえ
2020/08/14(金) 18:47:19.76ID:cDg5L/fg0
防衛と侵略が区別できない政治家がいる国だもの。
2020/08/14(金) 19:01:12.85ID:txNZsWd8H
>>783
敵地攻撃能力は防衛ですか、それとも侵略に入りますか?
そしてその理由は?
2020/08/14(金) 19:01:57.94ID:txNZsWd8H
>>782
>狭い蛸壺で自分勝手にルールを決めても、そんなことはパンピーには通用しない
>狭い蛸壺で自分勝手にルールを決めても、そんなことはパンピーには通用しない
>狭い蛸壺で自分勝手にルールを決めても、そんなことはパンピーには通用しない
>狭い蛸壺で自分勝手にルールを決めても、そんなことはパンピーには通用しない
>狭い蛸壺で自分勝手にルールを決めても、そんなことはパンピーには通用しない
2020/08/14(金) 19:11:49.78ID:2wR+X/g+0
>>785
パンピー認めたか、よしよし
家畜以下なクズwww
2020/08/14(金) 19:28:49.23ID:Us3wnTKB0
ここはどこの板で、
なんのスレだかも
見ようともしないのか
2020/08/14(金) 21:45:06.99ID:JGhukcXO0
古語で言うところの、夏厨ってやつだね
2020/08/14(金) 22:07:33.94ID:Us3wnTKB0
次スレから、IP強制表示にした方がいい?
2020/08/14(金) 22:13:46.18ID:yLQKJUZJ0
その方がいいと思う
いささか荒れすぎ感
2020/08/14(金) 22:39:41.29ID:AXcHM7Xg0
>>789
いくない。
ワッチョイも要らない。
792デフォルトの名無しさん (ワッチョイ 468c-1RiF)
垢版 |
2020/08/14(金) 22:41:53.95ID:h2QIVB9f0
C言語で制約論理プログラムができるiZ-Cでサンプルログラムを書き始めました。
ちょっと夢があるので見てね。
https://sunasunax.hatenablog.com
2020/08/15(土) 00:46:37.07ID:xVZ93qLw0
>>792
本人のふりをして荒らさせようとするのはやめろ
794デフォルトの名無しさん (ワッチョイ 9901-eqxN)
垢版 |
2020/08/15(土) 12:58:19.65ID:Y9oiVJFr0
2次元配列への走査方向を行と列で入れ替えた際のパフォーマンスの違いは
何に起因するのでしょうか?
いずれにしてもソース上はランダムアクセスに違いないと思うのですが.

https://ideone.com/VjhO3l
2020/08/15(土) 13:28:06.72ID:Ol0PEc3Yd
キャッシュ
796デフォルトの名無しさん (ワイーワ2 FF8a-jwrZ)
垢版 |
2020/08/15(土) 13:36:54.66ID:cGC1PAzNF
>>784
ウィルス持ちの観光客が最強と判明しました
797デフォルトの名無しさん (ワイーワ2 FF8a-jwrZ)
垢版 |
2020/08/15(土) 13:38:45.66ID:cGC1PAzNF
>>794
メモリの連続性じゃないの?
2020/08/15(土) 13:43:34.64ID:0tc6f7mC0
今のPCってメモリーいっぱい積んでいるから、
よっぽど大きな配列出ないと差が出ないかも知れない
2020/08/15(土) 13:57:10.40ID:qjcQBNN70
メモリが連続してる方向に走査すればCPUキャッシュが効きやすい
2020/08/15(土) 14:00:10.52ID:fqWla8CQ0
プロセッサのキャッシュにはキャッシュラインと言ってフェッチする単位があるんだよ。
あるアドレスをアクセスしたときラインサイズでフェッチしてあるからその後にそのライン内のアドレスならば速くアクセスできる。
要するに先読みしておいてくれるわけ。
801デフォルトの名無しさん (ワッチョイ 9901-eqxN)
垢版 |
2020/08/15(土) 14:31:56.10ID:Y9oiVJFr0
なるほどarr[i][j]へのアクセスでarr[i]の周辺もキャッシュに乗ることになって、
その近くなら早くアクセスできるんですね。
ありがとうございます。
802デフォルトの名無しさん (ワッチョイ 9f10-fAYc)
垢版 |
2020/08/19(水) 09:31:04.59ID:9mqf8z+n0
>>801
ランダムにアクセスしたいときは
無意味に配列をコピーしてキャッシュに載せるんやで
2020/08/19(水) 12:30:49.32ID:ToVJAng8d
まるでSuperfetchみたいな本末転倒だな
2020/08/19(水) 13:40:38.15ID:vFpWtsM/0
>>802
無意味なコピーだとコンパイラに見抜かれたら意味ないよね
2020/08/19(水) 20:00:17.69ID:/fw6ffjlM
キャッシュに乗せるかどうかってコンパイラの仕事なの?
2020/08/19(水) 20:01:21.69ID:iriw96df0
メモリアクセスしないといけないのに最適化でそのアクセスが省略されちゃうってこと
2020/08/19(水) 20:02:45.07ID:/fw6ffjlM
ああそっちか
2020/08/19(水) 20:19:01.78ID:wUlRTy820
-O3でコードが省略されるんですが計測したいのに省略されちゃうと計測できないんですが
-O3は計測するなってことですか?
2020/08/19(水) 20:28:37.21ID:hsLGYVPM0
何らかの方法で「使ってますよ」って教えればいい
2020/08/19(水) 21:37:28.51ID:wUlRTy820
>>809
この前関数の呼び出しコストを計測しようとしたんですよ

void f() { }

みたいな関数なんですけど
でも-O3にすると関数呼び出しが省略されるんですね
このケースってなにかうまい方法ありますか?
2020/08/19(水) 21:40:25.73ID:wUlRTy820
後出しみたいになってすみませんm(_ _)m
2020/08/19(水) 21:41:01.00ID:FObCC8uFd
マイナスオーゼロにすればぁ?
2020/08/19(水) 21:41:20.02ID:4erVQTjid
処理0個
処理1個
処理2個
の関数作って時間はかって処理1個にかかる時間を引き算
2020/08/19(水) 21:42:15.13ID:4erVQTjid
最適化で展開とかされたらあかんけどね
2020/08/19(水) 21:44:41.25ID:afdzM61xM
最近のコンパイラさんは賢いで〜
2020/08/19(水) 21:45:36.69ID:4erVQTjid
最悪アセンブラ見てステップ数数える
関数呼び出しだけならそんな無いでしょ
2020/08/19(水) 22:16:05.51ID:hsLGYVPM0
中でグローバル変数に代入してみたら?
コンパイラから見て、どこで使うかは分からないと思うよ
2020/08/19(水) 23:09:46.74ID:BCDBcsjw0
動的リンクされるようライブラリにすればいいんじゃね?
2020/08/19(水) 23:19:26.76ID:wUlRTy820
なるほど
参考にします
820デフォルトの名無しさん (ワッチョイ 9f01-G9q0)
垢版 |
2020/08/19(水) 23:24:44.35ID:1TMyVKY80
void f() {}
-O1以上は削除されるみたいですね(Compiler Explorerで確認)
https://godbolt.org/z/rcdh9x
2020/08/20(木) 00:41:38.77ID:di44bxHe0
-O3でコンパイルした時のものを計測したいんだから
なくなる=時間0が正しいんじゃないの?
822デフォルトの名無しさん (ワッチョイ ff28-wQSi)
垢版 |
2020/08/20(木) 11:46:13.26ID:vxwYzwgQ0
前処理マクロの質問です。
ファイルの名前と関数名がコロンで繋がれた文字列を出力するマクロを作りたいです。

具体的には

somefile.cというファイルの中で
int somefnc(void) {
puts(FILE_FUNC);
return 0;
}
みたいなコードが,前処理を経て
int somefnc(void) {
puts("somefile:somefnc");
return 0;
}
というコードに変換されるようなマクロが書きたいです。

どうかよろしくおねがいします。
2020/08/20(木) 13:06:29.61ID:OKbq69D/d
>>822
https://programming-place.net/ppp/contents/c/029.html
2020/08/20(木) 15:49:31.41ID:vxwYzwgQ0
>>823
ありがとうございます。
__FILE__や__func__でファイル名・関数名が取得できることは
知っているのですが,その二つをコロンで繋いで文字列にする方法が
分からないんです。
言葉が足りなくてすいません。

例えば
#define FILE_FUNC __FILE__ ":" __func__
というような定義では,当然ではありますが,
うまくいきません。

__FILE__と__func__を展開しつつ,
間にコロンを入れて,外側を引用符で囲む,
という操作を実現できればいいのですが……。
2020/08/20(木) 16:13:14.33ID:OKbq69D/d
>>824
前処理の段階で引用符付いたものに置換するから無理
2つの文字列をくっつけて1つの文字列を返す関数を作り、その関数を呼ぶマクロにするとかすればいける
826デフォルトの名無しさん (エムゾネ FF9f-fHWV)
垢版 |
2020/08/20(木) 16:44:22.67ID:RX/3qqm6F
char s[4] = "ABC";
は問題無いと思いますが
char s[4] = "ABCD";
とすると警告出ないのですが
最後の'\0'は無視されるのですか?
それとも意図しない領域に描き込まれているのですか?
2020/08/20(木) 17:36:07.94ID:h4eQG1wdM
>>824
fprintf(stderr, "%s:%s", _FILE_, _func_)
2020/08/20(木) 17:44:00.86ID:h4eQG1wdM
>>826
仕様書6.7.9に余裕があったらnull文字も書き込むよって書いてあるので、余裕がないからnullは書き込まれてないんじゃないかな。
829デフォルトの名無しさん (エムゾネ FF9f-fHWV)
垢版 |
2020/08/20(木) 17:52:19.01ID:RX/3qqm6F
>>828
ありがとうございます

別の質問なのですが
char s[4] = "ABC";
のとき
printf("%2s\n", s);

ABC
まで表示されてしまいます
これを2文字で切るのは
%2s
じゃ駄目なんでしょうか?
2020/08/20(木) 18:19:55.36ID:ajS/uCbw0
%.2s
831デフォルトの名無しさん (エムゾネ FF9f-fHWV)
垢版 |
2020/08/20(木) 18:47:15.31ID:RX/3qqm6F
出来たかも知れないありがとう

ちなみに
char s[4] = "A";
printf("|%.2s|\n", s); // |A| 右詰めにならない(左に空白一文字分が出来ない)
printf("|%.-2s|\n", s); // |%.0-2s| って表示される
printf("|%-.2s|\n", s); // |A| 左詰めにならない(右に空白一文字分が出来ない)
なんですけど
printf("|%-2.2s|\n", s);
printf("|%2.2s|\n", s);
で自己解決です
2020/08/20(木) 18:55:26.23ID:6pX7b83qM
>824
そもそも__FILE__や__DATE__はリテラルだが__func__ はリテラルじゃないのでそういうことはできない。
2020/08/20(木) 19:58:56.88ID:vxwYzwgQ0
>>832
そうなんですね。
とすると,
#define FILE_FUNC(func) __FILE__ ":" func
みたいにして,
実際使う場面で
FILE_FUNC(__func__)
というように引数として渡す,という方法をとればいい
ってことでしょうか。
2020/08/20(木) 20:00:10.19ID:vxwYzwgQ0
>>833
あ,当然
#define FILE_FUNC(func) __FILE__ ":" func
のままではいずれにせよ
"somefile:somefunc"
には展開されませんが……。
2020/08/20(木) 23:51:48.90ID:ajS/uCbw0
>>833
#defineで定義してしまうと、再定義でもしない限り、そのソースファイル全体で
一意になる静的なリテラルになってしまうでしょ
一方の __func__ は、各関数内部で、static const char に展開されています
だから、マクロを工夫して置き換えたりするよりも、
>>827 の方法が一番簡潔な方法だと思います
2020/08/21(金) 12:10:40.53ID:RjoBQXpc0
>>835
わかりました。ありがとうございます。

>>827さまもありがとうございました。
2020/08/21(金) 17:03:22.67ID:/1umECfd0
ところで、何で__FILE__は直に文字列リテラルに置換され
__file__は暗黙に宣言される配列の識別子なんだろうな

まさに822が陥ったような混乱の元だと思うが
そうしなければならない理由があるのか
2020/08/21(金) 17:31:23.64ID:J6Koy0SX0
>>837
__func__ のことなら、構文解析が要るからでしょ。
ファイルはプリプロセッサの中で自然にわかるだろうけど、現在位置がどの関数の中か(あるいは関数の外か)はわからない。
2020/08/21(金) 18:15:49.48ID:GWEzflke0
ああ、だから大文字じゃないのね
2020/08/21(金) 18:46:45.25ID:/1umECfd0
>>838
ああ、そうか
翻訳フェーズ(7)でやっと関数名が判明するから
翻訳フェーズ(4)では置換できないってことか
当たり前っちゃ当たり前だな
気が付かなかった
841デフォルトの名無しさん (ワッチョイ 7fad-RTUg)
垢版 |
2020/08/22(土) 10:09:37.81ID:K3IJhML30
>>401
> 何に使うかでそんなに変わるか?

亀レスでごめんなさい。
GUIを含むかどうかでちょと変わると思う。
WindowsならやはりVisualStuidoが便利だった。
Linux、UNIXならgcc,vi,makeの3種の神器かな?
842デフォルトの名無しさん (ワッチョイ ff28-wQSi)
垢版 |
2020/08/25(火) 11:52:50.75ID:c6c4SV8K0
for文の制御式にポインタが単独で使われているコードの意味が分かりません。

https://git.musl-libc.org/cgit/musl/tree/src/locale/catopen.c#n43
ここにある

const char *path, *p, *z;
path = getenv("NLSPATH");
for (p=path; *p; p=z) { // ← これ
...
}
こんな処理です。

繰り返しの際に実行する式にポインタを置くことで
どういう処理が行なわれているのか解説していただけないでしょうか。
どうかよろしくおねがいします。
843デフォルトの名無しさん (エムゾネ FF9f-fHWV)
垢版 |
2020/08/25(火) 11:57:23.18ID:Zt9gBA2MF
*p なら文字終端 '\0' チェックしてるだけじゃね
for (p=path; *p != '\0'; p=z) {
と一緒
2020/08/25(火) 12:06:04.67ID:IYsRryaL0
p=zの方が気になる
845842 (ワッチョイ ff28-wQSi)
垢版 |
2020/08/25(火) 12:36:19.71ID:c6c4SV8K0
>>843
なるほど!
for文の中でpを:ごとに削っていっているので,
それが空になるまで廻すという意味になるんですね。

*p != '\0'はメッチャ分かり易い書き換えでした!
(*pとだけ書いてあっても難なく読めるようにならないと
いけないとは自覚していますが……)

>>844
すいません,ほぼ追加で質問する形になってしまうのですが,
どういうところが気になりますか?
教えていただけると勉強になります。
2020/08/25(火) 12:36:38.95ID:N6/CJWHL0
>>842
*p は、その位置の文字が '¥0' じゃなければループ内に入る判定。
ようするに文字列の終端にたどり着くまでループするということ。
p=z の z は、ループ内で p から見た文字列の中の ':' がある位置の次が入るようになってる。
ようするに path を ':' 区切りにした断片を一つずつ処理してる。
2020/08/25(火) 12:44:35.72ID:mY7DCxIU0
>>844
z = __strchrnul(p, ':'); で ':' 毎に切り出して処理して、次の項目に移動してるんでしょ
2020/08/25(火) 12:48:06.50ID:lcyhmMWC0
strtok : ぼくの出番は・・・
2020/08/25(火) 12:55:51.83ID:ch0Vj7Ea0
こういう2重ループは生理的に好きになれないw
2020/08/25(火) 13:24:37.63ID:c6c4SV8K0
>>848
たしかになぜstrtok()ではなくて独自関数を使うか気になりますね。

__strchrnul()はここで定義されていますが,
http://git.musl-libc.org/cgit/musl/tree/src/string/strchrnul.c
strtok()の仕様
https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtok.html
を見ても,ほとんどインターフェースも同じに思えます。
(引数の型がちょっと違う?)

strtok()関数自体を実装しているならともかく
外部から使用するのにわざわざstrtok()と仕様がそっくりな
独自の関数を用いる理由が分からないですね。
2020/08/25(火) 14:01:32.20ID:mY7DCxIU0
>>850
> たしかになぜstrtok()ではなくて独自関数を使うか気になりますね。
strtok( ) は与えられた文字列書き換えちゃうし内部状態を持つので今どき使うのはやめた方がいいと思うぞ
2020/08/25(火) 15:02:43.34ID:DOmxfygr0
再入可能じゃないからね
2020/08/25(火) 15:06:17.67ID:fzTrphgL0
既存関数を使えばわざわざ文字列をループで処理する必要は無いと思えるけど
例えば昔から良くあるコマンドライン引数をチェックする場合などは
ループで処理するのが一般的かなと思われる

簡単なコードを書いてみたので確認してみるといいかも
https://paiza.io/projects/e/0d-LM04O2-C1g6xC2uXP5w
2020/08/25(火) 15:08:24.49ID:DOmxfygr0
コマンドライン引数にstrtokは全く向かない
引用符使われただけでアウト
ASCIIコードしか想定していない
2020/08/25(火) 15:38:28.41ID:c6c4SV8K0
>>851
ありがとうございます。
なるほど,
https://www.jpcert.or.jp/sc-rules/c-str06-c.html
にも strtok() を不用意に扱わないようにという記述がありました。
だからわざわざ,strtok()に似ているが与件文字列を変更しない
っていう内部関数を利用していたんですね。

「区切り文字による分割」みたいな処理をする場合は,
strtok()の挙動を完全に理解した上で使うか,
自分で挙動を把握できる内部関数を作るかにするよう心掛けます。
(自分で1からC言語を書けるようになるのは
当分先のことになるとは思いますが)
2020/08/25(火) 18:08:51.59ID:efL3nra7M
ライブラリ関数内部で同じライブラリで公開してる別の関数を呼び出すのはエラー時に滅茶苦茶になりそうだから良くない
2020/08/25(火) 19:42:36.86ID:KqJVwSUy0
へぇ __strchrnul だと非マッチ時 zがヌルポにならないようになってんのか
2020/08/26(水) 07:47:13.52ID:EcgUuw1J0
文字列はS-JISのこと考えて自分で作るか
逆にunicodeで全部ライブラリに任せるかしてるわ。
2020/08/26(水) 07:57:09.94ID:68jGS2+/0
こないだユニコード文字列を扱うライブラリを作ったんだが、Poweshellから使うとうまく動作しないでやんの
Bashだとうまくいくからシェルの文字コードが原因かなぁって
2020/08/28(金) 14:09:17.18ID:Rsi3PU970
Poweshell 相手 なら UTF16で試してみて
2020/08/29(土) 18:11:22.84ID:uw2IISYA0
>>860
サンクス
覚えておく
2020/09/05(土) 12:34:48.17ID:inRyx+ft0
一時期ソースファイルで使われる文字コードと
テキストコマンドで指定される文字コードで混乱してた。
863デフォルトの名無しさん (ワッチョイ 675f-th+2)
垢版 |
2020/09/05(土) 14:24:19.26ID:D6IgUwp/0
ファイルシステムもコードページあれば良いのに
2020/09/08(火) 19:54:58.87ID:XpL2+zA20
すみません
visualstudio2019で
scanfてうまく動かないて
書き込みありまさしたが
こちらは初心者です
2020/09/08(火) 20:04:29.03ID:oUJlYCUI0
何がうまくいかないの?
866デフォルトの名無しさん (ワッチョイ e7e6-dQ4P)
垢版 |
2020/09/08(火) 20:07:28.59ID:SzSjgAIn0
>>864
母国語でおk
867デフォルトの名無しさん (ワッチョイ 0701-P8XZ)
垢版 |
2020/09/08(火) 20:33:38.44ID:h4K4tlm90
>>866
ماذا علي أن أفعل لتحسين عمل Scanf؟
868デフォルトの名無しさん (ワッチョイ 5fa5-w/i8)
垢版 |
2020/09/08(火) 20:57:51.12ID:dd3/c9tT0
>>864
scanf_sを使うんだよ
2020/09/08(火) 21:00:35.32ID:oUJlYCUI0
自分が初心者だった頃を忘れて弱い者いじめするクズばっかり
870デフォルトの名無しさん (ワッチョイ 87e6-+pFZ)
垢版 |
2020/09/08(火) 21:38:18.70ID:L9CYXS2m0
ここの連中は初心者の時でもこんな愚かな質問しなかっただろうからな
2020/09/08(火) 21:48:40.05ID:i07xiLbJ0
かまって欲しいだけだろう
872デフォルトの名無しさん (ワッチョイ 0701-P8XZ)
垢版 |
2020/09/08(火) 22:29:20.68ID:h4K4tlm90
よしよし かまってあげよう おいで〜
2020/09/08(火) 22:40:52.39ID:5p23t/CB0
(≧▽≦)きゃー
874デフォルトの名無しさん (ワッチョイ 0701-P8XZ)
垢版 |
2020/09/08(火) 22:50:33.61ID:h4K4tlm90
(*-ω-)ヾ(・ω・*)ナデナデ
2020/09/10(木) 22:31:27.77ID:XqO8hjOE0
>>869
ここ初心者向けじゃないし
2020/09/11(金) 06:53:15.69ID:Cxw4gZ+X0
クズは認めるわけか
877デフォルトの名無しさん (ワッチョイ c5e6-nmCw)
垢版 |
2020/09/11(金) 09:46:30.88ID:t2oJFSgB0
この初心者のほうがよっぽどクズ
2020/09/11(金) 11:05:17.65ID:Cxw4gZ+X0
クズを認めるからこそ比較できるわけだな
2020/09/11(金) 13:23:30.52ID:eRvWHPbG0
クズでもなんでもいいから正しい日本語を使って質問しなさい
2020/09/11(金) 16:01:28.53ID:Cxw4gZ+X0
ほらな、質問者がクズかどうかは関係ないんだよ
2020/09/11(金) 17:04:12.34ID:ua52u3Jr0
お互い(屑であると)認め合う姿は美しいですね
882デフォルトの名無しさん (ワッチョイ b501-zsLS)
垢版 |
2020/09/12(土) 02:19:04.35ID:SzTm78BI0
静かになるまで5分かかりました(ry
2020/09/14(月) 21:43:37.62ID:8/TQSAVT0
https://hnw.はてなブログ.com/entry/20130406
この記事(海外の質問箱の邦訳)に対するコメントで,
do{
...
} while (feof(input))
というコードが提案されているのですが,どう思われますか。

少なくとも一つの問題点(余分なループ)は克服できている気がしますが。
884デフォルトの名無しさん (ワッチョイ eaad-pVuC)
垢版 |
2020/09/15(火) 00:55:31.70ID:2J2Mo0F/0
>>883
コメントって、どこにあるの?

まあしかしそう書いたとしても c = fgetc(input) をやった直後の c の値が EOF かどうかを調べる必要があって、
EOF だったらループを抜ける必要がある。do { ... } while (feof(input)); のループ内に if ((c = fgetc(input)) == EOF) break; を
入れるとすると最後の while の条件は無駄だ。決して EOF に到達していないから。
2020/09/15(火) 01:38:55.84ID:GcvmEeWM0
>>883
中身が空っぽなinputだったらどうする?
2020/09/15(火) 07:29:42.10ID:YjwP830M0
後判定といえば自明な弱点があるね
2020/09/15(火) 11:24:23.73ID:DboEcGlM0
>>884
はてなブックマークです。
https://b.hatena.ne.jp/entry/139652170/comment/rin51
888デフォルトの名無しさん (ワッチョイ eaad-pVuC)
垢版 |
2020/09/15(火) 13:34:11.71ID:2J2Mo0F/0
ま、しかし、よくよく考えてみると feof() って使い所がほとんどないのではないか?
fgetc() が文字だけでなく EOF まで返す仕様になっているから使わずにも書けてしまうよね。
単にEOFになった後かどうかだけを調べたい場合は fgetc() 使ったら無駄な処理になるけど。
889デフォルトの名無しさん (ワイーワ2 FF92-e6VR)
垢版 |
2020/09/15(火) 13:46:37.73ID:i/gZOuAlF
そもそも feof 使わないよね?って話題だし
2020/09/15(火) 14:02:51.06ID:pUsOBU6W0
fgetc()等はファイルを最後まで読み取った場合だけでなくエラーの場合もEOFを返すことになってるから
どちらの状況か区別するためにfeof(),ferror()はあるんだろ
区別しなくていいなら使わんわな
2020/09/15(火) 14:14:08.17ID:8CWM1WbO0
>>883
ダメダメって書いてあるやろ

rero
ferror の条件が成立した場合,feof の条件は成立せず,無限ループになる.
ループ脱出条件にはfread / fscanf / fgetc などの戻り値を使う.
feof は ferror との切り分けにのみ使う.
2014/02/04
2020/09/16(水) 18:30:21.50ID:+0jueX8G0
ありがとうございました。
893デフォルトの名無しさん (ワッチョイ d793-lMKa)
垢版 |
2020/09/17(木) 12:37:14.53ID:3L04nVD50
関数定義の書式『例えばprintf関数なら、 int printf(const char * format, ...) 』とかで、関数の引数の型指定が含まれてるけど、これの指す具体的な意味って何?
例えば、const char*型が指定されていたとして、
1、「const char*型でなければならない」
2、「他の型も使えるがconst char*型を推奨する」
3、「色々と対応してるけど代表としてconst char*型を挙げる」
4、「1〜3のうちどれか、関数毎にケースバイケースで具体的には決まってない」
関数定義の書式における型指定には、どのような意味が込められてるんですか?
printf関数では、普通に文字列を入れた配列のポインタ(char *型)にも対応してるので、2か3なんだろうけども。
関数定義書式に含まれる型指定は、1〜4のどれなのか、C言語では統一的に指針が決まってますか?
894デフォルトの名無しさん (ワイーワ2 FFdf-SP/v)
垢版 |
2020/09/17(木) 12:40:32.43ID:OW2OZx8DF
1
895デフォルトの名無しさん (ワッチョイ d793-lMKa)
垢版 |
2020/09/17(木) 12:50:38.33ID:3L04nVD50
printf関数の場合では、「char*型が使えるように見えるけど、色々と問題起きるからconst char*型以外は禁止」ということなんですか。
分かりました。
2020/09/17(木) 12:53:34.67ID:uk2B69G8M
const char*はchar*の指す先を書き換えないだけで同じものなのでconst char*をchar*で初期化してなんの問題もない。暗黙変換してくれる。
逆は書き換えられないconst char*が書き換えできる様になってしまうので暗黙にはしない様になっている。
2020/09/17(木) 13:02:01.33ID:9/9M+ZB20
こんなこともできるけどね
static /* const */ char str[] = "hello stupid people";
printf(str);
898デフォルトの名無しさん (ワイーワ2 FFdf-SP/v)
垢版 |
2020/09/17(木) 13:08:31.54ID:OW2OZx8DF
質問のレベルから忖度すると
質問者が気にしてるのは
ひょっとすると
...
の部分の方なのかも知れない
899デフォルトの名無しさん (ワッチョイ f77c-E8AY)
垢版 |
2020/09/17(木) 13:10:16.65ID:/CJv2N4s0
#include <stdio.h>

int main(int ac, char **av)
{
int p = 0x000a0d41;
printf((char *)&p);
return 0;
}
900デフォルトの名無しさん (ワッチョイ bf8c-CUqR)
垢版 |
2020/09/17(木) 13:40:44.35ID:PwEIVjdJ0
関数定義の引数が配列で書けるようになったのはいつから
int func(array[5]){
.......
}
2020/09/17(木) 13:45:22.35ID:9/9M+ZB20
型指定子がないけど暗黙intってことか? 無理だと思うけど
902デフォルトの名無しさん (ワイーワ2 FFdf-SP/v)
垢版 |
2020/09/17(木) 13:46:44.16ID:OW2OZx8DF
昔から
2020/09/17(木) 13:52:07.27ID:qRMpu/GI0
>>899
明示変換してるのに暗黙変換もさせるのは読みづらいよ
2020/09/17(木) 13:55:11.12ID:9/9M+ZB20
つーかさ
pにアドレス演算子つけてるの
何かがわかってない兆候じゃね?
905デフォルトの名無しさん (ワッチョイ d793-lMKa)
垢版 |
2020/09/17(木) 14:31:37.44ID:3L04nVD50
皆さんのレスを行間を読んでまとめること、こんな感じの理解でいいですか?

代入の際、右辺の値は、左辺の型に暗黙変換される。
int a = 3.5; // duble型リテラルを暗黙変換してaには3が入る
int a = 'a' // const char型?リテラルを暗黙変換してaには文字コードを表す97が入る
int a ="ほげ"; // const char型リテラルを暗黙変換してaにはよくわからん不正値が入る
同様に、関数へ引数を渡すことも代入の一種であり、実引数が代入する側であるから代入式の右辺に相当し、仮引数が代入される側であるから左辺に相当する。
その際、実引数char*型は仮引数const char*型へ暗黙変換される。
int main(void) {
char hoge[] = "ほげ";
printf(hoge); // 実引数hogeは先頭要素を指すポインタchar*型で、暗黙変換を伴って仮引数のconst char*型となる
}
この逆、仮引数char*型に実引数const char*型を渡すのはNG。char*型とわざわざ指定されてる理由は、値を書き換え可能なポインタを求めるためであり、const char*型はダメ。
2020/09/17(木) 14:32:12.65ID:FojOL81h0
>>900
型が書かれていないけどそれはタイプミスだとすれば、
配列形式で仮引数を書くこと自体は昔から出来る。
ただし、配列形式で書かれるとそれはポインタに調整される。

たとえば仮引数が int array[5] だったら int* array と全く同じとみなされる。
配列の大きさの情報は無視される。
(ひょっとすると警告を出すためのヒントにするくらいの処理系はあったりするのかもしれんけど。)
2020/09/17(木) 14:42:51.44ID:FojOL81h0
>>905
暗黙の変換がされる場合とされない場合はあって、

int a ="ほげ";

で暗黙の変換をする保証はない。
C99 だと単純代入で許される型の組み合わせは 6.3.16 に書かれている。

処理系の拡張としてやっちゃうこともあるかもしれんけど、
その場合でも警告は出るんじゃないかなぁ。

> 関数へ引数を渡すことも代入の一種であり

その通りだが、関数原型 (プロトタイプ) がない場合や
可変長引数 (仮引数が ... で表されるやつ) の場合はちょっとルールが特殊な部分もある。

まちがっててもコンパイラが検出できないこともあるので気を付けないといけない。
2020/09/17(木) 16:23:39.93ID:9/9M+ZB20
処理系の拡張ねえ
gccは-pedanticつけないと黙って通す場合あるかんな

>>905
void func(char *);
func("const char array");
これconst違反なのにできちまう
909デフォルトの名無しさん (ワッチョイ bf8c-CUqR)
垢版 |
2020/09/17(木) 17:46:14.08ID:7hPXgG620
>>900
すまぬ訂正
関数定義の引数が配列で書けるようになったのはいつから
int func(int array[][5]){
.......
}
2020/09/17(木) 18:43:35.04ID:FojOL81h0
>>908
C の文字列リテラルは char の配列ということになっているので char* で受け取れる。
型の視点で見ればそのコードに const は登場しない。

文字列リテラルを書き換えようとした結果は未定義であるにもかかわらず
型に const が付かない C のクソなところのひとつ。

(C++ では文字列リテラルの型には const が付く。)
911デフォルトの名無しさん (ワッチョイ d793-lMKa)
垢版 |
2020/09/17(木) 19:21:07.83ID:3L04nVD50
よく見てみたら使ってるツールがC++用だった。
C言語入門本でインストールを促すソフトが大抵Visual StudioのC++で、
意識せずにC++の開発環境でC言語の勉強をしてたんだな。
それで、C言語の挙動だと思ってたのが、実はC++の挙動だったんだな。const の件もそう。
2020/09/17(木) 19:39:01.71ID:9/9M+ZB20
>>909
全然配列じゃないじゃん
int func(int(*array)[5]);
これと同じだよ、配列へのポインタ
2020/09/17(木) 19:55:04.93ID:+PkSrmT3M
いくら引数リストに要素数を記述してもコンパイラは無視する
int func(int **array)と同じ扱いでただのニ重ポインタ
2020/09/17(木) 19:57:19.31ID:9/9M+ZB20
>>913
アホwバカwww
2020/09/17(木) 19:58:54.02ID:9/9M+ZB20
char **aho = 0;
printf("%p ", aho);
aho++;
printf("%p ", aho);

printf("%p ", array);
array++;
printf("%p ", array);
916デフォルトの名無しさん (ワッチョイ d793-lMKa)
垢版 |
2020/09/17(木) 19:59:49.49ID:3L04nVD50
でもまあプログラムの再利用性を考えたら、constの件は、C++仕様に配慮して省かないことが大事か。
C++に配慮したコードを書くことで、C言語でもC++でも通用するプログラムとなり、プログラムの再利用性が上がる。
C言語ではconstを省くことが文法的には認められてても・・・・・C++に流用できないプログラムは、たぶんコードとしては減点となる。
2020/09/17(木) 20:03:53.36ID:FZAv8QRcM
>>914
いや、マジで関数に配列を渡せると思ってるの?
配列の引数はポインタの引数の糖衣構文だよ
どうしても配列を渡したい場合は配列を構造体で包めば要素数を関数に渡すことは出来る
2020/09/17(木) 20:05:11.15ID:FojOL81h0
>>913
いや、それは >>912 が正しい。
二重ポインタにまで調整されてしまうと
関数 func の中で array[1][3] みたいなアクセスが不可能になってしまう。
ポインタへの調整はあくまで一段階のみ。
2020/09/17(木) 20:08:22.99ID:FojOL81h0
>>917
配列を渡すのではなく「配列へのポインタ」だ。
配列は多くの場合に配列の先頭要素を指すポインタに暗黙に型変換されるけども、
それとは別に配列を指すポインタというものが存在し、
指す先の配列の大きさは型情報として保存される。
2020/09/17(木) 20:13:48.15ID:9q71Nrm0M
関数の引数として配列を渡す場合、アドレスと要素数は別に渡す必要がある
関数内で要素数を知る手段はない
int func(int **array, int i, int j)
2020/09/17(木) 20:14:06.25ID:FojOL81h0
int array[][5] という配列があったとしたら、その先頭要素の型は int [5] なので、
通常通り配列の先頭要素そ指す型に型変換したら int (*)[5] になるんだ。
仮引数の側もそれと同じような調整が入る。
2020/09/17(木) 20:19:02.57ID:9q71Nrm0M
それは配列の変数宣言の場合だ
仮引数の場合には当たらない
2020/09/17(木) 20:29:34.78ID:FojOL81h0
>>922
JISX3010:2003 から

> 6.7.5.3
> 仮引数を "〜型の配列" とする宣言は、 "〜型への修飾されたポインタ" に型調整する
2020/09/17(木) 20:31:16.69ID:JChOP/F3M
だから糖衣構文だと言ってるだろ
2020/09/17(木) 20:32:41.07ID:FojOL81h0
>>924
構文糖だよ。
でも >>913 の構文糖ではないって話をしてる。
2020/09/17(木) 20:53:29.25ID:+AujTTfU0
>>916
正直言って、const のありがたみが今一つよくわからないんですよね…
2020/09/17(木) 21:37:33.81ID:VrEKPYEi0
確認してみた
配列が仮引数の関数内で配列の型情報は失われて単なるポインタになってる

メイン関数内配列サイズ 20Byte (int[5] = 4Byte * 5)
関数内配列サイズ 8Byte (int* = 64bit)

https://i.imgur.com/nItgOZC.png
2020/09/17(木) 21:54:03.82ID:PVWtVfHXM
そう、仮引数の配列要素数はコンパイラに無視される
ただのポインタだから配列サイズは失われている
2020/09/17(木) 22:14:39.96ID:ysRkZn2Ya
>>926
うっかり変更しようとしたら、コンパイル時にエラーになるでしょ
2020/09/17(木) 22:35:38.61ID:qRMpu/GI0
>>927
909読め。一次元じゃなくていわゆる2次元配列な
sizeofに*付けるの忘れないように
2020/09/17(木) 22:46:13.06ID:FojOL81h0
修飾なしで const になって、変更可能な変数の場合に指定を付けるようになってればよかったのに
という声は一部では根強く有る。
もちろんそんな非互換な変更を C/C++ が受け入れるはずがないので
あくまでももしもの話というか愚痴の類なんだけど。

でも Rust がまさにそうなったので型の厳しさを指向するなら
デフォルトで変更不能な方が自然なのかもしれんね。

個人的には、 C で意識して const を付けるのは関数の仮引数くらいで十分だろう
という程度かな。 そのかわり仮引数の型付けはかなりしっかりしたい。
2020/09/17(木) 23:08:14.29ID:VrEKPYEi0
>>930
sizeofの間接参照の意味がよく分からんけど2次元配列

https://i.imgur.com/HNIrfoF.png
2020/09/17(木) 23:13:21.69ID:aQ5w/H9b0
リソースが極限まで制限されるような環境下で動かすことがる
ハードに近い部分を書くことが多かった
最適化の精度が悪かった
みたいな時代背景があるのでデフォルトがconstはナンセンス
もちろん今の時代に1から設計するならそういう言語が出てくるのは当然
2020/09/17(木) 23:27:44.50ID:qRMpu/GI0
>>932
sizeof(*array)だよ
2020/09/17(木) 23:46:44.97ID:cQbuW7S9M
>>932
>>913は間違いでvoid func(int array[][5]) と void func(int **array) では意味が違うって話だから
それぞれfuncで sizeof(*array) を見ないと意味ない
2020/09/18(金) 00:25:49.56ID:InePzAsW0
普通に array[1][3] みたいにして要素にアクセスするときでも
規格上の理屈では *(*(array+1)+3) の構文糖であるということになってて、
じゃあこれを成り立たせるにはどういう型情報があればいいのか
みたいな方向でパズル的に考えて遊んだりするのも面白いかもね。

あとここまでのやりとりで出てきてないっぽいから注意点を示しておくけど、
配列が暗黙の型変換でそれの先頭を指すポインタになるルールの例外が
sizeof を適用したときと単項 & を適用したときだよ。
2020/09/18(金) 06:03:42.05ID:dDojkzke0
sizeofと&が例外って言い方よく見かけるけど
気持ちの中ではこっちが本来だね

extern int array[]; と
extern int *array; じゃ
意味違うし
2020/09/18(金) 06:28:13.21ID:n6muJc1p0
>>933
> リソースが極限まで制限されるような環境下で動かすことがる
> ハードに近い部分を書くことが多かった
> 最適化の精度が悪かった
なんの理由にもなってないと思うが…
単にK&Rがそう言うのに無頓着だっただけだろ
2020/09/18(金) 06:31:46.59ID:dDojkzke0
何の理由にもなってないのはそのとおりだが
なんで無頓着って話になるんだ?
アセンブラで書いていたUnicsを高級言語で書けるようにしようって作ったんだぜ?
2020/09/18(金) 09:01:10.98ID:InePzAsW0
>>937
確かに。

暗黙の型変換の方を中心に説明したから例外という言葉を使ったが、
配列がポインタになる方がよっぽど特殊な話だよな。
2020/09/18(金) 09:11:41.22ID:dDojkzke0
初心者がややこしい規則をこれから憶えようってときには
確かにあの言い方は情報量少なくて憶えやすそうだけど
初心者を卒業したらいつまでもしがみついてると格好悪いね
2020/09/18(金) 10:09:00.07ID:n6muJc1p0
>>939
例えばintとポインタの扱いとかみたら結構無頓着だと思わない?
別にそれが悪いと言ってるわけじゃない
高級アセンブラとしてはまあ理解出来なくないし当時のマシン環境の制約もあっただろうしね
943デフォルトの名無しさん (エムゾネ FFbf-SP/v)
垢版 |
2020/09/18(金) 10:37:02.65ID:6n8VMUNiF
ラクッペペ MM8f-kMIc

こいつは無視でOK
2020/09/18(金) 12:10:56.45ID:3NbVdp1XM
そんな感じの2次元配列の引数としてはかけるけど
実際その関数になに代入してもエラー吐くやつとかあったな
2020/09/18(金) 12:52:30.78ID:dDojkzke0
関数に代入ってどゆこと?
2020/09/18(金) 12:54:19.87ID:dDojkzke0
>>942
> 例えばintとポインタの扱いとかみたら結構無頓着だと思わない?

intをポインタにキャストするようなこと?
2020/09/18(金) 16:08:04.83ID:3NbVdp1XM
>>945
引数になにいれてもだった
2020/09/18(金) 20:15:43.21ID:dDojkzke0
こういうこと?
void func(int (*array)[5], int **pointer)
{
char a[2][5], *p;

array = a; //ok
pointer = a; //error

array = &p; //error
pointer = &p; //ok
}
2020/09/18(金) 23:38:09.01ID:InePzAsW0
>>947
逆に、引数に何を与えても許容してしまうという事例は今でも簡単に書けるね。

https://wandbox.org/permlink/uv5dmsN9NA58k8Wp
2020/09/19(土) 09:21:06.58ID:FHaFE8730
あ、すまんw
s/char/int/g
2020/09/19(土) 11:02:59.46ID:Uw1s41Nc0
>>949
そうだけど、それは「危険性」には繋らんよな?
引数関連の危険性というのは大抵、
引数を変に実行してしまうことから始まる訳だから。
2020/09/19(土) 13:13:28.09ID:cxOsPIuF0
>>951
一応は >>949 も未定義だよ。
呼出規約が cdecl だったら余計な引数は捨てられるだけで問題にならないとは思うけど。

余計な引数を渡すのとは逆に必要な引数を渡さないという例も書けるから、
より危険性がわかりやすいかな。

https://wandbox.org/permlink/1F876xK6UZ4wFjAA

余談だけど関数定義は宣言も兼ねるというルールにおいて、
K&R スタイルの関数定義はプロトタイプを持たない宣言でもあるという扱いだから
別途プロトタイプ宣言をする分にはエラーとして検出される。

https://wandbox.org/permlink/4n574f4R9yq0BzUj
953デフォルトの名無しさん (ワッチョイ 7f28-5uLG)
垢版 |
2020/09/19(土) 14:57:40.15ID:Uw1s41Nc0
>>952
> 余計な引数を渡すのとは逆に必要な引数を渡さないという例も書けるから、
たしかにその通りだな。

>>949 のコード例に気をとられて
もとの議論の内容を忘れてたw

thx
2020/09/19(土) 14:57:50.91ID:Uw1s41Nc0
すまんsage
2020/09/21(月) 03:21:46.70ID:SqQ7e3H60
>>952
普通先行宣言をちゃんとするだろ
2020/09/21(月) 08:57:54.77ID:sulqQktu0
>>955
普通はする。 すべきだ。 というのがどれほどあてになるか。

普通はすることを (うっかり) しなかったら (エラーとして検出されずに) 通ってしまうってのは
K&R スタイルの関数定義はイケてないねって話。
2020/09/21(月) 08:59:37.43ID:sulqQktu0
K&R スタイルでなくともファイルを分割すると宣言と定義の矛盾が検出されなかったりもする。

// foo.c
void foo(int x) {
}

// foo.h
void foo(void);

// main.c
#include "foo.h"

int main(void) {
foo();
}

このとき foo.c をコンパイルするだけなら foo.h は不要だが
foo.c で foo.h をインクルードしておかないと間違いは検出できない。
958デフォルトの名無しさん (アウウィフ FF5b-SP/v)
垢版 |
2020/09/21(月) 10:49:53.26ID:M8W5JifWF
linkエラーは?
2020/09/21(月) 11:10:21.40ID:WONfy98d0
>>958
大抵の処理系ではリンクエラーにならないよ
C言語だとコンパイル後は引数の情報は無くなっちゃうから
960デフォルトの名無しさん (アウウィフ FF5b-SP/v)
垢版 |
2020/09/21(月) 11:19:45.80ID:M8W5JifWF
実行時にスタック壊れたり
hangupしたりするんです?
2020/09/21(月) 12:59:37.93ID:sulqQktu0
>>958
C のオブジェクトファイルは名前しか保存しておらず、
型はヘッダファイルでやりとりするというのが伝統的なデザイン。
だからそれを一致させるのはプログラマの責任。

現代の実装技術なら検出できないことはないはずなんだが、
検出しないのは色々な都合があるんだろう。

>>960
cdecl や fastcall なら関数を呼び出すだけならスタックの整合性が壊れることはないと思うんだけど、
実引数と仮引数がまともに対応付けられていないわけだから
仮引数の読み書き (特に書き込んだとき) には壊れる可能性が高いんじゃないかな。
2020/09/21(月) 17:40:26.50ID:PNFNM3Vd0
> 現代の実装技術なら検出できないことはないはずなんだが、

ちゃんとやってるよ
外部参照名の長さの上限を増やすという
後方互換性を損なわない賢いやり方で

それの恩恵を有り難く頂戴しているのがC++
2020/09/21(月) 20:06:59.96ID:CAa9Vr4hM
意味わからん
マンダリングしてるC処理系なんてあったっけ?
別にオブジェクトコードに含ませなくてもデバッグ情報に含ませといてチェックするとかでも良いと思うけどね
2020/09/21(月) 21:16:44.87ID:PNFNM3Vd0
s/マンダリング/マングリング/g
2020/09/21(月) 21:27:28.62ID:r8sxqPhqM
>>963
32bitWindows向けのstdcallは引数等で使うスタックサイズを名前の後ろに付け加える
966デフォルトの名無しさん (ワッチョイ 9f47-SP/v)
垢版 |
2020/09/22(火) 02:46:33.89ID:EwzeVKsQ0
本人が間違ってる分には無視すれば良いだけだが
初心者スレで嘘を撒き散らすのは良くないな
2020/09/22(火) 09:19:28.05ID:73EWHT9ca
volatileオブジェクトへのアクセスは副作用を生じるというのを見たことがあるのですが
この場合の副作用とは具体的にはどういう事象のことを言っているのでしょうか?
2020/09/22(火) 09:29:18.39ID:GaogVwml0
>>967
具体例としては、 volatile なオブジェクトへのポインタを通したアクセスをメモリマップドI/Oと対応させることが多い。
https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%9E%E3%83%83%E3%83%97%E3%83%89I/O
2020/09/22(火) 11:37:01.89ID:duZr+LV8M
>>967
遅くなることがあるということかな?
2020/09/22(火) 12:21:55.75ID:73EWHT9ca
>>968
レジスタなどにアクセスする際に最適化で誤動作しないようにvolatileを付けるのかなと思ったのですが、
逆にvolatileを付けることによる不都合(副作用)って何かあるのでしょうか
それとも最適化されないことを副作用と読んでいるのでしょうか

>>969
最適化しないことによる処理時間増加でしょうか
2020/09/22(火) 12:26:59.11ID:ZRR+59kRa
最適化によって、本来は必要な処理がコンパイラによって省かれてしまうとか
2020/09/22(火) 12:28:12.05ID:ZRR+59kRa
コンパイラの判断によって、一部のコードが生成されないとか
2020/09/22(火) 12:48:41.23ID:fNKq19I/0
>>970
プログラミングの世界の副作用とは、不都合とかそんな意味ではなくて、内部状態が変更されるとか、外に何らかの影響を与えるとかそんな意味だよ。

例えばisalpha関数は文字の判定をするだけだけど、printfはコンソールに文字を出力する。
前者は副作用なし、後者は副作用ありだね。

volatileの件はそれが書かれた前後のコンテキストが分からないから何を指してるのか何とも分からんけど、たぶん、>>968に書かれてるように、外部デバイスへの作用のことを指してるんじゃないかな
2020/09/22(火) 13:01:07.61ID:GaogVwml0
>>970
副作用 (プログラム)
https://ja.wikipedia.org/wiki/%E5%89%AF%E4%BD%9C%E7%94%A8_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0)
> プログラミングにおける副作用(ふくさよう)とは、ある機能がコンピュータの(論理的な)状態を変化させ、それ以降で得られる結果に影響を与えることをいう。

C言語における定義はこんな感じ。
http://kikakurui.com/x3/X3010-2003-01.html#13
> ボラタイルオブジェクトへのアクセス,オブジェクトの変更,ファイルの変更,又はこれらのいずれか
> の操作を行う関数の呼出しは,すべて副作用(side effect)と呼び(11),実行環境の状態に変化を生じる。
2020/09/22(火) 17:15:02.44ID:73EWHT9ca
回答ありがとうございました
組み込みの資料か何かでvolatileの副作用についての記述があり質問させていただきました
副作用の意味がいまいち分かってないみたいなので勉強します
2020/09/26(土) 02:24:05.62ID:AJ59WF/j0
int main(double a, double b)
{
printf("main");
}
2020/09/26(土) 02:27:39.44ID:80lZAyo5a
コンパイル通るのかな….
2020/09/26(土) 05:50:57.90ID:JvTrRG8q0
(void)と(int, char**)以外は処理系定義
コンパイラが対応していれば適格
対応していなければ未定義
2020/09/27(日) 13:50:39.37ID:LQE5yA3hM
crtstartupのお仕事だからコンパイラほぼ関係ないな
大抵の実用リンカは差し替えできるでしょ
980デフォルトの名無しさん (ワッチョイ f793-raSa)
垢版 |
2020/09/28(月) 07:00:27.18ID:BXhKM0Xn0
数値リテラル「0」の型は何ですか?

int* p = 0; // これはOK
int* p = (int)0; // 明示的にint型にしてから渡すと「int型はint*型に変換できません」とエラー。ということは、この 0 はint型以外?
int* p = (unsigned int)0; // これもエラーで無理。
printf("%zu", sizeof(0)); // 0の型のサイズを調べると4byteと表示される。
この数値リテラルの「0」の型は何ですか?
ちなみに、まだC言語環境を構築してないから、代わりVisualC++を使ってるけど、他の環境でも起きますか?
981デフォルトの名無しさん (ワッチョイ f793-raSa)
垢版 |
2020/09/28(月) 07:30:53.01ID:BXhKM0Xn0
さらに調べると・・・・
キャスト演算子で型を指定した0は、代入の際にint*型へ変換してくれない。
接尾語を付けて型を指定した0は、代入の際にint*型に変換してくれる。

int* p = (long int)0; // NG
int* p = 0L; // OK

int* p = (unsigned int)0; // NG
int* p = 0u; // OK

キャスト演算子で型を指定すると、代入の際の暗黙的な変換が禁止される仕様とかあるんですか?
2020/09/28(月) 07:54:15.67ID:QxfbhGyV0
>>980
intだよ

D:\learn>gcc --version
gcc (Rev2, Built by MSYS2 project) 10.1.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


D:\learn>gcc 980.c

D:\learn>gcc 980.c -pedantic -Wall
980.c: In function 'main':
980.c:9:10: warning: unused variable 'p3' [-Wunused-variable]
9 | int* p3 = (unsigned int)0; //
| ^~
980.c:8:10: warning: unused variable 'p2' [-Wunused-variable]
8 | int* p2 = (int)0; // ntintnt*nt
| ^~
980.c:7:10: warning: unused variable 'p1' [-Wunused-variable]
7 | int* p1 = 0; // K
| ^~

-Wallにするとunusedって警告でるけど型の話じゃないね
2020/09/28(月) 08:00:54.96ID:QxfbhGyV0
>>981
D:\learn>cl 980.c /W4
Microsoft(R) C/C++ Optimizing Compiler Version 19.27.29111 for x64
Copyright (C) Microsoft Corporation. All rights reserved.

980.c
980.c(8): warning C4047: '初期化中': 間接参照のレベルが 'int *' と 'int' で異なっています。
980.c(9): warning C4189: 'p3': ローカル変数が初期化されましたが、参照されていません
980.c(7): warning C4189: 'p1': ローカル変数が初期化されましたが、参照されていません
980.c(8): warning C4189: 'p2': ローカル変数が初期化されましたが、参照されていません
Microsoft (R) Incremental Linker Version 14.27.29111.0
Copyright (C) Microsoft Corporation. All rights reserved.

/out:980.exe
980.obj

参照されていませんという警告は型の話ではないのでここではスルー
型についての警告が出ている8行目とやらはこれ
> int* p2 = (int)0; // 明示的にint型にしてから渡すと「int型はint*型に変換できません」とエラー。ということは、この 0 はint型以外?

隣の9行目は警告されていない(しかも/W4で)
> int* p3 = (unsigned int)0; // これもエラーで無理。

おそらくclが警告しているのはXXX*とXXXでポインタの間接段数を間違えたんだろうということ
これなら9行目はXXX*とYYYで間接段数の問題ではないので黙っているという説明がつく
2020/09/28(月) 08:46:00.83ID:E0ldxkXM0
0だけは特別にポインタにキャスト可能な仕様なんじゃよ
0がいい 0になろう
2020/09/28(月) 08:46:40.00ID:IwymMB/J0
>>980
0 の型は int だけど、空ポインタ定数 "null pointer constant" なので、すべてのポインタ型への暗黙変換が効く。
http://kikakurui.com/x3/X3010-2003-01.html#39
> 値0をもつ整数定数式又はその定数式を型void *にキャストした式を,空ポインタ定数(null pointer constant)と呼ぶ。

(int)0 になると空ポインタ定数ではなくなるので、ポインタに暗黙変換できなくなり、初期化・代入できなくなる。
2020/09/28(月) 09:14:55.72ID:QIpyCS2B0
>>981
int* p = (long int)0; // NG
int* p = (unsigned int)0; // NG

long, unsigned は、int 型と、数値の範囲が異なる。
int 型しかキャストできないのでは?
2020/09/28(月) 09:19:20.10ID:QIpyCS2B0
0 アドレスの特別ルールか
2020/09/28(月) 09:26:33.33ID:QxfbhGyV0
0も厳格にはマジックナンバーだが
現実のシステムで0番地なんか普通の変数に使えなくていいから
理に適ってる
2020/09/28(月) 09:47:47.09ID:IwymMB/J0
アドレスは関係ないよ。
http://www.kouno.jp/home/c_faq/c5.html#5
990デフォルトの名無しさん (ワッチョイ f793-raSa)
垢版 |
2020/09/28(月) 10:10:46.96ID:BXhKM0Xn0
>>982
むつかしくてわからないのでひらがなでおねがいします


>>985
こんな感じで理解しておけばいいですか?

・整数定数式としての「0」とは、ソースコードに直接書かれた「0」で、評価されて返ってきた「(int)0 ⇒ 0」や「4 - 4 ⇒ 0」などの「0」は整数定数式とは言わない。
・同じ0でも、void*型の「0」や、整数定数式としての「0」だけを空ポインタ定数と呼び、空ポインタ定数は代入の際にポインタ型へ暗黙変換できる。
よって
int* p = (int)0; // 「(int)0」が評価されて返ってきた「0」は整数定数式ではないので空ポインタ定数ではない。だから暗黙変換できずに代入無理。
int* p = 4-4; // 同様に、評価されて返ってきた「0」は整数定数式ではないので空ポインタ定数ではない。だから暗黙変換できずに代入無理。
int* p = 0; // 定数式としての「0」だから代入OK

型と値が一緒の、同じint型の「0」であっても、定数式と返り値とでは、それぞれの持ってる機能が違うということですか?
2020/09/28(月) 10:24:28.53ID:QxfbhGyV0
>>990
じーしーしーのばーじょんをかくにんしてから
おまえさんのこーどをくわせてみてるんだよ
せんげんだけしてつかってないへんすうがあるのをけいこくされているけど
それはおまえさんがきにしてるかたのもんだいじゃなさそうだねっていってるの
992デフォルトの名無しさん (ワッチョイ f793-raSa)
垢版 |
2020/09/28(月) 10:34:20.53ID:BXhKM0Xn0
>>991
ひらがなでわかりやすくせつめいしてくださったので
あたまのわるいわたしでもようやくわかりました
ありがとうございます
2020/09/28(月) 11:51:02.18ID:PXJ7xAyjF
NULL == 0 // true

ちなみに0は
994デフォルトの名無しさん (エムゾネ FF32-0ian)
垢版 |
2020/09/28(月) 11:51:34.94ID:PXJ7xAyjF
NULL == 0 // true

ちなみに0は8進数な
2020/09/28(月) 12:33:12.25ID:Iit1NWg4M
NULL == 0 // true

ちなみに0は8進数なんてことなく10進数なんてことなく16進数なんてこともない
2020/09/28(月) 13:16:35.37ID:QxfbhGyV0
いや8進数だよ
0xで始まったら16進数
0で始まったら8進数

こんな関数作って見たらわかるよ
syukudai("210") == 210
syukudai("110") == 110
syukudai("010") == 8
syukudai("0x10") == 16
997デフォルトの名無しさん (ワッチョイ 92a5-6ZJT)
垢版 |
2020/09/28(月) 13:27:42.04ID:zovFJ8Ky0
次スレは
2020/09/28(月) 14:23:39.09ID:qeCUoC3kM
みんなの心の中にいつまでもいるさ
999デフォルトの名無しさん (ワッチョイ 6b4e-gvfU)
垢版 |
2020/09/28(月) 14:46:36.10ID:MwxSOqxv0
質問いいですか?
2020/09/28(月) 14:57:57.86ID:Iit1NWg4M
>>996
> 0で始まったら8進数

なら、敢えて数字リテラルで8進数のゼロを表すなら 00 だろう。

つか8未満の数「値」に8進数ってなんだYO!!
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 140日 15時間 37分 31秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


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

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

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

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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