C言語なら俺に聞け 154
■ このスレッドは過去ログ倉庫に格納されています
>>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 ■ このスレッドは過去ログ倉庫に格納されています