【初心者歓迎】C/C++室 Ver.106【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
2020/07/13(月) 13:51:48.09ID:WBkWHxcT
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります

コードを貼れる所
http://codepad.org/
https://ideone.com/

前スレ
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/
2021/02/14(日) 14:28:22.15ID:PhDiV4m5
>>549
ごめんうろ覚えでした
元の文字列に改行があったかがeof()でチェックしないと分からなくなる
前にそれでwhile条件節から外してブロック内でbreakしたほうが便利なことがあった……ってだけでしためんご
2021/02/14(日) 15:46:09.44ID:7CeYpqGj
C++は最強ですか?
2021/02/14(日) 16:01:28.24ID:NtTyPWVG
最恐ですね。たまにスクリプト言語を触ると心が和む
2021/02/14(日) 16:19:38.70ID:7CeYpqGj
ありがとうございました!
2021/02/14(日) 18:37:42.96ID:RmY9fsVU
getline や fgets 入力ストリームの最終行が改行を含まずのに閉じられてる場合
バッファの末端に \nが居ないだけで最終行は取り込まれるよね?
555デフォルトの名無しさん
垢版 |
2021/02/15(月) 16:32:22.61ID:g92MWppk
https://stackoverflow.com/questions/55970169/getline-vs-fgets-control-memory-allocation
2021/02/15(月) 19:30:11.12ID:BmI3IhrJ
そういえば他人のコード変更をレビューするとたまに最終行に改行が追加されているのがあって、
「あーこの人が勝手に改行を追加したのかな、まプログラム的には同じだしいっか」とか思って
無視し続けていたが、あれはその人が使っているエディターによって自動的に変更されてた
のかな?
例えば最初にコードを書いた人のエディターは最終文字が改行でなくても構わなかったが
2番目に直した人のは改行を要求するとか...
clang-format あたりでそこら辺は統一できるのかな?
2021/02/15(月) 22:19:21.80ID:aLBeV9m+
最近まで、Ruby の1-liner に、バグがあった

末尾の改行コードを削除するために、chomp を使うべき所で、
文字列の末尾の1文字を削除する、chop を使っていた

最終行に改行が無くて、abc なら、ab になっていたw
558デフォルトの名無しさん
垢版 |
2021/02/16(火) 14:01:37.31ID:kKLrubPe
>>554
fgets はバッファの長さ次第
559デフォルトの名無しさん
垢版 |
2021/02/16(火) 14:15:32.56ID:kKLrubPe
>>554
getline はデフォルトのデリミタだと ' ' と 改行で切られる (ファイル終端の改行はあってもなくても同じ結果)
また fgets と違って取得した文字列にデリミタは含まれない

ちなみに ifs >> s も getline と似た使い方が出来るが
こっちはデフォルトのデリミタは改行のみ ( ' ' ) は取得される
また取得した文字列にデリミタは含まれない

つまり ifs >> s と getline(ifs, s) は同じではない
560デフォルトの名無しさん
垢版 |
2021/02/16(火) 14:20:32.47ID:kKLrubPe
>>554
おまけ
https://ideone.com/rM6lgl
2021/02/16(火) 18:35:37.29ID:7otM+IWb
googleのv8がc++で書かれてるってきいて興味もったんですが最強?
2021/02/16(火) 21:12:19.85ID:I98rHtI/
>>561
そういうインフラ用途には C/C++ しかないかと‥‥
563デフォルトの名無しさん
垢版 |
2021/02/17(水) 18:17:22.87ID:8Df3qLX7
v8 って node.js やん
2021/02/17(水) 18:40:43.14ID:ZNwah53O
v8みたいに飛躍的に処理速度伸びたエンジンって他になにかあるんですか?
2021/02/17(水) 19:16:52.88ID:Pg4t51og
sourcetrail入れてみた
2021/02/23(火) 08:35:11.77ID:qdsH3SX7
すみません、C++で0以上の整数の範囲を表す型を使いたいのですが、どうするのがおすすめですかね?
struct { unsigned begin; unsigned end; }; ま、基本的にこれでいいんですが、もしより良い方法があれば...

- もしかして std::pair の方がいいんですかね? ただの struct よりメリットがあったりします?
- 一応、「有効な範囲を指してない」という状態が明確化できたらいいんですが... 最近 std::optinal というのを
知ったのですが、大げさ? 上記 begin と end を signed にして負のときは無効、とかでもいいんですが。
- 2つの範囲に対して各種集合演算的なものもできるとさらに。
2021/02/23(火) 12:05:47.24ID:EYNng8zF
lowerbound+offsetの方が融通が効くのでは
範囲としては倍表せるわけだし
wrap around しても2周はしないわけだから、範囲に入ってるかの判定には問題は無い
2021/02/23(火) 13:18:31.42ID:iu17pC6m
>>566
> - 一応、「有効な範囲を指してない」という状態が明確化できたらいいんですが...
end < begin なら有効でないってやればいいだけじゃね?
2021/02/23(火) 14:15:26.47ID:ZvemQ+Fv
>>566
std::ranges::views::iota
2021/03/06(土) 08:41:51.96ID:QrSKtEDt
変な質問ですが
std::vector<int, std::allocator<double> > を定義しようとしたら
static_assertでタイプが違うと指摘されました
じゃあなんでテンプレート変数分けてるんですかね...?
571デフォルトの名無しさん
垢版 |
2021/03/06(土) 10:56:56.05ID:DM5zd16W
自作のアロケータを使う時に使う、
型が違うのはお約束に反する
2021/03/06(土) 11:39:26.93ID:8MIrd+yZ
テンプレートテンプレートパラメータにしなかったのは何故なんだろうな
2021/03/06(土) 12:39:02.65ID:QrSKtEDt
>>571 そう言われてみれば当たり前の話な気がしますね・・・
2021/03/06(土) 12:45:22.81ID:4A7TIztL
ああそうか、Allocatorだけ受け取る方法もあるのか
2021/03/12(金) 20:55:45.62ID:ZDqlVx3B
すみません。C/C++自体というよりは、その学習方法についてですけど、教えて下さい。
ネット上で無料で公開されているC++の学習コンテンツで一番良いもしくは定番のものはどれでしょうか?

私はC, Java, C#の経験があります。しかしながら、Cはほとんど忘れてしまいました。
その状態の人間がC++をネット上の無料のコンテンツのみで学習したいのですが、どのページが良いでしょうか?
開発環境は既に準備しました。


よろしくお願いいたします。
2021/03/13(土) 11:40:09.75ID:g/wAdnDh
とりあえずwebのロベールとかでも良いとは思うけど・・
独習とかの本は何か持っといた方がいいと思う
2021/03/13(土) 14:13:55.98ID:aUdFS8U8
ウェブのロベール本ってこれのこと?
http://www7b.biglobe.ne.jp/~robe/cpphtml/
いまどき #include <iostream.h> とか書いてあるのはちょっと微妙だと思うぞ。
どの箇所だったか忘れたけど const の扱いで現行の仕様に合わない部分について
Taratail だったか Qiita だったかで見た記憶もあるし。

個別に見ればささいなことだけど、
入門者はそのささいなこともわかってないから入門者なわけで、
細かい引っ掛かりが多いとしんどいんじゃないか?
2021/03/13(土) 14:52:13.00ID:o3uThhpf
>>575
本を買った方がいいでしょう、それも複数買う前提で、この世界では「一冊で完結」は無理です

最初の一冊なら私なら旧独習をお勧めします(私がそうでしたから)、が、新独習の評判は聞いてみたいとは思っています
2021/03/13(土) 15:28:12.06ID:iXgnaDGC
>>577
お前がゴリ押ししてる江添本よりはマシだと思うよ
2021/03/13(土) 15:50:23.66ID:aUdFS8U8
>>579
俺は江添本を (全体を通しては) 読んだことがないのでごり押しするほど強い関心無いんだけど。

ただ C++ は C++11 が大きなターニングポイントになってるので、それより古い前提の説明は論外という立場。
ましてや C++03 にすら合致しないのは論外も論外。
論外のものを除いて入門向けにマシそうな、
しかも無料で読めるものというと江添本以外に実質的に選択肢がないからよく挙げるだけだよ。
2021/03/13(土) 16:12:25.33ID:g/wAdnDh
QZも言ってるが独習の新版はC++17らしいぞ
2021/03/13(土) 16:33:14.60ID:aUdFS8U8
>>575
話題に上がったから紹介しておくけど、江添本ってのはこれのことね。
https://ezoeryou.github.io/cpp-intro/
入門書であまり取り上げられないけど入門者が躓きがちなコンパイラのコマンドの話や makefile とかいった周辺事情も
取り上げているかわりに、ヘッダファイルを使い分けしなかったり、継承を扱わなかったりで、
網羅的に C++ を理解するための本ではない。 入門者が入門するための本。
それ以上のことは他の本を読めという投げっぱなしだが、
とりあえず無料で基礎をおさえられる (しかも日本語!) という意味では他に紹介できるほどのものはない。

C++ ではありがたいことに無料で利用できるリファレンスは意欲的に整備している方々がいて、
https://ja.cppreference.com/w/
https://cpprefjp.github.io/
あたりを見れば細かいことも書いてるんだけど……。
まあ当たり前だが入門書をひとつも読んでないレベルだとみてもわけわからんと思う。

本気で取り組むなら本の数冊くらいは買ったほうがいいと私も思う。
2021/03/13(土) 16:48:52.40ID:g/wAdnDh
そら今時コマンドラインツール使っててソース1つだけで書いてるようなC++オタクには合ってるかもしれんけどな・・
2021/03/13(土) 17:11:08.84ID:aUdFS8U8
他に存在するなら紹介するんだけど、
無料でという制約の中で (個別のブログ記事とかじゃなく) それなりに筋道をつけた入門書で古すぎないものとなると無いだろ。
英語でいいならあったりするかな?
2021/03/13(土) 17:54:16.06ID:pYfy5bp8
>>581
自分は半月ほど前に最新版の独習を買って、半分ぐらい(p370あたり)読み進めているんだが、「本書について」によると、C++14とC++17をメインのターゲットにしてるって書いてますね
2021/03/14(日) 08:22:46.92ID:Zb/GuQ+J
アドバイスありがとうございます。
とりあえず、教えていただいたロベールさんのページを見たのですが、網羅的に書かれているようなのでまずはこれを読もうと思います。

> いまどき #include <iostream.h> とか書いてあるのはちょっと微妙だと思うぞ。
すみません。これ、何が悪いのでしょうか。。。

あと、教えていただいて気がついたのですが、C++も結構色々なバージョンがあるのですね。
私が今回触らなければならないコードはかなり前のコードなので、もしかすると古いバージョンのC++かもしれません。
その辺も意識して勉強しなくては駄目ですね。
2021/03/14(日) 10:23:48.46ID:FJEdpMO0
今はもう標準ライブラリに.hがついてるのは無いからそもそも実行できない可能性ある
2021/03/14(日) 10:49:48.45ID:8Ki8FhWw
実行?
589◆QZaw55cn4c
垢版 |
2021/03/14(日) 14:53:49.63ID:uaeFGveg
>>585
旧独習には「std::stringを自分で実装せよ」という初級者には眩暈がするほどの崇高な課題が採用されていましたが、新独習には「〜を独力で実装せよ」系のお題は採用されていますか?
すくなくとも「〜を独力で実装する」系お題が可能になるだけの基礎知識をつけてくれる本ですか?
2021/03/14(日) 17:03:20.15ID:ERa14GlL
>>589
全13章605ページのうち7章380ページまで進んでいますが、そのようなお題にはお目にかかっておりませんな。
練習問題やその章の理解度チェックで色々な問題が出されていますが、何れも本をよく読めば解ける問題ばかりです。
さらっと先まで目を通してみましたが、そのような課題は見当たらないようです。
旧版のどの箇所あたりで出題されたものですか? もしかして、全く別の本のことなのでしょうかねえ。

↓の「おまけ」にあるような解答を求める問題でしょうか?
std::stringの実装に学ぶC++入門 - Qiita
https://qiita.com/YSRKEN/items/dd3b11e4670bb2b829a5

自分はまだ独習中で、C++は未だ*や&、&&、で頭の中がグルグル回ってしまうレベルなもので、理解できそうですが
いきなり自力で作れそうにありませんわw
2021/03/14(日) 18:12:48.12ID:aW+jce3e
>>586
> これ、何が悪いのでしょうか。。。

1998 年に国際規格 (ISO) になって以来、規格に iostream.h というものが有ったことはない。
.h は不要。
諸々の事情から iostream.h も用意している開発環境が多かったせいか
古い書籍では iostream.h としている場合は少なからずあるのだけれど、
主要な処理系の標準への準拠が急速に進んだこともあって、
資料も規格に寄せた書き方が今では普通。
iostream.h は古い本の象徴みたいな感じになってる。

そんでもって規格にない以上は iostream.h が存在しない開発環境も普通にあるってのが問題。
https://wandbox.org/permlink/kwpJf5BumkarYWYD
規格になくてもデファクトスタンダードとしてどこにでもあるってのならまあいいかと思わないでもないけど、
無いこともあるんだ。
そういう環境だともちろんエラーになる。

初心者が入門書の最初に載ってるコードを入力してみてエラーになるってのは良くはないだろ。
そんでもって問題がそれだけとは限らなさそうという……と思わせるサインなんだよ、 iostream.h は……。
592◆QZaw55cn4c
垢版 |
2021/03/14(日) 20:04:14.75ID:uaeFGveg
>>590
手元の旧独習4版(ハーバード・シルト著)6章末「総合理解度チェック」
・次の演算ができるような strtype クラスを作成しなさい
・+ 演算子による文字列連結
・= 演算子による文字列代入
・<>==による文字列比較
固定長文字列を使ってもかまいません。難問ですが、よく考えていろいろと試してみてください。
必ずできるはずです。
593◆QZaw55cn4c
垢版 |
2021/03/14(日) 20:13:24.03ID:uaeFGveg
>>590
>C++は未だ*や&、&&、で頭の中がグルグル回ってしまう
これらの「記号」は習得に順序があります。
まず * をしっかり理解します。C/C++ はなんといってもポインタが基本です。
次に参照 & を理解します。参照& を使う場面が出てきたら、これを * を使った書き方に書き直す、という機械的な訓練がいい練習になるでしょう
参照 で返す、という場面でも、@参照返しが出来る場合と、A参照返しはできずせいぜい RVO に期待するしかない場合、の@A二つの違いを明確に即答できるようになるべきでしょう(最近まで私はそれができなかった……)参照& の表現は新しい表現( ranged-for とか) でよく目にしますし、@Aは結構重要だと思います

&& は多分最後でしょうね、私も && は良く分かっておらず、というか、分からないから使わないという態度に留まっていますが、まあそれでもなんとかなる気がします
2021/03/14(日) 20:26:39.87ID:ERa14GlL
>>592
やはり「独習」の違う本でしたわw
自分はC++関係の5ちゃんスレすら最近になって見てるんで、知らなかったけど
その本が「独習」のスタンダードなんですねw
独習C++ 第4版
https://poland-it-blog.com/c_plus_books/

自分のは、↓の9位に入ってる本です。(しかも同じ出版社)
https://freelifetech.com/cplusplus-books/
ご紹介の独習はやり応えありそうなので、今の本を2回ほどやってから、次のステップでそちらを検討してみますわ
2021/03/14(日) 20:28:56.28ID:EFkbulbJ
QZ案外初心者やなw
でも言ってることは全面的に賛成
ポインタや参照、クラス等の基本を抑えてからでないとスマポや、C++11からの要素(右辺値参照含む)の使い方もわからんと思う
2021/03/14(日) 20:35:47.41ID:ERa14GlL
>>593
大変勉強になります
今後もよろしく
597デフォルトの名無しさん
垢版 |
2021/03/14(日) 20:46:24.30ID:uaeFGveg
>>595
>でも言ってることは全面的に賛成
ありがとうございます!

>QZ案外初心者やなw
もう永遠の初心者のままだと思っていますが、それならそれで「初心者の気持ちが分かる視点からの意見の表明」という形でコントリビュートするのもありかな…、と。
2021/03/14(日) 22:01:53.26ID:uaeFGveg
>>594
>>592 は歯ごたえがありそうでしょう?私もこの課題を最初に見たときは眩暈がしました…
それから 10 年くらいかな??それくらいたってから https://mevius.5ch.net/test/read.cgi/tech/1434079972/37 を書き、なんとか卒業できたような気がします
なおこれは、これでも例外方面に配慮が行き届いていない、とさらに書き直した気がしますが、その書き直しは失くしてしまいました……
2021/03/14(日) 23:21:43.64ID:aW+jce3e
個別の機能を理解してからそれの組み立て方を学習するのがまどろっこしく感じる人もいると思う。
抽象度の高いほう (スマートポインタなど) から解体していく形での
学習のアプローチもそれはそれでありかもしれん。

個人的には個別の機能を先に学んだほうがいいとは思うんだけどね。
実例から学ぶと使い方のパターンとして頭に入ってしまって正確な理屈を
きちんと習得できない気がするから。

そうは言っても途中で学習を諦めてしまうようだと正確さもくそもないから、
人によってわかりやすさは違うし学習にはいろんなアプローチがあるということは
覚えておいてほしい。
2021/03/14(日) 23:51:21.81ID:uaeFGveg
確かに、私が理解している狭い範囲においても、イテレータが先かポインタが先か、とか
C++11 / std::thread から入門したけど posix-thread なんか知らん!とか
そんな人から補強説が来るのが楽しみです
2021/03/15(月) 07:36:02.64ID:PXZ12KYt
>>591
ご回答ありがとうございます。
理解しました。
その辺も調査しながらやります。
2021/03/15(月) 13:58:23.84ID:RVKfnS+W
QZが意外と素直で好印象度アップ
逆に高飛車な餃子の高感度ダウン
2021/03/15(月) 21:47:16.57ID:pqfQRyG1
Qちゃんは昔からいるけど態度は変わらんね
ときどき自前のコード上げてるあたりは好ましい
プロへのリスペクトは持ってるし謙虚ではある

餃子ちゃんはマジメというか
いちいち規格に沿って発言してくれるんで好ましい
ただコード上げてるのはみたことないんで実力は不明
アマチュアなのにときどき調子乗っちゃってるのも微笑ましい
2021/03/15(月) 23:09:56.95ID:kCaDVUc0
はちみつのコードたまーに見るけどすごい変な癖があるよ
意味があるなしに関わらず固執するタイプなんだろうな
2021/03/16(火) 13:45:10.41ID:A61zCves
参照を返す関数の質問です。
オブジェクトの複数のパラメータを設定するときに、obj.param1(...).param2(...).param3(...); みたいに呼ぶ
パターンがあるじゃないですか(ちなみにこれって名前はあります?)

これをやりたいときは
Obj& param1(int val) { mParam1 = val; return *this; }
みたいに参照を返すように宣言しないとダメですよね?

Obj param1(int val) { mParam1 = val; return *this; }
だと、obj.param1(...) は動くけどリターン用にオブジェクトの(余計な)コピーが発生する、
obj.param1(...).param1(...) みたいに呼んだ場合はオブジェクトのコピーに2番目の呼び出しが行われ、
結局破棄されてしまうので、objに2番目のparam1()の呼び出しが反映されない。
こんな理解で正しいでしょうか?

実は参照を使う判断にイマイチ迷っているんですが、もしかして毎回(オブジェクトの宣言、引数、戻り値等)、
「このときはここでオブジェクトのコピーが発生するから...」とかイメージすべきなんですかね?
例えば関数の戻り値、関数を出るときに戻り値が臨時で複製されて呼び出し元に渡されるイメージを持って、
「ああこれだと余計なオブジェクトが生成されるよな、じゃあ参照だ。」的な判断?
2021/03/16(火) 16:13:51.30ID:xnFU2goU
builderパターンやね
2021/03/16(火) 16:40:47.45ID:AqAKN3jJ
クラス構成を見ればビルダーパターンにあてはまりそうだけど、
メンバ関数を連鎖していく表記法のことはメソッドチェインと言ったり、
目的から言うと名前付き引数イディオムということもある。
https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Named_Parameter
(要するに考え方のレイヤによる。)
2021/03/16(火) 17:00:51.56ID:7emEuadh
obj + a + b + c
 operator + () は obj そのものを書き換えず、新たな実体を戻す

obj += a
 operator += () は obj そのものを書き換えるついでに、自分自身の参照を戻す

これのどっちに合致したほうが都合がいいかで
複製を戻すか、自分自身の参照を戻すかを分けてる感じ
2021/03/16(火) 20:32:04.07ID:VN15UowM
>>605
> (ちなみにこれって名前はあります?)

大きく言うとFluent interface
https://en.wikipedia.org/wiki/Fluent_interface
2021/03/16(火) 21:25:10.58ID:EIvloTfy
>>609
その wikipedia の C++ サンプルは int main() が二箇所に現れていますが、これってどう読むのですか?
2021/03/16(火) 22:36:52.42ID:ne+I3KBD
すみません。
仮に、本を買って勉強する場合は独習C++というのがいいのですか?
独習C++はCの知識がなくても大丈夫ですか??
2021/03/16(火) 23:10:25.95ID:AqAKN3jJ
>>610
単に使い方のサンプルを便宜的に main で書いてあるだけでふたつあるのは特に意味ない。
2021/03/18(木) 18:04:58.78ID:KYeguKkE
>>611
2021/03/18(木) 18:05:52.45ID:KYeguKkE
>>611
江添本一択
2021/03/18(木) 18:59:10.35ID:OslqqG1Q
>>611
C関係無しで覚えるのもいいんじゃね?
2021/03/18(木) 19:00:25.69ID:OIk6P4WM
>>611
独習C++はCの知識が前提だったはず
2021/03/18(木) 23:28:58.79ID:QiBLMBVe
>>605
>これをやりたいときは
>みたいに参照を返すように宣言しないとダメですよね?
>obj.param1(...).param1(...) みたいに呼んだ場合はオブジェクトのコピーに2番目の呼び出しが行われ、
>結局破棄されてしまうので、objに2番目のparam1()の呼び出しが反映されない。

確かに、メソッドチェインを繰り返すたびにコピーコンストラクタが呼び出されるのは、イマイチ、という感覚を私も同様に持ちます
だからメソッドチェインを書くときには私も参照を返すように書きます、結局のところ「参照を返す」というのは「ポインタを返す」ことですから、コンストラクタの走りようがない

しかし「参照を返す『必要がある』」と言い切れるかどうか?
「結局破棄される」というのは最後のメンバ関数が返す実体を回収していないからであり、「参照を返すから」破棄されるわけではないと感じました。
実際、この実体を回収すれば、それはそれで 2 番目以降の呼び出しが意味を持つように書けると思います

https://ideone.com/skVFOr
https://ideone.com/LAKqIj

参照でよくわからなくなったときに私がよくやる「参照返しを全く使わずポインタで押し通す」とすると次のようになるかと思います
https://ideone.com/R82zEE
2021/03/19(金) 03:28:58.86ID:mbZVOQ2F
だからムーブコンストラクタとムーブ代入演算子があるんだろうが・・
2021/03/19(金) 03:37:37.65ID:0CmLwf9e
>>617-618
てかそもそもコンストラクタ走っていいのかよこの場合に
2021/04/09(金) 12:21:23.57ID:dUyySPje
クラスFooのメンバ関数fの型ってどう書くの?
戻り値void、引数intです。
2021/04/09(金) 12:52:45.71ID:N6zWukcq
>>620
f の型は void (int) だけど f へのポインタの型は void (Foo::*)(int)
2021/04/09(金) 18:45:41.35ID:WYvZUx+H
>>621
それはメンバ関数へのポインタでしょ
聞いてるのは関数の型でもなく、メンバ関数の型です
2021/04/09(金) 20:18:08.96ID:DC3guaga
言われてみれば関数の型ってなんだ?
2021/04/09(金) 21:13:09.06ID:foJJo5gI
C だと関数指示子 (Function Designator) で説明されたりするんだが、
C++ の仕様を Designator で検索しても出てこないな。
シグネチャもまたちょっと違う概念だし、
このあたりのきちんとした解説がまとまったものがあればぜひ読みたい。
2021/04/09(金) 21:39:18.43ID:MYEEijki
「メンバ関数の型」が必要になるケースって何じゃろ?
2021/04/10(土) 01:44:53.83ID:4ITkpFPM
>>622
だから「f の型は void (int)」って書いたのに、なんでそれが答えじゃないと思うの?

typedef void ftype(int);
struct Foo { ftype f; };
void Foo::f(int) {}
int main() { Foo x; x.f(0); }
2021/04/10(土) 08:44:20.64ID:gtw6CEDD
関数ポインタを考える以前は関数の型と言えばイコール評価した値の型だったな。
2021/04/13(火) 16:10:43.48ID:uVvL/txB
今は関数の型とかもうどうでもよくて
一周回り帰えりキャプチャとかダイナミックスコープとかの有用性や整合性が中心よね
2021/04/15(木) 15:55:01.75ID:6RtJrvVe
pod的な意味でなく論理的整合性的な型付けの恩恵受けたいなら、別に包む必要無くても常に即席structで返しててやんでい
2021/04/24(土) 08:11:28.54ID:LUJ0Utr0
C++/CLIで、スタティックライブラリからマネージドクラスを公開するのは無理なんでしょうか?
ヘッダファイルに全部実装書けば出来る、ってところまでは調べたんですが、ソースコードをプロジェクト外に置いてるのと変わらないので…。
ダイナミックライブラリでできるならそれでも構わないです。
2021/04/24(土) 08:19:46.15ID:nPKzA798
>>630
.NETでstatic libraryなんて作れたっけ?
最終的に.exeと.dllができるのが邪魔だからstatic libraryにしたいというだけなら、
いったんDLLとして作ってILmergeするのが一般的だと思う
2021/04/24(土) 08:36:31.23ID:LUJ0Utr0
>>631
Lib自体は作れるし、アンマネージクラスなら公開もできるんですが、マネージクラスだと参照側でメンバーが参照できず、LNK2020が発生してしまうんですよね。
ビルドオプションでなんとかできるものなのかな、と。
2021/04/24(土) 09:53:24.75ID:K4uxnQki
LNK2020ってそれnativeのC++からリンクしようとしてる?
2021/04/24(土) 14:56:57.93ID:LUJ0Utr0
>>633
libなのでクライアントはC++です
2021/04/24(土) 15:16:56.42ID:K4uxnQki
そりゃ無理。その仲立ちをするためにC++/CLIがあるのに。
一応nativeのC++からでも自分でCLRを立ち上げたりしてマネージドクラスにアクセスする方法は
あるらしいが、リンクしてそのまま呼ぶという形にはならない。
636デフォルトの名無しさん
垢版 |
2021/04/24(土) 15:41:46.62ID:at4cvaWV
自作のプログラム、起動時の読み込み処理の前に以下を入れると
for(int i = 0; i < 100; ++i){
OutputDebugString("dummy!!!!\n");
}
起動時に行っている外部データの読み込みが凄く速くて
これを無くすと凄く遅くなるんですが怖い…
3分くらい違いが出るので明らかにおかしい
どっかでメモリでもぶっ壊れてますかね?
どういう理由が考えられるでしょうか?
637636
垢版 |
2021/04/24(土) 15:43:36.70ID:at4cvaWV
さっきのダミーを入れなくても
普通にコードを追加したりしてても遅くなったり速くなったりする
別に読み込み処理の部分とは関係ないところでも。
なんでだろう?
2021/04/24(土) 15:54:20.61ID:hc4SaSPr
>>637
それは、本当に native の C++?
もしかして、C#のC++/CLI とか?
2021/04/24(土) 16:03:17.28ID:lkpB631F
コンパイラはほんと何してるのか分からんから、問題の部分だけ切り出したのを.sへ吐かせて読みなさい
10行程度のcコードなら、edxとか変な名前のは取り敢えず変数だなって思って追えば、アセンブリ知らずとも大体分かるよ
2021/04/24(土) 20:39:49.92ID:LUJ0Utr0
>>635
いや、
C++ライブラリ内にマネージクラスを作って
マネージのC++プロジェクトから
呼び出したいだけ
DLLだったら、C#のDLLからマネージクラスを呼び出すのと
理屈上同じだからできそうな気がするのだけれど

以前実装した時はInterfaceだけ公開して
呼び出されるとそのインスタンスを返す、みたいなことをしたんだけれど
2021/04/24(土) 21:31:19.65ID:+v1plSJo
>>640
.NETはstatic libraryをサポートしていない
出来上がった.libにはそのマネージドクラスのメタデータとか入ってないんじゃない?
2021/04/25(日) 00:05:51.07ID:Oojm0ZzH
>>641
結局そういうことだよね
なんか普通にlibのクラスを呼び出せますみたいなのをサンプル付きで出してた記事があってさ…。

まあstaticメソッドしかないクラスばかりだから、アンマネージクラスで公開するか、namespaceでまとめます。
ありがとうございました。
643636
垢版 |
2021/04/25(日) 00:07:18.69ID:sRfn5IZk
>>638
C++とWin32APIのプログラムです
>>639
これは自分へのレスですか?

特に遅くなる以外は止まったりする事もないので
困ることはないですがなんか気持ち悪い…
2021/04/25(日) 03:40:15.50ID:vJWG11Gh
>>643
外部データの読み込みは、fopen, _open, CreateFile、CFile のどの系統を使
ってる?
2021/04/25(日) 03:43:25.25ID:vJWG11Gh
>>643
関係ないかもしれないが、HDDが寿命で故障寸前の時にHDDの読み込みが
時々極端に遅くなったりする現象を経験したことがある。
その場合は、そのプログラム以外でも同様の現象が起きるが。
2021/04/25(日) 03:49:56.55ID:vJWG11Gh
>>645
もし、他のアプリやファイルマネージャーも遅くなることがあるなら、
CrystalDiskInfoなどで診断してみて欲しい。
そのアプリだけ遅くなるが、アプリの動作は正常、というなら、
メモリーやスレッドやOSリソースの使いすぎなども考えられなくは無いが。
何か極端に変わったことしてたりしない?
2021/04/25(日) 09:07:00.47ID:x26Nnfhp
OutPutDegugなんちゃらの関数がファイル出力してるなら、単純にそのドライブのアクセス準備が整ってないとか。

以前、SSDに同じファイル名で一時ファイルの作成と削除を繰り返したら、SSDの仕組み上めっちゃ遅くなったことがある。
2021/04/25(日) 09:59:46.07ID:j6IXZwA/
>>642
どこの記事?
ちょっと気になった
649636
垢版 |
2021/04/25(日) 10:38:16.68ID:sRfn5IZk
>>645-647
遅くなる原因の個所が分かった!
画像を読み込む時にメモリを操作して
16bitで読み込む部分があるんだけど
これを32bitで読み込むようにすると
どんなコードでもまったく遅くならない。
メモリの操作の部分がおかしかったみたい。
自分で書いたコードじゃないのでよくわからない。
32bitのやつと16bitのやつを載せるのでおかしい所あったら教えて。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況