X



C言語なら俺に聞け 155
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん (ワッチョイ 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
0002デフォルトの名無しさん (ワッチョイ 6aad-48kr)
垢版 |
2020/05/11(月) 03:59:02.63ID:OH0s44mS0
1乙
0004デフォルトの名無しさん (アウアウエー Sae2-jgrQ)
垢版 |
2020/05/12(火) 10:12:47.53ID:4WwqN1hQa
for(int i = 0, a = 2; i < 10; ++i) ...
同じ型じゃなくて
Cで
for(int i = 0, long a = 2; i < 10; ++i) ...
観たいに描く方法を教えて
0010デフォルトの名無しさん (アウアウエー Sa93-yXYh)
垢版 |
2020/05/13(水) 09:40:34.63ID:p9DOzuLsa
「値が使われる場合」

勝手に読み飛ばすな
0012デフォルトの名無しさん (ワッチョイ cd01-oAke)
垢版 |
2020/05/13(水) 10:12:38.54ID:JcjM8CgX0
C++はテンプレートと演算子オーバーロードの関係で前置で良い場合は全て前置にする。
0014デフォルトの名無しさん (ワッチョイ cd01-oAke)
垢版 |
2020/05/13(水) 11:00:41.30ID:JcjM8CgX0
禿げ(C++の神)から前置にしろと御神託があった。
SA: 禿4 pp.982
0015デフォルトの名無しさん (ワッチョイ cd01-oAke)
垢版 |
2020/05/13(水) 11:01:29.69ID:JcjM8CgX0
いまどき小学生でも後置なんて使わんわ。
0016デフォルトの名無しさん (ワッチョイ cd01-oAke)
垢版 |
2020/05/13(水) 11:02:35.63ID:JcjM8CgX0
後置は幼女にのみ許される特殊な魔法。
0018デフォルトの名無しさん (ワッチョイ cd01-oAke)
垢版 |
2020/05/13(水) 11:21:16.85ID:JcjM8CgX0
4回書き込んだだけで2位かよ。
ム板はこれから青森サーバーと呼ぶ。
0020デフォルトの名無しさん (ワッチョイ cd01-oAke)
垢版 |
2020/05/13(水) 12:15:04.96ID:JcjM8CgX0
ムエタイがなんだって?
0021デフォルトの名無しさん (ブーイモ MMe1-VBdI)
垢版 |
2020/05/13(水) 12:53:38.05ID:fSpTrz0hM
前置は不可分にしてしまった継続処理くらいにしか使いみちがない特殊な演算子だからのう
c言語的にどっちでもいい場合とりあえず前置にして論理バグのスルーを防ぐみたいなやり方あるかもしれない
0025デフォルトの名無しさん (アウアウエー Sa93-yXYh)
垢版 |
2020/05/13(水) 14:48:22.25ID:oWyvBIrOa
それは気のせい
0027デフォルトの名無しさん (ワッチョイ dbbd-wHYS)
垢版 |
2020/05/13(水) 21:32:12.94ID:+AdS1P590
C言語しか知らなくて、学びながらプログラムの作成にチャレンジしてるものです。
fopenについて教えてください。

fopen("wb")で開くとポインタ(ストリーム?)はファイルの先頭で上書きモード
fopen("ab")で開くとポインタ(ストリーム?)はファイルの最後で追記モード
ということを知りました。

既存ファイルを開き、先頭部分のデータの一部を上書き、且つ、末尾にデータを追加したいと考えています。
この場合は、どっちか片方で開いてfseekとかでポインタ移動してしまえば、 上書きも追加もできるのでしょうか?
それとも上書きしたあと、一旦fcloseをして開きなおさなければならないのでしょうか。

よろしくお願いいたします。
0028◆QZaw55cn4c (NZ 0H13-RpJK)
垢版 |
2020/05/13(水) 21:49:53.34ID:k/cJlRBbH
>>27
fseek() で書きたい位置に移動して自由に fwrite()/fread() を使うだけで OK です。
fclose() は一番最後に一回だけでいいですよ
0030デフォルトの名無しさん (ワッチョイ df61-XfUa)
垢版 |
2020/05/13(水) 22:08:13.59ID:Gt6y73ao0
>>27
wは既存ファイルは0バイトに切り詰め、aは出力時はfseekが効かずに常に末尾に追加なので
既存ファイルはr+bで開いて、存在しない場合はw+bで作成するのがいいのではないかな
0031デフォルトの名無しさん (アウアウエー Sa93-yXYh)
垢版 |
2020/05/14(木) 11:05:34.52ID:tvxDWcUoa
>>27
"ab+"
0032デフォルトの名無しさん (ワッチョイ 7f2c-JcAG)
垢版 |
2020/05/14(木) 15:09:17.87ID:FSEZeoAj0
Ruby でやってみた

入力ファイル → 更新後
123456789 → abc456789xyz

filename = "test.dat"

# バイナリ読み書き両用
File.open( filename, "r+b" ) do |io|
io.write( "abc" )

io.seek( 0, IO::SEEK_END ) # ファイルの末尾から
io.write( "xyz" )
end

# 更新後のファイルを読み込む
File.open( filename, "rb" ) do |io|
puts io.read( nil )
end
0039◆QZaw55cn4c (NZ 0H13-RpJK)
垢版 |
2020/05/16(土) 22:07:40.72ID:JWSyjCc8H
>>38
失礼しちゃいますね!
私が着火したことはほとんどなく、むしろ買ってに周りが発火している、という気がするのですが?
私が着火した、という証拠はありますか?あるというのなら URL で示してください!
0048デフォルトの名無しさん (ワッチョイ 9719-qwq+)
垢版 |
2020/05/20(水) 18:41:23.97ID:p2AYPvOI0
全部計算して計算結果を比較して最大値を求めれば良いのでは?
質問の意図が見えない…

iとjの2重ループで全部計算させて結果をresult[i][j]に入れる
その後、もっかい2重ループして最大値を探す

そのまんまだけど…
0049デフォルトの名無しさん (ワッチョイ a3ad-K2LH)
垢版 |
2020/05/20(水) 18:49:12.44ID:d4aDDKtR0
i,jのサイズが2の時x[i][j]の組み合わせは
@x[0][0]=0、x[0][1]=0、x[1][0]=0、x[1][1]=0
Ax[0][0]=0、x[0][1]=0、x[1][0]=0、x[1][1]=1
Bx[0][0]=0、x[0][1]=0、x[1][0]=1、x[1][1]=0
Cx[0][0]=0、x[0][1]=0、x[1][0]=1、x[1][1]=1
Dx[0][0]=0、x[0][1]=1、x[1][0]=0、x[1][1]=0
……って続くと思いますが、この配列の中身の全組み合わせを生成したいです
0055デフォルトの名無しさん (ワッチョイ 1aa5-ksJK)
垢版 |
2020/05/20(水) 19:56:18.69ID:WJVU+U120
>>49
@x[0][0]=0、x[0][1]=0、x[1][0]=0、x[1][1]=0
Ax[0][0]=0、x[0][1]=0、x[1][0]=0、x[1][1]=1
Bx[0][0]=0、x[0][1]=0、x[1][0]=1、x[1][1]=0
Cx[0][0]=0、x[0][1]=0、x[1][0]=1、x[1][1]=1
Dx[0][0]=0、x[0][1]=1、x[1][0]=0、x[1][1]=0

ここから値だけ取り出すとこうなる

0000
0001
0010
0011
0100
...

あとは簡単でただの二進数だから1重ループでその整数を1bitずつシフトしてマスクして代入すればいい
0057デフォルトの名無しさん (アウアウエー Sa52-pTKR)
垢版 |
2020/05/20(水) 20:03:34.53ID:Dfazl3Afa
何のために二次元にしてるのかイミフ
値も0と1しか入れないなら
もっと簡単な構造にすればいいのに
0058デフォルトの名無しさん (ラクッペペ MMb6-Zfss)
垢版 |
2020/05/20(水) 20:40:35.00ID:O/hEDbqjM
>>49
> ……って続くと思いますが、この配列の中身の全組み合わせを生成したいです

生成すればいい
何が問題なのか説明しないで問題丸投げは嫌がられるぞ
便利な標準関数一つで解決するとかを期待してるなら無理だ
0059デフォルトの名無しさん (ワッチョイ a37b-X2LZ)
垢版 |
2020/05/21(木) 05:39:15.31ID:vAblB4+m0
bool x[I_NUM][J_NUM]; とすると、x全体で取りうる値のパターン数は
2 ** (I_NUM*J_NUM) になるから、よほど小さな I_NUM, J_NUM でなきゃ
全通りを一度に生成して一覧表で返す方法は無理だよね。

添字 i, j について回る2重ループと、
特定の i, j における x[i][j] に 0, 1 を格納するループ、
合わせて3重のループで「ある場合のx」を生成して
その x で f(x) を計算して、最大値を更新、
3重ループが終わった時点で全パターンでの最大値が得られる、
て感じにするんじゃないかな。

>>46 の「x[i][j]が変数の関数」ってのが、
関数のパラメータとして2次元配列x[][]を取る、って理解だけど。
0062デフォルトの名無しさん (ワッチョイ 3302-9WPr)
垢版 |
2020/05/21(木) 11:56:11.97ID:J954h+Be0
Cの逆アセ対策の難読化って、ヘッダの関数シグネチャも変えた方がいいの?
0064デフォルトの名無しさん (ワッチョイ 3302-9WPr)
垢版 |
2020/05/21(木) 12:21:49.65ID:J954h+Be0
>>63
サンクス
復号ローダーは初めて聞いたわw
0066デフォルトの名無しさん (ワッチョイ 8b01-CNUQ)
垢版 |
2020/05/21(木) 17:03:55.36ID:vAg7pclj0
セキュリティ周りは英語みるしかないね
日本人は忌避感が強すぎる
teratailとかでたまに質問してる人がいるけど
「悪用するひとがいるから回答できない」みたいな発言ばっかり
セキュリティ後進国ニッポン万歳
0079デフォルトの名無しさん (オイコラミネオ MMe3-rpJt)
垢版 |
2020/05/22(金) 10:44:52.26ID:yrPx0C2WM
>>78
配列や変数に値を入れるより先に値を読むような処理があるなら、その値は不定になるよ。
不定じゃ困るなら初期化しなければならないし、処理の流れ上読むより先に必ず値を入れることになるなら必ずしも初期化は要らない。
0081デフォルトの名無しさん (ワッチョイ 1bf9-f9J/)
垢版 |
2020/05/22(金) 10:46:44.80ID:RnFaArUl0
全部初期化した方がいいといえばいい、というか…
0とかのデフォ値でいいならそうだよ、というか…

変数に代入し忘れのバグって、変数に代入すべき所でしてないのが原因なワケで
それを直さないとバグったままだよ
0083デフォルトの名無しさん (スフッ Sdba-K7uz)
垢版 |
2020/05/22(金) 21:35:43.84ID:zmnGp56md
Cでディクショナリ型のデータ構造が使いたいんだけど何かいい擬似的な仕組みとかないかな
0084デフォルトの名無しさん (ワッチョイ 1aa5-ksJK)
垢版 |
2020/05/22(金) 21:37:08.62ID:Czx4JK5B0
深く考えずそこいらのハッシュのコードをコピペして終わり
0088デフォルトの名無しさん (アウアウエー Sa52-pTKR)
垢版 |
2020/05/23(土) 04:45:14.96ID:d49u2Ywha
>>83
tcl/tk
または
memcached/memcache-client
0089デフォルトの名無しさん (アウアウエー Sa52-pTKR)
垢版 |
2020/05/23(土) 04:46:10.15ID:d49u2Ywha
>>87
ロリコンGNU汚染は深刻
0090デフォルトの名無しさん (アウアウウー Sac5-VESM)
垢版 |
2020/05/27(水) 15:04:52.92ID:qSr4WIyQa
Cの初心者質問スレはここでいいのかな?
0091デフォルトの名無しさん (アウアウウー Sac5-VESM)
垢版 |
2020/05/27(水) 15:09:46.32ID:qSr4WIyQa
【問題】最大値と最小値を順番に表示するプログラムを作成したい。以下のプログラムに適切なコードを追加して完成させよ。
【プログラム】
int main(void)
{
double a, b, c, max, min;
scanf("%lf", &a);
scanf("%lf", &b);
scanf("%lf", &c);
/* ここにコードを追加 */
if(max<b) {
max = b;
}
if(max<c) {
max = c;
}
if(min>b) {
min = b;
}
if(min>c) {
min = c;
}
printf("%f\n%f\n", max, min);
return 0;
}
0092デフォルトの名無しさん (アウアウウー Sac5-VESM)
垢版 |
2020/05/27(水) 15:10:27.38ID:qSr4WIyQa
【僕の解答】
if(max<a) {
max = a;
}
if(min>a) {
min = a;
}

を追加したのですが、上手くいきません。
どこが間違っているのでしょうか??
0094デフォルトの名無しさん (アウアウウー Sac5-TOJA)
垢版 |
2020/05/27(水) 15:30:27.76ID:l0VRR152a
宿題か・・・

宿題は宿題用のスレがあるので次回からはそちらへ。
0095デフォルトの名無しさん (アウアウウー Sac5-VESM)
垢版 |
2020/05/27(水) 15:42:06.32ID:qSr4WIyQa
>>94
そのスレってどこにありますか?
0097デフォルトの名無しさん (ワッチョイ c17b-hIhO)
垢版 |
2020/05/27(水) 16:09:07.31ID:9+VJvnQZ0
170代目宿題スレッドって2つ生きてるんだ。片方しか見てなかったわ。
両方ともさほど繁盛してないみたいだけど。

最大値、最小値を入力されたデータの一つで仮に設定する手法か。
Cに限らない話だね。アルゴリズムって言うほど大袈裟でもないけど。
0098◆QZaw55cn4c (AU 0Ha3-rV2c)
垢版 |
2020/05/27(水) 20:08:39.45ID:9i+JkCQ6H
>>97
5 年ほど前は大繁盛だったんですけど、最近は授業でも C は取り上げられなくなったんですかね?
0102デフォルトの名無しさん (アウアウエー Sa23-1zQY)
垢版 |
2020/05/28(木) 11:35:50.55ID:vYrFHFhya
>>99
+1
0106◆QZaw55cn4c (AU 0Ha3-rV2c)
垢版 |
2020/05/29(金) 00:00:44.81ID:a4X0A1iZH
>>105
モダンな方法は言語によってもいろいろあるようですが(例えばネットに接続してライブラリの最新版を fetch してくるものとか)、でも、私は make から離れなれないですね…
0108デフォルトの名無しさん (ワッチョイ 2b10-IvHb)
垢版 |
2020/05/29(金) 04:13:16.10ID:NMA5faiP0
MPD(Music Player Daemon)のmakeがninjaに変わって、ビルドに泣いた。
mesonというconfigure相当のモノに、configureで指定していたオプションが無くて...

日本語命名品は凶悪だわ。MIRAIとかAnna-senpaiとか。
0109デフォルトの名無しさん (アウアウエー Sa23-1zQY)
垢版 |
2020/05/29(金) 12:01:15.97ID:kNF9S1Cua
>>105
C(gcc/cl)でもC++(g++/cl)でもC#(csc)でも現役でmakefile使ってる
0113デフォルトの名無しさん (ワッチョイ c17b-hIhO)
垢版 |
2020/05/29(金) 16:31:04.57ID:6E0tm9y70
テキストエディタほどでないにせよ、ビルドツールも喧嘩の種になりそうかな。
大勢の人が集団で開発とか、クロスプラットフォーム向けに配るとかでなきゃ、
好きにすりゃいい気もするのう。

個人的にはmakeが大好きで万能バッチファイル的に使うけど、
俺自身決してモダンボーイじゃないから。
0116デフォルトの名無しさん (ワッチョイ c17b-hIhO)
垢版 |
2020/05/29(金) 19:15:47.50ID:6E0tm9y70
>>114 本当に単純なサブルーチン呼び出し風なら
サブルーチンに相当するターゲットを順番に依存対象にしてこんな感じ。

.PHONY: main sub1 sub2

main: sub1 sub2
 @echo "and now, going main"

sub1:
 @echo "this is sub1"

sub2:
 @echo "I'm sub2"
0119デフォルトの名無しさん (ラクッペペ MM4b-eKGp)
垢版 |
2020/06/01(月) 09:59:41.94ID:ruvyvZ5aM
てす
0120デフォルトの名無しさん (ワッチョイ d344-8DLB)
垢版 |
2020/06/01(月) 23:23:12.08ID:GR8q4A/e0
グローバル変数で、
char A[4], B[4];
と宣言したら、メモリ中でAのすぐ隣にBが来ることは保証されているんですか?
例えば、Aはインデックスが0から3までですが、この範囲を超えてA[4]に
アクセスしたら、それはB[0]にアクセスしたことになるんですか?
0127デフォルトの名無しさん (ブーイモ MMab-S7K8)
垢版 |
2020/06/02(火) 10:04:47.98ID:OudFIOlRM
char A[8];
char *const B=&A[4];
でいいじゃんなにが問題なの?
0130デフォルトの名無しさん (ワイーワ2 FFa3-1zQY)
垢版 |
2020/06/02(火) 13:00:39.48ID:nij7NU0AF
ゴールポストが動き始めましたω
0131デフォルトの名無しさん (ワッチョイ 2b69-upCQ)
垢版 |
2020/06/02(火) 13:13:15.29ID:LaW3uxXL0
× 隣接する前提で突破させてアクセスしたい
△ どうも B[0] の値がいつのまにか変わっちゃってるんだけど A[]で突破して書き込んだ可能性をチェックしたほうがいい?
0132デフォルトの名無しさん (ワッチョイ 9302-YHRm)
垢版 |
2020/06/02(火) 13:23:37.03ID:iAkpbabl0
配列操作の関数とかで
void func(int data[], int size){
for(int i = 0; i < size; i++)data[i] = 111;
}
みたいな関数って
void func(int *data, int size){
for(int i = 0; i < size; i++)data[i] = 111;
}
って書いても動くけど、何が違うのですか?
書き方違うだけでまったく同じ?
0134デフォルトの名無しさん (ワッチョイ 9302-YHRm)
垢版 |
2020/06/02(火) 13:28:49.67ID:iAkpbabl0
ありがとう
0135デフォルトの名無しさん (JP 0Ha3-7GQX)
垢版 |
2020/06/02(火) 14:06:09.30ID:G0GLY7QlH
IT掲示板群 ttp://x0000.net/forum.aspx?id=15

学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン(画像有り)
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0

PS malloc / free を実装してみた (C#)
ttp://up.x0000.net/files/TMallocTest.zip
0138デフォルトの名無しさん (エムゾネ FFea-hy1p)
垢版 |
2020/06/03(水) 09:03:39.06ID:wbZbutmLF
まじめにやると
union{
char A[8];
struct{
char A[4];
char B[4];
}S;
}U;
0139デフォルトの名無しさん (エムゾネ FFea-hy1p)
垢版 |
2020/06/03(水) 09:11:25.16ID:wbZbutmLF
蛇足でついでにテスト
http://codepad.org/TOo6U3jn
0142デフォルトの名無しさん (ワッチョイ 99ad-8EEL)
垢版 |
2020/06/03(水) 23:54:54.10ID:s2kYPv500
C言語は得意だぞ笑
何でも聞いてくれ!
0145デフォルトの名無しさん (ワッチョイ caad-DtfW)
垢版 |
2020/06/04(木) 08:57:07.42ID:Cmh9rlbL0
>>138
それって言語仕様としてはうまくいくと保障できる?
0149デフォルトの名無しさん (ワッチョイ 99ad-s6un)
垢版 |
2020/06/04(木) 11:06:13.36ID:fpPgT8jn0
俺ってC言語得意だからいっぱい質問してくれると嬉しいな
0150デフォルトの名無しさん (ワッチョイ 2501-B5RW)
垢版 |
2020/06/04(木) 11:20:23.30ID:KwTRcPMk0
頼もしいなヲイ。
0152デフォルトの名無しさん (ワッチョイ 2501-B5RW)
垢版 |
2020/06/04(木) 11:41:06.99ID:KwTRcPMk0
++i;
0154デフォルトの名無しさん (ワッチョイ 99ad-s6un)
垢版 |
2020/06/04(木) 12:23:12.56ID:fpPgT8jn0
charは絶対1バイトになるよな
それともOSのページングの話
0156デフォルトの名無しさん (ワッチョイ 99ad-s6un)
垢版 |
2020/06/04(木) 12:27:08.24ID:fpPgT8jn0
普通にPCで応用ソフト作ってるときにアライメントとか意識したことないわ
0157デフォルトの名無しさん (ワッチョイ 99ad-s6un)
垢版 |
2020/06/04(木) 12:28:04.94ID:fpPgT8jn0
ここのスレってもしかして組み込み連中が多いのか!?
0158デフォルトの名無しさん (ワッチョイ 99ad-s6un)
垢版 |
2020/06/04(木) 12:35:48.21ID:fpPgT8jn0
PCは4バイトでやりとりするからint型が一番速いというのは聞いたことがあるが、ソースコードの可読性を落としてまでintで宣言しないだろ
優先順位:可読性>>>>型による実行速度の改善
0160デフォルトの名無しさん (ワッチョイ 3e8c-tVk4)
垢版 |
2020/06/04(木) 14:19:05.16ID:86obmMrj0
Cは白飯
0162デフォルトの名無しさん (ワッチョイ a105-uikQ)
垢版 |
2020/06/04(木) 14:34:04.88ID:797dYlrL0
>>158
32ビットCPUなら4バイト、64ビットCPUなら8バイトずつ読む
のがCPUさんにだいたい優しいんよ

ていうかワード境界またぐと例外ぶっこくCPUとかあるし
でもって例外処理で残りを読むとかで超遅くなるとかさー
0163デフォルトの名無しさん (ワッチョイ 8669-INBt)
垢版 |
2020/06/04(木) 14:42:43.40ID:xW4yRJob0
struct は アライメント1/4/8 で半端な部分はパディングする
アライメント4 で宣言順に配置する処理系
struct A1 {
char a[3];
char b[6];
int c;
};

 a 3バイトの後 1バイトパディングを挟んで
b 6バイト 2バイトパディングを挟んで
c sizeof(int) バイト
こうなる

union の中の struct だけは アライメント1 というのもない
union {
char x[100];
struct A1 a;
} foo;

struct A1 b;

foo.a と b が異なるメモリアクセスになっちまうもの
0164デフォルトの名無しさん (ワッチョイ 8669-INBt)
垢版 |
2020/06/04(木) 14:49:40.87ID:xW4yRJob0
× struct は アライメント1/4/8 で半端な部分はパディングする
 アライメント4 で宣言順に配置する処理系
○ struct は アライメント1/4/8 で半端な部分はパディングするという処理系で
 アライメント4 配置する場合

言語仕様上
構造体のメンバ間は連続したメモリ空間上にあることは保障してるけど
スキマなく詰めるとかのメンバの詰め方に関する規定は無いんでなかった?
0166デフォルトの名無しさん (ワッチョイ 99ad-s6un)
垢版 |
2020/06/04(木) 21:07:13.12ID:fpPgT8jn0
Cユーザーってやっぱ変わった奴多いなー
ガチムチの土方って感じがするわ
0169デフォルトの名無しさん (ワッチョイ 2d7b-W1iy)
垢版 |
2020/06/05(金) 05:07:50.58ID:EL/RRtNB0
>>165
おそらくセーブするときにバイト単位でギチギチに詰め込んでたんだろな。
容量の節約か解析避けの一環か。
ロードしたデータは扱いやすい大きさごとに並べ直して使う。
0178デフォルトの名無しさん (ワッチョイ caad-DtfW)
垢版 |
2020/06/06(土) 01:05:56.74ID:WvOhFHQn0
確か1オクテットといったら8ビットだが1バイトは8ビットとは限らないんだよな。
0179デフォルトの名無しさん (ワッチョイ 99ad-tS+g)
垢版 |
2020/06/06(土) 01:11:50.49ID:P2ph+/530
おまいらほんとガチムチだな
その才能をもっと色んなジャンルに活かせよ
ゲーム解析するぐらいならCで書かれたPrologのインタプリタのソース読む方が社会的に有意義だし、カッコいいぞ
いいぞPrologは。アルゴリズム特化型言語だ
0184デフォルトの名無しさん (ワッチョイ caad-DtfW)
垢版 |
2020/06/06(土) 06:53:02.07ID:WvOhFHQn0
英語では数は3桁区切りだったもんだからつい2進数も3桁毎に区切って考えてしまったのではないかな?
0185デフォルトの名無しさん (ワッチョイ ca01-tm4w)
垢版 |
2020/06/06(土) 08:12:55.01ID:EzIfGGLg0
流石にそれは無理があるw
>>181が言うように1バイトと言うか1文字が6bitで良かったから3bit x 2で管理するのが都合が良かった
なので当時のコンピュータには18bitとか36bitマシンとかもあった
その流れで16bitマシンでもパネルとかは3bit区切りになってたりする
https://www.hpmuseum.net/images/2108A-37.jpg
0188デフォルトの名無しさん (ワッチョイ 3e8c-tVk4)
垢版 |
2020/06/06(土) 08:56:36.69ID:sv96bxFv0
にしん御殿を建てた漁師もいた。
0189デフォルトの名無しさん (ワッチョイ 2a52-gmWH)
垢版 |
2020/06/06(土) 09:02:46.57ID:AQK/o2mm0
>>181
N進数自体は論理的にはNがどんな正の正数でも可能だけど、C言語的に文法上8進数が記述できるのはUNIX系のファイルシステムのパーミッションとかで使いやすいからとかでないかな。
0200デフォルトの名無しさん (ワッチョイ 86d2-uikQ)
垢版 |
2020/06/06(土) 16:36:30.29ID:75+7y3pj0
アセンブラで別のCPU勉強し直すと変に前のCPUの知識が足引っ張って戸惑う。

Z80 → x86
セグメント?概念は理解できた。記述方法よくわからん。
repって何?
byte prt ? word ptr? あ、データサイズ指定必要なんだ。

→とあるスパコンCPU
え?オペランド3つ? 
あ、0レジスタは聞いたことある。 
スタックレジタ無し?汎用レジスタで代用?
0201デフォルトの名無しさん (ワッチョイ caad-wk5h)
垢版 |
2020/06/06(土) 17:08:16.80ID:WvOhFHQn0
こんなまとめ記事のようなものを発見した。

1バイトが8bitに定まったのは2008年 - Qiita
https://qiita.com/yaju/items/c5da6df2221d5c3611e0
0206デフォルトの名無しさん (ワッチョイ c1f0-mXJe)
垢版 |
2020/06/06(土) 21:05:24.00ID:xUUhYAg30
>>205
データバスが16ビットのデバイスはA0が存在しないから、奇数アドレスがないんだよ
ハードウェア的には8ビットは扱えない
上位はコンパイラーが無視してるんだろ
昔の6800系のgccは奇数アドレスが使えなかった
0224デフォルトの名無しさん (ワッチョイ 2d7b-W1iy)
垢版 |
2020/06/07(日) 16:38:34.23ID:Hm2+3fRX0
>>221 上手い書き換えだな。
何やら見覚えのある「位取り」というか「桁上がり」法だと思ったら、
「連番を(数字でなく)英文字を使って表現する」やり方がこれだ。

1番 a
2番 b
...
26番 z
27番 aa (位取り/桁上がりの 0 に相当する記号が存在しないため)
28番 ab
...

『Cの宝箱』(工学社)って本で数値からの変換プログラムを含めて初めて見た。
ANSI以前の古い本だけど、扱ってるネタは今でもなかなか面白い。
0226デフォルトの名無しさん (アウウィフ FF11-B5RW)
垢版 |
2020/06/07(日) 17:27:43.06ID:ABh2E5hxF
>>224
excelのカラム名だな
0228デフォルトの名無しさん (アウウィフ FF11-B5RW)
垢版 |
2020/06/07(日) 17:56:40.04ID:ABh2E5hxF
定義上は間違ってない
0の桁上がりが00で次が000なら成立してる
0230224 (ワッチョイ 2d7b-W1iy)
垢版 |
2020/06/07(日) 18:58:57.43ID:Hm2+3fRX0
>>226 確かに「Excelのカラム」がこれだね。
範囲指定の時にマウスポインタを暴走させるとちょくちょく目にする。
身近な実例なのに思いつかなかった。

それにしてもワッチョイの英数部分(何て呼ぶんだろ?)が FF11 とは。
0231デフォルトの名無しさん (アウウィフ FF11-B5RW)
垢版 |
2020/06/08(月) 15:49:07.32ID:blut5LG8F
#
0236デフォルトの名無しさん (ワッチョイ 237b-FyPE)
垢版 |
2020/06/11(木) 06:19:27.46ID:zR4s1lAr0
man gcc を見ると -Wextra のところに This option used to be called -W.
と出てるね。日本語だと「かつては -W と呼ばれていた」で合ってるだろうか。

-W を指定することと -Wextra を指定することは同じ効果かな。
0238デフォルトの名無しさん (ワッチョイ 8f01-pPzt)
垢版 |
2020/06/24(水) 12:01:11.31ID:T7mdaPsT0
元気があればなんでもできる。
Cさえ出来ればなんでもできる。
0244デフォルトの名無しさん (ワッチョイ 8f9b-/Fs/)
垢版 |
2020/06/25(木) 11:19:49.85ID:2XRewe5U0
>>240
自己参照構造体とか普通に使う
0250デフォルトの名無しさん (スプッッ Sde3-WMoV)
垢版 |
2020/06/25(木) 13:27:45.77ID:HOWmpZqad
名前が付いてるようなのは既存のを使えば良い
付いてないような複雑な構成、特殊な構成のものがさらっと作れるようになって一人前

名前が付いてる構造をただ列挙して喜んでるようなのは初心者
0251デフォルトの名無しさん (ワッチョイ ff8c-ZANo)
垢版 |
2020/06/25(木) 13:32:44.25ID:CW3F7rpu0
>>240
API使うから見たこともない。
0252デフォルトの名無しさん (ワッチョイ 0f7b-Yzg9)
垢版 |
2020/06/25(木) 17:18:14.56ID:f73tPHfd0
カーニハンが引用して有名になったフレーズだったと思うけど
「職業プログラマーでも二分探索を正しく実装できる者は意外なほど少ない」
ってのと似てる感じね。
出典はベントリーさんの記事だったかな。

で、ベントリーさんが出してる二分探索ルーチンの例が
(細かいこと言えば)誤ってるというお見事なオチ。
0253252 (ワッチョイ 0f7b-Yzg9)
垢版 |
2020/06/25(木) 17:22:50.60ID:f73tPHfd0
いかん、カーニハンさんに「さん」付けるの忘れた。
カーニハンに「さん」を付けるとなんか座りが悪い気がするんだよ。
べつに「ハン」は関西弁の「〜はん」じゃないのだけど。
0255デフォルトの名無しさん (ワッチョイ 3f01-In76)
垢版 |
2020/06/25(木) 17:53:32.70ID:Yy8QFoSC0
インブリードチェックとかねー
掘り掘りの打ち切り確認とか
可変配列で返せると効率的なのに記述や関数使用方法がCでは面倒くさいという
web上のサラブレッド血統表のインブリードどこも結構いい加減な自動抽出だし
0257252 (ワッチョイ 0f7b-Yzg9)
垢版 |
2020/06/25(木) 17:58:50.94ID:f73tPHfd0
>>254
そこは俺の投稿はアカデミックじゃなくて井戸端の噂話くらいなモンってことで。
何なら便所の壁に描かれた傘差したネズミの落書きでもいいのだが。
0259デフォルトの名無しさん (ワッチョイ 0f3e-NJGG)
垢版 |
2020/06/25(木) 23:23:06.88ID:Dxq2c9AW0
2ch (5ch) ではカーニハンは蟹飯とか呼ばれたりするのも普通だからなー。
さんを付けた方がすわりが良いと思うなら付けてもいいが、
ここでは雑に言っても文句は出ないよ。

敬称を付けなきゃ敬意がないってわけでもないし。
0261252 (ワッチョイ 0f7b-Yzg9)
垢版 |
2020/06/26(金) 07:00:11.04ID:Ks2Lu7GD0
>>258 の人に質問されたのでちょこっと書庫をひっくり返してみた。
書籍資料しか示せないし、古い本だから見つけるのは大変かも知れんけど。
今回は「さん」無しで書かせてもらう。人名が多くてやかましくなるでな。

カーニハンによる言及は『プログラミング作法』(ASCII)の第2章。
見直して気づいたけどベントリーからの直接の引用ではなかった。
あと、この本はカーニハンとパイクの共著だったので訂正させてもらう。

ベントリーによる2分探索法は『プログラム設計の着想』(近代科学社)の第4章。
ここに「ベル研とIBMで試したら2時間かけて正しく書けたのは10%」と出てる。
この章をまるまる使って、二分探索ルーチンを題材に、正しいプログラムを書く
手順を説明してるが、使用言語は擬似コードとBASICの方言。


補足としてネット情報 Wikipedia 「二分探索」ページ
特に「実装上の間違い」の部分が興味深いかと。
0263デフォルトの名無しさん (スプッッ Sde3-WMoV)
垢版 |
2020/06/26(金) 07:30:54.43ID:CbN2WAX/d
見てみたけど...

アルゴリズムの問題じゃなくて
ただのインデックスのオーバーフローか

インデックスが計算途中でオーバーフローする心配をするなら
要素数自体がintの範囲を越える心配やメモリ不足の心配もしないと
0266デフォルトの名無しさん (ワッチョイ 0f97-h9M3)
垢版 |
2020/06/26(金) 07:53:21.24ID:R6SXx1iE0
まあ、ビット数の少ないCPUを使ってた頃はオーバーフローで実際にバグの挙動を示していたこともあったのかもね。
64bitになって、今しばらくはインデックスの足し算をいい加減な順番で行ってもオーバーフローになるほど実メモリが積めなそうだけども。
0268デフォルトの名無しさん (ワッチョイ 0fca-bwNs)
垢版 |
2020/06/26(金) 08:22:33.07ID:zNtEkj210
>>263
だからアルゴリズムじゃなくて実装の問題だって話なんだろ。
そして型が int だとか size_t だとかの問題でもない。
どんな型であろうと計算の途中でその型をオーバーフローする可能性がある式だというのが問題であり、扱ってるデータではオーバーフローしないことを意識した上でそういう式を選んでるのかたまたまそういう条件になってるのかは大違いってこと。
最近は64bitだからいちいちそんなこと考える必要もないというなら、それは違うだろと(検索対象がメモリで64bitに及ばないメモリ量の環境でしか使わないコードだという考慮くらいは必要)。
特にライブラリなんかでは、インデックスの許容範囲がその型の許容範囲より狭いならば明記しなければならない。
0271デフォルトの名無しさん (ワッチョイ 0fca-bwNs)
垢版 |
2020/06/26(金) 09:27:28.43ID:zNtEkj210
>>269
扱う値の範囲をなんの考慮もせずに書いたコードがたまたま動いてるならバグと言うかはともかく考慮漏れだわな。
巨大な空間で距離を計算する話だったら、とりあえず式が double で足りるかくらい考えるだろ?

>>270
オーバーフロー回避を意識する必要があるなら a / 2 * b とか?
整数型なら a / 2 * b + a & 1 かな?
扱う値によって型なり式なりを選べってことだよ。
0279デフォルトの名無しさん (ワッチョイ 0fca-bwNs)
垢版 |
2020/06/26(金) 13:34:59.23ID:zNtEkj210
>>278
もし double でも計算途中でオーバーフローする可能性があるなら、最初に適当な係数の平方で a b を割って計算してから係数を掛けるとか?
あるいは long double が使えるなら単純にそれで計算するとか。
逆に言えば、オーバーフローする可能性があるならなんとかしないといけないわけだから、なんの変形もせずオーバーフローするに任せたらそれこそバグでしょうよ。
0288デフォルトの名無しさん (ワイーワ2 FFbf-/Fs/)
垢版 |
2020/06/26(金) 17:41:45.88ID:PjbtVFt+F
>>282
aに対してbがはるかに小さいとして
sqrt(a*a+b*b)がaになってもあまり困らない
0289デフォルトの名無しさん (ワッチョイ 0fca-bwNs)
垢版 |
2020/06/26(金) 17:47:26.42ID:zNtEkj210
double で何やったらオーバーフローするのかってことじゃなく、必要な対象を計算するのに必要な型や計算手順は何かってことだろ。
掛け算や指数を扱うならオーバーフローについては普通に考慮するもんだと思うけど、そうじゃないのか?
今扱おうとしてる対象について考慮してるから double なら大丈夫だと考えてるんだろ。
で二分木については足し算がオーバーフローする可能性が盲点ってことで、なるほどと思うべき所だろ。
アルゴリズム上も計算途中に最初に与えた imax を超える値が現れるようには見えないんだから。
今時 double も 64bit整数も当たり前だったとしても、SIMD使いたいからデータ長を抑えたいなんてこともあるでしょ。
0290デフォルトの名無しさん (ワイーワ2 FFbf-/Fs/)
垢版 |
2020/06/26(金) 17:54:06.22ID:PjbtVFt+F
一般論で答えても叩かれる
質問内容に特化して答えても叩かれる
どうしろと
0294デフォルトの名無しさん (アウアウウー Sad3-u/pE)
垢版 |
2020/06/26(金) 21:15:32.77ID:TyyL07+Ya
>>240
みんなかどうかは知らんがおれは書けるな
0295デフォルトの名無しさん (アウアウウー Sad3-u/pE)
垢版 |
2020/06/26(金) 21:18:13.75ID:TyyL07+Ya
>>253
カニチャーハン
0297◆QZaw55cn4c (NZ 0Hbf-W2Vx)
垢版 |
2020/06/26(金) 21:43:56.84ID:9IxUvn/4H
>>271
>オーバーフロー回避を意識する必要があるなら a / 2 * b とか?
それは回避したことになりません、演算子 / 2 と * b のどちらが先に処理されるかはコンパイラが籤引きで決めるか独断偏見で決め打ちするのでは?
0299デフォルトの名無しさん (ワッチョイ 8fe6-vKxb)
垢版 |
2020/06/26(金) 21:52:32.85ID:Sd6G194T0
逆にして(x=2)+(x=1)
だと 2 だね
https://ideone.com/MbXZtz
0301デフォルトの名無しさん (ワッチョイ 8fe6-vKxb)
垢版 |
2020/06/26(金) 21:57:33.08ID:Sd6G194T0
int x=0;
x=1;
x=2;
int y=x+x; //(2+2)
という話になっているのだと思われ
0302デフォルトの名無しさん (ワッチョイ 8fe6-vKxb)
垢版 |
2020/06/26(金) 22:03:10.60ID:Sd6G194T0
あとは優しいおじい・・紳士様がアセンブラでは実際どうなっているかを解説してくれるはず
0303デフォルトの名無しさん (ワッチョイ 0fca-bwNs)
垢版 |
2020/06/26(金) 22:32:16.04ID:zNtEkj210
>>297
自信を持っては言えないけど、/ 2 してから * b するのとその逆とでは結果が違うんだから、書いた式と結果が異なる可能性がある計算順にコンパイラがいじるものかね?
例えば各項を関数として a() / c() * b() にした場合、a 〜 c がどの順で実行されるか、つまり項の評価順は保証されないけどそれら結果を使った計算順は式通りになるんじゃないの?

でももし仮にそういう懸念があるなら、カッコ付けるなりそれでだめなら2手に分けるなりすればいいんじゃね。
0305デフォルトの名無しさん (ワッチョイ 3f85-NJGG)
垢版 |
2020/06/26(金) 23:31:20.43ID:ONx8T6wJ0
誰も逆汗しないのな。
一昔前だったら
A「俺がやってみるから待ってろ。」
B「いや、俺がやるから(ry」
C「いやいや、俺こそが」
AB「「どうぞどうぞ」」
の前振りだったのに。

VC++2019のデバッグモード
int y = (x = 1) + (x = 2);
00C118FF mov dword ptr [x],1
00C11906 mov dword ptr [x],2
00C1190D mov eax,dword ptr [x]
00C11910 add eax,dword ptr [x]
00C11913 mov dword ptr [y],eax

最適化したら 304 になるんだろうけど。
0307はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0f3e-NJGG)
垢版 |
2020/06/27(土) 00:56:28.31ID:VCabyp7F0
>>297
/ と * の優先順位は等しくて左結合なんだから疑問の余地はない。
a/2*b と書いてあったら a を 2 で割ってからそれに b をかける。
またはそうしたかのように見えるような振舞いをすることは保証される。
そうなってなかったらコンパイラのバグだよ。
0309デフォルトの名無しさん (ワッチョイ 0fca-bwNs)
垢版 |
2020/06/27(土) 01:14:50.37ID:qKnmoagb0
例えばスケーリングなんかの時、オーバーフローを避けるため割り算やってから掛け算することもあるし、丸め誤差を小さくするため掛け算やってから割り算することもあるし、
意図して式書いてるんだから順序を勝手に変えられたらやっぱり大問題だよな。
0312◆QZaw55cn4c (NZ 0Hbf-W2Vx)
垢版 |
2020/06/27(土) 07:46:43.88ID:5JNhQ0LTH
>>311
ありがとうございます、たしかに副作用完了点に対する私の誤解です
@値の評価の問題、と、A副作用の問題、とを完全にごった煮にしてました、今回は副作用は関係ない…

>QZがここまでアホだとは
現在までの推移を客観的に観察している限りにおいて、これはスランプでは済まず、私はこれからもっと阿呆になっていくのだろうと私は予測しています
https://mevius.5ch.net/test/read.cgi/tech/1434079972/ へのエントリー数もパッタリ止まってもう増えそうもありません
0320デフォルトの名無しさん (ワッチョイ 4fb3-WMoV)
垢版 |
2020/06/27(土) 09:11:00.12ID:TsX0h7IG0
許容誤差
パラメーターの対応範囲
コスト
保守性、可読性、...

これらを総合的に考えてコードを作るのが普通
1個だけの要素が気になるといびつな実装になる

色々な規格も偏った視野で作られる事が多くて
いびつな物が多い

それぞれの項目を勉強するのはもちろん良いこと
0324デフォルトの名無しさん (ワッチョイ 0fca-bwNs)
垢版 |
2020/06/27(土) 09:50:13.95ID:qKnmoagb0
オーバーフローの話は (imax + imin) / 2 ではなく imin + (imax - imin) 2 と書けば回避できるってのが発端なわけだけど、何がそんなに気にくわないんだ?
盲点とも言えるよくやりがちなことなんだから、素直に吸収しときゃいいんじゃないの?
0328デフォルトの名無しさん (ワッチョイ 4fb3-WMoV)
垢版 |
2020/06/27(土) 10:20:58.17ID:TsX0h7IG0
元はカーニハンとかいう人だろ
その影響を受けたのが>>268

オーバーフローの可能性が無いなら
前者のままでも良いっていうか
前者の方が良い場合もある

コストは確実に前者の方が安い
リニア検索ではなくてコードサイズの大きな2分検索を使うあたり
パフォーマンスが全くどうでも良い所ではないということもわかるわけで

移植性は後者、コストは前者、
可読性は微妙だが前者?

intよりsize_tを使うべきなんて思ってないよ
使う範囲、使う環境、移植性、...
などなどでどうするべきかは変わる
0334デフォルトの名無しさん (ワッチョイ 0fca-bwNs)
垢版 |
2020/06/27(土) 11:08:27.27ID:qKnmoagb0
>>333
たぶん論旨は伝わったと思うので追い打ちかけるつもりではないが、レス付けるに当たっては「オーバーフローを回避するなら」と必ず付けてるし、扱う値の範囲を鑑みて型が充分か考慮しろと言ってるだけのことな。
扱うのが宇宙の座標をメートル単位で、くらいの話なら double でもオーバーフロー的な問題は無いなとか、
でももしシミュレーションで宇宙を100次元空間として体積を求める話だったら double でも大丈夫かな?とか考慮するでしょ。
まあそんなケースだと値の大きさより有効桁の方が心配だけど、なんにしてもとりあえずデカい型だから大丈夫wなんて漫然と思ってるならただのアホという至極当然の話。
0336デフォルトの名無しさん (スプッッ Sde3-WMoV)
垢版 |
2020/06/27(土) 12:53:15.33ID:F1FZoULud
>>334
状況によって適切なコードを選ぶべきと思ってるなら別にいい
そうじゃなさそうだったので

「間違ってる」「バグ」「正しくない」という主張じゃなかった?

2分検索が10%しか正しく書けないなんてことはないと思うんだがね
0337デフォルトの名無しさん (ワッチョイ 0fca-bwNs)
垢版 |
2020/06/27(土) 13:02:32.88ID:qKnmoagb0
>>336
>2分検索が10%しか正しく書けないなんてことはないと思うんだがね
そう、ここが気になったんだけど、でももし二分検索を書いたこと無い人がアルゴリズムを見て一発で動作するコードが書けるか?という話なら、案外その程度かもと思ったり。
分割時の端数処理の考慮が不適切でインデックスが変化せず無限ループに陥ったり、検索から抜け落ちる要素が出たり、要素数が0〜2ないし3くらいの範囲でうまく動かなかったり。
ちょっと動かせばすぐ修正点に気付いて動くコードに仕立てられるだろうけど、ぶっつけで動かせるかと言ったら案外難しいんじゃね。
0338デフォルトの名無しさん (ワッチョイ 0fda-PIQW)
垢版 |
2020/06/27(土) 14:22:51.51ID:BPJhbq4z0
クイックソートを一発で書けと言われるとちょっとつらい。
あまりにうろ覚えすぎる。

30分待ってやる
と言われれば思い出しながら余裕を持って書ける。かな?

いやどうだろう?
ソートは完璧だろうけど、アルゴリズムはあやしいな
「クイックに似た何かソート」になりそうかも
0339◆QZaw55cn4c (ワッチョイ ffe9-W2Vx)
垢版 |
2020/06/27(土) 15:37:58.80ID:vUQmFWhd0
>>296,298-301
些細なことですが、>>296,298,299 の結果は納得いかないです

>int y = (x = 1) + (x = 2);

たしかに gcc/clang とも警告は出ますが、しかしそれはシーケンスポイント間で i を複数回書き込んでいる、という警告で、それは i の値が 2, 5 のいずれかになるか不確定という意味ですね

しかし演算子 + のオペランドの値は確定していて、すなわち 2 と 5
だから y の値は、この場合は確定的に 7 になるはずです

実際、手元の clang(8,0,1) でコンパイルした場合、結果は y = 7 で上の解釈と合致します。
私は gcc がバグっていると思いました。
0340◆QZaw55cn4c (ワッチョイ ffe9-W2Vx)
垢版 |
2020/06/27(土) 15:40:36.38ID:vUQmFWhd0
>>339
×シーケンスポイント間で i を複数回書き込んでいる、という警告で、それは i の値が 2, 5 のいずれかになるか不確定
○シーケンスポイント間で x を複数回書き込んでいる、という警告で、それは x の値が 2, 5 のいずれかになるか不確定
0343◆QZaw55cn4c (ワッチョイ ffe9-W2Vx)
垢版 |
2020/06/27(土) 16:26:01.60ID:vUQmFWhd0
>>341 ありがとうございます
JISX0301 の代入演算子をみると
>「6.5.16 セマンティクス「代入式は、代入後の左オペランドの値を持つが、左辺値でない」
つまり
式 x = 2
の値は 2 ではなく x というわけですか…なるほど
0352デフォルトの名無しさん (ワッチョイ 3fad-p8b5)
垢版 |
2020/06/27(土) 20:56:58.25ID:YxSvZ5UV0
代入も比較も同じ = 記号なんだけど代入した結果を利用できない言語はあるね。
0353デフォルトの名無しさん (ワッチョイ 3fad-p8b5)
垢版 |
2020/06/27(土) 20:57:46.41ID:YxSvZ5UV0
あ、ごめん。ないかな?でも作れなくはないか。
0358デフォルトの名無しさん (ワッチョイ 3fad-p8b5)
垢版 |
2020/06/27(土) 21:54:01.50ID:YxSvZ5UV0
あ、そうだ。昔の BASIC がそれだったな。今もそうか。
0360デフォルトの名無しさん (ワッチョイ ff8c-ZANo)
垢版 |
2020/06/27(土) 22:45:34.92ID:3uU6UKGu0
iZ-Cで頑張っている方々もいる。
0362デフォルトの名無しさん (ワッチョイ 3fad-p8b5)
垢版 |
2020/06/27(土) 23:11:39.40ID:YxSvZ5UV0
ま、しかし、本当なら代入は全く違う記号(あるいはワード)使って欲しいところではある。
昔々中学生の頃に初めてBASICのリストを見て A = A + 1 ってなんじゃこりゃと思った事あるし。
普通の数学や算数とルールが違っているのに同じであるかのような記号の使い回しで混乱w
0369デフォルトの名無しさん (ワッチョイ ff8c-ZANo)
垢版 |
2020/06/28(日) 11:47:20.61ID:vGhSDCc20
iZ-Cに反応しないのは素人か。
0371デフォルトの名無しさん (ワッチョイ 0fda-5fXH)
垢版 |
2020/06/28(日) 21:51:57.49ID:kMbOl++G0
変数名を文字列で取得したいんだけど どうしたらいいかな

printfデバッグとかで、 printf("hogehoge=%d\n",hogehoge); ってやるじゃん?
これをちょっとだけ効率よくしたいけど、マクロでどうにかならん?
0379デフォルトの名無しさん (ワッチョイ 8f01-/Fs/)
垢版 |
2020/06/29(月) 01:27:56.70ID:C/fQS0GP0
viがバグるのでやめてください。
0383デフォルトの名無しさん (ワッチョイ 0fca-bwNs)
垢版 |
2020/06/29(月) 13:35:04.89ID:rjGVLU620
>>374
書式文字列が常に同じになるケース(>>373)だとコンパイラの最適化で使い回されるようになるけど、
変数名を連結して書式文字列が場所ごとに変わっちゃうと使い回しが効かなくなるから、メモリ使用量とかファイルサイズで不利になるかもね。
前者にしても変数名そのものの文字列は別途定義されるのもあってほんの些細な違いだから、しいて言えばって程度の話だけど。
0384デフォルトの名無しさん (エムゾネ FF5f-qwRG)
垢版 |
2020/06/29(月) 15:01:50.53ID:fw2IFdDxF
and が & と &&
or が | と ||
という具合に bit 演算用と論理演算用で演算子が違いますが

bit 演算の xor は ^ で
int a = 123, b = 456;
のとき a^b と描けますが

論理式の xor はどう描けばいい?
bool u = true, v = true;
のとき u^v と描いても問題無いですか?
0386デフォルトの名無しさん (エムゾネ FF5f-qwRG)
垢版 |
2020/06/29(月) 15:25:14.45ID:fw2IFdDxF
bool に 0 と !0 以外が入ってても大丈夫ですか?
0387デフォルトの名無しさん (エムゾネ FF5f-qwRG)
垢版 |
2020/06/29(月) 15:27:23.97ID:fw2IFdDxF
もし御存じの方がいらっしゃったらで良いのですが
"u ^^ v" みたいな演算子が無い理由も知りたいです
問題後出しで済みません
0388デフォルトの名無しさん (JP 0H43-R4wo)
垢版 |
2020/06/29(月) 15:37:10.60ID:y9Ww1t9/H
ビットごとのxorは暗号とかで多用するけど、
論理式のxor(一方のみ真)はめったに使わないからかと。

!u != !v が最小かな。
0389デフォルトの名無しさん (エムゾネ FF5f-qwRG)
垢版 |
2020/06/29(月) 15:41:17.96ID:fw2IFdDxF
ありがとうございました
0391デフォルトの名無しさん (ワッチョイ 0fda-vVPI)
垢版 |
2020/06/29(月) 17:07:26.21ID:TPMqgpKl0
C99以降のbool型(_Bool型)の値はfalse(0)とtrue(1)のどちらかしか取り得ない
変数や式の評価が0以外の場合はすべて1に変換される
評価結果の値が不明の場合はbool型にキャストすると良い
(bool)u != (bool)v
0398デフォルトの名無しさん (JP 0Hbf-EqIm)
垢版 |
2020/06/29(月) 19:30:21.97ID:rBtTXcyIH
C言語に使ってるエディタとかIDEとか教えてください
OSとかの環境もあるとありがたい
0400デフォルトの名無しさん (ワッチョイ 8fe6-vKxb)
垢版 |
2020/06/29(月) 19:59:21.99ID:x9/2kcfz0
>>398
C言語を何に使うかによって全然違うと思うけど
0407デフォルトの名無しさん (ワッチョイ 8fe6-vKxb)
垢版 |
2020/06/29(月) 20:24:01.34ID:x9/2kcfz0
初学の時、H8に書くとき、arduinoに書くとき、それぞれ全部違ったわ。
0409デフォルトの名無しさん (ワッチョイ ff8c-ZANo)
垢版 |
2020/06/29(月) 21:49:44.45ID:uavgiC7w0
適切な問題とヒントが一番大事。
0411デフォルトの名無しさん (ワッチョイ cf2c-wMgy)
垢版 |
2020/06/30(火) 07:20:47.85ID:ojYrCHBE0
漏れは、Windows 10, WSL, Ubuntu 18.04 で、
VSCode の拡張機能、Remote WSL も使う

Linux側には、日本人が作った、バージョンマネージャーのanyenv で、rbenv, nodenv を使って、
ruby 2.6.6, node 12.16.2 を、build-essential で、コンパイルして入れた

yarn は、Windows側に入れて、WSL から、拡張子なしのyarn コマンドを呼べる。
これは、#!/bin/sh で始まるシェルスクリプト

anyenv は多言語向きで、rbenv, nodenv, pyenv, phpenv などを同じ使い方で、統一的に扱える

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

パッケージ: build-essential
https://packages.ubuntu.com/ja/bionic/build-essential
0413デフォルトの名無しさん (ワッチョイ ab7b-06wU)
垢版 |
2020/07/02(木) 09:18:11.06ID:1XrTO7+60
Cに限らず汎用で使える開発環境で色々やってるってことかと。

俺も基本的にはvimとmakeで何でもやる。
vimの中でとりあえず :make と打ってQuickFix機能でエラー修正。
上手く拾ってくれない時は ~/.vimrc で errorformat 変数に追加。

>>398 の人はOSも知りたいってことなので追加。
Linuxのウィンドウ環境使わないコンソールでfbterm(日本語表示用)。
ツール類はディストリビューションに入ってた奴。
0414デフォルトの名無しさん (JP 0H42-2vAA)
垢版 |
2020/07/06(月) 17:38:55.00ID:6O25/+p5H
int main (void)
{ char a[256];
printf("Enter a string:");
scanf("%s", a);

(以下略)
勉強中に上のような「キーボード入力からchar型配列に文字列を格納する」という処理を見かけました
この例だと(ヌル文字含め)256文字以上の文字が入力されたときはその後の処理が正常にできなくなりますよね
現実的には値を充分大きく指定しておけば問題はないのでしょうが、入力された文字数に応じて要素数を適切に設定したりはできないのでしょうか?
0430デフォルトの名無しさん (エムゾネ FFaa-A0XE)
垢版 |
2020/07/07(火) 14:00:00.91ID:092JXqIfF
>>416
scanf("%*s", 255, a);
みたいなのなかったっけ
うろ覚え
0432デフォルトの名無しさん (アウアウウー Sacf-Im8i)
垢版 |
2020/07/07(火) 18:32:30.56ID:e1WbjzO/a
* には別の意味がある。
0435431 (ワッチョイ 857b-4PPV)
垢版 |
2020/07/08(水) 06:21:59.38ID:sJ2uy93A0
>>432
scanf の * 書式指定子は「読み捨て」の指示だったね。
printf の * とは使い方が違うけど、ちゃんとある。
…存在をすっかり忘れてたよ。ありがとう。


>>433
カーニハン&パイクの『プログラミング作法』には
sprintfで書式指定文字列を作る方法が載ってるね。
下に示す例に比べれば手軽で分かりやすい。

入力文字幅がコンパイル時固定ならマクロを駆使して…

// マクロ名を「マクロの内容を表す文字列」に変換するマクロ関数
#define MACRO_TO_STR_SUB(name) #name
#define MACRO_TO_STR(name) MACRO_TO_STR_SUB(name)

#define WIDTH 15 // 入力制限字数(末尾の'\0'を含まない)

 char buf[WIDTH+1]; // +1 for '\0'
 scanf("%" MACRO_TO_STR(WIDTH) "s", buf);

こんな感じにできるけど、面倒でしょ。
0437デフォルトの名無しさん (エムゾネ FF43-VqvP)
垢版 |
2020/07/08(水) 09:30:02.93ID:hADFKHguF
>>435
scanf("%" #WIDTH "s", buf);
じゃだめなんですか?
0439デフォルトの名無しさん (エムゾネ FF43-VqvP)
垢版 |
2020/07/08(水) 10:11:35.43ID:hADFKHguF
#define MACRO_TO_STR(name) #name

そもそもこれもだめなんですね
0442デフォルトの名無しさん (JP 0H93-4zP6)
垢版 |
2020/07/08(水) 11:22:06.26ID:woPNJQ5aH
IT掲示板群 ttp://x0000.net/forum.aspx?id=15

学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン(画像有り)
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0

☆ VMを書いた(C#) * x86ではない!
ttp://up.x0000.net/files/TSimulang.zip
☆ malloc / free を実装してみた (C#)
ttp://up.x0000.net/files/TMallocTest.zip
0443デフォルトの名無しさん (ワッチョイ cb69-6wWl)
垢版 |
2020/07/08(水) 11:45:14.69ID:KKQXIGLi0
#define WIDTH 10
#define MACRO_TO_STR(name) #name

MACRO_TO_STR(WIDTH)
は渡された識別子をそのまま文字列化するので "WIDTH" になる

マクロWIDTHを展開した後での文字 "10" が欲しいときは >>435 のように
一見無駄に見えるマクロのピンポンを行なう
0448デフォルトの名無しさん (スップ Sd43-Tflg)
垢版 |
2020/07/08(水) 17:48:03.59ID:T5O+XOTRd
>>446
ん?
コードで表示しろって言ってるんじゃない
クレームが来たらその人に対して言えってこと

つまり
不正入力時の動作は不定がソフトの仕様
で問題ないだろってこと
0449デフォルトの名無しさん (ワッチョイ a5da-1Cui)
垢版 |
2020/07/08(水) 18:06:49.38ID:EQ9tLW1C0
不正入力ではなくてコンソールと入力バッファの仕様が問題
標準入力stdinがキーボードの場合入力バッファには目的とする文字コードの直後に必ず改行コードが残る
scanfの書式が%dなどの数値型だと改行は取り込まれないので数値型を連続して使用した場合は型が合わずに続くデータを取りこぼす
0452デフォルトの名無しさん (ワッチョイ a5da-1Cui)
垢版 |
2020/07/08(水) 18:29:27.69ID:EQ9tLW1C0
訂正
たしかに数値型だけなら問題はないね
数値型と文字型の混在時に問題が起きる

scanf("%d", &x); // 数値 + 改行
...
scanf("%c", &y); // 必ず直前の改行となるので入力不可
...
scanf("%d", &z); // 数値 + 改行
0453デフォルトの名無しさん (アウウィフ FF09-VqvP)
垢版 |
2020/07/09(木) 09:32:01.69ID:vrNDocOmF
無理にscanf使わずに
fgetsとsscanfやろ
0455デフォルトの名無しさん (ワッチョイ 23ad-Bqa1)
垢版 |
2020/07/09(木) 09:51:17.63ID:RjpwDZh+0
Windows10proでC使いたいんです。
目的は大量のテキストデータの変換なので、
グラフィックとか音とかはプログラミングしません。

テキストでコーディングして、
CUIで実行ってな感じができればいいんですけど、
このぐらいだとMinGWが適当なんでしょうか?
0459デフォルトの名無しさん (アウウィフ FF09-VqvP)
垢版 |
2020/07/09(木) 11:04:23.27ID:vrNDocOmF
一行目も二行目も知ってる
0469デフォルトの名無しさん (エムゾネ FF43-VqvP)
垢版 |
2020/07/09(木) 16:39:16.37ID:8CMntJuyF
scanf要らねと思ったら後はgetcharで何でも出来るだろ
0480デフォルトの名無しさん (ワッチョイ 230e-ucCN)
垢版 |
2020/07/10(金) 07:44:14.14ID:d1dEL6aU0
scanfの使い方の話をしてたんだよ
そこへ付いて来れないからって他の関数を使えと話を逸らしに来たやつがいて
アホつったら何の説明もなしにfgetsとsscanfを使うのが正しいと強弁する別のアホが来た
0485デフォルトの名無しさん (ワッチョイ 857b-4PPV)
垢版 |
2020/07/10(金) 08:10:39.67ID:bFyJThgA0
>>414 の質問に戻ると getchar あたりで1字ずつ拾いながら
必要に応じてバッファを拡張する方法になるのかねぇ。
%s の機能だけなら空白と空白以外だけ考慮すりゃいいわけで。

ロケールまで対応させるとこれまた大変そうだけど。
0486デフォルトの名無しさん (ワッチョイ 05ca-L1/G)
垢版 |
2020/07/10(金) 08:22:02.59ID:a7Xsl7M10
>>485
入力した文字列を何に使うのか次第だろう。
入力すること自体は手段であって目的ではないのだから。
オンメモリに全部展開しないといけない用途なのか?
ハッシュを求めるために計算済みの値は捨てていいのか?
暗号化のために一定のブロック長があればいいのか?
適した方法はそれぞれ異なる。
んでその当初の質問の答えは既に出てるし。
0488デフォルトの名無しさん (アウウィフ FF09-jFjK)
垢版 |
2020/07/10(金) 11:08:56.61ID:2/CcitmbF
>>480
>scanfの使い方の話をしてたんだよ
>そこへ付いて来れないからって他の関数を使えと話を逸らしに来たやつがいて
>アホつったら何の説明もなしにfgetsとsscanfを使うのが正しいと強弁する別のアホが来た

ここだけ読むと >>480 がただのアスペでコミュ障にしかみえない
0491デフォルトの名無しさん (アウアウウー Sa09-Sz3q)
垢版 |
2020/07/10(金) 11:37:03.81ID:g0Z+ZvbJa
めんどくせえから GNU のライブラリにある getline() でも使っとけよ。
1行がどんなに長くてもメモリが許す限りどんどん読んでくれるぞ。
0493デフォルトの名無しさん (アウアウウー Sa09-Sz3q)
垢版 |
2020/07/10(金) 12:00:38.40ID:g0Z+ZvbJa
じゃあfgets()で。
0499デフォルトの名無しさん (アウウィフ FF09-jFjK)
垢版 |
2020/07/10(金) 12:31:35.35ID:2/CcitmbF
getchar()からが良い
scanf()は反面教師
0501デフォルトの名無しさん (アウアウウー Sa09-Sz3q)
垢版 |
2020/07/10(金) 12:45:54.18ID:Y8Yy4fdKa
まあ、scanf()の%sだけが問題なんだよな。
0503デフォルトの名無しさん (ワッチョイ 6352-PJiH)
垢版 |
2020/07/10(金) 12:55:06.27ID:qqWcHkmP0
>>498
入門書のプログラムは基本的に使うのは読者本人だから、お手軽な入力処理として使うのはありだと思う。ただ、使い方の注意点は簡単に補足しておいてほしいかな。知らずに、固まった!バグだ!とか騒いだりしないように。
それと、入門書の時点で堅牢な入力処理なんて必要ではないけど、将来的に実用的なプログラムを作るときには必要になってくるということを触れておいてほしい。
0505デフォルトの名無しさん (JP 0H93-4zP6)
垢版 |
2020/07/10(金) 13:40:12.53ID:pQ428/DjH
IT掲示板群 ttp://x0000.net/forum.aspx?id=15

学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン(画像有り)
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0

☆ VMを書いた(C#) * x86ではない!
ttp://up.x0000.net/files/TSimulang.zip
☆ malloc / free を実装してみた (C#)
ttp://up.x0000.net/files/TMallocTest.zip
0511◆QZaw55cn4c (BR 0H8b-Djmq)
垢版 |
2020/07/10(金) 19:19:20.65ID:Y3MlsMegH
>>491
そういうのが欲しくて自分で書いてしまったんですけど、すでにあるんですね…そう思う人は結構いるってことですね

>>492
getline() の中の malloc() が失敗したことがわかるんだったら、私は問題にしないですね
0512デフォルトの名無しさん (オイコラミネオ MM51-mXGD)
垢版 |
2020/07/10(金) 22:08:00.13ID:edpv1F1UM
>>511
QZ先生がどのくらいのリスクを前提に言っているのかにもよりますけど、
上限なき malloc については、リスク回避の点で、私はやっぱり問題にしたいですねえ。

おっしゃる通り、malloc が失敗を返した場合は概ね問題ないと思うのですが。
逆に malloc が成功を返した場合はどうです?
共有リソースとしてのメモリを奪いきってしまった結果としての成功であるなら、
OSによっては、他のプロセスのメモリ確保失敗に伴う致命的エラーを誘発するなどして、
広範囲な問題を引き起こすやもしれません。

先人の知恵として、システムコールやAPIの仕様として、インターフェイスにせよ、内部的にせよ、上限を設けてあると思います。
getline の内部は見てないのですが、極端に大きなサイズになりそうなら、malloc を呼び出す前に、
上限値を超えました的なエラーを返すような、慎重なコーディングになっていることを期待したいところです
0513はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 053e-ucCN)
垢版 |
2020/07/10(金) 23:07:47.23ID:HDImBgbn0
>>511
実行環境に固有の特殊事情ではあるけど
Linux だとメモリが足りなくても malloc が成功する場合がある。 (オーバーコミット)
malloc の返り値を気にしても無駄。

想定以上の巨大な行の読み込み (メモリ割り当ての失敗) に対して
何か対処する機会なくプロセスごと殺される (OOM Killer) かもしれないので、
想定する上限があるなら設定できて欲しいよ。
0514デフォルトの名無しさん (ワッチョイ 2301-LRpg)
垢版 |
2020/07/11(土) 00:41:24.74ID:UdJEarb20
ドライバレベルの仕様に詳しい人って、そこそこ不幸だよね😅
0516デフォルトの名無しさん (ワッチョイ 45bd-L1/G)
垢版 |
2020/07/11(土) 04:47:05.81ID:dhYEJgZ00
>>513
メモリを確保するだけじゃなく中身を詰めて返すから、内部でメモリ量を超える malloc に成功しながら中身を詰めてる過程でメモリ不足で落ちそうだね。
上限設けてないと回避できない深刻な問題になりそう。
0520デフォルトの名無しさん (ワッチョイ 75b0-ucCN)
垢版 |
2020/07/12(日) 12:31:19.68ID:lQJaWZP00
そういえば、初期のosxはオーバーコミットと動的スワップの合わせ技で、ディスクの空き容量が
少ないとよく固まってたな。しかもfinderではまだ空きがあるように見えても実際には最小空き容量に
引っかかるという油断のならない仕様だった。
0529デフォルトの名無しさん (ワッチョイ ab7c-jFjK)
垢版 |
2020/07/12(日) 19:40:25.98ID:uGVzSaa20
昔観た砂嵐のもこんなんだったな
マクロ使ってたかどうかは覚えてないけど
いずれにしても中身に意味があるとは思えない
0531デフォルトの名無しさん (ワッチョイ ab7c-jFjK)
垢版 |
2020/07/13(月) 09:07:37.15ID:+mCuetAH0
落ち着け、IOCCC知らんのか
0533デフォルトの名無しさん (アウアウエー Sa13-c9t6)
垢版 |
2020/07/13(月) 11:11:26.83ID:Q6XHo6fua
>>525
岩の中にテレポートしそうなあたりじゃないかな
0535デフォルトの名無しさん (エムゾネ FF43-jFjK)
垢版 |
2020/07/13(月) 12:06:46.27ID:WBkWHxcTF
>>527 本人じゃないけど
成型ツールで戻せば良いとか言うレベルじゃなくて
マジックナンバー使いまくりの手動最適化コードとか
読み難くする以外のメリットなんにも無い時間の無駄
難読化ツールとかの話も関係無い
0539デフォルトの名無しさん (エムゾネ FF43-jFjK)
垢版 |
2020/07/13(月) 12:22:42.17ID:WBkWHxcTF
どんなネタでも餌にして生きていける人って別の意味で浦山
0541デフォルトの名無しさん (JP 0H93-4zP6)
垢版 |
2020/07/13(月) 13:06:29.12ID:UIoR1/02H
IT掲示板群 ttp://x0000.net/forum.aspx?id=15

学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン(画像有り)
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0

☆ VMを書いた(C#) * x86ではない!
ttp://up.x0000.net/files/TSimulang.zip
☆ malloc / free を実装してみた (C#)
ttp://up.x0000.net/files/TMallocTest.zip
0542デフォルトの名無しさん (ワッチョイ 23ad-skOr)
垢版 |
2020/07/13(月) 23:11:58.86ID:9EBd4T6S0
>>540
読み方は?
0546デフォルトの名無しさん (ワッチョイ daad-0yBj)
垢版 |
2020/07/15(水) 20:44:36.96ID:pJ20MS8a0
CCCの部分はトリプルCではなく?
0554デフォルトの名無しさん (ワッチョイ ee8c-+zMD)
垢版 |
2020/07/16(木) 09:34:53.50ID:+sr/NO6P0
>>548
アイドルぷりぷり
0555デフォルトの名無しさん (ワッチョイ daad-YsWi)
垢版 |
2020/07/16(木) 22:21:03.87ID:HOuHYCld0
東京が goto キャンペーンから外されて本当に良かった。
0557デフォルトの名無しさん (ワッチョイ daad-YsWi)
垢版 |
2020/07/16(木) 23:23:34.12ID:HOuHYCld0
東京以外は goto を使ったCプログラムで溢れかえるんだろうなあ・・・
0563デフォルトの名無しさん (アウアウウー Sa39-lbAa)
垢版 |
2020/07/17(金) 20:54:53.28ID:TuO7NpMNa
くっ。やられた。
私の負けを認めよう。
0564デフォルトの名無しさん (ワッチョイ c628-UH/d)
垢版 |
2020/07/18(土) 12:46:51.82ID:PyiwbgQS0
奥村先生が書いてらっしゃる
「いまさらC言語」
https://scrapbox.io/imasaraC/
って、「初学者がC言語を学ぶ」という目的にはそぐいますか?
偉そうな言い方なんですけど、C言語の基礎を一通りなぞる感じには見えませんでした。
ですが、もしもC言語の基礎をこの記事で勉強できるなら、
奥村先生直筆の日本語文書ですし、ぜひ参考にさせていただきたいのです。
0565デフォルトの名無しさん (アウウィフ FF39-L8bc)
垢版 |
2020/07/18(土) 12:56:27.17ID:uRU3MGLxF
散文っぽくて体系的じゃない感じは受けた
「いまさら」であって「初めての」ではないので文字通り受け取って
既に知ってる人が改めて見直す機会には良いんじゃね

scanf
https://scrapbox.io/imasaraC/scanf()

fgets
https://scrapbox.io/imasaraC/fgets()
0567デフォルトの名無しさん (ワッチョイ ee8c-G2ah)
垢版 |
2020/07/21(火) 00:25:21.83ID:Wl7zo7XN0
すっごいポンコツPCでmacでCSV作って作ったの読み込んで計算して表示してって10回ぐらい繰り返したら同じデータ表示されるの?
0570デフォルトの名無しさん (ワッチョイ ee8c-G2ah)
垢版 |
2020/07/21(火) 00:34:45.78ID:Wl7zo7XN0
>>567
なんかこんな環境でやったらCSVのデータが更新されなくて10回全部同じ計算になってるって事が起きたから
やった人はsleepで遅らせたら変化したって言ってたからそんなことが起きる事があるのかって不思議に思ったわ
0571はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 693e-hHzd)
垢版 |
2020/07/21(火) 01:27:00.90ID:VthsC7AN0
メモリは思ったより信用できない (ちょいちょい化ける) という話を
何かのウェブブラウザ関連の文章で読んだことがあるような
気がするんだけど思い出せない。
0585デフォルトの名無しさん (アウアウエー Sa02-rGUB)
垢版 |
2020/07/21(火) 22:42:16.68ID:nbzaQebba
依存ファイル集める方がよほど知識が要りそう
0586デフォルトの名無しさん (ワッチョイ 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;
}
0587デフォルトの名無しさん (ワッチョイ 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;
0588デフォルトの名無しさん (ワッチョイ 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);
}
0590デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 16:06:36.57ID:xRlBM5RB0
たしかにrが0になるが
たぶんsrand, randで値の分布が一様じゃないせいか?
Javaとの性能比較してたんだけど乱数生成法が合わせれないな
0591デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 16:07:57.00ID:xRlBM5RB0
あ違うなsizeがでかすぎると0になっちゃうのか
0593デフォルトの名無しさん (ワッチョイ 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が遅いのか説明が無い。

大量のデータを処理しつつ特定の値に収束しない良いベンチマークコードがあればいいんだが。
足す引きを交互に繰り返すか。
0594デフォルトの名無しさん (ワッチョイ 1301-KHfa)
垢版 |
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;
}
ってやると多少速くなるかも
あとは分割してスレッドで並行して実行するとかかな
0595デフォルトの名無しさん (ワッチョイ 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;
}
0596デフォルトの名無しさん (JP 0H55-ZQKC)
垢版 |
2020/07/22(水) 16:34:17.16ID:lGyqioywH
なんだ、^ の意味わかってなかったのか。
ていうか、コードの最適化を求めるなら、
そのコードの目的のほうが先に存在するはずじゃないのか?
コロコロ変えてさあ最適化しろとかおかしいだろ。
0597デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 16:39:25.22ID:xRlBM5RB0
0になってたのは^じゃなくて&が原因だろ
0599デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 16:44:20.78ID:xRlBM5RB0
あr=0でr^=使ってたからか
演算子の意味じゃなくてr=0で始めてる事との整合性に気付いてなかった
r = rand();
r ^= data1[i] ^ data2[i]
これなら収束しないはず
0601デフォルトの名無しさん (エムゾネ FF33-keh3)
垢版 |
2020/07/22(水) 16:56:43.54ID:J+LKPgcIF
もしかして残念なベンチ
0605デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 17:58:11.98ID:xRlBM5RB0
>>600
なんで代入されないんだ?

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

>>603
「計測中に」はstartとendの間にという意味。
0606デフォルトの名無しさん (スップ Sd73-Ky2H)
垢版 |
2020/07/22(水) 17:59:58.58ID:HrEyCXiAd
>>586
大いに改善の余地あり
0になることを仮定せずに真面目に計算するとして

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

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

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

データがキャッシュに収まらないなら
メモリ速度で決まるからあまり関係ない
0607デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 18:03:43.69ID:xRlBM5RB0
代入されないんじゃなくて偶数回^すると元に戻るのか
0609デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 18:09:25.81ID:xRlBM5RB0
二重ループにして外側が偶数回だからか。
「同じ乱数列を偶数回XOR走らせたら元に戻る」と。
>>600>>604が言ってるのはそういうことか

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

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

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

って、コードの最適化の話だったんだっけ?
0615デフォルトの名無しさん (ワッチョイ 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キャッシュが別の何かで埋まってしまっている可能性
0616デフォルトの名無しさん (ワッチョイ 69e6-A04g)
垢版 |
2020/07/22(水) 22:30:57.82ID:1buRSft90
自分のブログでやって
0617デフォルトの名無しさん (ワッチョイ d9c3-Y9Vl)
垢版 |
2020/07/22(水) 23:08:24.67ID:G9I2XdZp0
そもそもjavaがc/c++並に速いとか、かなり嘘や誤魔化し入っているから
速度差3-4倍で済むなら十分健闘している

javaのコードを移植して、無駄にmalloc freeしまくったりする糞コードならもっと迫れるだろうけど
0618デフォルトの名無しさん (ワッチョイ 3997-nH3A)
垢版 |
2020/07/23(木) 02:25:27.91ID:tfGyNQFW0
>>615
そもそもJITが吐くバイナリを逆アセンブルして比較しなきゃしょうがないんでね?
そのようなことが可能かは知らないけど、処理中にデバッガで無理矢理止めればわかりそうな気はする
0620デフォルトの名無しさん (ワッチョイ d9ca-13t9)
垢版 |
2020/07/23(木) 11:21:03.05ID:TTqTgaIL0
javaの配列は特別な宣言無しに別スレッドでこっそり書き換えてもちゃんと反映されるわけだから、単純処理であっても最適化にも限界があるだろうな。
Cの場合は、他で書き換えられるかもと指定しておかなければ他所のことなんておかまいなしに処理できるから、その点だけでも有利だよね。
>>586 のコードのなら、i のループに入る前に data[j] を変数に取り置いて i のループ内で使用するようにすれば、java の方では高速化されるんじゃね。
C ならそれをコンパイラがやってくれてそう。
0624デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/23(木) 12:46:54.76ID:tYvDqilk0
ベクトル演算の未適用が原因だとほぼ特定できた。
0627デフォルトの名無しさん (ワッチョイ 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倍速になったからベクトル演算未適用が原因でほぼ間違いない。
その行で+か-か^か&かは結論に影響しない。
0629デフォルトの名無しさん (ワッチョイ d9ca-13t9)
垢版 |
2020/07/23(木) 14:11:44.83ID:TTqTgaIL0
>>623
値が volatile なことと操作が atomic なことは別の話だよ。
自分が書き換えない同じ領域を複数参照するとき、それを他の誰も書き換えないならその参照は一度目の値と同じになる前提で最適化できるけど、他の誰かがいつの間にか書き換えることがあるならそういう最適化はできなくなる。
そういう領域であることを明示するのが volatile。
atomic は同じ領域を誰かが書き換える前提なので基本的にその領域は volatile だけど、それに加えて値を参照して手を加えて書き戻すなどの一連の手続きの途中で他の誰かにいじられないことを保証すること。
それを CPUレベルの命令で行うかソフトウェア的なロックで行うかで色分けされてるだけ。
0633デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/23(木) 14:42:55.39ID:tYvDqilk0
>>632
確かにそうだ。
でも1000 * 100も試してみたが2msで線形だった。
0638デフォルトの名無しさん (ワッチョイ 13ad-5TCi)
垢版 |
2020/07/24(金) 03:10:38.82ID:6ZonvnML0
volatile ってスレッドに限らず値が知らない内に変化する可能性のある何かの入力でも使うよね。
例えばマイクから拾った音を A/D 変換した値がメモリマップドI/Oで特定のアドレスのメモリ読む方法で読める場合。
CPUが予想不能な形で値がコロコロ変わるので volatile にせざるを得ない。(volatile って揮発性とか不安定って意味だし、言葉の意味そのままだ)。
これは読む側だけど書いて何かを出力する場合も、書いた値を読めないような作りになっている場合もある。
1を書いたのに直後に読むと0だったりなんていう事はあり得る。要するに一々覚えていない。または覚えていても読み出しに対応していない。
そんなハードウェアが接続されていたらそうなる。
0639デフォルトの名無しさん (ワッチョイ 812c-WQpp)
垢版 |
2020/07/24(金) 04:44:18.69ID:So4dssPK0
そりゃ、外部装置と連動しているから、値がいつ変わるか分からない

外部装置が読み書きしたら、合図として、0.1ms 後に、値を反転させたりとか、
色んな事をするから、予測できない
0643デフォルトの名無しさん (ワッチョイ d9ca-13t9)
垢版 |
2020/07/24(金) 18:25:04.01ID:ogZVfXfN0
別に怖くはないだろ。
他所と排他するなりしかるべきタイミングでアクセスすればいいだけなんだから。
排他や同期が必要な領域にそれをせずにアクセスするならただのアホってだけで、volatile がどうとかいう話じゃない。
0646デフォルトの名無しさん (ワッチョイ d901-fOmF)
垢版 |
2020/07/26(日) 03:07:46.88ID:4oXiyEBn0
「書きこんだものの読み込んでないからコードから消しちまえ」
「読み込んでるけど、代入以降値がかわる気配がないから、読み込みを止めて固定値にしちまえ」
これを抑制するだけ
書き込や読み込みを記述通り生き残らせる
0652デフォルトの名無しさん (ワッチョイ 13ad-5TCi)
垢版 |
2020/07/26(日) 18:14:24.05ID:hRZi6+cn0
あんししー
0663デフォルトの名無しさん (ワッチョイ 130e-5TCi)
垢版 |
2020/07/28(火) 03:43:48.32ID:JnUAmZD/0
あのなあ、おまえら。。。。
K&R Cに対する批判なんて今さらドヤるか?
規格Cを憶えるときにプロトタイプは何のためか
説明受けてないやつがここにいるとでも思うのか?
0664デフォルトの名無しさん (アウアウウー Sa5d-d0Nl)
垢版 |
2020/07/28(火) 13:28:44.28ID:DVrEteyfa
(キリッ
0668デフォルトの名無しさん (ワッチョイ fa94-UdrD)
垢版 |
2020/07/29(水) 17:10:37.12ID:tqWMyndD0
浮動小数の演算で生じる誤差は常に絶対値が小さくなるように行われる、
という前提は正しい?
0669デフォルトの名無しさん (ワッチョイ fa94-UdrD)
垢版 |
2020/07/29(水) 17:11:14.42ID:tqWMyndD0
C限定の話じゃないからスレ違いか
0670デフォルトの名無しさん (ワイーワ2 FF62-lIev)
垢版 |
2020/07/29(水) 17:12:49.06ID:hY/5h1XOF
日本語として可笑しいのでgoto語学板へ
0673デフォルトの名無しさん (ワッチョイ fa0e-xE3T)
垢版 |
2020/07/29(水) 17:21:06.57ID:8sSsdFab0
>>668
ライブラリやFPUの実装の話だね

例えばだけどIEEE754の定義では
仮数部は1.xxxxxxと、整数部が常に1なので
整数部を省き、その分の1bitを小数部に回す「ケチ表現」で
誤差がなるべく小さくなるように工夫している
0674デフォルトの名無しさん (ワッチョイ da52-kd5w)
垢版 |
2020/07/29(水) 17:25:55.07ID:Bu6uxHFv0
>>668
浮動小数点制御ワードの設定によっては丸め方向が変わるから、必ずしもそうだとは言えないかも。環境によるのかもしれないけど、詳しくは知らない。
_controlfp_sとかでググってみて。
0675デフォルトの名無しさん (ワッチョイ fa94-UdrD)
垢版 |
2020/07/29(水) 17:28:44.72ID:tqWMyndD0
doubleを分解(0.1や0.3とかでかけて複数のdouble値にする)して足し合わせて比較、
という処理を無限回繰り返して元の絶対値を超えていたら停止、
みたいなテストコードを書いてみたけど、低確率で元の絶対値を超える。
この誤差が分解と足すときどちらで生じているか分からないが
なんにせよ浮動小数点数演算の誤差で絶対値が増加する場合があるようだ。
0676デフォルトの名無しさん (ワッチョイ fa0e-xE3T)
垢版 |
2020/07/29(水) 17:45:17.74ID:8sSsdFab0
あ、誤差の絶対値ではなく、結果の絶対値ということ?
俺の勘違いだったら悪いんだけど、それじゃ意味なくね?
結果が正数ならともかく負数の場合デメリットだけやん
0679デフォルトの名無しさん (ワッチョイ ce8c-LW7E)
垢版 |
2020/07/30(木) 06:42:57.43ID:ixil7w/z0
上司がこっそり使っていた cflow
0681デフォルトの名無しさん (ワッチョイ 0101-iVY1)
垢版 |
2020/08/10(月) 04:07:37.60ID:SKFyjjt90
デファクトスタンダードなCのコーディング作法を手っ取り早く
身につけるために何をすべきですか?
0682デフォルトの名無しさん (ワッチョイ 0101-Ea0s)
垢版 |
2020/08/10(月) 04:47:16.15ID:o5h87VM/0
所属がわからないと何とも言えませんね。
社名と部署お願いします。
0684デフォルトの名無しさん (ワッチョイ 1b8c-oftG)
垢版 |
2020/08/10(月) 06:50:01.64ID:ruBmk/3z0
お手本のプログラムを上司に見せてもらい完コピする。
0685デフォルトの名無しさん (ワッチョイ 992c-B5sl)
垢版 |
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プログラミングの落とし穴
0686◆QZaw55cn4c (NZ 0Ha3-+xie)
垢版 |
2020/08/10(月) 07:14:44.55ID:JYoLJZbsH
>>685
>数十人のベテ
司法試験板をみると「ベテ」というのは30代以降の複数回受験者のことらしいですよ
文脈によっては veteran は階級を問わず退役軍人を意味することもありますし‥‥「わしが現役の頃には」を壊れたレコード盤のように繰り返すイメージとか
ベテランという言葉に必ずしもプラスイメージが伴っているとは限らないことはしっておいたほうがいいんじゃないですか?
0688デフォルトの名無しさん (ワッチョイ 0101-iVY1)
垢版 |
2020/08/10(月) 09:47:53.28ID:SKFyjjt90
>>682-684
なるほど,やっぱり利用場面とか会社の文化などで
全然違ってくるんでしょうかね

>>685
ありがとうございます.見てみます.
0689デフォルトの名無しさん (エムゾネ FF33-SiUo)
垢版 |
2020/08/10(月) 11:57:46.08ID:wInlBSoOF
何も知らないなら手あたり次第写経してみ
それで何でこんな描きかたになってんの?
ってここで質問繰り返せば良い
みんな暇だから答えてくれるはず
0690デフォルトの名無しさん (ワッチョイ 895f-Ea0s)
垢版 |
2020/08/10(月) 14:56:52.81ID:xpVmb7Uo0
printfってどれだけメモリ使うんですか?
0699◆QZaw55cn4c (NZ 0Ha3-+xie)
垢版 |
2020/08/10(月) 21:32:33.10ID:JYoLJZbsH
MISRA も、MISRA 対応性的解析ツールを公開してくれていてもよさそうなものですが‥‥ただで
0701はちみつ餃子 ◆8X2XSCHEME (ワッチョイ d13e-FoHg)
垢版 |
2020/08/11(火) 01:09:34.46ID:EJAYjJkN0
MISRA だって MISRA を採用する場合に何がなんでも全ての項目に準拠しなければならないというわけではない。
(逸脱する場合には文書化しておくことを推奨してはいるが。)

ただ、気を付けなければならない箇所がまとめられているというのも間違いないので、
目を通すくらいのことはしたらいいんじゃないの。
俺は読んだことないけど。
0707デフォルトの名無しさん (ワッチョイ 13a5-w77N)
垢版 |
2020/08/11(火) 11:41:57.49ID:l01whKN50
でもやっぱりどれくらいMISRAに準拠してるかチェックするツールが全く出てないのは不自然
もしかしてMISRAって目視チェックを前提にした規格なのか?
それとも企業で門外不出のツールになってんのか?
0714デフォルトの名無しさん (アウアウウー Sa55-1t4k)
垢版 |
2020/08/11(火) 18:54:59.41ID:j5xuOst8a
きみはこう言いたいのでしょう
ヅラはどこだ!
0715◆QZaw55cn4c (NZ 0Ha3-+xie)
垢版 |
2020/08/11(火) 19:18:03.85ID:IiIy4i0JH
>>711
MISRA の対応するコメントを付けてくれる性的解析ツールは、無料で提供されるべきでしょう、業界標準を目指すのなら
0719◆QZaw55cn4c (NZ 0Ha3-+xie)
垢版 |
2020/08/11(火) 21:19:03.39ID:IiIy4i0JH
>>718
無論、前者ですね、というかモノの値段はその価値と深い相関があるのが普通でありマトモだとも思いますから、
支払う価値の話に対して対象レベルの話を持ち出すことは、あながち間違っているとはいえないでしょう?
0725◆QZaw55cn4c (NZ 0H8a-nBdZ)
垢版 |
2020/08/12(水) 13:20:01.63ID:UG+oufucH
>>722
トータル 1 万ステップ以上のプロジェクトを扱ったことがあればプロ、そうでなければアマ、というのはどうでしょうか?
無論、私は後者です
0728デフォルトの名無しさん (ワッチョイ 468c-1RiF)
垢版 |
2020/08/12(水) 15:57:15.32ID:yGflmyFx0
捕まる泥棒はアマ、捕まらないのはプロ。
0730デフォルトの名無しさん (ワッチョイ 81ca-YRtD)
垢版 |
2020/08/12(水) 16:15:20.08ID:aKiWlwPm0
それを生業にしてるならヘボかろうがプロではあるな。
んで世の中ヘボが相当数いる。
百人単位のプロジェクトになると7割はヘボ。
入社したてのほとんど何もできない新人君とかも混ぜ混んでくるし、本当にひどい。
でもみんなプロ。
0731デフォルトの名無しさん (エムゾネ FF62-jwrZ)
垢版 |
2020/08/12(水) 16:20:10.06ID:mptqcK2nF
人件費稼ぐために頭数合わせてるだけ
0732デフォルトの名無しさん (ワッチョイ c219-k0xq)
垢版 |
2020/08/12(水) 17:46:51.14ID:wD9I21LT0
プロアマの基準にステップ数なんざ関係ないが1万程度1人で組める規模じゃん
成果物で金稼いでりゃプロで良いと思うし、プロでもひどいの居ればアマでもすごいのは居る
0734はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 813e-++7W)
垢版 |
2020/08/12(水) 18:20:24.44ID:WoaeeAs50
長時間労働に耐えられる体力があるのかもしれんし、
有力者に取り入る能力が高いのかもしれんし、
幸運値が高くてなんとなくやっていけてるのかもしれん。

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

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

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

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

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

企業としては、規格だけを何十年も研究しているような香具師を雇わないのだろう。
だから、まぎれなく書かないと、誰も規格を調べられないから、困る
0740デフォルトの名無しさん (ワッチョイ 9901-E2Bm)
垢版 |
2020/08/13(木) 11:32:05.85ID:VDPM7Buu0
成果物という言い方に違和感。

普通に製品で良いのでは?
0745デフォルトの名無しさん (ワッチョイ c219-k0xq)
垢版 |
2020/08/13(木) 12:35:10.28ID:l61yvHm+0
社内で使うツールなんかも製品なんていうのか?
むしろ成果物のほうが一般的に使う用語だと思うぞ
もしかしたら業界によって違うかもしれんが
大体の業界でプログラムだけで製品にならんからな
0747デフォルトの名無しさん (ワッチョイ c2a5-by2p)
垢版 |
2020/08/13(木) 13:13:16.97ID:CM5c4LB70
つまり間接成果物か。

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

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

副産物って言うかな
0750デフォルトの名無しさん (ワッチョイ c2a5-by2p)
垢版 |
2020/08/13(木) 13:41:31.84ID:CM5c4LB70
やっぱり視点がここまで違うんだな
お前にやるカネなんてどうでもいいよ
製品が稼いでくるカネに興味あるんだよ

だから間接成果物だろ

経理の奴らにだって給料渡してんのは誰でも知ってるよ
0754デフォルトの名無しさん (ワッチョイ 4201-eTOa)
垢版 |
2020/08/13(木) 14:12:24.56ID:RDWqdqfD0
>>750
まじで知らんのか?
設計とかテストだけ受託というお仕事もあるんだよ
もちろん納入したドキュメントに対してお代はいただくけど、設計書とかテスト結果報告書を製品とか言う奴はいないだろ
0755デフォルトの名無しさん (ワッチョイ d166-k0xq)
垢版 |
2020/08/13(木) 14:23:51.21ID:BqAuLMN60
会社から外に出るあらゆるものがすべて製品である、ってのなら言いたいことはわかるよ
でも個人的な感覚ではすべてを製品というのは言葉のとる範囲が広すぎる
設計書やテスト関連のドキュメントなんかを製品とは言いづらい

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

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

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

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

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

オープンソースのときだけ成果物というのは違和感がある。
0767デフォルトの名無しさん (ワッチョイ c2a5-by2p)
垢版 |
2020/08/14(金) 10:01:34.96ID:SEg+bPfj0
>>754
本当に話が分らんヤツだな
先方に納めたテストは、先方で『稼働』して直接はカネ稼いでないだろ

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

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

で、顧客は、エンジニアが作った器械装置やプログラムを使って稼ぎ出すカネの方に興味がある
0773デフォルトの名無しさん (ワッチョイ 468c-1RiF)
垢版 |
2020/08/14(金) 15:33:21.13ID:Z47jWul30
>>772
中国の方ですか
やりたいことが金もうけだけなら不動産屋はどうですか
0774デフォルトの名無しさん (ワッチョイ 7197-9ujE)
垢版 |
2020/08/14(金) 15:41:56.15ID:Z2/UjnqU0
間接成果物を作るのは無駄、というのは、
顧客が絶対チェックしないんだけどなぜか成果物として要求される、
中間工程を納品用にドキュメント化したもの、を作るのが無駄と言ってるのかな

まあ、わからんでもないけどそれがあれば顧客に引き継げる場合もあるし、ケースバイケースのような。
0776◆QZaw55cn4c (NZ 0H8a-nBdZ)
垢版 |
2020/08/14(金) 17:59:05.92ID:txNZsWd8H
>>773
>やりたいことが金もうけだけなら不動産屋はどうですか
不動産は儲かるのですか?とても信じられませんね
むしろ株でしょう、それも米国株が儲かるのでは?
0777◆QZaw55cn4c (NZ 0H8a-nBdZ)
垢版 |
2020/08/14(金) 17:59:52.43ID:txNZsWd8H
>>775
あなたの世界ではどうだか知りませんが、世間一般ではハッカーとクラッカーは区別せずに両者とも単にハッカーといいます
ご存じなかったのですか?馬鹿ですね
0779デフォルトの名無しさん (ワッチョイ c20e-p5K4)
垢版 |
2020/08/14(金) 18:05:35.24ID:2wR+X/g+0
>>777
手合いかと聞いているのを知らないからと思ってしまう
おまえさんの脳味噌こそ深刻なバグ抱えてるぜ

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

そうそう、どうしてもハッカーとクラッカーを区別したいんだったら「ホワイトハッカー」という言葉はある程度認知されているようですから、それを使いなさい
早く馬鹿が治るといいですね
0784◆QZaw55cn4c (NZ 0H8a-nBdZ)
垢版 |
2020/08/14(金) 19:01:12.85ID:txNZsWd8H
>>783
敵地攻撃能力は防衛ですか、それとも侵略に入りますか?
そしてその理由は?
0785◆QZaw55cn4c (NZ 0H8a-nBdZ)
垢版 |
2020/08/14(金) 19:01:57.94ID:txNZsWd8H
>>782
>狭い蛸壺で自分勝手にルールを決めても、そんなことはパンピーには通用しない
>狭い蛸壺で自分勝手にルールを決めても、そんなことはパンピーには通用しない
>狭い蛸壺で自分勝手にルールを決めても、そんなことはパンピーには通用しない
>狭い蛸壺で自分勝手にルールを決めても、そんなことはパンピーには通用しない
>狭い蛸壺で自分勝手にルールを決めても、そんなことはパンピーには通用しない
0792デフォルトの名無しさん (ワッチョイ 468c-1RiF)
垢版 |
2020/08/14(金) 22:41:53.95ID:h2QIVB9f0
C言語で制約論理プログラムができるiZ-Cでサンプルログラムを書き始めました。
ちょっと夢があるので見てね。
https://sunasunax.hatenablog.com
0794デフォルトの名無しさん (ワッチョイ 9901-eqxN)
垢版 |
2020/08/15(土) 12:58:19.65ID:Y9oiVJFr0
2次元配列への走査方向を行と列で入れ替えた際のパフォーマンスの違いは
何に起因するのでしょうか?
いずれにしてもソース上はランダムアクセスに違いないと思うのですが.

https://ideone.com/VjhO3l
0796デフォルトの名無しさん (ワイーワ2 FF8a-jwrZ)
垢版 |
2020/08/15(土) 13:36:54.66ID:cGC1PAzNF
>>784
ウィルス持ちの観光客が最強と判明しました
0797デフォルトの名無しさん (ワイーワ2 FF8a-jwrZ)
垢版 |
2020/08/15(土) 13:38:45.66ID:cGC1PAzNF
>>794
メモリの連続性じゃないの?
0800デフォルトの名無しさん (ワッチョイ 422f-WAQY)
垢版 |
2020/08/15(土) 14:00:10.52ID:fqWla8CQ0
プロセッサのキャッシュにはキャッシュラインと言ってフェッチする単位があるんだよ。
あるアドレスをアクセスしたときラインサイズでフェッチしてあるからその後にそのライン内のアドレスならば速くアクセスできる。
要するに先読みしておいてくれるわけ。
0801デフォルトの名無しさん (ワッチョイ 9901-eqxN)
垢版 |
2020/08/15(土) 14:31:56.10ID:Y9oiVJFr0
なるほどarr[i][j]へのアクセスでarr[i]の周辺もキャッシュに乗ることになって、
その近くなら早くアクセスできるんですね。
ありがとうございます。
0802デフォルトの名無しさん (ワッチョイ 9f10-fAYc)
垢版 |
2020/08/19(水) 09:31:04.59ID:9mqf8z+n0
>>801
ランダムにアクセスしたいときは
無意味に配列をコピーしてキャッシュに載せるんやで
0810デフォルトの名無しさん (ワッチョイ 1fbb-Dag0)
垢版 |
2020/08/19(水) 21:37:28.51ID:wUlRTy820
>>809
この前関数の呼び出しコストを計測しようとしたんですよ

void f() { }

みたいな関数なんですけど
でも-O3にすると関数呼び出しが省略されるんですね
このケースってなにかうまい方法ありますか?
0820デフォルトの名無しさん (ワッチョイ 9f01-G9q0)
垢版 |
2020/08/19(水) 23:24:44.35ID:1TMyVKY80
void f() {}
-O1以上は削除されるみたいですね(Compiler Explorerで確認)
https://godbolt.org/z/rcdh9x
0822デフォルトの名無しさん (ワッチョイ 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;
}
というコードに変換されるようなマクロが書きたいです。

どうかよろしくおねがいします。
0824デフォルトの名無しさん (ワッチョイ ff28-wQSi)
垢版 |
2020/08/20(木) 15:49:31.41ID:vxwYzwgQ0
>>823
ありがとうございます。
__FILE__や__func__でファイル名・関数名が取得できることは
知っているのですが,その二つをコロンで繋いで文字列にする方法が
分からないんです。
言葉が足りなくてすいません。

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

__FILE__と__func__を展開しつつ,
間にコロンを入れて,外側を引用符で囲む,
という操作を実現できればいいのですが……。
0826デフォルトの名無しさん (エムゾネ FF9f-fHWV)
垢版 |
2020/08/20(木) 16:44:22.67ID:RX/3qqm6F
char s[4] = "ABC";
は問題無いと思いますが
char s[4] = "ABCD";
とすると警告出ないのですが
最後の'\0'は無視されるのですか?
それとも意図しない領域に描き込まれているのですか?
0829デフォルトの名無しさん (エムゾネ FF9f-fHWV)
垢版 |
2020/08/20(木) 17:52:19.01ID:RX/3qqm6F
>>828
ありがとうございます

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

ABC
まで表示されてしまいます
これを2文字で切るのは
%2s
じゃ駄目なんでしょうか?
0831デフォルトの名無しさん (エムゾネ 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);
で自己解決です
0833デフォルトの名無しさん (ワッチョイ ff28-wQSi)
垢版 |
2020/08/20(木) 19:58:56.88ID:vxwYzwgQ0
>>832
そうなんですね。
とすると,
#define FILE_FUNC(func) __FILE__ ":" func
みたいにして,
実際使う場面で
FILE_FUNC(__func__)
というように引数として渡す,という方法をとればいい
ってことでしょうか。
0834833 (ワッチョイ ff28-wQSi)
垢版 |
2020/08/20(木) 20:00:10.19ID:vxwYzwgQ0
>>833
あ,当然
#define FILE_FUNC(func) __FILE__ ":" func
のままではいずれにせよ
"somefile:somefunc"
には展開されませんが……。
0835デフォルトの名無しさん (ワッチョイ 9f63-n+O8)
垢版 |
2020/08/20(木) 23:51:48.90ID:ajS/uCbw0
>>833
#defineで定義してしまうと、再定義でもしない限り、そのソースファイル全体で
一意になる静的なリテラルになってしまうでしょ
一方の __func__ は、各関数内部で、static const char に展開されています
だから、マクロを工夫して置き換えたりするよりも、
>>827 の方法が一番簡潔な方法だと思います
0837デフォルトの名無しさん (ワッチョイ 1fd4-YpYZ)
垢版 |
2020/08/21(金) 17:03:22.67ID:/1umECfd0
ところで、何で__FILE__は直に文字列リテラルに置換され
__file__は暗黙に宣言される配列の識別子なんだろうな

まさに822が陥ったような混乱の元だと思うが
そうしなければならない理由があるのか
0838デフォルトの名無しさん (ワッチョイ ffe9-YpYZ)
垢版 |
2020/08/21(金) 17:31:23.64ID:J6Koy0SX0
>>837
__func__ のことなら、構文解析が要るからでしょ。
ファイルはプリプロセッサの中で自然にわかるだろうけど、現在位置がどの関数の中か(あるいは関数の外か)はわからない。
0841デフォルトの名無しさん (ワッチョイ 7fad-RTUg)
垢版 |
2020/08/22(土) 10:09:37.81ID:K3IJhML30
>>401
> 何に使うかでそんなに変わるか?

亀レスでごめんなさい。
GUIを含むかどうかでちょと変わると思う。
WindowsならやはりVisualStuidoが便利だった。
Linux、UNIXならgcc,vi,makeの3種の神器かな?
0842デフォルトの名無しさん (ワッチョイ 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) { // ← これ
...
}
こんな処理です。

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

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

>>844
すいません,ほぼ追加で質問する形になってしまうのですが,
どういうところが気になりますか?
教えていただけると勉強になります。
0846デフォルトの名無しさん (ワッチョイ 9fbd-8gnn)
垢版 |
2020/08/25(火) 12:36:38.95ID:N6/CJWHL0
>>842
*p は、その位置の文字が '¥0' じゃなければループ内に入る判定。
ようするに文字列の終端にたどり着くまでループするということ。
p=z の z は、ループ内で p から見た文字列の中の ':' がある位置の次が入るようになってる。
ようするに path を ':' 区切りにした断片を一つずつ処理してる。
0850デフォルトの名無しさん (ワッチョイ ff28-wQSi)
垢版 |
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()と仕様がそっくりな
独自の関数を用いる理由が分からないですね。
0851デフォルトの名無しさん (ワッチョイ 7f01-3yFl)
垢版 |
2020/08/25(火) 14:01:32.20ID:mY7DCxIU0
>>850
> たしかになぜstrtok()ではなくて独自関数を使うか気になりますね。
strtok( ) は与えられた文字列書き換えちゃうし内部状態を持つので今どき使うのはやめた方がいいと思うぞ
0853デフォルトの名無しさん (ワッチョイ 7f7c-YpYZ)
垢版 |
2020/08/25(火) 15:06:17.67ID:fzTrphgL0
既存関数を使えばわざわざ文字列をループで処理する必要は無いと思えるけど
例えば昔から良くあるコマンドライン引数をチェックする場合などは
ループで処理するのが一般的かなと思われる

簡単なコードを書いてみたので確認してみるといいかも
https://paiza.io/projects/e/0d-LM04O2-C1g6xC2uXP5w
0855デフォルトの名無しさん (ワッチョイ ff28-wQSi)
垢版 |
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言語を書けるようになるのは
当分先のことになるとは思いますが)
0859デフォルトの名無しさん (ワッチョイ a5bb-xiBb)
垢版 |
2020/08/26(水) 07:57:09.94ID:68jGS2+/0
こないだユニコード文字列を扱うライブラリを作ったんだが、Poweshellから使うとうまく動作しないでやんの
Bashだとうまくいくからシェルの文字コードが原因かなぁって
0863デフォルトの名無しさん (ワッチョイ 675f-th+2)
垢版 |
2020/09/05(土) 14:24:19.26ID:D6IgUwp/0
ファイルシステムもコードページあれば良いのに
0866デフォルトの名無しさん (ワッチョイ e7e6-dQ4P)
垢版 |
2020/09/08(火) 20:07:28.59ID:SzSjgAIn0
>>864
母国語でおk
0867デフォルトの名無しさん (ワッチョイ 0701-P8XZ)
垢版 |
2020/09/08(火) 20:33:38.44ID:h4K4tlm90
>>866
ماذا علي أن أفعل لتحسين عمل Scanf؟
0868デフォルトの名無しさん (ワッチョイ 5fa5-w/i8)
垢版 |
2020/09/08(火) 20:57:51.12ID:dd3/c9tT0
>>864
scanf_sを使うんだよ
0870デフォルトの名無しさん (ワッチョイ 87e6-+pFZ)
垢版 |
2020/09/08(火) 21:38:18.70ID:L9CYXS2m0
ここの連中は初心者の時でもこんな愚かな質問しなかっただろうからな
0872デフォルトの名無しさん (ワッチョイ 0701-P8XZ)
垢版 |
2020/09/08(火) 22:29:20.68ID:h4K4tlm90
よしよし かまってあげよう おいで〜
0874デフォルトの名無しさん (ワッチョイ 0701-P8XZ)
垢版 |
2020/09/08(火) 22:50:33.61ID:h4K4tlm90
(*-ω-)ヾ(・ω・*)ナデナデ
0877デフォルトの名無しさん (ワッチョイ c5e6-nmCw)
垢版 |
2020/09/11(金) 09:46:30.88ID:t2oJFSgB0
この初心者のほうがよっぽどクズ
0882デフォルトの名無しさん (ワッチョイ b501-zsLS)
垢版 |
2020/09/12(土) 02:19:04.35ID:SzTm78BI0
静かになるまで5分かかりました(ry
0883デフォルトの名無しさん (ワッチョイ 3628-oJ0F)
垢版 |
2020/09/14(月) 21:43:37.62ID:8/TQSAVT0
https://hnw.はてなブログ.com/entry/20130406
この記事(海外の質問箱の邦訳)に対するコメントで,
do{
...
} while (feof(input))
というコードが提案されているのですが,どう思われますか。

少なくとも一つの問題点(余分なループ)は克服できている気がしますが。
0884デフォルトの名無しさん (ワッチョイ 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 に到達していないから。
0888デフォルトの名無しさん (ワッチョイ eaad-pVuC)
垢版 |
2020/09/15(火) 13:34:11.71ID:2J2Mo0F/0
ま、しかし、よくよく考えてみると feof() って使い所がほとんどないのではないか?
fgetc() が文字だけでなく EOF まで返す仕様になっているから使わずにも書けてしまうよね。
単にEOFになった後かどうかだけを調べたい場合は fgetc() 使ったら無駄な処理になるけど。
0889デフォルトの名無しさん (ワイーワ2 FF92-e6VR)
垢版 |
2020/09/15(火) 13:46:37.73ID:i/gZOuAlF
そもそも feof 使わないよね?って話題だし
0890デフォルトの名無しさん (ワッチョイ 1163-pVuC)
垢版 |
2020/09/15(火) 14:02:51.06ID:pUsOBU6W0
fgetc()等はファイルを最後まで読み取った場合だけでなくエラーの場合もEOFを返すことになってるから
どちらの状況か区別するためにfeof(),ferror()はあるんだろ
区別しなくていいなら使わんわな
0891デフォルトの名無しさん (ワッチョイ ea01-hEa4)
垢版 |
2020/09/15(火) 14:14:08.17ID:8CWM1WbO0
>>883
ダメダメって書いてあるやろ

rero
ferror の条件が成立した場合,feof の条件は成立せず,無限ループになる.
ループ脱出条件にはfread / fscanf / fgetc などの戻り値を使う.
feof は ferror との切り分けにのみ使う.
2014/02/04
0893デフォルトの名無しさん (ワッチョイ 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言語では統一的に指針が決まってますか?
0894デフォルトの名無しさん (ワイーワ2 FFdf-SP/v)
垢版 |
2020/09/17(木) 12:40:32.43ID:OW2OZx8DF
1
0895デフォルトの名無しさん (ワッチョイ d793-lMKa)
垢版 |
2020/09/17(木) 12:50:38.33ID:3L04nVD50
printf関数の場合では、「char*型が使えるように見えるけど、色々と問題起きるからconst char*型以外は禁止」ということなんですか。
分かりました。
0896デフォルトの名無しさん (ドコグロ MMdf-aBI4)
垢版 |
2020/09/17(木) 12:53:34.67ID:uk2B69G8M
const char*はchar*の指す先を書き換えないだけで同じものなのでconst char*をchar*で初期化してなんの問題もない。暗黙変換してくれる。
逆は書き換えられないconst char*が書き換えできる様になってしまうので暗黙にはしない様になっている。
0898デフォルトの名無しさん (ワイーワ2 FFdf-SP/v)
垢版 |
2020/09/17(木) 13:08:31.54ID:OW2OZx8DF
質問のレベルから忖度すると
質問者が気にしてるのは
ひょっとすると
...
の部分の方なのかも知れない
0899デフォルトの名無しさん (ワッチョイ 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;
}
0900デフォルトの名無しさん (ワッチョイ bf8c-CUqR)
垢版 |
2020/09/17(木) 13:40:44.35ID:PwEIVjdJ0
関数定義の引数が配列で書けるようになったのはいつから
int func(array[5]){
.......
}
0902デフォルトの名無しさん (ワイーワ2 FFdf-SP/v)
垢版 |
2020/09/17(木) 13:46:44.16ID:OW2OZx8DF
昔から
0905デフォルトの名無しさん (ワッチョイ 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*型はダメ。
0906はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
垢版 |
2020/09/17(木) 14:32:12.65ID:FojOL81h0
>>900
型が書かれていないけどそれはタイプミスだとすれば、
配列形式で仮引数を書くこと自体は昔から出来る。
ただし、配列形式で書かれるとそれはポインタに調整される。

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

int a ="ほげ";

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

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

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

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

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

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

(C++ では文字列リテラルの型には const が付く。)
0911デフォルトの名無しさん (ワッチョイ d793-lMKa)
垢版 |
2020/09/17(木) 19:21:07.83ID:3L04nVD50
よく見てみたら使ってるツールがC++用だった。
C言語入門本でインストールを促すソフトが大抵Visual StudioのC++で、
意識せずにC++の開発環境でC言語の勉強をしてたんだな。
それで、C言語の挙動だと思ってたのが、実はC++の挙動だったんだな。const の件もそう。
0916デフォルトの名無しさん (ワッチョイ d793-lMKa)
垢版 |
2020/09/17(木) 19:59:49.49ID:3L04nVD50
でもまあプログラムの再利用性を考えたら、constの件は、C++仕様に配慮して省かないことが大事か。
C++に配慮したコードを書くことで、C言語でもC++でも通用するプログラムとなり、プログラムの再利用性が上がる。
C言語ではconstを省くことが文法的には認められてても・・・・・C++に流用できないプログラムは、たぶんコードとしては減点となる。
0919はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
垢版 |
2020/09/17(木) 20:08:22.99ID:FojOL81h0
>>917
配列を渡すのではなく「配列へのポインタ」だ。
配列は多くの場合に配列の先頭要素を指すポインタに暗黙に型変換されるけども、
それとは別に配列を指すポインタというものが存在し、
指す先の配列の大きさは型情報として保存される。
0921はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
垢版 |
2020/09/17(木) 20:14:06.25ID:FojOL81h0
int array[][5] という配列があったとしたら、その先頭要素の型は int [5] なので、
通常通り配列の先頭要素そ指す型に型変換したら int (*)[5] になるんだ。
仮引数の側もそれと同じような調整が入る。
0931はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
垢版 |
2020/09/17(木) 22:46:13.06ID:FojOL81h0
修飾なしで const になって、変更可能な変数の場合に指定を付けるようになってればよかったのに
という声は一部では根強く有る。
もちろんそんな非互換な変更を C/C++ が受け入れるはずがないので
あくまでももしもの話というか愚痴の類なんだけど。

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

個人的には、 C で意識して const を付けるのは関数の仮引数くらいで十分だろう
という程度かな。 そのかわり仮引数の型付けはかなりしっかりしたい。
0933デフォルトの名無しさん (ワッチョイ ff63-LEsg)
垢版 |
2020/09/17(木) 23:13:21.69ID:aQ5w/H9b0
リソースが極限まで制限されるような環境下で動かすことがる
ハードに近い部分を書くことが多かった
最適化の精度が悪かった
みたいな時代背景があるのでデフォルトがconstはナンセンス
もちろん今の時代に1から設計するならそういう言語が出てくるのは当然
0936はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
垢版 |
2020/09/18(金) 00:25:49.56ID:InePzAsW0
普通に array[1][3] みたいにして要素にアクセスするときでも
規格上の理屈では *(*(array+1)+3) の構文糖であるということになってて、
じゃあこれを成り立たせるにはどういう型情報があればいいのか
みたいな方向でパズル的に考えて遊んだりするのも面白いかもね。

あとここまでのやりとりで出てきてないっぽいから注意点を示しておくけど、
配列が暗黙の型変換でそれの先頭を指すポインタになるルールの例外が
sizeof を適用したときと単項 & を適用したときだよ。
0938デフォルトの名無しさん (ワッチョイ 9f01-RDjc)
垢版 |
2020/09/18(金) 06:28:13.21ID:n6muJc1p0
>>933
> リソースが極限まで制限されるような環境下で動かすことがる
> ハードに近い部分を書くことが多かった
> 最適化の精度が悪かった
なんの理由にもなってないと思うが…
単にK&Rがそう言うのに無頓着だっただけだろ
0939デフォルトの名無しさん (ワッチョイ b7b7-Cup9)
垢版 |
2020/09/18(金) 06:31:46.59ID:dDojkzke0
何の理由にもなってないのはそのとおりだが
なんで無頓着って話になるんだ?
アセンブラで書いていたUnicsを高級言語で書けるようにしようって作ったんだぜ?
0941デフォルトの名無しさん (ワッチョイ b7b7-Cup9)
垢版 |
2020/09/18(金) 09:11:41.22ID:dDojkzke0
初心者がややこしい規則をこれから憶えようってときには
確かにあの言い方は情報量少なくて憶えやすそうだけど
初心者を卒業したらいつまでもしがみついてると格好悪いね
0942デフォルトの名無しさん (ワッチョイ 9f01-RDjc)
垢版 |
2020/09/18(金) 10:09:00.07ID:n6muJc1p0
>>939
例えばintとポインタの扱いとかみたら結構無頓着だと思わない?
別にそれが悪いと言ってるわけじゃない
高級アセンブラとしてはまあ理解出来なくないし当時のマシン環境の制約もあっただろうしね
0943デフォルトの名無しさん (エムゾネ FFbf-SP/v)
垢版 |
2020/09/18(金) 10:37:02.65ID:6n8VMUNiF
ラクッペペ MM8f-kMIc

こいつは無視でOK
0952はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
垢版 |
2020/09/19(土) 13:13:28.09ID:cxOsPIuF0
>>951
一応は >>949 も未定義だよ。
呼出規約が cdecl だったら余計な引数は捨てられるだけで問題にならないとは思うけど。

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

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

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

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

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

thx
0956はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
垢版 |
2020/09/21(月) 08:57:54.77ID:sulqQktu0
>>955
普通はする。 すべきだ。 というのがどれほどあてになるか。

普通はすることを (うっかり) しなかったら (エラーとして検出されずに) 通ってしまうってのは
K&R スタイルの関数定義はイケてないねって話。
0957はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
垢版 |
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 をインクルードしておかないと間違いは検出できない。
0958デフォルトの名無しさん (アウウィフ FF5b-SP/v)
垢版 |
2020/09/21(月) 10:49:53.26ID:M8W5JifWF
linkエラーは?
0960デフォルトの名無しさん (アウウィフ FF5b-SP/v)
垢版 |
2020/09/21(月) 11:19:45.80ID:M8W5JifWF
実行時にスタック壊れたり
hangupしたりするんです?
0961はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-b3rt)
垢版 |
2020/09/21(月) 12:59:37.93ID:sulqQktu0
>>958
C のオブジェクトファイルは名前しか保存しておらず、
型はヘッダファイルでやりとりするというのが伝統的なデザイン。
だからそれを一致させるのはプログラマの責任。

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

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

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

それの恩恵を有り難く頂戴しているのがC++
0963デフォルトの名無しさん (ドコグロ MMdf-RDjc)
垢版 |
2020/09/21(月) 20:06:59.96ID:CAa9Vr4hM
意味わからん
マンダリングしてるC処理系なんてあったっけ?
別にオブジェクトコードに含ませなくてもデバッグ情報に含ませといてチェックするとかでも良いと思うけどね
0966デフォルトの名無しさん (ワッチョイ 9f47-SP/v)
垢版 |
2020/09/22(火) 02:46:33.89ID:EwzeVKsQ0
本人が間違ってる分には無視すれば良いだけだが
初心者スレで嘘を撒き散らすのは良くないな
0967デフォルトの名無しさん (アウアウウー Sa5b-e7tI)
垢版 |
2020/09/22(火) 09:19:28.05ID:73EWHT9ca
volatileオブジェクトへのアクセスは副作用を生じるというのを見たことがあるのですが
この場合の副作用とは具体的にはどういう事象のことを言っているのでしょうか?
0970デフォルトの名無しさん (アウアウウー Sa5b-e7tI)
垢版 |
2020/09/22(火) 12:21:55.75ID:73EWHT9ca
>>968
レジスタなどにアクセスする際に最適化で誤動作しないようにvolatileを付けるのかなと思ったのですが、
逆にvolatileを付けることによる不都合(副作用)って何かあるのでしょうか
それとも最適化されないことを副作用と読んでいるのでしょうか

>>969
最適化しないことによる処理時間増加でしょうか
0973デフォルトの名無しさん (ワッチョイ 177f-PS54)
垢版 |
2020/09/22(火) 12:48:41.23ID:fNKq19I/0
>>970
プログラミングの世界の副作用とは、不都合とかそんな意味ではなくて、内部状態が変更されるとか、外に何らかの影響を与えるとかそんな意味だよ。

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

volatileの件はそれが書かれた前後のコンテキストが分からないから何を指してるのか何とも分からんけど、たぶん、>>968に書かれてるように、外部デバイスへの作用のことを指してるんじゃないかな
0974デフォルトの名無しさん (ワッチョイ bfe9-Cup9)
垢版 |
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),実行環境の状態に変化を生じる。
0975967 (アウアウウー Sa5b-e7tI)
垢版 |
2020/09/22(火) 17:15:02.44ID:73EWHT9ca
回答ありがとうございました
組み込みの資料か何かでvolatileの副作用についての記述があり質問させていただきました
副作用の意味がいまいち分かってないみたいなので勉強します
0980デフォルトの名無しさん (ワッチョイ 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++を使ってるけど、他の環境でも起きますか?
0981デフォルトの名無しさん (ワッチョイ 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

キャスト演算子で型を指定すると、代入の際の暗黙的な変換が禁止される仕様とかあるんですか?
0982デフォルトの名無しさん (ワッチョイ 6bb7-b+lb)
垢版 |
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って警告でるけど型の話じゃないね
0983デフォルトの名無しさん (ワッチョイ 6bb7-b+lb)
垢版 |
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で間接段数の問題ではないので黙っているという説明がつく
0985デフォルトの名無しさん (ワッチョイ 1ee9-b+lb)
垢版 |
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 になると空ポインタ定数ではなくなるので、ポインタに暗黙変換できなくなり、初期化・代入できなくなる。
0990デフォルトの名無しさん (ワッチョイ 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」であっても、定数式と返り値とでは、それぞれの持ってる機能が違うということですか?
0991デフォルトの名無しさん (ワッチョイ 6bb7-b+lb)
垢版 |
2020/09/28(月) 10:24:28.53ID:QxfbhGyV0
>>990
じーしーしーのばーじょんをかくにんしてから
おまえさんのこーどをくわせてみてるんだよ
せんげんだけしてつかってないへんすうがあるのをけいこくされているけど
それはおまえさんがきにしてるかたのもんだいじゃなさそうだねっていってるの
0992デフォルトの名無しさん (ワッチョイ f793-raSa)
垢版 |
2020/09/28(月) 10:34:20.53ID:BXhKM0Xn0
>>991
ひらがなでわかりやすくせつめいしてくださったので
あたまのわるいわたしでもようやくわかりました
ありがとうございます
0994デフォルトの名無しさん (エムゾネ FF32-0ian)
垢版 |
2020/09/28(月) 11:51:34.94ID:PXJ7xAyjF
NULL == 0 // true

ちなみに0は8進数な
0996デフォルトの名無しさん (ワッチョイ 6bb7-b+lb)
垢版 |
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
0997デフォルトの名無しさん (ワッチョイ 92a5-6ZJT)
垢版 |
2020/09/28(月) 13:27:42.04ID:zovFJ8Ky0
次スレは
0999デフォルトの名無しさん (ワッチョイ 6b4e-gvfU)
垢版 |
2020/09/28(月) 14:46:36.10ID:MwxSOqxv0
質問いいですか?
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を超えています。これ以上書き込みはできません。

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