TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼
文字コード総合スレ Part11
vbs初心者なんですが
ハッシュ使うのやめてクラスにしましょう
スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]
【会津】パソコン甲子園2004【若松】
構造化プログラミングはまだ必要ではないのか?
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
Access VBA 質問スレ Part1
<XML総合 part="3"/>
【モダン推奨】Perlについての質問箱 50箱目
C言語なら俺に聞け 154
- 1 :2020/01/14 〜 最終レス :2020/04/18
- !extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/
C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
※前スレ
C言語なら俺に聞け 153
https://mevius.2ch.sc/test/read.cgi/tech/1566050562/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
- 2 :
- 完
- 3 :
- 前スレのこれに質問です。
32bitアプリだとmallocで確保していくと2GB近くでエラーになりませんか?
頑張って色々施しても4GB近くが32bitだと限界じゃないんですかね?
もし回避策があるなら教えてください。
999デフォルトの名無しさん (ワッチョイ 7f36-///2)2020/01/14(火) 19:45:37.22ID:MAaOflfD0
>>978
ちょっと待てや
おまえ単一仮想記憶を前提に話してるか?
今や多重仮想記憶が当たり前で単一仮想記憶はかなり特殊な存在だぞ
- 4 :
- 前スレ999本人だが
議論できるやついる?
- 5 :
- paeのことかしら。それでもアプリが使えるメモリは4gb以下に制限されるみたいだけど
- 6 :
- paeじゃない
オーバープロセスのことだよ
- 7 :
- アドレスを保持する変数が32bitなんだから
どう頑張っても4GBまで
実際は32bit Windowsの制約で2GBまで
あとは前スレ >>982 の方法しかない
- 8 :
- https://mevius.2ch.sc/test/read.cgi/tech/1566050562/982
>FARポインタを扱えるようにするか
馬鹿いってんじゃないよ!このニワカ!R!百遍R!
「far/near ポインタ」は 16bit リアルモードでの用語だ
- 9 :
- しかし別プロセスにしようとどうしようと
結局データのアドレスは受けないといけないので
そのポインタ自体が32bitで管理されてる以上
その限界はどうしようもないような。
- 10 :
- >>8
セグメントレジスタとセットで48bitで処理するって意味
(書かなきゃわからないですか?)
CPU的には可能だけどOS的にもコンパイラ的にも不可能だから実質不可能
- 11 :
- ニワカはどっちだwww
- 12 :
- 32ビットだと大きいメモリは最初の方で確保して最後の方で解放するなぁ
あるいはプロセスを分けるか
- 13 :
- >>10-11
ではお聞きいたしますが、セグメントレジスタ16ビット+レジスタ32ビットのペアで指定した先は何ビット空間ですか?
IA-32 アーキであるかぎり、どうあがいても32bit 空間ではないでしょうか?PAE 搭載であってもユーザーからみえるのはやっぱり32ビットなのでは?
- 14 :
- >>13
知らないなら黙ってろよ
- 15 :
- 多重仮想記憶ってプロセス毎に同じアドレス空間を提供するだけの話
(逆に単一仮想記憶はプロセッサのアドレス空間を分割してプロセスに提供する)
http://yougo.ascii.jp/caltar/多重仮想記憶
前スレの質問はアプリの話だからあんまり関係ないよ
オーバープロセスとか言うオレオレ用語はよくわからんけど…
オーバーコミットの話じゃないよね?
- 16 :
- >>14
私の質問に回答できないのですね…
IA-32 では、それが PAE を搭載していたとしても、ユーザーが一度に扱えるのは32ビットどまりですよ
>>10
>CPU的には可能だけど
CPU的にも不可能です
- 17 :
- windows依存なら CreateFileMapping MapViewOfFile で32ビットより大きいのをやりくり
- 18 :
- 今、話題になっているのは32bitOSの場合であって、IA-32 どうこうは微妙に違う話にも思えるのは内緒。
ということで話を戻すと、例えば32bit版Windowsには、OS管理外メモリとして8Gだの16Gだの扱うことができるRAM-DISKアプリがあるわけで。
32bitアプリでも、セグメントレジスタに正しいセレクタ値をセットできるのであれば、4G超のメモリ空間を扱える、と言えなくもない予感がする。
- 19 :
- 386の時代から仮想アドレス空間は64TBだってのに
- 20 :
- >>18
RAM-DISK使わんでもAPIには上位32ビット下位32ビットの64ビット指定できるから
- 21 :
- 話の前提は、64bitOSで32bitプログラムを動作させる場合ですね。
- 22 :
- できるならやり方を具体的に提示してくれよ
罵り合ってる内容が一切質問者に有益な情報じゃない
- 23 :
- 64bitOSなら32bitアプリで4GiBまで扱える(ように出来る)
これでいくらかは改善するのでは?
- 24 :
- >>17 >>20
https://mevius.2ch.sc/test/read.cgi/tech/1566050562/986
- 25 :
- >>23
確かにオプション指定でそれが出来ますね。
やっぱりそれが限界でしょうかね。
- 26 :
- それでもダメなら
DLLを扱う用の32bitプロセスと
多量のメモリを扱う64bitプロセスに分けて
プロセス間通信でデータをやり取りする
- 27 :
- >>19
80386 に関していえば、その記述「386の時代から仮想アドレス空間は64TB」はわりとデマ的に流布されていることは理解します。手元の本
https://www.あまぞん.co.jp/dp/4756101305/
にも載っていました、確かに紛らわしい記述だとは思います
セグメントレジスタが指す「セレクタ値」は8バイトごとである、という事実から、セレクタ値のアドレスを意味する部分を16-2=14ビットとして、これと一般レジスタ32ビットとの直積から
46ビット=64T 分のアドレス空間が取れる、という計算だとは思いますが、この記述は不正確であり実情からは程遠いと思います
80386 では、セグメントレジスタが指すセレクタ値にひも付けられているセグメントベースはやはり32ビット空間の中なんです。32ビット空間の外に出ることはありません。
- 28 :
- Pentium Pro の時代から64GiB扱えるわけですが
Windows Server系は32bitでも64GiB使える(ものもある)わけですが
問題はフラグメントなのでアドレス空間が広がれば解決するわけですが
- 29 :
- コテのくせにド素人だな
- 30 :
- >>29
セグメントレジスタが指すグローバルディスクリプタテーブル(GDT)中の一つ一つのエントリー(セレクタ値)に含まれる情報の配置状況が 80386 から変わっておれば、あなたのおっしゃることは理解できます
pentium を例にそれを示せますか?
- 31 :
- >>14
- 32 :
- 仮想86EMSが使われていた頃
- 33 :
- >>6
ググっても出てこないので、正確な技術用語を教えてください
- 34 :
- ファイルマッピング
でいいか?
- 35 :
- リソースの再利用について
https://www.youtube.com/watch?v=XQdAlM4TnQU
- 36 :
- 大きいメモリをできるだけ上位のアドレスで割り当てる
普通のメモリ割り当てなら下位のアドレスになるから
使い分けで断片化の影響を減らせる
VirtualAllocの MEM_TOP_DOWN
- 37 :
- XPで付属のIMEだかuxtheme.dllあたりが中途半端なbaseaddress指定してあって1ブロックとしては700MBくらいまでしか確保できなかった思い出
- 38 :
- 2つスレッドがあってサブの方を使わない時は
こんな感じで待機してるんだけどやっぱマヌケかな?w
その都度作った方がやっぱいいの?
while(flag){ Sleep(1000); }
- 39 :
- 間抜けというか、完全に寝かせてしまえばいいのでは?
- 40 :
- >>38
環境を書かないと
WindowsならDefWindowProc呼び出すとか
Unixならselectでイベント発生を待っているとか
- 41 :
- >>38
それは簡単のように見えて、実は奥深いプログラミングのテーマの1つかもだけど。
問題がないのであれば、そのコードはマヌケでもないし悪くもないので、そのままでいいと思うよ。
- 42 :
- >>39-41
環境はWindowsです。
スレッドは二つだけでサブも結構使ってるので
flagで管理して動かしたい時だけTRUEにしてる感じです。
特に動作に問題はないのでこのままでいいんでしょうかね。
- 43 :
- リソースの競合がないんなら好きにすればいいけど、
あるなら、動いているように見えて低い確率で破綻するってのもあるよ
- 44 :
- >>42
問題がない以上、NGにする理由もないわけで、このままでいいです。
言い換えると、何か問題があるなら、それに応じた修正や変更の必要ありかもです。
- 45 :
- >>43
一応そのへんは気を付けてるつもりなので今のところは問題ないですね。
>>44
分かりやすくていいので問題ないならこのまま行こうと思います。
ありがとうございました。
- 46 :
- 呼んでから起きるまでのタイムロスはどうでもいいのか
- 47 :
- >>46
そこはOKです。瞬時に処理してくれなくても問題ない処理なので。
- 48 :
- >>38
イベント待ちがスマートでは?
サブは WaitForSingleObject でイベント待ち
サブを動かす時は メインスレッドから SetEvent する
- 49 :
- >>38
すげーマヌケに見える
スレッド作成する時間も惜しいなら>>48が言うようにイベントとかを使うべきだし、そうでないなら自分で言ってる通りその都度作った方がいい
そもそもサブともうひとつのスレッドとのやり取りはないんか?
- 50 :
- >>48でFA
- 51 :
- スレッドプール用のapiあるんだからそっちのが良くない?
- 52 :
- >>48-51
ありがとうございます。参考にさせてもらいます。
- 53 :
- POSIXスレッドなら cond wait みたいなの使うのがよさげ
- 54 :
- int main()
{
int array[100][10];
array[0][0] = 61;
printf("%d\n", *(int*)array ) ;
}
これなんでIntポインターにキャストしないとだめなん?
arrayでもポインターだから*つければ配列の先頭参照できないとおかしくね?
例えば
char array[] ="unko king";
だとしたら
%s とarrayで文字列表示できるじゃん
*(char*)arrayなんてしないでしょ?
- 55 :
- %s とarrayで文字列表示できるじゃん
*(char*)arrayなんてしないでしょ?
じゃなくて(char*)arrayだわ
みすった
- 56 :
- 配列はポインタではない。
- 57 :
- >>56
添字つけない場合は配列の先頭のメモリアドレスを持つポインタなんだがw
- 58 :
- >>56
例えば
int array[40][40];
array[30][30]=10;
int *p;
p=array;
*(p+(40*30)+30)でarray[30][30]にアクセスできる
- 59 :
- 型に互換性があることと、型が同じであることは異なる。int[20][20]はint*とは互換性がない。
- 60 :
- 配列はアドレス値を動かせない。
配列とポインタではsizeofの値が違うことがある。
多重ポインタと多次元配列はメモリレイアウトが異なる。
よって配列はポインタではない。
- 61 :
- 2次元配列は各行の配列が配置されてるメモリ上のアドレスのリストですか?
その場合、そのリストの要素であるアドレス値はどうやって取り出せますか?
https://i.imgur.com/Ibk3T9G.png
- 62 :
- この場合で言う、データの列の10,20,30というようなアドレス値を取り出す方法はありますか?
- 63 :
- https://i.imgur.com/Kk16zD9.jpg
- 64 :
- 1つの配列は連続した1つのメモリブロックになっている。二次元配列も1つのメモリブロック。配列の中身は実体。
配列名のみを指定すると配列の先頭へのポインタと互換になる。
- 65 :
- array[1][2]のように要素を指定できる。
- 66 :
- int array[10][2]はint[10]が2個あるという意味ですか?
- 67 :
- はい。
- 68 :
- ではそのint[10]というのを行と呼ぶとした時、なぜこの実行結果では行間のアドレス間隔が行数になるのでしょうか。
https://i.imgur.com/CIV0x2N.png
- 69 :
- >>67はウソ。
- 70 :
- スミマセン
- 71 :
- >>66
それはint[2]が10個だ。
- 72 :
- >>54
おまえさんが array[0][0] = 61; と書いているように、
int は array[0][0] だ、ここ大事だぞ
array[0] は int ではないことを絶対に忘れるな
知ってのとおり
printf("%p", array); は
printf("%p", &array[0]); と解釈される
つまり int でないもののアドレスとなる
だから
printf("%d", *array); と実体化すると
printf("%d", *&array[0]); のように int でないものとなる
- 73 :
- >>72
おおサンクス!
- 74 :
- int three[2][3][4];
これは4の配列が3個で、それが2個ということでおk?
- 75 :
- そうじゃない
int [3] [4]が二個
って考える
そのあとint[3][4]について考えると
int[4]が3個ってなる
- 76 :
- >>74はそう言ってるのでは?
- 77 :
- 静的に確保された多次元配列の実態はただの1次元配列だから
int array[2][2] = {};
array[1][0] = 2525;
printf(“%d\n”, array[0][2]);
ってやると2525が出力される
- 78 :
- 再帰むずすぎてハゲそうだわ
これなにやってるかパット見て分かる人いる?
int rec(int num) {
printf("%d\n", num);
if (num == 1)
return 1;
else {
return num * rec(num - 1);
}
}
- 79 :
- 階乗のように見えるが、違うのか?
- 80 :
- 再帰の例で一番出てくるヤツ
if の中はゼロとの比較の方が良いと思う
- 81 :
- これをfixとかでやるとますますわからなくなる
- 82 :
- rec(1) = 1
rec(n) = n * rec(n-1)
漸化式による記述
- 83 :
- 重要なのはreturnの部分だけだしな
- 84 :
- >>78
rec(3) 位にして自分でトレースしてみればわかると思う
- 85 :
- 再帰のコードを書いていて不思議な気分になるのは
なんで今書いているものを呼び出せるんだろうとか思っちゃうからかな
- 86 :
- 再帰できるのはスタックフレームのおかげやで
- 87 :
- 再帰は遅いから実践ではできれば使わずに済ませたい
- 88 :
- 単純なループですむならその方がいいだろうな。
木構造の探索みたく本質的に再帰で書いた方が自然なものは再帰のがいい。
- 89 :
- 今どき再帰が遅い?
- 90 :
- 今時〜が遅いと言い放てる環境ならまず今時Cを使う意味がない
- 91 :
- 再帰は遅さより深さが怖い
- 92 :
- 再帰でなければ実現できないアルゴリズムがあるとすれば,例えばどんなの?
- 93 :
- > でなければ実現できない
という要件が気になる。
- 94 :
- 迷路のルート検索に再帰で書いた事あるけど10000ぐらいでスタックオーバーするので再帰をループで書き直した思いで
- 95 :
- お前ら知ってるか
Pythonの構文解析はgoto文の状態遷移なんだぜ
あれ見てPythonは業が深い言語だと思ったわ
まぁあれが一番早いんだろうけど
- 96 :
- ツリー探索なんか待ち行列を使えば非再帰に変形できるからな
- 97 :
- C言語で記述可能かどうかって意味なら
どんなものでも非再帰に変形可能
- 98 :
- >>95
構文解析とかは大抵そうだよ
最近は使ってないから変わってるかも知れんが昔yacc/lex使った時の出力はgoto使い捲くりだったし
- 99 :
- >>85
関数の最初に「返り値と関数名と仮引数リスト」を書くでしょ。
それだけの情報があれば関数を呼び出すには十分なのだ。
…と、構造体名の前方宣言みたいな説明でケムに巻いてみる。
- 100 :
- ソースコード上ではあたかも再帰が可能かのように見せかけてるだけでしょ
そういうウソをコンパイラは演出してくれている
100〜のスレッドの続きを読む
Qiita
OpenGL/Vulkanスレ Part22
1行ずつC言語を書いてくスレ(目標なし)
VBScriptについて必死に話し合うスレ
【MACRO】Google Apps Script 質問スレ【DRIVE】
バージョン管理システムについて語るスレ10
プログラム関係の雑誌について
Visual Studio 2017 Part6
ふらっと C#,C♯,C#(初心者用) Part144
結局プログラム作るのってWinとLinuxどっちがいい?
--------------------
【まよんぬ】森田真結子【DOP】 Part.108
ほかおにチャットヲチスレpart6
[和楽器隊] 和楽器バンド★part1 [洋楽器隊]
【ドッグフード】工場で20年間働いてたけどなんか質問ある?
AAジュビロ Part27
幸せ!ボンビーガール☆8
Power Mac G5 Part 80
1番カスが集まるスレ1673
パチスロ 化物語 106
中原麻衣 Part127
夏のアニソン祭り2019 -STORY- 28th
買って良かったキャンプ用品 Part.10
ポイントファイヤー
エスペラント【ユピピ】
【りかpに粘着ストーカー】唯我こと強姦魔原唯之12-13前科444犯【前科13犯】
【反自国保護主義】 馬渕睦夫5【東ウイグル省】
【TOYOTA】タンク・ルーミー【他】トール・ジャスティ★19
【紙幣】20年ぶりに紙幣刷新の方針 1万円札は渋沢栄一氏【2024年に】
NHK内部告白者 立花孝志ひとり放送局(株) Part181
龍が如く5プレイしてたはずが伊織をプロデュースすることになった
TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼