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
うっかりプライオリティの高いスレッドをいっぱい作っちゃった場合の話
470:デフォルトの名無しさん
21/01/07 02:16:41.45 yeIMGQh50.net
何の話してたか忘れた
471:デフォルトの名無しさん
21/01/07 15:11:57.86 9QJGSme00.net
mallocを使っていても総使用量の最大は見積もっとけって話
472:デフォルトの名無しさん
21/01/07 16:20:03.10 DL1zbij8d.net
総使用量に対してメモリが十分あっても
フラグメントで確保出来ないかもしれない
473:デフォルトの名無しさん
21/01/07 17:22:12.04 6v7F/BUW0.net
malloc をラップして
オレオレアローケーターで一括で確保して使いまわそうとすると
malloc の実装とほとんど変わらんよな?って気分になる
474:デフォルトの名無しさん
21/01/07 17:32:32.97 DL1zbij8d.net
固定長が多ければ専用化の価値が大きい
475:デフォルトの名無しさん
21/01/07 17:50:56.57 9QJGSme00.net
>>469
malloc実装してみな
フラグメントなんてどんな程度の問題かわかるから
476:デフォルトの名無しさん
21/01/07 19:23:46.37 jTCzKEfy0.net
とあるスコープ内だけで有効なヒープで、さらにスコープから抜けると開放したい
という用途でがんばった
477:デフォルトの名無しさん
21/01/07 20:07:04.52 b6arBunA0.net
何十日何百日稼働するソフトならそれなりに効いてきそうだけど<フラグメント
478:
21/01/07 20:08:45.38 gAnZzjje0.net
>>473
alloca()
479:デフォルトの名無しさん
21/01/07 20:19:01.01 jTCzKEfy0.net
>>475
ほしかったがなかったのだ
480:
21/01/07 21:26:54.87 gAnZzjje0.net
>>476
C にはデストラクタがないから、C の範囲で実現するのは困難ですね
alloca() の実装は、ライブラリだけでは処理できずにコンパイラ側の支援が必要だと思いますので、標準ライブラリには入りにくいでしょうね
481:デフォルトの名無しさん
21/01/07 21:43:59.65 jTCzKEfy0.net
>>477
longjmp は対象外とし
完全自動は諦めてスコープの外に回収関数を置く紳士協定で手打ちに
482:デフォルトの名無しさん
21/01/08 00:02:52.02 RWydUoCr0.net
>>472
フラグメントで確保出来ない事があったわけだけど
483:デフォルトの名無しさん
21/01/08 00:51:10.08 aEO+ezsE0.net
使ってるアロケータの実装が何なのか, とどう使っているか示さないと何の意味もない
K&R mallocに毛が生えた程度のmalloc (Tronとか)ならものすごい勢いで断片化するし
glibc mallocとかのbest fitアロケータを使う分には断片化はかなり起こりにくい
あとメモリリークじゃないことは間違いないんだよね?
484:デフォルトの名無しさん
21/01/08 05:16:18.16 gKD5AY0L0.net
>>479
>>388を再度問う
485:デフォルトの名無しさん
21/01/08 08:53:26.45 /42fFLGad.net
C言語スレなのに組み込みやったことないヤツばっかりってのが不思議
>>480
アロケータの実装次第で断片化がおこる
と自分で書いてるわけだ
それが答え
どんな優れたアルゴリズムでも
断片化はおこるんだけど
完全に未来が予測出来る神アルゴリズムでも
486:デフォルトの名無しさん
21/01/08 09:11:57.78 yPaAOWPid.net
Go/C/C++以外に直接システムコールしてる言語ってありますか?
487:デフォルトの名無しさん
21/01/08 09:18:29.89 /42fFLGad.net
アセンブラ
488:デフォルトの名無しさん
21/01/08 09:37:02.14 MUX0m4u5M.net
c/c++もアセンブラ使わないとシステムコール呼べないけどな
489:デフォルトの名無しさん
21/01/08 12:03:05.57 lqJPJl/10.net
CALL 5 が使える言語は全部大丈夫
490:デフォルトの名無しさん
21/01/08 12:52:43.97 0DW9z0rLM.net
>>486
call 5って何のこと?
491:はちみつ餃子
21/01/08 14:24:17.01 PuoTeu6a0.net
>>477
VLA があれば alloca は要らん。
上限が見積もれないときはいずれにしても使うべきではないが……。
492:デフォルトの名無しさん
21/01/08 14:34:20.89 NkKDsd1u0.net
CALL 5ってシステムコール一般の事を指してるのかな?
CALL 5はCP/Mから引き継いだMS-DOSのファンクションコールか
ふつうMS-DOSはINT 21Hって内部割り込みつかってたけどCALL 5もできたそうな
493:デフォルトの名無しさん
21/01/08 15:15:28.39 /42fFLGad.net
直接システムコール
の定義によってはどの言語でも出来るし
定義によってはどの言語でも出来ない
質問者は定義を明確に
494:
21/01/08 19:43:55.15 cUApPko30.net
>>488
でも VLA は C++ では非推奨でしょう?
というか C であっても VLA の格納位置がスタックなら、それこそ悪意を持つクラッカに格好の餌をやっているとしか思えません‥
C99 or later では「VLA の確保場所をスタック禁止でヒープとする」という縛りはあるのでしょうか?
495:
21/01/08 21:47:27.82 cUApPko30.net
>>491,448,477
いろいろ調べたところ、私が間違っていることがわかりました、つまり alloca() はスタックに配列を確保する実装とのことだそうです
つまり alloca() は setjmp/longjmp と同じ「C で記述できない」関数ということになりますね‥‥
496:デフォルトの名無しさん
21/01/08 22:26:35.55 gKD5AY0L0.net
だからこそ標準に組み入れられているんだよ
非標準でどうしろと言うのか考えろ
497:デフォルトの名無しさん
21/01/09 13:37:23.88 lvRTpcj70.net
アセンブラで作ったサブルーチンをそうとは知らずに呼べるのはCの良いところ
498:デフォルトの名無しさん
21/01/09 14:13:13.77 wanRtpand.net
それだけならC++でも
499:デフォルトの名無しさん
21/01/09 16:16:23.92 fHVxD+CU0.net
知らずに呼べるって、それアセンブラ側でC呼び出し規約で書いてあげたからじゃね。
500:デフォルトの名無しさん
21/01/09 16:42:31.78 lvRTpcj70.net
ABIちゅーもんがあってだな
501:デフォルトの名無しさん
21/01/09 17:00:45.39 fHVxD+CU0.net
だからそう言ってる。Pascal規約で書けばPascalから呼べたり。
502:デフォルトの名無しさん
21/01/09 17:08:25.76 L3ZBilIB0.net
フルアセンブラなら
パラメーターの渡し方は自由
独自のスタック構造だろうが
レジスタだろうが
臨機応変に出来る
今時フルアセンブラなんて事は非常に稀で
C/C++の呼び出し規約に従うのが普通
というだけ
503:デフォルトの名無しさん
21/01/09 17:10:33.54 L3ZBilIB0.net
今でも超小規模マイコンだと関数コールの構造をとらないフルアセンブラコードを使う事がある
504:デフォルトの名無しさん
21/01/09 17:52:11.58 lvRTpcj70.net
__declspec(naked)とか__attribute__((naked))とか
505:デフォルトの名無しさん
21/01/09 18:48:02.08 fHVxD+CU0.net
それexternで宣言できないから、アセンブラで書いたルーチンを呼ぶためのものじゃなくて
従来アセンブラを使わないと書けなかったルーチンをCのインラインアセンブラで書くためのものじゃね?
506:デフォルトの名無しさん
21/01/09 19:47:19.13 gjIQ6YZR0.net
純粋なC言語プロジェクトとして作るより
C++プロジェクトとして作ってCコードを書いた方が
利用可能なライブラリが増えるしほぼ上位互換、という考えは合ってる?
507:デフォルトの名無しさん
21/01/09 19:51:04.00 Z+DmrKyh0.net
>>503
それ多分C++コードだと思う
508:デフォルトの名無しさん
21/01/09 20:16:57.05 kPw1IBO30.net
>>494
それができない言語の方が珍しいと思うけど?
509:デフォルトの名無しさん
21/01/09 20:17:11.62 OS8QkCVT0.net
C++のベターC的な使い方であってpureなCとうまく連結できるかというと…
510:デフォルトの名無しさん
21/01/09 20:18:36.46 kPw1IBO30.net
>>503
合ってる、いわゆるベターCって奴
511:デフォルトの名無しさん
21/01/09 21:18:21.63 lvRTpcj70.net
DLLなんかどこの馬の骨言語/コンパイラ/アセンブラで作られたかもわからんものを当たり前に使えるだろ
512:デフォルトの名無しさん
21/01/09 22:58:21.36 L3ZBilIB0.net
それはDLLで呼べるように作ってあるからであって
513:デフォルトの名無しさん
21/01/09 23:00:18.51 L3ZBilIB0.net
別にCの特徴でもない
514:デフォルトの名無しさん
21/01/09 23:45:25.11 kPw1IBO30.net
大抵の言語はDLLを呼び出す側になれるけど、呼ばれる側になれる言語はそんなにない
515:デフォルトの名無しさん
21/01/09 23:52:15.63 lvRTpcj70.net
普通にCでDLL書くぞ
516:デフォルトの名無しさん
21/01/10 16:59:27.49 97ZwT7Zl0.net
言語はOSに依存している。
517:デフォルトの名無しさん
21/01/10 17:02:58.26 N5z3vzVP0.net
OSのない非常にチープな環境でも動くのがCの特徴
例えばRAM 16バイト、ROM 256命令みたいな糞CPUでも動く
リッチな環境ならCなんか使わん
518:デフォルトの名無しさん
21/01/10 17:07:41.53 rshCbxDT0.net
>>514
> 例えばRAM 16バイト、ROM 256命令みたいな糞CPUでも動く
具体例plz.
519:デフォルトの名無しさん
21/01/10 17:12:34.41 N5z3vzVP0.net
PIC10F200
520:デフォルトの名無しさん
21/01/10 17:29:30.48 rshCbxDT0.net
>>516
ありがと、一応コンパイラもあるのね
521:デフォルトの名無しさん
21/01/11 04:19:33.81 aEPvAJq60.net
そんくらいならCよりアセンブラの方が楽そうだけど
522:デフォルトの名無しさん
21/01/11 09:26:06.49 yw8V+8is0.net
この規模でもアセンブラの方が楽って事はない
当然性能やリソースに問題がないならCの方が楽
楽をしたいなんて考える人が選ぶCPUではないけど
523:はちみつ餃子
21/01/11 09:57:05.78 MiJ5pxpq0.net
PIC は CPU なのか?
と思ってデータシートを見たら RISC CPU って書いてあったわ。
524:デフォルトの名無しさん
21/01/11 10:16:28.83 RSMcM3e30.net
>>518
まあさすがにROM 256だとCで書くのはあまり現実的じゃないわな
525:デフォルトの名無しさん
21/01/11 10:28:09.66 dLrb5ZQk0.net
>>519
コンパイラが相当なじゃじゃ馬だと
調教する(というか、こっちがされるw)のに
結構な手間暇かかったりするんだよ
526:デフォルトの名無しさん
21/01/11 12:12:48.66 yw8V+8is0.net
>>522
PIC(というか8bit全般)は
命令やアーキテクチャがじゃじゃ馬
Cのじゃじゃ馬とは比べ物にならん
開発環境構築はCもアセンブラもかわらん
527:デフォルトの名無しさん
21/01/11 12:23:14.39 dLrb5ZQk0.net
Cのじゃじゃ馬を調教するにも結局アセンブラを理解する必要があるからな
アセンブラのじゃじゃ馬だけで済むならそっちの方が楽だろ
528:デフォルトの名無しさん
21/01/11 12:30:40.51 4UZaL5drd.net
アセンブラを理解する必要なんて無いよ
529:デフォルトの名無しさん
21/01/11 12:34:47.00 dLrb5ZQk0.net
あるよ
Cに対するよくある誤解で、
アセンブラから逃げるためのものではなく
アセンブラもわかる人が手抜きするためのものだ
そもそもアセンブラで書かれていたUnicsを書き直すために作られたツールだしな
530:デフォルトの名無しさん
21/01/11 12:37:16.69 4UZaL5drd.net
>>526
いつの時代の人?
531:デフォルトの名無しさん
21/01/11 12:37:56.75 4UZaL5drd.net
楽かどうか
から話が変わってるし
532:デフォルトの名無しさん
21/01/11 12:54:40.32 RSMcM3e30.net
256程度に収まるコードならアセンブラでもそんなに苦労しないと思うよ
533:デフォルトの名無しさん
21/01/11 13:03:17.58 4UZaL5drd.net
でもアセンブラの方が楽
って事はない
534:デフォルトの名無しさん
21/01/11 13:04:29.37 yw8V+8is0.net
そもそも楽をしたいならこんな糞CPUをわざわざ選ばない
535:デフォルトの名無しさん
21/01/11 13:31:51.18 COmzXB920.net
Cコンパイラの吐き出す最適化済みのコードを人力でできればよいのだが なかなか ね
536:デフォルトの名無しさん
21/01/11 14:40:26.73 dLrb5ZQk0.net
CはISO/IEC規格で「こうでなければならない」という決まりがあるが
アセンブラにそんなものはない
初めて触るCPUは多かれ少なかれ、それまでに蓄積した偏見に逆らうところがあり
あんまり迂闊にじゃじゃ馬呼ばわりすると他の人や未来の自分にアホにされる
たとえばPICならPICが向かない用途にPICを使おうとしたり
その逆をやらかすやつは気をつけたほうがいい
537:デフォルトの名無しさん
21/01/11 14:55:18.12 yw8V+8is0.net
要するにCのが楽
538:デフォルトの名無しさん
21/01/11 18:03:00.86 T9p+a0He0.net
>>500
関数コール構造ってスタックか?
539:デフォルトの名無しさん
21/01/11 19:17:14.19 3OtB0f6U0.net
組み込みだとデバッグしやすいようにサブルーチンの引数はグローバル領域に置くとか
リターンアドレスも同じようにグローバルに置くとかあったな。
540:デフォルトの名無しさん
21/01/11 19:22:32.27 exQc5JPEM.net
呼出規約
URLリンク(ja.wikipedia.org)
541:デフォルトの名無しさん
21/01/11 21:38:48.2
542:5 ID:dLrb5ZQk0.net
543:デフォルトの名無しさん
21/01/11 22:18:26.34 3OtB0f6U0.net
COBOLみたいな高級言語の話じゃねーよw
544:デフォルトの名無しさん
21/01/12 15:17:22.63 XXwzvzv60.net
標準ヘッダファイルの関数の実際の処理コードってどこに書いてあるんですか?
ぼく「rand関数ってどんな処理すんの?」
無能教科書「stlib.hに書いてあるだよ^^」
ぼく「ほーんstlib.hはWindowsだとここのフォルダに置いてあるのか」カチカチ
ぼく「Visual Studioで開く」
ぼく「ってプロトタイプ宣言やんけ!本体の場所は?」
って感じで困惑してるんですががが?
545:デフォルトの名無しさん
21/01/12 15:20:38.53 aoRXfngS0.net
特にコレといった決まりはないので ランタイムライブラリのソースがあればラッキー程度
546:デフォルトの名無しさん
21/01/12 15:21:37.16 XXwzvzv60.net
ていせい
X stlib
O stdlib
547:デフォルトの名無しさん
21/01/12 15:24:49.50 aoRXfngS0.net
<Program Files>/Microsoft Platform SDK/src/crt
にあればラッキー
548:デフォルトの名無しさん
21/01/12 15:45:13.34 XXwzvzv60.net
>>543
たぶん自分の環境だと
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\
VC\Tools\MSVC\14.28.29333\crt\src
って奴なのだろう。
stdlib.cはなかったですね・・・
549:デフォルトの名無しさん
21/01/12 15:49:14.18 aoRXfngS0.net
>>544
関数で小分けになってたりで rand.c があったりなかったり
550:デフォルトの名無しさん
21/01/12 16:02:39.24 XXwzvzv60.net
ないですね・・・(絶望)
一端諦めたほうがよさそうかな・・・
aoRXfngS0さんは付き合ってくれてホントありがとう!感謝!
551:デフォルトの名無しさん
21/01/12 16:35:19.21 aoRXfngS0.net
どういう風に実現してるの? ならば ソースあたるしかないけど
どんな処理(機能)なの? ならば ヘルプなり man ページなり 色々あたれる
552:デフォルトの名無しさん
21/01/12 17:24:10.27 3icaK3oM0.net
ヘルプは嘘書いてたりな
いままでヘルプのいう通りある関数のフラグ書いてきたのに、ソースみたら全部無視されてたって経験が
553:デフォルトの名無しさん
21/01/12 18:07:45.16 GYcPzbFp0.net
クソMicrosoftの使うからだ。
554:デフォルトの名無しさん
21/01/12 20:21:16.28 ZB1xpZCm0.net
c/Program Files (x86)/Windows Kits/10/Source/10.0.10240.0/ucrt/stdlib/rand.cpp
c/Program Files (x86)/Windows Kits/10/Source/10.0.16299.0/ucrt/stdlib/rand.cpp
c/Program Files (x86)/Windows Kits/10/Source/10.0.17134.0/ucrt/stdlib/rand.cpp
c/Program Files (x86)/Windows Kits/10/Source/10.0.17763.0/ucrt/stdlib/rand.cpp
555:イリヤは俺の嫁
21/01/12 23:06:47.42 XXwzvzv60.net
ありがとう!
早速試してみますね
556:デフォルトの名無しさん
21/01/13 01:30:22.66 uZRkh4HP0.net
Visual Studio は、プリコンパイル済みヘッダーだろ。
pch.h (旧 stdafx.h)
もうビルド済み
557:デフォルトの名無しさん
21/01/13 06:12:29.66 CAw2lvTg0.net
afxって文言を削りたかったのねw
558:デフォルトの名無しさん
21/01/13 11:46:14.48 vx4ASjNc0.net
大体知りたいことが分かりました!
皆さんありがとうございます!
559:デフォルトの名無しさん
21/01/14 18:11:57.43 ZgCcmsal0.net
ヘルプとかマニュアルの嘘は多い
最初から疑うべき
特に日本語のやつ
560:デフォルトの名無しさん
21/01/15 07:50:56.36 FigS/mOA0.net
昔デジタルマニュアル内のサンプルソース確認してくれってわたされたやつが、
I -> 1 みたいなやつや、全角文字使われてたとか
入力ミスのサンプル集かと思った。
561:デフォルトの名無しさん
21/01/17 08:50:40.04 j2J8OKt50.net
いかにもな機械翻訳で、英訳しながら読まないと意味わかんないのとかね
562:デフォルトの名無しさん
21/01/17 10:23:01.71 j2J8OKt50.net
JIS X3010, JIS X3014どちらももうじき20年遅れ
563:デフォルトの名無しさん
21/01/19 09:32:50.28 eNVxWvb9a.net
>>514
メモリ16Gの超リッチなLinux環境で使ってすいません。
564:デフォルトの名無しさん
21/01/19 12:02:21.59 Uy0+fZqKd.net
16Gで超リッチとは何と安上りなんだ
565:デフォルトの名無しさん
21/01/20 03:33:05.19 h5t/8l7N0.net
16GBのPCを個人所有してたら超リッチ
って話じゃないぞ
566:デフォルトの名無しさん
21/01/20 08:00:15.22 6vEnElCe0.net
で、どういう話なの?
567:はちみつ餃子
21/01/20 11:53:21.26 2wFV5REW0.net
C で書かれたコードを実行するにはリッチって話っしょ
568:デフォルトの名無しさん
21/01/20 17:49:36.27 6B9ftBiM0.net
void *p=malloc(1024*1024*1024*16);
569:デフォルトの名無しさん
21/01/20 17:55:29.77 HhPa7Y4p0.net
>>564
int型が32bitの環境ならその整数の乗算部分でオーバーフローが起きて16GBにならないんでないかな
570:デフォルトの名無しさん
21/01/20 20:34:38.74 6vEnElCe0.net
>>563
意味わからん
LinuxはC言語で書いたプログラム専用じゃないし4.8PiBのメモリーを持つ富岳でもLinuxは動くし
571:デフォルトの名無しさん
21/01/20 20:48:15.35 h5t/8l7N0.net
おまえバカだろ
RAM 16バイトの底辺CPUに比べて超リッチな環境だって話
572:デフォルトの名無しさん
21/01/20 22:02:18.04 6vEnElCe0.net
バカはお前w
それは単に比べる相手がおかしいだけだろ
573:デフォルトの名無しさん
21/01/21 00:28:31.26 MGeCCcUA0.net
GUIが無いんだろ、最強じゃんw
574:デフォルトの名無しさん
21/01/21 06:10:52.98 gXoiSngNH.net
C「を」書いたのはリッチー
575:デフォルトの名無しさん
21/01/21 07:07:18.10 zKx4b76A0.net
A「おれ財布に16円しかない」
B「おれ今16万円も入ってるよ超リッチ」
>>566「16万円で超リッチとは何て安上がりなんだ」
>>566「ビル・ゲイツの財布には16億円入ってる」
A「???」
B「???」
A「誰?」
B「何で突然ビル・ゲイツ?」
A「いや、おれの財布に16円しか入ってないって話を...」
>>566「それは単に比べる相手がおかしいだけだろ」
A,B「???」
576:デフォルトの名無しさん
21/01/21 07:12:03.65 rjSQv0Wq0.net
>>571
それどう見ても「個人所有してたら超リッチ」って話だろ…
>>561は一体何を言いたかったんだ?
577:デフォルトの名無しさん
21/01/21 07:31:52.93 zKx4b76A0.net
開発ターゲットの話
578:デフォルトの名無しさん
21/01/21 08:08:33.69 rjSQv0Wq0.net
>>573
だからターゲットもチープな組込みからスパコンまであるだろ
限定なしに超リッチとか言われても井の中の蛙が語ってるとしか思えん
579:デフォルトの名無しさん
21/01/21 08:12:32.96 zKx4b76A0.net
>>574
>>571
580:デフォルトの名無しさん
21/01/21 08:38:58.68 rjSQv0Wq0.net
>>575
だからそう言うのは井の中でやれよって話
581:デフォルトの名無しさん
21/01/21 12:02:22.51 NDHJTNIed.net
流れも理解せずに話に勝手に入って来て
何を言ってるんだか
582:デフォルトの名無しさん
21/01/21 12:34:13.57 8rFkGfvd0.net
ここは胃の中です
583:デフォルトの名無しさん
21/01/21 13:14:18.23 hceb9QsBa.net
頭はプアです
584:デフォルトの名無しさん
21/01/21 13:40:44.42 xengUv2k0.net
もう引っ張ることでも無いやろ
585:デフォルトの名無しさん
21/01/21 13:54:25.02 rjSQv0Wq0.net
勝手に入ってこられるのが嫌ならブログででもやってろよw
バカすぎる
586:デフォルトの名無しさん
21/01/21 22:19:55.22 Z9MWAls10.net
>>570
エデ・イー?
587:デフォルトの名無しさん
21/01/22 12:29:52.09 pJ+Dy7HCF.net
最近のOSってmallocで実メモリ足りないときはHDD/SSDからとってきてくれるんでしょう?
588:デフォルトの名無しさん
21/01/22 12:44:10.92 MTKvFG+KM.net
仮想記憶のことなら全然違うし、全然最近でもないし、swapも埋まればmalloc失敗すると思うけど、何だろう
589:デフォルトの名無しさん
21/01/22 12:50:00.55 3IahkNr8M.net
仮想アドレス空間に隙間がなければ失敗するけどな
590:デフォルトの名無しさん
21/01/22 13:07:46.80 /3jYtxszd.net
>>584
いや
全然違うってこともない
イメージ的にはそれでいい
591:デフォルトの名無しさん
21/01/22 14:43:34.68 Pa9c7HBM0.net
スタック領域もコード領域も足りなくなったら補助記憶装置にスワップアウトするしmallocとは直接関係はしないよ
592:デフォルトの名無しさん
21/01/22 14:52:58.55 B/3A9QDar.net
コードがスワップアウトしたら実行中のプロセスはどうなるんでしょうか?
593:はちみつ餃子
21/01/22 14:59:09.88 gbaM/AZn0.net
コード領域までスワップアウトすることがあるかどうかわからんけど、
あったとしたらタイムスライスの割り当てが戻ってきたときにその退避してたコードも
メモリに戻すことになるだけでしょ。
594:デフォルトの名無しさん
21/01/22 15:03:45.51 /3jYtxszd.net
>>587
mallocと直接関係ある
なんて誰も書いてない
595:デフォルトの名無しさん
21/01/22 15:07:21.69 /3jYtxszd.net
>>588
アクセスした瞬間に例外発生
これを受けてHDD/SSDに退避してあったデータをメインメモリに戻して例外を復帰する
コードデータ関係なく
596:デフォルトの名無しさん
21/01/22 15:18:29.37 Pa9c7HBM0.net
>>590
>>583を100回音読してこい
597:デフォルトの名無しさん
21/01/22 15:22:19.21 /3jYtxszd.net
主語はOS
598:デフォルトの名無しさん
21/01/22 15:25:32.00 /3jYtxszd.net
mallocは単なるトリガー(の1例)
599:デフォルトの名無しさん
21/01/22 16:21:31.38 Pa9c7HBM0.net
主語でないと関係しないって?
日本語の勉強からやり直した方がいいと思うよ
結構マジで
600:デフォルトの名無しさん
21/01/22 16:28:50.78 /3jYtxszd.net
非制限用法
601:デフォルトの名無しさん
21/01/22 16:30:53.38 /3jYtxszd.net
直接関係してなかろうと
(例えば)mallocをトリガーとしてスワップすることは事実
602:デフォルトの名無しさん
21/01/22 19:42:10.12 Pa9c7HBM0.net
>>596
頭大丈夫?
そろそろ黙ったほうが良くね?
603:デフォルトの名無しさん
21/01/22 20:55:52.26 red8nkhVM.net
確かに直接関係はしないな
syscallというレイヤーが挟まるから
で?それがどうした?
604:デフォルトの名無しさん
21/01/22 22:55:39.06 Pa9c7HBM0.net
>>597
> (例えば)mallocをトリガーとしてスワップすることは事実
するとは限らんしそもそも仮想記憶のない環境もあるし何が事実だかw
605:デフォルトの名無しさん
21/01/22 23:26:46.95 LtnZZu+T0.net
mallocがスワップアウト要求すんのか? ページアウトですらなく?
606:デフォルトの名無しさん
21/01/23 00:33:31.85 MUxSQoqh0.net
mallocは常に成功する、問題はそのメモリにアクセスした時
607:デフォルトの名無しさん
21/01/23 00:37:30.76 QrEIYEWsM.net
Cでマルチスレッドなプログラム書くときのデザインパターンというか、オススメの書き方って何かある?
608:デフォルトの名無しさん
21/01/23 00:40:17.93 MUxSQoqh0.net
>>603
pthread