C++相談室 part152

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2020/07/12(日) 13:42:20.13ID:TX1mpKr6
https://mevius.5ch.net/test/read.cgi/tech/1589424805/
2020/08/27(木) 06:37:57.11ID:7Sruawh3
>>195
basic_iosとios_baseみたいにテンプレート化する必要のある部分と不要な部分に分けるとか
2020/08/28(金) 17:02:52.88ID:BFWbiW8H
関数へのポインタが、メンバ変数に有る場合、例えば、
class CXxx {
public:
  void (*pfn)(int a);
  void (*pfn)(float b);
};
の様な場合、
pXxx->pfn(5);
pXxx->pfn(10.0f);
とした場合に、関数呼び出しに使われる関数ポインタが自動的に選択されるでしょうか?
つまり、関数ポインタについても、関数と同様な「オーバーロード解決」が行われますか?
そもそも、上の様なクラスは、定義時にエラーになるでしょうか?
2020/08/28(金) 17:09:28.47ID:47MLab1u
自分で動かしてから質問しろよ
2020/08/28(金) 17:09:34.31ID:namGYget
同じ名前のデータメンバーをふたつ定義してるからアウト
2020/08/28(金) 17:26:26.84ID:bCpDWR5V
>>198
それコンパイル通るかやってみ
2020/08/28(金) 17:41:13.83ID:AJ/VhFe8
ここに質問するより少ない手数で試せるだろうに何やってんだろうね
2020/08/28(金) 17:44:35.89ID:TvC7lNeF
>>198
関数は多重定義できるが
関数へのポインタは多重定義できない
2020/08/28(金) 17:48:03.23ID:TvC7lNeF
ちかっとエスパーすると
class CXxx_base {
public:
  virtual void fn(int) = 0;
 virtual void fn(float) = 0;
};
class CXxx : public CXxx_base {
public:
  void fn(int) override { }
 void fn(float) override { }
};
pXxx->fn(5);
pXxx->fn(1.0.f);
これでおまえさんの考えてることはできるんじゃないか?
2020/08/28(金) 19:11:25.34ID:KPVk+Ml/
>>198
机上の空論持ってくるな
きちんと検証してから持ってこい
206デフォルトの名無しさん
垢版 |
2020/08/29(土) 11:57:26.58ID:HmjSn9P9
関数へのポインタって関数じゃなくてただのメンバ変数だからな
207デフォルトの名無しさん
垢版 |
2020/08/29(土) 14:38:37.69ID:EjjA84a9
>>196
>ボイラープレートコードをまとめたクラスをミックスインするときに使うもの
ちょっとかっこいい(型情報ある)マクロみたいな感じか
208デフォルトの名無しさん
垢版 |
2020/08/30(日) 13:47:11.43ID:6dVOYYO/
構造体を使った配列の記憶にて
配列に順に入力しても出力が上手くいきません助けて偉い人
2020/08/30(日) 13:49:26.97ID:KF/F+MKa
スルーで
210デフォルトの名無しさん
垢版 |
2020/08/30(日) 13:51:20.52ID:GgAZZaQa
100歩譲っておま環
211デフォルトの名無しさん
垢版 |
2020/08/30(日) 14:21:16.52ID:6dVOYYO/
void dataInput(Student& st){
string ans;
for(int i=1, i<=n;i++){
cin>>st.id;
pN[i]=st.id;
cin>>st.ans;
pA[i]=st.ans;
}
};
void showData(Student& st);
int main(){
cin>>n;

pN = new int[n];
pA = new int[n];

Student st;
dataInput(st);
showData(st);

return 0;
}
void showData(Student& st){
for(int j=0; j<=n; j++){
cout << pN[j] << pA[j] << "\n";
}
}
定義はファイル別にしてある
正直すまんかった
2020/08/30(日) 14:23:30.40ID:KF/F+MKa
デバッガで自分でトレースしろ
213デフォルトの名無しさん
垢版 |
2020/08/30(日) 14:28:47.09ID:GgAZZaQa
死ね
214デフォルトの名無しさん
垢版 |
2020/08/30(日) 14:54:19.28ID:6dVOYYO/
hファイルの方
struct Student{
int id;
char ans;
};

int n;
int* pN;
char* pA;

cppファイル冒頭
#include <iostream>
#include <string>
#include "funk.h"
using namespace std;
215デフォルトの名無しさん
垢版 |
2020/08/30(日) 15:13:34.04ID:6dVOYYO/
デバッグしたけど問題は見つかりませんでしたと出た。出力に問題があるっぽい
216デフォルトの名無しさん
垢版 |
2020/08/30(日) 15:22:13.56ID:6dVOYYO/
自己解決しました!iとjの初期値を1から0にしたら解決できました。
217デフォルトの名無しさん
垢版 |
2020/08/30(日) 15:22:13.70ID:6dVOYYO/
自己解決しました!iとjの初期値を1から0にしたら解決できました。
2020/08/30(日) 15:57:12.85ID:HKGZh04b
きちんと検証しろ
ソレができないなら初心者スレか日記帳にでも書いとけ
2020/08/30(日) 17:44:09.91ID:oWP9MzfY
これはひどい
2020/09/04(金) 17:01:57.31ID:8b49PodW
hage
2020/09/04(金) 17:03:42.03ID:LCYaN/vD
どっちのだよ
2020/09/04(金) 17:11:42.93ID:ML6iv+hM
https://dotup.org/uploda/dotup.org2246504.jpg
223デフォルトの名無しさん
垢版 |
2020/09/07(月) 16:37:42.90ID:AmzB5PF6
githubなりに落ちてるc++で書かれたアプリなりを読んで勉強しているんだけど、
include無限ループに陥って萎えてしまうのですが、どうしてますか?

mainのinclude沢山→その指定先にもinclude沢山→stlなりのライブラリ(ここは読まずネットでドキュメント読む)
で相当時間食ってしまうまのですけど、コツとかありますか?
2020/09/07(月) 16:42:08.11ID:bjXgxZkO
includeガードしろ
2020/09/07(月) 16:54:18.66ID:4QMtZq9v
ていうかなぜ初学者なのにいきなりそんな重厚長大なアプリからチャレンジしようとするのか
自分の力量を過大評価しているのではないか
まずヘローワールドとかそういう簡単なとこからはじめなさい
226デフォルトの名無しさん
垢版 |
2020/09/07(月) 16:57:38.12ID:x8yvSFtj
コンパイル時にg++とかなら-Eオプションつければ
実際のプリプロセッサの処理の結果が確認できる
2020/09/07(月) 16:58:04.33ID:3Ozv9Uf+
読まなきゃいいじゃん
何のために全部読もうとしているのか自問自答したら?
2020/09/07(月) 17:02:08.59ID:qk/9c7gK
>>223
身の丈に合わない巨大なプロジェクトを読もうとしてるか、または愚直に頭から全部読もうとしてないか?
お前さん自身がコンパイラじゃないんだから、頭からすべて把握して読んでいく必要はないぞ。
まともなソースならオブジェクト指向で書かれてるのだから、上位層で大筋を把握しながら必要に応じて深いところに入っていって、有用そうな所や興味があるところだけ詳しく読めば?
ヘッダファイルは使ってるライブラリとかの当たりをつける程度でざっと読み飛ばして、定義を調べたくなったときにIDEの機能で見に行けばいいだろう。
229デフォルトの名無しさん
垢版 |
2020/09/07(月) 17:05:02.17ID:Egt+Qwmp
吊りかも知れないが勉強中とのことなので
マジレスすると

#include の行を一つづつ消してみて(mainに近い方だけ)
消したらどんなコンパイルエラー出るかを観察する
2020/09/07(月) 17:07:22.95ID:6+huFxV7
>>228
sshのソース読んでも全くオブジェクト指向じゃないぞ。
231デフォルトの名無しさん
垢版 |
2020/09/07(月) 17:13:56.93ID:x8yvSFtj
あらゆるところで参照したいヘッダファイル↓があるとして
./include/common/hoge.hpp

詳細な実装(深い階層にいるやつ)
./include/hage/chibi/debu/unko.hpp
からそれを読み込むときって

#include "../../../../common/hoge.hpp"
みたいにしてしまっているのですが、もっとまともなやり方はありますか?
232デフォルトの名無しさん
垢版 |
2020/09/07(月) 17:18:55.68ID:x8yvSFtj
ちなみにCMakeを使っています
2020/09/07(月) 17:21:09.32ID:ualItUCM
なぜSTLは
#include <vector>
などで読み込めるのでしょうか
不思議ですねぇ
234デフォルトの名無しさん
垢版 |
2020/09/07(月) 17:27:17.02ID:x8yvSFtj
./include/common
をインクルードパスに含めるのは思いついた上で微妙な気がしたから
聞いてます
2020/09/07(月) 17:43:09.75ID:3Ozv9Uf+
まとも〜とか微妙〜とか
そういう表現どう思う?
236デフォルトの名無しさん
垢版 |
2020/09/07(月) 17:44:59.68ID:x8yvSFtj
./include/hage/chibi/
配下ではどこからでも見れるようにするとかしたいときはそこの
CMakeLists.txtにインクルードパス指定する
とかしかないんですかね
237デフォルトの名無しさん
垢版 |
2020/09/07(月) 19:33:13.69ID:u0REhpNo
インクルードガード標準搭載の言語多いのに
ほんと無駄な時間使わせてる言語なんだなって再確認できて辛い
2020/09/07(月) 20:11:18.48ID:bJcKHVeO
>>237
マクロによるインクルードガードなんて決まりきった定型文だし、正直 #pragma に載せる必要もないかと…
2020/09/07(月) 20:19:27.09ID:h3kjQIhT
まあね、GUIDなら衝突の確率340澗分の1だかんな
それすらも衝突したらどうすんだと・・・ほとんど病気だねw
240デフォルトの名無しさん
垢版 |
2020/09/07(月) 20:40:39.15ID:x8yvSFtj
>まとも〜とか微妙〜とか
なんとも思わねえよばあか
2020/09/07(月) 21:32:21.88ID:kH2Fy/8z
そっか君プログラマ向いてないね
知らなくて驚くかもしれないけどコンピュータには感覚じゃなくて理屈しか通じないんだよ
2020/09/07(月) 21:58:09.22ID:PI/34Ato
>>237
C++20 にはモジュールが入ったから……。
243デフォルトの名無しさん
垢版 |
2020/09/08(火) 00:30:42.07ID:h4K4tlm9
誰がプログラマって言ったよ?
理屈しか通じないんだろ?
頭悪そう
244デフォルトの名無しさん
垢版 |
2020/09/08(火) 00:32:32.14ID:h4K4tlm9
自分で言ってることに矛盾してる時点で才能ないよ君
2020/09/08(火) 16:47:11.08ID:FxZYRSTV
is_integralみたいな型判定をメタ関数に渡すとこを書いてて思ったんだが
変数テンプレートをテンプレート・テンプレートパラメータとして渡せるようにはなってないんだよなぁ
ということは、と思ってコンセプトの予定されてる内容調べたら、コンセプトも同様なんだな・・残念
246デフォルトの名無しさん
垢版 |
2020/09/10(木) 08:49:56.48ID:ke8OXyHN
C++でもNPMみたいなパッケージマネージャ使いたい
ヘッダと実装別で書かなきゃいけないのも無駄
このへん解決したAlterC++みたいなの作って
2020/09/10(木) 09:32:44.42ID:xgcscVfX
>>246
>>242
2020/09/10(木) 09:34:27.99ID:LwYTdpan
>>246
ヘッダファイルを実装とは別に用意する仕組みは効率よく差分ビルドするための仕組みとして機能していたんだけど、
テンプレートが登場してからは足を引っ張るようになってるとは思う。
まあ単純に面倒くさいってのもわかる。

パッケージマネージャはディストリビューションに乗ってるものを使いたまえよ。
実行環境の管理と開発環境の管理は要求されるものが本来は違うのだけど、
C/C++ は特権階級的な立場だから実行環境を開発環境として使えるようになってることが多い。

あえて分離したいなら CONAN が有名かなぁ……。 使ったことないけど。
https://conan.io/
249デフォルトの名無しさん
垢版 |
2020/09/10(木) 13:27:37.52ID:ke8OXyHN
>実行環境を開発環境として使えるようになってることが多い
これは古い慣習でそうなってるだけで実は分けたほうが便利な気がする
システム汚さないし、依存関係の解決も楽
そもそも実行環境に不要なはずのものがいることがおかしい

ConanもC++20のModuleも良さそうだけど結局バベルの塔だからなぁ
2020/09/10(木) 13:37:57.10ID:wdhKSMlq
>>249
俺も同意見
開発環境、それとテスト環境もVMwareのゲストにしてる
おっかない実験もするし
251デフォルトの名無しさん
垢版 |
2020/09/10(木) 13:58:43.59ID:h1ZKqHov
>>246
VCPKGがあるじゃないか。
2020/09/10(木) 15:13:20.95ID:LwYTdpan
>>249-250
それは重々承知なんだけど C/C++ では分ける体制になってないから
無理して分けるとそれはそれで変になるって話。
2020/09/10(木) 16:03:33.34ID:wdhKSMlq
変になるって、具体的に何?
2020/09/10(木) 18:50:19.73ID:6Z343NeL
>>252
>それは重々承知なんだけど C/C++ では分ける体制になってないから
そうか?
はちみつはそういう経験無いだけだろ
VCでだってクロスプラットフォームは可能だぞ
255デフォルトの名無しさん
垢版 |
2020/09/10(木) 18:55:15.35ID:h1ZKqHov
VSがクロス一番楽。
256デフォルトの名無しさん
垢版 |
2020/09/10(木) 18:56:59.66ID:h1ZKqHov
C/C++はコンパイラメーカーがローダーを用意していない。
これに尽きる。
2020/09/10(木) 19:04:13.58ID:wOYL1pS0
最近は何でもdockerに突っ込んでいる。
vscode + remote containerで開発環境の構築も楽になったし。
258デフォルトの名無しさん
垢版 |
2020/09/10(木) 19:05:01.58ID:ke8OXyHN
C++ moduleってテンプレート使ったクラスをモジュール化したとき
プリコンパイルヘッダと原理的に同じで機械語じゃなくて中間表現に
変換されるらしいんだけど、これってコンパイル速度が大幅に改善することはない
ってことだよね?
2020/09/10(木) 19:13:48.12ID:6Z343NeL
よく考えたインクルードでpch併用してるプロジェクトなら、普段のビルド大して変わらんかもだけど
pchが依存するヘッダを書き換えた場合のフルビルドみたいなのは避けやすくなるぽい??
260デフォルトの名無しさん
垢版 |
2020/09/10(木) 19:13:59.29ID:ke8OXyHN
プリコンパイルヘッダを試しに生成するのと
普通にコンパイルするのと試したら2割程度しか時間短縮できなかった
2020/09/10(木) 21:58:54.33ID:LwYTdpan
>>260
二割はでかいやろ。

>>258
従来からもたとえば gcc で LTO を有効にしたときは中間表現で持っておいて
リンク時に最適化とコード生成をやったりはする。
それと同程度のコンパイル速度だろうと考えると
モジュールの導入は速度にはそれほど寄与しないと思う。
262デフォルトの名無しさん
垢版 |
2020/09/10(木) 22:37:36.67ID:ke8OXyHN
うーん まぁチリツモと考えるとでかいか
夢見過ぎだったか
2020/09/10(木) 23:28:14.82ID:LwYTdpan
>>262
ジョジョ、それは高速化しようとするからだよ。
逆に考えるんだ、『もう十分に速い』と考えるんだ。
2020/09/10(木) 23:45:25.82ID:EIogAYj0
質問ですが
 double x = 0.3333;
 printf("x=%f\n", x); // 期待する表示: x=0.3333
みたいなBCD風表記→IEEE 754→再びBCD風表記
としたときに、元の表記と結果の表記が一致することは
保証されてますん?
2020/09/11(金) 00:13:13.30ID:iGbGHAE2
>>264
保証されない。
0.3333 は浮動小数点で正確に表現することは出来ないので誤差は生じる。
誤差があるところから再び十進数の表現にするんだから
元と同じ表現になることは期待できない。
2020/09/11(金) 00:15:27.86ID:ajBE7peV
されてない
2020/09/11(金) 00:22:49.83ID:WOjxtKnw
不可逆変換
2020/09/11(金) 00:27:13.22ID:1mBomO61
何がしたいんだろな。
2020/09/11(金) 00:31:20.53ID:hb2JlHSF
ちょっソ───スコ───ドに0.3333と書いたのに
0.33331とかに解釈になったらスゲーまずくね??
2020/09/11(金) 00:38:43.10ID:ajBE7peV
初心者スレは別にあるだろ
2020/09/11(金) 00:40:37.59ID:OVJtRCSC
さすがにもう少し精度が高くて、doubleなら
0.3333000000000001 くらいの誤差じゃない?(適当)
2020/09/11(金) 00:41:20.87ID:hb2JlHSF
何がしたいのかというと実行時計算ができる有理数クラスを書いたんじゃが
ソース値がソースコードに浮動小数点で書かれていた場合は当たり障りのない有理数にしたいわけで、
たとえば
 Rational x = 0.11;
と書けば済むところはそのまんま
 x.m_num == 11LL // 分子
 x.m_den == 100LL // 分母
とかになってホスイ
(必ずいちいちRational x = Rational(11, 100);と書かなければならないことはユーザー(≒漏れ自身)に強制したくない
2020/09/11(金) 00:43:42.19ID:hb2JlHSF
つかソースコードに書かれた浮動小数点数を文字列化して元に戻せることの重要性を
書いたコンパイラの教科書はマイナーかもしれんが実在したで(記憶モード

そのやり方こそ今思い出すべきなのだが手元に無いから質問すた、
2020/09/11(金) 00:44:51.33ID:ajBE7peV
>>272
ユーザ定義リテラルでも作れば?
2020/09/11(金) 00:45:17.34ID:OVJtRCSC
固定小数点?
2020/09/11(金) 00:50:39.51ID:hb2JlHSF
>>274
やだ

数値的にやるとしたらここ↓のalmost_equal<T>()でも使ってゴニョれば良いんかのう…
https://en.cppreference.com/w/cpp/types/numeric_limits/epsilon

しかし件の本にはこれと似たような演算を書いてあったような気がしないOTL
2020/09/11(金) 00:54:13.41ID:ajBE7peV
>>273
浮動小数ならやり方ははっきりしてんだよ
お前の場合BCDなんだろ?
2020/09/11(金) 00:59:52.73ID:ajBE7peV
>>276
そのRationalクラスが多倍長とかだったら無理だね
64bit/64bitでも無理だろ、たぶん
2020/09/11(金) 01:08:43.17ID:hb2JlHSF
>>278
しらそん
桁の十分不十分は応用にもよるし
足りないとわかったらRationalの方を多数桁対応させるは

とにかくRationalは見かけをdouble型と同様に扱えるように仕上げ鯛、
なぜなら真に走らせたいアルゴリズムはdoubleをtypedefして作ってあって、
それをRationalに差し替えるだけ!と思ってたら
単体テストが10億行ぐらい浮動小数点で書いてあったので…
2020/09/11(金) 01:27:41.74ID:ajBE7peV
それはわかったけど
>>264 は必要?
別にいらんと思うけど
2020/09/11(金) 01:52:30.29ID:tAPrmVM5
文字列受け取るコンストラクタ書くだけだろ
2020/09/11(金) 03:35:25.76ID:iBiKDQ69
char配列に変換して8バイト読み書きするだけのこと
文字列に変換することは忘れろ
2020/09/11(金) 12:52:59.43ID:WJYUzgW7
そもそも0と0.0を区別する方法がないのにどこまで意味のある事なのか
2020/09/11(金) 15:59:42.05ID:Cxw4gZ+X
> (必ずいちいちRational x = Rational(11, 100);と書かなければならないことはユーザー(≒漏れ自身)に強制したくない

無理だろ
Rational x = 0.1;
こんなの、どうすんだよ?
double型の0.1は1/10じゃねえぞ
2020/09/11(金) 16:00:39.94ID:Cxw4gZ+X
denが必ず10のべき、みたいなことにして
誤差が最小になるように頑張るならともかく
286デフォルトの名無しさん
垢版 |
2020/09/11(金) 16:17:57.96ID:FpD9K4HS
>>272
Rational x = "0.11"; を許せばいい
2020/09/11(金) 16:29:19.36ID:6r5prnWG
>>279
仮にテストコードに 0.333333333333333 って書いてあったとしても
それは 0.3333333333333329818 のことだから、
0.333333333333333として受け取ってしまうと逆にテストに失敗するのでは?
2020/09/11(金) 16:36:45.19ID:G2VX17rJ
10億行ぐらい既存テストコードがあるとのことなので文字列とか全面書き換えになる案はNGなんでしょう
でもいい案はなさげ
一旦浮動小数になったら元のリテラルの復元はできないだろうな
289デフォルトの名無しさん
垢版 |
2020/09/11(金) 16:39:43.52ID:su+TWEMf
>文字列とか全面書き換え

Rational にする書き換えはOKなんだろ
2020/09/11(金) 16:43:40.92ID:G2VX17rJ
そりゃクラスの差し替えは局所的な置き換えで済むんじゃないの
浮動小数のリテラルを全部文字列に置き換えることに比べたら楽でしょ
まぁ本人が答えるべきだが状況はなんとなく推測できる
2020/09/11(金) 20:04:14.01ID:ua52u3Jr
そのくらい正規表現で置換すればいいだろ。
だいたい10億行のテストコードが仮に本当なら100%手書きじゃないから一つずつ確認しながら置換するなんてアホなことはしない。
有理数クラスなんて普通は枯れたライブラリ拾って来るけどな
2020/09/11(金) 20:18:44.50ID:G2VX17rJ
だからさ、そこは本人の希望なんだからあれこれ言ってもしかたないじゃん
正規表現で機械的に置き換えたらまずいものもあるかもしれないし
浮動小数と有理数で切り替えたいって言ってるからそのメンテコストもあるだろ
2020/09/11(金) 21:28:10.16ID:opulvzCM
ユーザー定義リテラルとか使ってboost::rationalでも生成したら?

やったことないからできるか知らんが。
2020/09/11(金) 21:35:23.73ID:em6XQ5sn
何にせよdoubleになった時点でリテラル表記の情報は失われるんだから、何がしかの書き換えをするしかない
それがイヤだ絶対やらんと言うなら、じゃあ不可能だよという答えにしかならない
2020/09/11(金) 21:51:53.86ID:aT3N5bZo
プリプロセッサを書けばどうだろう
296デフォルトの名無しさん
垢版 |
2020/09/11(金) 22:53:08.79ID:3mrNom4D
Rational に double の数値が直代入されてるところだけ文字列代入にするための
プリプロセッサ描けば良い話
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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