[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 03/25 02:13 / Filesize : 275 KB / Number-of Response : 1034
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け 151



1 名前:デフォルトの名無しさん [2019/04/02(火) 11:23:37.62 ID:SQXqRaAc0.net]
!extend:checked:vvvvv:1000:512
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
codepad.org/

C11
www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured

391 名前: mailto:sage [2019/05/04(土) 21:01:18.06 ID:7fnHNdb20.net]
>>376
ノードを追加する関数add の引数を
add(&root, Object)
ってするでしょ?&root ってことは、struct *node のアドレス、すなわち struct node ** が必要なのではないかと

392 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 21:43:09.25 ID:cZ5M6KFWa.net]
>>377
わからんが、Cでも戻り値でポインタを返せばいいんじゃないか?

393 名前:はちみつ餃子 mailto:sage [2019/05/04(土) 21:46:08.02 ID:21Of2ELD0.net]
>>375
参照を持つオブジェクトへの参照を持てるんだから、事実上の二重ポインタとして使えるよ。

394 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 21:57:52.42 ID:8Q7/PMC20.net]
二重までは使うんだよなあ
三重をなぜ使わないか、説明できるか?w

395 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 22:09:57.55 ID:RtDHzLy60.net]
ガベージコレクションと裸のポインタって相性が悪いような

396 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 22:15:35.23 ID:eVIwB2YR0.net]
>>378
2個返したい時とか、戻り値は成功かどうかのコードを返したいとか

397 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 23:07:46.23 ID:cZ5M6KFWa.net]
道はいろいろあると思うが、せっかくあるんだから構造体使って皆くるんじゃえと思うよ。

398 名前:デフォルトの名無しさん [2019/05/05(日) 00:20:41.66 ID:nwgMKC8Ra.net]
微妙にスレチのように思うので続きはJava初心者のスレでやった方が良いのではないか?

まあ人に聞かなくても Java を勉強して Java の API のソースを読めばそういうのをどうしているのかは何れわかると思うけどね。

399 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 00:21:53.66 ID:tvdtPjB+0.net]
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 (深いコピー)と呼ぶ(別のインスタンス)



400 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 00:37:14.86 ID:RPhfdkos0.net]
>>385
馬鹿は消えろ

401 名前: mailto:sage [2019/05/05(日) 08:54:51.63 ID:3EWrT4Pn0.net]
>>378
それは無駄な代入が発生するでしょう?

402 名前: mailto:sage [2019/05/05(日) 09:01:10.92 ID:3EWrT4Pn0.net]
>>380
余裕で三重ポインタなどほいほいと使いますよ
https://mevius.5ch.net/test/read.cgi/tech/1434079972/26
void prep_exe(char *sttp, char **path, char ***argv)
char **argv を使うことが理解できるのだったら「argv のアドレスを渡す」みたいな場合に渡された関数側では三重ポインタを使うことになるでしょう

403 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 09:04:36.94 ID:hoO1o10+0.net]
>>388
それcodepadだろ? 使いさえすればいいって話じゃなくて

404 名前: mailto:sage [2019/05/05(日) 09:08:14.08 ID:3EWrT4Pn0.net]
>>389
無論使いさえすればいい、というわけではなく、この例では小さなシェルを実装しており、シェルのパイプ機能を実装するのに三重ポインタを使ったのです

405 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 09:21:39.41 ID:2T/oydys0.net]
>>387
引数を介すと代入が減るってこと?

406 名前: mailto:sage [2019/05/05(日) 09:47:47.39 ID:3EWrT4Pn0.net]
>>391
代入命令が増えるという意味ではなく、「同じ値」なのに代入してしまう、という作業が >>378「戻り値でポインタを返」す方式の書き方だと不可避です

407 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 10:05:07.93 ID:bV6goPu10.net]
呼び出しの前後で、ptrの値が 同じかもしれない、場合よっては変わるかもしれない関数

ptr = func1(ptr, opt); と func2(&ptr, opt);

うーんどっちも使うな…

408 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 10:28:11.80 ID:2T/oydys0.net]
>>392
じゃあ、一時変数に代入しとけば?

409 名前: mailto:sage [2019/05/05(日) 10:29:23.05 ID:3EWrT4Pn0.net]
>>393
前者
>ptr = func1(ptr, opt); 
は初心者用で、>>392 のいう無駄な代入が含まれています、二重ポインタがわかるのなら後者にするべきです



410 名前: mailto:sage [2019/05/05(日) 10:30:14.08 ID:3EWrT4Pn0.net]
>>394
シンプルな記述ができるのに、わざと複雑な書き方にするのは問題なのでは?

411 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 10:32:32.58 ID:2T/oydys0.net]
>>396
じゃあ、戻り値そのまま使えば?
mallocは使うんでしょ?

412 名前: mailto:sage [2019/05/05(日) 10:33:46.84 ID:3EWrT4Pn0.net]
>>397
その場合無駄な代入が発生しますね、>>393 がいい例を示しています

413 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 10:35:01.06 ID:bV6goPu10.net]
エラー伝達に NULL を使う realloc は即代入するとお漏らししちゃうし
あれ、なん引数書き戻しにしなかったんだろう? 素朴な疑問

414 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 10:35:57.12 ID:2T/oydys0.net]
>>398
代入されているのかされていないのか、わからない方が良いってこと?

415 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 10:36:08.55 ID:bV6goPu10.net]
×あれ、なん引数書き戻しに
○あれ、なんで引数書き戻しに

416 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 10:41:29.60 ID:2T/oydys0.net]
>>399
正直、nullが来た時点で終わってるしなあ…。
まあでも一時変数使うのが筋だと思いますよ。戻り値でも引数でも同じこと。

417 名前: mailto:sage [2019/05/05(日) 11:25:51.36 ID:3EWrT4Pn0.net]
>>400
ちがいます
代入するのか代入しないのかは malloc() したかしなかったかにかかっています。
代入は malloc() したとききだけにすればよく それが >>393 の func2(&ptr, opt); の書き方
一方 >>393 ptr = func1(ptr, opt); は malloc() したかしないかにかかわらず代入を行います、これは無駄な代入を含みます

418 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 11:31:24.71 ID:2T/oydys0.net]
>>403
だから、関数の内部的に何してるのかわからんのが良いってことじゃない?

419 名前: mailto:sage [2019/05/05(日) 11:37:36.53 ID:3EWrT4Pn0.net]
>>404
着目点はそこにはありません。関数による記述で内部を隠蔽するのが目的ではありません
問題は、malloc() したときだけ代入し、malloc() しなかったときには代入しない、という記述を正確にかけるかどうか…@、にかかっており
>>393 ptr = func1(ptr, opt); は@を記述できる可能性が皆無、一方
>>393 func2(&ptr, opt); は@を記述できる可能性がある、というわけです



420 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 11:38:01.66 ID:orE8GGyod.net]
>>393
前者の方が好ましい
2重ポインタなんて最適化の妨げになるものは、それしか使えない場面でのみ使うべき

421 名前: mailto:sage [2019/05/05(日) 11:44:46.28 ID:3EWrT4Pn0.net]
>>406
非常に大きな二分木(ノートが1億個)があって、そのはるか先端で malloc() してそこで代入すればいいだけなのに、
その先端から root に戻ってくる途中の3

422 名前:0箇所ほどで、軒並み全部のノードで「必要のない無駄な代入」をするのですか?

>それしか使えない場面でのみ使うべき

この二分木を実装する、というのがまさしく「それしか使えない場面」なのですよ
[]
[ここ壊れてます]

423 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 11:45:42.03 ID:2T/oydys0.net]
>>405
つまり、後者でmallocしてnullが返った時はそれを代入するってことですか?同じじゃん。

424 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 11:47:06.67 ID:2T/oydys0.net]
>>407
二分木のコストってのは比較であって代入じゃないと思いますよ。
まあアルゴリズムの一般論としては。

425 名前: mailto:sage [2019/05/05(日) 11:53:15.92 ID:3EWrT4Pn0.net]
>>408
>>393 func2(&ptr, opt); では
malloc() して null が返ってきたときは、例えば何もしない、ということはできますね

でも >>393 ptr = func1(ptr, opt);
は、malloc() しようがしまいが代入してしまいますね、これは「やる必要のない無駄な代入」が含まれることになり、好ましくないです
>>393 ptr = func1(ptr, opt); の記述法は二分木を最初に習うときに、この記述法で理解を促すという意味では有用であっても、
いつまでもこれで書いているようでは進歩していない、もっといえば怠惰である、と考えています

426 名前: mailto:sage [2019/05/05(日) 11:55:53.32 ID:3EWrT4Pn0.net]
>>409
しかし無駄な代入を放置してよいというわけではないでしょうね、削れるところは削るべきです
単純二分木よりさらに改良された平衡二分木(AVL木、赤黒木等)を紹介する書籍では、最初から >>393 func2(&ptr, opt); で記述されていますよ

427 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 11:57:28.30 ID:2T/oydys0.net]
>>410
じゃあ隠蔽しろという話なんじゃないの?
関数の中で成功失敗を判定して外にnullは返すな入力時のままにしとけ、という関数。

428 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 11:58:36.27 ID:2T/oydys0.net]
>>411
代入回数比較してよ。頼むよ。

429 名前: mailto:sage [2019/05/05(日) 12:05:45.99 ID:3EWrT4Pn0.net]
>>412
ちがいますね
問題は、malloc() したときだけ代入し、malloc() しなかったときには代入しない、という記述を正確にかけるかどうか…@、にかかっています。

>>413
>>407 に書いておきました、1億ノードの二分木にて各ノードが最適に配置されているとして、削ることのできる代入は malloc() 一回に対して 30 個の代入になります
>>393 ptr = func1(ptr, opt); では 1億ノードの二分木にノードを追加する際、30個の無駄な代入が発生します
代入のコストは大したことがない、にしても、アルゴリズムを正確に記述できないのは問題ですね
洗練された記述とはそういうものではないでしょうか



430 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 12:48:51.19 ID:2T/oydys0.net]
>>414
いや、mallocがnull返した時はいれないんでしょ?
成功か失敗かじゃないの?呼んだかどうかじゃなくて。

431 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 12:52:54.83 ID:2T/oydys0.net]
仕事では戻り値に成功失敗が入ってオブジェクトのポインタは引数に来るような関数は使うけどさ、
結局どっちもチェックするよ。信じられねえもんな。

432 名前: mailto:sage [2019/05/05(日) 13:12:30.38 ID:3EWrT4Pn0.net]
>>415
malloc() が成功したか失敗したかは、今の話には関係ありません
今関係があるのは、
malloc() したときだけ代入し、malloc() しなかったときには代入しない、という記述を正確にかけるかどうか…@
です

433 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 13:42:25.11 ID:2T/oydys0.net]
>>417
じゃあ、絶対代入するってことだろうよ。
引数に渡したポインタに。ポインタを。

434 名前: mailto:sage [2019/05/05(日) 13:51:49.48 ID:3EWrT4Pn0.net]
>>418
malloc() したときは代入しますよ、でも malloc() しないときは代入なんかせず、そのまま呼び出し元に返るだけです
それが>>393 ptr = func1(ptr, opt); 方式と絶対的に違うのです

435 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 13:55:35.88 ID:2T/oydys0.net]
>>419
戻り値はvoidってこと?

436 名前: mailto:sage [2019/05/05(日) 14:02:45.71 ID:3EWrT4Pn0.net]
>>420
>>393 func2(&ptr, opt); 式なら void もありえます

437 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 14:08:06.37 ID:2T/oydys0.net]
>>421
いや、必須なのでは?

438 名前: mailto:sage [2019/05/05(日) 14:11:38.90 ID:3EWrT4Pn0.net]
>>422
いいえ、実際に実装するならば、エラーを伝達する手段として返り値を準備することは大いにありえるでしょうね
void が必須ではありません
必要な代入なら使えばいい、でも
>>393 ptr = func1(ptr, opt);
方式は不必要な代入があり、単に二重ポインタを使用して記述すればこれは除去できるので、
>>393 ptr = func1(ptr, opt);
を書くのは問題だし、これを書く人は頭を使っていない、と判断します

439 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 14:33:08.37 ID:bV6goPu10.net]
異常は戻りをNULLにするパティーンで 
 node_t *func3(node_t**, ...)

正常だった場合に ptr = func3(&ptr, opt); と書けるしw (無駄な努力の可能性



440 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 14:34:34.27 ID:bV6goPu10.net]
って書いたけど鼻から悪魔踏みそうな嫌らしさがあるな…

441 名前: mailto:sage [2019/05/05(日) 15:03:58.07 ID:3EWrT4Pn0.net]
>>424
そのパターンでは、異常値 NULL をうっかりノードに登録してしまうと、そのノードより下が浮いてしまい危ないですね、ま、異常系をミスったままリリースしてしまうことも私はよくやりますけど

442 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 15:42:24.13 ID:8x8syc+Fa.net]
>>423
いや、必須でしょ?代入消せるんだから。消さないと。

443 名前: mailto:sage [2019/05/05(日) 17:54:28.38 ID:3EWrT4Pn0.net]
>>427
言葉尻を捕らえて攻めたつもりになっているようですね
「すべての代入を消去できる」なんていってませんよね

>>393 ptr = func1(ptr, opt);

この代入は不要な代入を含むので、

>>393 ptr = func1(ptr, opt);

は不適当な書き方だ、とこれまで首尾一貫して述べているのです

444 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 18:13:23.13 ID:bV6goPu10.net]
423の文意は
「void が必須なわけではなく
 引数と同じ型のポインタを戻すことはせずに、別の目的の何か、たとえばエラーコードとして int を戻す
 なんてのはアリでしょ?」
ってことだと思うけど

445 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 18:42:49.42 ID:dOx23ziba.net]
returnしちゃだめでしょ
代入が駄目ってくらいだから

446 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 18:56:43.02 ID:bV6goPu10.net]
「代入不要なケースでも代入記述を要求するのはよろしくない」スタイルの延長だと
戻り値評価も破棄可能ならそうすべき って話か

447 名前: mailto:sage [2019/05/05(日) 19:00:00.98 ID:3EWrT4Pn0.net]
>>430
どんな代入もだめだとは主張していませんね…

>>393 ptr = func1(ptr, opt);
方式は不必要な代入があり、単に二重ポインタを使用して記述すればこれは除去できるので、
>>393 ptr = func1(ptr, opt);
の代入が駄目だとはいってきていますけれども

448 名前:はちみつ餃子 mailto:sage [2019/05/05(日) 19:03:30.45 ID:TxpPZKKr0.net]
>>407

449 名前:はちみつ餃子 mailto:sage [2019/05/05(日) 19:13:46.27 ID:TxpPZKKr0.net]
あ、ごめん、ミスって文章を書く前に投稿してもうた。

>>407
あらためて確認するが、この代入を「無駄」としているのはアルゴリズムの表現の上では不要なことをしているという
意味の上での無駄であって、性能上の無駄という意味ではないんだね?
そして、アルゴリズムを正しく表現する上では (ときには二重・三重のも含めて) ポインタが必要だと。



450 名前: mailto:sage [2019/05/05(日) 20:16:09.59 ID:3EWrT4Pn0.net]
>>434
>性能上の無駄という意味ではないんだね?
性能の上で分析するとなると、間接参照にてデータをロード、ストアするコストと値をストアするコストを天秤にかける、ことになりますね
なるほど、その点を言いたくて、でも言いたくなくて、しつこく絡んでいたのですか…

私は二重ポインタでの表現の方がトータルでお得だ、とは思ってはいますが、これまで表に出ている私の発言は、あえてそこには踏み込まず(だって性能の話はうかつに断言できませんからね…)、
おっしゃるとおり「アルゴリズムの表現の上では不要なことをしている」に留まっています

451 名前:はちみつ餃子 mailto:sage [2019/05/05(日) 20:57:45.43 ID:TxpPZKKr0.net]
>>435
たとえば数学上の表記なら「A=1 であり B=1 のとき A=B は真である」と「1=1 は真である」には何も差が無い。
途中で名前を付けるのは人間に対する便宜であって、無駄な「操作」は存在しない。

代入が無駄たりうるのは C のパラダイムだからなので、
「C で表現するにはポインタが必要だし、代入では不適当だ」は事実であっても
「ポインタが無い言語では表現できない」というわけではないよ。

C の低級な世界でまともな意味論を表現しようとするのがそもそもの間違いだろう。

452 名前: mailto:sage [2019/05/05(日) 21:02:18.49 ID:3EWrT4Pn0.net]
>>436
>「ポインタが無い言語では表現できない」というわけではないよ。
それは理解しています、なぜなら
Java での二分木の実装を検討したことがある(探せば2ch過去ログにあるかもしれません)
Java にはポインタはありませんが、実装できるかできないか、といえば「できる」の方に入りますね

453 名前:はちみつ餃子 mailto:sage [2019/05/05(日) 21:54:26.85 ID:TxpPZKKr0.net]
>>437
そこまでわかっているのなら、
「代入しない」と「同じ値を代入しなおす」が意味論的に等しいということがどうしてわからないんだ。

454 名前:デフォルトの名無しさん [2019/05/05(日) 23:34:40.25 ID:RXFRr1FQ0.net]
C言語のプログラム内で確保していいメモリってユーザー空間の仮想メモリ上限いっぱいまで取っていいの?
複数の変数a, b, c, ・・・の値を表示するだけのプログラムを時系列に並べて考えてみるんだけど

0. 実行ファイルを起動する
1. 32bitプロセスが生成される ←たとえば32bit windowsだとユーザー空間とカーネル空間で計4GBの仮想メモリが確保される
2. int a; ←仮想メモリ(1で確保されたユーザー空間)上にaが確保される
int b; ←上に類似
int c; ←上に類似
・・・・・(複数の変数の宣言やprintf関数が続く)

こんな感じなんだろうけど
上記の2でユーザー空間いっぱいになるまで変数を宣言してもいいの?

455 名前:はちみつ餃子 mailto:sage [2019/05/05(日) 23:38:14.20 ID:TxpPZKKr0.net]
>>439
いいけど、もっと効率的な方法があるならそれに越したことは無いっていうそれだけの話

456 名前:デフォルトの名無しさん [2019/05/05(日) 23:41:29.98 ID:RXFRr1FQ0.net]
簡潔に書くと
安全のためにはどこまでメモリを使っていいの?
そのメモリの大きさはユーザー空間の上限と同じなの?
という室問なのに長くなってしまた

457 名前:デフォルトの名無しさん [2019/05/05(日) 23:47:50.76 ID:RXFRr1FQ0.net]
>>440
ありがとう
ただ初心者なので効率性を目指すにはきつい部分が出てくる
そうなるとメモリの残量を監視する、つまり残量の値を取得する必要があるわけだけど
これは一般的にはwindowsのAPIを使うのが普通なの?
(そんなものがあるのかは知らない)

458 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 23:52:54.47 ID:RPhfdkos0.net]
>>442
スタックとヒープという概念は知ってる?知らなければまずそれを調べてみて。
それと、初心者なら効率を求める前に正しくメモリ管理を扱えるようになる必要があるが、その時点で残量は気にする必要はないぞ。

459 名前:デフォルトの名無しさん [2019/05/05(日) 23:59:16.82 ID:RXFRr1FQ0.net]
FIFOだとかナントカ程度にしか。
「〜〜領域」という幾つかの用語がOSとかの環境が違っても
全く共通のものなのかよく分からないから正直スルーしてる



460 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 05:38:27.60 ID:wr9bFPpT0.net]
>>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読んでは捨てて、の繰り返し

読み込んだデータを使ったら、すぐに捨てないといけない。
ユーザー空間に、空きを作らないといけない

461 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 06:20:53.21 ID:Geq8Gq1G0.net]
>>445
いつものRubyバカだろ。いい加減な知識でC言語のメモリの話題に口を挟むのはやめろ。この板になれている者からすれば「またいつものか...」ですむが、初心者にとっては害悪でしかないから消えろ。

462 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 06:25:32.64 ID:Geq8Gq1G0.net]
>>444
組み込みとかの特殊な環境では例外もあるけど、基本的には環境によらずC言語で必須の概念だからスルーせずにちゃんと調べるべき。

463 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 08:39:59.60 ID:s1ulBxFy0.net]
>439
>上記の2でユーザー空間いっぱいになるまで変数を宣言してもいいの?
他のプロセスがスワップ起こして重くなるから止めろって言いたい。

464 名前:デフォルトの名無しさん [2019/05/06(月) 10:14:49.95 ID:Om5TJBQR0.net]
>>447
うん調べてみるよ
ありがとう

>>448
そんな視点もあるのか
他のプロセスも考慮しないといけない
思ったよりも数段以上やっかいだな

465 名前:デフォルトの名無しさん [2019/05/06(月) 10:19:59.43 ID:Om5TJBQR0.net]
>読み込んだデータを使ったら、すぐに捨てないといけない

データをガンガン読み込んでいくようなプログラムだと「使ったらすぐ捨てる」のが鉄則か

466 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 10:40:24.77 ID:F7BEaxMm0.net]
>>439
ユーザープロセスなのでカーネル空間はマッピングされないよ。プロセス管理のための領域はカーネル空間に多少は確保されるとは思うけど、それはユーザープロセス用ではないし。
ページサイズの関係で効率的に確保できるかどうかは別問題だけど仮想メモリ領域いっぱいまで取れるか否かと言えば取ることはできる。
実際にそんなことしたらスワップ発生しまくりでまともに動かないとは思うけど。

467 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 12:43:21.39 ID:53K/0wkW0.net]
実装としてはだいたいcopy on writeだから、確保だけだったら特に問題発生しないよ

468 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 16:08:26.90 ID:95XsbNbMM.net]
>>451
どのOSなのか明示してくれ。
少なくともlinux 32bitは3GB以降はkernel空間にマッピングされてるだろ

469 名前:デフォルトの名無しさん [2019/05/06(月) 21:20:46.06 ID:lSipB+Y80.net]
配列にある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);

よろしくお願いします。



470 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 21:29:36.69 ID:v87Zm/5a0.net]
sscanf の %x は、文字列で記述された数字+アルファベットの列を 16進数として抜き出す
sscanf("10", "%x", &val); → val の値は 10進で16 となる

0xDC 0x18 の並びから どういう整数値にしたいんだろうか?

471 名前:454 [2019/05/06(月) 21:38:34.55 ID:lSipB+Y80.net]
>>455
回答ありがとうございます。
val=0xDC18
という感じで取り出したいです。

472 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 21:40:18.62 ID:v87Zm/5a0.net]
>>456 それなら
val = rbuf[5]; じゃあかんの?

473 名前:454 [2019/05/06(月) 21:50:08.40 ID:lSipB+Y80.net]
>>457
ありがとうございます。そういうことか・・・
下記で上手くできました!

val= rbuf[5];
val = val << 8;
val |= rbuf[6];

474 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 21:54:12.13 ID:v87Zm/5a0.net]
>>458 解決してよかったね
0xDC 0x18 の並びから
(最低でも32bit長の整数)0xDC18 が欲しかったということだね

475 名前:デフォルトの名無しさん mailto:sage [2019/05/06(月) 21:55:43.20 ID:v87Zm/5a0.net]
(俺がちゃんと >>456 を読めてなかった説 val=0xDC18 って書いてるやんけw)

476 名前:デフォルトの名無しさん [2019/05/06(月) 22:06:19.06 ID:NYoOX9LAa.net]
>>454
> rbuf[5]の中身は「0xDC」
> rbuf[6]の中身は「0x18」でした。(printfで出力してみたところ。)

だったらそれはASCIIではないよね。

477 名前:デフォルトの名無しさん [2019/05/06(月) 22:08:02.81 ID:NYoOX9LAa.net]
などと、ゆっくり書いていたら既に解決か・・・

478 名前:デフォルトの名無しさん [2019/05/06(月) 22:09:16.82 ID:lSipB+Y80.net]
>>460
>>461
ありがとうございます。
お陰様で解決できました。
勝手にASCII、文字列と勘違いしていたのがよくなかったです。

479 名前:デフォルトの名無しさん mailto:sage [2019/05/07(火) 06:48:35.98 ID:/Z9tG+PY0.net]
ASCII は、7 bit キャラだろ

欧州文字コードなら、8 bitとか



480 名前:デフォルトの名無しさん mailto:sage [2019/05/07(火) 15:31:36.79 ID:gGAOuhJk0.net]
BASIC時代 文字→文字コード変換関数が ASC(文字) だったな。

481 名前:デフォルトの名無しさん mailto:sage [2019/05/08(水) 20:11:19.53 ID:w7dyIR3e0.net]
逆はCHR$(コード)だったな。

482 名前:デフォルトの名無しさん mailto:sage [2019/05/08(水) 22:02:13.36 ID:LqpjdKM80.net]
「なんで朝潮?」と思ってしまった当時の俺w

483 名前:デフォルトの名無しさん mailto:sage [2019/05/09(木) 08:32:10.12 ID:IVg2TokP0.net]
わらってよりとも というのは、当時の人気番組名をもじったものだよ

484 名前:デフォルトの名無しさん mailto:sage [2019/05/09(木) 12:40:11.38 ID:J26JobOx0.net]
https://ae01.alicdn.com/kf/HTB1goomIL1TBuNjy0Fjq6yjyXXaS/Cetak-Pria-Kaus-Katun-Leher-o-Tshirts-ANSI-Pemrograman-C-Buku-Jepang-Lengan-Pendek-Wanita-Kaus.jpg_640x640.jpg

485 名前:デフォルトの名無しさん mailto:sage [2019/05/09(木) 20:40:23.75 ID:axmpki24M.net]
「はじめてのC」なら買う

486 名前:デフォルトの名無しさん mailto:sage [2019/05/09(木) 22:18:17.14 ID:fgRKvhjn0.net]
その本の名前、買うときに恥ずかしいw

487 名前:デフォルトの名無しさん mailto:sage [2019/05/09(木) 23:03:35.49 ID:vEdVh+9n0.net]
質問です
文字列の配列
char matrix[Y][X]を関数に引数として渡して、渡した先の関数でtxtファイルに出力したい。
YとXはその時々によって違う値でmatrixは文字列の配列だけど1行ごとに'\0'が入っていないとき、渡した先の関数でYとXをどうやれば参照できますか?
例えば
matrix = {{‘a’, ‘b’, ‘c’}, {‘d’, ‘e’, ‘f’}};
みたいな配列です

488 名前:デフォルトの名無しさん mailto:sage [2019/05/10(金) 00:00:40.06 ID:IBOrEgMWa.net]
X(配列のサイズ)を共有してやればいいんじゃないかな

489 名前:デフォルトの名無しさん mailto:sage [2019/05/10(金) 00:14:05.05 ID:Ojl9YgLP0.net]
>>472
matrixのアドレスと共にX、Yの値を渡さないと無理



490 名前:デフォルトの名無しさん [2019/05/10(金) 03:11:16.60 ID:+vHN15fT0.net]
>>472
https://qiita.com/Hiraku/items/babed27bc1d750c2e12d

491 名前:デフォルトの名無しさん mailto:sage [2019/05/10(金) 09:26:09.21 ID:bwAvNWKg0.net]
>>474
やっぱり配列のサイズ一緒に渡さないとだためですか






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<275KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef