113:デフォルトの名無しさん
20/10/10 07:30:36.51 tajpvl710.net
シェルスクリプトが一番実用性が高い。
114:デフォルトの名無しさん
20/10/10 08:34:32.00 sA7w+t8zK.net
>>106
char型配列が s[] だとして、
printf()に s[0] とか *s を渡してないか?
115:デフォルトの名無しさん
20/10/10 16:25:14.09 i5KfYhU+0.net
>>109
ハゲめ
116:デフォルトの名無しさん
20/10/10 18:03:01.19 NSofC8xCa.net
>>112
strで渡しました。
すみません""で囲ったら
出力されました。
一文字ずつ' 'の方法は
なぜかだめだな
117:デフォルトの名無しさん
20/10/10 19:43:45.13 THhanVwl0.net
char str[] = "unko";
printf("%s", "str");
これで何か出力されたとして
それは目的通りなのか?
118:デフォルトの名無しさん
20/10/10 21:20:02.75 yhyq5Xqm0.net
可変長マクロ、... や __VA_ARGS__ に関連して、カンマが自動削除されたり
する使用は、結局、統一した仕様はあるのでしょうか?
__VA_OPT(,) を使う流儀と、カンマを自動削除する流儀、
実引数に , を書いた場合と書かなかった場合の違いなど、
色々有って何が標準か分かりません。
119:デフォルトの名無しさん
20/10/10 21:36:11.71 yhyq5Xqm0.net
#define aaa(fmt, ...) g(fmt __VA_OPT__(,) __VA_ARGS__)
の場合、
aaa(x)とaaa(x,)でどちらも結果は同じ g(x) になるのでしょうか?
そもそも、VC++では、
#define bbb(fmt, ...) g(fmt , __VA_ARGS__)
としていても、
bbb(x)とbbb(x,)でどちらも結果は同じ g(x) になるのでしょうか?
120:はちみつ餃子
20/10/10 22:10:07.34 i9YWGOdm0.net
>>72
その本を持ってないから前後の文脈はわからんけど、引用部分に関して言えば正しいよ。
「式の評価のときに副作用が起きることもある」というのは正しい。
でも、仮に「式の評価のときに値を得られる他に起きることが副作用である」と言ったら間違いだ。
C では実行環境の状態を変化させることを副作用と定義するのであって、
式評価のときに主作用 (式から値にする操作を仮にそう呼ぶとして) の他に
副作用も起こるというのは定義に付随する性質なわけ。
(C における) 副作用とは何かの「定義」に主作用という概念は絡まないんだ。
式を評価する以外の方法 (主作用が存在しない) で起こる状態変化も副作用ということになる。
121:デフォルトの名無しさん
20/10/10 23:13:28.82 BjcbKuib0.net
厳密に言えば、++ 演算子を絡めたものは、変数自体を変更してるから副作用
b = a + 1
なら、変数a を変更していないから、副作用はない
だから、Go では副作用を警戒して、
++ 演算子は、単独の文でしか使えない。
組み合わせられない
a++
122:デフォルトの名無しさん
20/10/10 23:46:17.77 xY0iDsv30.net
>>117
標準(C17/18までの時点)では可変長引数マクロが第一引数以外の場合は少なくともひとつの引数が無ければシンタックスエラーになる
C++20で対応が提案(採択)されていて, 併せてCにも同じ仕様で提案されてる
URLリンク(www.open-std.org)
現状で(標準の範囲内で)同じことをするにはかなりトリッキーな方法を使う必要がある
URLリンク(stackoverflow.com)
またはBoost.PreprocessorのBOOST_PP_VA_OPTが上記提案の__VA_OPT__の代替として使える
123:デフォルトの名無しさん
20/10/11 00:07:40.75 yV/54YAK0.net
>>118
相変わらず、的外れなことを言ってるなあ。
もう相手するのがめんどくさいわ。
124:デフォルトの名無しさん
20/10/11 00:21:33.30 yV/54YAK0.net
君はたぶんスレを保守してる人なんだろうけどさあ、
その話はHNをわざわざ使ってる君のプライドを守るためだけの話になってるので、ここで話し合う意味がないんだよね。
125:デフォルトの名無しさん
20/10/11 00:30:42.60 u/XktDCx0.net
相手するのがめんどくさい、プライドを守るためだけ
おまいうwww
126:デフォルトの名無しさん
20/10/11 00:45:20.99 y5Dl22i00.net
ここに書き込んでいる人って、暇ですることが無い人ばかりではなかったか?
127:デフォルトの名無しさん
20/10/11 00:48:15.50 yV/54YAK0.net
HNをわざわざ使ってる人は必ず、批判されるとHNを使わずに自演するんだよね。
上の書き込みが自演かどうかは知らんけど、自演は必ずする。
大昔にローカルの掲示板をやってたことがあるから、HNを使う人のこの習性はよくよく知ってる。
一人残らずそうやってた。
128:42
20/10/11 00:54:48.93 Oo+TUOYr0.net
>>42
一部誤っていたので訂正。
6.5.16 Assignment operators
3
An assignment operator stores a value in the object designated by the left operand.
An assignment expression has the value of the left operand after the assignment, but is not an lvalue.
The type of an assignment expression is the type the left operand would have after lvalue conversion.
The side effect of updating the stored value of the left operand is sequenced after the value computations of the left and right operands.
The evaluations of the operands are unsequenced.
なので代入式の値は「左辺式(left operand)に右辺式(right operand)の値を代入した後の値を右辺値(rvalueの意味)として評価した値」が正しかった。
129:デフォルトの名無しさん
20/10/11 00:55:54.98 y5Dl22i00.net
HNをNGに登録し、レス書いた奴ごとアボーンすると比較的すっきりする
130:デフォルトの名無しさん
20/10/11 01:44:57.79 yV/54YAK0.net
>>126
意訳すれば「代入式の値は、左辺へ代入後に取り出してたら処理が無駄に重くなるから、代入直前の値を返すべき。返されるものは、左辺と同じ(値と型が)」
まあ端的に言うと、左辺が返されてると理解しとけばいいね。
131:デフォルトの名無しさん
20/10/11 07:57:55.20 Oo+TUOYr0.net
>>128
「左辺へ代入後に取り出してたら処理が無駄に重くなるから、代入直前の値を返すべき」なんて書いてない
脚注に
> 111) The implementation is permitted to read the object to determine the value but is not required to, even
when the object has volatile-qualified type.
とはあるが, どう実装すべきなどとは書いていないのだから, それは意訳ではなくお前の意見だ
132:デフォルトの名無しさん
20/10/11 08:44:36.55 yV/54YAK0.net
>>129
いやく【意訳】
《名・ス他》原文の語句の一つ一つにこだわらず、全体の意味に重点をおいて訳すこと。その訳。
133:デフォルトの名無しさん
20/10/11 09:21:01.70 yV/54YAK0.net
あと、そういうなら、君の書いた
>代入式の値は「左辺式(left operand)に右辺式(right operand)の値を代入した後の値を右辺値(rvalueの意味)として評価した値」
これだって君の意訳で意見だよね。
言葉は通じるためにある。ネット検索しても、世間一般的にも代入のことは副作用と呼んでるよね。
副作用を検索すれば「代入」という言葉が頻出する。
なので「The side effect of updating the stored value of the left operand」⇒ 代入 となる
次に、「(代入) is sequenced after the value computations of the left and right operands.」を訳すると「代入は両オペランドの値を処理後に行われる」となる。
つまり、「代入は最後に行われる」とは読めないかな? よって、返す値はその前に原則的に決まってるということ。
なので「代入した後の値を」という表現は違和感あるし、ワタスの代入直前の方が正解に近くはないかな?
まあ、ワタスは、C言語の超初心者なので、君の挙げてくれた英文を周辺状況と合わせて普通に読んでるだけだけども。
そもそも論だけど、仕様書のことを述べても、実装がその通りになってるとは限らないから意味ないよね。
134:デフォルトの名無しさん
20/10/11 09:24:54.54 1n9mnEAt0.net
>>120
ご返答有難うございます。
やはり、色々と複雑なようですね。
135:デフォルトの名無しさん
20/10/11 12:23:08.94 kZXFoyze0.net
>>125
136:デフォルトの名無しさん
20/10/11 15:19:35.65 Ryz1amqZK.net
>>114
>一文字ずつ' 'の方法
その場合は最後に'\0'が必要
137:デフォルトの名無しさん
20/10/11 16:59:31.64 Oo+TUOYr0.net
>>131
阿呆かな?
>>128は>>126の原文中に無く脚注で書かれている内容だしその脚注にも「左辺へ代入後に取り出してたら処理が無駄に重くなるから」などとは書かれていない
> 次に、「(代入) is sequenced after the value computations of the left and right operands.」を訳すると「代入は両オペランドの値を処理後に行われる」となる。
> つまり、「代入は最後に行われる」とは読めないかな?
正しい
> よって、返す値はその前に原則的に決まってるということ。
妄想
規格ではunspecified (実装の自由度)
> そもそも論だけど、仕様書のことを述べても、実装がその通りになってるとは限らないから意味ないよね。
逆だろ, 処理系を指定しないなら規格に従うしかない。
138:デフォルトの名無しさん
20/10/11 17:27:29.04 yV/54YAK0.net
>>135
全部反論になってなくて、相手の言ってる言葉を都合のいいように解釈してるだけだね。
139:デフォルトの名無しさん
20/10/11 17:45:12.56 0ARGcdMRM.net
反論できないことは全部反論になってないで片付けるタイプ
140:135
20/10/11 17:51:10.03 jw/lLa/Ba.net
>>136
出先からで済まんな
妄想で仕様書を改竄する言い訳にはならんから注意しな
141:デフォルトの名無しさん
20/10/11 17:52:06.99 yV/54YAK0.net
全然反論になってないし、第一、第一声が「阿呆かな?」と頭に血が昇ってる人の相手しても意味ないじゃん。
142:デフォルトの名無しさん
20/10/11 18:39:36.02 u/XktDCx0.net
意味ないのに書き込んじゃうのはなんでだろうね?
143:デフォルトの名無しさん
20/10/11 19:03:18.63 yV/54YAK0.net
結局、原則的には、返す値は代入前に決まってるよね。gccもVC++もそうみたいだし。
144:デフォルトの名無しさん
20/10/11 19:54:22.88 vwOca/6s0.net
> > そもそも論だけど、仕様書のことを述べても、実装がその通りになってるとは限らないから意味ないよね。
> 逆だろ, 処理系を指定しないなら規格に従うしかない。
同感
145:デフォルトの名無しさん
20/10/11 20:21:00.36 qb0SAJQcM.net
まぁ過去の恨みで絡むのはやめとこうな
非建設的すぎる
146:デフォルトの名無しさん
20/10/11 21:19:40.64 qb0SAJQcM.net
一般論と規格の噛み合わない話が続いてるな
例えば日本語を表すのは大抵の処理系でshift jisかunicodeだが
一般論としてshift jisかunicodeだというと
規格として規定されてないみたいな
お互いの話してる主語が違ってて噛み合わない
147:デフォルトの名無しさん
20/10/11 21:45:50.38 /f4IUzXt0.net
>>144
下段の喩えが分かりませぬ。
148:デフォルトの名無しさん
20/10/12 17:32:23.08 Fn8G8w4j0.net
ファイルオープンできない
visualstudioにてfopen_s
err = fopen_s(&fp,"test.txt","r");
149:デフォルトの名無しさん
20/10/12 17:53:16.57 941JO02hF.net
FILE *fp;
なら
err = fopen_s(fp,"test.txt","r");
150:デフォルトの名無しさん
20/10/12 18:26:02.48 YDN8KrDa0.net
URLリンク(qiita.com)
>>146
これ?
151:デフォルトの名無しさん
20/10/12 20:07:04.33 XcjAzDTUM.net
初心者にありがちなのは相対パスを理解してなくてファイルが無いから開けないってやつ
152:デフォルトの名無しさん
20/10/12 20:19:27.43 UculHi610.net
>>146
それじゃファイル開けないよ
第二引数にファイルパス指定してくださいクソが
153:デフォルトの名無しさん
20/10/13 19:59:14.31 NHAZjg2T0.net
初歩的な質問で大変恐縮ですが、
平成6年度基本情報技術者試験のC言語について質問がありまして、
URLリンク(www.rs.kagu.tus.ac.jp)
問2のCですが、答えが2つありませんか?
ウでもエでもどちらでも正解の気がします。
コンパイルして両方の回答で試してみましたが、問題なく動きます。
なぜ答えがウになってエではいけないのか、どなたか知恵を貸していただけませんでしょうか?
154:デフォルトの名無しさん
20/10/13 20:23:51.05 FgDiRT1ia.net
146です。パス入力しデバッグしたら
なにかわけわからんBOX
でてきて思い通りになりません。
155:デフォルトの名無しさん
20/10/13 22:42:18.30 ciG+8HNI0.net
グローバル変数として宣言した変数j0とj1がmathcalls.hにもあるようで、コンパイルするとエラーが出ます
ヘッダファイルを書き換えずに回避するにはどうすればいいですか?
よろしくお願いします
156:デフォルトの名無しさん
20/10/13 22:43:11.29 b7C863zx0.net
>>151
エだと、60文字目と61文字目が' 'の行があるときに余分な改行が入る
157:デフォルトの名無しさん
20/10/14 01:03:48.89 9cyhkhnyp.net
モバイルC[C/C++コンパイラ]というアプリケーションを使っています
do~while()文で1!+2!+…+n!が1000を超える最初のnの値を求める問題です
以下の画像のどこが間違ってるか教えて頂きたいです
URLリンク(i.imgur.com)
158:デフォルトの名無しさん
20/10/14 01:22:34.34 6pvowPnvM.net
どうなって欲しくてどうなってしまうかくらい書け
159:デフォルトの名無しさん
20/10/14 02:05:50.62 9cyhkhnyp.net
14と表示されてほしいのですが実行すると以下の画像のようになります
URLリンク(i.imgur.com)
160:デフォルトの名無しさん
20/10/14 03:22:45.65 GZXcc9JpM.net
>>151
出題者が想定していた回答から察するに、「正しい答えを選べ」=「最適なものを選べ」という題意なんだろうね。
「エ」の場合、009~012が必ず実行される。
「ウ」の場合、空白が連続していない場合のみ、009~012が実行される。
なので「エ」よりも「ウ」の方が、実行時のコードが少なくなる可能性≒処理速度が速い≒より最適化されている。
ということで、「エ」を排しても「ウ」が選ばれるべき理由は説明できるけど、その逆は説明できそうになさげ
161:デフォルトの名無しさん
20/10/14 05:08:01.62 GZXcc9JpM.net
>>155
モバイルCのことは、よく知らないのだけど。
11行目を削除するか、↓のようにコメントアウト(行頭に // を追加)してみるとか。
// int fact(int n);
>>157
「1!+2!+…+n!が1000を超える最初のnの値」が「14」ということなのかな。
1!+2!+3!+4!+5!+6!=873
1!+2!+3!+4!+5!+6!+7!=5913
ということで(14ではなく)7あたりが正解であるように思える、なんとなくだけどね
162:デフォルトの名無しさん
20/10/14 05:26:43.66 z5Uy/Vd30.net
画像でコードを見せられても、テストできない
paiza.IO などに書いて下さい!
163:デフォルトの名無しさん
20/10/14 06:30:51.16 8SMXEVrO0.net
>>154
>>158
回答ありがとうございます。
よくわかりました!
164:デフォルトの名無しさん
20/10/14 10:47:06.71 ssGc8zMA0.net
>>151
クソみたいなマルチポスト野郎だな
俺らはこういうゴミに手を貸してたのか
騙された気分だ
C言語について質問です。平成6年度基本情報技術者試験のC言語につ... - Yahoo!知恵袋
URLリンク(detail.chiebukuro.yahoo.co.jp)
165:デフォルトの名無しさん
20/10/14 11:51:52.20 +mJN3MGTM.net
>>155
URLリンク(file3-d.kuku.lu)
#include <stdio.h>
int fact(int n){
if(n==1)return 1;
return n*fact(n-1);
}
int main(void){
int n=1,a=0;
while( (a+=fact(n)) <= 1000 ) n++;
printf("%d", n);
}
普通に7って出たけど?
URLリンク(file3-d.kuku.lu)
166:デフォルトの名無しさん
20/10/14 13:06:19.00 8/BbynCKp.net
>>163
試したら7になりました、ありがとうございます
167:デフォルトの名無しさん
20/10/20 01:13:51.72 1WZYXiCK0.net
>>163
インデントがキモい
168:デフォルトの名無しさん
20/10/20 08:49:06.08 q8Z69frHa.net
systemのパスが通らない
ファイルに入力して
コンソールで表示する
プログラムだが
ファイルと同じパスでエラー
当方初心者
169:デフォルトの名無しさん
20/10/20 08:55:48.28 0IrscxF80.net
まずはその日本語をなんとかしろ
170:デフォルトの名無しさん
20/10/20 09:22:30.31 wzOsKsv00.net
>>166
パスって何か知ってる限り書いてみな
171:デフォルトの名無しさん
20/10/20 10:05:35.78 qYYfNILyM.net
>>165
んな事言われましても一応、HTML系の書き方なんで
URLリンク(ja.m.wikipedia.org)字下げスタイル
bannerスタイルは、ブロックのヘッダ部だけを字下げレベルで特別に目立たせるスタイルである。
ちょうど、K&Rスタイルでブロックの終わりの中括弧の字下げレベルを戻さないスタイルである。
172:デフォルトの名無しさん
20/10/20 10:22:20.38 wzOsKsv00.net
どっちもどっちだ
自分のスタイルと違うだけでキモいとか言い出すやつも
自分のスタイルを気に入らない人に言い訳するやつも
協調性を欠くという点で同じだ
プロジェクトに参入するたびに顰蹙かうやつ
173:デフォルトの名無しさん
20/10/20 10:32:37.64 qYYfNILyM.net
追い訳しますけど、質問者が読みやすいように
質問者のスタイルに合わせてあげたという事も忘れないで頂きたい。
174:デフォルトの名無しさん
20/10/20 10:49:54.94 2QIfR1k/H.net
質問者がそのスタイル使ったのは最後の行だけだ
意図して使っているわけではないのに無駄にマイナーなスタイルで答えるな
175:デフォルトの名無しさん
20/10/20 10:51:18.57 pHiz9StDF.net
>>166
ideone.com
pastebin.com
176:デフォルトの名無しさん
20/10/20 11:18:11.29 69CHk5Nl0.net
ここでは俺が無法者だ!!
177:デフォルトの名無しさん
20/10/20 15:12:59.44 aEz3U6LC0.net
環境変数PATH なら、; 区切り。
PowerShell で以下を入力してみ
$env:Path.split( ";" )
178:デフォルトの名無しさん
20/10/21 10:15:31.31 KGhWJPjI0.net
>>172
このスレにコーディング規約がある訳じゃないんだからスタイルは回答者の自由だが
179:デフォルトの名無しさん
20/10/21 10:45:56.94 CZ2/iovY0.net
わかったわかった
お前はキモい、もうそれでいいよ
キモいことを自覚してそのスタイルを使い続けてくれ
心理的にダメ、気持ち悪いんだよお前
180:デフォルトの名無しさん
20/10/21 11:02:14.79 nW5Wnc+BM.net
おまえツイッターでも文脈見ずにクソリプばっかりしてるだろ
181:デフォルトの名無しさん
20/10/21 12:17:24.48 EPxGxCCv0.net
MinGWをインスコしてあれば
path | sed "s/[=;]/\n/g"
182:デフォルトの名無しさん
20/10/21 16:41:05.37 gYHxZT9P0.net
>>155
エラーメッセージからするとmain()関数内部でfact()関数の宣言を
書いていることが原因らしい。
素朴なCだと、そう書くとまだ名前が宣言されて無いグローバル関数を
main()関数内部で使えるようにする意味になるが、現在のC/C++だと
それぞれのコンパイラが独自に拡張したりした結果、
「(関数内部における)内部関数」なるものが使えるコンパイラが出てきたため、
意味が違ってしまっていることがある。
今の例の場合、main関数の中で後から定義するfactという名前の関数を先に
宣言する意味だとコンパイラは認識してしまっている可能性が高い。
だから、main関数の中にfact関数の関数定義が書かれて無いのでそのような
エラーが出る。
もし、素朴なCのプロトタイプ宣言にしたい場合、
main()関数の外側に書くのが普通だが、なんらかの事情でmain()関数の内側に
書きたい場合には、
int main(void){
extern int fact(int n);
・・・
}
のようにexternキーワードを書くと通ることがあるかも知れない。
183:デフォルトの名無しさん
20/10/21 16:52:54.92 EPxGxCCv0.net
関数のブロック内に関数原型があるのは完全に合法
実用上まず使わないけどね
184:デフォルトの名無しさん
20/10/21 17:02:00.07 gYHxZT9P0.net
>>181
もとは合法だったが、それぞれのコンパイラが独自拡張をした結果、
意味が変わってしまってる場合がある。
185:デフォルトの名無しさん
20/10/21 17:14:09.48 EPxGxCCv0.net
日本語でおk
186:蟻人間
20/10/21 17:17:08.30 vNonm69Zd.net
>>182さん、思い込みが激しすぎて証拠がないのに持論を主張する。
187:デフォルトの名無しさん
20/10/21 17:58:35.70 gYHxZT9P0.net
gccなんかは関数の中に内部関数を作れる。
だから、関数内でプロトタイプ宣言を書くと元定義の pure Cとは
異なった意味になる可能性が高い。
188:デフォルトの名無しさん
20/10/21 18:02:50.56 gYHxZT9P0.net
>>184
現にその宣言が無ければコンパイルが通り、有ればエラーになっている。
それが一つの根拠。
実験してみたわけじゃないがそれらが本当におきているとすれば
入れ子関数(内部関数)の独自拡張が原因だと洞察できる。
189:蟻人間
20/10/21 18:05:50.18 vNonm69Zd.net
>>186
再現可能な最小コードを用意して下さい。
190:デフォルトの名無しさん
20/10/21 18:11:05.50 gYHxZT9P0.net
他の人の実験結果から推定しているだけだから、事実かどうかは分からんよ。
191:蟻人間
20/10/21 18:23:13.18 vNonm69Zd.net
モバイルCっつー奴にバグ報告せよ。
192:デフォルトの名無しさん
20/10/21 18:35:10.36 gYHxZT9P0.net
PythonやLuaもサポートしているが、Clang, LLVMという言葉があった。
使ってるコンパイラはClangなのかな?
193:デフォルトの名無しさん
20/10/21 20:31:51.31 z1b04ciPa.net
簡単な質問申し訳ないです。
漢字を文字コードにて受け
putcで標準出力できるかな?
194:デフォルトの名無しさん
20/10/21 20:57:42.76 GehgBoqYM.net
もちろんできるけど、
入力される文字コードの種類と出力する文字の符号化方式は何にしたいか分かってるの?
195:デフォルトの名無しさん
20/10/21 21:05:35.53 Cabs0W0/M.net
文字が文字コードで扱われるのは普通の事だ
画像とかではないなら
196:デフォルトの名無しさん
20/10/21 22:53:14.42 sHBY55kz0.net
putw
putwc
197:蟻人間
20/10/21 23:01:37.11 T/uvMZ2i0.net
全角文字はマルチバイト文字かUnicode文字。
198:デフォルトの名無しさん
20/10/22 04:18:40.19 OxqRNNZs0.net
フリーランス向け報酬即日払いサービス『先払い』が、オンライン資金調達プラットフォーム『資金調達freee』β版に掲載開始
URLリンク(prtimes.jp)
フリーランスやパラレルワーカー同士のマッチングプラットフォーム「conema」が、
案件依頼・仲間募集を中心とした掲示板機能(β版)をリリース!
URLリンク(prtimes.jp)
フリーランス薬剤師専門エージェントサービス「きょうりょく薬剤師」、リリース開始。薬剤師の新しい働き方を提唱。
URLリンク(prtimes.jp)
中卒、新聞配達員から月収4億の不動産王へ。姫路の不動産王の投資哲学
URLリンク(hbol.jp)
【アプリ開発で起業】必要な心得とマネタイズ方法のすべて
URLリンク(www.dreamgate.gr.jp)
副業を認める企業に対して「より魅力的に感じる」人は6割以上。
一方、副業を認めない企業に対する魅力度は6割超が「低下した」と回答
URLリンク(prtimes.jp)
みんなが知らない「サラリーマンの生存戦略」副業年収1億円!motoさん伝授
URLリンク(diamond.jp)
199:デフォルトの名無しさん
20/10/24 23:58:39.57 3PXn8xmW0.net
なぜ
int* a = 0;
*(PBYTE*)&a += 5;
は動作するのに
int* a = 0;
(PBYTE)a += 5;
はエラーになるのですか?
200:デフォルトの名無しさん
20/10/25 00:02:11.04 TZHfVi9W0.net
>>197
(PBYTE)a += 5;
どこに5を加算していると思う?
201:デフォルトの名無しさん
20/10/25 00:12:03.26 5nJTYzvV0.net
>>198
キャストしているとはいえ、ポインタaに加算していると思うのですが、、
ポインタはアドレス0を指しているので、加算することによってアドレス5を参照したいのですが
なぜかエラーが出てしまうのかわかりません..
202:デフォルトの名無しさん
20/10/25 00:42:02.50 LNYSWk6n0.net
それだけじゃ参照してないしエラーなんてならなそうだけど
いつどんなエラーになるの?
参照した時?なら、5番地を読んでいい環境なの?
windowsやlinux等高級なOS上なら、絶対番地を勝手に読んじゃダメだよ
203:デフォルトの名無しさん
20/10/25 00:46:43.39 TZHfVi9W0.net
(PBYTE)a は 変数ではなく、値になる
204:デフォルトの名無しさん
20/10/25 00:51:22.10 5nJTYzvV0.net
>>200
コンパイルエラーになるんです。
エラー内容は"式は変更可能な左辺値である必要があります"です。
このコードはここに投稿するためのテストのために書いたコードなので、
参照関係の問題は理解しています。
*(PBYTE*)&a += 5;
と
(PBYTE)a += 5;
はやってることは同じと思うのですが、なぜエラーになるのかなと。
そういうものとして理解するしかないのでしょうかね
205:デフォルトの名無しさん
20/10/25 00:57:14.44 TZHfVi9W0.net
*(PBYTE*)&a =
変数aの現在の値を&で取り出し、
それをポインタ値として扱い、
そのポインタ値が指し示すところに代入する
ということじゃないかな
206:デフォルトの名無しさん
20/10/25 01:18:53.38 TWzqhGL8M.net
(PBYTE)a みたいにキャストすると、値の解釈の変更ということになり、
代入先(左辺値)にはできなくなる。
int i;
(float)i = 1.1;
って意味あると思う?
207:デフォルトの名無しさん
20/10/25 01:33:16.78 5nJTYzvV0.net
あ~~ なるほど
floatなどの小数点以下を扱う型は以下のようにdが1になる特別な仕様があるから
そのためにエラーになるようになってるんですかね。
float c = 1.5f;
int d = (int)c;
int e = *(int*)&c;
この場合、dは1になるけど、eは1069547520になるから、
エラーになる現象はこれと近いのかな
この解釈であってるのだろうか
208:デフォルトの名無しさん
20/10/25 01:35:55.99 TWzqhGL8M.net
それそれ。
それ追記しようとしてた。
209:デフォルトの名無しさん
20/10/25 01:54:40.07 5nJTYzvV0.net
とはいえ
int i;
(float)i = 1.1;
これはiを一時的にfloatにキャストしてるだけだから、エラーにせずにiは1として動作させるとこはできなかったんだろうか
210:デフォルトの名無しさん
20/10/25 02:21:39.27 COZe3KfC0.net
>>202
「なぜエラーになるのか」はエラーメッセージに出てる。
理解を深めたいなら、エラーメッセージのどこがわからないのか(どこまでわかってるのか)を言ってもらわないと。
211:デフォルトの名無しさん
20/10/25 02:57:11.72 5nJTYzvV0.net
>>208
そもそもなぜコンパイラがこれをエラーと捉えるのかというのがわからないと言う意味で言っておりました。
212:デフォルトの名無しさん
20/10/25 03:00:35.23 COZe3KfC0.net
>>209
URLリンク(kikakurui.com)
> 制約 代入演算子の左オペランドは,変更可能な左辺値でなければならない。
213:デフォルトの名無しさん
20/10/25 03:18:58.54 COZe3KfC0.net
>>207
ルールがこうなってる理由がわからないという話なら、それは
(float)i = 1.1 が i = 1 と同じになるようにルールを複雑化させてもそれに見合うほどうれしくないから、ね。
214:デフォルトの名無しさん
20/10/25 03:28:10.91 UGl+6vH40.net
>>202
キャストの結果は常に右辺値
右辺値を代入してるから右辺値には代入出来ないというエラーが出る
ポインタのデリファレンスの結果は左辺値なので代入も問題ない
あとエスパーするにPBYTEってuint8_t (unsigned char)なんだろうけど(それ以外の場合はデリファレンスの結果が未定義),
> *(PBYTE*)&a += 5;
はint型の先頭バイトを書き換えたいという意図で,
> (PBYTE)a += 5;
こっちはメモリのどの位置を書き換えたいのか自明じゃないからやってること自体全く異なる
215:デフォルトの名無しさん
20/10/25 08:17:29.39 B8Qi0Gue0.net
キャスト式の結果は左辺値ではない
間接演算式の結果は左辺値となる
これだけのことだろ
216:はちみつ餃子
20/10/25 09:56:54.64 63196X630.net
gcc3 の頃までは cast-as-lvalue が有ったけど 4 になるときに廃止された。
古いコードでこの機能をあてにしているものはあるかもね。
217:デフォルトの名無しさん
20/10/25 13:18:04.05 FzqccguI0.net
>>197
(PBYTE)*a += 5;
218:デフォルトの名無しさん
20/10/25 13:19:58.42 FzqccguI0.net
>>202
答えだけ言うとやってることが同じではない
219:デフォルトの名無しさん
20/10/25 16:44:12.86 5nJTYzvV0.net
>>215
(PBYTE)*a += 5;
これはaのポインタが指す値に5を加算しているのではないでしょうか?
なので
*(PBYTE*)&a += 5;
と同じではないと思うのですが
220:デフォルトの名無しさん
20/10/25 16:58:46.13 FzqccguI0.net
(PBYTE *) って (BYTE **) のことか
それなら同じじゃないな
っていうか「左辺値が変更出来ない型になってる」
これでこの話は終わり
221:デフォルトの名無しさん
20/10/25 17:29:39.65 0u/0rMBT0.net
それなら「左辺値」ではなく「左辺」だろう
222:はちみつ餃子
20/10/25 18:23:36.88 63196X630.net
>>217
型とは独立して (一部関係もあるが) lvalue (左辺値) と rvalue (右辺値) という概念があるってのは理解できてる?
たとえば
int x=5;
x = 2;
と書いたら OK だけど
5 = 2;
と書いたらもちろん NG だというのはわかるよね。
変数は評価したら値が出てくるけどそれとは別に場所としての性質も持ってる。
場所と値としての性質を併せ持っているのが lvalue なんだ。
で、キャスト演算子を適用するというのは取り出した値に対して型変換することになるので、
型変換した結果は場所としての性質が失われてしまう。
つまり lvalue ではなく rvalue になってしまってこれは代入先としては有効ではない。
---- 余談 ----
実際には代入先は lvalue の中でも特に modifiable lvalue (変更可能な左辺値) である必要があって
そのあたりの詳細は 6.3.2.1 あたりに記述がある。
URLリンク(kikakurui.com)
223:デフォルトの名無しさん
20/10/26 03:47:15.23 zDyo5E1K0.net
>>191
出力する端末が漢字を出すような端末で、尚且つその端末で漢字とされるコードを引き渡すのであれば出る。
しかしメジャーな文字コード体系で1バイトだけで漢字を表すようなものはなく、そういった端末も(おそらく自作しない限りは)ないだろうから putc() 1回だけで漢字が出ることはまずないと思う。
224:デフォルトの名無しさん
20/10/26 07:27:20.32 ddH/1NYY0.net
>>217
間接演算子は単項なので、代入演算子よりも先に結合する
よって意味的にはこうなっている
((PBYTE)(*a)) += 5;
225:デフォルトの名無しさん
20/10/26 09:07:00.12 ePNtOm9AM.net
>>215 >>222
恥ずかしいから出てくるな
226:デフォルトの名無しさん
20/10/26 09:39:14.29 ddH/1NYY0.net
>>223
ん? 俺は、おまえさんに恥をかかせたのか? そういう意図はなかったが
227:デフォルトの名無しさん
20/10/26 10:11:22.50 ePNtOm9AM.net
>>224
最初の質問が
*(PBYTE*)&a += 5;
(PBYTE)a += 5;
の違いなのに、
(PBYTE)*a += 5;
を解説するというトンチンカンで質問者を困らす回答見せられたら、
質問者に申し訳ないし同じ回答者としてこっちが恥ずかしくなるわ
228:デフォルトの名無しさん
20/10/26 11:15:20.28 ddH/1NYY0.net
俺は別に回答なんかしてねえよ
> ポインタが指す値に5を加算
これは間違いだよと指摘しただけだ
俺と217の対話に横レスしてきて勝手に恥ずかしいとか言ってる恥ずかしいやつに用はない
229:デフォルトの名無しさん
20/10/26 15:09:18.69 EltRWJ/HF.net
int a = 123;
int *p = &a;
unsigned c = (unsigned long)p;
みたいにすると怒られるので
unsigned c = *(unsigned long *)&p;
みたいに参照すると ok だったりするけど
本来は参照するだけだったコードが
いつの間にか事情を知らない人によって
*(unsigned long *)&p += 5;
にすり替わったんじゃないかと最近思うようになった
230:デフォルトの名無しさん
20/10/26 15:20:36.35 lJWYL04O0.net
ポインタ(アドレス)の距離を求めるのに ポインタ値を整数化することはあるかもしれないしエラーにはならんね
unsigned long c1 = (unsigned long)p1;
unsigned long c2 = (unsigned long)p2;
c1 - c2 のような (p1 - p2 はあくまで要素数だしね)
231:デフォルトの名無しさん
20/10/26 15:49:43.24 qF0DukLxF.net
#include <iostream>
using namespace std;
class A{public: int a; A(int b):a(b){}};
int main() {
A a(123), b(456);
A *p = &a, *q = &b;
unsigned long r = (unsigned long)p, s = (unsigned long)q;
cout << s - r << endl;
cout << (unsigned long)q - (unsigned long)p << endl;
cout << (unsigned long)&b - (unsigned long)&a << endl;
cout << (unsigned long)&q - (unsigned long)&p << endl;
return 0;
}
特に問題無いか
232:デフォルトの名無しさん
20/10/26 20:55:35.80 pV+9Vnjg0.net
>>227 の p を unsigned として抜き出すのに
なんでわざわざ変数のポインタを取り直してるんだ?
int *p;
unsigned c = *(unsigned *)p; で十分なのに
233:デフォルトの名無しさん
20/10/26 20:56:38.86 pV+9Vnjg0.net
× p を
○ p の指し先を
234:デフォルトの名無しさん
20/10/26 21:41:34.62 P78swXdWM.net
*pじゃなくてpを取り出してるからだろ
235:デフォルトの名無しさん
20/10/26 21:55:26.21 ZLlt5QiZ0.net
pの指し先をunsignedとして抜き出しているわけではないよ
p(ポインタ)自体をunsignedに無理やり変換している
236:デフォルトの名無しさん
20/10/26 21:58:46.96 rHcuqZcg0.net
>>227
OKではない。
intとunsigned longは互換性のある型ではないし, アラインメントが異なる場合もあるから一般に未定義動作。
>>228-229
間違ってないけどそのための型としてintptr_tやuintptr_tがあるからそっち使ってくれると可読性がよくてすき
237:デフォルトの名無しさん
20/10/26 22:01:39.15 pV+9Vnjg0.net
ん? ポインタの整数値化 intptr_t な意図なの?
intptr_t c = *(intptr_t *)&p; がなおさら混乱するな
238:デフォルトの名無しさん
20/10/26 22:08:25.93 rHcuqZcg0.net
>>235
long a = 10;
uintptr_t addr_a = (uintptr)&a;
239:デフォルトの名無しさん
20/10/26 22:09:01.82 rHcuqZcg0.net
uintptr_t addr_a = (uintptr_t)&a;
_tが抜けた
240:デフォルトの名無しさん
20/10/26 22:12:25.39 pV+9Vnjg0.net
>>237
それはわかる
>>227 のコードが何を意図してそう書いたのかがワカランのよね
241:デフォルトの名無しさん
20/10/27 12:22:27.85 telUcSp60.net
警告出るね
URLリンク(codepad.org)
242:デフォルトの名無しさん
20/10/29 08:19:02.64 HwPze+NQ0.net
どーせ、プロセッサのプロテクトモードとかで、純粋にポインタの計算すると意図しないオーバーフローやアンダーフローするからじゃね?
243:デフォルトの名無しさん
20/11/01 06:41:32.43 TJdrJp6g0.net
ポインタは符号付きなわけか
244:デフォルトの名無しさん
20/11/07 11:29:01.04 zMpN0fYG0.net
ファミコンってC言語でもプログラミングできるんだねえ
すごいねえ
245:デフォルトの名無しさん
20/11/07 15:37:28.16 vm8bz31qM.net
そんなのコンパイラ次第じゃないのか?
知らんけど
246:デフォルトの名無しさん
20/11/08 15:22:32.44 iVjroALJ0.net
>>242
ファミコンのCPUは2A03(6502互換)だからかなり苦しい感じだと思うけどな。
スタックポインタが8bitしかないしな。つまりスタックは256バイト固定。もちろんメモリは最大64KB。
それでもCコンパイラはあったようなのでかなり工夫したんだろうと思う。
247:デフォルトの名無しさん
20/11/08 16:57:10.35 qvYN+WNM0.net
今も昔もゲーム機の開発なんかはクロス環境だろ
ターゲット上で直接コンパイラ走らせているとは思えないのだが
248:デフォルトの名無しさん
20/11/08 17:19:43.81 fW7gwItS0.net
任天堂から高価な開発機を借りるか買うかしてやるんじゃなかった?
249:はちみつ餃子
20/11/08 17:30:03.29 jznHieWa0.net
>>245
いやいや、ランタイムの保証が小さければ工夫がいることにはかわらんやろ。
250:デフォルトの名無しさん
20/11/09 06:33:25.75 ntGr9Bxw0.net
「Cが使える」=「Cコンパイラを実行できる」と思ってしまうやつって
BASIC出身なんだろうな
251:デフォルトの名無しさん
20/11/09 07:43:11.08 RNMdHR5xd.net
そりゃコンパイル後のバイナリは言語とは関係ないから「ある言語が使える」はそのプラットフォーム上でコンパイラなりインタプリタが動くことを意味するやろ
252:デフォルトの名無しさん
20/11/09 08:25:46.31 ntGr9Bxw0.net
ドヤるようなことかよw
253:デフォルトの名無しさん
20/11/09 09:08:37.31 xqW72pM4M.net
>>244とか>>249みたいな人もいるんだな
254:デフォルトの名無しさん
20/11/09 11:06:53.99 msclAy3m0.net
FCの開発機は1千万円でメガドラ、PCエンジンは250万円という記事を昔みかけた。
そういやぁバッ活に「子育てごっこ」とかいうFC開発キットの広告出てたっけ。
255:デフォルトの名無しさん
20/11/09 11:56:33.56 ntGr9Bxw0.net
あの頃のカスタムLSIは衝撃だったね
256:137
20/11/09 11:56:53.61 SWW65sXCM.net
>>248
FORTHユーザーじゃない?
257:デフォルトの名無しさん
20/11/09 12:11:03.31 ntGr9Bxw0.net
( ゚∀゚) アハハハハノヽノヽノ \ / \ / \
258:デフォルトの名無しさん
20/11/09 13:23:50.49 YVG+/FyZ0.net
もう諦めた
パンツはく
259:デフォルトの名無しさん
20/11/13 12:27:52.99 uyiuIcZiM.net
goto 使うなと保健所や医者がうるさいの何なの。
260:デフォルトの名無しさん
20/11/13 12:47:00.05 6BGA2vQ70.net
多重に囲い込まれているところからの脱出すら許さない教条主義
例外を認めるとあれもこれも際限がなくなるのでお役所作業
261:デフォルトの名無しさん
20/11/13 13:29:41.79 x2VHR/K20.net
仕事丸投げで解決
262:デフォルトの名無しさん
20/11/13 14:08:28.42 5HXc1MIP0.net
クリプトン星人に投げたくせに
クリプトン星人がgoto使うとゴチャゴチャぬかす
勝手な奴ら
263:デフォルトの名無しさん
20/11/13 20:49:27.65 0Q6l6RCm0.net
gotoは有害であるとみなされると、昔の偉い人が言いました。
264:デフォルトの名無しさん
20/11/14 14:04:47.82 eZvyHs9U0.net
gotoキャンペーン中止の可能性
265:
20/11/14 14:17:05.27 GkBooaQrH.net
go to キャンペーンってそもそも名前が悪すぎるよね
266:デフォルトの名無しさん
20/11/14 15:29:53.89 QvOqIpVLM.net
basic風にgosubキャンペーンではどうだろう。
267:デフォルトの名無しさん
20/11/14 15:46:33.79 kNYsw/sP0.net
gotoトラブル
268:デフォルトの名無しさん
20/11/14 16:57:36.06 t12i3dhb0.net
Go To LOVEる
269:デフォルトの名無しさん
20/11/14 17:20:09.80 XuOfn3YC0.net
ここはアニメ板ですね
270:デフォルトの名無しさん
20/11/14 18:05:11.28 b41n/hcI0.net
プログラマの大凡半数はオタクだからな(´・ω・`)
271:デフォルトの名無しさん
20/11/14 18:16:19.79 3sCpnJ2t0.net
しかし例外トラベルはなんかいやだ。
272:
20/11/14 18:33:34.30 ovQs8svhH.net
>>267
アニメならば、2020 年地上波アニメで一番よかったのは a.i.c.o incarnation だったと私は考えています
273:デフォルトの名無しさん
20/11/14 22:05:45.83 XJ24TZhC0.net
そうか?
TRUEは歌がうまいし
白石晴香の声も好きだけど
設定が科学的なフリしてる割に中途半端だし
ツッコミどころ多くてなんだかなと思いながら観てた
274:デフォルトの名無しさん
20/11/15 16:01:45.41 ZF6xjL9s0.net
webサイトぐらいしか作った事無いド素人なのですが
cheatengineのようなツールはどうやって作るのですか?
275:デフォルトの名無しさん
20/11/15 16:31:52.95 U+/Dwi3J0.net
マルチしちゃったね
276:デフォルトの名無しさん
20/11/15 16:46:32.42 BV2MAPDR0.net
許すw
277:デフォルトの名無しさん
20/11/18 02:01:14.39 7/2eOuWRa.net
int suti[]={1,2,3};ってやったらsuti[3]は存在しないんだよね?for文で存在しなくなるまで~ってやりたいんだけどどうすればいい?要素数が変わってもいいようにしたいからi != 3はやりたくないんだよね
278:デフォルトの名無しさん
20/11/18 02:06:30.67 7/2eOuWRa.net
>>275
自レス
出来れば要素数を取得するっていう方法も避けたい!
279:デフォルトの名無しさん
20/11/18 02:16:10.62 D7KcGGQQ0.net
条件式をi<3;ってするのが定番かな。
280:デフォルトの名無しさん
20/11/18 02:16:23.70 xY74VPsT0.net
配列名ってメモリー上に付けられたラベルみたいなものだから、
添え字の範囲が想定を逸脱しててもアクセス出来るからな
エラーになるかは別にして
281:デフォルトの名無しさん
20/11/18 02:17:27.84 xY74VPsT0.net
わりと真面目にやりたいなら、
#define Numof(n) (sizeof(n) / sizeof(n[0]))
for (i = 0; i < Numof(suti); i++)
282:デフォルトの名無しさん
20/11/18 08:19:22.94 xva9VBXaa.net
>>276
どういう理由で要素数の取得を回避したいのだろう?
実現可能なら標準関数も採用してると思う
あるのは終端記号でうちきり式
283:デフォルトの名無しさん
20/11/18 11:15:05.78 2WQ1ruJZ0.net
宗教的理由でsizeofを使いたくないなら
あとはセンチネルの-1を置くくらいしかない
int suti[]={1,2,3,-1};
……何がコイツの教義のお眼鏡に適うかどうか分からんからこれも否定されるかも知れんな
「存在」に関する用語の用法なら、やっぱり宗教的事案で、
「存在しているかどうかをチェックしたい」となるから宗教的思考が背後に控えていると思われる
配列の個数じゃなくて配列の存在だ
存在してるかどうかに強く拘ってんならやっぱり宗教事案なんだろう
だから理由なんて無いな
宗教的な事由で「要素数はイヤ」なんだろう
284:デフォルトの名無しさん
20/11/18 11:49:11.86 kf1ewZiT0.net
BASIC時代の 文字数+文字データ 構造思い出した。
285:はちみつ餃子
20/11/18 12:01:00.59 0x2GmUxc0.net
>>275-276
こういうトリックが使えなくもない
#include <stdio.h>
int main(void) {
int suti[]={1,2,3};
for(int *p=suti; p< *(&suti+1); ++p) printf("%d \n", *p);
return 0;
}
286:デフォルトの名無しさん
20/11/18 12:09:28.92 2WQ1ruJZ0.net
【更新あり】PC-9801のプログラム(ソースコード無し)をリバースエンジニアリングしてくれ!→変態技術の塊なことが判明しました - Togetter
URLリンク(togetter.com)
これによるとBASICはかなり先見性があるらしいが
287:デフォルトの名無しさん
20/11/18 12:59:08.65 8knHjFQ7M.net
>>281
それ、センチネルやのうて、ただの終端マークや
288:デフォルトの名無しさん
20/11/18 15:03:37.53 kf1ewZiT0.net
BASIC自体が使い物にならないとは思わないけど、
命令セットが貧弱すぎてマシン語と組み合わせないと高度なことができなかった。
289:デフォルトの名無しさん
20/11/18 16:20:02.97 2ppIm+8A0.net
言語自体で作れる機能がないのはCだってそうだ
BASICでそれをやると遅いからマシン語の出番があったってこと
USRやEXECじゃなく新コマンドを作ろうとすると結局BASICインタプリタのサブルーチンをJSRしまくることになる
290:デフォルトの名無しさん
20/11/18 17:09:25.17 xY74VPsT0.net
BASICにはCALLと言う無敵の・・・いやなんでもない
291:デフォルトの名無しさん
20/11/18 20:16:59.09 2DtKbiiK0.net
>>275
c++みたいな範囲for文ってCの構文に入らんのかの?
int suti[]={1,2,3};
for(int x: suti) do_some(x);
みたいなやつ。使いどころが極めて限定されるから意味ないかのう。
あとは変態マクロをコネコネするしか思いつかん。
292:デフォルトの名無しさん
20/11/18 20:22:04.53 2ppIm+8A0.net
原理主義的な美意識ならC++いくしかねえだろ
Cは実を取るポリシーだかんあ
293:はちみつ餃子
20/11/18 23:10:46.92 0x2GmUxc0.net
>>282
C/C++ の世界でも BSTR というものがあってな……。
294:デフォルトの名無しさん
20/11/19 01:25:26.46 k2ADczLrH.net
MacにもPSTRというのがあったなあ。パスカル由来だっけ。
確か紅蓮華の人のような名前のコンピュータが...
295:デフォルトの名無しさん
20/11/23 22:01:17.13 9aSCyeCwa.net
if (a()) {} else if (b()) {}
のとき呼ばれる関数の順は必ずa(), b()の順ですよね?
if (a()) {} else {if (b()) {}}
文法的には↑こういうわけだから間違いないですよね?
296:デフォルトの名無しさん
20/11/23 22:52:02.39 O1GHu8Kp0.net
>293
a()の返り値が0以外(True)ならb()は実行されないんじゃないの?
297:デフォルトの名無しさん
20/11/24 00:18:54.48 JYMaFV+Pa.net
そうじゃないと aで nullチェックからの bみたいのできなくなりそう
298:デフォルトの名無しさん
20/11/24 00:25:40.58 stGCUtDe0.net
NULLの時はそのまま後続処理続けるんでしょうか
299:デフォルトの名無しさん
20/11/24 00:29:07.26 JYMaFV+Pa.net
nullのときは b を通過しないようにするかと
質問の趣旨とちょっと違ったかもしれませんね
ゴメンなさい
300:デフォルトの名無しさん
20/11/24 00:30:13.18 JYMaFV+Pa.net
ダメレスの上書きだな…
重ね重ね申し訳ない
301:デフォルトの名無しさん
20/11/24 00:35:37.30 PK3X1vMU0.net
>if (a()) {} else if (b()) {}
書き直して
if ( a()!=0 ) { 処理1 } else if ( b(0)!=0 ) { 処理2 }
a()の返り値がTrue(0以外)ならば 処理1 を実行して次の行へ
a()の返り値がFalse(0)ならば b() を呼び出して、b(0)の返り値が True(0以外)ならば 処理2 を実行。
302:デフォルトの名無しさん
20/11/24 09:15:59.48 ZWk4Vaeta.net
if (stateA) else if (stateB) {} はまだ直感的だけど
if (a() && b()) { ... } で a() が偽の時 b() は実行されない
if (a() || b()) { ... } で a() が真の時 b() は実行されない
のはC言語ならではルールなので注意
303:デフォルトの名無しさん
20/11/24 09:34:54.23 HgpldYdAM.net
>>300
今時のたいがいの言語で同じルールだ。
304:デフォルトの名無しさん
20/11/24 11:48:49.75 8CcwCAVK0.net
デバッガーでトレースするとか
printf()出力で確認するとかしないのかな?
8bit CPUのアセンブラ時代なんてバグでハングして(ry
305:135
20/11/24 12:19:31.97 TYQ0nicua.net
実装がそうなっているだけか規格で保証されているかは全く別問題だから, 「やってみたらそうなった」に加えて規格を確認するのは重要
306:デフォルトの名無しさん
20/11/24 12:22:00.11 vTVthpTQd.net
>>301
そう思ってると痛い目にあう
307:デフォルトの名無しさん
20/11/24 13:36:23.71 CAtJf7/qH.net
>>304
だから、たいがいっつってるだろ
phpとかのろくにcsを学ばずに作った一部のアホ言語まで面倒見きれん
ともかくC言語ならではなどではない
308:デフォルトの名無しさん
20/11/24 13:53:18.36 g7Dt5dEuM.net
要するに短絡評価と非短絡評価
URLリンク(ja.wikipedia.org)
309:デフォルトの名無しさん
20/11/24 17:29:31.98 stGCUtDe0.net
そこまで掘り下げなくても、単に if else 使う時の順序と関数呼出の有無
310:293
20/11/24 17:57:03.44 ufG8nYHfa.net
みなさん色々ありがとうございます
>>294
この場合はもちろん、a()が0を返した場合のことについてです
>>295
そうですよね
そうじゃないと色々困りすぎますよね
冷静になってみればアホな質問でしたすみませんでした
311:デフォルトの名無しさん
20/11/25 17:50:07.30 h9isg/D4d.net
>>305
C言語スレで今時の言語を語る
C言語時代の言語はたいがいの言語でCとは違うルール
312:デフォルトの名無しさん
20/11/25 17:58:01.33 rJINVE9t0.net
if else 辺りは、そんなに違いは無いと思うが
313:デフォルトの名無しさん
20/11/25 19:36:32.00 DcZYUINF0.net
if else 辺りは、PascalとCの違いが分かるところの一つなのな
314:デフォルトの名無しさん
20/11/25 21:51:34.65 vhvyuere0.net
> C言語時代の言語はたいがいの言語でCとは違うルール
日本語でおk
315:デフォルトの名無しさん
20/11/26 01:30:04.21 R1TSJRT3M.net
入れ子になって構文解析に保証回数の記述が必要なC
たぶん大抵は数珠繋ぎになって解析器はお気楽ご気楽シゴトなelseif装備言語
316:デフォルトの名無しさん
20/11/26 08:07:50.73 EOjdKX+aM.net
1passでコードが吐けるんじゃない限り
どこかに構文木を蓄積する必要があるんだから
何らかの上限は必ず存在する。
317:デフォルトの名無しさん
20/12/09 14:46:15.05 lKZrYGPu0.net
ある構造体があるメンバーを持ってるか持ってないかで場合わけってできるの?
318:デフォルトの名無しさん
20/12/09 15:20:51.88 dBVX1XEl0.net
C言語の話で良いのか?
マクロレベルならできるだろうが
実行時は無理だろうな
319:デフォルトの名無しさん
20/12/09 16:23:12.63 W1Z3cSFoM.net
>>315
C++のtemplateなら……
320:デフォルトの名無しさん
20/12/09 23:18:41.68 X6ku5mk00.net
テンプレートを使わないマクロで実現する方法思いつかなかったから調べてみたけど, BOOST_DECLARE_HAS_MEMBERもSFINAEで実装されてた
標準Cの規格の範囲でポータブルな実装は無理そうに思えてきた
321:デフォルトの名無しさん
20/12/10 08:18:36.14 yWf2E74j0.net
C言語にテンプレート機能だけつける方法ないの?
322:デフォルトの名無しさん
20/12/10 08:33:48.40 1ebLrqpT0.net
#include <tgmath.h>みたいの?
323:はちみつ餃子
20/12/10 11:36:21.24 p57PMoZs0.net
>>320
学術的な分類はよく知らないけどそれはアドホック多相に分類されるものじゃないの?
テンプレートはパラメトリック多相的なものなので多相を実現するものという意味では近いけど、
使い勝手としてはそんなに近くない。
>>319
「だけ」っていっても C++ のテンプレートは C++ の型システムやなんやかんやと一体のものなので、
テンプレートだけ抜き出して C に入れるみたいなことは出来ないでしょ。
C 独自のテンプレートみたいなのを考えるくらいなら C++ を使えやって話になるだろうし。
>>315
マクロ展開は文法の解釈に先立って実行されるので、
マクロ展開時にプログラムの内容を見て分岐することは出来ない。
構造体を元にして真偽値を生成するような「展開形」を思いつけば実行時に分岐することは
出来るのかもしれないけど思いつかないなぁ。
324:デフォルトの名無しさん
20/12/10 13:40:39.75 Rt1ylxrY0.net
開発環境の都合で Cしかないので困ってるとすれば
C++ 食って C 吐き出す中間のコンパイラがあればいい ってことに
325:デフォルトの名無しさん
20/12/10 15:08:30.04 cFFVV66u0.net
>>315
構造体に手を入れられるなら、ユニークなIDを割り当てて
そのID見て、処理を切り替えて行く
326:デフォルトの名無しさん
20/12/10 20:09:21.68 CcbWokCZ0.net
>>317
あれ、C++も結局メンバーがなければコンパイル時に死亡するだけじゃ?
ランタイムでどうこうするわけにはいかないんじゃ...
327:デフォルトの名無しさん
20/12/10 21:28:27.30 hyB2wVsLM.net
>>324
sfinaeがあるので死ぬ代わりにfalseを返す関数みたいなのが作れる
ランタイムでどうこうしたければtype_info -> boolな関数を作ればいいが、型を追加するたびに変更が入ることになってtemplateほどの便利さはない
328:デフォルトの名無しさん
20/12/11 04:23:01.20 p1x0IGcK0.net
C++をベターCとして使う、でいいんでねい?
329:はちみつ餃子
20/12/11 11:11:25.01 NpU6prgS0.net
>>324
(たぶん公式な用語ではないけど) ハードエラーとソフトエラーという区分がある。
テンプレートの展開に失敗してコンパイルの失敗になってしまうハードエラーと、
テンプレートの次の候補を試すソフトエラー。
で、そのソフトエラーを上手いこと利用して分岐するのが SFINAE ってわけ。
C++20 からはコンセプトが入ったのでそれもかなり楽に出来るようになった。
330:デフォルトの名無しさん
20/12/11 13:56:53.94 VMKMxeJn0.net
ここはC言語スレではなくC++勧誘スレになったのか
331:はちみつ餃子
20/12/11 14:34:30.55 NpU6prgS0.net
無理やりでも C で出来るならいいんだけど、出来ないんだもの……。 しゃーない。
332:デフォルトの名無しさん
20/12/11 14:45:28.79 VMKMxeJn0.net
~ならこうやれるって
一種の荒らしだからね
333:デフォルトの名無しさん
20/12/11 16:54:58.94 p1x0IGcK0.net
void func();
void func(int);
void func(double);
void func(void*);
auto func(int) -> enable_if_t<false, int>;
みたいな多重定義があるときに
func(1);
と呼び出されたときに、候補1つずつ
呼び出すとしたら何が起きるのかをリストアップして
void func(); //error
void func(int); //exact
void func(double);//conversion
void func(void*);//error
auto func(int) -> enable_if_t<false, void>; //error
そこからerrorになったのを外すってだけだかんな
334:デフォルトの名無しさん
20/12/11 17:55:15.27 o4C6fSAI0.net
C言語でどうやって多重定義を実装するのかな?
可変長引数をこねくり回せば出来るかもしれないが
335:はちみつ餃子
20/12/11 18:02:13.48 NpU6prgS0.net
>>332
C11 から _Generic という機能で型によって自動で呼び分けることは出来る。
336:デフォルトの名無しさん
20/12/11 18:20:43.38 o4C6fSAI0.net
新しい機能を使うのではなく、もうちょっと工夫してみて
337:デフォルトの名無しさん
20/12/11 18:44:44.22 7UnfkYH50.net
何その上から目線
338:デフォルトの名無しさん
20/12/11 18:47:44.91 o4C6fSAI0.net
それがC言語の醍醐味
339:デフォルトの名無しさん
20/12/11 18:56:25.10 o4C6fSAI0.net
サバイバルナイフ一本でジャングルで暮らしていく位の気概がないとC言語は使えない
340:はちみつ餃子
20/12/11 18:56:28.63 NpU6prgS0.net
>>334
新しいって言ってもなぁ。
今年は 2020 年なんだぞ。
341:デフォルトの名無しさん
20/12/11 18:57:16.38 o4C6fSAI0.net
C11スレでも立ててそこでやったら?
342:デフォルトの名無しさん
20/12/11 19:36:39.77 Z3aKNSgT0.net
Cならポインタを積極的に使う。
343:デフォルトの名無しさん
20/12/11 19:42:20.97 s+Xx8Zn+0.net
C11の話題でわざわざ新スレとかこいつ頭おかしいの?w
344:デフォルトの名無しさん
20/12/11 19:48:16.88 o4C6fSAI0.net
ならば、このスレの話題は、汎用的なC言語で良いでしょう
新しい規格を話題にしたいなら、それ用のスレを立ててすれば良い
345:デフォルトの名無しさん
20/12/11 19:53:34.25 nEgtG7R60.net
>>342
むしろ古い規格のみを話題にしたいお前が他所に行けば円満解決だろう
346:デフォルトの名無しさん
20/12/11 20:09:21.63 o4C6fSAI0.net
ここは初代のC言語スレ
347:デフォルトの名無しさん
20/12/11 20:10:26.40 o4C6fSAI0.net
新しい規格は新しい器でどうぞ
348:デフォルトの名無しさん
20/12/11 21:31:36.15 7UnfkYH50.net
>>343
賛成
349:デフォルトの名無しさん
20/12/11 23:01:06.49 u7x51CWk0.net
>>344
アホ、>>1を見てこい
> C11
> URLリンク(www.open-std.org)
350:はちみつ餃子
20/12/12 09:10:37.90 UUApGKPR0.net
C21 は 2021 年に予定されてるけど、正式発効はいつものように遅くなるかなぁ。
次スレには間に合わなさそう。
細かいところで C++ に追従しているのがありがたい。
351:デフォルトの名無しさん
20/12/12 20:24:51.48 +E0Q9Nw10.net
テンプレ直さなきゃな
現行規格はC11ではなくC18だ
352:デフォルトの名無しさん
20/12/13 02:41:25.02 3BYpAKtx0.net
1スレの1だけど、みんな元気だなw
353:デフォルトの名無しさん
20/12/13 02:52:26.43 dBxf4Vg90.net
わー、凄いですねー(棒
354:デフォルトの名無しさん
20/12/17 09:46:05.20 4VSV+Zch0.net
URLリンク(text.baldanders.info)
ニヤニヤ笑ってしまった
355:デフォルトの名無しさん
20/12/17 13:31:23.27 AFn1O2bR0.net
おれのハード屋の父親もre2cが吐いたようなコードを書いてた記憶がある
356:デフォルトの名無しさん
20/12/25 09:10:24.53 9Fso0P460.net
int a[6];
と
int *a = malloc(6 * sizeof(int));
の違いは何ですか?
357:デフォルトの名無しさん
20/12/25 11:15:33.22 4TR/yfFq0.net
>>354
記憶域期間 storage duration が違う
void func()
{
int a[6];
} //ここで自動開放 automatic storage duration
int a[6]; //最後まで解放されない static storage duration
mallocは当たり前だがfreeで手動開放
C++にはdynamic storage durationというのがあるが
Cでは言語自体にそのような概念はなく
malloc/freeというアプリが提供する機能ということになっている
358:はちみつ餃子
20/12/25 11:18:10.08 My/Ukrd40.net
>>354
違うものを持ち出して何が違うかと問われても困るんやが……。 <
359:br> 背景を全部説明するとだいぶん長くなるので。 とりあえず結果的に出来る配列オブジェクトを比較するならオブジェクトの生存期間 (lifetime) が違う。 前者は自動記憶域期間、後者は割り付け記憶域期間という分類になる。 変数 a の違いという意味では前者の型は int[6] で後者は int* ということになる。 ただし配列は暗黙の型変換でそれの先頭要素を指すポインタになるので、 かなり共通した記法で扱える。
360:デフォルトの名無しさん
20/12/25 11:29:13.76 4TR/yfFq0.net
字が違うことくらい言わんでも解っとるやろ
int a[6]; は sizeof a / sizeof a[0] でサイズを取得できるが
mallocで割り付けたメモリはサイズを聞けず自分で管理せねばならない
361:デフォルトの名無しさん
20/12/25 12:31:04.53 0FtKncKUM.net
目から鱗どころか、天が落ちるぐらい面白い説明ができないのか。
無芸な奴らだ。
362:デフォルトの名無しさん
20/12/25 12:39:14.80 3NwCUk3p0.net
ポインタ int *p; はインクリメント可能で p++ は合法
配列 int a[6]; はインクリメント不可能で a++ はエラーになる
363:デフォルトの名無しさん
20/12/25 12:51:59.76 D8aGfpPud.net
>>358に期待
364:デフォルトの名無しさん
20/12/25 13:23:43.17 9Fso0P460.net
>>354
メモリ配置の連続性はどちらも保障されていることで良いですか?
365:デフォルトの名無しさん
20/12/25 14:43:22.97 3NwCUk3p0.net
配列は先頭から確保された領域の次のところを指せるまでは連続性が保障されてるんじゃなかったかな
規格あたるのはまかせた
(malloc の戻りは… 配列に準じるように実装されてそうではある)
366:デフォルトの名無しさん
20/12/25 14:54:43.85 qJluI3Ne0.net
>>361
プログラムからの見た目はどちらも連続。
物理的に連続させたいならdma メモリ 確保とかでググる
367:デフォルトの名無しさん
20/12/25 15:09:30.51 2V7uRClp0.net
int a[6];はローカル変数ならスタック領域に確保、グローバル変数や
int *a = malloc(6 * sizeof(int));はヒープ領域に確保
でいい?
368:デフォルトの名無しさん
20/12/25 15:19:15.56 qJluI3Ne0.net
ダメ
グローバル変数はデータ領域とかbss領域とかいろいろ
369:デフォルトの名無しさん
20/12/25 18:54:05.01 Tea3EQhG0.net
アドレス見ない, かつ定数だと何処にも領域取らない可能性まである
370:デフォルトの名無しさん
20/12/25 20:30:05.07 EiswCiht0.net
そんなこと言い出したら
ローカル変数だってスタックじゃないかもしれない
371:デフォルトの名無しさん
20/12/25 20:39:01.52 MidTJiO80.net
どこにあるかよりどれだけ生きているかの生命期間が大事ね
372:デフォルトの名無しさん
20/12/25 21:22:39.71 EiswCiht0.net
速度も
373:デフォルトの名無しさん
20/12/25 21:23:50.85 EiswCiht0.net
生命期間も実際はC言語の文法通りじゃない
374:デフォルトの名無しさん
20/12/26 05:33:54.37 ekLZAtHZ0.net
>>361
> 7.20.3.3 malloc 関数
> 機能 malloc 関数は,大きさがsize であるオブジェクトの領域を割り付ける。
領域とは連続した区間をいう
375:デフォルトの名無しさん
20/12/26 07:58:20.12 J4yOWW3+0.net
メモリ(DRAM)上は連続してるとは限らない
C言語上連続として扱えるというだけ
376:デフォルトの名無しさん
20/12/26 08:19:43.84 ekLZAtHZ0.net
それを言うなら仮想記憶だろ
ページ境界をまたぐ場合実記憶が連続しているとは限らない
その昔、ビット幅1bitのDRAMを8個パラってるのがあったけど
だから何って話
それ言い出したらメモリセルのキャパシタは隣接してるのか
377:デフォルトの名無しさん
20/12/26 08:29:01.69 hSiLuJt/d.net
スレタイの俺って誰ですか?
378:デフォルトの名無しさん
20/12/26 09:41:05.55 Mx49Y/J60.net
>>373
> それ言い出したらメモリセルのキャパシタは隣接してるのか
してないよ、アドレス線が入れ替わってる
なのでメモリーテスターはアドレス線を入れ替える機能がついてたりする
379:デフォルトの名無しさん
20/12/26 10:40:07.64 IfMxsBFTd.net
>>366を言い出したからまねして見ただけ
380:デフォルトの名無しさん
20/12/26 12:41:26.45 0+ArpHnq0.net
実記憶も連続していない
時々意識不明になってるはず
ただ、その時の記憶がないだけ
381:デフォルトの名無しさん
20/12/28 07:49:35.18 LdveQEJ20.net
面倒くさい、特異な、一般人には無縁の仕様を考慮するのが当たり前って感じに持ち出して否定するから初心者が逃げていく・・・。
382:デフォルトの名無しさん
20/12/28 08:44:26.16 G7B9oAoL0.net
Cでプログラミングする時に領域の連続性を気にするのは果たして初心者なのだろうか(´・ω・`)
383:デフォルトの名無しさん
20/12/28 09:28:54.37 Q5Pp+CI0a.net
Cでどのくらいできれば
実際役に立つレベルでしょうか?
384:デフォルトの名無しさん
20/12/28 09:45:26.51 ErVwTltE0.net
>>380
Cは言語仕様は小さいし重要なのはC自体が使えることではなくCを使ってその先で何をするかだから、C言語自体の基本的な仕様は完全にマスタしてるくらいでないとわざわざCを使う意味はないかなと思う
385:デフォルトの名無しさん
20/12/29 06:32:49.03 NanqjdNB0.net
iZ-Cのサンプルプログラム書き始めたので見てね。
URLリンク(sunasunax.hatenablog.com)
386:デフォルトの名無しさん
20/12/29 08:44:05.91 gCTQzk+K0.net
>>379
デバイスドライバのぉ バッファをぉ 確保するときとかぁ
ドキドキしちゃうぅ 初心者ですっ❤
387:デフォルトの名無しさん
20/12/31 07:46:12.94 mJm7tBE2d.net
>>361
mallocはNULLを返すこともあるので
その場合は当然連続性は保証されない
そのエラー処理も書いておかないといけない
388:デフォルトの名無しさん
20/12/31 07:51:45.82 /Sdg/sCQ0.net
mallocがNULLを返した場合は
割り付けが行われていないので
連続でも不連続でもない
389:デフォルトの名無しさん
20/12/31 07:55:07.88 /Sdg/sCQ0.net
配列は連続領域が前提だから
E1[E2]が*(E1+E2)と等価となる
構造体も連続領域が前提だからこそ
配列にすることができる
不連続領域はリストや二分木などで
むろん言語自体が提供するのではなく
言語を使ってプログラマが構築するものだ
390:デフォルトの名無しさん
20/12/31 12:57:09.96 mJm7tBE2d.net
>>354
さらに言うなら
グローバル配列はコンパイル時に総数を決定しなければならないが
ローカル配列とmallocを使った場合は
最初に人数を入力し、それに合わせた数の名前配列を確保するような作り方ができる
ただしあまりにも大きいとローカルはスタックが溢れるしmallocはNULLを返す
391:デフォルトの名無しさん
20/12/31 18:54:42.23 /Sdg/sCQ0.net
mallocがNULLを返すのを実際に目撃したやついる?
malloc(2147483647)みたいなわざとらしい実験じゃなく実用で
392:デフォルトの名無しさん
20/12/31 19:17:26.57 lvvsunYH0.net
いますよ。
393:デフォルトの名無しさん
20/12/31 19:34:52.29 1/HNqY6i0.net
目撃とかはよーわからんけど実用プログラムだとアロケーション失敗でログ採ったりしてるからそういうログは見たことあるよ
394:デフォルトの名無しさん
20/12/31 20:41:44.50 +fx38Mty0.net
仮想記憶とか無いOSだとあっさり NULL 返してたな
395:はちみつ餃子
20/12/31 23:27:44.16 xpX6Z+OE0.net
その質問を見てふと思ったことがあるんで便乗質問。
純粋にメモリが足りない (断片化で連続領域がないという場合を含む) という以外で malloc がエラーを返すことってある?
バッファオーバーランとかでめちゃくちゃに書き換えて管理の整合性が壊れたとかいうのは無視して
あくまでアプリケーションとしては C の仕様に則っているという前提で。
396:デフォルトの名無しさん
21/01/01 00:09:31.83 E41TLeHr0.net
組み込みのちっちゃなマイコンなら普通
397:デフォルトの名無しさん
21/01/01 00:12:43.64 mwYi2zym0.net
マルチスレッドでヒープ領域が排他制御で使えないってのはありうる?
398:デフォルトの名無しさん
21/01/01 00:20:48.66 E41TLeHr0.net
さあ
399:デフォルトの名無しさん
21/01/01 00:21:33.85 FRLcRufg0.net
吸い込んでくれ
400:デフォルトの名無しさん
21/01/01 00:34:01.79 ufA+vsC20.net
>>392 メモリクォータ違反とか?
401:蟻人間
21/01/01 00:36:53.19 cLHhn9Dx0.net
>>394
「malloc マルチスレッド」で検索すれば?
知らんけど。
402:デフォルトの名無しさん
21/01/01 01:47:49.68 gWHeIT9l0.net
>388
Win98か2000の頃にあったわ。
1kバイトぐらいのを数万回(ファイル数)mallocやろうとしたらNULL返した。
XPで試したらエラー出なかったけど。
403:デフォルトの名無しさん
21/01/01 05:55:11.31 ihSnxU6O0.net
逆にメモリ不足以外でNULL返すことってあるのか?
404:デフォルトの名無しさん
21/01/01 06:25:04.97 DIBn3EXs0.net
malloc(0)とか
405:デフォルトの名無しさん
21/01/01 12:48:57.97 U0IfpguFd.net
malloc(負の数)も
406:デフォルトの名無しさん
21/01/01 15:48:48.11 1v7huw3N0.net
負数は単に符号なしで評価してとんでもなくでかい領域を要求してるだけ?
407:デフォルトの名無しさん
21/01/01 21:47:45.23 DIBn3EXs0.net
だね
408:デフォルトの名無しさん
21/01/01 22:22:16.08 wEvOepYPd.net
sizeof(struct)*numとかごちゃごちゃ書くうちにうっかり0や負数になって…
というのはよくあった
409:デフォルトの名無しさん
21/01/02 11:42:56.15 QsP+Nlmq0.net
forループでunsignedで<0やって終わらないバグとかもあるな
410:デフォルトの名無しさん
21/01/03 00:53:19.09 ERUOHNUN0.net
>>406
それは正しい挙動じゃないかな。
強いて言えば、おせっかいでwarning出せばいい程度かと。
411:デフォルトの名無しさん
21/01/03 11:06:33.61 QdF5iATA0.net
>>407
正しい挙動 ≠ 想定した動作
412:デフォルトの名無しさん
21/01/03 11:12:17.27 3NmY3eCcd.net
この条件は必ずTRUEになりまっせー
というwarningはあったと思う
413:デフォルトの名無しさん
21/01/03 11:41:35.97 TDgWBZToF.net
<0は終わらないじゃなくて始まらないの間違いだった
414:デフォルトの名無しさん
21/01/03 13:51:43.57 3NmY3eCcd.net
unsigned int a;
for( a = 11; a > 0; a -= 2 ) ...
こんな感じのを作ってしまったことはあったな…
aは1のあと65535になるので永久に終わらず
aは0になる可能性もあるので条件式ではwarningも出ず
415:デフォルトの名無しさん
21/01/03 14:28:17.87 izXBuwpQd.net
>>407
#defineの値によって警告でちゃうから
おせっかいイラネ
416:ビル・ジョブズ
21/01/04 00:09:11.84 V9PboY9+0.net
mallocとか常に成功を返すんじゃない?
問題はそのアドレスに何か操作をした時。
MMUありの前提だけど。
417:デフォルトの名無しさん
21/01/04 00:29:40.79 NWAwlt7F0.net
実行してみないと使えるか分からないとなると
医療関係では使用禁止になるな
418:デフォルトの名無しさん
21/01/04 01:03:06.31 PMQqdXD/0.net
validation 通らないだろうねぇ
419:デフォルトの名無しさん
21/01/04 07:24:09.81 Nz2iXOdN0.net
>>413
メモリーオーバーコミットの話をしたいんだろうけどLinuxとかでも設定によるし>>414の言うように医療やECU等のようにそんなもんが許されない組込系の機器もあるから環境によるとしか言えんわな
420:デフォルトの名無しさん
21/01/05 12:05:40.60 G8BimKKu0.net
宇宙関係も無理やろね
421:デフォルトの名無しさん
21/01/05 12:12:18.79 8w5sr2J0d.net
失敗が絶対に許されないならmallocとか使うな
スタティックで確保しろ
422:デフォルトの名無しさん
21/01/05 13:27:41.97 zIEcR2TW0.net
一つのファイルポインタで読み書きする場合、読みと書きを切り替えるときに
fseek(fp,0,SEEK_CUR)等を挟むことはANSI Cにも書いてるわけですが、
挟まなくていい環境(Linuxとか)もありその実装上の違いってどうなってるんでしょうか?
バッファゼロにしてもfseekが必要なので、バッファリングってわけでもなさそうです。
423:デフォルトの名無しさん
21/01/05 13:36:43.08 sz7Oy+6E0.net
URLリンク(github.com)
ここからwindowsのfseekとlinuxのfseekを見つけ出す
424:はちみつ餃子
21/01/05 14:23:40.55 N7gEH2Zs0.net
C の規格では OS とかの支援のない 「フリースタンディング」な環境にも言及していて、
フリースタンディング処理系は標準ヘッダ
float.h
iso646.h
limits.h
stdarg.h
stdbool.h
stddef.h
stdint.h
の内容に限定した機能が用意されてればよいことになってる。
malloc は stdlib.h だから無くても規格合致フリースタンディング処理系と名乗れる。
425:デフォルトの名無しさん
21/01/05 16:33:30.17 9HicEvTUd.net
>>413
あり得ない
malloc()で==NULLテストして「メモリーが足りません終了します」とかする事はできるが
確保した変数に読み書きした瞬間のエラーは感知する方法がないので
そこでエラーにされてもコアダンプして終了するしかない
ユーザー側から見たら未完成プログラムである
426:デフォルトの名無しさん
21/01/05 16:45:24.18 7nbNqUCud.net
ユーザーからしたら
エラーメッセージを出そうが突然死だろうが
メモリが足りなくなる事自体不完全プログラムだ
エアバッグが作動するときに、
[メモリ不足で動作できませんでした]
なんて表示されても何の意味もない
427:はちみつ餃子
21/01/05 16:47:22.16 N7gEH2Zs0.net
>>422
やっとる (環境も多い) やろがい。
428:デフォルトの名無しさん
21/01/05 17:03:07.78 9HicEvTUd.net
>>423
それなら「エアバッグの数が多すぎるんだな」とか推論できるが
なんのメッセージもなく作動しなかったらユーザーはスピードメーター、ショックセンサー、安全装置などあらゆる関連部分を点検しなければならない
429:デフォルトの名無しさん
21/01/05 18:07:14.87 dzUtU5Ds0.net
そんな事はユーザーからすればどうでもいい
不完全な事にはかわりない
430:デフォルトの名無しさん
21/01/05 18:09:46.84 9HicEvTUd.net
ソフト作ったことない人だねw
メッセージの有無はバグが起きたときの対処に大きな違いがある
431:デフォルトの名無しさん
21/01/05 18:13:12.71 dzUtU5Ds0.net
メッセージの有無なんかよりも
動作するかどうか
の方がはるかに重要
メモリ確保が失敗する可能性があるところで
失敗が許されない動作に対してmallocを使うのが間違い
432:デフォルトの名無しさん
21/01/05 18:15:35.99 dzUtU5Ds0.net
適切なエラー処理をすればそれで十分
ソフト設計者のしたっぱの発想
433:デフォルトの名無しさん
21/01/05 18:35:11.65 zMZuOoIk0.net
>>423
読む人がいないならメッセージも無意味.
434:デフォルトの名無しさん
21/01/05 18:47:10.76 oFYQTpSv0.net
確保できないと返ってくれば対処方法はあるだろう
OK返されたあと、実際に使おうとしたら実はってなると
その分リカバリーが複雑になる
435:デフォルトの名無しさん
21/01/05 19:00:03.87 K71kt7oj0.net
ここの人はOOM Killerも知らんのか?
確保したプロセスが死ぬとは限らんのだが…
URLリンク(reboooot.net)
436:デフォルトの名無しさん
21/01/05 19:39:22.64 eT+iPfAP0.net
確保しようとしてエラーになったなら対処のしようもあるが、空手形乱発していざとなったら
関係ないプロセスが殺されるってのも困ったもんだよな。
初期のOSXはOOM Killerのような仕組みもなくてシステム全体が固まってたな。
437:デフォルトの名無しさん
21/01/05 19:58:11.78 dzUtU5Ds0.net
>>431
1秒後に再度確保?
バカ丸出し
438:デフォルトの名無しさん
21/01/05 20:01:22.72 8cFKE+AV0.net
お行儀よく死ぬ機構があるかどうか
439:デフォルトの名無しさん
21/01/05 21:50:05.77 9HicEvTUd.net
>>428
話が変わってるぞw
論理的に思考できない根本的にプログラマー向きじゃない人だな
>>429
どんな適切なエラー処理をすればいいのか
ご教示願いたいw
440:デフォルトの名無しさん
21/01/05 22:27:33.74 K71kt7oj0.net
>>436
> どんな適切なエラー処理をすればいいのか
ケースバイケース
前提示さずにこんな質問する奴はプログラマーに向いてない
441:デフォルトの名無しさん
21/01/05 23:58:57.29 zD1ciQHW0.net
OOM Killer は、Kubernetes のリソース制限の基本。
Linux のnamespace, cgroup
例外は、
アプリ例外は業務上のエラーだから、アプリで処理すべき。
システム障害などは、アプリで処理できる例外ではない
442:デフォルトの名無しさん
21/01/06 00:01:25.01 WT+BV7/+0.net
その分類上、メモリ確保失敗はアプリで処理すべきなのかどうかわかんなくない?
443:デフォルトの名無しさん
21/01/06 00:46:50.28 g4fxgipO0.net
mallocに失敗したらローカルで確保してみる
それが駄目なら一時ファイル作ってそこに格納する
他にも手はありそうだ
444:デフォルトの名無しさん
21/01/06 01:23:26.66 8o6ePSWp0.net
>>440
ねーよ間抜け
445:デフォルトの名無しさん
21/01/06 03:55:31.45 Sqdcyjlhd.net
>>437
ケースバイケース言いたいだけだったのかw
>>428
new使うだけでmallocされるのにそんな化石みたいなこと言われても
446:デフォルトの名無しさん
21/01/06 05:25:17.33 kVhO/tYW0.net
>>440
> mallocに失敗したらローカルで確保してみる
ローカルが何を意味してるのかわからんがローカル変数のことならはじめからローカル変数で確保しておくべき
447:デフォルトの名無しさん
21/01/06 05:28:43.74 kVhO/tYW0.net
>>442
> ケースバイケース言いたいだけだったのかw
言いたいだけって言うかそれ以外に言いようがないだろw
マジで言ってるならプログラマー失格レベル
448:デフォルトの名無しさん
21/01/06 07:24:13.29 bGGeDo6wM.net
アプリケーション開発しかやったことないのでシビアな状況のプログラムってのがよくわかってないけど
通常のプログラムだったらNULLが帰ってきたら終了だろうね
失敗が許されない環境で、もしメモリを使い果たして確保できないような状況の場合は失敗が許されないのにメモリを使い果たすようなプログラム自身を改善した方が良いような
ファイルから必要なデータだけを読み込むようにして使い終わったメモリは開放するとか
メモリを使い果たして無いのに失敗する可能性とかだったら、標準関数の正常な役割が信用できないという事になるのでプログラム言語自体使えなくなるよね
C/C++だけじゃなくて
それならアセンブラで直接書くしか無くなるのでは
この場合だったら「たらーれば」の言いがかりにしか聞こえないけど
449:はちみつ餃子
21/01/06 09:52:33.41 NVCaEro60.net
そこんところはホスト環境・開発システムがどこまで保証するかという話になるので、
各環境で十分な保証があるなら使えばいいし、保証がないなら使えないというだけのことでは。
私も実態を知ってるわけじゃないが組み込み開発だったら
実際には保証というか自分たちで検証することも多いと思うが。
450:デフォルトの名無しさん
21/01/06 15:10:46.82 6EEBy3Y5d.net
Linux系にはヒープの上限を設定できないの?
よくある入門書にはnewで敵キャラでもエフェクトでも作って動かしましょうみたいなのがよくあるが
それやって消すのを忘れると一日動かしてるとかなりの容量になり突然システムが止まる
懐かしいシングルタスクOSの時代と変わらんw
Win16や32だとローカルヒープは上限があって一杯になってもアプリが止まるだけでシステムは続行できた
451:デフォルトの名無しさん
21/01/06 15:49:09.66 kVhO/tYW0.net
>>447
> Win16や32だとローカルヒープは上限があって一杯になってもアプリが止まるだけでシステムは続行できた
それはプロセス単位の制限だろ、man ulimit でググってこい
OOM Killerとかはシステム全体の話な
452:デフォルトの名無しさん
21/01/06 16:05:04.01 QohpZ5Jnd.net
>>446
Cスレだから組み込み系が話題の中心だと思ってたが
PCのアプリをCで書くなんて人がいまだにいるの?
453:はちみつ餃子
21/01/06 17:27:30.00 NVCaEro60.net
>>449
ロジック部分を C で書くことはもうあまりないかもしれんが、
低レイヤや速度チューニングがなくなるわけではないからなぁ。
コードの総量に C が占める割合は少ないにしても
C が (一部には) 使われているものはまだまだあるんじゃね?
454:デフォルトの名無しさん
21/01/06 17:33:29.06 QohpZ5Jnd.net
アプリの速度チューンならC++で良いと思うんだが
なぜC?
455:デフォルトの名無しさん
21/01/06 18:33:49.31 m3At07SYM.net
>>447
ulimit -d でできるぽいね
456:デフォルトの名無しさん
21/01/06 18:53:37.18 kVhO/tYW0.net
>>449
LinuxのカーネルとかApacheとか未だにC言語は残ってるよ
新規は少なくなっていくだろうけどCOBOLと同様にメンテでは当面使い続けられると思うぞ
457:デフォルトの名無しさん
21/01/06 19:00:16.49 A7AJXFBH0.net
カーネルがmallocで失敗???
システムごと死ぬだろ
458:デフォルトの名無しさん
21/01/06 20:05:41.96 6EEBy3Y5d.net
>>448
だからアホなアプリ一個でシステムが止まるなんて前世紀の話か?と聞いてるんだよね
それともここはシステム関連の話だけか?
mallocの仕組みもしらずにシステムいじろうなんて命知らずの人だねw
>>452
シェルコマンドじゃなくて
このアプリちょっと試してみてよ、と他人に渡した時に行儀よくできるような言語自体のオプションはないものかな
mallopt()が近いみたいだけど英語ドキュメントしかないや
459:デフォルトの名無しさん
21/01/06 20:50:30.31 kVhO/tYW0.net
>>455
> だからアホなアプリ一個でシステムが止まるなんて前世紀の話か?と聞いてるんだよね
だから OOM Killer でググってこいよ
システムを止めるかどうかは設定によるし、Windows でもメモリー逼迫したら不安定になるから
> シェルコマンドじゃなくて
URLリンク(linuxjm.osdn.jp)
そもそもシェルから設定できるのにプログラムから設定できないわけ無いだろ
プログラマーの素養なさ過ぎ
460:デフォルトの名無しさん
21/01/06 20:52:54.12 3ZsNazx6d.net
C言語なんだから無条件でPC前提にするのやめようぜ
461:デフォルトの名無しさん
21/01/06 20:58:31.92 3ZsNazx6d.net
Windowsでも
プロセスとスレッドのプライオリティを上げて
メモリを大量に使えば
スワップしまくって激重になって
事実上システムが死ぬけどね
462:デフォルトの名無しさん
21/01/06 20:59:44.32 3ZsNazx6d.net
アプリ1個でシステムダウンさせるのはそれほど難しくない
463:
21/01/06 21:09:38.92 yUU4KxYw0.net
>>459
さすがにそれは不可能では?win3.1 ならまだわかるのですが‥‥
464:デフォルトの名無しさん
21/01/06 21:12:39.72 3ZsNazx6d.net
プライオリティの高いスレッドをたくさん作って無限ループすれば死ぬ
465:デフォルトの名無しさん
21/01/06 21:17:12.89 3ZsNazx6d.net
プライオリティ31のスレッドを論理コア数分作ればマウスカーソルも止まる
466:デフォルトの名無しさん
21/01/06 22:06:17.54 FKs+KUNY0.net
間違えてforkしまくるスクリプト実行してしまって何もできなくなった
467:デフォルトの名無しさん
21/01/06 22:06:21.76 6EEBy3Y5d.net
いや別に知恵を絞って無理に止める話はしてないじゃんw
うっかりミス程度で止まったらおそろしいなあ気楽にプログラミングもできないなあって話
468:デフォルトの名無しさん
21/01/06 22:38:40.29 g4fxgipO0.net
うっかりシステムをフォーマットしてしまうこともあるしな
469:デフォルトの名無しさん
21/01/07 00:44:03.16 Vx7SD3qO0.net
うっかりプライオリティの高いスレッドをいっぱい作っちゃった場合の話