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
609:
21/01/23 00:47:46.15 JHWvmAOA0.net
>>603
私は c++11 以降に移行しました、言語が MT をサポしてくれているのはありがたいです‥
610:デフォルトの名無しさん
21/01/23 03:11:07.99 WU8kpFS10.net
>>600
mallocをコールした結果スワップすることがあるのは事実
611:デフォルトの名無しさん
21/01/23 03:12:25.03 WU8kpFS10.net
pthreadやc++11がデザインパターン?
612:デフォルトの名無しさん
21/01/23 07:30:28.10 4VL29Q1J0.net
>>606
>>602
613:デフォルトの名無しさん
21/01/23 08:27:23.59 WU8kpFS10.net
>>602
それは実装次第
614:デフォルトの名無しさん
21/01/23 08:43:07.74 4VL29Q1J0.net
>>609
だから>>583の様に言い切る奴はアホだ
って話でしょ
615:デフォルトの名無しさん
21/01/23 08:50:59.97 pbmfU4sr0.net
>>602
どんな実装でも仮想アドレスに連続領域が確保できなかったらmalloc呼び出し時点で失敗するんじゃないの?
616:デフォルトの名無しさん
21/01/23 09:44:47.82 MUxSQoqh0.net
>>611
実際にアクセスする時には仮想連続領域があるかもしれないじゃん
617:デフォルトの名無しさん
21/01/23 09:45:23.82 MUxSQoqh0.net
んで、そんな時こそのスワップですよw
618:デフォルトの名無しさん
21/01/23 10:27:22.67 4VL29Q1J0.net
>>611
オーバーレイで仮想空間を拡大する実装かもしれんw
オーバーヘッドがでかすぎるしそもそも今時の環境でそこまでする必要があるとは思えないけど
>>612-612
仮想アドレスと物理アドレスの区別ついてる?
619:デフォルトの名無しさん
21/01/23 10:29:19.13 MUxSQoqh0.net
>>614
バカなの?
620:デフォルトの名無しさん
21/01/23 10:31:56.75 MUxSQoqh0.net
>>611
とりあえず割り当てちゃうんだよ
621:デフォルトの名無しさん
21/01/23 10:36:34.75 MUxSQoqh0.net
アプリとかプログラムのcodeだって全部メモリ上にロードされてないからな、アクセスした時に、あっそこにはプログラム無いから今からロードするわ~、って感じだから
622:デフォルトの名無しさん
21/01/23 12:00:13.95 4VL29Q1J0.net
>>615
ネタに突っ込んでるのか、仮想アドレスも理解できてないことを指摘されて悔しいのかをはっきりさせてくれw
623:デフォルトの名無しさん
21/01/23 12:08:04.07 sAz3YI3ta.net
>>616
仮想アドレスに連続した空き領域が足りないのに、とりあえずで何を割り当てるんだよ
624:デフォルトの名無しさん
21/01/23 12:15:26.28 X7rXBKGs0.net
メモリーマップトファイルでペタバイトの巨大なプログラムを実行するんだい
625:デフォルトの名無しさん
21/01/23 12:55:57.12 pbmfU4sr0.net
>>614
俺にレス?なんか間違ってるか?
626:デフォルトの名無しさん
21/01/23 12:57:17.63 pbmfU4sr0.net
>>621
おっと612か。すまんかった
627:デフォルトの名無しさん
21/01/23 15:00:04.42 E2XTqnevd.net
>>610
言いきってるように見える?
おれには初心者が「大体こんな感じ?」って言っただけにしか見えないんだけど
意味的には大体合ってるのに
全然違う
とか
最近のOSとしか書いてないんだし
技術的な話をしたいならせめてOSを特定しようよ
勝手に特定のOSを前提にした視野が狭い人みたいだから
628:デフォルトの名無しさん
21/01/23 15:27:34.50 4VL29Q1J0.net
>>623
ああ、>>583が言い切ってるは言い過ぎだな
その後の>>586がアホだって言い直すわ
629:デフォルトの名無しさん
21/01/23 15:31:32.55 E2XTqnevd.net
いやどう見ても>>584がアホ
630:デフォルトの名無しさん
21/01/23 16:34:32.36 LPDMRZtK0.net
スワップファイルが満杯でmallocが失敗なんて状況に陥る前に対策するだろjk
631:デフォルトの名無しさん
21/01/23 16:57:50.33 5Na5U87Z0.net
linux って簡単に process 殺すよね
知らんふりも得意
632:デフォルトの名無しさん
21/01/23 18:17:32.24 4VL29Q1J0.net
>>625
アホと言うなら具体的にどこがアホって書かないと恥ずかしいだけだぞ
一応ここ技術板だし
633:619
21/01/24 15:57:31.34 5JJAlISZ0.net
>>619
64bit時代に仮想アドレスに連続した空き領域が無くなることなんか現実に無いだろ
634:デフォルトの名無しさん
21/01/24 16:53:19.15 0zbFdmBp0.net
>>629
それなら>>616の時点でそう書けばいいだろう。まあC言語の用途を考えれば後付けで64bitに限った話にしようとするのは馬鹿げているが。
で、>>616のとりあえずって結局何だったの?
635:デフォルトの名無しさん
21/01/24 17:27:58.38 5JJAlISZ0.net
>>630
常に成功を返す
636:デフォルトの名無しさん
21/01/24 17:35:27.66 1wsdfsyQ0.net
実際にアクセスしたときにページフォルト起こしてページを割り当てるとして、そのアドレスに
連続した空きがない状態じゃメモリ割り当てても使えないじゃん。
637:デフォルトの名無しさん
21/01/24 22:06:29.57 5JJAlISZ0.net
>>632
日本語が変だぞw
638:デフォルトの名無しさん
21/01/24 22:09:51.26 5JJAlISZ0.net
PFでメモリ割り当てられなきゃ、リスケジューリングだアホ
639:デフォルトの名無しさん
21/01/24 22:14:36.76 1wsdfsyQ0.net
割り当てられたとしても使えないと言っているんだが?それとも既に他で使われている領域を上書きするか?
640:デフォルトの名無しさん
21/01/24 22:18:58.47 5JJAlISZ0.net
>>635
4Kページ割り当てて使えないって何なんだよ・・
641:デフォルトの名無しさん
21/01/24 22:24:12.86 1wsdfsyQ0.net
アドレスに連続した空きがない状態だよ。最初からその話をしてるんだろ?
642:デフォルトの名無しさん
21/01/24 22:28:07.43 5JJAlISZ0.net
>>637
4K+1byte目をアクセスしたらまたPFだから、MMUの勉強したら?
643:デフォルトの名無しさん
21/01/24 22:41:44.60 1wsdfsyQ0.net
その4Kの中に要求するサイズの連続領域が取れない場合の話だよ。
いったいなにを「とりあえず」割り当てるんだか。
644:デフォルトの名無しさん
21/01/24 23:52:48.21 5uhuun5ZK.net
ページングの話とmallocの領域管理の話がごっちゃになってるな
ページアウトされた領域に空きがあるかどうかはページインしなきゃわからないかもしれないが、そしたら他のページを探しに行くだけ
最終的にどこにも空きがなけりゃmallocがエラーを返す
空き容量が十分あっても希望するサイズの連続領域がないなんてケースは実際にもあり得る
645:デフォルトの名無しさん
21/01/25 00:08:13.28 U3eoM7Fp0.net
仮想アドレスなんだから使う時まで要らないんだから、mallocは必ず成功する。
昨今のOSは全てそう実装されてる。
646:デフォルトの名無しさん
21/01/25 00:11:52.23 WuLpUwZU0.net
オーバーブッキングを平気でするホテルみたいだな
647:デフォルトの名無しさん
21/01/25 01:00:15.57 8MmNCL2s0.net
>>641
バカ?
648:デフォルトの名無しさん
21/01/25 01:17:43.98 U3eoM7Fp0.net
iOSのreusableCellの取得も必ず成功するからforce unwrapできるし
649:デフォルトの名無しさん
21/01/25 07:05:04.38 HugL0xWrM.net
>>641
仮想アドレスを使わないOSもあるんだが
まあ安易に「全て」とか使ってるからレス乞食なんだろうな
650:デフォルトの名無しさん
21/01/25 08:02:50.43 dmbNtT1m0.net
>>641
勉強しろと言った本人が理解していないのが丸わかり。
使う時まで要らないのは物理メモリであってmallocの時点で仮想アドレスは割り当てなきゃならん。
もし仮想アドレスに空きがなけりゃ「とりあえず割り当てる」なんてのも無理。
651:デフォルトの名無しさん
21/01/25 09:02:02.61 +X0AlmLXK.net
実際「mallocは常に成功する」とか根拠なく信じ込んでる奴にはシステム開発は任せられんよ
あとで痛い目みる
652:デフォルトの名無しさん
21/01/25 10:01:03.33 NuAiBZ6D0.net
>mallocは常に成功する
Win98SEで失敗したしたことあるわ。
653:デフォルトの名無しさん
21/01/25 10:44:35.68 MIcmX8A+0.net
ハードがMMUで物理的に管理するメモリ上限とか、OSが管理する上限とか、論理上いつか確保出来ない状況は絶対来るの分かっているけれど、そこでエラー起こされると打つ手がない(思い付かない)から、そのまま落ちてもらう。
俺が知らないだけで、良い回避方法とかあるのかな?
654:はちみつ餃子
21/01/25 11:32:21.69 ktS6mGMX0.net
>>649
・ オーバーコミット機能はオフにする
・ malloc (等) がエラーを返すかチェックを怠らない
・ 終了処理にどうしても必要なメモリは事前に確保しておいて他に使わない
655:デフォルトの名無しさん
21/01/26 07:53:24.98 ZI8ZD6Xld.net
非常用のメモリを取っとくのは
大昔から当たり前の手法だね
656:デフォルトの名無しさん
21/01/26 09:07:24.49 7OslGgb50.net
mallocを信じて生きていけばいいさと 君は叫んだだろう
657:はちみつ餃子
21/01/26 10:29:56.18 xZCVqJnF0.net
>>652
URLリンク(www.youtube.com)
658:デフォルトの名無しさん
21/01/26 11:06:15.63 CnGywsMw0.net
メモリ不足だと表示して終了しちゃいかんのか?
659:はちみつ餃子
21/01/26 11:51:32.15 xZCVqJnF0.net
>>654
それでいい状況ならそれでいいんだよ。
それじゃ駄目なときの話をしてる。
660:デフォルトの名無しさん
21/01/26 12:18:24.13 nusF9BATd.net
車を運転してたら
「メモリ不足です」と表示されてブレーキが効かなくなった
冷蔵庫が「メモリ不足です」と表示されて止まっていた
ああメモリ不足ならしょうがない
って思う人いるかな?
661:デフォルトの名無しさん
21/01/26 12:24:58.20 qqWW8hOx0.net
航空機搭載システムなんかは動的メモリ割り当て自体を禁止してるそうな
でもアルゴリズムによっては動的メモリ割り当てが本質的なこともあるだろうし
事前割り当てしたところで、自前でmymallocを実装するってだけな気はするし
ミッションクリティカルなアプリがどうやってるかはちゃんと調べないと判らんね
662:デフォルトの名無しさん
21/01/26 12:29:47.88 nusF9BATd.net
航空機なんて特別な例を出さなくても
身の回りの電気製品でソフト要因のエラーが許される物なんてなかなか無いような気がする
663:デフォルトの名無しさん
21/01/26 12:41:48.87 Ab88y5Cj0.net
>>657
オーバーフローは危険なのでスタックの使用も禁止します
664:デフォルトの名無しさん
21/01/26 12:49:59.07 nusF9BATd.net
条件を満たせは静的解析でスタック使用量はわかる
整数型はオーバーフローして危険だから禁止
665:はちみつ餃子
21/01/26 13:32:22.24 xZCVqJnF0.net
そういえば何の事例だったかでループも禁止 (停止性の証明が難しいので) とかいうのは聞いたことがあるな。
666:デフォルトの名無しさん
21/01/26 13:33:43.60 cSn18yXwM.net
>>659
再帰禁止とか組み込みなら珍しくないぞ
667:デフォルトの名無しさん
21/01/26 14:31:35.84 46etcFxHd.net
>>661
ループ禁止でコードを組める気がしないのだが
処理したらCPUリセットするの?
ループ以外に何か禁止な条件があるはず
668:デフォルトの名無しさん
21/01/26 14:35:21.22 46etcFxHd.net
ヒープ禁止は普通にある
禁止というかそもそもヒープ用にメモリが無いとか
設計方針でヒープモジュールを搭載しないとか
あとは確保オンリーなヒープってのもある
PICとかだとハード的に再帰が難しいとか
669:デフォルトの名無しさん
21/01/26 21:31:25.38 INqgRhQd0.net
JALの航空管制制御のプログラム作ったことあるけど、
1ルーチンコードサイズ4KBまでIBM3090アセンブラ
ループ処理などなく、また呼ばれる
可愛い平さん元気かなぁ・・
670:デフォルトの名無しさん
21/01/26 21:32:25.57 INqgRhQd0.net
手塚さんとかも綺麗だったな・・おれまだ学生だったw
671:
21/01/26 23:53:23.00 uzBXnria0.net
>>653
コード進行が凄い曲ですね‥‥ギターコードが書いている楽譜ってないですかね?
672:デフォルトの名無しさん
21/01/27 00:01:47.99 fhlKtwwY0.net
上の空で書いていたのか
673:デフォルトの名無しさん
21/01/27 07:49:16.31 or8n1kaA0.net
8/16bit時代のハードみたいに起動時にメモリサイズやエラーチェックしてワークエリアサイズ固定で設計するだけだわな。
そういやぁある記事で80286って工業用途を想定してて、エラーが発生して停止したら電源入れ直す以外に再起動できないとか言ってたな。
674:デフォルトの名無しさん
21/01/27 07:52:13.49 MIG3AZ730.net
>>665
ルーチンの呼び元はループ、もしくはループ相当の動きをしてるわけだよね
ループがなければ無限のサイズのコードじゃ無い限り動き続けるのは不可能じゃ?
675:デフォルトの名無しさん
21/01/27 07:59:19.27 MIG3AZ730.net
>>667
非常に簡単なのしか使ってないんで耳コピ簡単じゃ?
676:デフォルトの名無しさん
21/01/27 10:55:52.75 9MA4/mbB0.net
>656
>「メモリ不足です」と表示されてブレーキが効かなくなった
上級国民が大喜びな仕様だな。
メモリ不足になるような仕様を避けるのが当然で、
それでも起きるなら安全に停止できる機能を搭載するだろ。
とりあえず電源喪失状態でもブレーき利くようにするとか。
そういやぁどっかの列車で安全装置の故障で自動停車されなくて事故ったってのあって、
安全装置からの信号がONになった時にブレーキが作動するって仕様になってたのを
安全装置からの信号が来なくなったら(ずっと信号ONって不具合もかあるだろうから通信のやり取りでもあるのかな)
ブレーキ作動させるようになったって聞いたわ。
677:デフォルトの名無しさん
21/01/27 11:34:46.40 cJSBZXf90.net
>>667
Monacaの田中秀和って好き?
678:デフォルトの名無しさん
21/01/27 12:05:51.10 isvLWJ6Q0.net
>>656
飯塚会長なら言いそうだ
679:デフォルトの名無しさん
21/01/27 12:09:55.82 cJSBZXf90.net
>>662
組み込みが再帰禁止なのは
スタック段数が少な過ぎるからじゃないんですか
>>659 と同じことを言ってるだけと思いますが
680:デフォルトの名無しさん
21/01/27 12:12:51.81 cJSBZXf90.net
>>663
常にHALT+割り込みのみで書かれたものはあったはず
681:デフォルトの名無しさん
21/01/27 12:27:46.11 gQSND64l0.net
>>675
その理由もあるけどスタックの見積がやりにくいからという理由もある
>>661に類似だけど停止条件トチッたら容易にスタック食いつぶすし
682:デフォルトの名無しさん
21/01/27 13:33:58.28 vpj9vmrAd.net
>>662
貧乏マイコンは数段程度しかないから関数の中で関数呼ぶのすら危うかったりするな…
高級マイコンは16段の見たことあるが
683:デフォルトの名無しさん
21/01/27 13:57:29.31 DAR3YVvc0.net
HALTと割り込みでもいつかはどこかで最初からの繰り返しループにならない?
割り込み中でステート管理して、スタックを操作して最初に戻るとか?
出来ないマイコンもありそうだけど
684:デフォルトの名無しさん
21/01/27 14:01:16.93 N60gZ7990.net
そういう制御込みでコンパイルして吐き出してくれるなら Cの選択肢もあるだろうけど
それが期待できないとなると アセンブラしかない ってことになるのかな
685:デフォルトの名無しさん
21/01/27 17:35:31.51 6jCnxoTKd.net
>>678
PICでしょ
一番安いヤツはハードウェアスタック2段
686:デフォルトの名無しさん
21/01/27 17:36:57.11 6jCnxoTKd.net
>>679
手段は色々あっても
ループはループ
と思う
687:デフォルトの名無しさん
21/01/27 20:45:42.53 gQSND64l0.net
>>679
まあどこかでループは必要だわな
>>661はそういうループはきっちり検証して個々の処理ルーチンではループ禁止っていう話かと
688:デフォルトの名無しさん
21/01/27 23:07:06.58 7vi5L3Y30.net
初心者です
変数に&を付けてメモリのアドレスを表示させるプログラムを実行して(0x7efe61e298d8←こんな感じ?)
その後1時間とか経過して別のプログラムでメモリ「0x7efe61e298d8」に格納されたものを表示させることってできるんですかね?
689:デフォルトの名無しさん
21/01/27 23:11:59.94 fhlKtwwY0.net
OSが何かにもよるけど
一般論としては出来る。出来るが、
成功するかどうかは分からない
690:デフォルトの名無しさん
21/01/27 23:34:48.42 XppLd9do0.net
MS-DOSのTSRか
691:デフォルトの名無しさん
21/01/27 23:52:57.86 7vi5L3Y30.net
C言語というよりOS側の問題なんですね
ありがとうございます
692:デフォルトの名無しさん
21/01/28 05:11:34.57 52TUUvk80.net
>>681
それ、スタックを使って構造化プログラミングを実現した言語であるCを使う利点が一切ないような…
組み込み/マイコン向け言語でスタックを使わず構造化プログラミングを実現するにはcpsスタイルの言語がベストなはず、lisp方言schemeにはそれ向けのサブセット仕様もあるし、ホビー界隈ではそこそこ使われてる模様
(但し主なpc向け実装は、アーキテクチャに合ったスタックによるcps実装が多い、念のため)
forthも消えてしまったなあ
C換算百行未満でブートストラップ&セルフホスト処理系が書け、OS機能も兼ね、規格にあるライブラリ関数も改変無しコピペで動く移植性の良さ
c台頭までは組み込み/マイコン界隈を寡占してたんだが
ちゃんとスタック指向&構造化言語だけど、ハードウェアスタックに頼らないので相性がよい
唯一の敗因はlisp以上に深淵なことだな…
cは既に国際語になってしまったので、取り敢えず分かるcで書く、ってのがcが使われる唯一の理由だと思う
693:デフォルトの名無しさん
21/01/28 05:58:13.87 pfPCg+P40.net
動的確保なしの32ビットマイコン使って飯食ってるけど、さすがに再起は使わんが、
好きなだけ関数呼び出し深く出来るだけでも恵まれてたんだな。スタックオーバーフローは一応気にしないといかんけど。
ミッションクリティカルなコードなんてゼッテー無理だわw Adaとか使われるんだっけ?と思ったら微妙に廃れ気味なんね。よーしらんけど。
694:デフォルトの名無しさん
21/01/28 08:01:19.64 Z02UUfjqK.net
>>684
たぶん意味がない。
今時のOSでは、別々のプログラムからメモリ「0x7efe61e298d8」を参照しても同じ内容にならない。「仮想アドレス」でぐぐれ。
プログラム間で変数をやりとりしたければ、共有メモリを使う方法がある。