【初心者歓迎】C/C++室 Ver.100【環境依存OK】 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ◆ソースのインデントについて 半角空白やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのも手ですが直接貼る場合は、 全角空白か に置換すると見栄えだけはよくなります。 【アップローダー】(質問が長い時はココ使うと便利) http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック) http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用) 前スレ 【初心者歓迎】C/C++室 Ver.99【環境依存OK】 http://echo.2ch.net/test/read.cgi/tech/1469177649/ >>792 情報処理資格www なんの役にもたたない 前回、共用体の非アクティブメンバーアクセスが許されるcommon initial sequenceの条件である「型の互換性」に目を付けたレスを見た時は >>792 がもう少し見所の有る奴だと思っていた(過去形) >>797 すまん、1/3は1.0/3とか書くべきところだったな。 1.0/3.0*3.0 が 1.0にならないことがある 1/3*3 が 1にならない 小数演算特有ではない 0.1を10回足しても1にならないことがあるって言うのも小数特有ではない 0.1は普通のfloatやdoubleでは表現できず、コンパイル時に近似値に変換する この意味では以下と本質的には同じ int a = 0.1; int b = a * 10; >>792 自作って高価なプラモデルだぞ。。。 夢見過ぎ。 直接ってもなぁ。。。 昔はx86限定で直接レジスタ弄れる命令あったんだが、その命令は今じゃ優先的にレジスタ使ってね☆って意味に変質してるもんなぁ。。。 今のCは思ってるより下級言語じゃ無いぞ。 普通の言語よりゃハードに近いけどさ。 doubleがintに比べて誤差が少ないため、誤差を気にせずに使ってしまいやすい だから注意の意味を含めて誤差が大袈裟に語られる傾向がある 当然整数の方が(普通は)はるかに誤差が大きい >>805 それは知ってるけど元の質問者がdoubleの演算誤差について聞いているのだから、整数の除算の件は話が外れていると思う。 この手のスレに良くあることだけど、元の質問から勝手に話が発散して何を目的に議論しているのかが分からなくなるね。 いやだから、 気を付けるべき点は >>769 の後半にまとめたつもりだけど よくやりがちな例は、 for (double a = 0; a <= 1 ; a += 0.1) みたいな比較と double a = sqrt(3); double b = a * a; int c = b; みたいな整数丸め これは、 double に限らす10000桁精度の演算ライブラリでも全く同じ問題がほぼ同じ率で起こる 前者はループが10回か11回かはバクチで、 後者はcが2になるか3になるかはバクチ なんかそんなの読んだことあるな。 計算結果は精度の範囲内だけど、計算途中で精度超えて結果に誤差が出る的な。 なんか対策あったぞ。 >>798 普通は計算機epsilonで判定は しない、これはわかりました じゃあどんな値で判定するんですか? >>792 カーニハンもリッチーも受かっていないようだが? >>815 対象の値が含み得る誤差を用いる。 機械イプシロン(を指数によってスケールしたもの)は誤差の下限を示しているだけに過ぎない。 VisualC++とそれ以外用とで別の関数を用意して、プリプロセッサを使用してコンパイル時に選択したいと思っています この場合、関数全体を#ifdef _MSC_VER〜#endifで囲うことになるのですか? もう少しきれいな書き方があれば教えてください よろしくお願いします >>819 機種依存部分をライブラリ化してリンク時に差し替えるとか 関数全体を切り替えたいなら関数全体を複数記述するしかあるまい 部分的に違うだけならその違う部分的だけ切り替えればいい 関数全体を複数記述する方法はいくつかある >>819 別にそれでいいじゃん。大量にあるならファイル分ければいいし class A {} int main{ A a; //c++ A a = new A(); //c# } このc++の「A a;」は、c#の「A a = new A();」と同じ意味ということでいいんですか? >>823 同じになるねぇ あえて違う点を挙げるとすればAが作成される領域がスタックかヒープか でも意識するほどのことじゃない >>824 スッキリしました。ありがとうございます。 いやC++やるならスタックかヒープかは意識しなきゃだめだろ deleteどうすんの >>824 > Aが作成される領域がスタックかヒープか いや、それは意識しろよ C#はdelete書かないんだからC++なら deleteが不要な「A a;」を同等と捉えるのが筋 配置場所なんかどうでもええ 寿命だのコストだの言うけど そんな実相依存どうやって見積もるの? 無意味な揚げ足取りはやめたら? C++ 側は実装依存な部分あるっけ? C#側はよーわからんけど こっちはC++スレだぞ?C++でスタックとヒープのコストや寿命の違いを意識する必要がないってマジでいってるのかよ newの方はC#のって前置きがあるだろうが よく読め まあ元々の質問もあれだが コストは c++のnew>>(超えられない壁)>>c#のnew>スタック 全然違うというほどでもないし コストは置いておいたとしても寿命はどうするんだよ 平たく言うと 「マニュアル車の1速は、オートマ車のDと同じ意味ですか?」 って質問だぞ それに対して 「オートマ車はDで発進するからマニュアル車なら1速と同等ととらえるのが筋 速度が出た後のことなんかどうでもええ」 ってのはなんか違うだろ メモリ管理に関してはC++はマニュアルでC#はオートなんだから こういうたとえになるんだよ >>837 おまいさん資格持ちじゃないよな?な?な? あと、C#はJavaと違って構造体が使えてこれは値型になれるから スタックに確保できる なんで、C++の A a; はどちらかというと、そちらに該当するんだよ で、C#のA a = new A(); はというと delete が必要という一点を除けば C++ の A *a = new A();に相当するんだよ こんなこと当たり前だろ >>845 実装と目的を一緒にすんなよタコ 単に「Aのインスタンス生成するコード書いてみ」 といわれたら>>823 になるだろjk 意味が同じってのはそういうこった >単に「Aのインスタンス生成するコード書いてみ」 ってのはお前が勝手に言ってることだろ 元は >このc++の「A a;」は、c#の「A a = new A();」と同じ意味ということでいいんですか? だ 超えられないかはともかく、newに限って言えばGC言語の方が低コストでもおかしくない。 厳密にどうかじゃないんだよ 初心者がこれから言語を勉強していくのに より得になる方はどっちだってことよ GCだからー、ヒープだからーって そんな答えおよびじゃないっつーの どの程度の初心者かわからないだろ C#と比べてるってことは既にC#をそこそこマスターしているかもしれないだろ その状態でC++に手を出そうとしていたとしたら、どうだ? C#とC++の違いなどを書いたほうが良いだろ >>850 初心者だからこそ、上っ面の文法の違いだけで捉えて、こうすればだいたい同じとか説明する前に、 前提としてメモリ管理の考え方が違うことを理解してもらうのは重要だろう。 もういいよ、まとめると C++ではインスタンス生成(アドレスの決定)は二種類のやり方がある A a; A* pa = new A(); 前者はスタックのアドレスが割り当てられ、後者は通常はヒープのアドレスが割り当てられる。 前者はスコープが寿命で、後者はdelete pa;されるまでが寿命。 C#ではインスタンス生成の方法は値型、参照型でそれぞれ一種類ずつしかなく、 A a; //struct A B b = new B(); //class B 前者はスタックのアドレスが割り当てられ、後者はヒープのアドレスが割り当てられる。 前者はスコープが寿命で、後者はdelete pa;されるまでが寿命。 どれとどれを同じと思うかは人それぞれ。 終了 C# の後者の寿命は? delete pa は C++ だよね >>856 おっと、間違えた C#の後者の寿命はGCに回収されるまででした >>856 ご苦労さん 何故この話題がここまで伸びたんだろ 異なる考えの言語同士であるため対応が自明でないという事実を無視して 自分の考える「同じ意味」の解釈を押し付けるからに相違ない >C#ではインスタンス生成の方法は値型、参照型でそれぞれ一種類ずつしかなく、 >A a; //struct A なるほどこうやって言語仕様を確認せず想像をたれ流すので世の中が嘘だらけになるのだな >>860 ん、C#のほうはそれであってるだろ StringとかDateTimeみたいな一部の例外を除けば >異なる考えの言語同士であるため対応が自明でないという事実を無視して >自分の考える「同じ意味」の解釈を押し付けるからに相違ない ん?だからそれに基づいてほとんどの人は 「違う意味だよ〜」って言ってたんじゃなかったの? 一部の人が「同じような意味だよ〜」って言ってただけで それに反論する流れだったでしょ だから「同じ意味」の解釈の押し付け合いはしてなくて 同じ意味だよ vs 違う意味だよ だったと思うけど 同じ様な意味と同じ意味は違う さらっと言葉をすり替えるなよ まったく卑怯な奴よの (つーか同じ様な意味とも言っていない) >>862 >だから「同じ意味」の解釈の押し付け合いはしてなく 「同じ意味」の基準について合意していないのに「ここが違うから別」とだけ言うのは「同じ意味」の解釈の押し付けに他ならないと思うのだが、 もう少し日本語の字面でなく意味を理解した方がよいのではないか >「違う意味だよ〜」って言ってたんじゃなかったの? →Yes >同じ意味だよ vs 違う意味だよだった →Yes >>861 合っているかと訊かれれば合っていないので、言語仕様を読むか当該のスレッドで訊くのが良いのでは あとStringやDateTimeの例外というのが何なのかよくわからなかった リンク先を見て思ったのだが こだわりじゃなくて罵られることに喜びを覚えるマゾなのではないかと言う気がした >>870 正しく指摘できないのならレスしないほうがいい あなたの思ういちばんすこいC#の仕様の世界で生き続けてくだはい アーメン 俺は、プログラミングなんて存在しない世界で生きたい c++ 英語を読める btcをトレードしたことがある 仮想通貨の開発に参加してみたい方 レスをお願いします >>876 お返事ありがとうございます 通貨名 raiblocks simple instant fees 0(送金手数料がかからない) web https://raiblockscommunity.net/ slack https://raiblocks.slack.com slackに参加 #developmentにて、開発に興味がある旨の書き込みをしてください(英語で) プログラミングなんて底辺ドカタの仕事 そのうちAIがやれるようになる ポインタそのものにオブジェクトってできるんでしょうか? 例えば、配列arrayのアドレスをポインタpで、ポインタpのアドレスをポインタpのポインタppで調べたんですが、 int array[3]; int *p = array; int **pp = &p; for(i = 0; i < 3; i++) { printf("&array[%d] : %d : %d\n", i, &array[i]); } &array[0] : 2293472 &array[1] : 2293476 &array[2] : 2293480 &p[0] : 2293472 &p[1] : 2293476 &p[2] : 2293480 &pp[0] : 2293468 &pp[1] : 2293472 &pp[2] : 2293476 ppが参照しているpのオブジェクトの位置が、arrayのオブジェクトのアドレスと全く同じ位置にあります。 1つのアドレスが2つのオブジェクトをもてるのか、ポインタ自体にオブジェクトは生成されないのか 他の要素でそうなってるのかわかりません。どなたか回答宜しくお願いいたします。 >>880 その出力を一挙に得られるプログラムを示せ,アドレスはプログラムの実行ごとに変わる可能性がある >>880 pとarrayは異なるオブジェクトだから確認方法が間違ってる 一つのポンタを複数のオブジェなんて当たり前 int z; int * p = &z; int * p2 = p; int * p3 = p2; >>881 これでいいでしょうか? int i; int array[5]; int *p = array; int **pp = &p; printf("array : %d\n", array); for(i = 0; i < 5; i++) { printf("&array[%d] : %d\n", i, &array[i]); } printf("p : %d\n", p); for(i = 0; i < 5; i++) { printf("&p[%d] : %d\n", i, &p[i]); } printf("pp : %d\n", pp); for(i = 0; i < 5; i++) { printf("&pp[%d] : %d\n", i, &pp[i]); } >>882 &ppでpのオブジェクトのアドレスを取得できると思ってたんですが違ったんですか? >>883 すいませんまだそれを理解するのは難しいです。 何がわからんのや。ようわかるやんけ アドレス : オブジェクト : 値 : オブジェクトの型 2293464 : pp : 2293468 : int**型 2293468 : p : 2293472 : int*型 2293472 : array[0] : ? : int型 2293476 : array[1] : ? : int型 2293480 : array[2] : ? : int型 >>885 つまりポインタpは配列を参照してもp自体は配列型ではなくて単体(?)のオブジェクトだということでしょうか? >>886 もちろんや。 pはarrayとは別のアドレス2293468にある int*型の独立したオブジェやで >>887 ありがとうございます!5時間以上つまってたのが一気にクリアになりました! >>880 > &pp[0] : 2293468 これはpのアドレス > &pp[1] : 2293472 > &pp[2] : 2293476 pp[1], pp[2]は存在しないからアクセスしちゃダメ たぶん 2293464: pp 2293468: p 2293472: array[0] 2293476: array[1] 2293480: array[2] みたいなメモリ割り当てになってるんだろうな >>889 意味のある値が取れないだけで 別にアクセスしても問題ねーだろ >>890 正しく割り当てられたオブジェクトのアドレス以外を指しているのなら、アクセスしてはいけないだろう。 889の例ではたまたまpp[1]が表す位置がスタック上の有効なアドレスでアラインメントも問題無いだろうけど、 例えばppがスタックやヒープの末端のオブジェクトを指していたら、pp[1]にアクセスしたらNGということもある。 中身にアクセスしてなくてただのアドレス計算だぞ C/C++言語的にはNGだけど、それで例外が発生するとはなかなか考えにくい もしかしたらビルド時に警告を出してくれるかも 配列ならば確保した数+1までのアドレス計算はやっても大丈夫&整合がとれる位置に配置されている 無効エリアのアドレス計算 値不定か動作不定かどっちだか忘れた これらをOKと呼ぶならOKなんでしょう >>894 -1も有効だとうれしい事があるけど、-1はダメなんだよね >>894 つまり式「&pp[1]」は大丈夫でないと? これがアスペいうやつだな 配列でないオブジェクトも要素数1の配列として考える仕様→よくご存知で pは配列じゃないからな→わかる ppは配列じゃないからな→頭悪いな ppは配列じゃないだろ→アスペ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる