X



C++相談室 part163
レス数が1000を超えています。これ以上書き込みはできません。
0003デフォルトの名無しさん (ワッチョイ 9a69-Ejmh)垢版2022/12/31(土) 09:58:55.55ID:wqRRT9ag0
皆さまあけましておめでとうございます
今年もよろしくお願いします
今日も今日とて相談がございます

基底クラスのポインタを格納できるコンテナに押し込んだ派生クラスへのポインタから、その派生クラスのインスタンスをユニークポインタで生成し、それを規定クラスのユニークポインタに押し込んで使いたいです
std::vector<Base*> BaseCnt;
Driv1 Driv1_;
Driv2 Driv2_;
Driv3 Driv3_;
BaseCnt.push_back(&Driv1_);
BaseCnt.push_back(&Driv2_);
BaseCnt.push_back(&Driv3_);
~数々の名誉ある処理を挟んで……~
std::unique_ptr<Base> BaseUni;
BaseUni=どうにかして実体をユニポで生成する関数(BaseCnt.back());
BaseUni->Update();//ここで望んでいる挙動はDriv3のオーバーライドでございます

上記の、どうにかして実体をユニポで生成する関数、が実現できなくて困っています
template<typename T>
std::unique_ptr<Base>&& theFunc(T*t)
{
return std::make_unique<T>();
}
で行けるのかなと思いましたがいけませんでした(^^)……
そもそも基底クラスに押し込んであるため、T型で受けると基底型になってしまいます(^_^)……
どうにかして派生クラスにメモリを確保し、かつそれを規定クラスのユニークポインタに押し込めないものでしょうか?

このままでは年が越せない……
どうかおしえてください
私はc++プリミティブの混乱予約型言語でございます……
0006デフォルトの名無しさん (ワッチョイ 8b01-4uR0)垢版2022/12/31(土) 12:49:15.56ID:vu28B3si0
>>3 こんなこと?
class Base;
using Base_Ptr = std::unique_ptr <Base>;
struct Base {
virtual ~Base () = default;
virtual Base_Ptr construct () const = 0;
};
struct Driv3: Base {
virtual Base_Ptr construct () const
{
return std::make_unique <Driv3> ();
}
};
int main () {
std::vector<Base*> BaseCnt;
Driv3 Driv3_;
BaseCnt.push_back(&Driv3_);
std::unique_ptr<Base> BaseUni;
BaseUni=BaseCnt.back()->construct ();
return 0;
}
0007デフォルトの名無しさん (ブーイモ MMe7-YJVE)垢版2022/12/31(土) 18:55:55.24ID:MecdUwfcM
コメントは対応するコードの前後どちらに書く?

// 別行なら前だが
int i = 0;

int i = 0; // 同じ行なら後?

同じ行に書いてたものが変更で長くなって別行に移したら前後が入れ替わるの気持ち悪くない?
0014はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 633e-ChaJ)垢版2022/12/31(土) 23:41:26.87ID:Lgb5NxGE0
コメントの移動だけが (一回分のコミットとして) 差分に出るのだったらちょっと嫌な感じだけど、
周辺のコードを修正した結果として行が長くなりすぎないようにコメントの位置も変えるという話なんだから
差分ツールで見たらどうせそこらへん一帯が出るわけでしょ。
その中にコメントのちょっとした移動が含まれるかどうかなんて気にするようなもんじゃないと思うけどなぁ。
0016はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 633e-ChaJ)垢版2023/01/01(日) 00:07:36.95ID:xRsGwj7i0
ところで私がよく使う言語に Scheme があって Scheme ではセミコロンから改行までがコメントになるんだけど、
Scheme の (というか主な LISP 系言語の) 習慣では状況によってセミコロンの数を変えるし
フォーマッタはセミコロンの数に基づいてインデントを変える。
https://www.gnu.org/software/emacs/manual/html_node/elisp/Comment-Tips.html
便利な習慣だと思うんだけど他の言語ではこういうのを見ないなぁ。
0019デフォルトの名無しさん (ブーイモ MMb6-vTgN)垢版2023/01/01(日) 11:42:43.03ID:83NHqx7aM
コメントを同じ行に書くことはほとんどないかなあ
そもそも1行コメントで済む処理っどんなの? コメント必要なのかな?

俺は処理の塊の前に意図など含めて長文コメントを書いてる
0020デフォルトの名無しさん (ワッチョイ 7a28-d25T)垢版2023/01/01(日) 14:59:08.11ID:M9T6rHgL0
行内コメントはどこまで下げるのかと言う問題が、
  foo();         // xxxとyyyを更新
  assertIm(xxx) + Im(yyy) == 0); // 変換結果は共役のはず
--------->| 40 カラム?
-------------->| 56 カラム?

オートフォーマッター任せにしたいが定説が無さげ
perltidyだとなんか隣接する行コメは64カラム目か、それを超える場合は一番長いのに合わせてくれるが
コードの長さがかなり不ぞろいなとき罪悪感みある、
 a();  // (aのコメント)
b();  // (bのコメント)
 very_long_long_long_name_function_call_to_baz(long_long_name_param, 1234567); // (←のコメント)
0023デフォルトの名無しさん (ワッチョイ 7a28-d25T)垢版2023/01/01(日) 15:05:17.13ID:M9T6rHgL0
あとif文の行内コメントも悩む、
  if (a==b) // ここには分岐条件のコメントを書くべき?
  {       // ここにはthen節のコメントを書くべき?
    ...
  }
  else    // else節のコメントはここでええのか?
  {      // それともここか?
    ....
  }

どう書くかによってブレーススタイルやオートコードフォーマッタとの
共存具合が変わってくるので行内コメントはいろいろ問題が多いシステム、
0025デフォルトの名無しさん (アウアウウー Sac7-+uJR)垢版2023/01/01(日) 15:17:33.19ID:ZNJrRmgOa
>>23
ありゃ行内コメントか...

if (a==b){ // a と b が等しいなら...
... //. 等しい時の処理
} else { // 等しくないなら...
... // 等しくない時の処理
}

確かに通常のコメントと行内コメントが混在するとモヤモヤするのはある
0026デフォルトの名無しさん (ワッチョイ 6301-9yt5)垢版2023/01/01(日) 17:05:55.66ID:c0wTdgdc0
>>16
よく使うって、何に使うんだよ?
0027はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 633e-ChaJ)垢版2023/01/01(日) 17:43:06.94ID:xRsGwj7i0
>>26
手癖で使えるなじんだ言語ってひとつくらいはあるもんだろ。
俺はそれが Scheme だってだけで、やってることは自動でネットを巡回したりだとか
ファイルを条件別にフォルダに仕分けしたりだとかとかいった普段のちょっとした自動化とかだよ。
0028デフォルトの名無しさん (ワッチョイ 9aad-TwI4)垢版2023/01/01(日) 17:48:24.72ID:OS3h3nzh0
(真理情報)grep検索しやすいのが正義
0029デフォルトの名無しさん (ワッチョイ 6301-9yt5)垢版2023/01/01(日) 18:20:59.18ID:c0wTdgdc0
ニンジャ凄いな。
全部のコア使い切ってる。
0030デフォルトの名無しさん (ワッチョイ 6301-9yt5)垢版2023/01/01(日) 18:29:13.35ID:c0wTdgdc0
新しいパソコンのメリットを特に感じていなかったけど、大物をビルドすると圧倒的に速いな。
0031デフォルトの名無しさん (ワッチョイ 6301-9yt5)垢版2023/01/01(日) 18:29:31.45ID:c0wTdgdc0
何か間違えたのかと思ったわ。
あまりにも早すぎて。
0044デフォルトの名無しさん (ワッチョイ 8b01-4uR0)垢版2023/01/03(火) 13:45:59.96ID:BllUqxS60
10年以上も前のことを何を今更って感じもするし
std::shared_ptr以前からスマートポインタは
一般的だったから事実誤認のような気もする
特にC#が登場した2000年にはスマートポインタの利用は一般的だった
Java登場の1995年当時を知る人はいるかな?
0045デフォルトの名無しさん (ワッチョイ 9aad-TwI4)垢版2023/01/03(火) 14:00:08.10ID:Tocwdict0
>>44
> 一般的だったから事実誤認のような気もする

C++スレに書き込む人にとってはもちろんそうだろうけど、C++やらないプログラマにとってはそうではなかった
理解が広まるのに時間がかかる
0050デフォルトの名無しさん (ワッチョイ 9aad-TwI4)垢版2023/01/03(火) 20:16:21.45ID:Tocwdict0
以下の記事、プログラマ脳なら神様の定義の変化を重視するよなあ。あるか、ないかじゃなくて。


【神様はいる? いない?】古代の人々は神をどう考えたのか?(ダイヤモンド・オンライン) - Yahoo!ニュース
https://news.yahoo.co.jp/articles/621899c69768ec530aa5377fed89908dc3eef8d4
0052はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 633e-ChaJ)垢版2023/01/04(水) 01:31:15.66ID:0JWM3k/l0
そうか? 言語機能に改定が必要なことならともかく
ライブラリは実績があるほうが通しやすいし、
標準に取り込まれなくても細かな便利機能がある Boost が衰退したとは感じないな。

サードパーティのライブラリを導入する手続きが面倒というのはよくある話だから
そういう面でもカバー範囲が広い Boost の出番は多いんじゃないの。
0053デフォルトの名無しさん (ワッチョイ 977c-4W3V)垢版2023/01/04(水) 01:55:44.13ID:gfVJn8560
単純に必要な便利機能はあらかたC++標準の方に取り込まれてて
もうマイナーやマニアックな機能かゴミしか残ってないから使う機会なくなったわ
なんかこれ今でも便利だよってのある?
0054デフォルトの名無しさん (ワッチョイ 9aad-TwI4)垢版2023/01/04(水) 02:11:04.13ID:CtSEqK7p0
>>53
他の言語ではとっくの昔に標準化されているXMLやJSONのパーサーが標準化されたら便利になると思うよ
0055デフォルトの名無しさん (ワッチョイ 6301-9yt5)垢版2023/01/04(水) 02:42:57.82ID:DBMM4FaV0
>54
1.75でBoost.Jsonが入った。
0056デフォルトの名無しさん (ワッチョイ 6301-9yt5)垢版2023/01/04(水) 03:00:12.42ID:DBMM4FaV0
>>53
Boost.Beast。
0061はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 633e-ChaJ)垢版2023/01/04(水) 18:09:17.48ID:0JWM3k/l0
さすがに入出力の書式化を標準ライブラリとして用意しないわけにもいかんからな。
良いのが出来るまで先送りとは言えないんだからそのとき出来たものを入れるのはしょうがないんじゃないの。
0062はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 633e-ChaJ)垢版2023/01/04(水) 18:18:11.23ID:0JWM3k/l0
>>60
私が把握してないけかもしれないけれどストリームの基本構造を変えようという大きな動きはない。
C++20 から書式化 (オブジェクトを文字列表現にする) は std::format として切り出されて、
書式の情報は std::formatter 型で扱うのでグローバルな状態に影響を与えるマニピュレータを使う必要はなくなった。
0067デフォルトの名無しさん (ワッチョイ f3c2-acQP)垢版2023/01/05(木) 00:04:17.98ID:wM/B2eC00
当時はC with Classesなんて研究をしてる人が珍しくて
やってる人のところへ見物に来る人がぞろぞろいたんだよ

禿にとって味方をつくることも大事な仕事で
先行きがまだ見えない試みも怯まず果敢に攻める必要があった

その当時の作品を今さら未来人がドヤ顔で揶揄しても
聞いてるのは当時の人じゃなく同じ未来人だぞ
おまえ自身がどんな批判に晒されるのか怖くないの?
・・・だから匿名掲示板なのか 失笑
0075デフォルトの名無しさん (スプッッ Sd5a-kLll)垢版2023/01/05(木) 08:19:32.24ID:ImmyD00Ud
パイプで渡すものがオブジェクトの配列なだけならまだしも、
要素数が0と1の時だけ特別な処理がかかるのは使い勝手を損ねてるだけだぞ
0077デフォルトの名無しさん (アウアウウー Sac7-yDM8)垢版2023/01/05(木) 11:12:50.46ID:Cbg+aaE9a
>>75
便所や下水のPipeだね
0084デフォルトの名無しさん (アウアウウー Sac7-yDM8)垢版2023/01/05(木) 14:11:12.67ID:Cbg+aaE9a
またperlerが湧いてきたな
0093デフォルトの名無しさん (ワッチョイ 5b76-kLll)垢版2023/01/05(木) 19:55:51.72ID:N/v+WbZh0
>>78
パイプに流したオブジェクトが
2つ以上なら配列
1つならオブジェクトそのまま
0個ならnull
になってパイプ先に渡る
0095デフォルトの名無しさん (ワッチョイ 9a01-9j0N)垢版2023/01/05(木) 21:36:43.88ID:O+NRT3S+0
>>93
どんなコード書いてるの?
PS C:\> function x {
>> param([parameter(ValueFromPipeline=$true)]$p)
>> begin { Write-Host 'BEGIN' }
>> process { Write-Host "PROCESS: $p" }
>> end { Write-Host 'END'}
>> }
PS C:\> @() | x
BEGIN
END
PS C:\> @(1) | x
BEGIN
PROCESS: 1
END
PS C:\> @(1,2) | x
BEGIN
PROCESS: 1
PROCESS: 2
END
PS C:\>
普通に動いてるけど?
0097デフォルトの名無しさん (ワッチョイ 7a28-d25T)垢版2023/01/05(木) 22:43:53.60ID:QdQAlRIq0
ログ出力用に<<をオーバーロードしたら
バイナリ出力は別の手段を考えることに……
namespaceでオーバーロード内容をさらに区分するとかはできるのかどうか知らんがやりたくない、、、
0099デフォルトの名無しさん (ワッチョイ cebb-krXg)垢版2023/01/05(木) 23:36:19.07ID:91BZqTRI0
formatのお陰でもう議論する意味なんてないんだが、

17以前は
誰かが状態を書き換えてるかもしれないからいちいち保存と復元が必要、
文字列とコードが入り乱れていて、i18n化できない&何が書かれているかひと目で分からないから
到底実用的じゃない

会社で20が使えるようになったらiostreamに戻るよ…
0100はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 633e-ChaJ)垢版2023/01/05(木) 23:43:57.03ID:ojGp6ksg0
>>97
いくつかやり方はあると思うけど……。

同じストリームにログ出力用の表現とバイナリ表現の両方を出力する可能性があるなら
適当なクラスに包むだけでいいと思う。
こんな感じで書ければ十分でしょ。

Foo bar;
std::cout << binary_style(bar) << std::endl;
std::cout << log_style(bar) << std::endl;

Haskell でこんな感じで処理を切り替えるのをよく見た気がする。
だいぶん前にちょっと遊んだだけなのであまり覚えてないけど。


出力先によって表現を変えるのならストリームクラスを定義してしまえばいいと思う。
直接的な入出力はストリームバッファがやっていて、
書式化を担当するストリームがストリームバッファを所有するという構造がある。
オブジェクトの表現形式が大きく変わるとしたら出力先ごとに変えるという用途だろうから
こっちのほうが使い勝手が良い場合も多いかもしれない。
雑な例だけどこんな感じ。
https://wandbox.org/permlink/3AaOGSXLNCw2aNJv
0103デフォルトの名無しさん (ワッチョイ 6301-9yt5)垢版2023/01/06(金) 00:30:02.38ID:fURAHMja0
じゃあ、はちみつ職人に改名しなよ。
0107デフォルトの名無しさん (スプッッ Sdba-kLll)垢版2023/01/06(金) 07:56:26.71ID:vZ5ptmnXd
>>95
@(...)は長さに関わらず強制的に配列にする書き方でしょ
0108デフォルトの名無しさん (ワッチョイ 9a01-9j0N)垢版2023/01/06(金) 14:14:52.53ID:Zd/Zujyt0
>>107
だからどんなコード書いてるのよ?
PS C:\> 1, 2 | x
BEGIN
PROCESS: 1
PROCESS: 2
END
PS C:\> 1 | x
BEGIN
PROCESS: 1
END
PS C:\> | x
発生場所 行:1 文字:1
+ | x
+ ~
空のパイプ要素は許可されていません。
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : EmptyPipeElement
@ なくても特に変な動きとは思えないけど?
0110デフォルトの名無しさん (JP 0Ha3-dD2o)垢版2023/01/09(月) 23:53:42.00ID:ainDXdRxH
すみません拡張子についての質問ですけどここで聞いてもいいですか?

TeraPadでコードを入力し保存したらテキストドキュメントになってしまうのですが
どうやって拡張子を変えたらコマンドブロントと繋がるのでしょうか

すみません初心者なので分かりやすく教えてください
使ってるはwindows11です
0111デフォルトの名無しさん (ワッチョイ 1176-1Rsz)垢版2023/01/10(火) 00:28:45.02ID:iF453DR40
explorerの設定で拡張子を表示しろ
あとコマンドプロンプトのつもりで書いたんだろうけど「繋がる」なんて状況が想像できんので何をしたいか書け
0113デフォルトの名無しさん (アウアウウー Sa85-BvPj)垢版2023/01/10(火) 02:05:23.85ID:wl4CEVDPa
>>110
繋がるってのがよく分からないけど、バッチを作りたいなら拡張子を表示してから .bat に変更。プログラムを組みたいなら .cp p に変更だけどmakeファイルを書くつもりはないだろうから、VisualStudioを入れよう
0115デフォルトの名無しさん (テテンテンテン MM4b-Kria)垢版2023/01/10(火) 08:11:58.57ID:j5WRYhpwM
>>110
他から指摘されているけど、初心者ならc++用の総合開発環境(IDE)をまずインストールして、IDEの初心者向けガイドをweb で検索して勉強するのが一番良い。

最近のWindowsだとVisual Studio Community Editionが初心者向きかね。
0117デフォルトの名無しさん (ワッチョイ b101-tb1I)垢版2023/01/10(火) 19:07:54.57ID:0yW4rCRf0
C言語の重力付き4目並べです、ここのコードを簡略化したいです。

int SetXpos(int player) // コマの置き場所を入力または探して盤を更新,コマの置き場所(0-6)を返す
{
int xpos = 0; // コマの置き場所
if ((choice == 2 && player == 2) || (choice == 3 && player == 1)) // コンピュータとの対戦の場合に,コンピュータの手を計算
{
xpos = ComputeXpos(player);
printf("%sの番です\n", player == 1 ? "●" : "〇");
printf("コンピュータは%dに置きます\n", xpos);
}
else // 人間の手を選択
{
while (1)
{
printf("%sの番です\n", player == 1 ? "●" : "〇");
printf("どこに置きますか? 0-6の数字を半角で入力してください: ");
scanf_s("%d", &xpos);
if ((0 <= xpos && xpos < XMAX) && (num[xpos] < YMAX)) // 置ける場所かどうか判定
break;
printf("%dには置けません!\n", xpos);
}
}
board[xpos][num[xpos]++] = player;// コマをxpos列に置き,xpos列のコマ数を1増やす
return xpos;
}
0120デフォルトの名無しさん (ワッチョイ ab02-AyIk)垢版2023/01/11(水) 18:38:42.97ID:867Mv3q20
C++、Javaがペラペラなら生きていける。
0121デフォルトの名無しさん (ワッチョイ 999c-RNTY)垢版2023/01/11(水) 20:16:16.63ID:tEiwqSvB0
今後はWebフロントエンドの技術もできないと生きていけないよ
0126デフォルトの名無しさん (ワッチョイ 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--)
の各条件文内でどーゆー計算、アルゴリズムがされてるか教えてくださる人いますか??
0129デフォルトの名無しさん (ワッチョイ b101-tb1I)垢版2023/01/13(金) 09:13:11.98ID:CqT5d+dn0
例えば@だと、&&が論理積、||が論理和ということだと思うんですけど、演算子が分かってもその条件文内で何が行われているかとかが分からないので知りたい状態なんです。。
0131デフォルトの名無しさん (ワッチョイ 93ad-Or7w)垢版2023/01/13(金) 11:24:51.74ID:6wgE5XmR0
boostの存在意義ってことでいうと、マルチスレッドの並列ソートboost::sort::block_indirect_sort()が使えるのでLinuxなどは有益
Windowsの場合はVC++にconcurrency::parallel_buffered_sort()があるので使わないけど
0141デフォルトの名無しさん (ワッチョイ 6a28-TTdX)垢版2023/01/15(日) 18:50:51.76ID:IyvDeUGt0
質問なのですがintやdoubleといった単純な型のグローバル変数の初期化タイミングは
グローバルなオブジェクトの初期化タイミングより前であることが保証される?

多分 .dataセクションの初期化はグローバルなオブジェクトの初期化リストの実行より前だと思うんだけど
(そうでなければコンストラクタからC言語のライブラリを安心して呼べないということになる
規格的にそうなん?
0142はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ed3e-w88e)垢版2023/01/15(日) 19:52:54.05ID:1ER4Wl/40
>>141
静的初期化と動的初期化に大別されている。
初期化子が定数 (定数式) のものは静的初期化で、
そうではないものが動的初期化。
静的初期化は動的初期化より先であることは言語仕様で保証される。
0144デフォルトの名無しさん (ワッチョイ 6a28-TTdX)垢版2023/01/16(月) 23:24:41.20ID:J3mmTfbR0
>>142
レス㌧クスだいたいわかりた
この場合のconstexprの扱いがわからん……
ビルド時に定数に展開できたら静的初期化可能な範疇に含まれ得る気がするが
定数に展開で来なかったらどうするんじゃ、という気もする、

>>143
ガチで初期化順序を確実にしたい場合はシングルトンにすることを提唱する。
InterlockerCompareExchange()的なインターロック系の関数を使えばスレッドセーフにできる
(初期化済フラグがfalseならnewに進む、というのをアトミックにやる
関数スコープのstatic変数も似たような実装ではないかと予想、
0145デフォルトの名無しさん (ワッチョイ 6a28-TTdX)垢版2023/01/16(月) 23:26:34.64ID:J3mmTfbR0
訂正orz
×: (初期化済フラグがfalseならnewに進む、というのをアトミックにやる
○: (初期化済フラグがfalseならtrueにする、というのをアトミックにやって、false→trueに変化したときだけnewする
0146デフォルトの名無しさん (ワッチョイ 6a28-TTdX)垢版2023/01/16(月) 23:33:23.86ID:J3mmTfbR0
とオモタがよく考えたら初期化済フラグがfalseならtrueに変化してからポインタpにnewされるまでの間に
別のスレッドが割り込んできてpを使おうとしたら破綻するからpを獲得できるまでスピンロック的に回ることが必要やったorz
ワイの答えはこれや……!
0147デフォルトの名無しさん (ワッチョイ caad-f6s+)垢版2023/01/18(水) 09:55:18.36ID:1kekdbbc0
今さらだけどさ、以下Perlソースコードみたいに初期化以外の場所で複数の変数代入を一行で記述できたら楽だよね。
($a, $b) = (1, 2);
0157147 (ワッチョイ caad-f6s+)垢版2023/01/19(木) 21:22:03.00ID:4HhHC5J20
解決方法を探しているんじゃなくて、言語仕様の変更提案なんだけど
改めてPerlだと以下のような感じ
use strict;
my ($a, $b) = ('AAA', 'BBB');
($a, $b) = ('YYY', 'ZZZ');
0162147 (ワッチョイ caad-f6s+)垢版2023/01/19(木) 23:36:31.49ID:4HhHC5J20
複数個の変数に対する初期化のワンライナー記述(本当は初期化なので代入ではないが)が許されるなら、再初期化もワンライナー記述できていいと思うんだ
0168はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0a3e-w88e)垢版2023/01/20(金) 14:46:45.60ID:FDJF8fJ70
>>166
それは >>155 で言及 (?) されている構造化束縛 (structured bindings) のことでしょ。
返却値の数はあくまでもひとつ。
そのひとつを分割して初期値にすることが出来るのであって複数の返却値を返せるわけではない。
0190147 (ワッチョイ ffad-88l+)垢版2023/01/21(土) 14:45:55.24ID:4IvYDHHD0
HOGE構造体インスタンス hogeのメンバfooとbarだけを再設定したい時に、hogeというインスタンス文字列を何度も書かずに済むような仕組みあればいいなあ
HOGE hoge = {0};
do_something(hoge);
hoge.[foo, bar] = [1, 2];
0199はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-j5s0)垢版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);
}
0200デフォルトの名無しさん (ワッチョイ 0301-SUdz)垢版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;
}
0202デフォルトの名無しさん (ワッチョイ 4310-Jpma)垢版2023/01/22(日) 17:51:51.29ID:mu8Nl5mu0
pythonのdecimalで2^256倍精度浮動小数点数の最大値を計算してみた。
https://ideone.com/aCP13Y

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

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

ideoneがそれ用のライブラリを持ってるか知らんから頑張って探すしかない
0214はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-j5s0)垢版2023/01/23(月) 13:17:00.05ID:WcsuDU3H0
>>211
C が始まったとき (1972 年) に C++ は無い。
C++ の前身である C with Classes の歴史の始まりは 1979 年で、そのときは
C のプリプロセッサとして書かれていたしあくまでも C の拡張と見なされていた。

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

普通は呼ばないがそこらへんは言葉の定義の問題なので「派生」という言葉の
定義によっては無理すれば派生と呼べなくもないかもね。
0217デフォルトの名無しさん (ワッチョイ e397-li2T)垢版2023/01/26(木) 07:48:33.46ID:XZjGtAvJ0
class A{
public:
 void operator () () {...}
};

class B : public A{
 void func(){
  ここでオペレータ()を呼びたいとき、(*this)()としたら呼べますが、this→()では呼べませんでした。
  なぜでしょうか?
 }
};
0224デフォルトの名無しさん (ワッチョイ cf02-li2T)垢版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 はコンパイル時には確定してるのになぜダメなのでしょうか。
0232デフォルトの名無しさん (ワッチョイ 4376-YIrE)垢版2023/01/26(木) 20:20:42.59ID:yE3XErdV0
すでに出てるけどA<T>が何者か確定してないので、
(B<int>とかの具体的な型が決まる時ではなく)テンプレート宣言時にエラーになる。

template<class T> class B : public A<T>{
using A<T>::f;
public:
void g(){f();}
};
のように親クラスA<T>にメンバーfがいることを宣言してやればテンプレート宣言自体は通る。
0247デフォルトの名無しさん (スププ Sd1f-qKKb)垢版2023/01/27(金) 13:51:05.37ID:mIJqx29Ld
マジレスすると C++ のテンプレで頑張るより
Nim 使った方が楽だし時間の節約になるよ
0252デフォルトの名無しさん (ワッチョイ c35f-j5s0)垢版2023/01/27(金) 16:17:02.37ID:a+0fKe/I0
>>248
「組み込みのチープな環境」で組んでたことあるけど、心当たり無いよ。
コードサイズだって手書きなりマクロなりでも必要量は同じになるだろうし。
何か例でも挙げてみてもらえる?
0253はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-j5s0)垢版2023/01/27(金) 16:29:51.65ID:B8oMym/70
>>246
テンプレート自体が実行性能の足を引っ張るってことはないが
個々の場面でより性能よく書けるはずのときに汎用部品で済ましてしまうってことはあるんじゃない?

そういうときでも個々の箇所をいじるよりは特殊化を足すだけで済むほうが楽だと思うが。
0254デフォルトの名無しさん (スプッッ Sd1f-kZgD)垢版2023/01/27(金) 16:34:12.21ID:k7iFif1Jd
同じ結果になるように書けばそりゃ同じだろう
テンプレートで楽をすればコードは(一般的には)増える

memcpyで済む物が
型別にコードが発生したり

そういう所を気にすると結局楽が出来ない
0268はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-j5s0)垢版2023/01/27(金) 18:01:40.26ID:B8oMym/70
ワイは Z80 時代を生きたおじさんやぞ。
いまどきチープな組み込みでも最初からそんなカリカリにチューニングするのはそんなにないやろ。
無いとは言わんけど C++ の利用例としては例外的やわ。
0277デフォルトの名無しさん (ワッチョイ d312-Pfi1)垢版2023/01/27(金) 18:38:13.74ID:7yNCo9mI0
ないものは示せないもんな
せいぜいそんな言い訳にもなってないことを勝手にぬかしてろ
俺はこれから夕飯作らにゃならんし害虫が出てくのを待つ意味でもしばらく落ちる
0280デフォルトの名無しさん (ワッチョイ 6301-H6v1)垢版2023/01/27(金) 22:01:21.69ID:GkVPt6s00
>>270
それお前やろ
0289デフォルトの名無しさん (ワッチョイ db76-xF8Z)垢版2023/01/28(土) 16:15:40.82ID:gfTDhobA0
単に初期化で使ってるだけでしょ
今回はintであることが明白だから=でも()でも{}でも初期化できるけど

この手のコンパイル時に決まるやつはstatic constexpr一択だね
array<T, nankanokosuu> a;みたいに他のテンプレート引数に使える
0292デフォルトの名無しさん (オイコラミネオ MM63-ZqoR)垢版2023/01/28(土) 17:08:38.28ID:1oumyOI/M
>>288
>それはさておき初期化の位置に使っている中括弧 {N} はなに?
C++11位から導入された初期化の一種。
a{N}は、a = N とほぼ同じだが、縮小変換をしないということや、
「どんな場所でも必ず使える」特徴があると言われており、Stroustrup氏
は、= よりも {} を推奨している。
また、{} による初期化は「直接初期化」と関係が深く、= による初期化は
「代入初期化」と関係が深い。
0294デフォルトの名無しさん (オイコラミネオ MM63-ZqoR)垢版2023/01/28(土) 23:35:50.70ID:JY7EfERdM
>>293
「直接初期化(direct initialization)」とも関係しているが、
{}による初期化は、「一様初期化 (uniform initialization)」
で検索すると出て来やすい。
なお、ネットでdirect initializationを検索しても間違った定義が出てくるかも知れない。
0295デフォルトの名無しさん (ワッチョイ 0b01-Z6M9)垢版2023/01/29(日) 00:27:43.05ID:2zmXfTjk0
>>294
なるほど「直接初期化」と{}による初期化(= [一様初期化])は分かった
[一様初期化] https://cpprefjp.github.io/lang/cpp11/uniform_initialization.html
[直接初期化] https://learn.microsoft.com/ja-jp/cpp/cpp/initializers?view=msvc-170
「縮小変換」と「代入初期化」が分からん
「代入初期化」は=による初期化のことを言ってるのかな?
0297デフォルトの名無しさん (オイコラミネオ MM63-ZqoR)垢版2023/01/29(日) 13:42:04.03ID:uP7zelejM
>>295
正しい定義かどうかは分からないが、一応、
「直接初期化」「コピー初期化」については、英語版の en.cppreference.com
をそれぞれ
「direct initialization」「copy initialization」
で検索すると「パターン」一覧が出てくるみたいだ。
ただし、一覧については「全てのパターン」かは定かではない。
例えば、direct initialization については、一覧には、new T(XXX) しか出てないが、
new T{XXX} でも良いハズ。
0298デフォルトの名無しさん (オイコラミネオ MM63-ZqoR)垢版2023/01/29(日) 13:47:49.42ID:uP7zelejM
>>297
https://en.cppreference.com/w/cpp/language/direct_initialization

T object ( arg );
T object ( arg1, arg2, ... ); (1)

T object { arg }; (2) (since C++11)

T ( other )
T ( arg1, arg2, ... ) (3)

static_cast< T >( other ) (4)
new T(args, ...) (5)
Class::Class() : member(args, ...) { ... } (6)
[arg](){ ... } (7) (since C++11)

[説明]
* (5)は、() しか出てないが、{} でも可能 :
new T(args, ...) (5)
new T{args, ...} (5')

* (3) も、() しか出てないが、{} でも可能で恐らくother でなくてもいい筈だ(定かではない) :
T ( other )
T ( arg )
T ( arg1, arg2, ... ) (3)
T { other }
T { arg }
T { arg1, arg2, ... } (3’)
0299デフォルトの名無しさん (オイコラミネオ MM63-ZqoR)垢版2023/01/29(日) 13:56:42.30ID:uP7zelejM
>>295
>「縮小変換」と「代入初期化」が分からん
>「代入初期化」は=による初期化のことを言ってるのかな?
縮小変換は、検索すると出てくる。
「代入初期化」という言葉は、俺の記憶違いだったらしく、「コピー初期化」
が正しかったようだ。難しい。
0301デフォルトの名無しさん (ワッチョイ 0b01-Z6M9)垢版2023/01/29(日) 20:57:42.75ID:2zmXfTjk0
>>299,300
なるほど「縮小変換をしない」とは
例えば以下でエラーになるってことね
int a {1.0};
「コピー初期化」ってのはコピーコンストラクタを呼ぶ初期化
あるいはコピーコンストラクタ自体のことで良いのかな?
0302デフォルトの名無しさん (オイコラミネオ MM63-ZqoR)垢版2023/01/29(日) 23:00:33.52ID:JRnzhQFiM
>>301
>「コピー初期化」ってのはコピーコンストラクタを呼ぶ初期化
>あるいはコピーコンストラクタ自体のことで良いのかな?
個人的には、
CPerson::CPerson( CPerson const &rPeson )
の形式のコンストラクタがコピーコンストラクタで、
それを使う初期化がコピー初期化、と思って今まで生きてきたが、
それだと、「直接初期化」の対比の意味のものとは違っているように思える。
どこかで、言葉の混乱が起きているかも。
分からない。
0303デフォルトの名無しさん (オイコラミネオ MM63-ZqoR)垢版2023/01/29(日) 23:11:23.60ID:JRnzhQFiM
>>302
一部の例外を除いては、「コピー初期化」とは、= が書いてある初期化で、
「直接初期化」とは、= が書いて無い初期化、だといわれている。
但し、沢山例外があって、
T x = T(a);
などは、直接初期化なんだそうだ。
また、return a などは、コピー初期化、なんだそうだ。
記憶に頼っているので間違っているかも知れない。
0305はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b63e-fO7+)垢版2023/01/30(月) 01:17:26.91ID:kRDQpz8S0
>>302
コンストラクタはどれも直接初期化に使えるコンストラクタだけど
一定の形式を満たすものはコピー初期化の文脈「でも」使えるってだけ。

>>303
> T x = T(a);
> などは、直接初期化なんだそうだ。

これについて形式的にはあくまでもコピー初期化の一種ということになる。
https://timsong-cpp.github.io/cppwp/n4659/dcl.init#15
その上でコピーの省略が起きて結果的には直接初期化と同じ挙動になる。
https://timsong-cpp.github.io/cppwp/n4659/class.copy.elision#1
0306デフォルトの名無しさん (オイコラミネオ MM63-ZqoR)垢版2023/01/30(月) 16:11:51.36ID:S2+yDPxmM
記憶に頼って書くけど、
1. 1つの引数を持つコンストラクタは、explicit修飾することが推奨されている。
2. explicit指定が無いと、そのつもりは無い「ひょんな場所」で勝手に変換コンストラクタとして
 利用されてしまうことがある。特に関数に引数を渡す場合に起き易いらしい。
3. CPerson::CPerson( CPerson &rPerson ) は、同じ型を単純にコピーする
 コンストラクタであるから、そもそも型の変換はしないので変換コンストラクタでなく、
 「コピー・コンストラクタ」と言われる。
4. つまり、CPerson::CPerson( AAA &rAAA ) のような場合に
0307デフォルトの名無しさん (オイコラミネオ MM63-ZqoR)垢版2023/01/30(月) 16:18:21.06ID:S2+yDPxmM
>>306
[誤送信してしまった。スマソ]
4. つまり、CPerson::CPerson( AAA const &rAAA ) や CPerson::CPerson( int &rX )
 のような場合に explicit 指定することが推奨されていたと思う。

T x = T(a);

の場合、「C++のからくり」のような昔の解説書だと、最適化に任されているのではなく、
特別処理されているようなニュアンス(?)で、T x(a) と同じだと書いてあった。
もし、特別処理されてないと考えた場合、= の部分だけに着目すれば、T::T( T const &rX ) という
コピーコンストラクタの呼び出しと意味論的には考えて考えられなくも無い。
そうするとそこは「変換コンストラクタ」ではなく「コピーコンストラクタ」が使われることになる。
コピーコンストラクタはいくら使っても速度が遅くなる以外は劣化やデータの変化が無いため
無害と言えば無害。なので、explicit が付いていてもいなくても余り関係が無いような気がする。
0308デフォルトの名無しさん (オイコラミネオ MM63-ZqoR)垢版2023/01/30(月) 16:24:16.09ID:S2+yDPxmM
>>307
[補足]
void f(T x);
に対して、
U a;
f(a);
と書くと、実引数aが仮引数xに渡される時の動作は、「コピー(?)初期化」と考えられて
いる。もしかしたら言葉は正しく無いかもしれないが、少なくとも「直接初期化」には
分類されないということ。
そしてexplicitが付いて無いコンストラクタは、このような初期化に対しては用いられ
ないことが保証されると書いてあったと思う。
0309デフォルトの名無しさん (オイコラミネオ MM63-ZqoR)垢版2023/01/30(月) 16:25:22.84ID:S2+yDPxmM
>>308
[訂正]
誤: そしてexplicitが付いて無いコンストラクタは、このような初期化に対しては用いられ
  ないことが保証されると書いてあったと思う。
正: そしてexplicitが付いている無いコンストラクタは、このような初期化に対しては用いられ
  ないことが保証されると書いてあったと思う。
0310デフォルトの名無しさん (オイコラミネオ MM63-ZqoR)垢版2023/01/30(月) 16:26:12.39ID:S2+yDPxmM
>>309
[再訂正]
誤: そしてexplicitが付いている無いコンストラクタは、このような初期化に対しては用いられ
  ないことが保証されると書いてあったと思う。
正: そしてexplicitが付いているコンストラクタは、このような初期化に対しては用いられ
  ないことが保証されると書いてあったと思う。
0313はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b63e-fO7+)垢版2023/01/30(月) 17:25:41.99ID:kRDQpz8S0
>>306
explicit を付けることは推奨されているわけじゃない。
推奨している人もいるけど普通は必要に応じて使い分けるよ。
明らかに変換を意味しないようなコンストラクタになっちゃうこともあるから気を付けろという程度の話。

たとえば vector は size_t を受け取るコンストラクタがある (指定サイズ分の大きさになる) がそれには当然 explicit が付いてる。
整数が vector に変換されるのは明らかにおかしいから。
char* から string への変換みたいな自然な変換では困らないし、あるほうが便利。

>>307
> 特別処理されているようなニュアンス

かつてはその場合はコピーの省略が許される (しなくてもよい) という仕様だった。 (今の仕様だとコピーの省略が必須。)
コピーコンストラクタは必ずしもコピーをするだけではなくなんらかの副作用を引き起こしても良いので
コピーの省略の有無によってプログラムの意味が変わってしまう。
プログラムの意味を変えない範囲で処理系が行う通常の「最適化」とは異なるという意味では特別扱いだ。
0316デフォルトの名無しさん (オイコラミネオ MM63-ZqoR)垢版2023/01/30(月) 20:58:31.18ID:rMqdSurOM
>>313
>たとえば vector は size_t を受け取るコンストラクタがある (指定サイズ分の大きさになる) がそれには当然 explicit が付いてる。
>整数が vector に変換されるのは明らかにおかしいから。
>char* から string への変換みたいな自然な変換では困らないし、あるほうが便利。
なるほど。そうだったのか。
勉強になりました。
0317デフォルトの名無しさん (アウアウウー Sa47-hJvz)垢版2023/02/02(木) 23:34:11.97ID:Ce1dvKO2a
C++やるとどんな言語も使えるとか言うけどNode.jsも数時間あれば使いこなせるの?
あれは言語じゃないでしょって言われそうだがjavascriptともhtmlとも違くて別言語に思えるんだけど
0320はちみつ餃子 ◆8X2XSCHEME (ワッチョイ e33e-fO7+)垢版2023/02/03(金) 00:27:17.07ID:cvg0vFRY0
>>317
C++ を使っていれば低レイヤの事情やシステム全体の関連を知る機会があるし、
言語処理系がどう実装されるのか (低レイヤの視線から見てどう動くのか) を知っていれば
常識的な言語デザインの感覚がわかる。 (言語仕様を類推しやすい。)
C++ を使いこなしている状況からなら色々と理解しやすいという効果がないとは言えない。

ただ、あくまでも C++ を使いこなせるようになる過程で言語自体以外にも身につくことがあるという部分が効いてくるので
C++ の言語仕様の知識はそれほど役に立つわけではないし、さすがに数時間で Node.js を使いこなせるということはない。
0321デフォルトの名無しさん (アウアウウー Sa47-hJvz)垢版2023/02/03(金) 00:44:48.46ID:7WbTLk8Ha
quoraとか知恵袋とかブログで「Cの次はC++をやればオブジェクト指向身について更にCから派生した言語が主流だからどんな言語も直ぐ理解できる」みたいなの多いよ
だからこのスレの人達ならNode.jsも余裕なのかなって

>>320
学ぶ過程の色んな経験が生きるって事か。そりゃそうだよね
0322はちみつ餃子 ◆8X2XSCHEME (ワッチョイ e33e-fO7+)垢版2023/02/03(金) 01:31:41.47ID:cvg0vFRY0
>>321
JavaScript は C 風の外観を持ってこそいるけど動的型、かつ、プロトタイプベースであるという点で
根本的に異なるメカニズムなわけでこういうのを「C から派生」と呼んでよいのかどうか……。
0323デフォルトの名無しさん (ワッチョイ 9af0-2biX)垢版2023/02/03(金) 07:32:32.82ID:gaR1XNY40
よく使う言語と比べて在るもの無いもの違うわけで
ちゃんと理解しようとしたらそれなりに時間がかかるでしょ
気軽に使いこなすとか言葉にしてると怖いおじさんに怒られるぞ
0325デフォルトの名無しさん (ワッチョイ e76b-N2mU)垢版2023/02/03(金) 09:08:55.43ID:b6b2xU8/0
vector<int>& a = c, b = c;
としたときに、bがcの参照になりませんでした。
&が後ろにかかるからかと思って
vector<int> &a = c, &b = c;
としても結果が変わりませんでした。
vector<int> &a = c;
vector<int> &b = c;
とすればやっと期待通りの動作になりました。
参照の宣言と初期化は複数をカンマで区切って一行で書くことは不可能なのでしょうか?
0327デフォルトの名無しさん (ラクッペペ MMb6-Go++)垢版2023/02/03(金) 12:28:10.97ID:31rfnruOM
c言語スレで質問したのですが
スレ違いとのことでしたので
改めて質問致します。

c言語の標準入出力ストリームの
本当に基本的なことなんですが
わからずに困っています。
教えてください。

std::ofstream stream;

ostream << "ABCEFG";

この入力した文字列の"ABCEFG"を
右側3文字を削除して"ABC"にするには
どうすれば良いのでしょうか?
0331デフォルトの名無しさん (ラクッペペ MM4f-zLlH)垢版2023/02/04(土) 10:43:22.05ID:amDpu8JYM
>>330
回答ありがとうございます。

あれから自分でも調べて
seekp()でファイル内位置を移動するなど
試してみたのですがうまくいきませんでした。
(修正の方向はあっていると思うのですが・・)
やはり>>330さんの言う通り、テキストの削除は難しくする
何かわかりませんがそういう思想があるみたいに感じました。

そこで自分も細かい編集は別に改めて行って
結果をまとめてstreamに出力する方法に切り替えました。
結果はOK、どうもありがとうございました。

tstring_t str = _T("ABCDEFG");
str.erase(str.size() - 3);
stream << str;
0333デフォルトの名無しさん (アウアウウー Sa93-fxZT)垢版2023/02/04(土) 11:41:36.65ID:9C/WLP1pa
>331
seekp seekg
tellp tellg
読み込み用と書き出し用でポインタが二つあるので
自分で思ってるのと違う場所になってるのかも
方向性はあってるはず
間違ってたらすまん子
0334デフォルトの名無しさん (ワッチョイ cf69-F1up)垢版2023/02/04(土) 14:37:50.00ID:cBqi3lSD0
>結果をまとめてstreamに出力する
これで済むなら、これこそが正道
必要のない出力をして後から切り詰めるなんて愚の骨頂
そうしなきゃならない理由があるならしょうがないけど
0335デフォルトの名無しさん (スッププ Sd5f-340S)垢版2023/02/04(土) 16:23:00.83ID:12Q26erYd
>>331
テキストじゃなくてファイルの削除でしょ
そういう細かい言い間違いが多いから伝わりにくい文章になってると思う
ファイルに出力する前にメモリー上で編集済ますのは当たり前でファイルアクセスにはメモリよりも時間がかかるから
そういった基本を知ってたほうがいいプログラムを作れるよ
0338デフォルトの名無しさん (スッププ Sd5f-340S)垢版2023/02/04(土) 19:15:57.04ID:EmptyAuWd
>>336
ひょっとしてファイル上に出力した状態をテキストと呼んでるのか

メモリ上かファイル上かの区別でそんな呼び方はしない
思想とかじゃなくてメモリとファイルにはそういう性質があるってだけ
早とちりの激しい人のようだな
0340デフォルトの名無しさん (ラクッペペ MM4f-zLlH)垢版2023/02/04(土) 19:47:05.93ID:amDpu8JYM
>>338
いや全然違うよ、もっと基礎的な話で
C言語の標準入出力ストリームでのテキスト出力の話をしているの。
(C++の文字列クラス std::stringとはまた別)

>>327
ostream << "ABCEFG";
はテキストの書き込み処理だけど、
これをやっても内部のバッファに書き込まれるだけで
HDDファイルなどの真の書き込み先には書き込まれないの。

//ostream << std::fflush;
仮に上の関数を呼ぶことで初めてHDDファイルなどに書き込まれるの。

んで、入力されてまだフラッシュされていない文字列"ABCEFG"を
右側3文字を削除して"ABC"にするには
どうすれば良いのでしょうか?
ってのが私の質問なんです。
OK?
0342デフォルトの名無しさん (ワッチョイ 0f7c-m47a)垢版2023/02/04(土) 20:22:02.19ID:Uc49lFdn0
>>340
std::flushは呼び出し後にバッファがフラッシュされることを保証するだけで、書き込みをするタイミングは未規定(pstreamの勝手)
ostreamはoperator<<が呼ばれたそばから全部書き出してもいいし、バッファを半分ずつとか書き出してもいいしそれはostreamの自由
「入力されてまだフラッシュされていない」なんていう状態はostreamが教える義理はないし真っ当な方法では外からは観測できないしするべきでもない
ましてそれを弄くろうなんて考えるのがカプセル化を無視した間違った考え方だ
0344デフォルトの名無しさん (オイコラミネオ MM03-IoIL)垢版2023/02/04(土) 20:26:47.52ID:KFFsFRScM
>>340
C++のSTLには、ファイルではないstreamの中に、そういう機能を持つものがあり、
atoi()の代わりに用いる例が出ていた。
それは入力と出力が可能なstreamで、文字列を出力しておいて、整数型として
入力することが出来る。
それが出来るということは、語尾を削除することも出来そう。
0348デフォルトの名無しさん (ワッチョイ 3fad-t53W)垢版2023/02/04(土) 21:44:35.26ID:J5X2r1Ng0
>>340
>んで、入力されてまだフラッシュされていない文字列"ABCEFG"を
>右側3文字を削除して"ABC"にするには
>どうすれば良いのでしょうか?

"ABC"しか入力(ストリームに対する出力)されないようにするのが筋じゃねえの?
何がしたいのか
0349デフォルトの名無しさん (アウアウエー Sabf-FmQs)垢版2023/02/04(土) 21:50:32.61ID:b6Tm4pTJa
そういう感じの質問こそAIに聞くと的確な答が返ってきそう
0353デフォルトの名無しさん (ワイーワ2 FFbf-+IHm)垢版2023/02/05(日) 20:22:13.30ID:KKxK2YdEF
>>340
どうでもいいけどostreamはC++だぞ
0358デフォルトの名無しさん (オイコラミネオ MM03-IoIL)垢版2023/02/06(月) 11:10:20.13ID:MSBukcfKM
>>327
stdin から ABCDEF を入力して、stdout にABC を出力するらしい例。
なお、実際には全く確認してない。

[方法1]
// 文字列変数 a の段階で3文字に切り詰められ、ABC だけが入ってくるらしい。
string a;
cin >> setw(3) >> a;
cout << a;


[方法2]
// 文字列変数 a には、ABCDEF が入るが、出力は最初の 3 文字になるらしい。
string a;
cin >> a;
cout << setw(3) << a;
0360デフォルトの名無しさん (スッププ Sd5f-340S)垢版2023/02/07(火) 12:29:25.49ID:UPy+Lbp7d
>>340
だから自前のバッファで操作してから書き込めばいいじゃんって話
ストリー厶の意味がわかってないんじゃない
サンプル例題ならともかくもっと実用的なアプリを使うようになったら当然そうなるしそんなとこほじくってるよりもメモリ上で操作すれば簡単だって話
0367デフォルトの名無しさん (オイコラミネオ MM03-IoIL)垢版2023/02/08(水) 14:01:54.37ID:ZMdgsCGCM
>>366
tryを使う場合、その関数の冒頭で、exception handler(←名前は忘れました)の
アドレスを fs:[xxx] 見たいな場所に退避したり、新しいアドレスを入れたりする
プロローグコードが挿入されるので、例外が全く発生しない場合でも、
少し遅くなる。
0373デフォルトの名無しさん (オイコラミネオ MM03-IoIL)垢版2023/02/08(水) 19:41:50.12ID:ny58eQb8M
>>372
[補足]
その時にネットで検索したら、(確か)IBMのコンパイラだけは、
例外処理を行なう関数でも、追加プロローグが必要なくて、例外が発生しない
ときには全くオーバーヘッドが無い、ということだった。

VC++だと、例外処理を使う関数には以下の様なプロローグとエピローグが追加されると
思う。記憶に頼っているので大体こんな感じだった、という程度で、本当は
間違っているかも知れない。
push fs:[xxxx]
mov fs:[xxxx],その関数の例外ハンドラのアドレス
・・・
pop fs:[xxxx]
0374デフォルトの名無しさん (オイコラミネオ MM03-IoIL)垢版2023/02/08(水) 19:45:44.31ID:ny58eQb8M
>>367
誤: アドレスを fs:[xxx] 見たいな場所に退避したり、新しいアドレスを入れたりする
 プロローグコードが挿入されるので、
正: fs:[xxx]の中身をスタックに保存した後、fs:[xxx]に新しい例外ハンドラの
 アドレスを入れるプロローグコードが挿入されるので
0377デフォルトの名無しさん (ワッチョイ 0f02-9sAx)垢版2023/02/08(水) 21:14:42.08ID:TiunzV3b0
std::string_viewじゃダメ?
0379デフォルトの名無しさん (ワッチョイ 3f28-G/zc)垢版2023/02/08(水) 23:43:16.66ID:91RYCz8E0
問題ありそうなのでこんな感じにしたわ;;;
const static int NECONV = (sizeof(uint64_t) - 1) / sizeof(short) + 1;
union LargeInt {
  short m_small[NECONV];
  uint64_t m_large;
};
static void writeLargeInt(const uint64_t x, std::array<short, NE>& arr) {
  LargeInt u;
  u.m_large = x;
  for (int i = 0; i < NECONV; i++) {
    arr[i] = u.m_small[i];
  }
}
0381はちみつ餃子 ◆8X2XSCHEME (ワッチョイ cf3e-F1up)垢版2023/02/09(木) 00:46:46.54ID:zt0qN6wf0
>>379
アラインというか、言語仕様上の保証という意味では最後に書き込んだ供用体メンバ意外から読むのは未定義という解釈が一般的だよ。
未定義と直接に書いてあるところもないんだけど出来ると書いてあるところもないのでこういう場合は未定義と解される。
(ただしスタンダードレイアウトで初期シーケンスが共通している箇所については OK 。)
m_large に書き込んだなら m_small として読むべきではない。

大抵の処理系では拡張として OK にしているけど細かい制約は場合によるから問題があるかないかは
処理系の都合をきちんと検証しないとわからん。

特にハードウェア寄りの仕方のない状況を除けば避けれるものなら避けたほうがよくはある。
0382デフォルトの名無しさん (ワッチョイ 3f28-G/zc)垢版2023/02/09(木) 08:04:31.16ID:nokdLSLo0
>エンディアンでググれ
えっ

>言語仕様上の保証という意味では最後に書き込んだ供用体メンバ意外から読むのは未定義
えっ;;;

LARGE_INTEGER共用体 (winnt.h)が使える環境でMicrosoft社製コンパイラでビルドする場合は未定義でないものとする、、、
LONGLONGとDWORDとLONG間でしか保証されないとか言われたら知らん、、、
0395デフォルトの名無しさん (ワッチョイ 8f12-KDf3)垢版2023/02/10(金) 12:57:47.33ID:rXRs96IF0
例えばnumeric_limits<double>::infinity()を使うべきところでHUGE_VALを使うと
このジジイは・・・てなるようなこと

CHAR_BITを使うとこのジジイは・・・ってなる人は何使ってるのかって
0396デフォルトの名無しさん (ワッチョイ 4f5f-F1up)垢版2023/02/10(金) 13:11:57.08ID:ntA0RsMN0
numeric_limits<unsigned char>::digits なんだろうけど、圧倒的に記述が煩雑で
CHAR_BIT のほうが書きやすく読みやすいいから、「このジジイは・・・」と思う人が居ても
使えるところでは気にせず使えばいいかと。
0399はちみつ餃子 ◆8X2XSCHEME (ワッチョイ cf3e-F1up)垢版2023/02/10(金) 14:41:42.45ID:ETMiF/8h0
>>398
if constexpr は文を書けるところじゃないと使えないんで定義 (宣言) を切り替えるようなことができない。
この手の切り替えは割とごそっと切り替えることになると思うのでマクロは要るよ。
0400デフォルトの名無しさん (ワッチョイ 835f-D0vN)垢版2023/02/12(日) 14:56:19.98ID:wUCNDItd0
template <class T , unsigned int pos , unsigned int len = 1>
struct bit_mask{
static constexpr T mask = ~( ~static_cast<T>(0) << (len) ) << pos;
// その他の処理
}

特定のビットをマスクする処理がしたくて↑のようなテンプレートクラスを作成したのだけど
warning: left operand of shift expression '(-1 << 1)' is negative [-fpermissive]
の警告が出てしまう

この警告が符号あり整数型を左シフトしてはいけないというのは分かるので、Tが必ず符号なし整数型であることを明示したいのだけどどうしたらいいだろう?
特殊化すると符号なしのバイト幅毎に処理を描かないといけなくなるし、もっと簡便なほうほうがあったりするのでしょうか?
0404デフォルトの名無しさん (ワッチョイ eb01-QMhD)垢版2023/02/12(日) 17:18:17.77ID:mwZX9mma0
Tをunsignedにするんだよね?
ぐぐったらstd::make_unsignedとかいうのがあった
0405デフォルトの名無しさん (ワッチョイ ff7c-DG2X)垢版2023/02/12(日) 17:33:12.94ID:bx1Kk0PX0
Tがunsignedの場合だけ許可したいならrequires std::is_unsigned_v<T>
C++17以下でコンセプト使えないならstd::enable_ifでも使おう

無理矢理signedにして問題握り潰せって奴だらけで震える
0407デフォルトの名無しさん (ワッチョイ 3b7d-zpWe)垢版2023/02/13(月) 03:17:46.41ID:cPd3izqQ0
この手の警告/エラーはテンプレートを実装しただけでは出なくて、
テンプレートの実体化をした時にテンプレート実装部に警告/エラーが出るからややこしいんだよな

unsignedしか受け付けない前提で書いたコードをsignedで実体化するからこうなる

黙って内部でunsignedにするか
(using U=std::make_unsigned_t<T>; で全部U型で演算する)
signedをそもそも受け付けないか
(>>405 みたいにrequiresで受け付けるTを制限する)
の2択
0408デフォルトの名無しさん (ワッチョイ eb01-QMhD)垢版2023/02/13(月) 06:42:50.66ID:Z5uQ91Hr0
そもそも「符号なしであることを明示」とか書いてるけど
俺が試した限り符号ありで実体化しないと出ないんだよな>>400の警告は
0409デフォルトの名無しさん (スフッ Sdaa-AGaU)垢版2023/02/13(月) 10:38:37.81ID:vihtyFuzd
C++素人です
すみませんが、どなたか教えてください

こんなテンプレート関数があったとして、const を消す方法はないですか
const付いてても付いてなくても int* とか char* だけを判別したいので
毎回,余分にconst 判定入れるのだるいです

std::remove_const_t<T> とか試しても上手くいかないのでググってみたら、最上位じゃないので出来ないうんたらとか書いてあって...
最上位じゃないconstを外す方法があれば教えてください...

template<typename T>
auto function(T, t) {

  if constexpr (std::is_same_v<T, int*> || std::is_same_v<T, const int*>) {
   ...
  }
  else if constexpr (std::is_same_v<T, char*> || std::is_same_v<T, const char*>) {
   ...
  }
  ...以下、同パターン
}
0410デフォルトの名無しさん (ワッチョイ eb01-QMhD)垢版2023/02/13(月) 10:50:31.38ID:Z5uQ91Hr0
std::is_same_v<std::remove_const_t<std::remove_pointer_t<T>>, int>
0415デフォルトの名無しさん (ワッチョイ eb01-QMhD)垢版2023/02/13(月) 11:27:21.16ID:Z5uQ91Hr0
template <class T>
using remove_const_t = typename remove_const<T>::type;

typenameと::typeを省略するためのただのエイリアスやで
0418409 (スフッ Sdaa-AGaU)垢版2023/02/13(月) 13:15:51.58ID:vihtyFuzd
>>410
ありがとうございます
上手くconst int* は拾えましたが、それだとただのint も拾ってしまいました
ポインタ のみ拾いたいです

環境書いてなかったです
VisualStudio のVC++で、設定はC++最新版です
0421418 (スフッ Sdaa-AGaU)垢版2023/02/13(月) 14:00:14.31ID:vihtyFuzd
>>420
すごいです、出来ました
ありがとうございました!
自分は馬鹿すぎてこんなの思いつけないですが….勉強続けます、感謝
0423デフォルトの名無しさん (ワッチョイ 835f-t1ev)垢版2023/02/13(月) 14:55:08.76ID:TwATZYDk0
何がどう「出来ました」なのかよくわからないけど、 >409 を見る限りは
auto function(const int*), auto function(const char*) のオーバーロードで分けたほうがマシな
ものに見えるな。
0425デフォルトの名無しさん (スッップ Sdaa-zpWe)垢版2023/02/13(月) 18:18:43.60ID:vSfDWYC1d
関数外にテンプレート1つ置いてしまった方がシンプルになるがね
constを消すではなくなるが

template<class T, class TTarget>
constexpr bool pointer_or_constpointer_v =
std::is_same_v<T, TTarget*> ||
std::is_same_v<T, const TTarget*>;

template<class T>
auto func(T t){
if constexpr(pointer_or_constpointer_v<T, int>){
...
}
}
0426デフォルトの名無しさん (ガックシ 066f-p0Ho)垢版2023/02/15(水) 13:51:43.45ID:vrVppx/z6
困っています.助けてください.

まず作りたいものを以下に記します.

クラスObjのオブジェクトが構築されると,
そのオブジェクト内でクラスObjのオブジェクトが0~2個生成される.
(生成されるオブジェクトの個数は一様乱数で決定される)
結果的に木構造のようなデータ構造になる.

クラスObjのオブジェクトはシリアルナンバと自分を作ったオブジェクト(親)へのポインタを持っている.

クラスObjは自分を作った親をたどることで,どのようにして(どのオブジェクトを親として)生成されたかを知ることができる.


で,作ってみたものを以下に張り付けておきます.

https://wandbox.org/permlink/lXq19mN1URMQhyh5

上記のプログラムで発生している問題を以下に記述します.

起点となるクラスObjのオブジェクトobjが生成された時点では,
各オブジェクトは自分自身を生成してくれた親オブジェクトへのポインタを正しく保持しているようなのですが,その後,メソッドrootsを呼んだときには親オブジェクトへのポインタが訳の分からないアドレスを指すことがあるようです.

なにがいけないのか,どうすれば意図した通りに動いてくれるのかご教授くださると助かります.

よろしくお願いいたします.
0428デフォルトの名無しさん (ガックシ 066f-p0Ho)垢版2023/02/15(水) 16:15:28.85ID:vrVppx/z6
>>427
>>>426
>警告が出ているのになぜ直さない? それがすべてじゃないの?

メンバ関数rootsの型をvoidにして、return文をコメントアウトすれば警告は消えます。
しかし発生している問題は解決しません‥

ご指摘の件は本質的問題ではないように思われます。

引き続きご教授をお願いいたします
0433デフォルトの名無しさん (テテンテンテン MMc6-7nFJ)垢版2023/02/15(水) 19:15:06.12ID:bwjUnWHEM
>>426
バグを調査するときの重要な考え方として「バグが確実に再現する条件/確実に発生しない条件を明確化する」というのがある。

この場合も、まずはバグ「メソッドrootsを呼んだときには親オブジェクトへのポインタが訳の分からないアドレスを指すことがある」の条件を明確化するために「訳の分からないアドレスはどの変数に入っているのか」「訳の分からないアドレスはどういうバケツリレーで渡されているのか」「訳の分からないアドレスは最初にどこにあるのか」あたりを明確化するのがよろしいかと。

そもそも>>426で「メソッドrootsを呼んだときには親オブジェクトへのポインタが訳の分からないアドレスを指すことがある」は再現するの?
0436デフォルトの名無しさん (スッップ Sdaa-zpWe)垢版2023/02/15(水) 20:25:17.26ID:sKFuDIvBd
>>426
> control reaches end of non-void function
voidじゃない関数がreturnせずに終わってる

この表現なら理解できるか?
0439デフォルトの名無しさん (ワッチョイ 9ebb-p0Ho)垢版2023/02/15(水) 22:04:10.79ID:3ATKFMkE0
>>437
>こんなプログラム見ていると頭痛くなるw

誠に申し訳ない。
なんせ、近くにメンターがいないので自力でなんとかせにゃならんのです。

既にいくつか助言をいただいているので、もう少し頑張ってみます。

ゆるゆる見守ってくださると嬉しいです。
引き続きよろしくお願いいたします。
0440デフォルトの名無しさん (ワッチョイ ff9c-nJVz)垢版2023/02/15(水) 22:07:21.36ID:k8KlMP7i0
なんでこんなに偉そうなの
0444デフォルトの名無しさん (ワッチョイ 9ebb-p0Ho)垢版2023/02/15(水) 22:18:19.81ID:3ATKFMkE0
>>433

どうやら、再現性はあるようですが、私のスキルではどのような状況でバケツリレーが辿れなくなるのか、到底できないのです。

よいアイデアがあればご教示くださると大喜びします。
0445デフォルトの名無しさん (ワッチョイ 2b69-t1ev)垢版2023/02/15(水) 22:35:45.35ID:3Nk0h2mJ0
警告は潰さなければならない

警告が出たら検討しなければならない
今回の様に思いっ切りバグを示していることがあるから

検討した結果無視していいと判断しても、警告自体は消さなければならない
そのままじゃ次のビルドでまた出て、どんどん溜まって「これ検討したんだっけ??」ってなるから
この警告消しは#pragma warningでいい
0453デフォルトの名無しさん (テテンテンテン MMc6-7nFJ)垢版2023/02/16(木) 08:05:05.35ID:u8Mt8J3eM
>>443
こういうやつが居るから、管理側は「勝手に警告を無視できないRustにしよう」と言い始めるんだよねぇ。
実際、コードの精査の難しい大規模プロジェクトとかだと、無能が成果を出せないという意味で効果的だし。
0458デフォルトの名無しさん (テテンテンテン MMc6-7nFJ)垢版2023/02/16(木) 08:20:39.33ID:u8Mt8J3eM
>>444
まずは>>450

あと「訳分からないアドレス」というレベルなら生ポインタは使わない方がいいので、すべてshared_ptrに置き替える。
というか、他人の古いライブラリを使わざるを得ない状況でもなければ、生ポインタは禁止にすべき。
0462デフォルトの名無しさん (ワッチョイ 835f-uIvN)垢版2023/02/16(木) 10:03:35.75ID:G6Y1BfCz0
メモリがわからないままC++してもいずれ破綻するのは目に見えてるからな…
shared_ptrを使えば再確保によるポインタの無効化は回避できるかもしれんけど、
そしたら今度は循環参照にはまりそう
0464デフォルトの名無しさん (ワッチョイ 9ebb-p0Ho)垢版2023/02/16(木) 11:42:26.72ID:u/aa82YP0
>>458

>あと「訳分からないアドレス」というレベルなら生ポインタは使わない方がいいので、すべてshared_ptrに置き替える。

もともとC言語を触っていたので生ポの方が好きなんです。
でも、スマポに統一すべし、という意見には賛成なので、その様に直すつもりではおりますが、
 enable_shared_from_thisを継承せよ
とか、一方で
 コンストラクタ内でshared_from_this()は使うな
とか、色々クリアせねばならない問題もあり、解決には相当な勉強が必要そうで、時間がかかる見込みです。
0467デフォルトの名無しさん (ワッチョイ 9ebb-p0Ho)垢版2023/02/16(木) 12:43:03.84ID:u/aa82YP0
>>466

C++って何だかカッコいいじゃないですか。
noexceptとかC言語な人には無縁なキーワードが盛り沢山だし、いかにもアタマ良さそうな雰囲気がたまらんのです。

C言語でできることはC++でもできるようになりたいな、とゆるゆる独学している次第です。
0473デフォルトの名無しさん (ワントンキン MMfa-EB70)垢版2023/02/16(木) 14:05:54.88ID:gmYGasSwM
まさにコレでしたって結局どう直したの?
0476はちみつ餃子 ◆8X2XSCHEME (ワッチョイ eb3e-t1ev)垢版2023/02/16(木) 15:58:03.67ID:INPRljPt0
>>466
「だけでも」っていってもそれに連なる諸々の概念がひっついてるから部分的にやるのは難しいんだよな。

C++ のスマートポインタはクラスとして実装されてるから C++ の型システム抜きに
スマートポインタだけ C に移植ってわけにはいかないし、
参照の振る舞いを説明するには値カテゴリを増やして場合分けしなきゃならんし。
0477デフォルトの名無しさん (ワッチョイ 9ebb-p0Ho)垢版2023/02/16(木) 16:08:00.45ID:u/aa82YP0
ええと、最終的にはファイルから与えたデータに基づいて木構造を構成し、その木構造でナニかしようということを目論んでまして、そうなるとコンストラクタ内で子供のインスタンスを作ればいいんじゃないか、と考えた次第です。

データをあるオブジェクトに喰わせたら、勝手に木構造が出来上がるようにしたかったのです。

で、そのプロトタイプを作る段階でつまづいていた次第です。

とりあえず、皆様のご助言で動くようになったものについては明日以降にw
andboxに貼ります。

引き続きご指導をお願いいたします。
0478デフォルトの名無しさん (アウアウウー Sa4f-STvZ)垢版2023/02/16(木) 16:40:39.41ID:5AcA3bi5a
>>463

>C++って便利だけど難しい局面がすぐ横にある感じでスリリングですね。
>そう感じるのは慣れないうちだけなのかもしれませんが

君は C++ を使ってはいけないレベルと言わざるを得ない
0482デフォルトの名無しさん (スッップ Sdaa-zpWe)垢版2023/02/16(木) 17:51:19.65ID:OTlvZlbDd
最終的にはメモリ領域の所有権に行き着くはずだが
Cでどうやって所有権の貸し出し/譲渡を表現するんだよ

所有者が複数になる場合もあるんだぞ
0486デフォルトの名無しさん (ワッチョイ 835f-uIvN)垢版2023/02/16(木) 18:43:28.33ID:G6Y1BfCz0
>>477
まあ、子供をいくつか作るぐらいなら問題はないかな

ちなみに自分はコンストラクタであまりややこしいことはしないようにしてる
もし大きな処理の結果をもとにインスタンスを初期化したいときは、
全部コンストラクタでやるんじゃなくて、その処理だけを前もって実行してる
0487デフォルトの名無しさん (ワッチョイ ff7c-DG2X)垢版2023/02/16(木) 18:46:08.39ID:kdIqPIYR0
std::mapのinsert、emplace、eraseは内部要素へのイテレータを無効化しないことが保証されてる(当然eraseで消した要素そのものは除く)
なおstd::unordered_mapの同名関数はrehashingが起きてイテレータが無効になることがある
0508デフォルトの名無しさん (ワッチョイ ff7c-DG2X)垢版2023/02/17(金) 06:47:57.06ID:L7ElXWdV0
だったら本当にそうであることを確認しないといけないし、そんなものにsignedの変数使ってるのがおかしいかもしれない
その値は本当に文字列の長さか?途中でエラーが起きたら-1とかが入ってる可能性はないのか?
そういう危険なバグの兆候を知らせるためにまともなコンパイラは警告するんだよ
0517デフォルトの名無しさん (ワッチョイ ff7c-DG2X)垢版2023/02/17(金) 07:32:46.94ID:L7ElXWdV0
え?コンパイラが警告出した変数や関数だろ?使ってないローカル変数や非公開関数なんだろ?
それを消して挙動が変わるってことは何か恐ろしいメモリ破壊系バグが顕在化したってことだ
新人君お手柄やね
0526デフォルトの名無しさん (ワッチョイ 0f5f-lJcr)垢版2023/02/17(金) 10:11:56.50ID:sv7zAam40
何も変わってなくね?と思ったら>>426とリンク同じだった

wandboxは共有済みのソースを後から編集できないので
更新するにはもう一回共有して新しくpermalinkを生成する必要がありますよん
0528デフォルトの名無しさん (スップ Sd4a-/uvd)垢版2023/02/17(金) 12:16:56.46ID:CMo6McFXd
>>524
シートベルトは法律で決まってる

警告を消すのがルールで決まってる職場なら
警告かルールいずれかを消せ
そうじゃないならどうでもいい

ソフトの品質を担保するなら
警告の中身を見ずに単に隠すのが一番悪い

また
全ての警告を無条件で検証しろというなら
全ての演算も無条件で検証しろ
C++の演算はオーバーフローする可能性があるんだから

無意味な警告は出す方が悪い
コンパイラの設定で無効にしろ
コードを変えて隠す物じゃない
0531デフォルトの名無しさん (スッップ Sdaa-zpWe)垢版2023/02/17(金) 18:18:23.14ID:VB0sml4Xd
>>530
流し読んだ感じだけど

1.
void roots( unsigned );
> // 自らがどのようにして生まれたかを調べるメソッド
> // 第 serialNo 番のインスタンスを探索する.

自分の親を探索するのか指定serialNoが子供にいるのかどっちだよ
あと検索なのでメンバを上書きしないはず。関数自体をconstにするべき

2.
engineは親のengineを参照すればいいのでわざわざ引数で受け取る必要はない
コンストラクタは親を受け取るのとengineを受け取る2種類用意したほうがいいんじゃない?

3.
numberフィールドはいらん(名前もchildCountに変えるべきだが)
childObj.size()を見ればいい
getter関数作ったほうがいい

4.
isLeafフィールドもchildObj().size()==0見れば判断できる
0532デフォルトの名無しさん (ワントンキン MMfa-EB70)垢版2023/02/17(金) 18:50:34.09ID:HTK/9d/ZM
もう解決してんだからアドバイス気取りでがんばって蛇足を加えんでもいいよ
0533デフォルトの名無しさん (ワッチョイ 9ebb-p0Ho)垢版2023/02/17(金) 21:00:18.60ID:RlPt61in0
>>531

そこで図々しいお願いですが、そのように改造してくださると私にとって大いに勉強になります。
一肌脱いではいただけませんでしょうか?

生ポをスマポに直すのすら頭を抱えているヘタレなので、ここに棲まう先輩方のご鞭撻を是非に賜りたいです。
0534デフォルトの名無しさん (ワッチョイ ff7c-DG2X)垢版2023/02/17(金) 21:26:59.48ID:L7ElXWdV0
>>528
分かってんじゃん
C++の整数演算は無条件で全て検証が必要だよ
おっしゃる通りオーバーフローするかもしれないし、それが大きなセキュリティ問題につながった例もたくさんあるからね
特にナイーブにsigned/unsigned間比較や縮小変換をしてる所は危険だし、それを知らせてくれるコンパイラ警告は実に有用なものだ

もちろんプロダクトコードの話ね
0537デフォルトの名無しさん (スッップ Sdaa-zpWe)垢版2023/02/17(金) 22:14:14.63ID:VB0sml4Xd
>>533
丸投げすんな自分でやれ
0540デフォルトの名無しさん (ワッチョイ d301-GLFt)垢版2023/02/17(金) 22:44:01.98ID:KJxAAApA0
>>512
> 警告が出ないようにわざわざ使う
えっ、そんなレベルなのw
そりゃそんな職場なら
> 警告を消す為にバグを仕込むヤツを何度も見てきた
とかもあるんだろうな...
なんか可哀想になってきたわ
0544デフォルトの名無しさん (ワッチョイ 8bf0-/uvd)垢版2023/02/17(金) 22:56:59.77ID:iM8Xviia0
◯◯のコンパイラや◯◯のチェックツールで警告が出るから直しとけ
って言われたら何の疑問も持たずに直すの?
◯◯はバグの元だから直せって言われたら
何の疑問も持たずに直すの?
思考停止?
0547デフォルトの名無しさん (ワッチョイ d301-GLFt)垢版2023/02/17(金) 23:48:24.98ID:KJxAAApA0
>>544
指摘されてるんだからなぜその指摘が出てるのか調べて直すなり警告抑止するなりするだろ
なぜなんの疑問も持たずにとか出てくるのか不思議だけど君の職場ではそうなんだろうねw
0549デフォルトの名無しさん (ワッチョイ ed7c-aJXl)垢版2023/02/18(土) 00:40:30.23ID:U7F6huSe0
多分「直す」を「何も考えずに警告抑止なりキャストなりで握り潰す」の意味で言ってるから噛み合ってないんだと思う
警告無視マンセー君以外はもちろんバグがないか確認した上で範囲チェックやクランプや(問題ないことを確認して)キャストなどを加えてプログラムを改良する意味で言ってる
0551デフォルトの名無しさん (オイコラミネオ MM91-4mn0)垢版2023/02/18(土) 02:21:04.46ID:AZBhix5KM
>>550
間違いました。unorderd_map の rehashingについて、こう有ります:
https://cplusplus.com/reference/unordered_map/unordered_map/rehash/
>Iterator validity
>If a rehash happens, all iterators are invalidated, but references and pointers to individual elements remain valid.
>If no actual rehash happens, no changes.

なので、iteratorは無効化されるが、個々の要素への参照やポインタは有効なまま残ります。
0552デフォルトの名無しさん (オイコラミネオ MM91-4mn0)垢版2023/02/18(土) 03:03:49.37ID:AZBhix5KM
>>551
ソース読まないとはっきりしないけど、恐らく、イテレーターが指している
オブジェクトのポインタを取得すると以前と同じ値になっている。
しかし、イテレーターには ++ で直後の要素に移動する機能が有る。
恐らくその機能が正しく働かない場合があるということらしい。
ゴミレスでごめん。
0558デフォルトの名無しさん (ワッチョイ ed7c-aJXl)垢版2023/02/18(土) 09:42:41.72ID:U7F6huSe0
まだ直すと隠すの区別ついてないアホのためによくある例書いとくね

std::vector<Foo> foos = /* なんか入ってる */
for(int i = 0; i < GetLegacyLength(); ++i){
 Hoge* item = GetLegacyItem(i);
 if (i < foos.size()) // WARNING: signedとunsigned比較してんぞ
 { hoge(foos[i], item); }
 else
 { fuga(item); }
}
アホの隠し方(1):脳死でif文のiかfoos.size()をキャストして隠蔽
アホの隠し方(2):脳死でiの型をsize_tに変更、そしてi < GetLegacyLength()でまた同じ警告が出て激怒「コンパイラの警告なんて無意味だ!」

正しい直し方:
なぜ長さを返すのに戻り値型がintなのか、GetLegacyLength()のマニュアルを見て仕様を確認する。
するとある条件でエラー値として-1を返すことがあると判明したので、
forループの前にGetLegacyLength()を取得するようにして、負の場合のエラー処理を追加した。

/*略*/
int len = GetLegacyLength();
if (len < 0) { /* エラー処理 */ }
else {
 for(size_t i = 0; i < static_cast<size_t>(len); ++i) { //lenは0以上と確認済みなので安全にキャストできる
/*略*/
0560デフォルトの名無しさん (ワッチョイ ed7c-aJXl)垢版2023/02/18(土) 10:01:12.90ID:U7F6huSe0
そこは間違いコード例だから意図的にそうしたんだけど
元がfor(int i = 0, len = GetLegacyLength(); i < len; ++i)だとしても話の本旨には関係ないよね?
お前が警告無視する時みたいに脳死で食いつくからそうなる
0563541 (ワッチョイ 1bad-BTrK)垢版2023/02/18(土) 12:30:58.62ID:XNyuFiWW0
>>551,552
いえいえ、わざわざ調べてもらってありがとうございます!
vectorのメモリ再配置によるアボート障害が発生したので、ハッシュのときも
同様のことがないか気になっていました。
とりあえずハッシュの場合はアボートすることはなさそうですね。
0568デフォルトの名無しさん (ワッチョイ 3d12-+91A)垢版2023/02/18(土) 13:09:54.02ID:/Gi8XN260
なんかおまえさんの話し方なのか口癖なのかわからんが鼻につくんだよ
well-formedなコードに対する警告をどうするかなんて
おまえさんが感情的に喚いたからって誰も考えは変えないぞ
技術的な議論で誰も分かったと言って来ない現実を
おまえさんはDQN口調でどうかしようとしているようだが恥を知れ
0574デフォルトの名無しさん (ワッチョイ 1501-rc3u)垢版2023/02/18(土) 13:38:53.64ID:c4QxGie20
>>567
> 確認してないんだな?
> じゃあ一般論としてあんな変なコードをいつも書いているのか?
たった2行でよくこんなアホさが滲み出る文章書けるもんだな...
1行目もアホだと思うが2行目は脈絡もないのに「じゃあ」とかアホすぎる
こういう奴があの手のクソコードを書くんだろうなw
0576デフォルトの名無しさん (ワッチョイ 3d12-+91A)垢版2023/02/18(土) 13:44:53.99ID:/Gi8XN260
>>574
頭冷やせよ
特定の関数の仕様が理由でなくて
あんなコード書いたのかと言っている

おまえさんこそあの手のクソコードとやらはどれのことで
それをなぜ俺が書いていることになったのか説明できるか?
0578デフォルトの名無しさん (ワッチョイ e328-Qzdv)垢版2023/02/18(土) 13:58:29.96ID:5mGZNzlM0
低能警察に糞コードで反駁しようとしたら
収集がつかなくなったでござるの巻

警告を回避するためのコード変更がそんなに嫌ならコンパイラのオプションで警告を出さなくしたら良い……
0579デフォルトの名無しさん (ワッチョイ 3d12-+91A)垢版2023/02/18(土) 14:07:37.26ID:/Gi8XN260
警告どころかコンパイラのバグを回避することだってある
むろん思い切り処理系に依存する内容となるが嫌とか好きとか言ってらんない
必要が出ればやるだけで感情の入る余地はない

どっかの思い上がった坊やの俺様節が五月蠅いだけ
黙ってくれれば俺にそれ以上の望みはない
0580デフォルトの名無しさん (ワッチョイ e328-Qzdv)垢版2023/02/18(土) 14:12:09.71ID:5mGZNzlM0
警告をOFFにしたら警告を回避しようとしてバグを仕込んでしまう事故は確実に防げる
ていうか本質論としてはそもそも警告に頼らねばプログラミングもできない程度の低能はそもそもプログラミングをすべきではないという話、
これは反駁のしようが無い
0581デフォルトの名無しさん (ワッチョイ 1501-rc3u)垢版2023/02/18(土) 14:13:36.72ID:c4QxGie20
>>576
> あんなコード書いたのかと言っている
そもそもあのコード書いたの俺じゃないことぐらい
>>562 > (もちろんそんな設計する奴は漏れ無くアホだが)
って書いてる見たらわかるだろ...

> それをなぜ俺が書いていることになったのか説明できるか?
誰もお前が書いたなんて書いてないけど頭大丈夫か?
脳死で
> for(int i = 0, len = GetLegacyLength(); i < len; ++i)
みたいな修正したらバグるかもよって話だぞ
0590デフォルトの名無しさん (ワッチョイ e328-Qzdv)垢版2023/02/18(土) 15:12:52.01ID:5mGZNzlM0
ループ内で変更しないstd::stringのstd::string::size()なら
コンパイラが頑張ってギリ括り出し最適化をしてくれるかもしれんがコンパイラに優しくない……

ていうか以降値が変化しないことがわかっているメンバ変数やグローバル変数は
intやsize_tみたいな単純型ならさっさとローカル変数にコピーした方がメモリからのロード命令削減のために良い
実体(メンバ変数やグローバル変数)と同じ値を保持するローカル変数(エイリアス)があったら混乱するというのは
そんな関数が(担当者の脳のキャパに比べて)デカすぐる……
0595デフォルトの名無しさん (スッププ Sd43-Kpzp)垢版2023/02/18(土) 15:46:04.40ID:DOhL3WBHd
j「コンパイラの警告は全てゴミだから無視するべき、なぜなら>>558のfor文がダサいから」なんて主張をしてる奴への罵倒になぜ論理性が求められるのか分からない
バカアホマヌケ依頼心野郎で充分だろお前もそうなんだし
0600デフォルトの名無しさん (スッププ Sd43-Kpzp)垢版2023/02/18(土) 16:04:23.86ID:kbl+yJpad
なるほど558は警告を無視する場合な訳ね、理由はfor文がダサいからw
やっぱこのチンパンジーオモロイわ
何か言い返してくるだろうけど、畜生の鳴き声に論理性なんて求めないから本能剥き出してくれていいよ
かわいいね
0608デフォルトの名無しさん (オイコラミネオ MM91-4mn0)垢版2023/02/18(土) 22:16:29.02ID:tx6k3oAyM
>>563
unorderd_map のテストプログラムを作り、デバッガのステップ実行で、
ソースを調査することを進めます。デバッガを併用すると、単純にテキスト
エディタでソースを眺めるより楽です。
わざとrehashされる条件を作っておいて、*it が返すポインタが変化してないことを
確認したりもしてみてください。
0609デフォルトの名無しさん (オイコラミネオ MM91-4mn0)垢版2023/02/18(土) 22:20:44.13ID:tx6k3oAyM
>>608
誤: ソースを調査することを進めます。
正: ソースを調査することを薦めます。
誤: わざとrehashされる条件を作っておいて、*it が返すポインタが変化してないことを
正: わざとrehashされる条件を作っておいて、&*it が返すポインタが変化してないことを

unorderd_map<K,V>::iterator it に対して *it が V 型、&*it が V* 型ですね、確か。
0613デフォルトの名無しさん (アウアウエー Sa13-o4eO)垢版2023/02/20(月) 21:38:28.53ID:bUrAUmQja
>>610
じじい世代はここで
西部警察
がでてくる
0620デフォルトの名無しさん (ワッチョイ 7a28-SAq/)垢版2023/02/25(土) 12:32:14.92ID:EkXmct6Y0
質問なのですが<random>の疑似乱数クラス(いっぱいある)って共通の基底クラスとかインターフェースとか無
いの?

乱数のseedをプログラムの中で1回だけ与えて初期化した疑似乱数オブジェクトを
関数foo()に渡したりして使いまわしたいのだけどfoo()は特定の疑似乱数クラスに依存させたくないという場合、
foo()を疑似乱数クラスTを受け取るテンプレートで実装するとか自作のインターフェースで疑似乱数クラスをwrapする以外に他無し?

それともそもそもそういうことはすべきではない(関数の中で都度乱数のseedをプログラムの中で1回だけ与えて初期化した疑似乱数オブジェクトを作れ
と神はお命じなのやろうか……
0621デフォルトの名無しさん (ワッチョイ 7a28-SAq/)垢版2023/02/25(土) 12:35:52.57ID:EkXmct6Y0
訂正orz、
誤: 自作のインターフェースで疑似乱数クラスをwrapする
正: 自作のインターフェースで疑似乱数クラスとDistributionクラスをセットでwrapする

<random>はテンプレート全振りすぎてオブジェクト指向的でない
ヤヴァイ……
0623デフォルトの名無しさん (ワッチョイ 0d01-PJrl)垢版2023/02/25(土) 13:02:15.45ID:sAnrfOr80
>>620
>関数foo()に渡したりして使いまわしたいのだけど
>foo()は特定の疑似乱数クラスに依存させたくないという場合、
foo()を関数テンプレートにし疑似乱数クラスをテンプレート引数とする
じゃだめなの?
0624デフォルトの名無しさん (ワッチョイ 7a28-SAq/)垢版2023/02/25(土) 13:06:02.14ID:EkXmct6Y0
>foo()を関数テンプレートにし疑似乱数クラスをテンプレート引数とする
>じゃだめなの?
通常はそれでも良いが
foo()が1万行ある関数だったとしてヘッダファイルに書くのかっていうか、
なんで疑似乱数を使うことと、書き方がテンプレートに制限されてしまうことが相関されねばならないのか
疑問に思わないのかそうか、、、
0625デフォルトの名無しさん (ワッチョイ 7a28-SAq/)垢版2023/02/25(土) 13:19:38.23ID:EkXmct6Y0
んまー現実解としてはどうせstd::mt19937をstd::random_deviceで初期化するような使い方しかしないのだろうから
using rand_t = std::random_device;
using psrand_t = std::mt19937;
class FooTest : public ::testing::Test {
protected:
 psrand_t m_psrand;
public:
 FooTest() : m_psrand(rand_t()()) { }
};
ぐらいで過度の抽象化はやめておいた方が良いのかもしれん……
(別名にする、程度にしておけば疑似乱数クラスの選択とDistributionクラスの選択を分離できる
0626デフォルトの名無しさん (ワッチョイ 615f-+MOc)垢版2023/02/25(土) 13:21:23.18ID:a4UZTu4a0
標準ライブラリのテンプレートもみんなヘッダに書いてるんだしいらない疑問だと思うが……
使ったことは無いけど、気にするならC++20モジュールとして書いてみるといいかもしれない
0634デフォルトの名無しさん (アウアウエー Sa02-mjxs)垢版2023/02/27(月) 17:17:04.08ID:3MgFEhuya
サンプラザ中野が亡くなったのはびっくり
0635デフォルトの名無しさん (アウアウウー Sa39-EsFZ)垢版2023/02/27(月) 18:32:42.37ID:uiaf09PPa
>>634
どこ情報?
0636デフォルトの名無しさん (ワッチョイ 9501-ZYAP)垢版2023/02/28(火) 06:11:10.06ID:gPlIR4bB0
会議で「テレメトリーの結果、オートコレクトをオフにしているユーザーさんが多い、どうしたら良いか」ということを話し合った。
「小文字にする方法」を解説するページを作っておけば儲かるぞ。
0641デフォルトの名無しさん (ワッチョイ 5328-zbnh)垢版2023/03/04(土) 12:36:42.18ID:Rl7ZOdOT0
stdexceptの各例外の使い分けがわかりません
まず
・エラーは「実行時エラー (runtime error) 」と「論理エラー (logic error) 」との2つに大別される。
とのことでinvalid_argumentはlogic_errorの派生クラスみたいなのですが
foo()に不正な引数が渡る状況はたいてい呼び出し元bar()の実行時エラーなわけじゃん?

しかしそれだと論理エラーの出る幕が一切なくなるので、
foo()視点でfoo()に不正な引数が渡る状況は論理エラーである、とみなす立場が考えられるますが、
しかしfoo()が投げた例外を補足する箇所はfoo()の外なわけで、そんなローカル視点知ったことか、となるわけじゃん?

もうstdexceptのうちでユザープログラムから投げるのはruntime_error(<適当なメッセージ>)だけで良い?
0642デフォルトの名無しさん (ワッチョイ 5328-zbnh)垢版2023/03/04(土) 13:04:37.77ID:Rl7ZOdOT0
だいたい自己解決しましたサーセン、
1. cassertにおけるassert()条件に書くような、設計上絶対起こり得ないやつ(起きたらバグ)はlogic_error
2. 上記以外(設計上起き得ないことを保証しかねる不整合)はruntime_error

で、さらに細分化可能な場合(明らかに派生クラスにあてはまるやつ)は派生クラスにする
例外を補足する個所では、logic_error& eかruntime_error& eで捕捉する(そうすれば派生クラスも捕捉できうる
でFA?
0647デフォルトの名無しさん (ワッチョイ 8b89-Wv9y)垢版2023/03/04(土) 19:13:48.29ID:no85xIV40
解決する気があるなら書いたコードと返ってくるエラーぐらい貼ろうぜ
0648デフォルトの名無しさん (ワッチョイ 1305-5I03)垢版2023/03/04(土) 20:37:57.16ID:2zCyTihi0
このスレ見て久しぶりにC++やったら今まで丸暗記してたことが
他の言語にも適用できる感じ理解できてしまったわ
0649デフォルトの名無しさん (スププ Sd33-MJlW)垢版2023/03/05(日) 12:17:19.55ID:tgZ89GxTd
>>643
馬鹿には無理
0653デフォルトの名無しさん (スププ Sd33-MJlW)垢版2023/03/07(火) 12:11:28.12ID:f9Hon4H6d
W32APIにfork入れなかったのは嫌がらせか
0657デフォルトの名無しさん (ワッチョイ 5328-zbnh)垢版2023/03/07(火) 19:14:40.99ID:OIq1O0Ib0
Unixの構造上ならどう筋合いがあるんじゃ……
親プロセスから子プロセスになんか引き継ぎたいとき便利(そういうのが多いときコピーオンライトで高速化も可能)だというのはわかるが
そもそも親プロセスから子プロセスに引き継がれるべき情報ってそんなに重大で大容量なのがなんかあるっけ、、、
0659デフォルトの名無しさん (ワッチョイ 117c-u9cX)垢版2023/03/07(火) 20:12:06.52ID:yBXOBLOe0
そもそもプロセスって並列処理のためのもので、並列処理って同じ仕事する奴をたくさん用意するものなんだからforkは自然な設計
現代のPCやデバイスと噛み合ってないのはその通り
0660デフォルトの名無しさん (スップ Sd73-Wv9y)垢版2023/03/07(火) 20:19:21.43ID:hnN7reTEd
俺の使い方だとshellのビルトインコマンドをパイプで繋げるときと、PS1に色々仕込むぐらいしか恩恵ないかな
Windows(cygwin)でパイプ使いまくるとクソ重い

他はネットワークサーバーでaccept→forkのサンプルコードをよく見る
0668デフォルトの名無しさん (ワッチョイ d163-PMd1)垢版2023/03/08(水) 16:00:38.16ID:D4+z1pfo0
違和感? 何で?
ブレースは必須じゃねえだろ

if (auto result = Hoge()) ; else /* ここでresultが使えるのおかしいか? */ ;

{
else /* これはできないわけで、elseはifの続きだぞ */
}
0669デフォルトの名無しさん (ワッチョイ 119c-8Eq5)垢版2023/03/08(水) 16:22:00.73ID:ytiNTw1F0
try で宣言した変数を catch や finally で参照できるようにして欲しいと思ったことが 5億回はある
0671デフォルトの名無しさん (ワッチョイ 119c-8Eq5)垢版2023/03/08(水) 16:36:24.71ID:ytiNTw1F0
うん、ダメな理由は分かる

でもみんな try に書いてた変数を catch や finally で必要になってから外出しした経験あるよね
0672はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 013e-zdzo)垢版2023/03/08(水) 16:38:09.65ID:sNgBrAzK0
>>667
C with Classes が C++ になる頃にそこに宣言を書けることにした話はD&E に言及がある。
Algol68 の真似をしたつもりだったが
実は設計者の勘違いで Algol68 にそんな仕様はなかったということも書かれている。

スコープのことまでは書かれていなかったが、
たぶんそれも当時の設計者の脳内 Algol68 ではそうだったってだけなんだろう。
まあ else も if 文の一部なので自然に考えれば全体がスコープになるほうが
理屈に合うように思えるし、私は疑問に感じたことは無かったな。
0673デフォルトの名無しさん (テテンテンテン MMeb-rgVR)垢版2023/03/08(水) 18:30:22.29ID:lmBqNRkPM
>>672
ありがとうございます。

ifでの宣言は初期化とテストが一緒にされるわけで、テストに失敗した結果実行されるelseブロックでそれが使えることがちょっと納得できませんでした。

言われてみれば、中身がnullptrとは限らないし、エラーハンドリングとかで使ってるんですかね
0674デフォルトの名無しさん (ワッチョイ 5328-zbnh)垢版2023/03/08(水) 22:20:58.55ID:tb9BYlUU0
それよか
int outlierCnt;    // ←これのスコープのが問題
do {
  outlierCnt = 0;
  for (int j = 0; j < n; j++) {
    if (...) {
      outlierCnt++;
    }
  }
} while (outlierCnt > 0);

// ループを出たらoutlierCntは用済み
0676デフォルトの名無しさん (ワッチョイ 5328-zbnh)垢版2023/03/08(水) 23:51:23.50ID:tb9BYlUU0
>>675
bool bUniqueList;    // ← constにできない
{
  bUniqueList = true;
  std::set<T> dupChk;
  foreach (auto it = vec.begin(); it != vec.end(); it++) {
    auto result = dupChk.insert(*it);
    if (!result.second) {
      bUniqueList = false;
      break;
    }
  }   
}

if (bUniqueList) { ... }
0677デフォルトの名無しさん (ワッチョイ 0901-nyng)垢版2023/03/09(木) 00:39:11.87ID:3j1Ekj6a0
>>676
const bool bUniqueList
{
[&]
{
bool bUniqueList = true;
std::set<T> dupChk;
for (auto it = vec.begin(); it != vec.end(); it++) {
auto result = dupChk.insert(*it);
if (!result.second) {
bUniqueList = false;
break;
}
}
return bUniqueList;
} ()
};

if (bUniqueList) { /* ... */ }
0680デフォルトの名無しさん (アウアウエー Sae3-4fLd)垢版2023/03/09(木) 14:14:05.11ID:lc0skjdva
// みんなこうやってんの
{
int outlierCnt;    // ←これのスコープのが問題
do {
  outlierCnt = 0;
  for (int j = 0; j < n; j++) {
    if (...) {
      outlierCnt++;
    }
  }
} while (outlierCnt > 0);
}
0691デフォルトの名無しさん (ワッチョイ 715f-Tvj1)垢版2023/03/09(木) 19:54:06.46ID:maTPLFSP0
>>681
do {} while (!D) は,ループの事後条件として,Dが条件として成立することを保証している。
(until D として欲しかったが)

for (a;b;c) {} while (D) じゃ,ループの事後条件として何が成立してるのかわからないので
こんなコードは却下だな
0715はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 993e-7LVk)垢版2023/03/18(土) 09:37:45.79ID:XgD5JQEe0
>>711
現在の言語仕様の範囲内でやるならそれがたぶん一番に簡単な方法。

magic_enum を活用するのもいいけど処理系の拡張を利用しているのでもしもメンテが
滞ることがあったら処理系の変化について行けなくて破綻するかも? (余計な心配かも?)
要素数を数えるためだけに導入するならちょっと大げさという感じがする。

将来の C++ にリフレクション系の機能を追加しようとする提案はある。
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/n4818.pdf
試験的に GCC に追加したブランチもあって、
オンラインコンパイラで試せるところがあったはずなんだがどこだったか思い出せない。 すまぬ……。
0718デフォルトの名無しさん (ワッチョイ 13ad-F0re)垢版2023/03/19(日) 07:02:58.28ID:/XQ3/AVL0
>>717
初期化しないことを指定するフラグをメンバ変数に追加し、resize(n,c)の二番目の引数でそのフラグを立てたインスタンスcを渡す。
コピーコンストラクタが呼び出されるので、渡されてきたインスタンスcの該当フラグを見て、初期化するかどうか判定して分岐させる。
0720はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 993e-7LVk)垢版2023/03/19(日) 10:57:57.35ID:6gmOWdI+0
>>711
列挙型を定義するときには要素の数は分かっているのだから要素数を書いた定義も書いておけば十分かもしれない。

#include <type_traits>

// プライマリテンプレート (実際にはこれが使われたらエラー)
template <class T>
class enum_count {
template <class U>
class helper : public std::integral_constant<bool, false> {};
static_assert(helper<T>::value, "expected known enum.");
};
// 列挙型を定義
enum class Foo {A, B, C, D, E};
// 列挙型 Foo の要素数が 5 であることは分かっているので 5 で定義しておく
template <> class enum_count<Foo> : public std::integral_constant<std::size_t, 5> {};

int main(void) {
// 列挙型の要素数をカウントしたかのように見える
static_assert(enum_count<Foo>::value == 5);
}

列挙型の定義と要素数の定義を同時にするようなマクロでも作っておけばなおよいと思う。
Boost にそんな感じのライブラリがあった気がするが使ったことが無いのでよく知らない。
0721デフォルトの名無しさん (テテンテンテン MM8b-LjWS)垢版2023/03/19(日) 12:15:12.56ID:+MpLv2UeM
>>717
vectorが連続した領域を確保するので仕方ないかと。

vector のreserveで十分な領域を予約する
vectorにインスタンスじゃなくてsmart pointerを格納する
vectorじゃなくてlistかdequeを使う

クラスを弄くれるなら、move constructorでどうにかならんかね?
0723デフォルトの名無しさん (ワッチョイ 5328-53XG)垢版2023/03/19(日) 15:04:28.20ID:5NoJOqaP0
>>720
レス㌧クスしかし……
enum class FooはFoo::AとかFoo::Bとかいう形でしか使われないのだから個数を返す専用のテンプレートの特ちゅ化を行うよりは
Fooという名前のを何らかの手段でwrapしてやってcountメンバを持たせる方が自然なような、
enum class Foo0 { A = 0, B, C, D, E };
だとして現状class Foo : public Foo0 { ... }みたいなことは書けないから、手段としては次の2つ……
(1) クラスれwrap
struct Foo {
  enum { A, B, C, D, E }; // 古き良きenum、
  static size_t count() { return 5; }
};
(2) namespaceでwrap
namespace Foo {
  enum { A, B, C, D, E }; // 古き良きenum、
  inline size_t count() { return 5; }
};

規格委員会が斜め上の行動に出なければこういう方向性が自然に感じる……
0724デフォルトの名無しさん (ワッチョイ 5328-53XG)垢版2023/03/19(日) 15:13:02.52ID:5NoJOqaP0
>>717
std::vector<T>をとったら初期化が来る ほんとに早いわ
初期化さえ無かったなら チューリングマシンは楽しいとこ
初期化はきらいだった 私
夢ばかりみていたのよ 私
でもデフォルトコンストラクタとコピコンと代入演算しだけでも
まじめにしておけば
今頃私はかっこいいC++er
初期化はしないよりも しておいたほうがいいわ
0727デフォルトの名無しさん (ワッチョイ 5328-53XG)垢版2023/03/19(日) 15:25:40.86ID:5NoJOqaP0
>>726
初期化は必要だっつの;;;;
で、std::vector<T>を取るのが高速化されたとしても
要素使用時に初期化が必要なのだから時間短縮にならないという

ていうか通常は(大概のクラスは)初期化時間とかstd::vector<T>が運悪くOSにsbrk()してしまうケースに比べればゴミみがいなもんじゃろ……

という辺りの事情を考えたことも無い>>726、、、
0728デフォルトの名無しさん (ワッチョイ 5328-53XG)垢版2023/03/19(日) 16:19:34.73ID:5NoJOqaP0
いやすまん>>720について:
>>720の処置にすると使うコードの字面上はFoo::AやFoo::Bがそのまま使えるが、中身が古いenumなので
 Foo x;
 x=2;    // 禁止されない
 int y = x; // キャストを忘れても何も言われない
という問題があったorz
(他にも列挙子の型がint以外にできないとか
やっぱ現状はenum classを活かしつつ>>720にするか、enum classの定義ごとマクロでwrapするしかないのかも|||。n_
0731デフォルトの名無しさん (ワッチョイ 5328-53XG)垢版2023/03/19(日) 16:41:22.65ID:5NoJOqaP0
なんにせよ未初期化(メモリ内容不定)というのはチューリングマシンのプログラミングモデルでは絶対悪
であることは街行く人100人に聞いたら100人全員がそう答えるので
マウントをとろうとして無駄にあがいているかさもなくば無知なのは>>729の方ででケテーイ……
0733デフォルトの名無しさん (ワッチョイ 5328-53XG)垢版2023/03/19(日) 16:51:34.77ID:5NoJOqaP0
どこが捏造データなのかkwsk、
街行く人を引き合いに出したのは統計の結果という誤解を与えたのかもしれんが
チューリングマシンのプログラミングモデルにおいて、初期化を行わないまま次のステップに進めない(やったら動作が不定になる)のは
覆りようが無い真実、、、
0735デフォルトの名無しさん (ワッチョイ 5328-53XG)垢版2023/03/19(日) 17:00:25.55ID:5NoJOqaP0
>>734
そりゃーその配列は最初のデータのencueueがあるまで使われないからな
しかし循環バッファを使う前に、encueカウンタとdecueueカウンタの初期化は必須であるから
その例では>>733を覆したことにはならない
物事の道理が徹頭徹尾わかっていないのに突っかかってくる>>734……
0736デフォルトの名無しさん (ワッチョイ 5328-53XG)垢版2023/03/19(日) 17:05:21.48ID:5NoJOqaP0
ちと訂正orz、
循環バッファに入れるのが、STLのクラスをメンバに持つような高級なクラスだったとしよう、
すると循環バッファ作るときの配列を未初期化のままとすると、最初のencueueでいきなり代入から始まるから
(代入演算子が呼ばれる)から、未初期化オブジェクトに対する代入演算子が機能したとしてもそれはたまたまという話になる……
よって
>循環バッファ作るときの配列なんかいちいちゼロクリアせんだろ
これの主張は偽。ハイ論破、
0737はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 993e-7LVk)垢版2023/03/19(日) 17:48:11.34ID:6gmOWdI+0
>>723
メンバを持てない型にメンバっぽいものを結び付けたい場合 (たとえば char_traits や numeric_limits) だとか、
既存の型をいじらずに拡張できる余地を用意したい場合 (allocator_traits) 、
メタプログラミング用のメタ関数 (type_traits) といったものはトレイトの形にすることもそんなに珍しくはない。

ところで Godbolt でリフレクション (N4818) 実装版の clang が使えた。
列挙子の数を数えるメタ関数を簡易的に書いたらこんな感じ。
https://godbolt.org/z/G4jf65j8f

将来的にはこういう機能が C++ に入るかもしれない。
0739はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 993e-7LVk)垢版2023/03/19(日) 20:19:21.80ID:6gmOWdI+0
>>738
おっ、そんな便利なのを見落としておったわ……。

将来的には enum_count みたいなのは入ると思う。
現時点では基礎になるスコープの広い部分を検討中だから
おそらくその上に実装されるであろう部分をどうこういうのは時期尚早ってことなんだろう。
0747デフォルトの名無しさん (ワッチョイ e15f-XP14)垢版2023/03/20(月) 20:03:19.49ID:KynYd7/p0
例えばプログラムでアドレスを計算してる場合に、そのアドレスのメモリが
初期化されてるかどうかをコンパイラが判断するのは難しいだろうね
他にもライブラリとか別のプログラムで初期化されてもわからない
0749デフォルトの名無しさん (ワッチョイ 91f0-BQ3C)垢版2023/03/20(月) 20:22:11.60ID:hNMIxENu0
vectorに対してcopyとかtransform使うとき、あらかじめコピー元とコピー先のサイズを揃えますけど
この時ほぼほぼ初期化省かれてるなっての分かるじゃないですか

それなら最初から初期化を省くメソッド用意してくれてもいいんじゃないか?と思うわけです
0751はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 993e-7LVk)垢版2023/03/20(月) 21:35:36.48ID:c1bWUyRU0
>>749
そのためにサイズとは別にキャパシティの概念があるんじゃないの。
書き込む順序が変な場合だったりすると上手くいかんかもしれんが
copy や transform を使う分には事前にキャパシティを調整した上で
値の書き込みは back_inserter を使えば無駄な初期化も再配置も起こらない。
0756はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 993e-7LVk)垢版2023/03/20(月) 23:17:51.49ID:c1bWUyRU0
>>755
アロケータはメモリアロケーションに関する制御しか出来ない。
std::vector に与えるアロケータをどう実装しても
要素のコンストラクタの起動を制御することは出来ないと思う。
0760デフォルトの名無しさん (ブーイモ MM0d-xxKT)垢版2023/03/21(火) 17:14:11.67ID:uh1D01cuM
>>751
そうすると一々サイズとキャパシティ比較するif文挟むから結局オーバーヘッドあるやん

まあstd::vector使うなというのはもっともでこういうときのためにstd::make_XXX_for_overwriteがある
0762はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 993e-7LVk)垢版2023/03/22(水) 09:35:50.58ID:GXnnX9o30
>>761
back_insert_iterator での値の追加は push_back するのに等しい。
https://timsong-cpp.github.io/cppwp/n3337/back.insert.iter.op=
push_back するときはキャパシティが足りるかどうかで動作が異なる。
https://timsong-cpp.github.io/cppwp/n3337/vector.modifiers
結果的にキャパシティが足りていてもキャパシティが足りているかどうかのチェックはおこなわれる。
そのことを >>760 は言ってる。
0764はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 993e-7LVk)垢版2023/03/22(水) 16:56:07.11ID:GXnnX9o30
>>760
いわれてみれば確かにゼロコストというわけではないね。
現代的な CPU だと分岐予測が効く場合だと思うので実行時間的には小さいと思うが……。

スマートポインタに for_overwrite 版が入ったなら vector でもやろうという提案は
絶対に出るだろうと思って検索してみたら vector については見つけられなかったが
basic_string::resize_and_overwrite を足す提案はあったわ。
http://wg21.link/P1072R10
0775デフォルトの名無しさん (アウアウウー Sa95-lF85)垢版2023/03/23(木) 11:09:09.78ID:AQHpwrnPa
>>768-769
deque
0778デフォルトの名無しさん (ワッチョイ a963-4ZMk)垢版2023/03/23(木) 20:36:59.72ID:QwfINZIH0
AIねえ・・ライダハンて何って聞くとキムチ臭いことを「教えてくれる」けど
おまえはそれを何だ? 神様のお告げとか思ってるの?
アホなの? それともバカなの? 今すぐ首吊って死ねよ
0779デフォルトの名無しさん (ワッチョイ a963-4ZMk)垢版2023/03/23(木) 20:44:08.19ID:QwfINZIH0
機械と人間の違いがわからねーやつは人類全ての敵だ
機械は言われたとおりにやってるだけ
そこにポリシーも夢もひとかけもない

呆れ果てたスーパー情弱のために教えておいてやるが
機械にできるのは演繹だけで帰納はできないって根本的な問題があるんだよ
教わったことが絶対でどんなにおかしい答えも平然と言ってのける

日教組に洗脳されたおまえとそっくりだなwww
0782デフォルトの名無しさん (ラクッペペ MM8b-xJOq)垢版2023/03/24(金) 08:04:10.44ID:p0qI+e9PM
根本的な話をすると脳のニューロン組織とAIプログラムのニューラルネットワークは動作原理は同じ
生体細胞の圧倒的物量による並列処理能力の高さと半導体素子の圧倒的記憶演算能力による方向性の違いだけ
いずれ学習が飛躍的に進めば機械が脳を超える時が来る
0784デフォルトの名無しさん (ワッチョイ 1305-Dpq4)垢版2023/03/24(金) 11:29:29.53ID:iD/qyfMR0
まあ中枢神経でも逆行性の情報伝達は起きてるけどな
そんなことより改行の後スペースは何回打つのがメジャーなんか?
なおタブ派の意見は聞かない
0785デフォルトの名無しさん (ワッチョイ 1305-Dpq4)垢版2023/03/24(金) 11:33:31.33ID:iD/qyfMR0
ちなみに俺は7回だ
0790デフォルトの名無しさん (ワッチョイ ff9a-Pd8U)垢版2023/04/01(土) 01:18:43.60ID:TiOY9/eM0
priority_queueに渡す比較関数って、functionでインライン的に書くより
別途ラムダを書いてそれをdecltype()で渡す方がいいんですかね?
後者と同等なインライン的な書き方はあります?
0794デフォルトの名無しさん (ワッチョイ ff9a-Pd8U)垢版2023/04/01(土) 14:26:59.20ID:TiOY9/eM0
例えばfunctionを使って比較関数をインライン的に書くとこうですよね
priority_queue<int, vector<int>, function<bool(int a, int b)>> pq([](int a, int b){return a > b;});

一方ラムダを使った場合は例えばこんなですよね
auto comp = [](int a, int b) { return a > b; };
priority_queue<int, vector<int>, decltype(comp)> pq(comp);

で疑問に思ったのが
- 上記の例で後者の場合もインライン的に書ける? まソース的には1行目と2行目を改行なしで
書けばいいのかもしれないけどw
- function を使う場合と decltype を使う場合の違いに何が違う?

ということです
0798デフォルトの名無しさん (ワッチョイ 7f28-TZ4b)垢版2023/04/02(日) 08:51:08.20ID:t9D8iOvK0
メモリ確保と同時に初期化、
これをしないことによる顕著なメリットの説明がそろそろあってしかるべき……
初期化をしないことによってメモリ確保はメモリ確保1回あたり(デフォルトコンストラクタにもよるが)数千~数万クロックサイクルぐらい早くなるかもしれないが
プログラムの実行速度を追求したいならそもそもメモリ確保とかいっぱい回るループの中ですべきではないし、
そもそも領域を確保しておいて初期化を後回しにするとか、プログラミを不必要に複雑なピタゴラスイッチ化するだけ……

もっとも、毎秒1万回std::vector<T>を構築するとか、サイズ3TBのFIFOを作るとかなアフォ
構想時点で極めて特殊な設計なら話は別やが……
0799デフォルトの名無しさん (ワッチョイ 7f28-TZ4b)垢版2023/04/02(日) 09:00:08.86ID:t9D8iOvK0
それよか一番危険なのは、
>必要があれば初期化するし
>必要なければ余計なことはしない
>
>判断できましぇ~んなアホにはなりたくない (キリ
とのたまう人が、encueカウンタやdecueueカウンタが未初期かなFIFO、みたいな
益体も無い例を持ち出してみたり、冒す必要のない危険を冒してまでリリースしてしまうことや……
0806はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-9P2W)垢版2023/04/02(日) 16:50:57.97ID:gP4vNTAJ0
>>796
std::function は実行時に型を切り替える機能をもったクラスで、
後から切り替える可能性が無い場面では無駄になるから避けるのが普通だと思う。

#include <functional>

int foo(void) { return 1; }

int main() {
// 関数ポインタとクロージャは異なる型だが
// std::function は呼出しの形式が同じならどちらでも扱える
std::function<int(void)> bar = foo; // 関数ポインタを格納できる
bar = [](void) -> int { return 1; }; // クロージャも格納できる
}
0807デフォルトの名無しさん (ワッチョイ 5f5f-I0N1)垢版2023/04/02(日) 17:17:55.77ID:Pu7bAi6b0
コンパイラと標準ライブラリによるんだろうけど、
std::functionはラップしてるぶんラムダに比べて遅いだろうね
でもラップしてるおかげで柔軟だから用途次第で使い分けるのがいいね
0819デフォルトの名無しさん (アウウィフ FF05-883t)垢版2023/04/09(日) 09:20:16.12ID:Dm0aM9sgF
>>817
ほんそれ++
0820デフォルトの名無しさん (アウアウウー Sa05-/Yip)垢版2023/04/09(日) 23:45:39.86ID:Gr5O5zRWa
c++の入門書のサンプルでは、整数を 42で初期化するケースが多い気がします
この 42(fooやbarを使うように)には意味があるのでしょうか
0822デフォルトの名無しさん (アウアウウー Sa05-/Yip)垢版2023/04/10(月) 00:03:58.95ID:PpQYou85a
>>821
thx!
0823デフォルトの名無しさん (ワッチョイ 6ea7-/aea)垢版2023/04/10(月) 10:38:06.12ID:auMz+cIB0
constevalな関数の中でchar配列中からintを読み取る場合ってポインタ使えないから下記のようにするしかない?
arr[index] | ((int)arr[index + 1] << 8) | ((int)arr[index + 2] << 16) | ((int)arr[index + 3] << 24);
0826デフォルトの名無しさん (スップ Sd82-qF+M)垢版2023/04/10(月) 15:33:11.04ID:3mw67OVid
32bit-little endianであることを前提になるがいいか?
あとこれarr[3]が0-127に収まってないとintの符号ビット壊しそうだし、
charが符号付きの環境だとシフト+bit orが意図通りにならなそう
0841デフォルトの名無しさん (アウアウエー Sa0a-0l8A)垢版2023/04/11(火) 18:49:44.57ID:HmfbYrEaa
以下はTCP/IPのクライアントを作成する例なのですが、このコードにタイムアウト値を付けるにはどうしたら良いですか?
http://onishi-lab.jp/programming/tcp_win.html

// Windows の場合
WSADATA data;
WSAStartup(MAKEWORD(2,0), &data);

// 相手先アドレスの入力と送る文字の入力
printf("サーバーマシンのIPは?:");
scanf("%s", destination);

// sockaddr_in 構造体のセット
memset(&dstAddr, 0, sizeof(dstAddr));
dstAddr.sin_port = htons(PORT);
dstAddr.sin_family = AF_INET;
dstAddr.sin_addr.s_addr = inet_addr(destination);

// ソケットの生成
dstSocket = socket(AF_INET, SOCK_STREAM, 0);

//接続
if(connect(dstSocket, (struct sockaddr *) &dstAddr, sizeof(dstAddr))){
printf("%s に接続できませんでした\n",destination);
return(-1);
}
0843デフォルトの名無しさん (アウアウエー Sa0a-0l8A)垢版2023/04/12(水) 20:53:53.05ID:slmCp11Ka
>>842
ありがとうございます。
この記事のWindows版を参考にしてタイムアウトつき接続できたのですが
https://qiita.com/hidetaka0/items/501ad17b4c23c3adee03

これってちゃんとサーバーに接続できた場合、接続できたことをコード内のどこで判別すれば良いのでしょうか?
色んな箇所にprintを仕込んでみたのですがよくわかりませんでした。
0846デフォルトの名無しさん (スプープ Sd22-pvw1)垢版2023/04/13(木) 00:15:12.61ID:ndOnjJhod
>>844
そこにprint挟んでも通過しないんですよね
繋がってるのに
0850デフォルトの名無しさん (スプープ Sd22-0l8A)垢版2023/04/13(木) 02:30:15.77ID:/ixh6GMqd
>>847
以下のようにprintというかcoutを挟むと、接続前はずっと"1"が出力されるのに、接続後は何も出力されなくなります。
エラーも出ず、プログラムは動き続けます。

int sockNum = select(socket + 1, &readFd, &writeFd, &errFd, &timeout);
if(0 == sockNum)
{
//timeout
std::cout << "1" << std::endl;
return -1;
}
else if(FD_ISSET(socket, &readFd) || FD_ISSET(socket, &writeFd) )
{
std::cout << "2" << std::endl;
}
else
{
//error
std::cout << "3" << std::endl;
return -1;
}
std::cout << "4" << std::endl;
0854デフォルトの名無しさん (ワッチョイ a2fb-qF+M)垢版2023/04/13(木) 08:05:52.88ID:AKmB1uVA0
VisualStudio使ってるんならステップ実行したほうがはやいんじゃね

1行ずつ実行してどこでクラッシュ/待たされてるかすぐにわかるぞ
0856デフォルトの名無しさん (スプープ Sd22-pvw1)垢版2023/04/13(木) 10:36:58.20ID:GsnZRt31d
>>855
コード内のどこでconnectを呼べば良いですか?
0858デフォルトの名無しさん (ワッチョイ c69a-gTA8)垢版2023/04/13(木) 17:56:14.36ID:iNDrHE0O0
初心者なのですが、find()で結果がないときnposの場合と.hoge.end()の場合、
イテレータで hoge.begin()とする場合と begin(hoge)とする場合(end()も同様)、等
混乱しております。これは...
0860はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/aea)垢版2023/04/13(木) 18:22:14.89ID:y5cvZaYN0
>>858
algorithm にある std::find と string にある std::string::find の違いのことかな?
それはまあ名前が同じだけの別物なんでそういうものと思うしか仕方がない。

begin については、
異なるものが共通のインターフェイスで扱えるとテンプレート内で扱いやすいだろうというのが基本的な事情。
でも配列とかポインタがメンバを持つことは出来ないからこれらも含めて共通の扱いをしたい場合は
メンバ関数の begin よりも非メンバ関数の std::begin を使う必要がある。
メンバに begin を持っている場合はそれを直接に呼んでも std::begin を使っても結果は同じだよ。

C++ には ADL という仕組みがあって引数に関連する名前空間も関数を探す探索対象になるというルールがある。
std::begin は ADL の仕組みと相性が悪いところがあって扱いづらいので
新しい仕様は std::ranges::begin が導入された。

ややこしいんだが全部を一貫して説明できるような統制された理屈があるわけではなくて
細々とした歴史的事情の積み重ねでグダグダになってるだけ。
0864デフォルトの名無しさん (ワッチョイ c71f-CTeB)垢版2023/04/15(土) 02:33:26.00ID:dgB6RPkk0
改めて書くと
std::vector<...> vec;
int neg = -15;
for(int x = neg ; x < neg + vec.size() ; x++){ ...
こんな感じのfor文の中になぜか入ってこず
for(int x = neg ; x < neg + (int)vec.size() ; x++){ ...
こう書き換えたらfor文の中にちゃんと入ってきたので
何事かと
0867デフォルトの名無しさん (ワッチョイ 5ffb-ZLJR)垢版2023/04/15(土) 12:55:47.51ID:ZHLNp/Uz0
32bit intが表現できる範囲(-21億〜+21億)と
size_tが表現できる範囲(32bit環境なら0〜42億、64bit環境なら1800京)が違うんだよね

直接キャストしたり比較演算した結果が一目で分からないし、
未規定の動作も紛れてるから
コンパイラによって結果が変わったりする
0868はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-S3w6)垢版2023/04/15(土) 15:43:33.34ID:5Qe8Q1VE0
ちなみに更に厳密なことを言うと std::vector::size() の返却値の型は std::vector::size_type であって、
一般的な実装では size_t の別名として定義されることが多いけどそうでないこともありうる。
0884デフォルトの名無しさん (アウアウウー Sacb-/q5i)垢版2023/04/17(月) 20:58:44.15ID:RKcegE7fa
size_t の変数を 0 との大小で比較しても
常に >= 0 だから変なことになる
for で -- してるときは特に注意な
0887デフォルトの名無しさん (ワッチョイ 2763-7nfa)垢版2023/04/19(水) 11:20:40.34ID:twYHK80b0
コーディング基準はあくまで特定案件での決めごとに過ぎず
井の外で何かを批判する根拠に使っても説得力はない
0889デフォルトの名無しさん (ワッチョイ 2763-7nfa)垢版2023/04/19(水) 12:06:58.70ID:twYHK80b0
特定案件つーてるのに他の言語?
話通じないやつだな
0891デフォルトの名無しさん (ワッチョイ 5f28-C4RG)垢版2023/04/21(金) 06:54:24.86ID:zpP4hMgV0
std::vector<T>::size()やstrlen()が符号無しで返してくるからそれらを使った汎用ライブラリ的なものを書く場合に仕方なくsize_tを使うこともあるだけでループ変数については符号有りで大して困らない希ガスだいたいOS記述言語であるところのC言語がアセンブラでは常識的に利用されるゼロフラグやキャリーフラグの概念を捨て去った設計した点をかみしめるべきや整数表現のMSBまで符号以外の意味で使わねばならないシチュエーションはマジ少ない多倍長演算であってさえ2のべき乗範囲に拘るのを捨てたらゼロフラグやキャリーフラグを駆使してビット幅全部使う記述と同等以上の効率にできうる
0894デフォルトの名無しさん (ワッチョイ 7fa7-S3w6)垢版2023/04/21(金) 11:52:07.81ID:Er6tcVYC0
スレチだと思うけどx86intrinsicsに詳しい人がいたらNonTemporal命令について教えてもらいたい
_mm_stream_load_si128や_mm_stream_si32はCPUキャッシュに対象範囲が無い場合はキャッシュスルーして確実にメモリを読み書きするということは分かったけど、
CPUキャッシュにある場合の挙動は一般的な命令同様にCPU内だけで完結してしまう?
0897デフォルトの名無しさん (オイコラミネオ MMb5-/HYv)垢版2023/04/26(水) 19:26:58.67ID:4J8YauGVM
素人考えで悪いけどメモリへの書き込みがされずCPU内だけで終わると困ると思うけど

勝手なイメージ

書き込むアドレス内容がキャッシュに
ある
キャッシュのデータも書き換える → 通常の動作

ない
_mm_stream_si32の場合 キャッシュへデータを読み込まない → 速い
その他の場合 キャッシュへデータを読み込む → 遅い
0899デフォルトの名無しさん (ワッチョイ 66a7-ASru)垢版2023/04/26(水) 22:05:00.98ID:T6VCSheE0
>>896
目的はDMAとの整合性で既存の実装は勿論同期処理していたが
数日稼働させてみてTemporal命令混ぜた後にstreamストアしても今のところ不整合発生してないからもうちょい様子見てみる
0900デフォルトの名無しさん (ワッチョイ 66a7-ASru)垢版2023/04/26(水) 22:12:18.77ID:T6VCSheE0
>>898
本来のnon temporal命令の利点はその命令自体の速度ではなくキャッシュ汚染防止だね
例えば離れたアドレスにあるであろうstatic変数にアクセスするとき、その付近のデータには一定期間内に一度しかアクセスしないと分かりきっているなら、CPUの親切心による近隣メモリのキャッシュへの先読みはどうせ使われないのでむしろペナルティでしかなく不要となる

あとはmemcpyにおいてキャッシュはソース側に集中させてディスト側へは_mm_streamでキャッシュ汚染を抑えてコピーをするというテクニックもあって多分メジャーどころのコンパイラ実装は大体そうなってる
IvyBridge以降であればsimdより強化版rep movsbの方が早いケースも多くて分岐によってそっちに行くこともあるだろうけど
0902デフォルトの名無しさん (オイコラミネオ MMb5-/HYv)垢版2023/04/26(水) 22:54:06.40ID:4J8YauGVM
それとx86intrinsicsと書かれてるのはSystem.Runtime.Intrinsics.X86 名前空間で.netなんだ
コンパイラがキャッシュを気にしたIL吐いたりそこから最適化されたネイティブコードを吐くようにはできてないと思う
0903デフォルトの名無しさん (ワッチョイ 1701-o+T5)垢版2023/04/30(日) 10:58:06.37ID:W+TV1tj50
これまでなんとなくinitializer_listを使ってきたのですが
このクラスって他のクラスと異なりコンパイラによって特別な解釈をされるのでしょうか?
以下のhoge::initializer_listはstdからコピペしてpublicメンバ以外を除外したものです
hoge::initializer_listを実体化するとコンパイルエラーとなります
コンパイラは g++ (Debian 10.2.1-6) 10.2.1 20210110 です
#include <initializer_list>
#include <cstddef>
namespace hoge {
template<class _E>
class initializer_list {
private: // 割愛
public:
typedef _E value_type;
typedef const _E& reference;
typedef const _E& const_reference;
typedef size_t size_type;
typedef const _E* iterator;
typedef const _E* const_iterator;
constexpr initializer_list() noexcept;
constexpr size_type size() const noexcept;
constexpr const_iterator begin() const noexcept;
constexpr const_iterator end() const noexcept;
};
}
int main () {
std::initializer_list <int> il0 = {10, 100, 1000};
hoge::initializer_list <int> il1 = {10, 100, 1000}; // <- コンパイルエラー
return 0;
}
エラーメッセージは
error: could not convert ‘{10, 100, 1000}’from ‘<brace-enclosed initializer list>’ to ‘hoge::initializer_list<int>’
0904デフォルトの名無しさん (ワッチョイ 1701-o+T5)垢版2023/04/30(日) 11:09:10.55ID:W+TV1tj50
エラーメッセージから考えると
1. { ..., ..., ..., }はstd::initializer_listと解釈される
2. std::initializer_listをhoge::initializer_listに変換しようとしてエラー
ということだと予想しますが
上記の1がstd::initializer_listを特殊なクラスとしている言語仕様と考えれば良い?
0905デフォルトの名無しさん (ワッチョイ b7f4-Z8yw)垢版2023/04/30(日) 11:20:07.93ID:bMmQu4ho0
>>903
constexpr initializer_list(std::initializer_list<_E> const&) noexcept { }
これを追加すると通る

コンパイラは { } で std::initializer_list を生じる、という意味で「特別な解釈」をする
似たような話で typeid() で std::type_info を生じるのと同様
0908デフォルトの名無しさん (ワッチョイ b77c-0tm6)垢版2023/04/30(日) 11:31:13.64ID:9Izkr3hY0
一般にstd名前空間のものは全部言語仕様と一体のものとしてあらゆる特別扱いが許されてるので
ヘッダからコピペして作った自作クラスが標準と同じように振る舞ってくれない可能性は常にある
0909デフォルトの名無しさん (ワッチョイ 1701-o+T5)垢版2023/04/30(日) 11:36:13.87ID:W+TV1tj50
>>905-908
みなさん有難うございます

>>908
>一般にstd名前空間のものは全部言語仕様と一体のものとしてあらゆる特別扱いが許されてるので
これは最小限にして欲しいものですね

>>905
>似たような話で typeid() で std::type_info を生じるのと同様
なるほどー! 言われてみればこれも気持ち悪かったです
同種の気持ち悪さ
0915はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-By2c)垢版2023/04/30(日) 19:25:11.20ID:AIS6Ui5R0
>>911
最後のカンマに文法上の機能はなく、単に余計なカンマを許容するだけ。
どちらも 0 がひとつ与えられる初期化子であるという扱いになる。
コードジェネレータで生成するときに余計なカンマを許容したほうが便利だからそうなってる。

初期化子の数が配列の大きさに足りない場合は >>913 の解説の通り 0 が補われるので10個の要素全部がゼロになる。
なので全部をゼロにしたいときは char str[10] = {}; というように書いてもよい。
(新しい規格では改定されているが) C では波括弧の中に 1 個以上の値を必要としたので
それに合わせて必ずひとつは 0 を書くというスタイルで書く人もいる。
0917デフォルトの名無しさん (ワッチョイ bf9a-2+ec)垢版2023/05/01(月) 10:47:39.75ID:X35rXuLL0
STLにある、k番目の要素を見つけるnth_element()は計算量がO(n)だそうですが、
これの中身が何をやっているかの日本語の(できるだけむずかしくない)解説ってどこかに
ありますかね?
0920青木康善 (アウアウウー Sa1b-zK5j)垢版2023/05/03(水) 13:17:48.41ID:BsTGSOzGa
Javaより断然速いんでしょプラプラは。
0921デフォルトの名無しさん (アウアウウー Sa1b-ywfW)垢版2023/05/03(水) 13:57:16.79ID:0S5RwOvCa
チンチンプラプラ
0923デフォルトの名無しさん (ワッチョイ b79c-+Iiy)垢版2023/05/04(木) 07:42:34.11ID:/cLVFXSd0
状況によってはJavaのほうが速いこともあるね
0924デフォルトの名無しさん (ワッチョイ ffa7-By2c)垢版2023/05/05(金) 11:15:11.08ID:Y+XZO+i30
サブルーチン単位で見たらJavaやC#の方が早いこともあるけどそれはC++側のコードが糞なときだからな
マネージド言語はループ回すにしても強制的に一々長さチェック入ったりするので本気出したC++にはいずれにせよ敵わない
0925デフォルトの名無しさん (スプッッ Sd3f-wQ6u)垢版2023/05/05(金) 11:37:06.46ID:ByZ/Uyt6d
昔、JavaでもC++同等性能出せます(ただしメモリ使用量は10倍)
みたいなネット記事を見たのを思い出したわ
0928デフォルトの名無しさん (ワッチョイ ffa7-By2c)垢版2023/05/05(金) 12:44:08.47ID:Y+XZO+i30
>>926
C#の場合はコードジェネレーターが発達してきてるからC++はprintfで動的フォーマット、C#はprintfをジェネレーターで静的展開みたいなパターンで後者の方が早いという事があり得る
jsonのパースやシリアライズとか特に
0930デフォルトの名無しさん (ワッチョイ b79c-+Iiy)垢版2023/05/05(金) 14:28:48.55ID:Ds39Rblr0
x86ターゲットでビルドしたC/C++プログラムをARMでx86エミュレーション実行すると遅い
Java/.NETは中間コードだからランタイムさえARM版になっていれば性能が出せるね
0932デフォルトの名無しさん (ワッチョイ b79c-+Iiy)垢版2023/05/05(金) 15:46:51.10ID:Ds39Rblr0
C/C++はコンパイル時に命令が決まるから中間コードよりビルド済バイナリの長期運用では不利になるよね
ソースコードからリビルドできる環境があれば問題ないんだけどさ
0934デフォルトの名無しさん (ワッチョイ b79c-+Iiy)垢版2023/05/05(金) 15:55:40.50ID:Ds39Rblr0
環境なんて開発者それぞれでしょ
Macbook使ってるけどx86エミュレーションで動いてるアプリがいくつかあるんだよ
開発者さんがまだM1/M2を持ってなくてARMビルドがリリースできてないんだと思う(もしくは飽きて開発放棄してるのか)
0935デフォルトの名無しさん (ワッチョイ b79c-+Iiy)垢版2023/05/05(金) 16:00:19.83ID:Ds39Rblr0
とにかく既存バイナリを異なるCPUアーキテクチャで動かす状況が現実にあるわけ
Macに限らずWindowsでもね
そのような状況では.NETアプリは軽快にどうさするのにC/C++アプリは遅いということになる
0937デフォルトの名無しさん (ワッチョイ b79c-+Iiy)垢版2023/05/05(金) 16:16:39.25ID:Ds39Rblr0
Javaや.NETの中間コードにしてCPU命令セットに依存させないアプローチはポータビリティだけでなくランタイムごとの最適化を可能にするメリットがあるの
これC/C++では無理でしょ
0942デフォルトの名無しさん (ワッチョイ b79c-+Iiy)垢版2023/05/05(金) 17:10:53.16ID:Ds39Rblr0
ターゲットを限定できる組み込み系開発ならともかく
一般消費者向けのアプリではC/C++が最速とは限らないという話だよ
0943デフォルトの名無しさん (ワッチョイ b77c-0tm6)垢版2023/05/05(金) 17:15:38.26ID:sSc+RF200
仮想化やエミュレーションを何重にも重ねて実行するのが当たり前の現代的コンピューティングでは
「ネイティブで速い」なんて限定的な状況での一つの特長にすぎないんだよね
0944デフォルトの名無しさん (ワッチョイ b79c-+Iiy)垢版2023/05/05(金) 17:20:08.41ID:Ds39Rblr0
>>940
マイクロソフトは異なるCPUアーキテクチャに挑戦し続けてきたよ
そもそもNTのマイクロカーネルアプローチは様々なCPUアーキテクチャに対応するためのものだった
Alpha、PowerPC、IA-64で動作するWindowsが過去には存在した
既存のx86バイナリを動かせなかったことから失敗してしまったけどね
今はARM Windowsに挑戦中
これはMac同様にx86エミュレーションで既存バイナリを動かせるようにしてる

アプリ開発者としてターゲット環境を1つに限定すると不利になっていく思うよ
0945デフォルトの名無しさん (ワッチョイ 1f4b-zzYQ)垢版2023/05/05(金) 17:27:05.17ID:CaQRnUAH0
>>942
C言語はUnixをマルチターゲットで実現するするために作られた言語である件について:

プログラム作成にいくら手間がかかっても良いという話なら
#ifdef / #else / #endifの山でマルチターゲットに配慮しつつ高級アセンブラ的に使用したときのC言語が
中間言語実行または中間言語からのJITで巻けるシチュがわからん
説明できるんならkwsk、
0946デフォルトの名無しさん (ワッチョイ 1f4b-zzYQ)垢版2023/05/05(金) 17:31:37.61ID:CaQRnUAH0
そうではなくてプログラム作成の手間も込みの話なら
特定の応用においてErlangがC言語に勝った話は有名な話
https://ipsj.ixsq.nii.ac.jp/ej/?action=repository_uri&item_id=12&file_id=1&file_no=1

やが、C言語で書かれたオープンなErlangのVMでそのパフォーマンスをたたき出した場合、
何の言語が勝ったことになるんじゃ……
0947デフォルトの名無しさん (ワッチョイ b79c-+Iiy)垢版2023/05/05(金) 17:33:05.29ID:Ds39Rblr0
>>945
それは既に説明したよ
C/C++が想定したターゲットに対して最適なバイナリを出力できるのは事実
でも既存バイナリの長期運用では最適な速度を出せない状況に遭遇することがあるんだ
実際にM1/M2 MacやARM Windowsでそういう状況が生まれてる
0948デフォルトの名無しさん (ワッチョイ 1f4b-zzYQ)垢版2023/05/05(金) 17:38:21.35ID:CaQRnUAH0
>>947
>C/C++が想定したターゲットに対して最適なバイナリを出力できるのは事実
>でも既存バイナリの長期運用では最適な速度を出せない状況に遭遇することがあるんだ
話が矛盾している
既存のVM(これも既存バイナリのうち)がなんで常に最適な速度を出せることになるんdai?
0949デフォルトの名無しさん (ワッチョイ b79c-+Iiy)垢版2023/05/05(金) 17:43:37.99ID:Ds39Rblr0
>>948
個々のアプリをリビルドせずにVMだけリビルドすれば済むからエコシステムを維持しやすいの
たしかM1 Macが出てから半年も経たずにARM版JavaVMが登場したと思う
JavaアプリはIntel MacでもM1 Macでも同等の性能が出る
ネイティブアプリは各開発者がARMビルドをリリースするのを待たなければならなかった(まだIntel版しか存在しないアプリも多い)
0950デフォルトの名無しさん (ワッチョイ 1f4b-zzYQ)垢版2023/05/05(金) 17:53:15.49ID:CaQRnUAH0
>>949
>個々のアプリをリビルドせずにVMだけリビルドすれば済むからエコシステムを維持しやすいの
>たしかM1 Macが出てから半年も経たずにARM版JavaVMが登場したと思う
>JavaアプリはIntel MacでもM1 Macでも同等の性能が出る
>ネイティブアプリは各開発者がARMビルドをリリースするのを待たなければならなかった(まだIntel版しか存在しないアプリも多い)
そのネイティブアプリとは一体……
およびそんな特定のケースを言語の優劣の一般論として展開してよい根拠とは一体……
および>>946はどうなるんじゃ……

さらに言うと、VMの改修による新規プラットフォームのトータルサポートが、特定の応用で#ifdef/#else/#endifを何個か追加して
ソースからビルドするより常に早いとする根拠は一体……
0951デフォルトの名無しさん (ワッチョイ b79c-+Iiy)垢版2023/05/05(金) 18:01:52.41ID:Ds39Rblr0
ごめんね
話が噛み合わないようだからこれで最後にする

一般論として言語の優劣を語ってるつもりはないです
ソースコードからのリビルドよりVMが速いとは言ってないです
開発者の事情でリビルドされない既存バイナリで性能が出ない状況が実際にあると言ってるだけです
0953デフォルトの名無しさん (アウアウウー Sa1b-iyid)垢版2023/05/05(金) 18:18:32.71ID:gmBJZ0Nwa
データベースでは長期運用でデータ数が変わるから、
統計情報を参考にして、使われるアルゴリズムも変わる

特に、IBM では全自動のみ。
自分で、使うアルゴリズムを指定できない
0954デフォルトの名無しさん (ワッチョイ 5701-wHlW)垢版2023/05/05(金) 18:19:38.90ID:ugKRRbai0
C++はメモリーのフラグメンテーションを解消できないからJavaより遅いというエンジニアの意見は有名だと思う
0958デフォルトの名無しさん (オイコラミネオ MM0f-AgQJ)垢版2023/05/06(土) 03:08:16.87ID:eTXbn+faM
キャッシュの乱れによる速度低下を防ぎたいなら:
・ソートは本当に必要な場合だけ行なう。
・ソートする場合でも、要素数が少なければ特に問題ない。
 すべてがキャッシュに載ってしまえば、キャッシュミスが起きないから。
・そもそも物理シミュレーターではソートは必要ないことが多い。
 なぜなら自然の物理法則はソートの概念を用いていないから。
・レイトレーシングなども物理法則に基くので、基本的にソートを
 余り使わないでよいアルゴリズムを作ることが出来る。
0959デフォルトの名無しさん (ワッチョイ c24b-y4C+)垢版2023/05/06(土) 03:48:50.75ID:H05Eo8AC0
>開発者の事情でリビルドされない既存バイナリで性能が出ない状況が実際にあると言ってるだけです
そういう話ならそういう話で、
>既存バイナリの長期運用では最適な速度を出せない状況に遭遇することがあるんだ(>>947
と言ったときに、何と何の比較なのか(何なら「最適な」速度なのか)というレギュレーションを先に示して……

ソースコードからリビルドするだけで元より速くなるケースが本当にあるなら、そういうケースの提示をすっとばして
Javaや.NETの中間コードにしてCPU命令セットに依存させないアプローチの話なんてしないで……

一般的な速度比較ではなくて、他の言語でsimd化されてc++でsimd化されない場合の速度比較ならその話だけして……

アスペにill-definedなビミョーなネタ振りをしないで……
0960デフォルトの名無しさん (ワッチョイ df01-ouLR)垢版2023/05/06(土) 03:54:48.32ID:cJf94Ar10
いや俺3行以上は読まないから
0961デフォルトの名無しさん (ワッチョイ c24b-y4C+)垢版2023/05/06(土) 03:55:54.11ID:H05Eo8AC0
補足、

>既存バイナリの長期運用では最適な速度を出せない状況に遭遇することがあるんだ(>>947
と言ったときに、最適な速度をたたき出すブツが発言者の脳内にしか無いのだとしたら
そんなの単なるお気持ちの表明やんけ……

自分は最初から正しい論理展開をしていたみたいな顔するのはやめて……
0962デフォルトの名無しさん (ワッチョイ df01-ouLR)垢版2023/05/06(土) 03:57:28.42ID:cJf94Ar10
あと2行削れば読んでやるよ
0964デフォルトの名無しさん (ブーイモ MM0e-wpjJ)垢版2023/05/06(土) 08:23:03.54ID:1oIUqUCFM
>>961
はじめから「中間コード」と「ビルド済バイナリの長期運用」って書いてあるぞ?
0965デフォルトの名無しさん (ブーイモ MM0e-wpjJ)垢版2023/05/06(土) 08:31:13.11ID:1oIUqUCFM
俺は産業用システムのフロントエンドUIをC#で組むことが多いんだが、とあるデバイスの制御APIがネイティブDLL(.NETアセンブリではない)で提供されていたんだ
そのデバイスメーカーはなぜか32ビット版のDLLしか提供してくれなかった
それでC#プログラムも32ビット版.NETランタイムで動かさなきゃならなくなった

C++が速いとかどうでもいいけどさ、せめて64ビットビルドできるようになってから言ってくれないかな?
0971デフォルトの名無しさん (ワッチョイ 335f-LLT0)垢版2023/05/06(土) 14:00:34.30ID:O4KUwdol0
比較と称して対立煽りすればスレの勢いが伸びる
ただし意味のある議論はほぼ発生しない

技術板にアイデンティティを勝手に感じている技術力ゼロの雑魚だけがこういう話を振り、乗っかる
0973デフォルトの名無しさん (ワッチョイ 7228-nMxP)垢版2023/05/07(日) 12:16:32.15ID:ExrtxK200
>>964
>はじめから「中間コード」と「ビルド済バイナリの長期運用」って書いてあるぞ?
同じアプリの*実在する*中間コード版と
*実在する*長期運用されたビルド済バイナリとで比較しているのかっていうか、
その根拠こそ求められる
>>964はふいんきに飲まれて詐欺に遭いやすいタイプなのではないか……
0974デフォルトの名無しさん (ワッチョイ 639c-wpjJ)垢版2023/05/07(日) 13:31:09.45ID:Hp3D+to80
同じアプリである必要あるか?
0975デフォルトの名無しさん (ワッチョイ 7228-nMxP)垢版2023/05/07(日) 18:18:18.80ID:ExrtxK200
>同じアプリである必要あるか?
ある
「中間コード」と「ビルド済バイナリの長期運用」の速度を比較しようとしているのだから、
それらの違い以外は同じに保たねば正しい比較にならない
0976デフォルトの名無しさん (ワッチョイ df01-ouLR)垢版2023/05/07(日) 18:20:17.74ID:+pQ1lZnP0
0xの頃のように混とんとしてきたが、あの頃の熱さはないな
0977デフォルトの名無しさん (ワッチョイ df01-ouLR)垢版2023/05/07(日) 18:21:16.14ID:+pQ1lZnP0
C++20で飯の三杯くらいは食えると思うが
0980デフォルトの名無しさん (ワッチョイ df01-ouLR)垢版2023/05/08(月) 18:41:34.65ID:A57Tkf070
C++はエンジン、Javaはターボという関係では?
0984デフォルトの名無しさん (ワッチョイ 639c-wpjJ)垢版2023/05/09(火) 01:14:10.24ID:A/U8BALn0
あー 自分で書きたいのか
Javaの場合はJEP417 Vector APIでAVX命令を扱えるよ
0987デフォルトの名無しさん (ワッチョイ 639c-wpjJ)垢版2023/05/09(火) 09:28:23.14ID:A/U8BALn0
???
JavaのVector APIはSIMDを扱うために新たに策定されたもの
C++の動的配列std::vectorとはまったくの別物よ?
0988デフォルトの名無しさん (スッププ Sd32-HLMt)垢版2023/05/09(火) 12:20:03.88ID:Ac7S+28Ld
ごく一部の命令をごく一部の処理で使えたってダメだよ
1000個以上も命令あるんだし

コンパイラが使いこなせなそうな命令の具体例を上げてるのに

CやC++ならいろんな方法で使えるわけで
・ライブラリ経由
・Intrinsics
・インラインアセンブラ
・アセンブラ
0990デフォルトの名無しさん (ワッチョイ df01-ouLR)垢版2023/05/10(水) 05:01:02.91ID:w0EnrJsq0
>>986
Javaはかなり速いのでは?
10011001垢版Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 132日 18時間 46分 42秒
10021002垢版Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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