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

レス数が950を超えています。1000を超えると書き込みができなくなります。
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/12/18(土) 10:46:11.74ID:RFbyER+p
グローバル変数かstatic変数使ってないか?
昔他所のモジュールと変数の書き換え合戦が起きて正常に動作しない事があった
2021/12/19(日) 15:15:53.34ID:bLFtEsOT
>>876
static なら他所と競合しないんじゃない?
あとグローバル変数が仮に extern だったとしても、意図的にエクスポートしてなければ他所の DLL と競合はしないような。
2021/12/19(日) 17:40:07.63ID:150MzqYw
拡張子dllでも独自の実装してるホストプログラムあるからなぁ…
それこそホストの開発者に聞くしかない
2021/12/19(日) 23:17:52.32ID:mIjShW6/
自前でできることは

1) DllMain の DLL_PROCESS_ATTACH、 DLL_PROCESS_DETACH に
printf を仕込んで 最低限 load がなされてるかを確認

2) load されてるのなら
 最初に呼ばれるであろうexportしてる関数にがんがん printf を仕込んで 何処で死んでるかを確認
2021/12/24(金) 03:18:25.98ID:pnvTuQZD
規格厨ほど仕事ができなくね
どうでもいいようなことにこだわってないで
さっさと仕事終わらせろよ
2021/12/24(金) 10:00:30.81ID:YmgFPSRd
またお前か
何年立ったらルール覚えられるんだよ
つかえねーな
882デフォルトの名無しさん
垢版 |
2022/01/17(月) 19:13:47.29ID:Xn5FtFWo
メンバ関数へのポインタで質問なのですが
class MyClass {
public:
  void (MyClass::*p)();
  void func();
};
int main() {
  MyClass obj;

このようなクラスがあったとして
main関数でobjのメンバの関数ポインタpへfuncのアドレスを入れる書き方と
pを使ってfuncを呼ぶ書き方を教えて下さい
2022/01/17(月) 19:29:52.39ID:pwXKfNQA
>>882
obj.p = &MyClass::func;
(obj.*(obj.p))();
884デフォルトの名無しさん
垢版 |
2022/01/17(月) 20:40:50.75ID:iHDNpEw/
C++でオブジェクト指向を学びたいなと思ってるのですが、みなさんはどのように学びましたか?
既存のゲームの機能追加などをサークルでやっていて、C++自体には慣れてきて次のステップに進みたいと思いました.
2022/01/17(月) 20:47:51.30ID:h5bglXe3
ただただ自分でクラス設計考えて実際に書いて、さらにそれをあちこちで使ってみるだけ
実際に書く、利用する、をサボると机上の空論しか語れない頭でっかちになる
886デフォルトの名無しさん
垢版 |
2022/01/17(月) 20:50:24.57ID:Xn5FtFWo
>>883
ありがとうございます
887デフォルトの名無しさん
垢版 |
2022/01/26(水) 21:23:31.72ID:HoA8G4VO
初心者です。
自作クラスをVector型に押し込めようとしたのですが、そこで発生したエラーの解決方法を2時間くらい調べたのですが分かりませんでした。
class myClass
{
myClass(int A){num = A;}
void show() {
cout << "" << "="<<num<<endl;}
~myClass(){}
int num;
};
int main() {
myClass a1(1), a2(2), a3(3), a4(4), a5(5);
vector<myClass> myClassList;
myClassList.push_back(a1);
//中略
//削除するオブジェのインデックス番号を記録
vector<int> delList;
for (int i = 0; i < myClassList.size(); ++i)
{
if (myClassList[i].num == 2 || myClassList[i].num == 4) {
cout << "i" << "=" << i << endl;
delList.push_back(i);
}
}
cout << "削除開始" << endl;
for (int i = 0; i < delList.size(); ++i)
{
std::erase(myClassList, delList[i]);//コイツでエラー
}
return 0;
}
二項演算子 '==': 'myClass' は、この演算子または定義済の演算子に適切な型への変換の定義を行いません。
2022/01/26(水) 21:34:31.80ID:bGQQ0+uk
>>887
myClass::operator==を定義してみ。
889デフォルトの名無しさん
垢版 |
2022/01/26(水) 22:43:54.69ID:HoA8G4VO
>>888
オペレータに何を定義すれば良いか分かりません
2022/01/26(水) 22:53:20.32ID:bGQQ0+uk
>>889
eraseの仕様を見れば内部で要素を比較していることがわかる。
そこでmyClassとintの比較を定義する必要がある。
bool operator==(int n) const
{
return n == num;
}
2022/01/26(水) 22:55:52.03ID:bGQQ0+uk
あるいは
friend bool operator==(const myClass& my, int n)
{
return my.num == n;
}
892デフォルトの名無しさん
垢版 |
2022/01/26(水) 23:02:17.85ID:HoA8G4VO
蟻人間さん、ご丁寧に教えてくださり、本当にありがとうございます。
無事問題が解決しました
2022/01/27(木) 07:58:45.49ID:Fon8EKoL
delListはインデックスだからvector::eraseではなかろーか
https://ideone.com/jnELhK
2022/01/28(金) 15:24:34.96ID:HENDwGdD
msvcのコンパイルが遅いのとメモリ大量に使うのとで大変辛いのですが、コンパイルだけ別の端末で出来たりしませんか?
2022/01/28(金) 15:33:38.19ID:hT9TavA0
>>894
GitHub Actions
2022/01/28(金) 16:19:19.11ID:gre2uKRK
VARIANT型をログ出力したいときはどうしたらよいでしょうか?
2022/01/28(金) 16:23:28.54ID:hT9TavA0
>>896
std::variant (C++17 以降) のこと?
それとも COM で使う VARIANT のこと?
それとも特定の実装 (または規約) ではなく動的型一般のこと?
2022/01/28(金) 16:59:31.61ID:gre2uKRK
>>897
Comのです
2022/01/28(金) 17:44:30.90ID:hT9TavA0
何がわからないの?
基本的な数値型や配列以外の場合にどう文字列化すればいいかわからないってこと?
2022/01/28(金) 17:57:24.82ID:gre2uKRK
VARIANT.ToString的なのないかな?的な
みんな自分で作ってるの?
2022/01/28(金) 23:10:21.87ID:hT9TavA0
>>900
VARIANT は基本的な型だけでなく COM のオブジェクト (を指すポインタ) を含むこともある。
COM におけるオブジェクトは「少なくとも IUnknown インターフェイスは実装されている」という保証 (規約) があるだけで、
それをどのように表示できるのかは汎用的には決めようがない。

基本的な型だけでも簡易的に文字列化するものがあるとちょっとしたデバッグ用途などでありがたいというのはわからんでもないけど。
2022/01/28(金) 23:24:19.57ID:A8Zj7Ozq
>>901
オブジェクトはそのポインタ値を表示とかよくある
2022/01/28(金) 23:39:29.92ID:hT9TavA0
ログ用途だとアドレスだけでは意味が薄そうに思うけど……
(実行のたびに値は変わるだろうし、検証に使えない。)
少なくとも整数などではないという区別が出来れば十分ということはあり得るかな。

タイプライブラリがちゃんと用意されているなら型名などが取得できる場合もあるので可能ならそういう情報も欲しいけど、
いずれにしても「文字列にする」という要求はユースケースが多用すぎて標準的な機能として決め打ちはしづらい。
2022/01/28(金) 23:47:34.07ID:Bry4gZCu
>>903
Aのルーチンで使ってるオブジェクトとBのルーチンで使ってるオブジェクトが同じかどうかはわかる
それ以上のことを知りたいなら個別に表示ルーチンを組むしかない
2022/01/29(土) 16:18:19.62ID:F6gMvu/h
ガチガチの初心者です

#include<iostream>

double func(double x){
if (x>0) return x;
else return 0;
}

double dfunc(double x){
if (x>0) return 1;
else return 0;
}

int main(){
for (double x=-1.0; x<1; x+=0.1){
std::cout << std::scientific;
std::cout << x << ",";
std::cout << func(x) << ",";
std::cout << dfunc(x) << std::endl;
}
return 0;
}

を分割コンパイルするためにmain.cpp、func.cpp、func.fにソース分割したいのですがどのようにすればよいでしょうか
2022/01/29(土) 16:41:33.39ID:LNIGuTho
>>905 その3つファイル作って切り貼りして保存すればいいんじゃね。
2022/01/29(土) 16:44:31.98ID:F6gMvu/h
>>906
すみません、書き方が悪かったです。分割の仕方?切り貼りして保存する3つのファイルの中身の書き方が知りたいです。
2022/01/29(土) 16:47:36.64ID:3ZSK4aSw
>>907
なぜ調べもしない?
「C言語 分割コンパイル」でググりゃあ出てくるっしょ
2022/01/29(土) 16:48:20.54ID:LNIGuTho
>>907 自分でやった結果を見せてもらわないと何に困ってるのかわからない。
2022/01/29(土) 17:08:03.21ID:fQ9LbNHB
>>905
とりあえず func.f はやめとけ
2022/01/29(土) 17:27:29.71ID:54L0j00R
ふぉーとらんらんらん
2022/01/29(土) 17:27:47.66ID:CzloZbS7
>>905
どんな入門書にも書いてあるようなことを質問するのは嫌がられる。
学ぶ気がなく代わりにやらせようとしているように見えるので。
そんで関連する事柄が多いので質問が具体的でないと単純に情報量的にとてもここには書けない。

細々としたところで引っかかるのは当然あることだしそういうのは喜んで回答するから
何がわからずに引っかかってるのかもうちょっと具体的にして欲しい。

わからないことをまとめられないなら
とりあえず自分なりにやってみたらどうなったのか見せれば、
何がわかってないかこっちで推測できる可能性がある。
2022/02/02(水) 00:03:59.30ID:9peRckoc
if (fp = fopen("file.txt", "W+"))

って書くと↓が出るんだけど?

warning: suggest parentheses around assignment used as truth value
2022/02/02(水) 00:50:39.94ID:5Jw8HjAD
まあ気に食わないが括弧でくくってやってる
2022/02/02(水) 00:57:41.77ID:gV8dH/Sr
if文では、代入と比較の混乱が深刻で、警告を出さなければいけなかったと聞いてるが。
2022/02/02(水) 08:17:16.11ID:BmWHIg0d
論理型を省略した代償は高くつきすぎたな。
2022/02/02(水) 10:18:30.37ID:l1cc3wPX
0とヌルの違いも曖昧な部分があったな
2022/02/02(水) 11:07:29.08ID:5i7w7V2o
>>913
強めの警告オプションを付けてたら言語仕様上の問題がないものでも良くない作法に対しては警告が出ることはある。
a && b || c
とかいう式でも (人間が) 優先度を勘違いしやすいから括弧を付けることを勧められるし、
インデントの付け方がずれてる場合とかも警告は出る。

余計なお世話だと思うなら大抵はオプションで抑制できるよ。
2022/02/02(水) 16:52:47.21ID:Os1L/Ifx
括弧でくくっただけじゃ文句いわれたこともあるので二重否定しとく
if (!!(fp = fopen("file.txt", "W+")))
2022/02/02(水) 17:18:37.99ID:5i7w7V2o
C++17 以降では if 文の括弧の中に初期化を書けるようになった。
初期化の内容と判断に使う式をセミコロンで区切って書ける。

if (fp = fopen("file.txt", "W+"); fp)

このとき変数の宣言を書いてもよく、

if (FILE* fp = fopen("file.txt", "W+"); fp)

というようにすると、この変数のスコープを if 文の内側だけに制限できるので便利。
便利だから C にも導入して欲しい。
2022/02/02(水) 17:39:51.00ID:il4bRKm2
if括弧中で初期化なんて前からやってたことだし
今じゃ代入も初期化になったのか
2022/02/02(水) 18:18:35.55ID:5i7w7V2o
>>921
以前は「条件が宣言でもよい」だったところに
あらたに「初期化文と条件のふたつを書ける」「初期化文は式、もしくは単純宣言である」というルールが追加された形。
2022/02/08(火) 08:24:13.76ID:vXrgdSa9
デストラクタだけ書いてあってムーブできないクラスをメンバ変数にすると色んな所でコンパイルエラーが出て困りました
値ではなくポインタで持つか、自分のクラスででムーブコンストラクタを書いたらとりあえずはエラーが出なくなったのですが、
こういうクラスは一体どう使われるのを想定して実装したんでしょうか?
2022/02/08(火) 18:34:16.03ID:SQWxHGFm
基底クラスからたくさん派生クラスを作りました。
基底クラスの1つのvirtualメソッドを、各派生クラスでoverrideしました。
基底クラスを指す箱から、派生クラスのメソッドを呼ぶ方法を教えてください。

多少スタイルを変えても実現する方法があればお願いします。
ただし、場合分けやインデックスで対応するのは(派生クラスが増えたときに修正箇所が分散するので)厳しいです。
コンパイラは最近のvisual studioのC++を使っています。

struct Basic{
 virtual void work(){cout<<"Basic";}
};
struct B1:public Basic{
 void work()override{cout<<"B1";}
}b1;
struct B30:public Basic{
 void work()override{cout<<"B30";}
}b30;

void main(){
 Basic basic_array[9];
 basic_array[0]=b30;
 basic_array[0].work();//基底クラスのメソッドが呼ばれて Basic と表示されてしまう。
}
2022/02/08(火) 19:25:55.42ID:WarIH046
Basicの配列にはBasicのオブジェクトしか入らないから、b30もコピーしたときにBasicになってしまったからだよ

Basic*の配列にするかvector<uniq_ptr<Basic>>を使えば
2022/02/08(火) 19:56:37.56ID:SQWxHGFm
>>925
ポリモーフィズム成功しました。基底クラスのポインタを使って解決しました。
また、基底クラスの変数にコピーすると派生クラス独自のメンバが全て無くなることが理解できました。

ありがとうございました。

void main(){
 Basic*basic_array[9];
 basic_array[0]=&b30;
 basic_array[0]->work();//B30のメソッドが呼ばれた。
}
2022/02/11(金) 14:30:39.44ID:/nAwqwYv
>>925
> vector<uniq_ptr<Basic>>を使え

動的にインスタンスを作り始めた途端に、コンテナとスマートポインタが必要になりました。
見事すぎる回答に改めて感謝します。
2022/02/18(金) 10:16:19.82ID:+V9f8lU9
例外で飛んじゃうと後始末ができなくてメモリリークしちゃうんだけど

クラスでラップしてデストラクタっていちいちやる感じ?
2022/02/18(金) 10:30:02.61ID:+V9f8lU9
try~catchで囲えば処理できるけど
すべての例外が出る可能性のあるコード全部try~catchしちゃっていい?
2022/02/18(金) 11:08:23.85ID:v7utSHD9
>>928
「いちいちやる」っていうか、同種のリソースを扱うときはいつも必要になる対応だからデストラクタでいいんだよ。
大抵はunique_ptrとか標準にあるもので済むし。
2022/02/18(金) 11:40:56.58ID:fowo2HBL
>>928
いちいち個別対応したくないからクラス定義に押し込めるんだよ。
2022/02/18(金) 12:17:15.52ID:+V9f8lU9
>>931
今回のとこちょっとなんだけどなぁ
例外発生するとこ全部でやらなあかんやんコレ
クソ杉ちゃう?
2022/02/18(金) 12:21:15.24ID:mVeDXtSU
なにいってんの
2022/02/18(金) 12:27:42.18ID:+V9f8lU9
えー、わからんのー?

つまり例外が発生しうるとこすべてで
尻切れトンボされる可能性があって
以前のようにmalloc-freeのコードが混じってるとそいつらは問答無用でメモリリークしちゃうって話よ
2022/02/18(金) 12:47:42.19ID:YFQd7auv
malloc/freeなら検出できるやん
2022/02/18(金) 12:48:02.74ID:fowo2HBL
>>932
対処する必要があるところで catch して解放するだけだろう。
それがどうして出来ないんだ?
2022/02/18(金) 13:19:45.68ID:+V9f8lU9
まあ、それよ
そういう対応が必要になるって話よ
追加するやつ全部trycatchで包むか
mallocfreeをクラスで包むか
入れたのは20行程度なのにルーチンの流れまで変える必要があったりなかったりで(# ゚Д゚) イラッ!
2022/02/18(金) 13:39:34.12ID:v7utSHD9
>>934
malloc-freeしてる既存コードに例外発生する処理を混ぜるなんて特殊状況ならしょうがない。
面倒な状況なのはわかる。あきらめて心を殺してtry catchするか小さいRAII用クラスを作るか。
あるいはmalloc-freeしてるところも標準コンテナやunique_ptrに置き換えていけばすっきりするかもね。
2022/02/19(土) 09:00:24.16ID:AlOKsuc0
>>932
クソすぎかもしれないが、それは必要だし普通だろ
2022/02/19(土) 10:43:55.59ID:MFjncly/
メモリ解放以外にデストラクタでやることはあるわけだしな
集約して定義しとけよという
2022/03/09(水) 22:51:16.35ID:wIy/pNxS
LinuxでyyyyMMddhhmmss.fffを出力する
一番簡単な方法を教えて下さい
2022/03/09(水) 23:05:24.02ID:w9Xuob20
printf("yyyyMMddhhmmss.fff");
2022/03/09(水) 23:58:24.65ID:ptoc1SJJ
GNU/Linuxを仮定
system("date +%Y%m%d%H%M%S.%3N\");
2022/03/10(木) 00:03:44.70ID:IfzvyEOT
日付のフォーマットなんて都度調べるもんな
覚えてる変なやつもいるんだろうね
2022/03/10(木) 00:11:23.45ID:3vn8A8hZ
https://shino-tec.com/2019/06/08/time-to-string-on-linux/
2022/03/10(木) 07:16:50.83ID:ZtFzrJEF
>>945
これやったら秒とミリ秒を別で取得してるので
秒が59.999(ミリ秒はイメージ)のときに
ミリ秒は00.002ってなるときに前回の値が59.857ぐらいだったとすると

59.002ってなってしまうので逆転が起きたときは前回の値と比較して
逆転してたらミリ秒を強制的に999にするとかダサイことやってるんですけど
マジでこんな方法しかないでしょうか?
2022/03/10(木) 07:48:07.93ID:E/Z/b8gJ
>>946
そのダサいことをやってるのは何行目?
見つからないよ
2022/03/10(木) 08:52:39.45ID:pPpJXJXf
localtimeが時刻取得だと思ったんじゃろうね
2022/03/10(木) 18:51:28.19ID:xl0leRXC
>>947
timespecで取得できるのがミリ秒だけだと思ってました
自分のプログラムでtime_tで取得できる関数と複合してたのが原因でした
2022/03/10(木) 20:18:24.41ID:udY9aSDo
あー、だめだ
localtime_rがないって言われる
2022/03/10(木) 20:21:17.65ID:udY9aSDo
localtime_sもないって言われる
しばらくクソ方法で保留で
2022/03/10(木) 20:46:05.68ID:xH/r/VUj
>>950
環境は?
2022/03/10(木) 23:26:58.80ID:udY9aSDo
>>952
ubuntu
2022/03/11(金) 00:11:00.88ID:3xV59ngV
rはあるやろ
2022/03/11(金) 13:08:09.69ID:2pJSEvK3
ビルドの設定いじってもらって通りました
ありがとう御座いました
2022/03/17(木) 11:34:53.41ID:qJRouQ9M
【質問】
switch constexpr って無いんですか?

【背景】
if constexpr(false){
}
if constexpr(false){
}
if constexpr(true){
}
if constexpr(false){
}
という記法に疲れました。
switch(定数) で実現可能ですが、コンパイラがwarningを出すので避けたいところです。
2022/03/17(木) 11:40:14.61ID:Y2OAtTnf
無いけど俺も欲しい
2022/03/17(木) 11:44:52.12ID:qJRouQ9M
>>957
早速の回答ありがとうございます。
否定的な解決で残念ですが、前向きに生きていきます!
2022/03/19(土) 13:40:31.67ID:nPptgbtB
クロスプラットフォーム対応のキーボードイベント入力・マウスイベント入力があるライブラリで、規模がそこまで大きくないものって何かありますか?
2022/03/19(土) 14:54:00.91ID:Q/NZ1iFj
ncurses
2022/03/21(月) 11:06:17.41ID:Prmlj1K5
>>960
情報ありがとうございます
ncursesだとWindowsで動かしにくいみたいなんでフォークのpdcursesでやってみます
2022/03/26(土) 22:10:06.23ID:U9Dry82x
>>908
ググって出てこないようなことをおまえら答えれるのか?
2022/03/26(土) 23:30:57.78ID:po6dvxnc
日本語で記述された問題や目的から有用なページを紹介するのはグーグル先生は苦手なんだよ。
核心的なキーワード抜きだと特に。
2022/03/26(土) 23:42:52.67ID:as/ML4Ec
>>962

軽く調べた結果:

https://el.mml.tuis.ac.jp/moodle/mod/page/view.php?id=913

http://www.cc.kyoto-su.ac.jp/~hxm/cstext/prog06.html

https://programming.pc-note.net/c/header.html


どこだったか忘れたけど俺は検索して学んだ記憶がある
記憶違いかもしれないけど
2022/03/29(火) 22:17:14.91ID:JBheGd8b
スマホが普及しきった2015年くらいからGoogle検索の難易度一気に上がったな
昔はガバガバキーワードでもGoogle先生が忖度してくれていた
2022/03/30(水) 08:00:47.76ID:NklUKb3w
忖度の意味知らなそう
2022/03/30(水) 10:53:25.40ID:2Q6y3di6
Google ADの顧客は優遇致します
968デフォルトの名無しさん
垢版 |
2022/03/30(水) 12:23:34.00ID:eoFMqmT7
広告出してくれるインチキ医療サイトや適当プログラミングスクール優遇しまーす!!

無能
969デフォルトの名無しさん
垢版 |
2022/03/31(木) 16:42:12.47ID:Pfu/lGwO
初心者歓迎ということで、ちょっと聞いてみたいのですが、c++の世界ではboostというライブラリは有名なのでしょうか?
c++で勤怠管理できるwebシステムを作るんだといってコンストラクタがなんだかわからないまま
boostを読んでヘッダファイルをいくつか読んだあたりで英語読めなくて投げ出したことがあります。
2022/03/31(木) 16:48:44.96ID:R4GrqV7T
>>969
有名だけど、使わんほうがいいよ
標準で十分だよ
971デフォルトの名無しさん
垢版 |
2022/03/31(木) 17:01:55.62ID:Pfu/lGwO
>>970
ありがとうございます!!
それに、あなた有識者の方ですね?
もしよければ少しだけ詳しく評判を教えていただければ幸いです。
2022/03/31(木) 17:23:59.00ID:Dq8nC8PK
>>969
かなり有名で活発。
最初から標準化委員会の人がかかわってるし、 Boost が出自の機能が標準入りしたこともある。
ただ、実験的な要素も多分にある。
急に仕様がかわることもある。

適切な場面では適切だし適切でない場面では適切でないというごく普通の話なんで、
評判がどうこうというより何をしたくて Boost に関心を持ってるのか説明したほうがいいよ。
973デフォルトの名無しさん
垢版 |
2022/03/31(木) 17:31:25.58ID:Pfu/lGwO
>>972
ありがとうございます。
boostは今はそんなに興味は持っていないんですが、今ちょうどMIMEタイプらへんのところを読んでいて、
そういえばboostにMIMEタイプって書いてあったなぁ、boostって業界だとどんな感じなんだろ?という感じです。
何となくなのですが、仕様が良く変わるから使いにくいと言う感じなのかな?と理解しました。
2022/03/31(木) 17:51:26.52ID:Dq8nC8PK
>>973
標準ライブラリほどには互換性は意識されないってだけで、
特に実験的な部分を除いては頻繁に変わるというほどでもないけど。
アップストリームでの変更の影響を避けるために
必要な部分だけ抜き出して自分のプロジェクトツリーに入れておくという運用もよくあるし。
(そのためのツールも用意されている。)
https://www.boost.org/doc/libs/1_78_0/tools/bcp/doc/html/index.html
975デフォルトの名無しさん
垢版 |
2022/03/31(木) 18:00:17.34ID:Pfu/lGwO
>>974
更に詳しく有難うございます。確かに抜き出しちゃえば変わらないですもんね。
他でも応用できそう。
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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