C++相談室 part163

■ このスレッドは過去ログ倉庫に格納されています
2022/12/30(金) 23:16:31.37ID:DPUEZfMS0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

次スレは>>980が立てること
無理なら細かく安価指定

※前スレ
C++相談室 part162
https://mevius.5ch.net/test/read.cgi/tech/1667194175/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2023/01/12(木) 14:47:05.06ID:OEyZMQ5cd
エリンギ舞茸ぶなしめじ
126デフォルトの名無しさん (ワッチョイ b101-tb1I)
垢版 |
2023/01/13(金) 06:37:30.78ID:CqT5d+dn0
@ if ((choice == 2 && player == 2) || (choice == 3 && player == 1))
A if (0 <= xpos && xpos < XMAX && num[xpos] < YMAX)
B board[xpos][num[xpos]++] = player;

C for (x = 0, y = ypos, n = 0; x < XMAX; x++)
D for (x = xpos, y = 0, n = 0; y <= ypos; y++)
E for (x = 0, y = ypos - xpos, n = 0; y < YMAX; x++, y++)
F for (x = xpos - ypos, y = 0, n = 0; x < XMAX; x++, y++)
G for (x = 0, y = xpos + ypos, n = 0; y >= 0; x++, y--)
H for (x = xpos + ypos - YMAX + 1, y = YMAX - 1, n = 0; x < XMAX; x++, y--)
の各条件文内でどーゆー計算、アルゴリズムがされてるか教えてくださる人いますか??
2023/01/13(金) 07:14:01.38ID:Y56iKvHG0
宿題ならまず自分で考えてからどうしても分からない所だけ聞きに来い
2023/01/13(金) 08:41:01.94ID:hjGlttN/d
宿題スレ行ったら?
129デフォルトの名無しさん (ワッチョイ b101-tb1I)
垢版 |
2023/01/13(金) 09:13:11.98ID:CqT5d+dn0
例えば@だと、&&が論理積、||が論理和ということだと思うんですけど、演算子が分かってもその条件文内で何が行われているかとかが分からないので知りたい状態なんです。。
130デフォルトの名無しさん (アウアウウー Sa85-DH5p)
垢版 |
2023/01/13(金) 09:44:58.05ID:NX/X2xhta
https://mevius.5ch.net/test/read.cgi/tech/1672409791/117
https://mevius.5ch.net/test/read.cgi/tech/1656984270/777
マルチ死ね
131デフォルトの名無しさん (ワッチョイ 93ad-Or7w)
垢版 |
2023/01/13(金) 11:24:51.74ID:6wgE5XmR0
boostの存在意義ってことでいうと、マルチスレッドの並列ソートboost::sort::block_indirect_sort()が使えるのでLinuxなどは有益
Windowsの場合はVC++にconcurrency::parallel_buffered_sort()があるので使わないけど
132デフォルトの名無しさん (スプッッ Sdf3-1Rsz)
垢版 |
2023/01/13(金) 11:48:47.80ID:ZURbuhIed
>>130
追加
https://mevius.5ch.net/test/read.cgi/tech/1671585518/90
2023/01/13(金) 16:10:50.14ID:ftt2O/+X0
>>129
演算子の意味がわかっているなら分からない箇所なんてないでしょ。
そのような演算が必要になる意図のレベルで知りたいということなら式単体があっても読み取れない。
2023/01/13(金) 17:16:42.47ID:DejIUh+t0
>126が宿題なら授業で演算子の評価順とか短絡評価とかやっているだろ。
ここで質問する前に授業ノートぐらい確認するなり先生に質問するなりしろよ。
2023/01/13(金) 18:59:56.28ID:NgheavAf0
払った授業料のためにも教師に聞いとけって
2023/01/13(金) 19:05:47.85ID:+0WWfi2gd
おまいら
ただのコピペだってのに
親切だな
2023/01/13(金) 19:38:21.71ID:4yurTHZ1d
マルチ警察は基本アホだから
2023/01/14(土) 17:02:55.96ID:oDbFkQuTa
普通に単にソートしたい場合はどんなコードになる?
方言なしで
2023/01/14(土) 17:03:39.93ID:euxRDNh80
std::sortを使う
2023/01/15(日) 09:58:07.55ID:/n5l5Pop0
同じく

質問の意図がわからんな
2023/01/15(日) 18:50:51.76ID:IyvDeUGt0
質問なのですがintやdoubleといった単純な型のグローバル変数の初期化タイミングは
グローバルなオブジェクトの初期化タイミングより前であることが保証される?

多分 .dataセクションの初期化はグローバルなオブジェクトの初期化リストの実行より前だと思うんだけど
(そうでなければコンストラクタからC言語のライブラリを安心して呼べないということになる
規格的にそうなん?
2023/01/15(日) 19:52:54.05ID:1ER4Wl/40
>>141
静的初期化と動的初期化に大別されている。
初期化子が定数 (定数式) のものは静的初期化で、
そうではないものが動的初期化。
静的初期化は動的初期化より先であることは言語仕様で保証される。
2023/01/16(月) 08:14:19.28ID:X/jbWDD/M
>>141
記憶が確かなら、c++の関数スコープのstatic変数は呼び出し時に初期化されることが保証されているので、初期化順を細かく決める必要がある場合は関数のstatic変数を使う。
2023/01/16(月) 23:24:41.20ID:J3mmTfbR0
>>142
レス㌧クスだいたいわかりた
この場合のconstexprの扱いがわからん……
ビルド時に定数に展開できたら静的初期化可能な範疇に含まれ得る気がするが
定数に展開で来なかったらどうするんじゃ、という気もする、

>>143
ガチで初期化順序を確実にしたい場合はシングルトンにすることを提唱する。
InterlockerCompareExchange()的なインターロック系の関数を使えばスレッドセーフにできる
(初期化済フラグがfalseならnewに進む、というのをアトミックにやる
関数スコープのstatic変数も似たような実装ではないかと予想、
2023/01/16(月) 23:26:34.64ID:J3mmTfbR0
訂正orz
×: (初期化済フラグがfalseならnewに進む、というのをアトミックにやる
○: (初期化済フラグがfalseならtrueにする、というのをアトミックにやって、false→trueに変化したときだけnewする
2023/01/16(月) 23:33:23.86ID:J3mmTfbR0
とオモタがよく考えたら初期化済フラグがfalseならtrueに変化してからポインタpにnewされるまでの間に
別のスレッドが割り込んできてpを使おうとしたら破綻するからpを獲得できるまでスピンロック的に回ることが必要やったorz
ワイの答えはこれや……!
147デフォルトの名無しさん (ワッチョイ caad-f6s+)
垢版 |
2023/01/18(水) 09:55:18.36ID:1kekdbbc0
今さらだけどさ、以下Perlソースコードみたいに初期化以外の場所で複数の変数代入を一行で記述できたら楽だよね。
($a, $b) = (1, 2);
2023/01/18(水) 10:18:29.33ID:kAps0iiP0
>>144
c++11からブロックスコープを持つstatic変数初期化はスレッドセーフだから、手動でやる必要ないんじゃない?
2023/01/18(水) 12:33:33.72ID:953Yg8XVM
>>147
それ楽なん?
2023/01/18(水) 12:45:50.93ID:f+Qa9vK4M
パターンマッチングとか単一化が欲しいという話じゃないの?
2023/01/18(水) 12:49:04.55ID:aansOABgM
複数のことやってんだから複数行で書け
それかそんなにまとまり強いならラップしろ
2023/01/18(水) 12:57:11.05ID:953Yg8XVM
俺もPerl使ってた頃に初期化で書いたことはあるけど、正直初期化以外での使い道ない気がする

rustのパターマッチは欲しい気がする
2023/01/18(水) 19:31:01.29ID:x7mTRTnwa
>>147
Perl でできるかは忘れたけどこれで交換できるのは便利
($a, $b) = ($b, $a);
2023/01/18(水) 19:47:26.33ID:ZIWa3HiO0
int a, b;
tie(a, b) = tuple(1, 2);
tie(a, b) = tuple(b, a);
一応できなくはない。交換はswap(a, b)でいいけどね
2023/01/19(木) 20:52:51.98ID:Np6xvJtm0
つauto [a, b] = tuple(1, 2)
2023/01/19(木) 20:59:17.18ID:MTxEyC+IM
書記か以外って話なんだが……
2023/01/19(木) 21:22:03.00ID:4HhHC5J20
解決方法を探しているんじゃなくて、言語仕様の変更提案なんだけど
改めてPerlだと以下のような感じ
use strict;
my ($a, $b) = ('AAA', 'BBB');
($a, $b) = ('YYY', 'ZZZ');
2023/01/19(木) 22:28:47.56ID:j0bW1DQy0
>>157
誰得?何得?
2023/01/19(木) 22:42:23.23ID:SyYOdr8r0
戻り値が1個だけ
どれを戻り値にするかで迷う

この辺はC++の欠点だと思う
2023/01/19(木) 23:07:21.11ID:j0bW1DQy0
>>159
構造体で戻せばいいですよ、KR2 から構造体の実体というかコピーが返ってきますから、それこそ3個でも4個でもお好きに
2023/01/19(木) 23:30:55.46ID:SyYOdr8r0
>>160
アホ
2023/01/19(木) 23:36:31.49ID:4HhHC5J20
複数個の変数に対する初期化のワンライナー記述(本当は初期化なので代入ではないが)が許されるなら、再初期化もワンライナー記述できていいと思うんだ
2023/01/19(木) 23:47:19.80ID:Np6xvJtm0
rvoが働くんだからタプルでも返せばいいのでは?
2023/01/20(金) 06:46:04.32ID:2AltcjPFa
>>160
このためだけに構造体定義したりするとかアホの極みだろ...
2023/01/20(金) 07:13:16.62ID:24yH8jzyd
つtuple
2023/01/20(金) 13:36:18.44ID:yONvkjD90
C++の新しい規格で複数個戻せるっての見た事あるが、気のせいか。
2023/01/20(金) 14:39:16.65ID:7GHMGQ2oM
うーん、やっぱり初期化以外での使い道がわからん
2023/01/20(金) 14:46:45.60ID:FDJF8fJ70
>>166
それは >>155 で言及 (?) されている構造化束縛 (structured bindings) のことでしょ。
返却値の数はあくまでもひとつ。
そのひとつを分割して初期値にすることが出来るのであって複数の返却値を返せるわけではない。
2023/01/20(金) 15:19:11.41ID:MVRwt7H80
戻り値の型推論の規則が厳しいせいでtupleも微妙に使いづらい
2023/01/20(金) 16:25:40.34ID:g6yuQGRiM
(x, y) = (x+y, y-x)
とか
2023/01/20(金) 16:26:57.09ID:yONvkjD90
>>168
修行いたします。mOm
2023/01/20(金) 16:50:23.92ID:FDJF8fJ70
std::tie や std::tuple ってそんなに長い名前でもないし、
C++ のややこしい文法をもっとややこしくしてまで
専用の分割代入の構文が欲しいかな?
2023/01/20(金) 17:54:27.63ID:o1hw1lmid
いらんよな
2023/01/20(金) 18:14:48.86ID:5b5Mr70bd
欠点なのは間違いない
2023/01/20(金) 18:15:46.20ID:5b5Mr70bd
C++は欠点が非常に多い
2023/01/20(金) 18:20:37.41ID:yyzNyqnf0
構造体のメンバ変数の再初期化を一行ですませたい需要、どうかな
2023/01/20(金) 18:21:31.76ID:FDJF8fJ70
それはそう。
2023/01/20(金) 18:22:22.62ID:FDJF8fJ70
C++ に欠点が多いのなんてイマサラな話だろ。
2023/01/20(金) 18:29:58.45ID:MjTZXIi3d
はちみつも欠点が多い
2023/01/20(金) 19:33:42.78ID:/4tVg7x40
要らないなぁ。

>>176
c++ならコンストラクタを定義するのが定石じゃない?
使い捨ての構造体ならtupleだし。
2023/01/20(金) 20:55:20.44ID:HgRp3cSY0
再初期化ってのがまず無いかな
2023/01/20(金) 21:12:53.47ID:bX3yX62I0
代入なら普通にあるね
2023/01/20(金) 21:59:52.24ID:vRsHomcy0
>>164
単に名前付きタプルが欲しくてもない、というか名前付きタプルは限りなく構造体に近いというだけですよ
新しいものに飛びつく前に K&R2 以来の伝統の重みを評価するべきでしょう、型推論を併用すれば記述量も抑えることができますよ
https://marycore.jp/prog/cpp/anonymous-struct-tuple/
2023/01/20(金) 22:14:16.78ID:bK8iHZlj0
>>183
で、初期化じゃなくて代入はできるの?
2023/01/21(土) 00:47:37.77ID:SJ/UeQbF0
>>176
どう書きたいのかいまいち分からん
2023/01/21(土) 10:30:12.76ID:PxhUXXTz0
>>184
今は >>159 の「複数の引数を返したい」要望に応える手段の話でしょ?
勝手に話題を広げないでね (^^)
2023/01/21(土) 10:33:35.82ID:ITn943ohd
tieって答え出てるのに気がついてないのかね
2023/01/21(土) 12:44:01.44ID:p4hNMN+0d
使いにくすぎて使われない
2023/01/21(土) 13:11:10.71ID:Wi64nLVza
>>186
元々の話は>>147
2023/01/21(土) 14:45:55.24ID:4IvYDHHD0
HOGE構造体インスタンス hogeのメンバfooとbarだけを再設定したい時に、hogeというインスタンス文字列を何度も書かずに済むような仕組みあればいいなあ
HOGE hoge = {0};
do_something(hoge);
hoge.[foo, bar] = [1, 2];
2023/01/21(土) 15:22:29.46ID:G9LOOV8U0
そういうメソッドを用意するんだよ
2023/01/21(土) 15:42:11.09ID:jQCz8FAl0
ClassName::enumElementという書き方で列挙体の要素を直接持ってこれるクラスを見かけたんですが
どうやってやってるんですか?
定義見てもよくわかりませんでした
2023/01/21(土) 15:48:28.56ID:AnImjWZM0
>>192
enum class と enum が別物だってのは知ってる?
2023/01/21(土) 15:51:00.78ID:5FsD11Dw0
よくわからんがこれのことならenumは外のスコープに漏洩するから出来る
嫌ならenum classにする

class Foo{

public:

 enum{HOGE, FUGA,};

};


int main(){

 std::cout << Foo::HOGE;
}
2023/01/21(土) 15:52:32.72ID:SJ/UeQbF0
>>192
何を書いているのかいまいち分からん
struct ClassName {
enum {
enumElement
};
};
int main () {
std::cout << ClassName::enumElement << '\n';
return 0;
}
2023/01/21(土) 20:19:12.82ID:jQCz8FAl0
説明がへたくそですみません
ClassName::EnumName::elementと書かないといけないところを、
途中のEnumNameを省略して使えるようになってます

>>193
普通のenumでした
2023/01/21(土) 20:30:34.45ID:2W6/mmpkM
普通のenumならEnumName::つかないよ
トップレベルに置いたenumもEnumName::つかないでしょ
2023/01/21(土) 20:43:48.05ID:AnImjWZM0
>>196
だとしたら enum の列挙子のスコープはその列挙型のスコープと同じになるってだけ。
C のコードを持ってきて C++ でエラーにならないように配慮したんだと思う。
2023/01/21(土) 20:44:29.11ID:AnImjWZM0
>>198
C の列挙子は C++ と違ってファイルスコープなので C で仕様に適合するものが C++ ではそうなない場合もあるけど……。
たとえばこういうのは C では通るが C++ ではエラー。

#include <stdio.h>

int main(void) {
struct foo { enum bar { baz } qux; };
int n = baz;
printf("%d\n", n);
}
2023/01/21(土) 22:18:57.09ID:SJ/UeQbF0
>>196
enumとenum classの違いは分かってるんだよね?

#include <iostream>
using namespace std;
struct ClassName {
enum enumElement {element};
enum class enumclassElement {element};
};
int main () {
cout << ClassName::element << '\n'
<< static_cast <int> (ClassName::enumclassElement::element) << '\n';
return 0;
}
2023/01/21(土) 22:54:59.54ID:jQCz8FAl0
ああなるほど、何もしなくてもC形式のenumなら列挙名省略できるんですね
危険といわれている理由が分かりました

>>200
理解できてなかった😭
2023/01/22(日) 17:51:51.29ID:mu8Nl5mu0
pythonのdecimalで2^256倍精度浮動小数点数の最大値を計算してみた。
https://ideone.com/aCP13Y

mpmathで検算もした。(桁数と先頭から千桁程度まで)

これらはC++だとどういうプログラムになるの?
メモリの容量から全桁の出力や検算は無理だと分かるが、できれば検算して戴きたい。
2023/01/22(日) 18:33:56.85ID:vg7X6MkGM
IEEE 754で規格化されてる
2023/01/22(日) 18:53:45.43ID:mu8Nl5mu0
>>203
IEEE754準拠での値で計算してみた。
pythonのdecimalのlogでも検算したので多分合っていると思うが、
C++のプログラムだとどのように計算するのかな?という素朴な疑問です。
ideoneのc++だけでできる?
GMPあたりの任意精度パッケージとか必要になるのかな?
205デフォルトの名無しさん (ワッチョイ 4376-gzmJ)
垢版 |
2023/01/22(日) 19:56:25.38ID:6lZDc9UV0
C++標準ライブラリにはないから外部ライブラリに頼ることになる

ideoneがそれ用のライブラリを持ってるか知らんから頑張って探すしかない
2023/01/22(日) 20:32:22.10ID:9f7YJXTs0
>>204
Boost Multiprecision Libraryあたりからお手軽かね。
他にあったっけ?
2023/01/22(日) 20:43:06.21ID:mu8Nl5mu0
参考にします。どうもありがとう。
2023/01/23(月) 02:24:27.76ID:6OKqnjyz0
C++って最初のバージョンはC言語で開発されましたか?
どこかその話のソースありませんか?
2023/01/23(月) 07:10:57.25ID:HN6zkKZyd
cfrontはC++をCに翻訳するトランスレータ
というのはソースにならんか?
2023/01/23(月) 08:01:54.02ID:eLWdsBBpM
>>208
「C++の設計と進化」を読め。
2023/01/23(月) 08:27:15.10ID:ntFDJsM90
C言語がC++から派生したというのは本当の話ですか?
2023/01/23(月) 09:40:42.62ID:K1n6gQar0
>>211
あなたがウソである証拠を示せばいいだけ。他者に証拠を求めてはいけない。
2023/01/23(月) 10:00:24.86ID:6gVuxkoXF
polymorphic_allocatorなんでコピーでresource伝播してくれないんだ・・・
2023/01/23(月) 13:17:00.05ID:WcsuDU3H0
>>211
C が始まったとき (1972 年) に C++ は無い。
C++ の前身である C with Classes の歴史の始まりは 1979 年で、そのときは
C のプリプロセッサとして書かれていたしあくまでも C の拡張と見なされていた。

後に C は C++ からかなり多くを取り入れることになるし
現在進行形で取り入れてもいるが、それを「派生」とは普通は呼ばない。

普通は呼ばないがそこらへんは言葉の定義の問題なので「派生」という言葉の
定義によっては無理すれば派生と呼べなくもないかもね。
2023/01/23(月) 14:21:27.16ID:6OKqnjyz0
>>209
>>210
CFrontなんてあったのですか
ヒントをありがとうございますた
2023/01/26(木) 06:18:10.77ID:nnR+UHRw0
名前付き引数標準化への動向って今どうなん
標準化はしないから各自勝手にやってねって感じ?
2023/01/26(木) 07:48:33.46ID:XZjGtAvJ0
class A{
public:
 void operator () () {...}
};

class B : public A{
 void func(){
  ここでオペレータ()を呼びたいとき、(*this)()としたら呼べますが、this→()では呼べませんでした。
  なぜでしょうか?
 }
};
2023/01/26(木) 08:02:56.89ID:HqVXg6xF6
>>217
オペレータが左右にとるのは引数でthis->だけだと型が違うから?
2023/01/26(木) 08:03:37.78ID:fdXxt+2fM
>>217
メソッド名でないから。

確認していないけど this->operator()() かと。
2023/01/26(木) 09:02:29.12ID:UDXsjb/60
メソッド
2023/01/26(木) 11:28:53.15ID:Y60o/Mze0
× メソッド
〇 メンバ関数
2023/01/26(木) 11:34:13.17ID:EgU8zvdT0
さてはDelphiやってたな
2023/01/26(木) 12:10:18.58ID:2OqTfEEK0
>>219様のやり方でできました皆様ありがとうございます
2023/01/26(木) 12:11:12.58ID:2OqTfEEK0
すみませんもう一個質問させてください。

template<class T> class A{
public:
 void f(){…}
};

template<class T> class B : public A<T>{
public:
 void g(){f();}
};

というコードがあったとき、g 内の f が undeclared identifier だというエラーが出ますよね?
T が不明だからそうなるのだと説明されてるのを見たのですが、T はコンパイル時には確定してるのになぜダメなのでしょうか。
2023/01/26(木) 12:18:25.89ID:epYCai+9d
template<>class A<void>{};
のようにf()のない特殊化をされる
可能性があるってことさ
■ このスレッドは過去ログ倉庫に格納されています