C++相談室 part144

■ このスレッドは過去ログ倉庫に格納されています
2019/07/22(月) 13:18:35.52ID:gptRHpgT
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part143
https://mevius.5ch.net/test/read.cgi/tech/1560574313/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
2019/08/29(木) 23:00:42.76ID:KkrIMV0W
>>679
多分生成される可能性が高いね
何故ならC++にはコンストラクタがあるから
つまりはstatic変数のコンストラクタで何かしているかもしれないだろう
だからリンカの最適化は削除をしないだろうね
ただ、普通のintとかだとリンカの最適化で削除されるかもしれないけど
まぁ運しだい
ともかく、規格では多分決まってない
2019/08/29(木) 23:20:08.64ID:xxmh5CSn
>>679
そのstaticメンバの定義を消してコンパイルしてもエラーにならなければ生成されてない
ちなみにstatic constとかの変数は元々ほとんどのケースで生成されてない
2019/08/29(木) 23:21:51.82ID:nf7j+lKK
やはりコンパイラによるのでは
2019/08/29(木) 23:29:30.27ID:KkrIMV0W
クラスのstatic変数といっても
コンパイラからしたらグローバル変数みたいなものだからな
使ってないグローバル変数は削除されるのか?
さあな
2019/08/29(木) 23:33:23.53ID:xxmh5CSn
visual sutdioというかvc++だと使ってないコードを削除するみたいなオプションあったからもしかしたら消えるかもしれない
他はよく知らない・・・
2019/08/30(金) 00:11:27.74ID:fVqdV4kl
libにしなかったらlinkしたobj全て
libにしたらobj単位でシンボル一つでも参照があればlinkされるのが基本じゃね
組み込み用のコンパイラだとそれ以上に頑張ってサイズ削ることもあるだろうけど
2019/08/30(金) 00:41:24.99ID:pQR0WkIg
グローバル変数のコンストラクタに起動時処理書いといたら、これが案外呼ばれるタイミングがわからない。
手続きの中で明示的に参照しにいかないとあかんと思った。
2019/08/30(金) 00:46:48.02ID:fVqdV4kl
static変数の参照返す関数つくるのはよくやる
2019/08/30(金) 00:50:00.39ID:T2NlJT89
ここの動的初期化によるけど、まあ分からん・・・
定数初期化しとけるならそうしとくのがいいけどいつもできるわけでもない
https://ja.cppreference.com/w/cpp/language/initialization
2019/08/30(金) 00:56:53.55ID:8Dc5lx9D
一見使ってないからと言ってコンパイラが勝手にデータ構造替えちゃったら動的リンク時とか整合性取れなくなっちゃう気がする
2019/08/30(金) 08:30:00.34ID:Okk0GWIA
動的ライブラリが元のバイナリの変数を暗黙に触るかはOSによる。
linuxは触れるがmacは触れない。
2019/08/30(金) 21:41:54.95ID:OdSxakdr
std::string="あいう";

c++って内部的な文字コードって何になるのかな?
あといまいちwstringの使い分けがわかんない、日本語だとwstring使えばいいのか?
2019/08/30(金) 21:49:07.10ID:zlaBwQso
決まってない
最近ようやく明示的にutf8対応しだした
wstringはワイド文字列
2019/08/30(金) 22:10:41.83ID:OdSxakdr
決まってないって言うのは処理系依存ってこと?
2019/08/30(金) 22:14:30.31ID:Q+0yO3vE
それぐらい自分で試したら?
それが確実でしょ
2019/08/30(金) 22:18:34.99ID:QpJdGFlG
sringの中の文字コードは入れた文字列の文字コード
普通の文字列リテラルの文字コードはそのソースコードが書かれたテキストの文字コード
文字列リテラルはu8などのプレフィックスをつければUnicodeになる
2019/08/30(金) 22:19:54.88ID:BOCgcfAb
試しただけじゃそれが処理系依存の結果かどうかなんて判断できんじゃん
2019/08/30(金) 22:21:51.17ID:Q+0yO3vE
ここで答えもらってもそれが正しい保証がどこにある
2019/08/30(金) 22:23:12.28ID:ZMew/+Uj
コンパイラによって日本語シフトジスなどのマルチバイト文字列の解釈が違って移植の際にトラブることがある。
2019/08/30(金) 22:33:35.27ID:QpJdGFlG
とりあえずリテラルにはu8やuをつけておけば問題ない
2019/08/30(金) 22:39:07.85ID:QcXmSAua
そしてHPUXで悲鳴をあげることに
2019/08/30(金) 22:41:21.90ID:BOCgcfAb
正しい保証はできないかもしれんが間違いは明確だな
2019/08/30(金) 22:53:05.39ID:Okk0GWIA
gccならutf-8だろうけれど、最近のVCはどうだろ。
2019/08/30(金) 23:28:54.53ID:Oe3WNWk3
文字コードの話題は盛り上がっていいね
ある意味一番ハマる部分かも
2019/08/31(土) 01:18:30.00ID:toQMNfCu
u8つければいい
2019/08/31(土) 12:17:38.05ID:WtWTaSD6
char型および文字列リテラルが何になるのか不定なのがアレなので
もうさいしょからu8""とchar8_tとstd::u8stringを使うように徹底するのは良いのかもしれない
2019/08/31(土) 13:49:09.93ID:gI08UaXy
WindowsはTCHARで書くべしみたいなのはまだあるの?
最近Windows使ってないもんでよく分からん
2019/08/31(土) 14:24:18.19ID:6oowjHUQ
昔から自分でオプション変えて好きにしろとしか
2019/08/31(土) 14:25:31.75ID:Jddzk3ii
>>706
でもUTF16の方が問題起きにくい気がする
2019/08/31(土) 15:03:47.82ID:iA1eP3Lu
>>709
ファイルシステム関係は uft16 で、それ以外は utf8 で分けるしかないでしょうね、"ファイルシステム uft16" はやったことがありますが、utf8 はまだ触ったことがありません…
2019/08/31(土) 18:44:11.09ID:IP14yh++
utf8は冗長コードの問題があるから内部処理用コードには向かないんだよね。
2019/08/31(土) 18:47:33.88ID:toQMNfCu
読みこみでハネるのが主流じゃね?
utf16が一番中途半端
2019/08/31(土) 18:54:01.60ID:IP14yh++
そうかな、場合にもよるけど、日常使う文字はほぼutf16に収まるし、
utf8だとstd::regexで日本語がまったくつかえないとかあるしで、
俺的にはutf16の方が便利かな。
2019/08/31(土) 18:58:48.47ID:toQMNfCu
ほぼ収まるってのが一番厄介な所だろ
サロゲートペア対策してなさそう
2019/08/31(土) 19:07:54.35ID:QlojAnpK
日常使う文字こそ今やサロゲートペアだらけなのに🐙
2019/08/31(土) 19:34:37.71ID:oexy9R6b
絵文字はみんなサロゲートペアだもんな
あれのおかげでようやく欧米人どもが真面目にUnicode対応するようになった
2019/08/31(土) 21:17:21.24ID:ny+pXiR9
その代わり新宿ダンジョンよりも複雑奇怪になったけどな
2019/08/31(土) 21:55:55.82ID:OiY9nyzL
絵文字はやめてほしいわ。そもそも架空の文字は登録しないんじゃなかったのかよ。
21bitも使えてコードポイントに余裕があるからといってロクなことしない。
2019/08/31(土) 22:01:23.04ID:WtWTaSD6
足りなくなったらサロゲートペアを足せばいいからなw
2019/09/01(日) 00:01:08.44ID:U3czXmCF
🀄🀄🀄
2019/09/01(日) 18:32:43.72ID:L3u9XotW
もう全部utf32でいいんじゃね 一番簡単だしみんなハッピーや
2019/09/01(日) 19:43:20.80ID:AU7sQxSH
utf32も結合文字が。。
2019/09/01(日) 19:48:05.67ID:UMpnMGJj
で、結局utf8でよくねってなる
2019/09/01(日) 19:58:29.50ID:5ppTYJ/k
いろいろ工夫を凝らし始めるとiso-2022でいいじゃんという
2019/09/01(日) 20:03:47.57ID:ugxLNVG7
う、うん…
2019/09/01(日) 21:56:38.21ID:csfeG7d1
文字列なんか一番基本的な物の一つなんだから
もっと簡単でもよかったのにね
2019/09/01(日) 22:30:33.03ID:XdngnPPu
4byteの配列にコードポイントまんま入れるんだ
結合文字は忘れろ
2019/09/02(月) 00:01:08.82ID:g71KPPKA
コードポイントじゃなくてメモリポインタじゃないの?
2019/09/03(火) 08:08:26.56ID:/7AcGg3i
オブジェクト指向の3大要素をすべて満たしたプログラム作れって課題なんだけど、じゃんけんでいいかな?
2019/09/03(火) 08:58:16.91ID:JzHlK+VD
じゃんけんでメッセージを送る機能が必要になるとは思わないが
2019/09/03(火) 09:00:22.95ID:LV1H9AE4
チャットでいいんじゃね?
画像と文字送れば色々実験できるし
2019/09/03(火) 09:35:35.97ID:/7AcGg3i
チャットかあ
難しそうだな…
2019/09/03(火) 10:27:53.48ID:Hys2x8bh
三大要素って委譲とメッセージとなんか?
2019/09/03(火) 10:35:12.45ID:/7AcGg3i
カプセル化、継承、ポリモーフィズムの3つ
2019/09/03(火) 16:47:41.46ID:WZskrpAp
チャットを作ると

カプセル化:ネットワーク部分、チャット部分
継承:継承元からサーバクラス派生、クライアントクラス派生
仮想:TCPクラス-UDPクラス切り替え

完璧じゃね?
2019/09/03(火) 17:14:42.83ID:xpzn8aWg
別にじゃんけんだっていいだろ

継承:手の種類
多態性:手の画面出力
カプセル化:しわの数
2019/09/03(火) 18:12:16.81ID:S+eQGM/g
タイマーで早出し遅出しの判定とか
ネットワーク対戦機能とか
履歴取ってプレイヤーの手の傾向学習してくるAIとか
色々盛り込んでみればいい
2019/09/03(火) 18:57:18.29ID:7WEfMANz
ちゃんと負けた時はズコーって音声出すんだぞ
2019/09/03(火) 20:42:17.04ID:O03sdIlG
期限が金曜だからあんまり凝ってる時間はないかな。クラス図とシーケンス図とオブジェクト図も作んなきゃいけないし
結局ケイスケホンダのジャンケン作ることにした
2019/09/03(火) 21:36:59.59ID:VgehgunL
>>734
三大要素というとよくそんな風に言われるけど、実のところ継承ってオブジェクトの要素とは
言い難いし、多態も要素というより結果として得られる性質に近いと思うんだよなぁ。
2019/09/03(火) 22:59:40.18ID:29yFlgBG
まあすべては委譲です
というか抽象化のためのパターンです
2019/09/04(水) 09:05:55.41ID:42AhKM7p
>>728
コードポイントで合ってるはず。
文字符号の1つずつの番号の場所をコードポイントと言う。
例えば、ASCIIコードなら、A の文字の番号である 0x41 の占めている
場所みたいなニュアンスがある。
2019/09/04(水) 09:20:24.49ID:42AhKM7p
>>742
追伸。なお、0x41の番号そのもののこともコードポイントと言う。
番号に就いては単に「コード」とも言うが、2019年現在において
単に「コード」と言ってしまうと、プログラムの内の命令が並んでいる
部分のことを指すことが多くて混乱が生じやすいので、文字符合の
番号に対しては、「コード」ではなく「コードポイント」という
ことがある。「文字符号」と言ってしまうと、ShiftJISの体系そのもの、
UnicodeやUTF8の体系そのものを指すことも有り、どうしても曖昧さが残る。
そこで、0x41という番号そのものの事を言っていることを曖昧さなく
示したい場合には、文字符号ではなく「コードポイント」ということがある。
2019/09/04(水) 10:36:53.55ID:BMbMsP6d
int (*exec)(struct bContext *, struct wmOperator *) ATTR_WARN_UNUSED_RESULT;

上記はtypedef struct内に書かれていた関数ポインタの宣言で、
返り値がint、引数が(struct bContext *, struct wmOperator *)の関数ポインタexecなのは分かりますが
最後のATTR_WARN_UNUSED_RESULTって何でしょうか? 関数宣言って引数宣言の後に何か書けましたっけ?
2019/09/04(水) 10:46:36.08ID:3LCw+twW
>>744 https://ja.lmgtfy.com/?q=ATTR_WARN_UNUSED_RESULT
2019/09/04(水) 11:46:27.08ID:peiZ6Bip
今時なら[[nodiscard]]か
2019/09/04(水) 12:57:05.98ID:/jMgnxhx
いくつか用意した文字列の中から1つをランダムで表示するってどうやればいいかな?
2019/09/04(水) 13:11:23.43ID:OPoewtpz
配列辺りにぶっ混んでインデックスを乱数にして取り出すとか
2019/09/04(水) 18:37:03.73ID:A7beDSD/
std::minstd_rand mr
std::uniform_int_distribution<> ui(0,StrS.size()-1);

StrS[ui(mr)];//<- what?

大雑把にこういう感じ?
2019/09/04(水) 19:21:28.58ID:+/XA3LOY
StrSのSは何の略だ
2019/09/04(水) 19:22:06.69ID:A7beDSD/
複数形。
文字列の配列だから。
2019/09/04(水) 23:10:27.71ID:3YkDCQ2q
>>747
#include <stdio.h>
#include <stdlib.h>
#define STR_MAX 5
const char *pszText_s[STR_MAX] = { "aaa", "bbb", ・・・・・・・ };
int main() {
 int  idx = (int)( ((float)rand()) * STR_MAX / RAND_MAX );
 printf( "mojiretsu = %s\n", pszText_s[idx] );
 return 0;
}
2019/09/04(水) 23:13:18.96ID:HOiCfRXh
なんだそのクソの塊は
2019/09/04(水) 23:23:06.05ID:A7beDSD/
>>752
C言語ですねぇ。C++だったら、<random>使いたいところですね。
2019/09/04(水) 23:29:14.08ID:3YkDCQ2q
なぜCで済むのにC++を使おうとするのか。
何のメリットがあるのか。
基礎が大事。
2019/09/04(水) 23:29:55.89ID:NHTKoQQB
ここ何のスレだと思ってるのおじさん
2019/09/04(水) 23:33:21.57ID:3YkDCQ2q
そもそも基本的にCもC++の一部なのでC風に書いたものはC++の回答としても
間違いではない。
「C++でのやり方」と言ってもC++は歴史が長いため、色々なやり方がある。
また最新の仕様を使うことがベストな選択とは限らず、むしろ分かりにくく
なることも多い。
2019/09/04(水) 23:34:44.99ID:3YkDCQ2q
>>756
ちゃんと >>752 のコードは、C++モードでもコンパイルは通るので、
立派にC++言語で書いたコードである。
2019/09/04(水) 23:36:41.47ID:HOiCfRXh
> また最新の仕様を使うことがベストな選択とは限らず、むしろ分かりにくく
> なることも多い。

自分がわからないだけでしょ
2019/09/04(水) 23:36:50.55ID:3YkDCQ2q
C++ は、もともとCにclassの概念を追加したものと言われている。
今回の様にclassを使うメリットが無い場合は、C++の内、
昔からあるCの部分で十分である。エンジニアリングの世界では
「simple is best」
だ。
2019/09/04(水) 23:38:38.42ID:3YkDCQ2q
>>759
新しい機能はC++委員会が好き勝手に追加しているだけで、
学ぶ意味が無い。
しかも、あなたも分かってないのに、人を馬鹿にするのはいかがなものか。
まずは動くコードが大事で、最新のやり方を使うことは重要ではない。
変に難しくしても意味がない。
2019/09/04(水) 23:39:05.43ID:NHTKoQQB
>>749
の方がシンプルじゃねーか
2019/09/04(水) 23:41:17.68ID:3YkDCQ2q
>>762
頭がおかしい。
2019/09/04(水) 23:41:42.83ID:HOiCfRXh
better Cとか言ってる奴らが老害だってよくわかるね
2019/09/04(水) 23:57:17.61ID:twmgvXS9
Cで書いてもええけど

> ((float)rand()) * STR_MAX / RAND_MAX );

この乱数に対する意識の低さがくそ
2019/09/04(水) 23:58:00.42ID:8IyIvdim
rand()なんか使ってる時点で商用ソフト書かせちゃいけないセキュリティ意識皆無のカスだって自白してるようなもの
2019/09/05(木) 00:01:08.35ID:wSq6T90P
>>765
間違えてた。正しくはこうだと思う:
int  idx = (int)( ((double)rand()) * (STR_MAX - 1) / RAND_MAX );

まだ間違いがあるかも知れんが。
2019/09/05(木) 00:09:37.75ID:wSq6T90P
>>766
知らなかっただけで、std::uniform_int_distribution のような便利なライブラリが
あるんだったらそっちを使ったほうがいい。
本当は、古いCに昔から入っているような rand() はアルゴリズムが良くなくて
モンテカルロシミュレーションなどでは余り良い結果が出ない。
昔やってみて分かった。ネットに転がってたもっといいアルゴリズムの乱数に
変えてみたら結果が良くなった。
2019/09/05(木) 00:10:44.20ID:5Cw7Ao7f
今どきrand()が論外なのは別として剰余も知らんの?
2019/09/05(木) 00:12:59.23ID:5Cw7Ao7f
何だこいつ

> 新しい機能はC++委員会が好き勝手に追加しているだけで、
> 学ぶ意味が無い。



> 知らなかっただけで、std::uniform_int_distribution のような便利なライブラリが
> あるんだったらそっちを使ったほうがいい。
2019/09/05(木) 00:15:04.65ID:ymsvBiyv
>>769
rand()%Nは最悪のディストリビュータといわれている。
浮動小数でやるほうが幾分かましといわれる程度には。
2019/09/05(木) 00:16:17.70ID:wSq6T90P
>>769
剰余で
int idx = rand() % RAND_MAX;
のようにすると均等確率にはならないことがある。
俺の専門は数学に近いので分かる。
2019/09/05(木) 00:18:23.32ID:wSq6T90P
>>772
間違い修正:
誤:int idx = rand() % RAND_MAX;
正:int idx = rand() % STR_MAX;

このように書いた場合、直感では、RAND_MAXがSTR_MAXの倍数で無い場合
に均等確率にならないハズ。
2019/09/05(木) 00:18:43.26ID:M7+W0IyT
低劣なrand()のさらに劣悪な下位ビットを使うくらいならアホが書いてる形の方がまだましではある
rand()みたいな小学生でも推測できる危険極まりないゴミクズを使ってる時点で目くそ鼻くそだけど
2019/09/05(木) 00:21:02.57ID:wSq6T90P
>>771
おっしゃるとおり、そのやり方だと、
N が rand()の最大値 RAND_MAX の約数で無い場合には、均等確率になりませんね。
2019/09/05(木) 00:21:37.88ID:5Cw7Ao7f
Nが2の累乗でない限り%Nは上位ビットも影響するけど
2019/09/05(木) 00:22:46.70ID:wSq6T90P
>>774
質問者は、>>747 と書いただけなので、初心者的質問だとみなして
そんなに高度な乱数は必要ないと思ったので書いてみただけ。
2019/09/05(木) 00:25:08.12ID:M7+W0IyT
初心者にこそrand()みたいな絶対に使ってはいけない危険物を紹介したらダメだろうが
お前は初心者が入力読み込みの質問したらgets()を教えるのか?
2019/09/05(木) 00:25:11.59ID:wSq6T90P
>>774
>低劣なrand()のさらに劣悪な下位ビットを使うくらいならアホが書いてる形の方がまだましではある
あなたは、% と & を間違えてませんか。

x % y : x を y で整数除算したときの余り。
x & y : x と y の BIT 積 (and)。
2019/09/05(木) 00:25:49.83ID:wSq6T90P
>>778
rand()のどこが危険なのですか?
2019/09/05(木) 00:27:59.92ID:6cA0wVT5
てか、今時まだ下位ビットに周期性あるのかね?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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