C言語なら俺に聞け 154
レス数が1000を超えています。これ以上書き込みはできません。
前スレのこれに質問です。
32bitアプリだとmallocで確保していくと2GB近くでエラーになりませんか?
頑張って色々施しても4GB近くが32bitだと限界じゃないんですかね?
もし回避策があるなら教えてください。
999デフォルトの名無しさん (ワッチョイ 7f36-///2)2020/01/14(火) 19:45:37.22ID:MAaOflfD0
>>978
ちょっと待てや
おまえ単一仮想記憶を前提に話してるか?
今や多重仮想記憶が当たり前で単一仮想記憶はかなり特殊な存在だぞ paeのことかしら。それでもアプリが使えるメモリは4gb以下に制限されるみたいだけど アドレスを保持する変数が32bitなんだから
どう頑張っても4GBまで
実際は32bit Windowsの制約で2GBまで
あとは前スレ >>982 の方法しかない https://mevius.5ch.net/test/read.cgi/tech/1566050562/982
>FARポインタを扱えるようにするか
馬鹿いってんじゃないよ!このニワカ!死ね!百遍死ね!
「far/near ポインタ」は 16bit リアルモードでの用語だ しかし別プロセスにしようとどうしようと
結局データのアドレスは受けないといけないので
そのポインタ自体が32bitで管理されてる以上
その限界はどうしようもないような。 >>8
セグメントレジスタとセットで48bitで処理するって意味
(書かなきゃわからないですか?)
CPU的には可能だけどOS的にもコンパイラ的にも不可能だから実質不可能 32ビットだと大きいメモリは最初の方で確保して最後の方で解放するなぁ
あるいはプロセスを分けるか >>10-11
ではお聞きいたしますが、セグメントレジスタ16ビット+レジスタ32ビットのペアで指定した先は何ビット空間ですか?
IA-32 アーキであるかぎり、どうあがいても32bit 空間ではないでしょうか?PAE 搭載であってもユーザーからみえるのはやっぱり32ビットなのでは? 多重仮想記憶ってプロセス毎に同じアドレス空間を提供するだけの話
(逆に単一仮想記憶はプロセッサのアドレス空間を分割してプロセスに提供する)
http://yougo.ascii.jp/caltar/多重仮想記憶
前スレの質問はアプリの話だからあんまり関係ないよ
オーバープロセスとか言うオレオレ用語はよくわからんけど…
オーバーコミットの話じゃないよね? >>14
私の質問に回答できないのですね…
IA-32 では、それが PAE を搭載していたとしても、ユーザーが一度に扱えるのは32ビットどまりですよ
>>10
>CPU的には可能だけど
CPU的にも不可能です windows依存なら CreateFileMapping MapViewOfFile で32ビットより大きいのをやりくり 今、話題になっているのは32bitOSの場合であって、IA-32 どうこうは微妙に違う話にも思えるのは内緒。
ということで話を戻すと、例えば32bit版Windowsには、OS管理外メモリとして8Gだの16Gだの扱うことができるRAM-DISKアプリがあるわけで。
32bitアプリでも、セグメントレジスタに正しいセレクタ値をセットできるのであれば、4G超のメモリ空間を扱える、と言えなくもない予感がする。 386の時代から仮想アドレス空間は64TBだってのに >>18
RAM-DISK使わんでもAPIには上位32ビット下位32ビットの64ビット指定できるから 話の前提は、64bitOSで32bitプログラムを動作させる場合ですね。 できるならやり方を具体的に提示してくれよ
罵り合ってる内容が一切質問者に有益な情報じゃない 64bitOSなら32bitアプリで4GiBまで扱える(ように出来る)
これでいくらかは改善するのでは? >>23
確かにオプション指定でそれが出来ますね。
やっぱりそれが限界でしょうかね。 それでもダメなら
DLLを扱う用の32bitプロセスと
多量のメモリを扱う64bitプロセスに分けて
プロセス間通信でデータをやり取りする >>19
80386 に関していえば、その記述「386の時代から仮想アドレス空間は64TB」はわりとデマ的に流布されていることは理解します。手元の本
https://www.あまぞん.co.jp/dp/4756101305/
にも載っていました、確かに紛らわしい記述だとは思います
セグメントレジスタが指す「セレクタ値」は8バイトごとである、という事実から、セレクタ値のアドレスを意味する部分を16-2=14ビットとして、これと一般レジスタ32ビットとの直積から
46ビット=64T 分のアドレス空間が取れる、という計算だとは思いますが、この記述は不正確であり実情からは程遠いと思います
80386 では、セグメントレジスタが指すセレクタ値にひも付けられているセグメントベースはやはり32ビット空間の中なんです。32ビット空間の外に出ることはありません。 Pentium Pro の時代から64GiB扱えるわけですが
Windows Server系は32bitでも64GiB使える(ものもある)わけですが
問題はフラグメントなのでアドレス空間が広がれば解決するわけですが >>29
セグメントレジスタが指すグローバルディスクリプタテーブル(GDT)中の一つ一つのエントリー(セレクタ値)に含まれる情報の配置状況が 80386 から変わっておれば、あなたのおっしゃることは理解できます
pentium を例にそれを示せますか? >>6
ググっても出てこないので、正確な技術用語を教えてください 大きいメモリをできるだけ上位のアドレスで割り当てる
普通のメモリ割り当てなら下位のアドレスになるから
使い分けで断片化の影響を減らせる
VirtualAllocの MEM_TOP_DOWN XPで付属のIMEだかuxtheme.dllあたりが中途半端なbaseaddress指定してあって1ブロックとしては700MBくらいまでしか確保できなかった思い出 2つスレッドがあってサブの方を使わない時は
こんな感じで待機してるんだけどやっぱマヌケかな?w
その都度作った方がやっぱいいの?
while(flag){ Sleep(1000); } 間抜けというか、完全に寝かせてしまえばいいのでは? >>38
環境を書かないと
WindowsならDefWindowProc呼び出すとか
Unixならselectでイベント発生を待っているとか >>38
それは簡単のように見えて、実は奥深いプログラミングのテーマの1つかもだけど。
問題がないのであれば、そのコードはマヌケでもないし悪くもないので、そのままでいいと思うよ。 >>39-41
環境はWindowsです。
スレッドは二つだけでサブも結構使ってるので
flagで管理して動かしたい時だけTRUEにしてる感じです。
特に動作に問題はないのでこのままでいいんでしょうかね。 リソースの競合がないんなら好きにすればいいけど、
あるなら、動いているように見えて低い確率で破綻するってのもあるよ >>42
問題がない以上、NGにする理由もないわけで、このままでいいです。
言い換えると、何か問題があるなら、それに応じた修正や変更の必要ありかもです。 >>43
一応そのへんは気を付けてるつもりなので今のところは問題ないですね。
>>44
分かりやすくていいので問題ないならこのまま行こうと思います。
ありがとうございました。 呼んでから起きるまでのタイムロスはどうでもいいのか >>46
そこはOKです。瞬時に処理してくれなくても問題ない処理なので。 >>38
イベント待ちがスマートでは?
サブは WaitForSingleObject でイベント待ち
サブを動かす時は メインスレッドから SetEvent する >>38
すげーマヌケに見える
スレッド作成する時間も惜しいなら>>48が言うようにイベントとかを使うべきだし、そうでないなら自分で言ってる通りその都度作った方がいい
そもそもサブともうひとつのスレッドとのやり取りはないんか? スレッドプール用のapiあるんだからそっちのが良くない? >>48-51
ありがとうございます。参考にさせてもらいます。 POSIXスレッドなら cond wait みたいなの使うのがよさげ 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なんてしないでしょ? %s とarrayで文字列表示できるじゃん
*(char*)arrayなんてしないでしょ?
じゃなくて(char*)arrayだわ
みすった >>56
添字つけない場合は配列の先頭のメモリアドレスを持つポインタなんだがw >>56
例えば
int array[40][40];
array[30][30]=10;
int *p;
p=array;
*(p+(40*30)+30)でarray[30][30]にアクセスできる 型に互換性があることと、型が同じであることは異なる。int[20][20]はint*とは互換性がない。 配列はアドレス値を動かせない。
配列とポインタではsizeofの値が違うことがある。
多重ポインタと多次元配列はメモリレイアウトが異なる。
よって配列はポインタではない。 2次元配列は各行の配列が配置されてるメモリ上のアドレスのリストですか?
その場合、そのリストの要素であるアドレス値はどうやって取り出せますか?
https://i.imgur.com/Ibk3T9G.png この場合で言う、データの列の10,20,30というようなアドレス値を取り出す方法はありますか? 1つの配列は連続した1つのメモリブロックになっている。二次元配列も1つのメモリブロック。配列の中身は実体。
配列名のみを指定すると配列の先頭へのポインタと互換になる。 int array[10][2]はint[10]が2個あるという意味ですか? ではそのint[10]というのを行と呼ぶとした時、なぜこの実行結果では行間のアドレス間隔が行数になるのでしょうか。
https://i.imgur.com/CIV0x2N.png >>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 でないものとなる int three[2][3][4];
これは4の配列が3個で、それが2個ということでおk? そうじゃない
int [3] [4]が二個
って考える
そのあとint[3][4]について考えると
int[4]が3個ってなる 静的に確保された多次元配列の実態はただの1次元配列だから
int array[2][2] = {};
array[1][0] = 2525;
printf(“%d\n”, array[0][2]);
ってやると2525が出力される 再帰むずすぎてハゲそうだわ
これなにやってるかパット見て分かる人いる?
int rec(int num) {
printf("%d\n", num);
if (num == 1)
return 1;
else {
return num * rec(num - 1);
}
} 再帰の例で一番出てくるヤツ
if の中はゼロとの比較の方が良いと思う rec(1) = 1
rec(n) = n * rec(n-1)
漸化式による記述 >>78
rec(3) 位にして自分でトレースしてみればわかると思う 再帰のコードを書いていて不思議な気分になるのは
なんで今書いているものを呼び出せるんだろうとか思っちゃうからかな 単純なループですむならその方がいいだろうな。
木構造の探索みたく本質的に再帰で書いた方が自然なものは再帰のがいい。 今時〜が遅いと言い放てる環境ならまず今時Cを使う意味がない 再帰でなければ実現できないアルゴリズムがあるとすれば,例えばどんなの? > でなければ実現できない
という要件が気になる。 迷路のルート検索に再帰で書いた事あるけど10000ぐらいでスタックオーバーするので再帰をループで書き直した思いで お前ら知ってるか
Pythonの構文解析はgoto文の状態遷移なんだぜ
あれ見てPythonは業が深い言語だと思ったわ
まぁあれが一番早いんだろうけど ツリー探索なんか待ち行列を使えば非再帰に変形できるからな C言語で記述可能かどうかって意味なら
どんなものでも非再帰に変形可能 >>95
構文解析とかは大抵そうだよ
最近は使ってないから変わってるかも知れんが昔yacc/lex使った時の出力はgoto使い捲くりだったし >>85
関数の最初に「返り値と関数名と仮引数リスト」を書くでしょ。
それだけの情報があれば関数を呼び出すには十分なのだ。
…と、構造体名の前方宣言みたいな説明でケムに巻いてみる。 ソースコード上ではあたかも再帰が可能かのように見せかけてるだけでしょ
そういうウソをコンパイラは演出してくれている >>85
実際に再帰呼び出しが実行されるのはその関数が書き終わったあとなのだから何の不思議もないような気がするが。 そもそもC言語の再帰をコンパイルして出てきたマシーンコードって
スタックに積んでgotoしてるだけのループじゃん 本物の再帰を実現できる無限のメモリーなんて存在しないじゃん
だから現状は擬似再帰、
しかもあと500年くらいは擬似再帰で我慢してもらうしかない 再帰は再帰専用のメモリースペースを使うから限界がすぐくるだけやぞ 今の科学力では本物の数学的な再帰なんて実現出来ない、
だから、擬似再帰に留まってる
あとは実数マシンと整数マシンで、現状は離散的な整数マシン
実数をそのまま扱えるマシンすら存在してない コンピューターに限界がある
なんてことは誰でも知ってるから
いちいち書かなくても良いよ だな
>>102が言うからには他の言語ではもっと画期的な方法があるのかと思ってた >>105
「アナログコンピュータ」ってのがあって、俺がいじったのは
その都度回路を組んで信号を送って電圧計の針の振れを観察するんだが、
あれは一応、物理の限界の精度で実数をそのまま扱うマシンだね。
このスレッドで扱う対象じゃないけど。 アナログと実数には遠い溝が...
精度はデジタルの方がはるかに上 >>54
そんなキャストはしてはいけない
お前の使い方が間違ってる
敢えて括弧を付けるが正しいのはこの二つだけ
printf("%d\n", *(array[0]));
printf("%d\n", *(*array)); 無駄なだけの「正しい」括弧なんかやめれ
printf("%d", (*array)[0]); //少なくともこれの意味がわかるようになるまでは 丸括弧の次に優先順位が高い角括弧ってだけの話じゃん
識別子に最優先くっついてガツンと先に作用するて意味じゃわかりやすい関数等の丸括弧を除いて最強という。 >>117
なんか演算子の優先順位をいい加減に覚えてそう。C言語のBNFでも見てきたら? + と << が混ざった演算
( ) を付けないと警告を出すアホコンパイラがあるんだよね ウィキのバスエラーの所に出ているサンプルをVisual Studioでコンパイルしたんですが
デバッガで見てもゴミ値が入るだけで特に警告もエラーも出さないので
バスエラーになっているかいないか分かりません。バスエラーを体験するにはどうすればいいですか?
コンパイルオプションで対応出来ますか?
https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%B9%E3%82%A8%E3%83%A9%E3%83%BC x86はアラインメント不整合でも正常に読み書き出来る
AVXレジスタで
アラインメントが整ってないと使えない命令があるから
それを使えば例外発生する
MOVAPS など int main(void)
{
return *(int *)0;
}
の方が簡単 >>123
それセグメンテーションフォルトでは?バスエラーになるCPUあるの? リードアクセスだしなあ
0番地が未実装というのは考えにくいね そもそもバスエラーとかセグメンテーションフォールトは、CPUの例外等をOS側で適当にマッピングして、そう呼ぶOSがあるというだけだからOS依存。
x86/x64のCPUで>>123のような適当なメモリアクセスを行うと、CPUで例外#GPや例外#PFが発生する。UNIXならそれを状況に応じてセグメンテーションフォールト(SIGSEGV)やバスエラー(SIGBUS)として扱い、WindowsだったらEXCEPTION_ACCESS_VIOLATIONとして扱う。
アライメントがずれている時は、発生した例外#ACをバスエラー(SIGBUS)やEXCEPTION_DATATYPE_MISALIGNMENTとして扱う。 ASを出してから一定時間経過してもDTACKが帰ってこないとBERR端子をぶっ叩かれてバスエラー 68K通った人からするとアライメント不整合はアドレスエラーの印象が強い スパッと例外で死んでくれれば良いんだけど
単にズレるだけってCPUがある int i;
int *pi = &i;
*((int *) (((char *) pi) ÷ 1)) = 1;
x86はこれがバスエラーにならないね >>130
÷は+だとして、
eflagsのACビットを立てておくとバスエラーになる そもそもx86だとバスエラー発生が無理なんではないのか? >>129
ARMのCPUでアラインメントの整合を怠ったら
偶数番地/奇数番地か、その2倍のアドレス値だったか
データの半分しか書き込まれなくて…って事態を目撃したことがある。
素朴なビットマップグラフィックのプログラムだったので
画面がシマシマになるのが文字通り目で見えた。
同じソースをx86系で実行すると期待通りの結果になるんだよ。 >>130
>>133
// x64 linux
volatile int x[2];
int main () {
asm("pushf");
asm("btsl $18, (%rsp)"); // set AC
asm("popf");
// *(int*)((char*)x+1)=1; // SIGBUS
asm("pushf");
asm("btrl $18, (%rsp)"); // clear AC
asm("popf");
return 0;
} >>135
130です
130のように書くとバスエラーがなければ ip を破壊する可能性が高いし、最適化でコードが生成されないためのケアもされていて思慮深いコードですね…
しかしGASのオベランドは逆に見えてしまって… やはりアセンブラの領域にまで踏み込まないと無理なんでしょうね >>138
本当ですか?
二方向以上への再帰をループに起こせる自信は私にはありません 枝分かれするとき、「今は進まない」方向を待ち行列に並ばせておいて
あとで対応しにくればええやん 複数関数をまたがる再帰
関数コールがたくさんの箇所で行われる
こんなヤツだとループにするのは非常にメンディー
可能ではあるけど クイックソートの非再帰実装とかあちこちに転がってるから勉強しとけ。
待ち行列じゃなくスタックな。 >>144
キューでも再帰実装できるし別に良くね? >>148
太い枝から積んで順にやってけばええんやで 一般的には
パラメーターとローカル変数とコール位置
などの情報をスタックに積んでいく
機械的にやるならこれしかない
ほぼ再帰と同じ処理になる
機械的にやらないなら場合によっていろいろな方法がある >>149
太い枝の意味が分からんが、処理の順序が変わってしまうような変更はダメじゃね?
元の再帰のコードが必ずしもその太い枝の順とは限らないし、そもそも木構造とは限らないだろう。 再帰の代替なら素直にスタックでやった方が楽だよな。ポインタ1つで済むし 再帰ではスタックを使うからって
そこで脳硬化症にかかると。。。 本物の再帰を実現可能なマシンなんて存在しない
全部はスタックに還元するしか無いんだから
再帰だなんだと騒いでも結局現行のスタックやアドレスでどうにかなるじゃん
本当に再帰でしか書けなくなるのは本物の再帰を実行可能な再帰マシンが出来てからの話 >>156
よく分からないんだけど、本物の再帰ってどういうもの?
スタックが有限だということを除いて、今のC言語の再帰関数の実現方法と本質的には何が異なるの? 再帰ソムリエの俺からすれば疑似再帰など下の下
本物再帰こそコードに埋め込まれるに相応しい
芳醇な香りと甘酸っぱい味わい たとえ64bit空間(16EiB)でも「真の」再帰はできんぞ?
どこかで必ず再帰を諦めるかクラッシュする可能性が排除できない 俺、斎藤再帰、17歳
今日も玄関から出続ける登校が始まるぜ!
エンドレスナイト! >>160
真の再帰ってなんですか?160がどくじにかんがえたさいきょう再帰ってことでいいですか? >>172
必ず再帰を諦めずクラッシュしないという定義が>>160に書かれてあるように、オラには見える。 赤い目を光らせて再起動
I will be back! どっちかつーと溶鉱炉で自分で自分を吐いているT-1000の姿が再帰に近いだろう お前ら再帰してるときのプログラムの気持ち考えたことあるの?
俺はある
ちょっと恥ずかしいんだよな、自分を省みるみたいで 俺はCPUの気持ちになってるよ。
「ちょ、おま、いまのとこほっといて、またそっち行くわけ?」
「え、戻れるように退避してる?ならいいけど……」
みたいな。 結んでいたはずの命綱をたぐり寄せると全部手元に来てしまったw AIは兵士をメカで作らない。たぶん生物兵器であろう。
ターミネータは嘘っぽい。エイリアンの方が本当っぽい。 c言語で書く金融アプリケーションの事例がいくつか知りたいのですが! >>187
金融なら、Haskell・OCamlでC言語ソース生成くらいグリグリやってんとちゃう? >>187
疑問文なのに何で末尾に!を付けるの?
質問していると言うよりクレームつけてるみたいだなw 4GLとか使って「COBOLの範疇」で書いたつもりになってるやつらが
縁の下の力持ちを知らないのか無視しているのかどっちでもいいが
悪いが鼻で笑わせてもらってたね
俺が見てた事例ではCじゃなくアセンブラだったが 元来、俺はそんなに皮肉屋じゃないはずなんだが
連中の上から目線がそうさせていた いや、まあ、CでCOBOLコンパイラ作る事は可能だろうけどね。 何十年か前、GCCをベースにシステムを作った金融サイトがあることはある
GPLに触れないようライブラリは全部自前で用意してた
端末、サバクラのやり取り、サーバー間のデータ交換、全部Cで作ってた みなさんありがとうございます
(googleもみると)あるにはありそうな気もするけど
やっぱあまりよくないのかな。強烈に速度がほしい。 一方でIoTや組込的な決済プログラムは結構あるそうな。
C言語は安心して使えるから好きなんだよね。 業務アプリケーションまで持って行くのが割と大変だと思う
例えばお金の計算させるにしても、概算で良いなんてことは普通無いし
そのライブラリ作っても、信頼性の検証もしないと行けなくなる
預金システムなら、安全堅牢なファイルシステムも工夫しないといけない
趣味や学習として作る分にはとても興味深いものがあるけれど
実用するには、それを得意とするミドルを利用する方が無難だと思う >>202
>お金の計算させるにしても、概算で良いなんてことは普通無いし
今は uint64_t があって、ほとんどカバーできますよ なにそのトンチンカンな発言
足し算引き算しかしないと思ってるの? 1844京6744兆0737億0955万1615円まで扱えるなら
全人類の富を表現できるけど
10銭が循環小数になっちゃ困るね 10銭を1単位にすりゃいいんじゃね?
表現できる最高金額が1桁減っちゃうけど じゃあ1銭は循環小数でいいのかって話
きりねえだろ >>208
じゃぁ今現在のシステムではどうなってんの? >>209
10進数で計算するんだよ、2進数じゃなく >>211
そうじゃない
例えば円を単位としたとき小数点以下何桁まで保証してるのかって話 >>212
それは場面場面で色々だ
任意精度演算ってやつ >>213
はぁ?
きりがないんじゃなかったのか? 一銭二銭、あるいはそれ未満を扱うのなら、uint64_t を固定小数点で使えばいいだけでしょうね
>>205
>足し算引き算しかしないと思ってるの?
お金の計算なんて 9 割が加減乗除で済むのでは?
お金の計算で特に必要で特別な計算ってなにかありますか? >>211
10進で計算しなければならない、その必要性はなんですか? >お金の計算で特に必要で特別な計算ってなにかありますか?
複利計算で累乗 >>215
例えば複利計算とかなら小数の計算の精度を厳密に規定しないと問題になるはず。専門外だから詳しくは知らないが、法律か金融機関ごとにでも決められているんだろう。
お前みたいにお金の計算はお小遣い帳をつけるくらいにしか使わないなら整数だけで問題ないだろうけど。 古い言語なのに意外と10進演算ライブラリとかもないですよね
個別に作ってるだけかもしれませんが >>218
小数点以下の丸めでは、例えば「五捨五入」のもあるみたいですし
でも「厳密に規定」とかいうほどの難しい方法はないとおもいますよ、普通に固定小数点の整数で問題ないのでは?
>>219
10進演算、って普通の整数の加減乗除とどう違うのですか? 計算機ができる前は人が筆算してたんだよ、勿論10進で
それと合わなきゃならないの
だからBCDとかやるの
精度が確保されてればより正確なんだけど、「本当はこっちの方がより正確です」はダメなんだわ
それまでと変わっちゃダメなの >>220
色々種類はあると思うけど10進数で小数点を扱えるんですよ
また丸め処理も10進数で出来るのですよ >>221
はい、8086 AAA, AAD, AAM, AAS 等の10進補正命令は知っていますが、今から考えても何故にアンパック形式10進なる形式を作ったのか、普通に2進整数+固定小数点では何故だめだったのか、納得できる理由をずっと探しているのです >>222
つまり「人の作業との突合せ・検算のために10進演算や BCD があった」ということですか?
でも、そうであっても普通に 2 進整数+固定小数点の演算で問題ないと思うのですが
>>223
BCD で出来る、ということを知りたいのではなく(なぜならばそれはすでに知っているから)、なぜ BCD が必要だったのか、という理由が知りたいのです 金融業界の習わしの発端について知りたいなら、それ関係のスレで聞けばいいんじゃね?
金融関係システムが10進で計算してるのは常識なんだし要求要件なんだから
それに疑問挟んでごねるプログラマーにはシステム開発発注したくねぇなぁ 単純に考えて、「(10進)小数点以下N桁目で四捨五入する」なんて規定があるときに
2進固定小数でやるのは面倒くさいじゃん。 >>214
どこで四捨五入するかなんて
プログラムじゃなく経理さんのルールだかんね
プログラマはそれに合わせるってだけのこと >>228
だったら固定小数点で良くね?
きりが無いなんてことはない そもそもお金に0.1円とかないから四捨五入は必要ない 固定か浮動かって問題じゃない
10進の0.1が2進では0.00011001100110011001100110011...という循環小数になり
金の話では出てこないはずの誤差が出るって話だ
最小単位が1円のときは10銭、10銭のときは1銭が2進演算では正しく扱えない
最小単位をいくらにしても同じことというのをキリがないと言ったんだ >>231
最小単位以下の誤差なんて累乗計算でも出るじゃん >>230
\1,000,500_に源泉税率10.21%を掛けたらいくらになる? >>232
誤差の出方が10進と2進では違うって話 誤差がでてもそれよりすごく大きい数で四捨五入するんだから同じだろ >>234
性質が違っても誤差は誤差
あんた金の話では誤差は出ないって言ったばかりだぞ
鳥頭か? 10進数では、1/3 が循環小数で、
2進数では、1/10 が循環小数って、言うだけ! >>236
それは間違ってるぞ
同じ計算を他のところ、たとえば税務署でやったら結果が違うなんてことになるとまずいだろうが 10進数で手動で計算するときと同じ誤差のでかたじゃないと駄目なんじゃないか? 問題なのは四捨五入じゃなくて
2進数だと0.1が表示できないってことじゃないのか?
10進数なら0.1から0.9まで全部表示できるけど 計算機イプシロンでいいだろもう
今回の低レベルの諍いについてvoid君はどう思う? 結果の型とか四則演算方法とか単純な話じゃなくて
金融系の計算て数学やコンピュータの世界の常識とは違う計算をするんだよ
式自体からしておかしくて詐欺っぽいのもある
>>226の言うとおり 100万円を利息年3%で借りた時
1年で利息はいくら? そんなもんどんな返し方をするかがわからんと解析解さえ出ない >>226
>金融関係システムが10進で計算してるのは常識なんだし要求要件なんだから
金融関係の業務でシステム内部表現まで10進表現(BCD等)にせよ、とする理由は、あなたはどのように推測しているのですか?
私は、金融関係であっても多桁長演算+固定小数点で顧客の要望は十分に満たされると考えますが。
金融系発注側も単に「double は使わないで」くらいの意味でしかないのでは?そして現実の実装も多桁長演算+固定小数点だったりするのでは?
あなたの >>226 の記述には合理性を感じることができません >>227
その場合、小数点以下N桁目、あるいは余裕をみて N+4桁目くらいを考えて
10^(N+4) 倍して整数1 と内部表現 10^(N+4) を一対一対応とすれば整合性はとれるのでは?(これを固定小数点といいます) >>231
10進の1 の内部表現を 10, 10進の2 の内部表現を 20, 10進の3 の内部表現を 30 …、10進の0.1 の内部表現を 1
という固定小数点にすれば、 お金の計算のような演算では十分なのでは? >>242
まあ五捨五入というのは、よそではあまり聞かないですね 値を保持するだけなら何でも良いよ
保持出来るだけの精度が有れば
固定小数点だろうが整数部と小数部だろうが
10進浮動小数点だろうが
BCD整数だろうが
計算の方法、式、丸め方が特殊で
途中の型も特殊だったりする
これに多くの評価が必要
だから
結果の型だけを語るのはトンチンカン >>246
一回計算する毎にいちいち2進に戻すのにそんな手間かけるより10進演算器用意する方が効率的ということ 手間とか効率とかの問題じゃなくて
値の一貫性の問題
最終的に得る値が整数だとしても
途中の計算精度や丸め方によって誤差が微妙に異なり
結果1円の誤差になりました
じゃダメなの 途中の計算精度があれば良いってわけじゃない
100桁精度でも無限精度でもダメ
決まってるロジック通りの結果を返さなきゃダメ
数値計算と思わない方が良いかも 決められてる通りのロジックで返した時の値との差が誤差
誤差は一切許されない
これがお金の計算 オンラインゲームも一貫性が必要だったりする
対戦相手と結果が異なってはまずいので
そういう部分では
厳密にCPUでもGPUでも同じ値である必要かある わかったぞ
十進数だと0.5円になるときには四捨五入すると1円になるけど
2進数の時0.4999999999円みたいになった時0円になっちゃうってこと? 0.1円の誤差をなくすために0.1円以上掛けたら意味なくない? 1円でも誤差があると帰れない銀行員の話とか知らない? 日本が異常なだけでしょ?
アメリカとかだと1円払って終わりじゃね? つまり
10進で計算するのは,10進で計算せよというロジックがあるからであって,循環小数を避けるためではない
ということか
そういうことなら誰も文句ないんじゃね? >>256
0.5 は、2進数の1/2 だから、割り切れる。
0.25 は、2進数の1/4 だから、割り切れる
だから、0.5 + 0.25 = 0.75 も、2進数で割り切れる
でも、0.1 は循環小数になるから、
0.1 * 5 != 0.5
これは不一致!
情報処理の初級資格の内容w
これを勉強していない人は、プロじゃない!
つまり、お金の計算では、誤差のある浮動小数点演算は使えない!
Decimal を使う もういいわ。
おまえ等のプログラムじゃ金の計算できないわ。
エクセル使う。 三人で三等分して、構成比を%で表示しろと言われ、
何も考えずに計算結果出して見せたら、
合計が100%になってないと文句を言われたw >>250
>一回計算する毎にいちいち2進に戻すのにそんな手間かけるより10進演算器用意する方が効率的ということ
いいえ、値の保持と計算はずっと 2 進+固定小数点のままで行い、人間に値を見せるときにはじめて 2 進→ 10 進変換を実施します
>途中の計算精度や丸め方によって誤差が微妙に異なり
お金の計算における丸め方法の規則は、四捨五入にしても五捨五入にしても 10 進法整数に親和的なのだから、多桁長表現+固定小数点で表現すればかなり厳密に扱えるとおもいますよ >>263
>Decimal を使う
Decimal の内部表現方法に興味がありますね、まさか、今でも BCD だとは思えませんが(x86_AMD64 でも関連ニーモニックは消えました)、もしかして?! 小数点の位置と整数の2つの情報で10進数の少数は誤差なくあらわせるよ >>267
丸めは計算ごとに適用されるんだよ、馬鹿。 >>270
0.1は1番目に点がある1だから1と1で表せる 機械語なら商と剰余はたいていいっぺんに計算できるけど、Cからそれらの機械語が使われると期待していい書き方ってどうすればいい?
10年来の疑問 >>267
>>いいえ、値の保持と計算はずっと 2 進+固定小数点のままで行い、人間に値を見せるときにはじめて 2 進→ 10 進変換を実施します
>>271
>丸めは計算ごとに適用されるんだよ、馬鹿。
そうか、確かに私にも落ち度がありました、2進整数+固定小数点ならば、丸める桁まで 10 で割り続けて余りを求める必要がありますね、これはほとんど2進→10進変換といっていいですね
しかし、全桁を 2進→10進する必要はなく、丸める桁までで 2 進→ 10 進するだけでいい
x86-AMD64 では 8086 時代の BCD 補正命令は全部なくなってしまったことから考えても、「Decimal」型は整数+小数点位置なんじゃないかな… >>252
鳥頭をそのまま返す
すまんが俺は介護人でも保育士でもない
おまえの相手は疲れすぎる >>277
IEEE754にも10進数があるから見てみれば >>278
で、あんたの言ってる誤差ってなんなのさ
説明できないの? >>282
説明はもうしたんだよ鳥頭野郎
てめーで過去レス探せ
他のやつにじゃなく
おまえさんにレスアンカーつけて書いたぞ >>283
あんたの言ってる誤差は循環小数云々の誤差ということでいいのか? 盛り上がってるなー。
が、なんか思ったのと違う進行。。 >>286
軌道修正してくれたまえ
このままでは銀河系脱出してしまう >>219
そりゃーC言語よりも古いCOBOLがあるもん
銀行案件は全部そっち任せだろ
だからそういうライブラリを発達させる必要が無かった
COBOL最盛期がいつかは知らんがきっとIBM最高益の時代あたりだろ >>274
普通に書けば最適化してくれる場合もある。
とりあえず gcc -O2 とやってみた。
extern int w,x,y,z;
void foo( void) {
y = w / x;
z = w % x;
}
int bar( int x,int y){ return x / y + x % y;} 割り算は遅い
スーパーコンピュータでも遅い
定数の割り算で済む所は定数に
並列化可能ならSIMD命令で複数一気に >>285
まあそういうことだ
おまえさんにとっての関心事に関係するかどうかは知らん
さっき言ったとおり、俺は保育士じゃないんで他人ん家の坊ちゃん嬢ちゃんは扱えない
プラレールだかリカちゃんだかの相手はしてられない >>290
タンジェントは遅いか?
べき乗は遅いか? タンジェントもべき乗も遅いけど
使う頻度的には割り算より圧倒的に少ないし
見るからに遅そうだから気を付けるだろう
割り算や余りは手軽に使いがちで遅い
例えばSkylakeでは加減乗算の100倍くらいかかる
割り算と余り両方使うなら
以下のように書いた方が良い
c=a/b;
d=a-c*b;
除算命令を2回呼ぶことはなくなるし
bが定数なら乗算に置き換えてくれる
ライブラリだとbが定数でも除算命令を使ってしまうと思う 除算が遅いってのは常識だな
浮動小数点数演算の話だが2回以上同じ数で割るなら逆数を取っておいてそれを掛けろと習ったわ
そもそも浮動小数点数演算が圧倒的に遅いから可能な限り整数型で済ませろとも 浮動小数点が圧倒的に遅いかどうかはCPU次第
PCなら速いし
CPUに命令がなければソフトウェア実装になるので遅い
この場合、当然floatよりdoubleの方が遅い
(floatもdoubleも32bitの環境もあるけど)
浮動小数点の割り算は
定数であれば1個でも逆数をかける方が良い
x / [定数] と x * (1.0/[定数])
で値が異なることがあるため、最適化してくれない場合がある 割り算と余りを一回で計算できる命令がCPUにはあるのよ 浮動小数点が圧倒的に遅いといっても
使い所では使った方が良い
速度が関係ない所では
無理やり整数演算に直すデメリットの方が多い
>>297
除算が圧倒的に遅いから>>293でもほぼ同じ
定数であることまで考えると>>293の方が良い 割り算が100倍掛かるって嘘じゃない?
調べたら掛け算より少し遅いくらいだけみたいだけど 浮動小数点の除算はニュートン法使うからそれほど遅くない。乗算の数倍程度。
整数の除算は基本的に高速化できないのでだいぶ遅い。
整数でも定数で除算すると逆数の乗算プラス補正で実装されるので速い。
アセンブリ出させて見てみるべし。 instlatx64でSkylakeの64bit命令の
スループットを見ると
IDIVはフルビットで95クロック
ADDは0.33, IMULは1クロック
AVX命令だと乗算や積和も0.5クロック
遅くて使われなくなったFSINが130クロックだから
遅さがわかると思う
コンパイラはなるべくこの命令を使わないで済むように
また使う回数をなるべく減らすよう工夫するんだけど
標準ライブラリの場合はIDIVを無条件で使ってしまう 浮動小数点だと差はちょっと縮まる
加減乗算と積和は0.5クロック
除算は倍精度スカラーで4クロック、ベクタで8クロック
倍精度浮動小数点の積和演算が4個同時に出来る命令が
毎クロック2個ずつ実行出来るのに
ただの整数除算1個が95クロックもかかる
遅さがわかるでしょ? 100倍掛かるなら100倍時間掛かるはずでしょ
そんなわけ無いじゃん 除算器をパイプライン化することで
スループットは上げられても
レイテンシは変わらないかんな 以下のプログラムのb_testにはなぜ0x3322ではなく、0x4433が代入されるのでしょうか?
#include <stdio.h>
typedef struct
{
unsigned char a;
unsigned short b;
} TEST_2;
int main(void)
{
unsigned char bytes[] = { 0x11, 0x22, 0x33, 0x44 };
TEST_2* pMemoryDevice = (TEST_2*)bytes;
unsigned char a_test = pMemoryDevice->a;
unsigned short b_test = pMemoryDevice->b;
printf("0x%X\n", b_test);
return 0;
} >>309
aliasing rule 違反やアライメント違反の可能性などにより未定義動作なので 0x4433 になるとも限りません。
対象の環境を限定して何が起こっているか知りたいならアセンブリを出力してみるのがいいと思います。 >>310
アセンブリ出力してみてみたんですが、そもそもなぜそのようになるのかが疑問です。
この場合、"0x11"がBYTE, "0x22, 0x33"がWORDのバイト配列を構造体で表したい場合どうすればいいのでしょうか? bは2バイトだから2バイト境界になるように詰め物をした
コンパイラやCPUの仕様 環境依存
#pragma pack とかコンパイルオプションで
変えられたりする >>311
「構造体 パディング」でググって
パディングなしを指示する方法は標準にはないから環境依存
__attribute__ ((packed))とか#pragma pack(1)とか #pragma pack(1)を使うことによって解決しました!
ありがとうございます。
今まで結構バイト配列を構造体に割り当てるってことをしてきましたが、気づきませんでした、、 できるかできないかアーキテクチャ環境依存だし、
できても遅くなる可能性もあるので注意 そもそもunsigned charの配列をキャストしてる時点で unsigned charの配列をキャストしてる時点で何?
309は構造体の性質を調べる実験をしていて
そのために普段しないことをわざとやってるんだが ネットワークやファイルから読んだバイナリの塊を構造体に当て嵌めて解析を楽にするなんてことは、よくやる。
まあ、本当だったらバイナリから読んで構造体側にコピーするような関数を作った方が良いんだろうけどね。(またはPerlのunpackみたいなやつ)。 そういえばsscanf()と似たような感じでバイナリとフォーマットと可変引数で代入先ポインタ並べて渡すとバイナリ側から読んで値入れてくれるようなPerlのunpack風な関数も作ろうと思えば作れるね。 >>319
それをビットフィールドでやって大失敗したことある
ビットフィールドの並び順がコンパイラ依存なんて知らんかったんや コンパイラ依存や環境依存はビックフィールドだけじゃない あの大事件の裏にはこういうミスが隠されているのか…… 漏れが、新幹線のチケット開発してた時には、ビットフィールドなどは使わなかった
全てのバイト内で、データの位置を決めて、ビット演算でやっていた 309のb_testの数値ってなぜ0x3344じゃないの?
それすらわからん
ここのスレレベル高いな 机上でガタガタ言うだけで満足するやつもいれば
実際に境界違反すると何が起きるのか自分の目で目撃したいやつもいるのさ
俺は後者に共感する 問題なくアクセス可能
例外発生
ズレてアクセス
性能以外の振舞いこのくらいは経験がある
他にあるかな?
ズレてアクセスされるCPUは
問題が分かりにくく厄介 机上も重要
CPUのデータシートやコンパイラの説明書は当然見ないと
ズレてるスタックポインタをずらしたまま使う意味とかわからんでしょ 机上がいらんとは言ってねえよ
何のための机上か考えろということだ ビットフィールドって環境依存なのか
分かりやすくて良いのに… 定義しただけじゃ構造体のアライメントを算出してくれないコンパイラがあるんだなー
union { ;static{ al,ah;ググってて遭遇ちょっと新鮮な驚き
実体を作らず、ポインタキャストでのみ利用してっとグチャゲチャなアドレスを引っ張ってくるみたいな AAと出力されて欲しいのですがなぜ4バイトになるのでしょうか
https://ideone.com/0v6mPr charを引数として渡すとintに格上げされる。
charがこの環境ではsigned charらしいので、0xAAはマイナス扱いされる。
intに格上げするときに符号拡張されて上位24ビットが1で埋められる。 >>345
ありがとうございます
そもそもunsignedつけ忘れてました こうする、とか
printf("%0X\n", *(unsigned char*)u);
printf("%0X\n", (unsigned char)u[0]); 質問させてください。
ある.dllを作成するCのプロジェクトがあるのですが、開発環境をeclipseからvisualstudioへ移行しました。
このdllを使用する別のCのプロジェクトがあるのですが、eclipseでビルドしたdllは使用できていたのですが、visualstudioでビルドしたdllを使用しようとすると未解決エラーでビルドできなくなってしまいました。
作成した.libファイルをdumpbinで確認すると、eclipseでビルドしたものには関数名にいろいろ装飾(@とかcdeclとか引数とか)がついているのですが、visualstudioでビルドしたものには装飾がついていませんでした。
この違いが原因だとは思うのですが、visualstudioでも関数名に装飾がついたlibファイルを作成するにはどうすればよいのでしょうか? >>351ですが、dllを使用する側のプログラムに「c++コードとしてコンパイル」を設定していたせいで読み込めなくなっていることがわかりました。
質問内容についても、CとC++の違いについて調べていけば良さそうとわかったので、自力で調べてみようと思います。
ありがとうございました。 回答しようと思ったけど自己レスが付いていたので控えます。
自分で調べて下さい。良い心がけです。 >>352ですが解決しました。
c++ではマングリングが行われるためソースコード上の関数名とコンパイル後の関数名が異なる
一方cコードとしてコンパイルしたライブラリはソースコード上の関数名がそのままコンパイル後の関数名になる
この違いが原因で、c++コードとしてコンパイルされた呼び出し側プログラムではライブラリの関数を参照できなくなってしまっていました
解決策はc++側の関数宣言にextern "c"をつけること。もちろんヘッダーファイルなのでinclude文をextern "c"で囲んでしまうことでした。
たまに見かけるextern "c"ってこういうことだったんですね。お騒がせいたしました。 >>355
extern "c" ではなく
extern "C" 大文字だぞ
それがわかってないのに、よく解決できたな C言語関係ないんだけど、並行処理と並列処理ってさ
論理的にシミュレートするのが並行処理で、物理的にパソコンを二台並べるのが並列処理だよね?
並行と並列と混合してる記事がネットに多くてもやもやするんだけど >>365
合ってる
ユニプロセッサでプリエンプティブは並行処理
並列は小学校で習う乾電池のつなぎ方みたいなもん >>368
>>369
合ってますよね
ネットの記事っていい加減だな つまり別々のcpuなら並列でそうでなければ平行ってこと? 二股かけるのが平行処理、3Pでやるのが並列処理であってる? >>373
二股は平行ですらないただのシングルスレッド処理じゃないか? いや、それぞれは相手を独占しているつもりなので、並行。(平行じゃないよ) 並列と並行を明確に区別する流儀と、同時並行に実行されるなら全部並列、という流儀に別れていると思う。 解釈が二通りあると?
それは問題では
議論できないじゃん >>378
議論出来るように具体的に語れば良いんだよ そもそも同時かどうかなんて区別出来ない、区別しても意味がない事が多い
1コアで複数スレッド動くのはどっち?
とか 並んで行くのが並行
列が並んでいるのが並列
なんでTSSは並行なの?並列じゃダメなの?
なんでデュアルコアは並列なの?並行じゃダメなの? とりあえずこういう時は日本語で考えるのやめようぜ。並列も並行も海外で生まれた概念を翻訳しただけなのでそのまま考えると帰って混乱する。
concurrentは同時。これは時間的な概念。
parallelは並存。これは物理的な概念。
つまり同時に処理するものはなんでもconcurrentな処理と言っていいわけだけど、その中でも処理するcpuも別れてるものがparallelな処理。 >>385
TSSはconcurrentだけどparallelじゃない(ミクロにみればconcurrentでもない)
デュアルコアはparallelだしconcurrentでもある
でいい?
「TSSは並行、デュアルコアは並列」の使い分けを肯定しないってことでいいのかな TSS? 全然関係ないぞ
ユニプロセッサの場合CPUは並行処理で動くが
端末やチャネルは並列だ
マルチプロセッサでもTCASにCPUアフィニティがかかっている場合まであるしな ここで定義をまとめても会話する人全員が共有しないと意味がない
誤解の可能性があるなら
「平行」「並列」なんて言葉に頼らず
具体的に語らないと >>387
TSSでチャネルガーとか頭おかしいのか?
そんなこと言い出したらPCレベルでもシングルプロセッサ、シングルコア、シングルプロセスでもIOが複数同時動作とかあるだろw >>385
これ見て納得した。並行と並列って翻訳した人が戦犯だな。 >>389
失礼なやつだな
でTSSと並行並列は関係あるとでも言いたいのか?
そうでもなく喧嘩売ってくるやつこそクルクルパーにしか見えんぞ >>391
理解したら引っ込んでたら?
>>392
で、チャネルがどうしたって?
知ったかするならもうちょっと勉強しないと恥かくだけだぞw TSSは関係無いの?
>369の
>ユニプロセッサでプリエンプティブは並行処理
ってTSSのことじゃないの?
並行/並列、concurrent/parallelはどっちでもいいよ
単語を置き換えてるだけだ
>365は"「TSSは並行、デュアルコアは並列」と使い分けるもんだ"と言ってるように見える
>368,369はそれを肯定してる
それ本当かなぁどの程度浸透してるのかなぁ、って興味があるだけ >>396
time shareing systemをそのままプリエンプティブと読んでいるのか?
TSSといえばダム端末多数台のマルチユーザーシステムのことなんだが 今俺の興味はそこにはないからどうでもいいんだけどさ
https://www.google.com/search?q=time+sharing+system
その定義のみしかないわけじゃないみたいだよ
単に時分割の意味で使ってたよ
そう読み替えてくれ >>397
> TSSといえばダム端末多数台のマルチユーザーシステムのことなんだが
知識が狭すぎる
ってか今時それしか思いつかないとか老害か? >>399
定義が間違えているなら、正しい定義を示さないと >>400
誰も間違えてるなんて言ってないし、一つ上のレスすら見てないのか?w >>396
マルチプロセッサでプリエンプティブはどっちだと思う?
当たり前だがTCASはユニでもマルチでも動くんだが
それでもTSSは並列なのか並行なのかって気になるのか?
どっちでもいいって主張には賛成しかねるな
>>398
「複数のユーザー」、「複数の利用者」と至る所に書いてあるね
ダム端末は確かに昔のことだが並行か並列かという話には関係ない
「頭がおかしい」、「老害」、「知ったか」
どうも前スレあたりから変なのが常駐してるようだな
うっかり構わないように気をつけなきゃ 「頭がおかしい」、「老害」、「知ったか」
どうでも良いが、これを連呼したい奴が常住しているようだ 頭がおかしい知ったかのクルクルパーの老害ですが、呼びましたか? >>402
> ダム端末は確かに昔のことだが並行か並列かという話には関係ない
だからその定義だと関係ないとしても、TSSの定義はそれだけじゃないでしょ
話の流れから見てダム端末とかチャネルとか言い出す方が狭すぎって話な
> どうも前スレあたりから変なのが常駐してるようだな
自己紹介乙w C言語は 「頭がおかしい」、「老害」、「知ったか」 な人が使う言語
であってますか? 8ビットCPUや16ビットでもリアルモードな頃は、
自己書換プログラム作ったりして楽しかったが
今は出来ないのでつまらない?出来ましたっけ? >>404
> 「頭がおかしい」、「老害」、「知ったか」
> どうでも良いが、これを連呼したい奴が常住しているようだ
>>409
> C言語は 「頭がおかしい」、「老害」、「知ったか」 な人が使う言語
> であってますか?
わざわざ自己紹介ですか? >>411
できるよ
キャッシュやプリフェッチキューとかも考えないといけないしOSによってはページの属性を変更したり色々手続きが面倒だけど 並行に動作できるよう作ってあれば 並列に動かしたって平気だよ
ダイジョブダイジョブ こんなマクロ M1 M2 を作りたい。
int a[] = M1( test1, M2(a), M2(b), M2(c));
↓
int a[] = { sizeof(test1), offsetof(test1, a), offsetof(test1, b), offsetof(test1, c), -1 };
とりあえずこう定義したけどやっぱりだめだった。M2 の st が展開されない。
#define M1(st, ...) { sizeof(st), __VA_ARGS__, -1 }
#define M2(f) offsetof(st, f)
うまい方法があったら教えてください。
コンパイラは gcc です。
M1 に構造体名を与えたら M2 でもその構造体名を展開したいというのが要点です。 M1(test1, a, b, c)
としてM1内でM2使うしかないのでは。 int ***型(intへのポインタへのポインタへのポインタ)の変数Aの宣言 *は幾つまで羅列できますか。
int ******how Qiitaだったかブログだったかに実験結果あるよ。 言語仕様的には何個でもいいんじゃね。
でもただ * を並べるだけじゃなく、const や volatile なんかと組み合わせるとここに居る連中でも頭を悩ませることになりそうだ。 三個くらいなら良いが、そんなに並べてプログラマがついて行けるんか? 前に見かけたこの記事がある
たった4000個ほどしか付けられないらしい
printfに4285個アスタリスクをつけるとclang++が死ぬ - Qiita
ttps://qiita.com/kaityo256/items/84d8ba352009e3a0fe42 >>425
原理上は無限でも問題ないし言語の規格上の上限があるかは知らないけど、コンパイラの実装上は何らかの上限があるだろうね。 (***printf) ないし (*printf) ってどういう意味になるのかな?
関数ポインタに * を付けても同じ型で同じ値の関数ポインタになるということ?
少なくとも値は * を何個付けても変わらないみたいだけど。 ちなみに &printf も同じ値だね。
ちなみに関数ポインタ変数 p を使った場合、&p は変数p 自体のアドレスになったけど、p も *p も関数自体のアドレスで同じ値になる。
ちょっとややこしいかも。 メモリを[アドレス](データ)で表すと
int ***A;は
[Aアドレス](アドレス1) -> [アドレス1](アドレス2) -> [アドレス2](アドレス3)
-> [アドレス3](int データ)
を指していることかな。 int (*fp)(void); /* fp: 引数なし, intを返す関数を指すポインタ */
と定義された関数ポインタ fp を経由して関数を呼び出す際に、
fp() でも (*fp)() でも同じ意味だよ、と規格で決めた結果として、
ならば (**fp) も (***fp) も…同じだよね、てことになったのかな。
アドレス演算子の方も
fp = some_func;
fp = &some_func;
どちらの書き方でも fp 経由で同じ関数を呼び出せる、という点で合理的か。
他の解釈をしても意味ないし。
おかげで
fp = &**&***&some_func;
などと書くこともできる。これは無意味で過剰な一般化の類にも思えるけど。
fp = &&some_func;
とは書けない模様。
この辺の挙動はコンパイラによって違うのかも。 sizeof fp //ok
sizeof *fp //error
fp = &some_func; //ok
fp = &fp; //error int a = (*&*&*&*&*&*&*&f)();
こんなんもありか? >>436
Cだとコンパイルエラーだね。
最右の--で増やされた値に左隣の++を作用させられない。
C++だと動作する。
「前置の++/--演算子が左辺値を返す」だっけ。 誤: 最右の--で増やされた値
正: 最右の--で減らされた値
増減を間違えたわ。 そろそろ変数名、関数名にUTF-8を使えるようにしてもいいと思う。
多分楽しくなるよ。 void ぴゅう太(void) {
漢字();
漢字();
鉄矢();
鉄矢();
} 全角空白やアラビア語などを駆使したioccc作品が楽しみだな 古老おらんか
cmakeてのはいつ頃流行ったシロモノなんだ? i286時代の16bitC言語ってfarポインタ経由でも64KBごとにしか連続メモリアクセスできなかったんでしょうか? 連続アクセスをどのレベルで言ってるのかによるけどHugeポインタ使えば見かけ上は連続アクセスできる
ただしかなり遅い FARポインタって値としてはリニアアドレスで、メモリアクセス時に内部的にセグメントとオフセットに分けてるだけじゃなかっけ?
ポインタを ++ しながらメモリアクセスして 64KB 越えても問題無いんじゃね?
memcpy みたいのが内部的に rep 使った lods や stos を使ってるなら、ライブラリとして 64KB 単位に区切ってるんじゃないのかな。 あれ、おれの言ってるのって hugeポインタだっけ? もう使ってないし、使いたくもないし、思い出したくもないw 組み込み小規模は今でもメモリモデルやらFARポインタやらがある i80286のバグを利用してリアルモードでありながら1MB超のメモリを使うなんてテクあったな >>446
連続アクセスはポインタを ++ でインクリメントしながらループするレベルで言っています
Hugeポインタというものもあったんですね、知りませんでした
これを使うとポインタを ++ する度にセグメントレジスタを更新するので遅いが64KB以上のアクセスができるって事ですよね
farポインタはポインタを ++ してもセグメントレジスタは更新されず、早いけど64KB以上のアクセスはできないって事でしょうか?
あれ、もしそうなら例えば0x0EFFF0を指すfarポインタで ++ しながらメモリアクセスした場合
16バイト以上は0xE0000に戻ってしまい0x0F0000以降のメモリにアクセスできないって事ですか? 「正規化マクロ」なんてのもあった記憶がある。
オフセット部の上位ビットをセグメント部に移して、
オフセット部の値を 0-15 に制限する。
適当なタイミングで「正規化」することで
64KBを越える範囲を連続的にアクセスできるようになる。
いわゆる「透過的」ではないけれど。 >>452
もちろんそのセグメントで扱えるブロックの範囲の先頭に戻る
そういうときはセグメントレジスタの方の値を増やさないと無理 >>452
誤解されそうなので補足だけど
>0x0EFFF0を指すfarポインタで ++ しながらメモリアクセスした場合
セグメントレジスタ 0x0EFFF
ポインタ 0x000F
なら 0x0EFFFF にアクセス出来るし
セグメントレジスタ 0x0EFFF
ポインタ 0x0010
なら 0x0F0000 にアクセス出来る >>456 >>453
ああなるほど、セグメントレジスタは16倍してオフセットに加算されるんですね
勘違いして認識していました、ありがとうございます
そうなるとfarポインタでも基本的には64KBまでならそのままアクセス可能そうですね >>446
>Hugeポインタ
速度ペナリティも高かったし、なによりもバグっているとの報告がちらほら… >>447
オフセットがあふれてもセグメント部分はインクリメントしない、したがって 64 KB を超えて連続アクセスはできない >>457
16ビットと一言で言ってるけど、x86の場合リアルモードとプロテクトモードでセグメントの扱いは全く異なるから注意
16倍して足すだけなのは前者のとき(DOSとか)
Windows3.1は後者 >>462
そういう処理系があったって話でしょ
まあ処理系のバグだーって言う奴の99%は自分のコードがバグってるんだけどな(俺調べ) そうそう
どうせコードがバグってるのをコンパイラのバグだと騒いでるんだと思って聞いてみた まあQZは思い込みが激しいし話半分に聞いておけばいいな >>462
中島信行氏の記事にそういうのがありました
>>464
huge ポインタがあったのはたしか MS だけだったかと >>464
条件が成立してるはずなのにどうしても走らないコードがあり、コンパイラの最適化のバグで処理が消えたと思い最適化のスイッチをいろいろいじり、
それでもだめでコンパイラ自体のバグを疑い吐かせたアセンブラソースに処理コードが吐かれてないことを確認して、
ほれ見たことかコンパイラが悪い!と報告を上げた後でコメントの */ が抜けてることを発見した俺には敵うまい。 私はいくつかコンパイラのバグを見つけたけどね
見つけた時は発生する最小形にしてから報告
コンパイラのバグだとさわぐヤツの99%は自分のバグ
ってのは同意 Internal Error って言うのを見たことはある 99%もそんなアホいるのか?
コンパイラのバグを疑った場合まず最小の再現コード作るだろ
で、バグレポに条件と現象を書くわけだが
自分が悪い場合はそこで必ず気付くことになる >コンパイラのバグだとさわぐ
× こういう風に書いたのですがxxのコンパイラなら問題ないのにxxxの方だと誤作が(ry
〇 xxxつかったら動かねぇ!!ソースに間違いは無い!!クソコンパイラ!!謝罪と賠(ry >>472
> コンパイラのバグを疑った場合まず最小の再現コード作るだろ
> で、バグレポに条件と現象を書くわけだが
そんなこともせずに騒いでる奴が多いって話だろ 今は分からないが、20年くらい昔だと
あまりにも複雑なソースを食わせると時々発狂してたな 30年前くらいじゃないか?
あまりにも複雑なソースを書くのが悪い
っていう時代
今でもあまりに複雑なソースは悪
別の意味で 10年くらい前でもマクロのネストが多いとかでInternalエラー吐く処理系はあったよ
本来ちゃんとエラーチェックして適切なエラーメッセージ出すべきなんだろうけどほとんどありえないような状況にどこまで対応すべきかって話はなかなか難しいものがある
まあそれと処理系のバグとは別の話だが >>477
そんなん、やろうとしていること次第だろ
複雑になっちまうものはそうするしかない
意地悪しているわけでもないコードをけなすのは
自分の品位を損なう愚行だ >>479
複雑って言うのはスパゲティコードというより循環的複雑度みたいな話だと思うよ
複雑度が上がるなら適切に関数化するとかで避けるとか 「あまりに複雑な」
って時点で悪
やろうとしてることが複雑でも
記述を複雑にする必要は無い cでコンパイラがゲロる複雑に成るって三項演算子をネストするくらいだろ
c++はテンプレートでわりあい簡単に混乱を引き出せるけどCのメタ構築機能はゴミみたいなもんだし 3項がどう結合するかを理解してないやつがオレ文法と違うって騒ぐのは
駅前で不特定多数を叱りつけている危ないオヤジと同じ 人間にとっての複雑とコンパイラにとっての複雑化はまったく違う
演算子のネストなんて3項じゃなきゃ普通にやってることで
コンパイラにとっては普通のこと
3項演算子の結合は特殊なので
人間にとっては複雑なのは間違いないけど 3項演算子の優先度は
良くある演算子の優先度表を見るだけじゃ仕様がわからない
>>485もその辺を理解してるかどうか >>488
その表でもわざわざ欄外に注記している通り、演算子の順位だけを見ても分からないということだろう 4Dエンジン
ttp://x0000.net/topic.aspx?id=3677-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0 三項演算子は優先順位よりも結合性の方がわからなくなる A ? B : C;
A ? B ? D : E : C ? F : G;
(A ? B ? D : E : C) ? F : G;
A ? B ? D : E : (C ? F : G); >>492
私は
A1 ? B1 : A2 ? B2 : A3 ? B3 : C3
みたいにお気楽に後ろに後ろに結合するのがいいです コンパイラにとって複雑というのは、構文木が深くなる、とどのつまり項の多い長い文なんじゃない?
昔のコンピュータはメモリが足りなかったから深い木は扱えなかったってことでしょ。 >>494
人間には右につなげる方が見やすいのかも知れないが
コンパイラ的にあいまいさが無いのは左(内側?)に入れていく方だと思う
Pythonのはさらに結合の優先度が判りにくい気がする(慣れてないだけかも知れない) ? を if と同じように改行 & インデントすればいい
A ?
B ? D : E :
C ? F : G;
A
? B ? D : E
: C ? F : G; A ?
. . B ? D : E :
. . C ? F : G;
A
. . ? B ? D : E
. . : C ? F : G; >>494の場合は
A1 ? B1 :
A2 ? B2 :
A3 ? B3 : C3
A1 ? B1
: A2 ? B2
: A3 ? B3
: C3 当然 if や switch caseやテーブルと使い分ける
? : が適した場合に使う 某「省略の美学」とか言うのを売りにしてる言語に憧れてるんだろ。 三項演算子で処理を書くな
ただの代入にわざわざif文を使うな 代入の右辺だけ書いただけ
処理でこんな書き方をするのは特殊な場合(競技とか) Kotlinは思い切って三項演算子なくした代わりにifを式にしちゃったよ。
他の言語からのパクリだとは思うが、val a = if (x == y) b else c のような書き方ができる。 >>509
lisp とか haskell とか、関数型全般はそうやりますよね… >>509
その記述
int a = x == y ? b : c;
に比べて何かメリットあるの? >>511
ダメと言われている三項演算子を使ってません!と言えることかなw
一つあるとしたら、ネストさせたときに if ... else if ... else if ... else とできることか。
式の中に文のような表現が入る気持ち悪さがあるから、三項演算子の方がまだましな気もするが。 ダメといわれている?
初耳
else if は >>494 や >>502 が同じ事をやってて
こっちの方が見やすいと思う >>513
どこかのコーディング規約や一部の教条主義者の間で言われてるみたいだよ。(>>512前段はそれを揶揄したつもり。)
俺自身は三項演算子は分かりやすさを損なわない範囲で使うのは大好きだし、>>502の前者の書き方はよく使う。 関数呼び出しするのに、引数ではなくグローバル変数でやり取りする奴見たことある
ナイフ一本持ってジャングルの中を探検する気分になれた gotoは例外処理とか使いどころもあるのに、大人はみんなダメと言う >>516
スタック節約とかのバッドノウハウとしてはよく見る >>516
シングルトンのクラスだと思えばそんなに変じゃないんじゃね? >>519
シングルトンならグローバル構造体にして関数を介して読むべきだな 関数仕様(プロトタイプ)を変えたくないとか
関数をたすさん経由するので変更が多いとか
少しでもパフォーマンスをあげたいとか
少しでもリソースをけちりたいとか
理由はいろいろとある
綺麗さよりもそういった事が重要であれば使うこともある パフォーマンス改善の仕事してるけどパフォーマンスのためにグローバル変数使うとか聞いたことないわ >>520
別に構造体にする必要は無いじゃん。
しいて言えば、引数でたらい回しにするときこそ構造体が便利で、そういうやり方になるとシングルトンというより this を明示的にやり取りする普通のオブジェクトみたいなもんじゃね。
グローバル変数でシングルトン的に実装するなら、グローバル変数を全部 static にしてソース内にスコープを絞る感じじゃね。 >>523
キャッシュにヒットしやすい配置に並べやすいとか、
引数渡しでは必要なスタックに引数を積み上げるコストを節約できるとか、
戻り値を複数貰いたい場合に余計なポインタや構造体を使う必要が無いとか、
「どの程度」はともかくいろいろありそうだけど。 >>516
組み込みだとよくあるよ。その方がデバッグしやすいんだと。 ICEのメモリダンプでリアルタイムに状態の変化を追跡するのに変数のアドレスがスタックを動き回られては確認しづらいので
グローバル変数で寿命を永続化してアドレスマップを固定アドレス化することはよくある C言語10年ぐらいやってるけどいまだにエラー機構の正解が見えない
errno使おうかと思ってた時期もあるけど、けっきょく構造体使ってエラーハンドリングしちゃう >>531
例外みたいに?
そういえばマクロでtry文再現してるライブラリがあったな >>534
例外ハンドラの階層を構成できなくなるからだ 全てのケースで例外は階層化しないといけないって言う病気にでも罹患してるのか?
最終手段としてトップレベルに抜けるだけにしか使わないとか普通にやると思うけど ああexit使うと怒られるから形を変えるってやつね 例外があったらプロセス終了ってw
別にライブラリが呼び出し元に戻る直前の手段として longjmp する場合、jmp_buf はライブラリのソース内の static なグローバル変数でもいいわけで。
グローバルにするかローカルにするかなんてその時の作りに応じて選べばいいだけで、グローバルじゃダメなんて何のルールだよって話なだけだろ。 別にルールとか言ってねえぜ、勘違いすんなよ
飛ばされては困る処理はない方がレアケースで
だからグローバルはお奨めしないと助言したんだよ 例外発生時は自分自身にリセット要求出して割り込み禁止して無限ループ >>539
随分低レベルな考え方だなw
通常のエラー処理は戻り値とかでやるけどロジックエラー等の回復不可能なエラーはlongjmpでトップレベルまで戻ってログ吐いて止まるなりリスタートなりするとかだよ
>>541
> 飛ばされては困る処理はない方がレアケースで
階層化の話はどうしたんだよw long long a;
int b;
a >>= 8 * b;
‾‾‾‾‾演算のオーバーフロー
4バイトの値に演算子*を使用し、結果を8バイトの値にキャストしています。
オーバーフローを避けるため、演算子*を呼び出す前に値を幅の広い型にキャストしてください。
シフト演算でも右辺値は左辺値の型にキャストされるのですか? >>543
例外はむしろ回復可能なエラーへの対策が主要な用途だぞ
ゲロって止まるって、おまえエラーとバグを混同してるか?
俺は別に階層化の話から逸脱はしてねえぞ
そう思いたいのか? >>545
> 例外はむしろ回復可能なエラーへの対策が主要な用途だぞ
お前の流儀が主要とか言われても困る
> ゲロって止まるって、おまえエラーとバグを混同してるか?
文章理解力なさすぎだろw
>> 通常のエラー処理は戻り値とかでやるけど
> 俺は別に階層化の話から逸脱はしてねえぞ
飛ばされて困る処理が常に階層化されてると言うのか?
> そう思いたいのか?
お前が(あえてかどうかは知らんけど)書いてないから指摘しただけ >>544
32bit環境の gcc では特に何も言われないな。 >>546
俺個人の流儀ではない
エラー処理には返却値を使う方法と例外を使う方法がある
この点はおまえ完全に間違って憶えているようだな
飛ばされて困る処理を確実に実行させるために
階層化とリスローをするんだよ
おまえ何もわかっちゃいねえな
買いかぶってた ごちゃごちゃ言ってるのを読む気にもならんが、結局グローバルでもいいんだろ?
階層組みたきゃそれができるように実装すりゃいいだけだよな?
的はずれなこと書くと無駄に長くなるってことが分かったな。
はいおしまい >>548
> エラー処理には返却値を使う方法と例外を使う方法がある
> この点はおまえ完全に間違って憶えているようだな
この点がどの点なのか知らんけど、主要とか言ってたのにやけにトーンダウンしたなw
> 飛ばされて困る処理を確実に実行させるために
> 階層化とリスローをするんだよ
だからそういう流儀もあるというだけの話だろ
で、お前それちゃんとやってるか?
C++みたいに例外発生時にデストラクタが呼ばれる機能がないからちゃんとやろうとするとほとんどの階層毎にsetjmpするはめになること理解してる?
> おまえ何もわかっちゃいねえな
そのまま返すよ
> 買いかぶってた
そりゃどうも、ってかお前に買いかぶられてもなw C言語のスレとは思えんほど視野が狭いヤツがいるな
RAM 16バイトのCPUからスーパーコンピューターまで使われてるんだぞ ケチつける意図は無いけどあんまり小規模な CPU ならアセンブラで書いちゃうかな。 >>548
>飛ばされて困る処理を確実に実行させるために
>階層化とリスローをするんだよ
例外のリスローってよくわからないんですよね
例外を食ってしまわないかぎり飛ばされることはないんだから、リスローって意味がないのでは?
それとも皆んな、例外を食い潰しまくっているのかな? 是非1ビットCPU用のCコンパイラを提供してください >>555
1ビットCPU が存在するのなら作ってさしあげましょう http://www.st.rim.or.jp/~nkomatsu/motorola/MC14500.html >>559
1bit の CPU が存在するのなら作りますが、現実には存在しないのでは?
>>558 はプログラムカウンタを持っていない以上、CPU とは言いがたいですね longjmpて関数の垣根を飛び越えるためのものだろ
jmp_bufをローカル変数になんて有り得なくね? >>551
ああ、ちゃんとやってるよ
おまえやってないんだろ?
C++の動きもわかってねえな
>>554
日本語でおk >>561
setjmp と同じかより深いスコープまたはスタックフレームから戻ってくるだけだから、
setjmp の呼び出し時点で存在しているスコープであればローカルだろうとグローバルだろうと構わないよ。 補足すると、ローカル変数に置いた jmp_buf を呼び出し先の関数から直接参照することはできないから、引数かなにかでポインタを引き回さないといけない。
これ嫌ならグローバル使う感じじゃね。 >>560
プログラムカウンターも1bitじゃないからダメとか言いそうw >>562
> ああ、ちゃんとやってるよ
そりゃすげーな
> おまえやってないんだろ?
うん、性能も悪いしバカみたいだもんw
> C++の動きもわかってねえな
具体的に指摘しなよ
まあ出来ないから悪態しかつけないんだろうけど >>563
それやるのにlongjmpなんぞ使わないだろって
普通にif (err) return;で戻ってくりゃいいだけじゃん >>569
いや、盛大な理解不足をしてそうだな。
そもそもとして setjmp をしたスコープから上位に出てしまったら longjmp はできないぞ?
setjmp をした時点のスタックが壊れていないことが条件だから。 時間をトリガーとした実装について質問したいです。2つあります。
1
何時何分という絶対値をトリガーとしてスレッドを起動orコールバック関数の実行をしたいです。
どのような実装したらよいでしょうか。。
2
相対値、例えば何秒後というトリガーで1と同じ制限の処理をしたいときにはどうしたらよいでしょうか。
いずれも、任意個の処理とトリガーをつくりたいです。
POSIXの範囲でできるのが好ましいですが、不可能であればLinuxに依存してもOKです。
よろしくおねげーします。 >>573
一つのプロセスの中でやりたいんですよ。決してシステム管理の一貫ではないです。 >>572
2はsleepしてスレッド起動するだけだろ
1は 目的日時 - 現在時間 を計算して相対値にしてから2と同じ処理をすればいい >>572
sleepしながら時刻を確認するタイマースレッドでも作れば?
直近の時刻まで時間があるなら大まかにループして、イベント時刻に近づいたら細かくループすればそこそこの分解能と低CPU時間を両立できるんじゃね。
新しいタイマーをリストに加えたらタイマースレッドに signal 投げれば sleep からすぐ戻るから再計算もできるでしょ。 pthread_cond_timedwait
じゃダメなん? >>577
それでもいいんだろうけど、sleep に比べてこれといったメリットあるかな?
いや、ケチを付ける意図も無けりゃ sleep を推したいわけでもないんだけど、この場合の pthread_cond_timedwait は時間待ちをするだけの目的で使うんだよね? プロセスを都度起動でなく、常駐させる理由を書けば良いと思う >>578
時間指定じゃなくて時刻指定だから
用途に合ってると思ったわけだが 皆さんありがとうございます
>>576 案は実装ムズそう(KONAMI)
>>577 案をまず試してたい、と思っています >>584
うん、すごい
性能も悪いしバカみたいなことを得意げに語るところがw 例外処理っぽいことをやること自体が目的になってる感はあるな。
ある程度のところへ longjmp したら後は return でいいんじゃねーの?みたいな。
goto 使ってもいいしな。 >>585
longjmpが性能悪いわけねえだろ
悪いのはおまえの頭だ >>587
うんlongjmpの性能はたいして悪くないよ
多少悪くてもガンガン呼び出すわけじゃないだろうしね
悪いのはsetjmpとlongjmpの区別もついてない君の頭だと思うw なんでsetjmpとlongjmpの区別って話になるの? おまえ精神分裂病なのか? >>589
longjmpの性能とか言ってるのはお前だけ
妄想性障害かよw >>590
ああ、性能悪いってのはおまえが書くコードのことか
なるほど551でヘボぶりを露呈したやつだからな >>591
これまた意味不明なことを言い出したな
> longjmpが性能悪いわけねえだろ
はどうしたんだよw
あと前の話に噛み付くなら
>> C++の動きもわかってねえな
> 具体的に指摘しなよ
にもちゃんとレスしろよな >>592
人に教えを請う態度ではないな
乞食野郎 お前に教えを請う?w
> まあ出来ないから悪態しかつけないんだろうけど
って書いてあることも理解してないのかよ かすりもしない想像を開陳されても痛くも痒くもねえぜ プログラミングだけでなくプロファイリングもど下手くそだな
頭悪いやつは何やっても同じってことだな > longjmpが性能悪いわけねえだろ
って書いちゃって顔真っ赤になってはぐらかしに必死w 正しいことを言ったのに真っ赤になるわけねえだろアホ
もうテキトーこくしかなくなってやんのw longjmpが性能悪い?
どう悪いのか説明してみ
まあどうせまともな説明できないからまたごまかすんだろうけどw longjumpを使ってループとかしちゃうんじゃないの? 低きに流れて共に暴れる程度の度量もないのか。ケツの穴のセグメントの小さい奴らめ。 GNUのlsのソースで状態遷移を使ったパーサーがあった
なんか自分の知ってる技術が使われてると嬉しくなるな longjumpではなくlongjmpな
gccとclで結構違う
http://codepad.org/cm3uAblb インラインアセンブラで1バイト相対ジャンプ命令使ったとき、
128バイト以上離れても警告されなくて何度もバグったわ。
当時はデバッガー使ってなかったし。 流石にアセンブラソース部分のチェックはしてないと思うが アセンブラで条件分岐するにはジャンプは必ず使う
大抵の条件ジャンプ命令は相対ジャンプ ショートブランチの射程距離ぎりぎりを使うときはうっかりミスなどあり得ない
通常はそんなことになるまでにロングブランチに切り替えるが
それをあえてショートで責める理由があるときは細心の注意を払う インラインアセンブラを使うのはせいぜい数行
それより多かったり分岐を含むのは
インラインじゃない普通のアセンブラ
intrinsicで済むのはintrinsicで
ていう考え インラインアセンブラって何のために使うの?
パフォーマンス的にはコンパイラの最適化に任せておいた方がマシな場合が多そうだけど どうしても SIMD でその部分だけ実装したかった
あとから別のしくみがあることを知った >>614
コンパイラが吐かない命令使いたい時とかデータの特性がわかっててその特性に合わせた最適化したい時とか >>614
今時のCPUは最適化のためのルールが複雑で人の手に負えないからコンパイラ任せの方が大抵いいけど、昔はそうでもなかった。
まあそこまでキリキリにチューニングしたいならインラインアセンブラなんかじゃなくアセンブラで書く方がいいと思うけどね。
最適化以外だと、地味にローテートを多用するアルゴリズムだとアセンブラでやりたくなるよね。
他には、alloca とか longjmp とか効率のいい排他処理みたいな類いのアセンブラじゃないと書けない処理もあるし。 ウイルス作るのに必要
データを実行したり、投機実行を狙って特権の必要な命令を配置したり このスレのみなさんは逆汗したら判るんですか
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* cの関数の場合関数内でintを生成してそれに数値を代入してreturnして
戻った先で戻り値を使うことができる。そのままでdeleteする必要はない。
同じようにストラクチャでもできるの?
typedef strudt{ char x,y;] XY;
XY func(){
XY a;
a.x =1; a.y = 2;
return a;
}
void main(){
XY xy = func();
} int bitcount(int32 val){
ct = 0;
for(int i = 0; i < 32; ++ i){
if( val>>1)++ct;
}
return ct;
} int bitcount(int32 val){
ct = 0;
for(int i = 0; i < 32; ++ i){
if( val & 1) ++ct;
val >>=1;
}
return ct;
} >>622
先頭の pop ax で何が入ってくるのか分からなくて挫折したw
でもテキストな実行ファイルなら前にこんなの作ったよ。
https://dotup.org/uploda/dotup.org2114206.zip パスワード C
MSDOS用で 64bit windows上じゃ動かせないけど、DOSBOX とかで試せる。
C と関係無いしダウンロードしてまで見るのは面倒だと思うけど、見てもらえればちょっとは面白いかも。 >>624
a[i] = ( a[i] << 1) | ( a[i] >> 31);
って書いて普通にコンパイルしてみたが…
roll というのはローテート命令かい?
gcc で特に最適化は指定しなかったが。 >>626
できるよ。
正確には関数が持ってた構造体(funcのa)を戻り先の構造体(mainのxy)へ代入している感じ。
構造体はコンパイル時にサイズが決まるのでintとかの値と同じようにコピーができる。
https://wandbox.org/permlink/AIZ0DCmCSZJpFhE1 >>631
ほんとだ、シフト数を変数にしてもちゃんとローテートになるね。
すごいね。 >>633
ポインタで返さないなら、つまり関数内でメモリ確保したストラクチャでも値そのものを返すのであれば、受け取った側でdeleteしなくてもいいの?
typedef strudt{ char x[10000], y[10000];] XY;
XY func(){
XY a;
a.x =1; a.y = 2;
return a;
}
void main(){
XY xy = func();
} >>636
その a のためのメモリはスタックフレーム上に確保されてて、関数から return すると黙ってても消えて無くなる領域だから、
new とか malloc なんかでヒープ上に確保するメモリと違って delete とか free とかはいらない。
関数 func を呼び出してる間、xy の領域と a の領域は同時に存在し、return するときに a の内容を xy にコピーして、a は func のスタックフレームと共に消滅する。 int main(){
int a = 1;
return a;
}
これと一緒 うつりにけりなわが値
やがてすべてが過ぎ去るあとも
あなただけを想う >>638
なるほど!!よくわかりました。
関数はreturn値を呼び出し側にコピーして実行完了となりstackを開放する。
local 変数はstack上に作るので実行完了まではlocal変数の内容は保持される
が実行完了で自動的に消滅する。
ということですね。 常識過ぎてデフォルトコピーコンストラクタみたいな盲腸がC++に埋め込まれてしまったんだよ
あくまでC言語の中でコーダーが工夫し不便を乗り越えてた常識なのにね >人間の虫垂は、親知らずや体毛と同じように、かつては必要とされていたが今は
>なくても問題なくやっていける器官と考えられいた。
>しかし、虫垂がかつて何をしていたのか、また実際にいま用無しなのかについては、
>これまで明確になっていなかった。そんななか、米ミッドウェスタン大学の研究者が
>主体となった研究が発表され、この問題にひとつの答えが提示された。虫垂は、
>免疫細胞の反応を促し、有益な腸内細菌(善玉菌)が減少するとこれを増やすという
>二次的な免疫機能を担っているという。この役割は限定的な形ながら、いまも人間
>の体内で継続して機能している。
https://www.kagaku-kentei.jp/news_detail/data/355
むだなものなんて一つもない >>644
進化退化の結果、無駄になっちゃったものなら結構あるよね
ケツ毛とか、人差し指から小指までの腱間結合とか 虫垂炎で虫垂取っちゃった人はコロチャンに弱いってことかな >>645
環境が変化した場合に再度必要になるかも知れないのでなんとも言えない。
地球の自然環境は変化し続けるしね。 >>646
この世界全体が無駄と言えば無駄だな。
まあしかし人間は自分の欲望を満たすものに対して無駄がないと感じるだけのことなので、
欲望がなくなればそれもなり全てはあってもなくても良いどうでも良いものになる。 4(C)言語、5(GO)言語とおすすめwebフレームワークが増えるの?
6言語は何? >>646
こういう悟り厨ほど自分が死ぬときにはめちゃくちゃ言い訳しまくるもんよ。 英小文字の出現回数を出現した文字だけ数えたいのですがうまくいきません
ご指導お願いします
#include <stdio.h>
int main(void) {
char ch;
int cc[26] = {0};
int i;
for(;(ch=getchar())!=EOF;){
if((ch>='a')&&(ch<='z')){
cc[ch-'a']++;
}
}
for (i='a'; i<'z'; i++) printf("%c:%d\n", i, cc[i+'a']);
return 0;
} 出力の箇所
× printf("%c:%d\n", i, cc[i+'a']);
○ printf("%c:%d\n", i, cc[i-'a']); それともう一つ
char ch ; は
int ch; にした方が良い https://paiza.io/projects/z-ohjvsIhSR6X_lC8q7MKA
コンパイルが通りません。
どこが悪いか教えてもらえないでしょうか。
-Iと-Lの使い方や、regexのコンパイル?(.a)の指定方法等を調べてみたのですがわかりません。
C:\clang>gcc -I "C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\opt\include" -L "C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\opt\lib" filename.c
C:\Users\maru\AppData\Local\Temp\ccgTVd7X.o:filename.c:(.text+0x75): undefined reference to `regcomp'
C:\Users\maru\AppData\Local\Temp\ccgTVd7X.o:filename.c:(.text+0xf0): undefined reference to `regexec'
C:\Users\maru\AppData\Local\Temp\ccgTVd7X.o:filename.c:(.text+0x19a): undefined reference to `regfree'
collect2.exe: error: ld returned 1 exit status
libregex.aとregex.hは上記pathに存在します。
環境:
windows10 64bit
gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)
mingw-w64-install.exeで64bit版をインストールしました。 >>666
ありがとうございます!
あと、入力されてない文字を出力したくないんですが
もう一つご教授願います! 「入力されてない文字を出力したくない」のだから
出力するところにその条件を書けばよい
自分でデバッグしないと身につかないよ >>668
「ライブラリとして libregex.a も使うのでリンクしてくれ」と教えるために
-lregex と書かなきゃいけないんじゃないかな。
> gcc -I "..." -L "..." filename.c -lregex
ってな感じ。 >>671
C:\clang>gcc -I "C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\opt\include" -L "C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\opt\lib" filename.c -lregex
コンパイルと実行ができました。
c言語の勉強を始めて間がないので、かなり困っていました。
先へ進めることができます、ありがとう。 どの言語かなんて聞いとらん。
お前のpushでゾンビプロセスになったんだ。速く直せ OSのプロセス管理による
C言語固有の問題ではない くっそ初歩的な質問なんですが、コンパイラ入れてパスも通したのにハローワールドさえ実行できなくなりました
何がいけないのかな?
https://dotup.org/uploda/dotup.org2128201.jpg >?o: Invalid argument
oの前にあるの、半角ハイフォンじゃないのでは? >>681
見ての通り指定の場所にちゃんとあるし名前も合ってるんだがなぁ
>>683
半角にするとcannot excute 'as':って謎のエラーと「ファイルが見つかりません」ってエラーとでふたつでてきました 全角文字のパス未対応だったとか、"しゅもく"に\コード含んでたとか。
C:\prg とか作ってそっちで試したら? 試しに gcc helloworld.c ってやってみて
a.exeは出来ますか? >>687
a.exeの実行で無事出来ました!
ありがとうございます助かりました 何が原因だったのか解明できていないのは非常にもやもやする
まぁ初心者の頃はそんなのに付き合わずとりあえずいろいろやれ、っていうのもあるけどやっぱもやもやする asが無ーて言われたんだから、インストール変なんじゃ無いの。 モヤモヤする…
?o となっているから、?の部分が文字化けのようでもあり
コマンドラインの o の前のハイフンがそれっぽくないようにも見えるし >>696
たしかに後半はそう書いてありますね…
# ime で半角ハイフンに見える別の文字をと疑ってますがw 普通のハイフンに見える別文字だろう
どっかのサイトでコードとコマンドを丸々コピペ、
そのコピペしたコマンドに何故かノンブレーキングハイフンとかが含まれていた、あたり プリミティブ型が解放されるタイミングはいつですか?
例えば
int a = 0;
a = 1;
のコードでaのメモリは上書きされるのか別の場所に確保されるのか
それらは参照が切れるまでかまたはプログラムの終了かまで解放されないのか?
また、
for(int i = 0; 10 > i; i++)
だとiは10回確保されるのかもしくは1週ごとに上書きされて制御を抜けると解放されるのか?
お願いします >>699
>プリミティブ型が解放されるタイミングはいつですか?
>例えば
>int a = 0;
>a = 1;
>のコードでaのメモリは上書きされるのか別の場所に確保されるのか
プリミティブ型・構造体・共用体にかかわらず、static, extern をつけない auto 変数は、
その変数が定義されたスコープ { } から抜けると「解放される」ことになります
auto 変数はスタックに確保されるのが普通です、この場合は解放という言葉はちょっと意味が違ってきます
>for(int i = 0; 10 > i; i++)
>だとiは10回確保されるのかもしくは1週ごとに上書きされて制御を抜けると解放されるのか?
for() 文から抜けると i はスタックから外れます for (int i = 0; 10 > i; i++) {
/* i==0 から i==9 まで i はずっと同じ i */
int n = 0; /* 「i==0 のときの n」と「i==1 のときの n」は別物 */
...
/* n は「}の直前」で消滅 */
}
/* i は「}の直後」に消滅 */
こんな感じだったかね。
確保・解放と言うより、名前の同一性かも知れんけど。 今どきのコンパイラだとregister指定がないauto変数でもレジスタになってることがよくあるから
メモリを確保・解放しているとは限らないけど、そんな下らないことは考えなくても
変数の存在期間がスコープに合わせて階層的になっていることは
スタックを使って実現しているであろうと想像するのが最も無理がない
昔のメインフレームみたいな、ひねくれた実装で考えたいやつは勝手にしろってやつ 何を使って実現してるとか考える必要はないと思うけど
コストだけ知ってれば いきなり何nsとだけ言われても
そこから応用が全く利かないだろうが >>700
「スコープ」は名前の有効範囲で静的・ソースコード上のことで
動的・実行時のことなら「ブロック」というべきじゃないかな 流石に釣りだろ
毎回確保してたらなんでforループが回るんだよ
javaのintegerオブジェクトみたいな話ならわかるがメモリそのまま使ってんだからさ >>706
ISO C 規格より引用。
> ... There are four kinds of scopes: function, file, block, and function prototype. ...
同じく:
> A block allows a set of declarations and statements to be grouped into one syntactic unit.
少なくともCではそんな区別は無いね。 >>708
それ、
>「スコープ」は名前の有効範囲で静的・ソースコード上のこと
を肯定してるように読めるよ 関係ないが、iが10個確保されるという考え方は面白いな
ループを再帰で書いたような感じか アセンブラをちょっとやるとそこら辺の迷いも無くなるしポインタが何なのかってこともよく分かるんだが、
いかんせん最近のPCは規模が大きすぎてアセンブラでちょっと何かやるのには適さないからなぁ 代入の度に左辺変数が新規作成される言語無かったっけ。Python? >>709
そっちは正しいけど
> 動的・実行時のことなら「ブロック」というべきじゃないかな
がおかしいって話だろ 昔はアドレスレジスタとデータレジスタで簡単に説明できたし、コンパイルして「ほらね」と言う説明もできた
今はその辺が難しい どう実装されるかは最適化含めて色々あるからなんとなくこんなもん程度で >>710
OpenMPやSIMDによる並列化を使えば10個くらい同時に出来る >>713
>708の引用がそれを否定してるようにも読めない >>717
引用足しとくね。
> A compound statement is a block.
...
> A selection statement is a block whose scope is a strict subset of the scope of its enclosing block. ...
...
> An iteration statement is a block whose scope is a strict subset of the scope of its enclosing block. ...
こんな感じで、ソースコード上の文に対応する概念でスコープ(静的・ソースコード上のこと)を
成すものの一種であるから、これが「動的・実行時のこと」というようなことはありえない。 >>717
そりゃアホな内容をいちいち否定してたらキリないからな >>718
足してくれても情報量増えてないね
ブロックがスコープの一種であることはわかった(ってかそれを否定してない)けど、
それ以上のことは言ってない
「自動変数の寿命はスコープ(=関数、ファイル、ブロック、関数宣言)を抜けたら尽きる」
より
「自動変数の寿命はブロックを抜けたら尽きる」
でよくないか?
>>719
ID:U7o9KgzC0さんはそのキリないことをしてくれてるみたいだし
お前もしようとしてるんじゃないの?? 自動変数はレジスタ割り当てにより記憶領域が再利用されることかある訳だし、最適化で変数自体が消える可能性もあり得る。 >>720
スコープという概念が初心者にとって馴染みがなく伝わりにくいから構文の要素として目に見えて理解しやすいブロックと言い換えて説明する、というなら理解できる。
しかし、発端の>>706で言っているスコープは静的・ソース上のこと、動的・実行時にはブロックという理解は頓珍漢だと思うぞ。 >>720
>706 で言ってるような違いは無くてどっちでも同じ意味になると理解してくれたらないいんだけど、
その言い換えを改めて推してくるとなると何か誤解がありそうな気がする。
ブロックに言い換えることで何がよくなるのか、あるいはスコープだと何がよくないのか、言える? >>699
言葉遣いや着眼点と、分からないことがアンバランスだなぁ〜 「スコープは名前の有効範囲で静的・ソースコード上のこと」は正しいと認めてもらえたと思っていいのかな
それを「自動変数の寿命」という動的・実行時のことに使うのが気に入らない
ファイルスコープという関係無いことも含んじゃうじゃないか >>725
> 「スコープは名前の有効範囲で静的・ソースコード上のこと」は正しいと認めてもらえたと思っていいのかな
それはそう。そしてその点についてブロックも変わらないと言っている。
自動変数の寿命に関する規格の言い回しはこんな感じ。
> ... its lifetime extends from ... until execution of that block ends in any way. ...
...
> ... its lifetime extends from ... until execution of the program leaves the scope of the declaration. ...
「ブロックの実行が終わったら」「プログラムの実行がスコープを出たら」などと定めている。
特に誤解の余地も無いかと。 >>725
> 「スコープは名前の有効範囲で静的・ソースコード上のこと」は正しいと認めてもらえたと思っていいのかな
それに反対して奴なんていないだろ
> 動的・実行時のことなら「ブロック」というべきじゃないかな
が頓珍漢だって言われてるだけ >>725
局所変数(自動変数とstatic局所変数)のスコープは関数とブロックなのだから、ファイルスコープが入るからおかしいという理屈は的はずれだろう。
で、局所変数である自動変数とstatic局所変数の違いが、スコープから出たときに生存期間が終わるかどうかということなのだから、自動変換の生存期間としてスコープを出たらというのはごく自然なことだと思うぞ。 蚊帳の外の住人「それ知ってなんの役に立つの?自分でコンパイラでも作るの?」 コード書くのに何処まで生きているかだけを意思しとけばいいし >>729
さすがにスコープと生存期間ぐらいは把握してなきゃコード書けんだろ コードを書くための知識はある
厳密な言葉の定義が論点 >>726
引用ありがとう
規格にそれがあるなら納得するしかないな
>>728
静的なことと動的なことの区別がついていないように感じてしまう
俺が気に入らないってだけのことなんだ、すまんかったね 解放のタイミングが保証されているのではなく
存在の保証が切れるタイミングが規定されているわけだ 面倒なのは同じ用語でも言語によって定義とか意味が違うことだな 実装する側の自由度を持たせるために >>735 みたいな規定になるんだろう >>744
ここCスレだよ?
ISO/IEC9899に学歴制限書いてあるように見えたの?
それともアホなの? バカなの? 不細工馬鹿童貞なの?
中学生は生えたかどうか、高校生は剥けたかどうか、大学生はヤッたかどうかが下ネタだけど
3連敗してて、ねえ今どんな気持ち? 次は院だねえ
仕事見つかるかどうかで4連敗ほぼ確定だろwwwwwwww ネットで発言するにあたっての注意事項を
絶望的に知らねえど初心者か
バカッターの類だな これ、どう思う?
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13224055453
何を検証したいのかをなぜ誰も問わないのか。
そして、何を検証したいのだとしても自分で memcpy を書く必要は無いと思うのだが。 なんで状況を何も知らない状況で不要と判断出来るの? >>753
質問者が理由を明確に書いてるのに読めないのか? >>753
memcpyとかはコンパイラがインラインで展開したりすることあるからなかなか難しいことやってるな
って言う感想です simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0 解りにくかったのなら申し訳ない。
ログ出力をしてから memcpy を呼ぶんじゃだめなのかなってことなんだけど。
当人はログ出力によって何かを検証するのが目的なわけで
動作が変わってしまうかもしれないというリスクを冒してまで
memcpy を書きたいようには見えない。
もちろん、書きたければ書けばいいが、それは当人に聞いてみなきゃ判らない。
そういう確認もなく、なぜ回答が memcpy を書く方向なのかなと。
まあ、自分で回答する気はないんだけどね。 >>761
膨大なソースのmemcpy使用箇所のすべてにログ出力処理を埋め込む方が、自作のmemcpyに置き換えるよりも遥かにバグを埋め込むリスクが高いだろう。 規模によるけど1万ファイル越えとか想像してみ?
その規模で全部のmemcpyをちゃんとログ付き自作関数に置き換えられたか?なんて考えたくない >>761
> もちろん、書きたければ書けばいいが、それは当人に聞いてみなきゃ判らない。
当人が「ライブラリ関数memcpyを自作の関数に変更したいと考えています。」って書いてるのに何を言ってるんだよ
恥の上塗りしすぎw デバッガがやってるような技術で memcpy をフックできないもんかね。
そういうツールとか無いんかな。 >>765
memcpy全てが素直に1個の関数になってたらいろいろと手はあるけど
そうじゃないからねえ >>765
動的に置き換えたいってこと?
>>757にも書いたようにインライン展開されるケースとかにまで対応しようと思ったらすげー大変な気がする システムヘッダファイルの配置先フォルダの設定を変更する GNUライセンシーを回避しようとしても下層のライブラリ呼び出しでバレてしまう。 関数の引数を構造体で抽象化してるんですが、速度的に問題になる場合ってあるのでしょうか?
抽象化というのは↓のような構造体を
struct args {
int a; // func1の引数
int b; // func2の引数
};
複数の関数に渡します
void func1(struct args *args) { args->a += 1; }
void func2(struct args *args) { args->b += 1; }
呼び出す時は一時オブジェクトで渡します
func1(&(struct args){ .a = 1 });
func2(&(struct args){ .b = 2 });
構造体のメンバが増えると一時オブジェクトの作成に時間がかかるようになって、
func1やfunc2などの関数が沢山呼ばれた場合に重くなるんじゃないかと心配してます スタックポインタ加減算するだけだから大したことないだろうけど、心配なら測定したら? どうしても気になるんなら union にしときゃいい
union args {
struct { int a,b,c, … } forA;
struct { double A,B,C, … } forB;
…
struct { int a,b,c, … } forZ;
};
void func1(union args *args) { args->forA.a += 1; }
void func2(union args *args) { args->forB.A += 1; } >>772
やっぱり測定するしかないですかね
>>773
なるほど
共用体使えば節約できますね
とりあえず気にしない方向でいきますm(_ _)m >>771
値のレジスタ渡しをしなくなるから、遅くなると言えば遅くなる。 >>771 の↓の書き方はいつからできるようになったのですか?
>func1(&(struct args){ .a = 1 });
こういうのはC++に任せといてもらいたいなぁ… スレ汚しですみません、>>776 です
ググりなおしたら分かりました
C99 からなんですね Win32APIを学びたいと思ってて
その前にCかC++を学ばなきゃいけないみたいなのですが
どっちを選んでも同じようにWIN32APIが使えるのでしょうか?
プログラミング経験自体ほぼないです
http://wisdom.sakura.ne.jp/system/winapi/win32/index.html >>779
うん、どっちでも同じように使える
Win32APIのインターフェースはCで、C++はかなり上位互換なので
だからC++じゃないCでやる意味はあまりないよ
そこだいぶ古いなぁと思ったら、新しいところに移行してるじゃん
http://www.wisdomsoft.jp/
でもやっぱり古いね
猫でもの方がまだちょっと新しい分マシかも
http://www.kumei.ne.jp/c_lang/ >>780
わかりました。難しいことは全く分かりませんが
同じように使えるとお聞きし、安心しました!
教えていただきありがとうございます。 >>775
一時オブジェクトではなくて引数の構造体を使いまわした場合は構造体のほうが早いのでしょうか?
struct args args = { .a=0, .b=1, .c=2 };
func1(&args);
func2(&args);
func1(0, 1, 2);
func2(3, 4, 5); 興味があるなら
コンパイルの結果と測定結果を自分で見ると良い >>782
すみません、これは自分で計測してみることにします
どうもありがとうございましたm(_ _)m 余計なことを言ってやる気なくさせるな
とっかかりは何だっていいんだよ C も C++ も経験ないからどっちが良いかって聴かれて
C が良いって言っただけなのに
なんでお前がやる気を無くす必要があるんだ? >>789
> C も C++ も経験ないからどっちが良いかって聴かれて
そういう質問ではない。
>>779
>>789 は Win32API のコード例が何で書かれてあるかといったことをまるきり勘案していないようなので、無視していい。 M$のチュートリアルはわかってる人をも混乱させるクオリティだからなあ
「猫でもわかる」はCだね
http://www.kumei.ne.jp/c_lang/index_sdk.html C言語用に書かれたコード例って見つけるのが大変かも >>792
> 「猫でもわかる」はCだね
C++のクラスとかを使ってないだけ
そもそもサンプルコードのファイル名はsample01.cppとかだからC++としてビルドしてるし simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0 >>782
一時オブジェクトかどうかじゃなく、関数の引数の型によって内部的な関数の呼び出し方(というか引数の渡し方)が変わる。
int の値のなんかだとスタックに詰まずレジスタで渡す高速な呼び出し方になったりするが、
構造体ポインタ渡しだとポインタそのももはレジスタで渡されても実際の値はポインタ経由のメモリアクセスにならざるを得ないから、理屈の上では遅くなる。 >>797
計測してみたら仰るとおりでした
一番早いのが普通の引数で、ポインタ渡ししてメンバに代入とかすると遅くなりました
ポインタアクセスって遅いんですね >>798
その計測、最適化有効にして比べてる?
最適化すればそんな大きな差が出る話だと思ってなかったんで、気になる。 >>799
-O3だとみんな同じと言うか0秒になって差がわかりませんw >>800
それが正解。最適化されたら検知できないほどの差しかないから通常は気にする必要ないよ。 差が大きいか小さいかなんて中身によるだろ
ほとんど何もしない関数で
関数として実装されて
ループの中にあれば
差が大きいこともある
構造体の方が速い事もあるし
直接の方が速い事もある
とりあえずはきれいなコードで作っておいて
パフォーマンスが問題だとわかった時点で対策すれば良い
おそらく今回の部分は99.99%気にしなくて良い 非常に短時間の測定は
x86ならTSCレジスタで測るのが良い
非常に軽く非常に分解能が高い
QPCもTSCから計算して求めている 同じコードでも周りのコードによって時間が大幅に変わる事があるので注意
例えば関数がインライン展開されてたものが
全然関係ない所からのコールが追加されただけで
関数コールに変わったりする
また、
結果を使わないただの時間測定コードだと
関数コール自体消される事も良くある 最適化しててもアセンブラソース吐かせて比べてみると勉強になると思う。
いやむしろ最適化してる時こそアセンブラソース吐かせて確認するのがいいかも。
勝手にインラインになってたり処理が省略されたりするしね。 最適化なしでリリースすることはあり得ないのだから
当然測定もチューニングも最適化オプション込みででやるべきだし
O0オプションで吐いたアセンブラなんて見ても無意味 一般的な話をすると
最適化無しでリリースする事はあるけど
パフォーマンスが重要であれば無いだろうねえ あぁ、呼出規約についての勉強のつもりだったから最適化無しを想定したけど、
ベンチマークみたいなコード書いてるんだろうからそもそも処理が残ってるかの確認とかの意味で最適化時のを見た方がいいと書いた。 あぁ、呼出規約についての勉強のつもりだったから最適化無しを想定したけど、
ベンチマークみたいなコード書いてるんだろうからそもそも処理が残ってるかの確認とかの意味で最適化時のを見た方がいいと書いた。 「書込失敗」ってでたときは、念のためリロードしてみた方がいい 自分の業界じゃ最適化無しリリースなんて当たり前にしてるよ
多くは有りリリースだろうけど、無しがあり得ないなんてことは無い 初心者です。
ポインタの理解を深めるために、visual studioのデバッグで、変数の値をウォッチしています。
例えば、
FILE *src;
fopen(〜10byteのファイルを開く〜)
fseek(fp, 0L, SEEK_END);
printf("%s は %ld byteです.\n",filename, ftell(fp));
こんな感じの命令をやった時に、*fpとかfpとか&fpの変数を観察してみたのですが、
値がピクリとも変化していないのに、ftell(fp)を使うとちゃんと10byteと表示されるのです。
fsekkの時点でfpは変化していると思いますが、どのようにウォッチすれば良いのでしょうか?
ftellはfpのなんの変数を見ているんでしょう…。。 >>814
× FILE *src;
○ FILE *fp;
だめですね。ごめんなさい。 >>814
FILE *fp はポインタですから、fp の指す位置は変化しません
fseek() で変化するのは、fp が指した先の領域(struct FILE 構造体)の中にあるパラメーターであって、fp 自体は変化せず同じ位置を指したままでいます。 ポインタで詰まっている初学者ですが、皆様はどうやってポインタ勉強しましたか? >>814
FILE構造体が直接情報を持っているとは限らず、さらにポインタを多段に経由したり
OS管理のファイルハンドル・ファイルディスクリプタなどの先に情報がある可能性もある。
そもそも構造体メンバが規定されていないのでウォッチで何も見えなくても不思議は無いよ。 インクルードファイルあさって、FILE構造体の中身を見てみると面白いよ >>816
ありがとうございます。fp自体は変化してなかったのですね。
FILE構造体の中に現在値を示す変数があるのだと思い、fp.posみたいなことを試してみたのですが、
よくわかりませんでした。(_Placeholderとかいうのしかなさそうでした。)
struct FILE構造体の中身の値の変化を、ウォッチ機能で観察することは可能なんでしょうか? >>818
OS 側ファイルディスクリプタが FILE に記されることはあっても、
シーク位置を OS とで共有するのは難しいのではないでしょうか? >>818
ありがとうございます。
もっと上位(OSレベル)でやり取りされてる情報であるから、下位(自作プログラムレベル)からでは観察できないってことですか…
>>819
ありがとうございます。
FILE構造体の中に、_ptr(現在値)や_base(先頭アドレス)があると聞きました。
なので、fp._ptrとかを試しましたが、何も見れませんでしたね。
自分で定義した構造体の中の変数は観察することができるのに、なんでFILE構造体の変数は観察できないんだって、
不思議に思ってました…。 >>817
俺は以下のようなことを繰り返して段階的に複雑なケースを理解していったよ。
まずは入門書で基本的な概念を理解する。
実際にコードを書いて、様々な型の変数、配列、構造体やその要素に対して&演算子を適用してアドレス値を取り出して、対応する型のポインタに入れる。
ポインタが格納している値、ポインタが指している先に格納されている値をprintfで表示して確認する。
ポインタをインクリメント、デクリメントしたりしてポインタ自体の値の変化やポインタが指す先の値が何なのかを確認する。
一段階のポインタが理解できてきたらポインタのポインタなど多段階の間接参照を試してみる。ここでもまたポインタの演算を様々に試す。
値が予想とは異なるものだったり、型が違うとコンパイラに指摘されたりしたら、やはり絵を描いてどこがどう違っていたかを考えてみる。
何かを理解したら、更にここをこうしたらどうなるのかという疑問が色々沸いてくるのでそれらも逐一コードを書いて試していく。
慣れてくれば多次元だったりconstや関数ポインタなども含めて複雑にネストした宣言もシンプルなルールが再帰的に組み合わせただけのものというのが腑に落ちて理解できてくると思う。 FILE構造体でアクセスした場合は、直接ファイルを操作するというよりも
バッファリングしたデータへのアクセスと考えた方が良いかも知れません
実際のファイルはファイルディスクリプタというOSの仕組みの中で操作してます >>821
lseek() で実装できるんじゃないの?何かダメな理由知ってるんなら教えて。 >>822
FILE構造体の内容は仕様で規定されていないから、使用するライブラリ等の実装で決められていてユーザ側が知ることはできないし知る必要もない物だよ。_ptrとかがあるという話も、とある実装ではそうなっているということ。
そもそものポインタの理解を深めるという目的なら、FILE構造体の中身はこれ以上深入りする必要はないね。
FILE構造体は初心者が真っ先に触れるものの一つだけどちょっと特殊な存在だね。 FILE構造体の中身は標準ライブラリの実装によって違うんだから深追いしても無駄なだけ
FILE *fp;はそもそもfopenで帰ってきたものを他のファイル操作関数に渡すだけの使い方しかしないんだからポインタを理解する教材に向いてない >>825
lseek() の返り値を保存するんですね、返り値には気がつきませんでした 構造体 FILE は普通はポインタの形でしか使わないから
ユーザーが見るヘッダではopaqueかも知れないしね正ちゃん。
>>817
「ポインタ変数には“変数のアドレス”が記録される」っていう
素朴な理解でしばらく進められないかな。
&a は「変数aのアドレスを得る」
*p は「ポインタ変数pが指しているアドレスから内容を取り出す」 初心者は最初にシェルスクリプトでプログラムを固めた方がいいよ。 823
829
830
みなさま、アドバイスどうもありがとうございます。
一個一個理解してスキルを身につけていきたいと思います。 コメント失礼します
年収200万、一年ごとに5%上がりさらに10万円あがる20年後の給料は?と言う問題と、2時間格闘したのですが全くわかりません。
whileを使って何度やってもエラーが出ます >>832
エラーの出るソースコードを見せてくれないと何もできないよ >>832
(repl):3: syntax error, unexpected '=', expecting end-of-input
x*1.05=+100000
こんなのが出ます 普通にforでいいだろ、なんでwhile
whileでfor書けるけどさ >>835
x = x * 1.05 + 100000
って書くか
x *= 1.05
x += 100000
って2行で書くか
1行ではできない >>835
「=」という演算子は代入という動作をするものだ
変数aに(式)の値を代入したい場合
a = (式);
と書く どう考えてもネタと思うのだが
>>835の記述、考えられなくないか?
方程式にもなってないし
代入にしても意味的に>>832になってない 亀だがみんなFILE構造体FILE構造体と呼んでるが
FILE型は構造体かどうかすら規定されてなかった記憶 >>841 そうだね。規格見てきた。
> ... an object type capable of recording all the information needed to control a stream, including ... 自宅待機中の課題なんだろうけど、先が思いやられるな FILEは紙テープ時代の仕様を引き摺ってるからね
しょうがないね >>832
万円単位で
double answer = 200.0 * pow(1.05, 19) + 10.0; >>847
その計算式だと毎年の10万が復利の枠外になってしまうのでは? >>848
あぁ、20年後に10万追加されるってことじゃないのか 20年目ではなく20年後なのでpowするなら20じゃないと なぜ、fopenは"fp"でポインタ受け取り、fopen_sは"&fp"でポインタを受け取るのか分かりません。
定義?を見て、見極める方法はありますか?
fopen_sの定義に、引数として"FILE** pFile"を指定されているとこに、"&fp"が入るのは何故ですか?
他の命令でも*fp、fp、&fpのどれを入れるのか判断がつきません…。
<プログラム例>
FILE *fp
fp=fopen("aiueo.txt","rb");
fopen_s(&fp,"aiueo.txt","rb") …★
<fopenの定義>
errno_t fopen_s(
FILE** pFile,
const char *filename,
*mode
);
語彙力が乏しいのでわかりにくくて大変申し訳ございません。 fpの型はFILE*だよね。それに&をつけるとFILE**型になる。 FILE**型の仮引数はFILE*型を受け取れる。FILE*の扱いは従来の入出力関数と同じ。 errorno 使わずに戻り値で異常を伝えるために & で受けてるのか >>854-855
ありがとうございます。
以下の理解でよろしいのでしょうか?
(1)変数FILE* fpの場合
・"*fp"(FILE型?)
・"fp"(FILE*型)
・"&fp"(FILE**型)
(2)変数FILE**fpの場合
・"**fp"(FILE型?)
・"*fp"(FILE*型)
・"fp"(FILE**型)
・"&fp"(FILE***型)
変数に付ける"*"の数を増やすと、逆に型の"*"が減るのはなんか気持ち悪いんですね… >>858
ありがとうございます。
型側と変数側で"*"を奪い合ってるイメージをすると覚えやすいかなと感じました。
int型:値そのものを入れるイメージ
int*型:値が格納されているアドレスを入れるイメージ(ポインタ)
int * p;
*p = 1; (1つしかない"*"を変数側に付けてしまったので、int型となり"*p"には値が入る。)
p=&hensu; (変数側に"*"を付けてないので、int*型となり、"p"にはアドレス番号が入る) >>859
覚え方は色々あると思うけど、俺は以下の方法がオススメ。
int i; → iがint型の値になる。iはint型の変数。
int *p; → *pがint型の値になる。
つまりpは*を付けてint型の値になる、すなわちp自信はint型を指すポインタ (=pはint*型の変数。) 俺の覚え方はこうだな
&:メモリの位置(アドレス)を取り出す操作
*:メモリの位置に記録されている値を取り出す操作
型:値が格納されているメモリの幅を示す
※例えばint型は4バイトなのであるint型のポインターが0x0000を指していたら
メモリの0x0000〜0x0031に格納されている値が対象となるデータ
int型ポインターでなくchar型ポインターだとしたら
メモリの0x0000〜0x0001に格納されている値が対象となるデータ >>861
誤記った
誤)0x0000〜0x0031
正)0x0000〜0x0003 >>861
*については2つ意味があるとして覚えているわ(この認識が合ってるのかは分からん)
変数宣言時の*の意味:宣言した変数がポインターであることを示す
それ以外の*:メモリの位置に記録されている値を取り出す操作
ポインター:メモリの位置を保存するための変数
ダブルポインター:(ポインターの)メモリの位置を保存するための変数
トリプルポインター:(ダブルポインターの)メモリの位置を保存するための変数
・・・・以下略 fopen_s では、*fp を引数として参照渡ししてるからだよね、関数側で書き換えてもらうために
int i; を &i で参照で渡して、i を書き換えてもらうように、ポインタを渡して fopen_s で内容を書き換えてもらっている ポインタの覚え方もさることながら、型の修飾もどうだったかすぐ忘れるw
値を指し示す const ポインタなのか、const な値を指し示すポインタなのか、その両方なのか、それらの書き分けするのに毎回 google に聞いてる。
多重ポインタとか関数ポインタとか volatile なんかも組み合わされてくると、書けはしてももはや読める自信が無いw >>795
クラスを使ってないだけか?
テンプレートや無名共同体は使ってるか? >>866
クラス「とか」な
普通に考えたらわかるだろ >>822
FILE型についてはわざと中身を隠蔽していると思って良い。
オブジェクト指向の言語ならクラス変数が全てprivateになってるのと同じようなもの。で、そういう変数の読み書きは専用のメソッドを通して行う。
何故そうしているのかというと、外部から勝手に書き換えられたくないからだ。書き換えられると正常な動作を保証できなくなるということでもある。 >>868
いーや795で何が言いたいのかさっぱりわからん
揚げ足取りたかっただけか?
拡張子がcppでも内容的にCかどうか
あんたに聞いているんだ
答えてくれ >>871
書いてある内容そのままだし別に理解できないならそのままでいいんじゃね?
Visual Studioは(既定の動作として)拡張子でC/C++を切替えるだけって話だし >>872
書いてある内容そのままなら
http://www.kumei.ne.jp/c_lang/index_sdk.html
ここに書いてある内容のどこに
>>779がCではなくC++を憶えないと
理解できないコードがあるのか例示してくれ
失言ならとっとと引っ込めろ
逃げてる限り絶対に許さんぞ > CではなくC++を憶えないと
・・・誰もそんなこと言ってなくね?こわいわ。 strcmp的な「言ってない」で逃げたいの見え見えだな
逃げればいいじゃん、嘲笑ってやるぜ コメントはC++スタイルだが、他に特にC++特有のものはなかった。 >>859
C言語で2次元配列を動的に割り当てる4つの方法
もお薦め 本来Cでは「二次元配列」と呼ばれないものまで
二次元配列の4種類!(キリっ)とか紹介するのは非常にまずいと思う >>875
strcmp的とかよくわからんし、
>>779がCではなくC++を憶えないと理解できないコードがあるのか例示してくれ
と言われてもそんなものがあるなんて誰も言ってないから「ないけど、それが何か?」で終わる話なんだけどw >>881
では何故俺が792で「猫でもわかる」はCだと言ったことに対して
拡張子がcppだなどと絡んできた?
779 Win32APIを学ぶにはCとC++どっちを学ぶべき?
780 Win32APIはCだ(猫でものリンクを貼る)
786 むしろC++を知らないほうがいい、Cからやれ
795 「猫でもわかる」はCだ
796 C++のクラスを使ってない、拡張子はcppだ
この流れで「猫でもわかる」がC++だと主張してないとぬかすなら
アホは黙ってろ 自分の言葉に責任を持たない社会のクズは
このあと「それ、俺じゃない」とぬかす >>882-883
> C++のクラスとかを使ってないだけ
> そもそもサンプルコードのファイル名はsample01.cppとかだからC++としてビルドしてるし
と言う「事実」を書いてるだけだよw
C/C++の両方でビルドできるコードの存在を知らんのか? 黙ってろと言ったはずだ
端っから内容のないゴミレスして突っ込まれて
とぼけるしかなかったボーガスは身の程をわきまえろ 何も意図せずに「猫でもわかる」は拡張子がcppだと譫言をぬかすのは
ガキが何のボタンかわからんものを押しちまうのと同じ
自分が何をしでかしたか理解してない x=f(x)で、f(x)が複雑でx=定数の形にするのが大変なんで、数値計算でxの値をだしたいんですが、いい方法は有りますでしょうか >>892
ニュートン・ラフソン法
x=f(x)は0=f(x)の間違いかな >>894
ありがとうございます!
間違ってました笑 f(x)=任意の数値 となる x を数値演算で探せ
g(x) = f(x) - 任意の数値 として g(x) = 0 となる x を数値演算で探す
※ 任意の数値が変数 x でも差しさわりはない f(x)-x = 0 となる x を探索する話に帰着
あとは >>894 の通り
ニュートン・ラプソン法なり 2分法なりで 解析的な解法
微分可能
連続性
全ての解が必要かどうか
などで最適な解法はいくらでも変わる
無条件でニュートン法を勧めるヤツはアホ >>891
何を指摘されたんだ?
俺は「猫でもわかる」はCだと言った
おまえはCともC++とも言ってないんだろ
逃げ回るそのザマはまるでハエだなw >>890には多少同意するが
まあただの匿名掲示板だし
「しでかした」ってのも大袈裟
リアルだとかなり迷惑な存在なのは確か
話の流れを読まずに首を突っ込んで来るヤツ >>898
指摘内容すら理解できてないのかよ…
流石に恥ずかしくね?w
> クラスを使ってないだけか?
> テンプレートや無名共同体は使ってるか?
↓
> クラス「とか」な
> ここに書いてある内容のどこに
> >>779がCではなくC++を憶えないと
> 理解できないコードがあるのか例示してくれ
↓
> と言われてもそんなものがあるなんて誰も言ってないから「ないけど、それが何か?」で終わる話なんだけどw
> この流れで「猫でもわかる」がC++だと主張してないとぬかすなら
↓
> C/C++の両方でビルドできるコードの存在を知らんのか? >>901
テンプレートと無名共同体は使っているのかいないのかって聞いたのに
通じてねえのおまえだろ、それが恥ずかしいことくらいはわかるのか
早く答えろ、Yes/Noで 恥の上塗り乙
テンプレートや無名共同体を含めてクラス「とか」って書いてあるんだが >>903
テンプレートと無名共用体は使ってないんだな? 言質取るぞ >>904
揚げ足取ろうと必死やな
全部は確認してないよ、それが何か?
ちなみに無名共用体は拡張機能としてあるからいいとしてもテンプレート使ってたら>>792も嘘つきになるけどなw >>905
で、おまえ792を嘘つき呼ばわりできるのか?
「猫でもわかる」はCだと言った792にイチャモンつけてきたのおまえだぞ
嘘つきなのか否か挙証責任を果たせないなら撤回か逃亡しかねえぞ >>906
>>792が正しいとか間違いだなんて言ってないけど?
被害妄想で逆ギレ?
基地外の行動やねw どうでもいいけど>>792のサイト内で
>この時ファイル名は「*.c」でも「*.cpp」でもかまいません。
と書かれてるくらいだから少なくともサイトの作者はC++は必須としてないように思えるけどなぁ >>907
じゃあ、795で何が言いたかったんだよ
俺が「猫でもわかる」はCだと言ったことに対して
何か文句でもあんのかよ? 寂しかったのか? いやさすがに>>892が微分方程式だという発想はなかった
解は定数と書いてるし
xが実数以外(複素数、ベクトル、行列、...)の可能性はちょっと考えたけど >>908
> C++は必須
誰がそんなことを言ってるんだ?
>>909
レスしただけで文句ガーとか何キレてるんだよ
チンピラ(死語)かよw >>912
俺が「猫でもわかる」はCだと言ったことに対して
何か文句でもあんのかと聞いているんだ
自分の主張から逃げるヘタレが人のことをチンピラだと? win32APIはCででもC++でもいいけどこのスレはc言語ならスレだから答えはcでいやん
それとどうでもいいけど拡張子は.cc派 >>914
>win32APIはCででもC++でもいいけど
コールバック関数はマングリングしていてはだめなので、最低コールバックだけは extern "C" が必要だと思いますから C++ オンリーというわけにはいかないでしょう
extern "C" を含んでの C++ 、というのなら理解しますが >>912
自分に対する指摘は(ただの事実の指摘であっても)否定的な意味を持つ攻撃ととらえる残念な精神構造の人なんだと思う。最初の思い込みは後からどうやっても訂正しない(出来ない)タイプだろうから、これ以上突っつくのはやめてくれないかな?
理性のある側が引かないと、このどうでもいいレスバトルが終わらないから、頼むよ。 >>913
> 何か文句でもあんのかと聞いているんだ
単に事実を書いてるだけと書いたはずだが、頭に血が上って理解できなかったのか?w >>917
何のためにそれを書いたのかと意図を聞いている
手が勝手に動いたとでも言うつもりか?
それとも得意の「俺じゃない」で逃げるか?
ヘタレにはよく似合うぜ >>918
事実を伝えるためだけど?
理解力のないチンピラには伝わらなかったみたいだけどw >>919
俺に伝える必要がおまえにはあったんだな
で、なぜそんな必要があったんだ?
自分の主張が言えない腰抜けが人のことをチンピラだと? 笑わせるぜ キリッてから後になって自信なくなったんだろゲラゲラ サイトのサンプルプログラムについては
*.cでも*.cppでもどちらでもいい >>920-921
> 俺に伝える必要がおまえにはあったんだな
レスを見てるのはお前だけじゃない事も理解できないのかよ、どんだけ自意識過剰なんだか
むしろ理解できないアホはいちいち絡んで来るなよ >>923
俺にレスアンカーつけといて
そんな言い逃れは通らんぜ
自らの言葉に責任を持てない社会のクズにアホとか言われても
全く響かねえぜ、どうせその言葉にも責任持たないだろうからな こっちは弱点晒してんだぜ?
「猫でもわかる」のサンプルにC++の知識が必要な例を示されたら負けだ
こんだけノーガードしてやってんのに、そこを攻められない無能なやつw レス数が10を越える様な人は、概ねNGにしてかまわないね >>915
スタックの使い方等の呼び出し規約に準じた関数へのポインタさえ渡ってれば
シンボル名が割当たってなくてもコールバックは為されるんじゃない?
シンボル名で呼び出す必要が出てきたときにマングリングがというのはあるだろうけど・・・ COM? >>924
アンカーはお前のレスを参照してるんだからつけるのは当たり前
だからと言ってお前だけに言ってるわけじゃない
掲示板の使い方もわからんのかよ…
>>925
> 「猫でもわかる」のサンプルにC++の知識が必要な例を示されたら負けだ
だれもC++の知識が必要だとか言ってないのに何を言ってるんだよ
しかも勝ち負けとか
>>916が言う様に引っ込みつかなくなってるんだろうなw >>916
「猫でもわかる」はCだと言ったのは思い込みか?
Cではないと主張するなら挙証責任を果たせ
自分は何も主張しないなら無駄口たたくな
どーせ自演だろw >>929
俺だけに言ってるんでなくても
俺に言ってるだろ
「猫でもわかる」はCなのかC++なのかShow your flatg! >>929
お前にレスアンカーついてるのに
お前に言ってないとでも思っているか?
アホw バカwww ゴミ クズ 不細工 童貞
お前に言ってないのかなあwwwwww >>932
> 俺に言ってるだろ
お前に「も」言ってるよ
理解できるかどうか知らん
別に理解できなくてもいいよ、そういうアホもいるだろうしw
> 「猫でもわかる」はCなのかC++なのかShow your flatg!
なんでわざわざ頭悪い事を示すかなぁ
>>933
低能らしいレス乙 『猫でもわかる』のサイトで紹介されてるソースが
Cの範囲で書かれてるかC++特有の機能も使ってるか検証せよ、って
実際やってみるだけの価値のない口論な気がするけどなぁ。
そりゃ「俺の言ったことは正しい」「一片の反論も許さない」って
ご当人にはスレッド埋め立てるほど重要な件かも知れないけど。
それとも俺以外の皆さんはこの議論の決着を手に汗握って見守ってるのかな。 >> 「猫でもわかる」のサンプルにC++の知識が必要な例を示されたら負けだ
> だれもC++の知識が必要だとか言ってないのに何を言ってるんだよ
> しかも勝ち負けとか
> >>916が言う様に引っ込みつかなくなってるんだろうなw
確かにFAだなw >>935
文字通り隔離入院が必要だな
触らなければ感染しない >>926
いや、もうこのスレ読まなくて良いと思う。見るのは次スレからで良いんじゃないかな。 >>942
おや、FAじゃなかったのか?
まあいきなり玉砕してたらノコノコ出てこざるを得ないわなw ホレホレここだってチャンスやってんのに撃てねえ無能が何だって? まあ正直、あのサイトから
丸のまんまDLなんかしたことないから
拡張子なんか気にしてなかったな
petzoldとの説明の仕方の違いを読んでただけで
まさか、あれをC++だと言い張るやつがいるとは思わなくて面食らった
言い張ってねえととぼけているようだが
Cだと言う発言に同調しない以上BASICやCOBOLなわけもなく答えは1つだ
自分の発言のしょーもなさに気付いて言い訳しまくってももう遅い simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0
学術の巨大掲示板群 - アルファ・ラボ
ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
PS 連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0 >>945
> Cだと言う発言に同調しない以上BASICやCOBOLなわけもなく答えは1つだ
またその話かよ、チャンスどころかノーガードじゃねーかw
まあ毎回玉砕してるのに無視してるんだから無敵だわな
> この流れで「猫でもわかる」がC++だと主張してないとぬかすなら
↓
> C/C++の両方でビルドできるコードの存在を知らんのか? >>947
ノーガードは>>925で言っただろ
こっちが引き下がる条件をはっきり書いてやってんのに
おまえそれができねえだろうが
で、何が玉砕だ? 弾切れのくせに勝利宣言してんなよw
https://dotup.org/uploda/dotup.org2139674.png
こんな状況で先手が投了したなんて言っても誰も信じねえのと同じだ 必死つーか、ボコられるのが好きなマゾさんに付き合ってやってるだけさ >>948
既に
>> 「猫でもわかる」のサンプルにC++の知識が必要な例を示されたら負けだ
> だれもC++の知識が必要だとか言ってないのに何を言ってるんだよ
> しかも勝ち負けとか
> >>916が言う様に引っ込みつかなくなってるんだろうなw
…で、玉砕してるのに何度も繰り返すのは低能によくある行動
>>950
ボコられてる事すら理解できてないんだろうな…
理解力に致命的な欠陥があるんだろう ああ、そうか
「玉砕」という日本語の意味を間違えて憶えてしまっているのか
俺があのサイトはCだと言っていることに文句つけようとして
その目的が全く果たせないようなことを玉砕って言うんだぜ
俺: C++だと主張したな?
屑: 主張してません
俺: じゃあ何の用だ
屑: 他の人に言ってます
宣戦布告(または先制攻撃)しといて歯が立たないと見るや
そんなことしてません、だっておバンバン このスレに限らず結構他のスレも煽りあってるんだな
ム板の傾向なのかコロナのせいでみんなピリついているのか >>952
> 俺: C++だと主張したな?
> 屑: 主張してません
> 俺: じゃあ何の用だ
> 屑: 他の人に言ってます
チンピラ: なにガンつけてるんだ?
一般人: いや、見てませんけど
チンピラ: じゃあ何の用だ
一般人: 他の人を見てます
なるほど、チンピラの思考回路が良く分かるw 敵「ノーガードだぞっと」
ゲーム脳な俺「(罠はどこだ…)」 相手の名前を呼んでおいてガンたれたかどうかじゃねえだろ だれでも良かった
スカっとしたかった
今は反省している
みなさんそうおっしゃいます 言ってもないのに
> > 俺: C++だと主張したな?
とか、「ガンたれる」行為そのものじゃねーかw 猫でもわかる
ガン
チンピラ
NGはここらへんでいいですか
なんなんだコノスレは >>963
それ以外にも汚い罵詈雑言は一通りNGしとくと良いかも。そんな言葉が入っているレスはほとんどの場合は当人たちにしか意味のないものだから。
あんだけ自己主張激しくて承認欲求強いんだから、コテハン付けてくれると助かるんだけどね。 競技プログラミング系の動画だったと思うんだが
登壇者がプログラミング覚えたての頃(中学生ぐらい?)に
猫でもわかるを読んでみたけど分からなくて
「あれは猫でもわかるじゃなくて猫しかわからないだ」
みたいな話をしていた動画があった気がする fopen_sでのファイル作成について教えてください。
現在は、↓で"test.txt"を作成しています。
fopen_s(&file, "test.txt", "w");
これを変数iの値と組み合わせたファイル名を作りたいときはどうすればいいですか?
例えば、i=5 で”5_test.txt”というファイルを作りたい場合です。
printfでしたら、printf("%d_test.txt",i);で表示自体はできると思います。
fopens_sではどのように記述すればできるでしょうか?
よろしくお願いいたします。 sprintfでいったん文字配列へ書き出してみては >>968
#define LEN 1024
char fn[LEN];
int i = 5;
sprintf_s(fn, LEN, "%d_test.txt", i);
fopen_s(&file, fn, "w"); #define LEN 1024
char fn[LEN] = "0_test.txt";
int i = 5;
fn[0] += i;
fopen_s(&file, fn, "w"); >>969-972
解決できました!こんなコマンドがあったのですね。
例も記載頂き、ご丁寧にありがとうございました。
>>973
その発想はありませんでした…。
値を追ってみたところ、バイナリ値で "0"=0x30、"5"=0x35なので、30+5ってことなのですね。
確かに配列で1文字ずつ管理しているのだから、指定して直接文字を変えてしまえばいいんですね… 学術の巨大掲示板群 - アルファ・ラボ
ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
PS 連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0 ポインタ宣言
int * a;
intの部分、なんでいるのかわからん?
だって、型宣言に、サイズだけが必要なら、ポインタ型(intへのポインタ型、ではなく)
っていう、情報だけで、いいはずじゃん?
コンパイラの理解が必要なのかね? >>978
サイズだけが分かればいいという理解が間違いだぞ 型が無ければ、コンパイル時に、型違いを発見できない >>978
なんの型かわからないと解釈のしようがないだろ
ポインタはアドレスをその型で解釈するんだから
ポインタ演算も逆参照もなにもできない int *a; ← intのポインター
…
*a = 1; ← ポインターaが示すメモリーにint型として1を格納
void *b; ← 型のないポインター
…
*b = 2; ← ポインターbが示すメモリーにどんな型で2を格納したらいいかわからないからコンパイル時にエラー >>978 は言語仕様の話題だろう。
コンパイル時に、型違いを発見できないとか、コンパイル時にエラーとか言ってるの何なんだよ。 言語仕様ならポインタ演算禁止か
そういうのが好きな人はJavaとか使ってそう >>978
>>983と同じような話だけど a++ ってされた時に困るだろ
>>984
まあコンパイル時にエラーになるかどうかは処理系依存(ほぼなると思うが…)だけど>>982は言語仕様の話だぞ >>984
なんでそんな言語仕様になったのかって話と捉えるべきでしょ。
単純にCは型を意識する言語であって、その領域のサイズや代入や演算時の暗黙のキャストの仕方を決定するために *a が何なのか判明してる必要があるからだろ。
その領域が 8byte ということしか分からなければ、ポインタなのか long long なのか double なのか構造体なのかも分からず、(*a)++ すらどんなマシンコードを吐けばいいのか分からん。 ポインター使える言語で動的型付けのものって存在する? GNUCはvoid*計算時はchar*計算した時と同じになるな。
GNUだけの特別仕様のようだが。
Slot
🌸🍜💣
🎴👻🌸
👻🎴👻
(LA: 0.60, 0.69, 0.78)
Status ♠6 ♦10 ♥K ♥6 ♠K (1st.)HP: 1000 pts. たぶん(0)
0.63, 0.70, 0.78(967.722656) Proc. [0.122706 sec.]
Status ♦5 ♥8 HP: 1000 pts. たぶん(0)
0.58, 0.69, 0.78(966.628906) Proc. [0.127749 sec.]
Status ♥4 ♠A ♥Q ♣3 ♠J (2nd.)HP: 1000 pts. たぶん(0)
0.73, 0.71, 0.78(965.578125) Proc. [0.122267 sec.]
Slot
🎴👻💣
🎰🎴🌸
🌸🎰👻
(LA: 0.67, 0.70, 0.78)
Slot
🍒😜💣
😜👻👻
🍜💣🌸
Win!! 4 pts.(LA: 0.61, 0.69, 0.77)
このスレッドは1000を超えました。
新しいスレッドを立ててください。
SLOT Results
🎰🎰🎰 Excellent!! 0
🎴🎴🎴 Gratz!! 0
🌸🌸🌸 OPPAI Ban!! 0
💣💣💣 Backingum!! 0
Win!! 1
Points 4 pts.
life time: 117日 6時間 21分 13秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。