[過去ログ] C言語なら俺に聞け 151 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
362(1): (トンモー MM93-qoXq) 2019/05/04(土)14:47 ID:tOD9kuurM(2/2)調 AAS
>>361
トヨタ系の研究所には
Cの分かる研究員がもういないのです
研究には全く支障がないです
組込みやってる高卒やFランが
Cをやるべきでしょ?
363: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/04(土)14:55 ID:7fnHNdb20(2/7)調 AAS
>>362
それは多分ありえない話でしょうね、なぜならば C は計算機言語の基本で、各種書籍ではアルゴリズムの記述に C を使うものが大半ですから
本も読めない人がトヨタの研究者とか、あなたの空想の話なのでは?
364(1): (ワッチョイ 7fe9-3iRC) 2019/05/04(土)15:22 ID:Yh80Q70x0(2/3)調 AAS
アルゴリズムの勉強はpythonがいいよ
365(2): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/04(土)15:25 ID:7fnHNdb20(3/7)調 AAS
>>364
python で二分木の実装とかできますか?
366(1): (ワッチョイ 7fe9-3iRC) 2019/05/04(土)16:05 ID:Yh80Q70x0(3/3)調 AAS
>>365
できますん
367: (トンモー MM93-qoXq) 2019/05/04(土)16:07 ID:LvYM7SOrM(1)調 AAS
>>365
そんなのはFランの仕事でしょ?
368: (ワッチョイ bb87-ahOC) 2019/05/04(土)16:13 ID:8Q7/PMC20(1/2)調 AAS
論文の次はFランか、哀れだなw
369: (ワッチョイ 6752-ahOC) 2019/05/04(土)16:49 ID:vXlxEQ1E0(2/2)調 AAS
やっぱり相当コンプレックスの塊で頭悪いんだろうなぁ
370(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/04(土)18:28 ID:7fnHNdb20(4/7)調 AAS
>>366
本当ですか?ポインタがない python では無理なんじゃないですか!?
371: (アウアウウー Sabb-vI8p) 2019/05/04(土)18:39 ID:yT0QTmUja(2/2)調 AAS
pythonって参照ないの?
372(1): (アウアウエー Sa3a-3iRC) 2019/05/04(土)18:43 ID:gINSNBZZa(1)調 AAS
真面目に言うとpythonは基本的に全部参照渡しだね。
参照したものを直接いじれるかというとそうでない場合があるけども。
373: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/04(土)19:05 ID:7fnHNdb20(5/7)調 AAS
>>372
なるほど、ではユーザー定義の型は自動的に参照扱い、すなわち Java みたいなかんじなんですね
であれば苦労すれば二分木を実装できますね、大変失礼いたしました
374(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 4e3e-Cg3z) 2019/05/04(土)19:18 ID:21Of2ELD0(1/2)調 AAS
>>370
Python に限らず動的型の言語の多くは変数に値を入れるんじゃなくて、
オブジェクトと変数の間に束縛 (bind) を作ることで成り立ってる。
辿ることでオブジェクトを参照するんだ。 実質的にポインタだよ。 むしろポインタしかない。
(小さい値 (小さい数値とか文字とか) はアロケーションを抑制するためにそのまま
ワードに突っ込むような最適化をする言語 (処理系) もあるけども。)
375(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/04(土)20:22 ID:7fnHNdb20(6/7)調 AAS
>>374
Java ならば boxing でヒープにとる値とスタックに取る値とをある程度(意識せずに)変換できますね(そういう C/C++ like な意識が皆無ではない、という意味)
ただし、二分木に関してはいいたいことがまだあって、「本物の」二分木は二重ポインタ(ポインタのポインタ)が必要なのではないか?と思っています
さすがに Java には二重ポインタはない、そんな用途の言語じゃない
Python や ruby にはあるのでしょうか?
376(1): (アウアウエー Sa3a-3iRC) 2019/05/04(土)20:55 ID:cZ5M6KFWa(1/3)調 AAS
二重ポインタを何に使う?
Cだと引数でノードのオブジェクトを返す辺りか?
377(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/04(土)21:01 ID:7fnHNdb20(7/7)調 AAS
>>376
ノードを追加する関数add の引数を
add(&root, Object)
ってするでしょ?&root ってことは、struct *node のアドレス、すなわち struct node ** が必要なのではないかと
378(3): (アウアウエー Sa3a-3iRC) 2019/05/04(土)21:43 ID:cZ5M6KFWa(2/3)調 AAS
>>377
わからんが、Cでも戻り値でポインタを返せばいいんじゃないか?
379: はちみつ餃子◆8X2XSCHEME (ワッチョイ 4e3e-Cg3z) 2019/05/04(土)21:46 ID:21Of2ELD0(2/2)調 AAS
>>375
参照を持つオブジェクトへの参照を持てるんだから、事実上の二重ポインタとして使えるよ。
380(1): (ワッチョイ bb87-ahOC) 2019/05/04(土)21:57 ID:8Q7/PMC20(2/2)調 AAS
二重までは使うんだよなあ
三重をなぜ使わないか、説明できるか?w
381: (ワッチョイ d701-o1CB) 2019/05/04(土)22:09 ID:RtDHzLy60(1)調 AAS
ガベージコレクションと裸のポインタって相性が悪いような
382: (ワッチョイ e201-VrjD) 2019/05/04(土)22:15 ID:eVIwB2YR0(2/2)調 AAS
>>378
2個返したい時とか、戻り値は成功かどうかのコードを返したいとか
383: (アウアウエー Sa3a-3iRC) 2019/05/04(土)23:07 ID:cZ5M6KFWa(3/3)調 AAS
道はいろいろあると思うが、せっかくあるんだから構造体使って皆くるんじゃえと思うよ。
384: (アウアウウー Sabb-vI8p) 2019/05/05(日)00:20 ID:nwgMKC8Ra(1)調 AAS
微妙にスレチのように思うので続きはJava初心者のスレでやった方が良いのではないか?
まあ人に聞かなくても Java を勉強して Java の API のソースを読めばそういうのをどうしているのかは何れわかると思うけどね。
385(1): (ワッチョイ e22c-4xtZ) 2019/05/05(日)00:21 ID:tvdtPjB+0(1)調 AAS
Ruby での、Jaggy 配列は、
ary = [ ] # 配列の配列
ary.push [ "a" ]
ary.push [ 1, 2 ]
p ary #=> [["a"], [1, 2]]
C/C++ 以外のたいていの言語では、数字などのprimitive 以外は、すべて参照。
(primitiveは参照にするよりも、その場所へ値を埋め込んだ方が速い)
外側の配列は、内側の配列の参照を持っている。
内側の配列は、(primitive以外の)各要素の参照を持っている
primitive以外は、コピーしても参照がコピーされるだけで、値はコピーされない。
つまり、同一インスタンスを指す。
別のインスタンスは作られない
new されていなければ、インスタンスは作られない。
代入しただけでは、参照がコピーされるだけ
これを、shallow copy (浅いコピー)と呼ぶ(同一インスタンス)。
new して、別のインスタンスを作ることを、deep copy (深いコピー)と呼ぶ(別のインスタンス)
386: (ワッチョイ 8252-M0pk) 2019/05/05(日)00:37 ID:RPhfdkos0(1/2)調 AAS
>>385
馬鹿は消えろ
387(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)08:54 ID:3EWrT4Pn0(1/22)調 AAS
>>378
それは無駄な代入が発生するでしょう?
388(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)09:01 ID:3EWrT4Pn0(2/22)調 AAS
>>380
余裕で三重ポインタなどほいほいと使いますよ
2chスレ:tech
void prep_exe(char *sttp, char **path, char ***argv)
char **argv を使うことが理解できるのだったら「argv のアドレスを渡す」みたいな場合に渡された関数側では三重ポインタを使うことになるでしょう
389(1): (ワッチョイ 9b6d-ahOC) 2019/05/05(日)09:04 ID:hoO1o10+0(1)調 AAS
>>388
それcodepadだろ? 使いさえすればいいって話じゃなくて
390: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)09:08 ID:3EWrT4Pn0(3/22)調 AAS
>>389
無論使いさえすればいい、というわけではなく、この例では小さなシェルを実装しており、シェルのパイプ機能を実装するのに三重ポインタを使ったのです
391(1): (ワッチョイ 7fe9-3iRC) 2019/05/05(日)09:21 ID:2T/oydys0(1/15)調 AAS
>>387
引数を介すと代入が減るってこと?
392(2): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)09:47 ID:3EWrT4Pn0(4/22)調 AAS
>>391
代入命令が増えるという意味ではなく、「同じ値」なのに代入してしまう、という作業が >>378「戻り値でポインタを返」す方式の書き方だと不可避です
393(13): (ワッチョイ f701-EPtf) 2019/05/05(日)10:05 ID:bV6goPu10(1/7)調 AAS
呼び出しの前後で、ptrの値が 同じかもしれない、場合よっては変わるかもしれない関数
ptr = func1(ptr, opt); と func2(&ptr, opt);
うーんどっちも使うな…
394(1): (ワッチョイ 7fe9-3iRC) 2019/05/05(日)10:28 ID:2T/oydys0(2/15)調 AAS
>>392
じゃあ、一時変数に代入しとけば?
395: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)10:29 ID:3EWrT4Pn0(5/22)調 AAS
>>393
前者
>ptr = func1(ptr, opt);
は初心者用で、>>392 のいう無駄な代入が含まれています、二重ポインタがわかるのなら後者にするべきです
396(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)10:30 ID:3EWrT4Pn0(6/22)調 AAS
>>394
シンプルな記述ができるのに、わざと複雑な書き方にするのは問題なのでは?
397(1): (ワッチョイ 7fe9-3iRC) 2019/05/05(日)10:32 ID:2T/oydys0(3/15)調 AAS
>>396
じゃあ、戻り値そのまま使えば?
mallocは使うんでしょ?
398(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)10:33 ID:3EWrT4Pn0(7/22)調 AAS
>>397
その場合無駄な代入が発生しますね、>>393 がいい例を示しています
399(1): (ワッチョイ f701-EPtf) 2019/05/05(日)10:35 ID:bV6goPu10(2/7)調 AAS
エラー伝達に NULL を使う realloc は即代入するとお漏らししちゃうし
あれ、なん引数書き戻しにしなかったんだろう? 素朴な疑問
400(1): (ワッチョイ 7fe9-3iRC) 2019/05/05(日)10:35 ID:2T/oydys0(4/15)調 AAS
>>398
代入されているのかされていないのか、わからない方が良いってこと?
401: (ワッチョイ f701-EPtf) 2019/05/05(日)10:36 ID:bV6goPu10(3/7)調 AAS
×あれ、なん引数書き戻しに
○あれ、なんで引数書き戻しに
402: (ワッチョイ 7fe9-3iRC) 2019/05/05(日)10:41 ID:2T/oydys0(5/15)調 AAS
>>399
正直、nullが来た時点で終わってるしなあ…。
まあでも一時変数使うのが筋だと思いますよ。戻り値でも引数でも同じこと。
403(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)11:25 ID:3EWrT4Pn0(8/22)調 AAS
>>400
ちがいます
代入するのか代入しないのかは malloc() したかしなかったかにかかっています。
代入は malloc() したとききだけにすればよく それが >>393 の func2(&ptr, opt); の書き方
一方 >>393 ptr = func1(ptr, opt); は malloc() したかしないかにかかわらず代入を行います、これは無駄な代入を含みます
404(1): (ワッチョイ 7fe9-3iRC) 2019/05/05(日)11:31 ID:2T/oydys0(6/15)調 AAS
>>403
だから、関数の内部的に何してるのかわからんのが良いってことじゃない?
405(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)11:37 ID:3EWrT4Pn0(9/22)調 AAS
>>404
着目点はそこにはありません。関数による記述で内部を隠蔽するのが目的ではありません
問題は、malloc() したときだけ代入し、malloc() しなかったときには代入しない、という記述を正確にかけるかどうか…?、にかかっており
>>393 ptr = func1(ptr, opt); は?を記述できる可能性が皆無、一方
>>393 func2(&ptr, opt); は?を記述できる可能性がある、というわけです
406(1): (スプッッ Sd22-ph/v) 2019/05/05(日)11:38 ID:orE8GGyod(1)調 AAS
>>393
前者の方が好ましい
2重ポインタなんて最適化の妨げになるものは、それしか使えない場面でのみ使うべき
407(4): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)11:44 ID:3EWrT4Pn0(10/22)調 AAS
>>406
非常に大きな二分木(ノートが1億個)があって、そのはるか先端で malloc() してそこで代入すればいいだけなのに、
その先端から root に戻ってくる途中の30箇所ほどで、軒並み全部のノードで「必要のない無駄な代入」をするのですか?
>それしか使えない場面でのみ使うべき
この二分木を実装する、というのがまさしく「それしか使えない場面」なのですよ
408(1): (ワッチョイ 7fe9-3iRC) 2019/05/05(日)11:45 ID:2T/oydys0(7/15)調 AAS
>>405
つまり、後者でmallocしてnullが返った時はそれを代入するってことですか?同じじゃん。
409(1): (ワッチョイ 7fe9-3iRC) 2019/05/05(日)11:47 ID:2T/oydys0(8/15)調 AAS
>>407
二分木のコストってのは比較であって代入じゃないと思いますよ。
まあアルゴリズムの一般論としては。
410(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)11:53 ID:3EWrT4Pn0(11/22)調 AAS
>>408
>>393 func2(&ptr, opt); では
malloc() して null が返ってきたときは、例えば何もしない、ということはできますね
でも >>393 ptr = func1(ptr, opt);
は、malloc() しようがしまいが代入してしまいますね、これは「やる必要のない無駄な代入」が含まれることになり、好ましくないです
>>393 ptr = func1(ptr, opt); の記述法は二分木を最初に習うときに、この記述法で理解を促すという意味では有用であっても、
いつまでもこれで書いているようでは進歩していない、もっといえば怠惰である、と考えています
411(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)11:55 ID:3EWrT4Pn0(12/22)調 AAS
>>409
しかし無駄な代入を放置してよいというわけではないでしょうね、削れるところは削るべきです
単純二分木よりさらに改良された平衡二分木(AVL木、赤黒木等)を紹介する書籍では、最初から >>393 func2(&ptr, opt); で記述されていますよ
412(1): (ワッチョイ 7fe9-3iRC) 2019/05/05(日)11:57 ID:2T/oydys0(9/15)調 AAS
>>410
じゃあ隠蔽しろという話なんじゃないの?
関数の中で成功失敗を判定して外にnullは返すな入力時のままにしとけ、という関数。
413(1): (ワッチョイ 7fe9-3iRC) 2019/05/05(日)11:58 ID:2T/oydys0(10/15)調 AAS
>>411
代入回数比較してよ。頼むよ。
414(2): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)12:05 ID:3EWrT4Pn0(13/22)調 AAS
>>412
ちがいますね
問題は、malloc() したときだけ代入し、malloc() しなかったときには代入しない、という記述を正確にかけるかどうか…?、にかかっています。
>>413
>>407 に書いておきました、1億ノードの二分木にて各ノードが最適に配置されているとして、削ることのできる代入は malloc() 一回に対して 30 個の代入になります
>>393 ptr = func1(ptr, opt); では 1億ノードの二分木にノードを追加する際、30個の無駄な代入が発生します
代入のコストは大したことがない、にしても、アルゴリズムを正確に記述できないのは問題ですね
洗練された記述とはそういうものではないでしょうか
415(1): (ワッチョイ 7fe9-3iRC) 2019/05/05(日)12:48 ID:2T/oydys0(11/15)調 AAS
>>414
いや、mallocがnull返した時はいれないんでしょ?
成功か失敗かじゃないの?呼んだかどうかじゃなくて。
416: (ワッチョイ 7fe9-3iRC) 2019/05/05(日)12:52 ID:2T/oydys0(12/15)調 AAS
仕事では戻り値に成功失敗が入ってオブジェクトのポインタは引数に来るような関数は使うけどさ、
結局どっちもチェックするよ。信じられねえもんな。
417(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)13:12 ID:3EWrT4Pn0(14/22)調 AAS
>>415
malloc() が成功したか失敗したかは、今の話には関係ありません
今関係があるのは、
malloc() したときだけ代入し、malloc() しなかったときには代入しない、という記述を正確にかけるかどうか…?
です
418(1): (ワッチョイ 7fe9-3iRC) 2019/05/05(日)13:42 ID:2T/oydys0(13/15)調 AAS
>>417
じゃあ、絶対代入するってことだろうよ。
引数に渡したポインタに。ポインタを。
419(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)13:51 ID:3EWrT4Pn0(15/22)調 AAS
>>418
malloc() したときは代入しますよ、でも malloc() しないときは代入なんかせず、そのまま呼び出し元に返るだけです
それが>>393 ptr = func1(ptr, opt); 方式と絶対的に違うのです
420(1): (ワッチョイ 7fe9-3iRC) 2019/05/05(日)13:55 ID:2T/oydys0(14/15)調 AAS
>>419
戻り値はvoidってこと?
421(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)14:02 ID:3EWrT4Pn0(16/22)調 AAS
>>420
>>393 func2(&ptr, opt); 式なら void もありえます
422(1): (ワッチョイ 7fe9-3iRC) 2019/05/05(日)14:08 ID:2T/oydys0(15/15)調 AAS
>>421
いや、必須なのでは?
423(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)14:11 ID:3EWrT4Pn0(17/22)調 AAS
>>422
いいえ、実際に実装するならば、エラーを伝達する手段として返り値を準備することは大いにありえるでしょうね
void が必須ではありません
必要な代入なら使えばいい、でも
>>393 ptr = func1(ptr, opt);
方式は不必要な代入があり、単に二重ポインタを使用して記述すればこれは除去できるので、
>>393 ptr = func1(ptr, opt);
を書くのは問題だし、これを書く人は頭を使っていない、と判断します
424(1): (ワッチョイ f701-EPtf) 2019/05/05(日)14:33 ID:bV6goPu10(4/7)調 AAS
異常は戻りをNULLにするパティーンで
node_t *func3(node_t**, ...)
正常だった場合に ptr = func3(&ptr, opt); と書けるしw (無駄な努力の可能性
425: (ワッチョイ f701-EPtf) 2019/05/05(日)14:34 ID:bV6goPu10(5/7)調 AAS
って書いたけど鼻から悪魔踏みそうな嫌らしさがあるな…
426: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)15:03 ID:3EWrT4Pn0(18/22)調 AAS
>>424
そのパターンでは、異常値 NULL をうっかりノードに登録してしまうと、そのノードより下が浮いてしまい危ないですね、ま、異常系をミスったままリリースしてしまうことも私はよくやりますけど
427(1): (アウアウカー Sa47-3iRC) 2019/05/05(日)15:42 ID:8x8syc+Fa(1)調 AAS
>>423
いや、必須でしょ?代入消せるんだから。消さないと。
428: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)17:54 ID:3EWrT4Pn0(19/22)調 AAS
>>427
言葉尻を捕らえて攻めたつもりになっているようですね
「すべての代入を消去できる」なんていってませんよね
>>393 ptr = func1(ptr, opt);
この代入は不要な代入を含むので、
>>393 ptr = func1(ptr, opt);
は不適当な書き方だ、とこれまで首尾一貫して述べているのです
429: (ワッチョイ f701-EPtf) 2019/05/05(日)18:13 ID:bV6goPu10(6/7)調 AAS
423の文意は
「void が必須なわけではなく
引数と同じ型のポインタを戻すことはせずに、別の目的の何か、たとえばエラーコードとして int を戻す
なんてのはアリでしょ?」
ってことだと思うけど
430(1): (アウアウエー Sa3a-3iRC) 2019/05/05(日)18:42 ID:dOx23ziba(1)調 AAS
returnしちゃだめでしょ
代入が駄目ってくらいだから
431: (ワッチョイ f701-EPtf) 2019/05/05(日)18:56 ID:bV6goPu10(7/7)調 AAS
「代入不要なケースでも代入記述を要求するのはよろしくない」スタイルの延長だと
戻り値評価も破棄可能ならそうすべき って話か
432: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)19:00 ID:3EWrT4Pn0(20/22)調 AAS
>>430
どんな代入もだめだとは主張していませんね…
>>393 ptr = func1(ptr, opt);
方式は不必要な代入があり、単に二重ポインタを使用して記述すればこれは除去できるので、
>>393 ptr = func1(ptr, opt);
の代入が駄目だとはいってきていますけれども
433: はちみつ餃子◆8X2XSCHEME (ワッチョイ 4e3e-Cg3z) 2019/05/05(日)19:03 ID:TxpPZKKr0(1/5)調 AAS
>>407
434(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 4e3e-Cg3z) 2019/05/05(日)19:13 ID:TxpPZKKr0(2/5)調 AAS
あ、ごめん、ミスって文章を書く前に投稿してもうた。
>>407
あらためて確認するが、この代入を「無駄」としているのはアルゴリズムの表現の上では不要なことをしているという
意味の上での無駄であって、性能上の無駄という意味ではないんだね?
そして、アルゴリズムを正しく表現する上では (ときには二重・三重のも含めて) ポインタが必要だと。
435(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)20:16 ID:3EWrT4Pn0(21/22)調 AAS
>>434
>性能上の無駄という意味ではないんだね?
性能の上で分析するとなると、間接参照にてデータをロード、ストアするコストと値をストアするコストを天秤にかける、ことになりますね
なるほど、その点を言いたくて、でも言いたくなくて、しつこく絡んでいたのですか…
私は二重ポインタでの表現の方がトータルでお得だ、とは思ってはいますが、これまで表に出ている私の発言は、あえてそこには踏み込まず(だって性能の話はうかつに断言できませんからね…)、
おっしゃるとおり「アルゴリズムの表現の上では不要なことをしている」に留まっています
436(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 4e3e-Cg3z) 2019/05/05(日)20:57 ID:TxpPZKKr0(3/5)調 AAS
>>435
たとえば数学上の表記なら「A=1 であり B=1 のとき A=B は真である」と「1=1 は真である」には何も差が無い。
途中で名前を付けるのは人間に対する便宜であって、無駄な「操作」は存在しない。
代入が無駄たりうるのは C のパラダイムだからなので、
「C で表現するにはポインタが必要だし、代入では不適当だ」は事実であっても
「ポインタが無い言語では表現できない」というわけではないよ。
C の低級な世界でまともな意味論を表現しようとするのがそもそもの間違いだろう。
437(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)21:02 ID:3EWrT4Pn0(22/22)調 AAS
>>436
>「ポインタが無い言語では表現できない」というわけではないよ。
それは理解しています、なぜなら
Java での二分木の実装を検討したことがある(探せば2ch過去ログにあるかもしれません)
Java にはポインタはありませんが、実装できるかできないか、といえば「できる」の方に入りますね
438: はちみつ餃子◆8X2XSCHEME (ワッチョイ 4e3e-Cg3z) 2019/05/05(日)21:54 ID:TxpPZKKr0(4/5)調 AAS
>>437
そこまでわかっているのなら、
「代入しない」と「同じ値を代入しなおす」が意味論的に等しいということがどうしてわからないんだ。
439(3): (ワッチョイ 2f05-S4IJ) 2019/05/05(日)23:34 ID:RXFRr1FQ0(1/4)調 AAS
C言語のプログラム内で確保していいメモリってユーザー空間の仮想メモリ上限いっぱいまで取っていいの?
複数の変数a, b, c, ・・・の値を表示するだけのプログラムを時系列に並べて考えてみるんだけど
0. 実行ファイルを起動する
1. 32bitプロセスが生成される ←たとえば32bit windowsだとユーザー空間とカーネル空間で計4GBの仮想メモリが確保される
2. int a; ←仮想メモリ(1で確保されたユーザー空間)上にaが確保される
int b; ←上に類似
int c; ←上に類似
・・・・・(複数の変数の宣言やprintf関数が続く)
こんな感じなんだろうけど
上記の2でユーザー空間いっぱいになるまで変数を宣言してもいいの?
440(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 4e3e-Cg3z) 2019/05/05(日)23:38 ID:TxpPZKKr0(5/5)調 AAS
>>439
いいけど、もっと効率的な方法があるならそれに越したことは無いっていうそれだけの話
441(1): (ワッチョイ 2f05-S4IJ) 2019/05/05(日)23:41 ID:RXFRr1FQ0(2/4)調 AAS
簡潔に書くと
安全のためにはどこまでメモリを使っていいの?
そのメモリの大きさはユーザー空間の上限と同じなの?
という室問なのに長くなってしまた
442(1): (ワッチョイ 2f05-S4IJ) 2019/05/05(日)23:47 ID:RXFRr1FQ0(3/4)調 AAS
>>440
ありがとう
ただ初心者なので効率性を目指すにはきつい部分が出てくる
そうなるとメモリの残量を監視する、つまり残量の値を取得する必要があるわけだけど
これは一般的にはwindowsのAPIを使うのが普通なの?
(そんなものがあるのかは知らない)
443: (ワッチョイ 8252-M0pk) 2019/05/05(日)23:52 ID:RPhfdkos0(2/2)調 AAS
>>442
スタックとヒープという概念は知ってる?知らなければまずそれを調べてみて。
それと、初心者なら効率を求める前に正しくメモリ管理を扱えるようになる必要があるが、その時点で残量は気にする必要はないぞ。
444(1): (ワッチョイ 2f05-S4IJ) 2019/05/05(日)23:59 ID:RXFRr1FQ0(4/4)調 AAS
FIFOだとかナントカ程度にしか。
「〜〜領域」という幾つかの用語がOSとかの環境が違っても
全く共通のものなのかよく分からないから正直スルーしてる
445(1): (ワッチョイ e22c-4xtZ) 2019/05/06(月)05:38 ID:wr9bFPpT0(1)調 AAS
>>414
>1億ノードの二分木にノードを追加する際、30個の無駄な代入が発生します
2^10 = 約1,000 千
2^20 = 約1,000,000 百万
2^30 = 約1,000,000,000 十億
>>441
Java VM の初期値は、256MB とか。
それよりも大きいと強制終了されるが、起動時に、512MBに設定できる
たぶん、4GB の仮想メモリでも、ユーザー空間3GB・カーネル空間1GBぐらいだろ
それ以上のデータは、動画みたいにstream になる。
バッファサイズ、例えば、1MB を読んでは捨てて、次の1MB読んでは捨てて、の繰り返し
読み込んだデータを使ったら、すぐに捨てないといけない。
ユーザー空間に、空きを作らないといけない
446: (ワッチョイ 8252-M0pk) 2019/05/06(月)06:20 ID:Geq8Gq1G0(1/2)調 AAS
>>445
いつものRubyバカだろ。いい加減な知識でC言語のメモリの話題に口を挟むのはやめろ。この板になれている者からすれば「またいつものか...」ですむが、初心者にとっては害悪でしかないから消えろ。
447(1): (ワッチョイ 8252-M0pk) 2019/05/06(月)06:25 ID:Geq8Gq1G0(2/2)調 AAS
>>444
組み込みとかの特殊な環境では例外もあるけど、基本的には環境によらずC言語で必須の概念だからスルーせずにちゃんと調べるべき。
448(1): (ワッチョイ 06d2-R0y6) 2019/05/06(月)08:39 ID:s1ulBxFy0(1)調 AAS
>439
>上記の2でユーザー空間いっぱいになるまで変数を宣言してもいいの?
他のプロセスがスワップ起こして重くなるから止めろって言いたい。
449: (ワッチョイ 2f05-73UM) 2019/05/06(月)10:14 ID:Om5TJBQR0(1/2)調 AAS
>>447
うん調べてみるよ
ありがとう
>>448
そんな視点もあるのか
他のプロセスも考慮しないといけない
思ったよりも数段以上やっかいだな
450: (ワッチョイ 2f05-73UM) 2019/05/06(月)10:19 ID:Om5TJBQR0(2/2)調 AAS
>読み込んだデータを使ったら、すぐに捨てないといけない
データをガンガン読み込んでいくようなプログラムだと「使ったらすぐ捨てる」のが鉄則か
451(1): (ワッチョイ d701-LHRJ) 2019/05/06(月)10:40 ID:F7BEaxMm0(1)調 AAS
>>439
ユーザープロセスなのでカーネル空間はマッピングされないよ。プロセス管理のための領域はカーネル空間に多少は確保されるとは思うけど、それはユーザープロセス用ではないし。
ページサイズの関係で効率的に確保できるかどうかは別問題だけど仮想メモリ領域いっぱいまで取れるか否かと言えば取ることはできる。
実際にそんなことしたらスワップ発生しまくりでまともに動かないとは思うけど。
452: (ワッチョイ 7fe9-3iRC) 2019/05/06(月)12:43 ID:53K/0wkW0(1)調 AAS
実装としてはだいたいcopy on writeだから、確保だけだったら特に問題発生しないよ
453: (ブーイモ MM3e-iz+S) 2019/05/06(月)16:08 ID:95XsbNbMM(1)調 AAS
>>451
どのOSなのか明示してくれ。
少なくともlinux 32bitは3GB以降はkernel空間にマッピングされてるだろ
454(1): (ワッチョイ 4321-QjK4) 2019/05/06(月)21:20 ID:lSipB+Y80(1/4)調 AAS
配列にある16進数アスキーを
整数型変数に数値として入れたいのですが、上手くいきません。
valの値をprintfで出力しても「0」になります。
rbuf[5]の中身は「0xDC」
rbuf[6]の中身は「0x18」でした。(printfで出力してみたところ。)
#include <stdio.h>
unsigned char sbuf[255] = {'\0'}; //送信バッファ
unsigned char rbuf[255] = {'\0'}; //受信バッファ
unsigned char work[10] = {'\0'}; //ワークバッファ
unsigned int val = 0; //値
work[0]=rbuf[5];
work[1]=rbuf[6];
work[2]='\0';
sscanf((char *)work, "%x", &val);
よろしくお願いします。
455(1): (ワッチョイ f701-EPtf) 2019/05/06(月)21:29 ID:v87Zm/5a0(1/4)調 AAS
sscanf の %x は、文字列で記述された数字+アルファベットの列を 16進数として抜き出す
sscanf("10", "%x", &val); → val の値は 10進で16 となる
0xDC 0x18 の並びから どういう整数値にしたいんだろうか?
456(2): 454 (ワッチョイ 4321-QjK4) 2019/05/06(月)21:38 ID:lSipB+Y80(2/4)調 AAS
>>455
回答ありがとうございます。
val=0xDC18
という感じで取り出したいです。
457(1): (ワッチョイ f701-EPtf) 2019/05/06(月)21:40 ID:v87Zm/5a0(2/4)調 AAS
>>456 それなら
val = rbuf[5]; じゃあかんの?
458(1): 454 (ワッチョイ 4321-QjK4) 2019/05/06(月)21:50 ID:lSipB+Y80(3/4)調 AAS
>>457
ありがとうございます。そういうことか・・・
下記で上手くできました!
val= rbuf[5];
val = val << 8;
val |= rbuf[6];
459: (ワッチョイ f701-EPtf) 2019/05/06(月)21:54 ID:v87Zm/5a0(3/4)調 AAS
>>458 解決してよかったね
0xDC 0x18 の並びから
(最低でも32bit長の整数)0xDC18 が欲しかったということだね
460(1): (ワッチョイ f701-EPtf) 2019/05/06(月)21:55 ID:v87Zm/5a0(4/4)調 AAS
(俺がちゃんと >>456 を読めてなかった説 val=0xDC18 って書いてるやんけw)
461(1): (アウアウウー Sabb-vI8p) 2019/05/06(月)22:06 ID:NYoOX9LAa(1/2)調 AAS
>>454
> rbuf[5]の中身は「0xDC」
> rbuf[6]の中身は「0x18」でした。(printfで出力してみたところ。)
だったらそれはASCIIではないよね。
上下前次1-新書関写板覧索設栞歴
あと 541 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.028s