◎正当な理由による書き込みの削除について: 生島英之 とみられる方へ:C++相談室 part144 ->画像>1枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1563769115/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part143
http://2chb.net/r/tech/1560574313/ このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://2chb.net/r/tech/1556142878/ ■長いソースを貼るときはここへ。■
http://codepad.org/ https://ideone.com/ [C++ FAQ]
https://isocpp.org/wiki/faq/ http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
----- テンプレ ここまで -----
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。 ---- テンプレ ここまで ----
すっぱい葡萄
https://ja.wikipedia.org/wiki/%E3%81%99%E3%81%A3%E3%81%B1%E3%81%84%E8%91%A1%E8%90%84 自分のものにしたくてたまらないにもかかわらず、努力しても到底かなわない対象である場合、
人はその対象を「価値の無いもの」「自分にふさわしくないもの」と見なそうとし、
それをあきらめの理由として納得し、心の平安を得ようとするものである。
フロイトの心理学では、これを防衛機制および合理化の例とする。また、社会心理学においては、認知的不協和の例とされる。
英語には、この寓話を元に生まれた熟語として "sour grapes" があるが、これは「負け惜しみ」を意味する。
ループの中で剰余演算子が沢山出てくるとまぁよく知られてるように遅いわけだが、 (x += a) %= m; を x += a; if(x >= m) x -= m; としたら高速化された だったら言語仕様として剰余演算子の定義をこう変えれば良いのに、なぜ遅いままなのですか?
>>6 それじゃ変更前と同じ演算になってないだろ。x>=2mやx<0の可能性を排除しているから速いんじゃね。
お前のプログラムa=999999、m=2の時に壊れてるよ
>>10 それ読んでもc++使う理由わからんよな
高速化が必要なコアのアルゴリズムにc++最新機能不要だろ
それより確率モデル使ってGPUで解くとかもっと賢くやれよと思うわ
自分が食っていくためには自分に仕事が必要であるため、 C++言語仕様周辺で食ってる人は永遠にコネクリ回したいはず。
最新規格に合わせた方が生産性高く保守も容易になる それに、cudaだってc++17相当で書けるだろうに
普通にc++17は便利に使っているが? てか使っている実例に対して、無意味断定する根拠が適当過ぎる それこそコードで示せと そんなに大きくない会社が金かけてまでやっているのだから、それで利益が出る効果はあるんだろう
>>17 お前が保守してるコードについて詳しくきかせてもらおうか
コーディング量減るし、constexpr ifでlambdaの記述が捗るだろ?
>>19 ごまかすなよw
お前が今保守してるコードについて聞いてる
c++のバージョンは?
行数は?
速度とC++を使用する意義について問題提起したのかと思いきや生産性の話になってる
constexpr ifって言ってんのにC++のバージョン聞くってどういうこっちゃ まさかC++20?
>>21 今のところc++17だな
17で0から書いたわけじゃないが、少なくとも有効にしないと通らん
行数はひとつじゃなくライブラリ沢山だから分からん
昔はlinuxメインでcudaとかも使って数値演算だったがここ数年はwindowsばかり
画像処理系、GUI、数値演算ライブラリその他装置制御とかのライブラリと組み合わせたアプリ作っている感じだな
画像処理だと要素型のテンプレートで基本操作をそれぞれ特殊化してintrinsicsで書いておいて、それを組み合わせて応用機能を実現している感じ 組み合わせで最適化可能な操作も基本操作に加えているけど
constexpr ifはC++17以降じゃないと使えない
通称constexpr ifなのに書くときは逆という罠
? 開発したアプリやライブラリの機能追加とかバグ対応とかって保守だろ
それ保守ってほど時間たってないんじゃね? しかも他人のコードじゃないならなおさら
17にしてからは1年も経ってないかも知らんが、14,11の頃から数えれば数年前のソフトいじるとかは普通にある 弄るついでに最新規格でコンパイル通るようにしたり、使ってたライブラリ最新版に置き換えたりしてる
>>32 だからそれ保守じゃねーから
変えてんじゃん
自分のちっさいライブラリでしょどうせ 他人の膨大なソースコードでそれできんのかと 仕事で保守したことないやつの戯言
機能追加やリファクタも保守だぞ 変えないことが保守だと思ってんの?仕事で保守したことないやつの戯言
他人のなら、1ソース数10万行のが50ファイルとかあって、中身がコピペ改変のネスト構造になっているとか頭おかしいコードのデバッグとかすることもあるよ。 おんなじバグが100箇所くらいあったりするのw
cudaに対してc+17使うとか100%死亡パターンだろw
>>36 そういうやつは触れない
そうじゃないやつはリファクタリング可能
統一して語る必要はない
修正は保守に入るだろうけど、 機能追加はどうかな。保守ではないような気がするが。 別にどうでもよいけど
新しいOSに対応しろ、ファイル形式に対応しろ、こういうAPI追加しろ、出力形式変えろ、速くしろ、軽くしろ 保守ってそういう要求に対応すること・対応できる体制を維持することだと思ってたんだが、そうじゃない宇宙もあるのかな
ソフトの保守って受けたことねーや 納品したらそれまで 改修や機能追加は別料金
> 改修や機能追加は別料金 オレが決められるなら当然そうするんだが クソ脳無しの営業どもが
元来の意味は現状維持なんだから機能追加するものは保守とは言わんよなぁ どうしても直さないといけないバグとか、開発環境変わったことによる対応とか、そういうのだけいやいややる感じ
保守(maintenance)ってのはソフトウェアの利用価値を持続させることでしょ そのために必要なら修正もするし機能追加もする 「保守だから現状維持、改修や追加なんてしないししてはいけない」なんてのは思考停止
パッケージだと正式リリースした後のバージョンアップはすべてメンテナンス
業務で保守契約っていわれたら機能追加はないイメージだな
思考停止っつーか実際問題そんな仕事ないだろ。 c++バカによくある妄想に付き合う必要はない。
ある人にとっての「保守」は 趣味プログラマによるお仕事ごっこという文脈でのそれなのかな
ソースコード変えたらテストせねばならないがC++は単体テストの記法がイマイチ Google Test一時期使ってたがテスト対象を呼び出すコードを書くまでのタイピング量がけっこう生じる GoやRustはいいいぞ〜☆
ていうかC++の自己責任が伴いすぎる自由に疲れた、
苦労して自由を行使した末に得られる見返りのは たいていはわずかばかりのパフォーマンス向上と 二度と見る気がしない気がする醜いソースコードやし、 保守wwwwwwwwww
const std::string & を std::string_viewに置き換えている記事をよく見かけます 後者を使うことに何か意味はありますか? 単に置き換え可能だと言うことを解説したかっただけなのでしょうか
後者は部分文字列を切り出したいときにメモリ確保と文字列のコピーが発生しない
c++は、スマホでは動作しませんか? VSでコンパしたものでは、ダメですか?
streamで固定長の文字列分解したい 以下イメージ istreamstring ss(“0123456789”); string no1; int no2; char no3; ss >> std::setw(4) >> no1; ss >> std::setw(4) >> no2; ss >> std::setw(2) >> no3; 結果 no1=0123 no2=4567 no3=89 みたいな感じで 環境はコンパイラc++03、boost使えず std::string::substr使ったやつはもう作ってます よろしくお願いします
>>57 「substr()使ったやつ」で何が不満なのか?
>>58 項目ごとにstreamかまさないと、型で自動変換してくれないし、抜き取り開始位置指定しなくちゃいけないし、なんか冗長でカッコ悪し
みたいな理由です。
ABIの変更ってこれから先何度もあるんでしょうか? stringとか基本のクラスが変わるのはきついんですが
そのあたりほんとc++クソだよ というか標準化委員会がクソ
ABIはしゃーないな VCとgccが違うの知った時泣いたわ
BeOSっていうOSが昔あって、純粋にC++でゼロから作られたOSなんだけど コンパイラのバージョンアップだとかでABIが変わって アプリの使うAPIの互換性が保たれてなかったんだよね (後継のHAIKU OSも同じ問題抱えてる) そこらへん標準で決めててくれればいいのにねぇ
C++の委員会って規模やリソース的に多言語と比べてどうなんでしょう? かなり恵まれているほうえすかね?
C++くらい規格化ちゃんとやってる所って他にある?
規格合致したコンパイラなんて過去に存在したのかしら
そもそも1つの規格を元に複数のコンパイラが存在するって言語が少ないだろ
>>52 例えば文字列リテラルを与えた時にconst std::string &だと暗黙的に一時オブジェクトが構築され、バッファの確保と文字列のコピーが発生する。
std::string_viewを使うと、文字列の先頭アドレスと長さだけが渡されることになるので、効率の良いコードが生成される。
>>55 これは、IDEはVSでも使用するコンパイラ本体は MSC(?)ではなくclang ですか。
>>70 せ、せやな FORTRAN, COBOL Fortran今も使われてるのか 研究室のコードが軒並みFortranでイヤイヤ使わされた記憶がよみがえった C++だのなんだの色々流行ってるが研究者はそんなものに振り回されるな Fortranは完成された言語なんだとボスが力説してたわ
言い忘れたがFORTRAN77ね 90とか使うと怒られた
Pythonは「CPythonの実装が規格だ」だし MATLABはそもそもプロプラで言語仕様や変更プロセス自体ブラックボックスだし あんまり依存するのは危険だと思うんだけどな アカデミックでは特に
>>77 Fortran 2008の規格書印刷してボスの机の上に置いてやれw
かといってANOVAやMCMCをC++で実装するのは検証も含めて愚かでしょ
ボイジャーのメンテナにFORTRAN使い募集してたやん
>>80 それでもpythonのリスト処理の仕様の方がc++のuniversal initializerなんかよりも
よっぽど仕様として安定してる。それが現実だ。
>>53 それは存じていたのですが、単にstringの参照を渡したいときにまで(const std ::string &)std::string_viewを使う意味はあるのかなぁ…?というのが疑問でした
上手く伝えられずすみません
>>71 非常に納得しました。そういう意図が有ったのですね
ありがとうございます
個人的な話だけどstring_viewはconstexpr対応してる点で有利。
パイソン2と3が混在してるのがややこしい。 spirvのビルドスクリプトは2でしか動かない記述なのに勝手に3を探してきて動かそうとするとか混乱が甚だしい
>>88 ちょっと話はそれるけど、外国製の言語処理で最近やたらとネットから勝手に
いろんなものをダウンロードしてくるものが増えて嫌だ。
なんというか世の中全てがオンラインが前提みたいになってて辟易します
>>90 凄い分かる。
>>89 誤:言語処理
正:言語処理系
別にオンライン前提でもいいんだけどエラー処理が糞なのが多くて、オフラインだと起動が超遅くなるとかそもそも起動しないとかあるのが
これからはonline merged offlineらしいです
要らない物を売りつけてくる天才みたいな感じだからな、アメリカは。
アメリカ関係ないだろ。 エヴァンジェリストとか名乗る馬鹿が要らんものばっか押し付けてるだけで。
エヴァンジェリストっていう単語はじめてきいたときは エヴァンゲリオンのファンの事かとオモテタ
広告宣伝しまくってプロパガンダのゴリ押しで本当に要らないものを買わせる奴らだろ 神からプログラミング言語までなんでもアリだ ハロウィン文書なんかは異教徒抹殺のための冷静な分析でこれは宗教ヤってる目つきの物言いだ キリスト教各宗派の合宗国のアメリカはそういうの強いよ どこかのバカが州とか訳したけどね、真実を悟らせないようにする翻訳テクニックじゃねえの つまりあいつらのやってることは邪悪だから気をつけろ、ってことだ
C++がいかに委員会制を敷いて仕様をがっちり固めているといっても 元になっているC言語がUnix記述のためにデニスリッチーがほぼ一人で考えたドメイン固有言語みたいなものなので 後方互換性というものを重視すればするほど後発言語に対してハンデ戦になってしまうのは仕方が無い Rustを見たらC++のconstや参照がいかに危険で不用意なブツになってしまっているかがワカル ・こんな人はRustを使うべき(中略 ・今すぐRustを使うべき10の理由(ry
ていうかUnixの記述自体が文書整形をやりたいから(後にroffとして結実)という システム記述ではなくてアプリ実現要求に端を発しているから、 やっぱ全体を俯瞰するとろくでもない流れの末に生まれたC++は不幸な出自と言えるかもしれん…
2の補数以外を捨てたのと、評価順序を規定したあたりでCとは決別したと思ってる これ生粋のCerは絶対受け入れられないでしょ
>>89 ウチは羹に懲りて膾吹いてるので許可したサイトにしかつながらない
パイパイすらつながらない
古いシステムでは1の補数表現を用いていたものもあったという伝説じゃよ
1の補数や符号ビットだと0のエイリアス(+0と-0)が出来てハッシュの要件満たさなくてめんどくせえし、 もう2の補数ばっかりなんだから2の補数に限定しようぜーってなってC++20から整数型は2の補数限定になる 例によってIBMはキレてる
あと宇宙船演算子の戻り値型が符号付整数だけstrong_orderingじゃなくなったりとよろしくない
1BM = 1の補数表現のBinaryを使うMaker
BOOST_FOREACH と c++11の範囲ベースfor文ってどっちが早いんですか?
>>113 速いでなく早いならboostじゃないかな
ほえー宇宙船演算子なんてできるのか… 勉強になったわ しかしおふざけネーミングなの珍しいな。総合比較演算子とかならなかったのか
正式名称は三方比較演算子(three-way comparison operator)
エルビス演算子の名前ってまじでプレスリーなんかよw
宇宙船演算子なんてなんかのタイポだろうと思って読み飛ばしていたけどマジな用語だったのか、勉強になったわ… FORTRANの算術IF文みたいに宇宙船if文とか作ってくれればいいのに space_ship_if(x) equal { … } plus { … } minus { … }
xは何と比較してるん? switch見たいな構文やな。
Opencvで空の画像に点を1000個程度書きたいです X座標Y座標が既知の場合に最速で点を1000個描画するにはどうしたらいいんですかね?
>>123 > xは何と比較してるん?
0 と比較してるつもり
space_ship_if(x, y)
== { … }
< { … }
> { … }
の方がわかり易いかな
gitに公開されているcpp環境を使おうとしたところ、サンプルコードのcppファイルのコンパイル時に
「undefined reference to 〜」
と出てコンパイルできませんでした。
何が原因かわかりますでしょうか?
操作した手順は以下になります。
#-------------
# 1. インストール
#-------------
git clone
http://github.com/HomerReid/libGDSII cd libGDSII
mkdir m4
sh autogen.sh --prefix=/home/user/install/libGDSII
make install
2. につづく
#-------------
# 2. 下記URLにあるSample codeを元にファイル作成
# ->
https://github.com/HomerReid/libGDSII #-------------
--- xxx.cppファイルで保存 ---
#include "libGDSII.h"
using namespace std;
using namespace libGDSII;
int main(int argc, char *argv[]) {
/********************************************************************/
GDSIIData *gdsIIData = new GDSIIData( string("GSiP_4_RingFilter.gds") );
if (gdsIIData->ErrMsg)
{ printf("error: %s (aborting)\n",gdsIIData->ErrMsg->c_str());
exit(1);
}
/***************************************************************/
gdsIIData->WriteDescription(); // writes to console
gdsIIData->WriteDescription("MyOutputFile");
/***************************************************************/
PolygonList Layer3Polygons = gdsIIData->GetPolygons(3);
printf("Found %lu polygons on layer 3: \n",Layer3Polygons.size());
for(size_t np=0; np<Layer3Polygons.size(); np++)
{ printf("Polygon #%lu has vertices: ",np);
for(unsigned int nv=0; nv<Layer3Polygons[np].size()/2; nv++)
printf(" {%e,%e} ",Layer3Polygons[np][2*nv+0],Layer3Polygons[2*nv+1]);
printf("\n");
}
return 0;
}
3. につづく
#------------- # 3. コンパイル #------------- gcc -I/home/user/install/libGDSII/include -o xxx xxx.cpp /tmp/ccwjjcp2.o: In function `main': xxx.cpp:(.text+0x54): undefined reference to `libGDSII::GDSIIData::GDSIIData(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' xxx.cpp:(.text+0xb8): undefined reference to `libGDSII::GDSIIData::WriteDescription(char const*)' xxx.cpp:(.text+0xc9): undefined reference to `libGDSII::GDSIIData::WriteDescription(char const*)' xxx.cpp:(.text+0xe4): undefined reference to `libGDSII::GDSIIData::GetPolygons(int)' ↑ここで落ちる
まずエラーメッセージ(undefined reference to )でググろう
単純にライブラリ参照できてないだけだと思うけどなぜ作者に聞かないのか
ググりましたが難しかったです。 make install時に*.aなどのlibパスを入れるとか、コンパイル時にlibパスを入れるとかありましたがうまくいかず。。 作者がいるので問い合わせればよいですね。 まずは問い合わせてみます。 ありがとうございました。
ライブラリの中身関係ない質問されるとか作者かわいそう
ggrksファッキューって言われたら戻って来てね 優しいお兄ちゃん達が解決してくれるよ
あれーmake installする前にmakeやるんじゃなかったっけ。ライブラリがそもそも生成されてないんじゃないの それとライブラリのパス入れるときは-Lか-lだけどもしかして-Iでやってたりしない?
>>138 usingを使えば。std:: と打ち込む手間が減って便利になるメリットが
ある。逆にデメリットは何か聞いてみたい?
using namespaceのデメリットが分からないのは名前空間を理解していないのでは
実際問題、std は standard template library の 「standard(標準)」な 訳だから、using 使っても、他の何らかの(ライブラリなど)の名前と 衝突する可能性は低いですよね。汚染と言っても現実に衝突する可能性 は低い。もしstd::が必須なのであれば、Stdという接頭辞を最初から 付けていればよかったはずであって、敢えて std:: という 5文字分を タイプする必要は無かったはず。 仮に何かと衝突するというなら設計の不味さを感じますね。
>>142 衝突する可能性は低いという前提が抑間違い。
お前さんは広範な標準ライブラリのすべてを熟知してstd名前空間で定義された名前とはぶつからない命名が常にできる自信はあるのかい?
今現在問題なかったとして、後に標準ライブラリが拡張されて、自分でつけた名前にぶつからない保証は?
そんな諸々の厄介ごとを回避するために名前空間はあるのだから、自分しか使わないソースで誰にも迷惑かけないなら好きにすればいいよ。
仮に線形代数のベクトルクラスとか作ったらいきなり衝突するんだがな 他にも衝突しそうな名前なんか腐る程ある 何のための名前空間だと思ってんのかと小一時間 どうせ標準ライブラリしか使ったことが無いようなド素人なんだろ
まぁ必要最低限のものだけimportしましょうっていうだけ 他言語と同じだよ
>>128 libzzz.a または libzzz.so とリンクするには gcc のオプションに -L 該当ファイルのパス -l zzz が必要。
て事も知らないなら入門書からやり直しが必要な初歩レベル
using namespaceが悪なのはヘッダのグローバル空間でかますのが絶対悪ってだけで それ以外では大概どうでもいい話
>>142 競合するかどうかは問題の本質ではない。
using stdをつけてstd::を省略したコードは、using stdをつけていない他の環境に持っていったときに動かない。
std::をつけていれば、どんなusingが使われていようと関係なく動作する。
using stdを使うべきではない理由はこれだけで十分。
せっかく標準規格化されてどの環境でも同じように動作するライブラリのポータビリティを阻害するのは長い目で見ればデメリットしかないと思う。
プロのプログラマでもないしstdやboost使う程度なんで名前空間汚染問題とか大げさにしか思えない 大したコードでもないのにstd::つけまくってるコード見るとアホらしくなる 職業や用途あるいは個々人の技量によって求められるものは違うでしょうに、十把一絡げに議論して意味あるの?
>>152 元の質問者が何も分かってないから突っ込まれているだけで、問題点とか自分以外の人がどう認識しているかを知った上で、使う使わないって判断は好きにすればいいだろうよ。
意味無いと思うなら参加しなければいいだけ 趣味なら好きにすれば
>>152 オレオレコードを一人で書いて満足するのが好きなら、別に止めはしない。
でもそんな主張をここでされても多分同意は得られないと思うよw
議論する気があるなら、みんなが分かるコードを書かないとだめでしょ。
>>152 >>142 を読み直せ
言わずに我慢してたけど、
てか今まで何度も言ってきたが最近C++数年かそれ以下の初心者が偉そうにしすぎ
初心者だからと貶したいんじゃない、自分が知らないことや先人(俺のことじゃないよ、念の為)への畏怖や敬意が全く無いから
>>142 の最後の行みたいな思い上がったセリフが出てくる
そういうやつが今後上達するかというと俺は首ひねるけどね
stdだけusingしてライブラリはusingしなければいいだけちゃうの?
それが都合がいいなら好きにすればいいんだよ 誰もstd名前空間は取り込んじゃいけないとは言ってない そんなのは個々の設計の意思決定と責任の話で、std取り込む奴がアホとか取り込まないのがアホとかいう話じゃない
ヘッダにusing namespace書くやつは許さんけど、実装部分では好きにさせてやれよ
>>151 「他の環境に持っていったときに動かない」って、どういうこと?
ソース丸ごと持っていくなら、ソースにusing namespace std;が含まれるから動くでしょ。
もしかして、ソースの一部だけコピペして持っていく場合の話?
「コピペでも動くソースにしなければならない」という主張はちょっとどうかとおもうけど。
>>159 俺もこれに同意
>>151 の主張はちょっと意味わからん
>>160 標準以外のライブラリの存在が全く想定できてない
自前のちょっとしたライブラリのヘッダでもusing namespace stdって書いてたら
その後or中でインクルードしたヘッダ類が全部巻き込まれて名前の衝突が起きうる
ソースでusingした後にインクルードした場合も同じ(これはあんま無いと思うけど
仮にライブラリとしてファイルが綺麗に別けられてても別のプロジェクトに移して動かない場合があるってのはこれのことでしょ
ヘッダーにインラインで書くときはstd::つけて、ソースには個別にusingしてstd::を省略するってこと? そんな面倒なことしてなにか良いことあるの?
あーすまん、ヘッダには一切書かないのならわかる ただ、標準と別のライブラリで衝突する名前があるならどちらかはusingしない、あるいは衝突するものはいちいち指定するかしなきゃいかんでしょ
>>166 衝突しないことがわかってるならいいけど、ライブラリのヘッダでusingしてたら
そのライブラリのユーザーは衝突する名前をグローバルで書けないんだよ
自分しか使わないのなら好きにすれ
させたくないならそれが出来ないようにルールそのものが無いはずだ でもルールがあるなら使っていいでしょう それが出来るようにそのルールがあるんだから それともルールはあるが使ってはいけないという宗教なの?
>>169 どうして0か1でしか考えられないんだ?
使うことでメリットがあり問題ないなら使えばいい。
問題あるなら使うな。
メリットデメリットがあるならトレードオフで判断しろ。
おれの職場ではコード規約でusing stdはもちろんその他の名前空間も省略禁止 ファイルローカルでaliasは可能というか推奨 基本的にコードは後で誰でもすぐ読めるように書く方針だからね 仕事で使うときはこんなもんだよ 似たようなの話でauto多用が読みやすいか読みにくいかは結構議論になる こっちはまだ規約化されてないな
関数の返り型にauto使いまくりなんですけどまずいですかね?
auto & shared_data = *this->m_data; とか多用してる
構造体メンバ間のパディングをコンパイル時に知る方法
>>175 #include <cstddef>
offsetof
auto導入によってハンガリアン記法が再評価の機運
>>156 流れ読んでないし本題には触れずにレスするけど同意
「ニワカなやつほど語りたがる」のは世の常だけど
C++ちょっと触っただけくらいの駆け出しのカスが
「C++は〜」なんて知った風に語ってるのたまにあるよなw
それも、スレに参加してるなかでお前一番素人やろってやつが
平然と調子こいてきたりするから驚く
すまないC++20の新機能諳じて言えない奴は例外なく初心者なので出ていってくれないか
>>176 めっちゃ構造体ネストしてsizeofで差分取るとか?
わからん
パディングの有無ならstd::has_unique_object_representationsでわかると思う どこにいくつあるかは難しい・・・
>>177 うわああああああ!!!これだ!これだやりたかったの!サンクス!
そうか0を対象の構造体へcastした後メンバアクセスしてそのアドレス値を取るのか!全然思い付かんかった!
俺に向けたレスかは分からんけど助かった!サンクス!
>>181 それ思い付いたんだけど苦行過ぎてやめてもうた…
>>182 あーalignofで上手く取るってのも有ったのか!使う機会があまり無いポンコツなもので気付かんかった!
>>183 うむむ?初耳機能だ
後で調べてみまする
皆さんありがとうございました!
メンバポインタの差取る方法もありそう 規格の保証はなさそうだけど
>>151 using を絶対に全く使わないのであれば、そもそも namespace の概念自体が
意味が無いと思いますよ。タイプ量を減らすことはとても大切だからこそ、
衝突しない場合には、using を使えるように設計してされているわけですから。
もし絶対に std:: を付けるのであれば、例えば、std::vector と書かずに
最初から StdVector などと固定の名前でも良かったわけです。しかし
それだと長くなってコーディング効率が下がるので、可能ならば
std:: を省略して vector と書けるように設計されているわけです。
それこそが namespace の思想なのでしょう。
>>173 usingを使わない方針は気持ちは分かります。しかし、usingを使い辛くなって
しまうのは想像力を働かせればSTLやC++の言語使用設計の段階から
最初から分かっていたはずで、そもそもSTLが最初からstd という
namespace に入れて有ること自体が余りセンスが無かった可能性があると
自分は思ってます。
1. std::string 2. StdString 3. CString 最も効率がいいのは、3 の CString でその意味では CString の設計者は センスが良かったと私は思っています。using を使って std:: を書かないように した場合、確かに何かのライブラリと衝突の危険性が出てきます。 ならば、標準のライブラリ(STL)は、デフォルトでは namespace の中に入れる べきではなかったのではないかとも思います。 namespaceは、たまたま衝突が起きた場合には、その時点で使うと助かる場合が あると思いますが、最初から入れてしまった事で新たな問題が入ってしまった 可能性があります。
>>186 namespaceってその名の通り名前空間を分割することで識別子名の競合を避けて、命名の自由度を上げる(楽をする)ための機能でしょ。
ある程度大きな規模のプロジェクトでは大変重宝するものだと思うんだけど、なんかものすごく偏った理解のしかたしてない?
>>188 CStringとタイプするには、shiftを押したり離したりしないといけないし、手間としてはstd::とそれほどかわらないと思うんだけどw
>>190 Shiftキーは同時押し可能なので速度が全然違う。
CStringの場合、実質Cの1文字が増える程度で済むが、
std::stringは確実に5文字分増える。
>>189 環境の変化での不安定さを避けるためにstd::を付けざるを得ないなら
命名の自由度は全く上がってません。
>>191 いやいや、実際はshiftを若干早くおしとかないと、cStringになっちゃったりするだろw
離す時も気をつけないとCSTringになっちゃったりするし。
それに最近のエディタ(統合開発環境)には補完機能が付いてるから、std::で候補が絞られる分、選択に有利に働く。
>>186 外から使うことだけしか考えてないみたいだけど、名前空間内の実装を読み書きしやすくする効果もあるでしょ。
>>192 命名の自由度があがるのはnamespaceの中での話だよ。
namespaceで囲っておけば、変数にhogeとか適当な名前をつけても競合する心配がなくなる。
>>195 namespace std で囲まれている事で気が緩んで hoge みたいな短い名前付けて
しまうことで、std:: を外すことが不可能になってしまう恐れが有る。
結局なんのための名前空間なのか分からなくなってしまうという。
外せない名前空間なら、std_ でも Std でも Stl を付けた方がタイプ量が
少なく済んだのに。
>>195 大丈夫だと思って i という一文字のグローバル変数を定義したとしよう。
すると、std::i としている場合には問題ないが、using namespace std;
とした場合、大変な現象が起きる。伝統的な for のループ変数と衝突
するから。
>>197 絶対に外さないなら namespace に何のメリットが有るの。
>>197 外さないなら、StdVector, StdList で良かったはず。
別に外さなくとも、その名前空間内で書くときは省略できるんで楽なんだけどな (ライブラリ書いてるときとか
>>193 それに、コロン(:)はキーが打ちにくい場所にある上に、同じキーを
二回連打しなくてはならない。これが時間がかかる。
>>201 作る側の意見???
普通、ライブラリは使い勝手が良いことの方が重要ですよね。
この世の名前空間はstdしかないと思ってるのかな? mylib::vectorとかyourlib::vectorとかを安心して作れるようにするための機能が名前空間だぞ
>>201 もしかしてアプリなどでは使わないのにライブラリを作ることだけで
満足している人たちが多いのでしょうか。
なるほど、それで stl や boost が究極にセンスの悪い代物になっているのかも
知れない。コンテナ類は、C/C++のリストの概念が全く理解できて無い人
が作ったとしか思えない。リストは構造がリストであればリスト足りえると
思っているのが頭が悪い。ポインタでアクセスできないリストはリストじゃない。
O(1)で済むところがO(N)になってしまっていて、stlは全くセンスの
悪い欠陥ライブラリ。
>>204 だったら MylibVector で十分。そのほうが短い。
接頭辞を変えたければ、grep置換すればいいだけ。wz grepで一発。
それともstlの設計者はgrep置換使ったことが無いんだろうか。
とても頭が悪い感じがする。
最初にusing mylib::vector;って書いとけば以後は単にvectorと書いたらmylib::vectorの意味になるんだよ vectorを100回使うならその方が短いだろ? 後でyourlibやmylib_ver2のvectorを使いたくなればgrep(笑)なんかしなくても最初のusing宣言を一箇所書き換えるだけでいい 名前空間ってのはそういう機能で、ただの接頭辞じゃねえんだよわかったか知恵遅れ
>>205 使うから書いてる、というか今後何度もソフト作るのに必要だから書いてるんだが
まぁあんたの言うような変な奴も居るだろうけどな
なんか大事な基本すっとばし過ぎで相手する気力も失せた
>>186 タイプ量を減らすなんてのは開発において些末なことだろ。通常は開発時間の多くは設計、思考に費やして、コードをタイプする時間の比率なんて誤差程度のものだよ。
お前さんのプログラミングではほんの数文字のタイプがそれほど重みがあるのか?もしかして頭使わずに写経だけしてるのか?
>>200 どうして外すか外さないかの二択しかないのか?
外すことでメリットがある使い方をするときは外せばいいよ。
外すための方法がいくつかあるのは分かるか?その書き方の違いや、それを使う場面や文脈で良し悪しが変わるというのは理解できるか?
お前さんは名前空間に関する仕様の理解と現実の開発作業の経験が少ないのにその自覚がなく、自分の考えに凝り固まってるから議論が進まない。
>>206 自分のコードを再利用しやすくするためにライブラリ化する。その歳に名前の衝突を容易に回避できるよう名前空間を使用する。
名前がぶつかるからって安易にコピペして置換するなんて愚の骨頂だろう。
そんなやり方を良しとするというのは、規模が小さく保守の必要もない使い捨てのような小さなプログラムしか作ったことがないのだろうか。
長文なのに書いてある事はスカスカだな 腐ってもプログラマーの端くれなら言いたい事は短く簡潔に書いてくれ
だいたい標準ライブラリがvectorとあstringみたいなきわめて衝突しやすい名前を使っているのが悪い 諸悪の根源すぎて死ぬ std_vectorとかstd_stringとか衝突しにくい名前にすれば済んだ話 しかしそれだと標準ライブラリ内部のコードがダサくなって逝けてないから、という理由で導入されたのがstd名前空間。 所詮センスの問題なためにいつまでたっても議論が収束しない ここはRustのパッケージのようにパッケージが公開/非公開の唯一の境界、みたいに割り切って 名前空間の設定に論理的必然を持たせたらよかったんじゃ…
だいたいfoo::some_symbolと書いたときfooがクラスのときご名前空間のときがあって、 それぞれやれることが微妙に違いもあるがだいたいオーバーラップしているとか嫌すぐる… 疑問に思わないのはC++に脳が汚染されている証拠 後方互換性命で変えるな派と後方互換性を失っても改良すべき派の合意が見られない事案については 前者が勝って後者は追加で我慢するというWIN-win決着で永遠に先送りされつつ混迷だけが深まっていくのがC++の宿命
namespaceも分からない初心者が上級者面して住み着いてるのか・・・
なにおうnamespaceがイミフな言語機能であることぐらいはよくわかっとるわ! 標準ライブラリ内部のコードにおいてもほとんどがテンプレートであるために、 using std;することが許されない つまり、std_vectorやstd_stringという風に名前を長くするのに対してなんのメリットも提供されていない
訂正orz; 誤: using std; 正: using namespace std;
関数名_ローカル名 ってすれば全部グローバル変数でいいだろっていう主張?
数多くの言語で採用されているnamespaceが意味不明って・・・
なんでこういう馬鹿が定期的に沸くんだ ちょっと調べればなぜこんな機能が必要とされたか位わかるだろ 名前空間の問題なんてC++固有の問題じゃないのに
complex<__float128>ってできないの?
インスタンス生成時に絶対に決めなきゃいけない定数をテンプレートパラメータにするかコンストラクタに渡すか迷ってる 両者にはどういう思想の違いがありますか?
なんかLinus TorvaldsがC++ディスってる記事でnamespace絡みで 「Cならmy_foo()って名前にするね、やっほー、grep my_fooが機能するぜ!」 みたいな話があったような気がするんだけど検索しても見つからない(´・ω・`)
>>218 aaa::bbb::ccc::ddd みたいな名前が大量に必要になったりして、
STLの設計者は設計が下手だと思う。
>>231 あーなるほどusingも知らない初心者ですか。
ここはまだ早いの初心者スレへどうぞ
今std::chronoとかstd::filesystemとか標準の名前空間も細分化するようにしてきてるからusing namespace std;の影響もそこまで酷くならないかもしれない
stdの中に全部ぶちこんであるのが問題 std::header名の名前空間に入れて、std内でusing namespace header名していればいいのに std::xxxでも使えるし、using namespace std::header名すればそのheaderの中身だけが省略して使える
>>232 なんでも初期状態で使いやすいことが重要。
使いやすくするには各自でやれというのは設計が下手な証拠。
匿名性掲示板が困るのは、何かの欠点を指摘するとそれを作った当事者らしき人が 全否定をしてしまうことで話が深まらないこと。 同意する人がいればもっと良いライブラリを探す話とかに発展できる かも知れないのに。
ABI互換が問題ならextern "C"みたいに extern ::std みたいなので、マングリング時の名前空間を強制できる機能つければなんとかならんかね
>>237 お前の「使いやすい」と世間一般の「使いやすい」が一致してないというだけだろう。
お前の「こうあるべき」と世間一般の「こうあるべき」のズレが大きいから、今のC++はお前にとって不満の大きいものになっているんだろう。もしかすると家庭や学校、社会全体も。
>>240 そういう話がやっぱり、「ポジショントーク」だと思うんだよ。
そこまでして人の意見を全否定するには何らかの背景事情があると
しか思えない。
>>238 C++の仕様策定に関与したような人がこんなスレを覗いて低レベルな指摘にわざわざ反応するわけないだろう。想像力が豊かだな。
>>242 でも、オイラはそのくらいできるくらい優秀だよ。
暗に陽にアメリカを褒めちぎって日本をけなすような人が5chには多い。 それで日本はめちゃくちゃに成ったんじゃなかろうか。 例えば「日本製スマホが全然駄目」などという説が5chでは大量に流布 されている。実際、そういう情報を信じて損する人は多かろう。 大問題だ。
>>237 だからお前みたいなやつのために
名前空間省略する仕組みあるでしょ?
何が不満なのさ
誰も書かなかったので仕方無いので漏れが書くが、namespaceの唯一の便利な使い方は(「唯一の」だ 、すでに衝突したあるいは衝突不可避なソースコードAとソースコードAを namespace a { A } namespace b { B } と囲う等して分離できる ( こともある ) というだけやんけ それとて完全には果たせないというあたりがいかにも行き当たりばったりで中途半端な言語要素感を醸し出してゐる (中で::fooで呼んでたり入れ子のnamespaceを外から呼んでたりのケースは救われない
てかnamespaceは色々中途半端な点はあるが、便利に使える機能だろ 無いと物凄く不便 using namespace stdは使わんな
名前空間ネストして書くのが超めんどくさかったがようやく改善するとか
関数呼び出し時に宣言が必要か否かってCとC++では異なってたりしますか? 規格書読めないマンで申し訳ないのですがgccだとC/C++でそれぞれOK/NGと結果が異なります
>>222 は、FSMとPDAの区別もつかない くるくる ((ヽ三/) (ヽ三/)) (((」) ___ (L))) / // ノヽ\\ \ ( </ (● ●)\> ) \| ⌒(_人_)⌒|/ \  ̄ / パーだおwwwwww n「「「| 「「「h |ー ⊃ ⊂ ー| >ーノ___ヽー< / // ノヽ\\ \ ( < o゚(● ●)゚o> ) \| ⌒(_人_)⌒|/ \ |┬| / ヽノ お前らが名前空間で議論したところで何のメリットもデメリットもない事に気づけ、そしてRustを使え ゴミ言語
C++じゃないと出来ない事があるのでRustは使えん。
>>255 (そのロジックを)Rustで書くことが出来ないと表現した方が正しそう
Ristがチューリング完全かどうかについては誰もが口を濁すが それはそうとして、これからはRustでプロトタイピングしてC++のコードを上司には提出するという スタイルに移行するのではないかと思う
>>234 2成分の vector<__float128> を使うことにしました
>>166 名前のバッティングが防げてコーディングの手間が減る
いいことばかりじゃん
namespaceそんなに不便かのう。 他の言語もやたらとパス掘って面倒なことになってるが。 pythonでも import matplotlib.pyplot as plt みたなのあるしな。 C++でやるなら namespace plt = matplotlib::pyplot とできるわけで、他の言語とにたりよったり
>>264 using namespaceによって名前のバッティングのリスクはむしろ増す
なぜなら、namespaceの中身を記述する中の人がnamespaceで守られているつもりで短い名前を使いまくることがあるからじゃ
つまりnamespaceの中の人の思惑に反してusing namespaceしたとき、
namespaceは本来の言語要素としての目的とは真逆の危険なブツ(衝突の加速器)に早変わりする。
ファイルスコープでusing namespaceして書いたコードは他にもっていったとき地獄が始まる
ていうか同じものに複数の表記を許すのはそもそも美しくない
以上の理由によりusing namespaceは(特にファイルスコープでは)使ってはならない
C++から削除したほうが良い
cout 自体使わないけど、昔のCだったら、#include <stdio.h>さえしとけば、 printf()もputs()もputhcar()もgetc()もfputc()もfprintf()もsprintf()も vsprintf()もvprintf()もfopen()もfread(), fwrite(), fgetc() もみんな そのまま短い関数名で使えたのに、今のC++だと、もし、 using namespace std; を使ってはならないなら、 using std::cout; みたいな事を使う名前の文だけやらなくちゃいけないのはかなり非効率だと思う。
>>267 誤:みたいな事を使う名前の文だけやらなくちゃいけないのはかなり非効率だと思う。
正:みたいな事を使う名前の分だけやらなくちゃいけないのはかなり非効率だと思う。
>>265 namespace(やパッケージ名やモジュール名)のエイリアスえは安全性とタイピング量の効率の良い妥協点だとは思う
ただし、ファイルスコープでエイリアスしたコードを他に持っていったとき(ry
ちなRustではモジュール名の別名の付け替えはできないが、using namespaceみたいなことを
してほしいのかしてほしくないのかを中の人がモジュール名の末尾の階層を「prelude」にするという慣例で凌いでゐる
>>266 あの、.hでは使わず.cppで使う話についてなんだが
>>269 だからなんでヘッダでそういうエイリアスやらを使う前提で話してんだ、おまえはバカか
.cppの方は読み込むヘッダがそこに書き込まれてるんだからusingしようがaliasしようが問題ないだろと。 どこで読み込まれるかわからないヘッダに使うことと分けて考えられへんのかね、このバカは
>>270 >>271
.hでは使わず.cppで使う話してるんだけど…
ひょっとしてファイルスコープでusing namespaceするというのを.hで使う意味だと
この暑さで短絡しているのでは…
大部分のここの人達の主張は、直接 std::vector, std::list, ・・・ を書くか、それが嫌なら、 using std::vector; using std::list; ・・・ を延々と書けというんですよね。後者のやり方は、Java の import 文で import com.sun.xxx.xxx.class1; import com.sun.xxx.xxx.class2; ・・・ などとするのに似ていますが、それが一番の Java の欠点でも有る部分なんです。 そこを C++ は取り入れてしまった。
>>274 Javaのimport文も一応「*」でusing namespaceと同じようなことができるはず…
問題なのは、中の人の意図がusing namespaceしてほしくないケース(namespace内で短い名前を使いまくっている(
>>266 ))
においてもusing namespaceできてしまうことにある
stdつけるのそんなに嫌かね? 1つなら良いじゃないかと思う 長い奴は別名つけりゃいいし IDE使っているとnamespace付きの方が候補が絞れてむしろ便利じゃね ADLでつけなくても呼べる場面であったとしても
>>276 IDEのエディタは使ってないので補完機能は使わない。
>>275 なにが困るんだっての。
名前が被ったらスコープ内での命名が優先されるが、読み込んだヘッダの中の名前に影響は及ぼさないだろ
そして、隠蔽された名前にはnamespace名を使えばアクセスできるんだから何ら問題はない
>>279 stdじゃなくてもalias作れば良いだろ
class scopeでnamespace alias作れないのは結構面倒だが
>>280 の言っている「問題にならないケース」はusing namespaceしなければ
そもそも名前が被ったりしないことから尻拭いの手間が生じないケースなので
using namespace擁護としては意味がない
既存の型と短い名前の組み合わせでも名前が衝突しないようにnamespaceという仕組みを設けたというのに
その崇高な理念を忘却しし、衝突させておいてから尻拭い可能だからおk、というおよそ合理精神0のが
>>280 の主張
>>280 その話とは関係ないかもしれないけど、以下のようなことがあった。
その時には、理由は追求しなかったんだけど、昔、Javaで
impot com.sun.xxx.xxx.*;
impot com.sun.yyy.yyy;
・・・
みたいなことをやった時、* を付けたことによって javacでコンパイル時に名前衝突が起きた
ことがあった。それで * を使うのをやめて個別に直したら衝突しなくなった。
最後の方の名前は同じで、それを限定している名前、例えば、
zzz.aaa.ccc;
zzz.bbb.ccc;
みたいなのがあって、ccc の部分が同じだから ccc だけでアクセスできるようにした場合に
衝突が起きたのかもしれない。
>>283 Javaの仕様も忘れてしまったけど、
import zzz.aaa.*; // たまたま zzz.aaa.ccc というのが有ったとする。
import zzz.bbb.ccc;
↑のような場合に、ccc という名前が衝突するのかも。
>>274 > 大部分のここの人達の主張は、直接
>
> std::vector, std::list, ・・・ を書くか、それが嫌なら、
これはよい
でも
> using std::vector;
> using std::list;
> ・・・
>
> を延々と書けというんですよね。
これを言ってる人いたっけ?
名前空間を明示するというポリシーに反してるからおれは使わないな
自分のコントロール下にあるところで機能を使うなってのは自分が上手くつかえないだけの話だわな。 ブロック作ってブロック外と同じ名前の変数作ることすら禁止しそうな勢いだな。 ヘッダで使うなってのは自分のコントロール範囲外でバッティングが生じるからだ。
そもそも名前空間の柔軟性は、C++が最強だから。 文句言うのは筋違い。
そもそも標準のライブラリなので、namespace std の中に入れる必要なかった。 下手に入れてしまったからむしろ std:: を外したときに衝突する問題が 起きる可能性が出てきてしまった。
>>288 標準ライブラリとバッティングさせるようなバカはその場で処刑したほうが良いのでは。
標準ライブラリくらい暗記しとけよ。
>>289 using namespace std; としたときに衝突するライブラリが
あるそうですが。
>>290 あれは許せんな。
いや、許してはならない。
いつかレッドモンドに爆撃機を送り込むべき。
そういえば、min(), max() は C の時代、確かマクロ実装版が基本だったり して複雑なことになっているのかな。よく知らないけど。
そこでBOOST_PREVENT_MACRO_SUBSTITUTIONですよ BOOST_PREVENT_MACRO_SUBSTITUTIONを崇めよ
関数は関数呼び出しが遅いから使うなマクロにしろ 処理は全部mainに入れろ という恐ろしい時代から引きずってるから仕方ないといえば仕方ない
だったら STL の方が、std::max とかじゃなくて、 std::smax とかにすべきだったような気がしますが。
NOMINMAXしたらしたでgdiplusでエラーになったので、仕方なくusing std::min;using std::max;を書いてしまった。
>>288 どんなusingがされている箇所でもstd::をつけさえすれば確実に標準ライブラリにアクセスできるんだから、記述の一貫性を保つのに役立つよ。
元々 min(), max() は非常に古い C時代から #define されているマクロですよね、 std::min(), std::max() と書いても結局マクロ展開されてしまうのでは ないでしょうか???
>>298 でも実際に引っかかったら、何でこういうことする!マイクロソフト死ね!!っておまえも思うはず。
STL の方の min(), max() を使いたい場合は、 (min)(a,b) (max)(a,b) でいけるようです。C/C++ の前処理層によるマクロ展開は マクロ関数名( という並びが有る場合にのみ展開されますので。
>>302 いや、むしろ逆に、std::min の設計者の方がCの常識を知らない人だな、
と思ってしまいます。
そもそも、min(), max() マクロは、1980年代のC言語の時代から有るよく
知られたものなので、後から登場した C++ 標準ライブラリは、それが
有る場合にでも当然問題なく使えるようにしなくてはならなかったが、
そうなってません。それはどちらに原因があるかは明確です。
>>301 左様
.cppのヘッダファイルをインクルードし終わった以降の適当な場所でおもむろに
#undef min
#undef max
インクルードしたヘッダファイルにマクロ版のmin()、max()に依存したマクロが存在せず、
かつマクロ版のmin()、max()を使わない限りにおいてこれでおk、
適用条件訂正orz
正: マクロ版のmin()、max()を使わない限りにおいてこれでおk、
インクルードしたヘッダファイルに含まれるマクロ版のmin()、max()に依存するマクロ経由で
間接的にマクロ版のmin()、max()を使おうとした場合はコンパイルエラーになるからワカル
そうなった場合の処置は知らんが、コンパイルが通ったら
>>305 の方法で安全なはず
一番安全なのはこれだってboostの長年の結論だから max BOOST_PREVENT_MACRO_SUBSTITUTION (a,b)
マクロ版 min(), max() が #define されている状態でも、 #define smin (std::min) #define smax (std::max) としてしまえば、smin(a,b), smax(a,b) と書くだけで それぞれ std::min(), std:max() が使えるでしょう。
>>307 正しいがIQが高すぐる答案
>>308 sminやsmaxという名前が衝突したらどうすんじゃ…
>>267 ふつうに std::cout << "hello, world!" << std::endl;
と地の文として書いていますが、そういうのは駄目なのですか?
std::を書くと死ぬ人が発狂してるだけなので、std::を普通に書ける人にはしょうもない話
これはVisual Studio 2019のバグだろうか? C++17想定。Wandboxでは問題なし。 namespace user::math::literals { constexpr double operator""_deg(long double deg) { return deg * 3.14 / 180.0; } }; struct Test { template<typename T = double> constexpr double test(T t) { using namespace user::math::literals; return 1.0_deg * 8.0; } }; int main(){ } //error C3688: リテラル サフィックス '_deg' が無効です。リテラル演算子またはリテラル演算子テンプレート 'operator ""_deg' が見つかりません 発生条件はクラス内テンプレート関数でユーザー定義リテラルを含んだ式 return 1.0_deg * 8.0;をreturn 1.0_deg;に変えると問題ない
普通にビルドできたけどプロジェクトのC++言語基準をちゃんとC++17にしたか?
>>288-289 ,
>>291-292 だからベクトルとかでもいきなり衝突するっつってんだろバカチンが
どんだけ経験不足なんだお前らは
using namespace はその名前空間の中の名前を私が責任持って現在の環境に導入しますという宣言だ 中身を把握してないくせにそんな事して事故った奴が全部悪いんであって、使われた側には責任はない stdとて例外ではない
>>316 使われた側の未来のふるまいまで予測してnamespaceの中身を理解などしていられない件について:
namespaceの正しい使われ方の下では、aというnamespaceに将来どんな名前が追加されようとも
bというnamespaceの名前とは衝突しないはずである
ところがaとbをusing namespaceしてしまったが最後、誰にも責任が持てないカオスが訪れる
これはnamespaceが無かったころの言語に先祖返りするだけではなく、より悪い状況を招くことに注意。
namespaceの利用によって、open、close、copy、find、vector、list、string、.....といった「自然な」名前がいっぱい使用されるからである。
namespaceは崇高だが、using namespaceはそうされることを意図されたnamespace意外には邪悪すぐる
>>314 再インストールしなおしてプロジェクトの設定をC++17なのを確認してもエラーが出た
うちの環境だけか・・・
Visual Studio 2019 Community Version 16.2.0
>>318 こっちも16.2.0で、ワークロードは「C++によるデスクトップ開発」のオプションに全部チェック
他はQtツール入れただけ
>>317 完全に同意
そういう事態が起きないと確信できるほど中身を理解してるnamespaceか、起きても問題ないほど狭いスコープか
そのどちらかでしか使ってはいけないものだ
using namespaceというのはそういう乱暴な機能
訂正;
語: namespaceは崇高だが
正: namespaceは崇高かもしれないが
>>316 みたいな無根拠で実害のある精神論に後退するぐらいなら、
namespaceで修飾するかわりに接頭辞をつけた名前を使うという
>>228 な方策も現実の選択肢足りえる
(
>>228 がネットをgrep my_fooして見つからなかったのは不幸な事故だが
>>321 同意した直後に正反対のこと言うのやめて?
316のどの辺が精神論で有害なのさ
C++だけの話でもなくて、pythonのimport * がカスと言われてるのと本質的に同じだろ
>>316 の精神論にはある意味同意するけどな
(ヘッダでの名前空間取り込みも、ある名前空間に別の名前空間を取り込む場合など、合理性があるなら設計上の選択の一つと言えるし
その辺は設計者の責任だと思う)
あと
>>298 ,
>>301 はバカチンじゃなかった、すまんかった
using namespaceの話はも止めたら? 使いたい人は使えばいいし 使いたくない人は使わなければいい でいいじゃん 大した問題じゃないだろ
ダメに決まってるだろw Coding Standardの話なのにw
どうでもいいだろ C++のようなアレな言語を扱う上では些細な事さ
そもそもプログラミングは間違ったことを信じている人がはっきり損をする世界 (ことあるごとにエラーが多発するとか作成に余分な時間がかかるとか完成品の質が悪いとかの話で) リアルで誰かと作業するならともかく ネットの向こうの間違ってる誰かなんて放っておいても損を勝手に積み立てて自らつぶれていくものだ
おれはね C++はね 正しく扱うのに本当にコツのいる言語だと思うんよ そんな中using namespaceは割とどうでも良いよね 俺は使わない派だが、使いたければ使えばって感じ
確かにどうでもいいな プルリクで簡単に見つかるから というかコンパイルや静的解析でエラーにする方法はないかな
>>327 正確にはそれをリカバーする人だがな。
バカはリカバーされて成り立ってることすら理解せず同じことを繰り返す。
min(), max() マクロのような件は別として、標準的なライブラリであるところの std::系の名前は、using namespace std; してもそんなに問題ないということは 無いんですか??? 他のライブラリの名前空間 XXX も同時に using namespace XXX; した場合に もし衝突が起きる場合は、using namespace XXX; だけはしないようにすれば、 特に問題ないような気がします。実際やってみたことが無いので経験者の意見を 聞いてみたいです。
個人の趣味プログラミングならご自由に 仕事ならコーディング規約にあわせる コーディング規約作る立場なら、チームにバカが混ざってる前提で非属人的になるようにルールを設ける で経験を積めば積むほど自分がバカであることが身にしみてわかる そういうことだよ
>>331 別に衝突しなくても問題は起こる。
using namespace stdで書いたコードをヘッダーのインライン関数に持って行く必要が出た場合とか、
using namespace std;
#inlucde "...."
となってしまっていてたまたま動いていたコードを、別の箇所でincludeしたときにエラーがでまくるとか。
std::くらい書けで終わる話をいつまで続けるつもりだ
>>335 10万行とかのソースでそれをやりますか?
>>336 ところどころについてたり、ついてなかったりするくらいなら、最初からstd::つける方がはるかにマシ。
普通頻繁に使うライブラリをusingするだけで、名前空間ごとはやらんだろ chrono使う時はたまにやるけど
ていうかstd::程度を書くのが面倒な人はC++向いてない
size_tにだけ頑なにstd付けない人いるんですがなにか理由あるんですか
>>336 1ファイルが10万行じゃないだろ(1ファイルならそこから直せw)
>>341 size_t は大昔からあるのと明らかに型名っぽい名前なのでわざわざバッティングさせる奴もいないからじゃね?
>>341 size_tはC言語時代から存在してるから、もともとnamespace関係なく使える
おれも知らんかったなまぁ言われてみればたしかにそうだなsize_tってネィムスペィス上でも定義されてたのか今度から一貫性のためにstd::つけとこうかな まぁ、editorのちょい設定いじるだけなんだがな(´・ω・`)
>>342 1ファイルの行数は関係有りません。
要は大きなプログラムを書いているとき、string で済むところを
全ての箇所で std::string と書くのかということです。
void func(std::string &somename, int a, int b) {
std::string aaa;
aaa = somename + "abc";
}
struct Txxx {
std::string name1;
std::string name2;
・・・・
};
↑のようにタイピングするのは余り賢いやり方だとは思えません。
そんなに面倒ならusing S = std::stringでもすればいいじゃん
過度に賢く振る舞おうとして滑ってるパターン それくらい普通に書けばいいじゃん
こういう奴って馬鹿丁寧に一文字ずつ全部打ってんのかね 補完って機能の概念がない世界に住んでんのかしら
>>348 > 1ファイルの行数は関係有りません。
> 要は大きなプログラムを書いているとき、string で済むところを
> 全ての箇所で std::string と書くのかということです。
俺は書く。
> ↑のようにタイピングするのは余り賢いやり方だとは思えません。
お前の感想はどうでもいい
>>348 高々数文字のタイピングに拘って名前空間のメリットが理解できないという主張を繰り返すお前さんの行動は、余り賢いやり方とは思えません。
>>348 だから何のために名前空間があるのかググれよ
別に好きにやればいいけどお前がいつもstd名前空間取り込んで便利だと思ってるのは
標準ライブラリしか使ってないからだ
無駄だと思うならtypedefやusingすりゃいいじゃないか そもそもstringって名前長すぎだろ
usingである程度の広さのスコープでやるんが正解だろ。 まあこのある程度の広さってのが人によってだいぶ違うだろうが。
少なくともstdは普通using namespaceしないよね でかすぎる 最近良くやるのは namespace fs=std::filesystem; だな まあこれもヘッダで使うなら独自namespaceに入れてからだが
using namespace std;をグローバルなスコープでやってしまうと ソースコードを他に持って行ったとき困る fooをstd::fooに変換するのはfooの種類が100台になると並みのエディタの置換機能では手間的にアウト 一方std::をとるのなら簡単にできる std::をつけるのは将来への投資といえる
初心者除ける、上級勘違い中級者こそ、出て行ってくれないかな。 本当の上級者は、プログラミング初めての人でも、優しくあたってくれますよ。
>>360 = not(
>>348 )
ですが。
証明方法は無いですから、わかりませんけどね。
>>342 各1万行30ファイルは、セーフですか?
入れ子となったクラスの内側のクラスから外側のクラスのprivateメンバにアクセスできるという 内側のクラスの特権はJavaやC#と同じくC++にもあるから、これを使って大規模なStateパターンでも書いた日には ソースコードの行数も大規模にならざるおえない このとき上記3言語の中で唯一大規模にならずに済むのはクラスの分割定義が可能なC#だけ
昨今のプログラミング用語における入れ子は界隈に限らず日常的に使われているが プログラミング業界では特に再帰的構造を指す場合にも多く使われる そこに非常に現代的な特殊用語たる「出し子」が加わると 一般人は入れ子と出し子が対になっていると思い込む
スコープにあった変数名の長さにするべきとかそういうのお前らは習ってねーの?
そういう感覚的なルールいらない チェックできないルールはなくていい
>>370 感覚的な部分を必要とすべきでないなら全てアセンブラで書けばか。
>>370 チェック出来るルールに完璧に沿って書けてるボクちゃん偉い!エッヘン!
ってこと?
ユーザーからしたらクソの役にも立たねーよそれ
>>367 1行で2クラス以上定義しないという原則を守る限り、30億状態あったら外側のクラスはどうがんばっても30億行未満では書けない
この場合でも30億行未満で書けるのは分割定義できる言語だけ
また、内側のクラスを使わない普通のStateパターンなら30億ファイルに分割してかけばだいたいおk
(1状態から遷移し得る状態の数による。30億状態のどれにでも遷移しえる状態、
みたいな極端なやつはさすがに遷移先状態クラスの#includeで30億行になるが
>>368 おk
それは設計の問題でしょ 30億通りのstateパターンで設計する方が悪い 言語の問題じゃあないな あり得ないヘンな例を持ち出してdisる詐欺師の方法だ
>>359 ファイル単位でそのまま使えや
コピペして改変部分があるとか当たり前のこと言うなよwwww
コンパイル時に発覚する程度のエラーなら許容範囲でしょ。
c++で想定外の場合にエラーメッセージとその行数を出して終了させたいのですが、 どのようにしたらできますか? 下記のようにしてもexitした行数が出ません。。 ::fprintf(stderr, "error.\n"); exit 1; perlのdie()のようなものをイメージしています。
::fprintf(stderr, "error. (line: \d)\n", __LINE__); とか
丁寧にエラーメッセージ出すよりデバッガでバックトレースかけた方が早かったりするのは内緒
右辺値参照ってconst参照という認識でOKですか?
>>382 moveで中身を奪い取るからconstじゃだめよ。
>>381 そりゃデバッガ使える状況ならその方が速いことは誰でも知ってるだろw
>>380 その方法で目的の動作ができました。
行の最後にexit入れたら一行でかけて良さげな感じです。
ありがとうございました。
::fprintf(stderr, "error. (line: \d)\n", __LINE__); exit(0)
>>381 ,384
バックトレースというものを知らなかったのでググりました。
色々なものがあるようですが、gdbの下記程度の使い方なら自分でもできそうなので
これをちょっとづつ使ってみようと思います。
https://rat.cis.k.hosei.ac.jp/article/devel/debugongccgdb1.html ググってもなかなか出てこないが__LINE__はlong型だったと思った!
>>386 intじゃないの?
まあクロスの場合開発環境側のintな気もするが
intでダメなファイルとかそもそもコンパイルできねーだろ。
>>387 > まあクロスの場合開発環境側のintな気もするが
そんなアホなw
いや、多分そこまで考えてないから、コンパイラ上ではintもしくはsize_tで マクロ展開時は文字列化して接尾の型指定とかつけないだろ 勝手につけられると逆に困るし
int型はターゲットアーキテクチャーで一番自然な型というのが本来の意味なのでソースコードの最大行数と関係する理由が無い C++の最新規格ではどうなったかわからんが、longは規格上32 bit固定なのに対してintは16 bitのアーキテクチャーが有り得るはず
longが32bit固定なシステムは64bitでは異端じゃね まあwindowsはLLP64っぽいが
バイナリファイルを一度に読み込もうとしています。
圧縮ありファイルと圧縮なしファイルを以下のように判定して読み込もうとしているのですが、
ファイルの全てを読み込む方法がわかりません。
@Aはどのようにしたら良いですか?
http://codepad.org/FwYwQ62R std:: これ自体は大した量ではないとは思うけど これが何百何千と書かないといけないなら省略できる方法は必要だと思う 省略して且つ安全で簡単な方法が無いのが問題なんだと思う ここまで読んででusing宣言を書き連ねたファイルを用意して 関数定義の次の行で#includeするのが今の所一番良い様な気がした const何かも余りに書きすぎるので これも何らかの形で省略できる記法を搭載できないのだろうかとは思ってる classのpublic: みたいに const: とかするとその後は記載しなくてもconst宣言になる みたいな方法を搭載したりはしないのか? と何時も疑問に思う
>>396 constこそusing書き連ねたファイル用意してincludeすればいいのでは
using cchar = const char;
using cuchar = const unsigned char;
using cint = const int;
using cuint = const unsigned int;
>>396 その疑問の答えは、あなたが具体的な提案を標準化委員会に持っていかない理由の答えと同じでしょう。
>>397 ありがとうございます。
とりあえず圧縮なしの方は以下で取得できたようです。
ここで一点疑問です。
mallocの値がぴったり正しいかの確認をしようと、下記5行目のdatasize+1を-2や-3にしたのですが、
printf()で最後まで値が正常に出てきます。
datasize-3としてもたまたま連続して拾っているだけなので問題ありだと思うのですが、
malloc(datasize)ではなく、malloc(datasize+1)でぴったりメモリ確保ができているのでしょうか?
unsigned char* data;
long datasize;
fseek(fp, 0, SEEK_END);
datasize = ftell(fp);
data = (unsigned char*)malloc(datasize+1); // +1を-2, -3にしてもprintf()では最後まで正常な値が出てくる。
if( data == NULL ){
exit(1);
}
fseek(fp, 0, SEEK_SET);
fread(data, 1, datasize, fp);
fclose(fp);
for(int i=0; i < datasize; i++){
printf("%02x\n", data[i]);
}
割り当てされてない領域に書き込むというのは、C/C++ではあり得る。 そこに他に意味のあるデータがあれば、そのデータは壊れる(データ破壊)。
>>402 処理系によるけど大抵の処理系では指定されたサイズをきっちり確保とかはしなくて16バイト単位くらいで確保する
なのでそのdatasizeの値によっては-15とかしても大丈夫な場合すらあることがある
もちろん動作は保証されない
> malloc(datasize)ではなく、malloc(datasize+1)でぴったりメモリ確保ができているのでしょうか? malloc(datasize)で十分、malloc(datasize+1)だと1つ余分 freadでもprintfでもdatasize個までしかアクセスしていないので
昔みたいにメモリ枯渇なんてそうないし誰かがデータ破壊やらかして休みに呼び出し食らいたくないので16バイトくらい余計に確保しとこ
>>404 malloc()は数を指定していて、for分でアクセスしているdataは配列だから最後はdatasize-1ということですね。
僕の理解と合いました。
malloc(datasize)とします。
ありがとうございます。
次にgzipの全読み込みも調べています。
とりあえず下記でout.dbと展開後のaaa.dbのcksum値が一致したのでちゃんと読み込めたと思います。
※1のところで配列に格納すれば良いと思うのですが、最初は配列の数が確定していないので
配列数を決定することができません。
読み込むファイルサイズはギガバイトクラスの大きなファイルなので、なるべく速度を維持したまま
一つの配列に格納したいのですが、どうすれば良いですか?
FILE *wfp;
gzFile rzp;
unsigned char buf[8192*1000] = {0};
rzp = gzopen("aaa.db.gz", "rb");
wfp = fopen("out.db", "wb");
while((cnt = gzread(rzp, buf, sizeof(buf))) > 0){
fwrite( buf, sizeof( unsigned char ), cnt, wfp );
※1 ここで全データを一つの配列に格納したい。
}
gzclose(rzp);
fclose(wfp);
gzipって全部読まないと展開後の長さ分からないんじゃね 2パスにするとか
qiitaでさC++のタグ検索したらcppreference.comが公式リファレンスと書かれてたけどここ公式なの?
>>413 https://ja.cppreference.com/w/Cppreference:FAQ このサイトの背後にいるのは誰ですか?
cppreference.com は世界中の C++ 愛好家のグループによって作成され、メンテナンスされています。
>>412 コメントありがとうございます。
全部読む以外に調べる方法は無いんですね。
ということでrealloc()で拡張していくことを考えてみました。
下記で作られた解凍後のデータがgunzipで解凍したものと一致したので大丈夫そうです。
ありがとうございました。
#define MAX_BYTE 8192*1000
data = (unsigned char*)malloc(MAX_BYTE);
rzp = gzopen("aaa.db.gz", "rb");
long data_size = 0;
while((cnt = gzread(rzp, data+data_size, MAX_BYTE)) > 0){
data_size += cnt;
data_new = (unsigned char*)realloc(data, data_size+MAX_BYTE);
if( data_new == NULL ){
free(data);
::fprintf(stderr, "拡張失敗\n");
exit(EXIT_FAILURE);
}
// アドレスが変化した場合
if( data != data_new ){
// free(data); // 元オブジェクトは解放済みのため不要
data = data_new;
}
}
gzclose(rzp);
// 解凍後データを書き込み
wfp = fopen("out.db", "wb");
fwrite( data, sizeof( unsigned char ), data_size, wfp );
fclose(wfp);
>>415 そんなでかい領域をreallocすると何度もコピーするはめになるから
>>412 の言うように2パスにするか、各領域をリストで繋いて最後に一気にコピーするようにした方がいい
>>416 2パスをググってもそれらしいものがなかったのですが、どういうものなのでしょうか?
あと、「各領域をリストで繋いて」というのはvectorに追加しながら最後に連結するということでしょうか?
>>417 > 2パスをググってもそれらしいものがなかったのですが、どういうものなのでしょうか?
1回目(Pass 1)ではデータの格納はせずにサイズだけ取得する
合計サイズ分を確保して2回目(Pass 2)で実際に格納するってこと
> あと、「各領域をリストで繋いて」というのはvectorに追加しながら最後に連結するということでしょうか?
そう言うこと
でかいデータはコピーにも時間がかかるからできるだけコピーしないようにした方がいい
>>417 2パス良さそうですね。
gzread(rzp, data+data_size, MAX_BYTE)
のところを下記のようにNULLにしてもちゃんとファイルの最後まで動いているようなのですが、これがデータ格納せずにサイズを取得するということでしょうか?
gzread(rzp, NULL, MAX_BYTE)
すみません、NULLだとそもそも一回も取得できずに終わっていました。。 データ格納せずに一回ファイル精査するのってどうするんでしょうか?
>>420 固定長のバッファを1つ用意して、そこに上書きしながら繰り返し読み込めばいい。内容は上書きされて読めなくなるけど、読み捨てるつもりなので気にしない。
(最終的なところに)格納しないってことな 適当なバッファを1つ用意して毎回そこに格納しとけばいい
>>421 ,422
そういうことですか、理解できましたありがとうございます。
vectorだって償却定時間なのに ホントに2回読む方が速いんか?
valgrindってみんな開発に使ってるの?死ぬほど遅いんですが
でかい領域のreallocで毎回コピーが発生するというのは都市伝説、 と言いたいところだが他のスレッドが動いているとそうとも言い切れないかそうか、 この場合の2パス方式はgzipが2回走るのがいかにも実行時間の無駄でいやすぐる 最初に大きめの領域をmallocして足りんかったら2パスに切り替えるという投機的なやり方のが良い
だいたいいかにgzip様といってもファイルを毎回1/10まで圧縮できるわけはないのだから 読み込むファイルサイズの10倍を確保しておけばほぼ1パスで済む 展開後の実サイズがわかったら展開後の実サイズぴったりにreallocで縮小すれば良い ちなメモリの断片化はガン無視 実使用サイズの倍のメモリも用意できないようなプアな環境のならmallocやreallocする設計から見直さねばならない 見直すべき
>>427 意味わからん
スレッドなんて関係ないだろ
>>429 ヒープメモリはスレッドで共有される
もしヒープメモリを使う他のスレッドが一切無いなら
realloc()でサイズ拡大してもコピーは生じない(後ろに領域伸ばせるから
この説明でまだ疑念が渦巻くのならプログラミング言語Cをきちんと読み直した砲が良い
(あのmalloc()実装例がmalloc()実装の全てとは言わんが基本
>>430 断片化って知ってる?
> 後ろに領域伸ばせるから
これ常にできるわけじゃないよ
> この説明でまだ疑念が渦巻くのならプログラミング言語Cをきちんと読み直した砲が良い
お前がなw
特にこの場合はgzipを使うからね アウトプット用のメモリを確保した上でgzipを実行するわけだけど gzipが内部で動的にメモリを確保するかしないかは知らんけど、多分するでしょ そうすると新たに論理アドレス空間が使われるから 連続したメモリ空間を後ろに拡張できるかって言われるとね
>>431-433 んまーそれはそうやったorz
あと今回のgzip展開ルーチン呼び出し前にmallocした領域がたまたま後ろに居る可能性もあるな!
しかし
>>428-428 は断片化が生じないと言っているのではないし主目的のgzip読み込みに関しては
断片化による影響を受けにくくしているのだから大枠問題無い
良い良い、良いではないか
色々とご意見ありがとうございます。
どなたかの役にたてばと思い僕が調べた内容をお知らせします。
gzip展開後に5GBくらいになるデータでテストしてみました。
@time ./a.outで簡易的に時間取得
Arealloc方式の場合
>>415 の下記部分でコピーが何回発生しているかをカウントしてみる
// アドレスが変化した場合
if( data != data_new ){
// free(data); // 元オブジェクトは解放済みのため不要
data = data_new;
copy +=1; // コピーした回数をカウント
}else{
not_copy +=1; // コピーせずに拡張できた回数をカウント
}
結果は以下のようになりました。
強力なサーバでメモリが潤沢にあるためか、コピーがほとんど発生しないようで
realloc方式が早かったです。
本日祝日でサーバ使用者が少なく、よりコピー回数が減っていると思います。
個人PCでchromeにメモリ食われたりするとコピーが増えて逆転するかもしれないですね。
環境に合わせて変えようと思います。
# 2パス方式(約27秒)
./a.out 25.12s user 1.27s system 99% cpu 26.479 total
# realloc方式(約15秒)
./a.out 12.73s user 1.46s system 99% cpu 14.263 total
-> コピー 1
-> notコピー 636
malloc()されたりrealloc()されたりするヒープメモリは仮想アドレス空間に対応した普通のOSならプロセス毎に別空間だから 他のプロセス(他のサーバ利用者が居る or chrome)があってもヒープメモリの断片化に関係しないはず… さらに、2パス方式の時間が1パス方式の倍になるのはメモリコピーよりもgzip展開を2回もやることが利いているでケテーイ
すみません、また疑問が出てきたので相談させてください。
今読み込んだバイナリファイルの解析をしています。
ある一部の8バイトがビッグエンディアン形式で下記になっていて、これが少数点の数値で「2.500000e-04」となるようです。
3e 10 62 4d d2 f1 a9 fc
次に下記URLを参考に調べると今使っているサーバはリトルエンディアンでした。
(CPUはintel)
https://qiita.com/ryuichi1208/items/31442f9e8a7a7c94aeec このため ビックエンディアン→リトルエンディアン の変換が必要と思うので下記のようにしました。
unsigned char t[8];
double little;
for (int i = 0; i < 8; i++) {
t[i] = data[7-i]; // バイトオーダーの変換
printf("%02x ", t[i]);
}
printf("\n");
memcpy(&little, t, 8);
printf(" %e\n", little);
---結果---
fc a9 f1 d2 4d 62 10 3e
9.536743e-10
----------
ちゃんと反転できていますが、結果は期待値「2.500000e-04」ではありませんでした。
>>続きます
次に実際の値を16進数表示したときの確認として下記を実行したところ、結果は以下のようになりました。 int main(){ double data = 2.500000e-04; unsigned char *p; int i; p = (unsigned char *)&data; for (i = 0; i < 8; i++) { printf(" %02X", p[i]); } printf("\n"); printf("%e\n", data); return 1; } ---結果--- FC A9 F1 D2 4D 62 30 3F 2.500000e-04 ---------- 比較すると、最初の6バイトは同じですが最後の2バイトが違いました。 どうやったらバイナリデータに入っている 「3e 10 62 4d d2 f1 a9 fc」 を 「2.500000e-04」 に変換できるかわかりますでしょうか? ビッグエンディアン→リトルエンディアン の変換時にもうひと工夫いるのでしょうか?
2.500000e-04のIEEE754表現は3f30624dd2f1a9fcだぞ 元のバイナリの解釈間違ってんだろ
>>426 開発っつーか本当にどうしようもないバグの場合は使う。
遅いって言っても5〜10倍くらいだろ。
2.500000e-04/9.536743e-10≒262144=2^18だからどっかで誰かが18ビットシフトしてないか調べろ あとはそのバイナリ作った野郎に聞け
decimal64だったりして サーバのCPUは何?
>>440 ,442
データの方が違うんですかね。。
今調べてますがまだわかりません。
>>443 xeonです。
decimal64というのはまだ調べていませんがまたちょっと違う変換になるんですかね?
サーバじゃないか もとデータ生成したビッグエンディアンのCPUは何かと
同じサーバで生成されました。 生成したソフトは販売されているものなので問題はないと思うし、 他のソフトで読み取ってもちゃんと 2.5e-04 が出てくるのでデータに問題はなさそうです。 なぜそう読めるのか不思議です。。
Big Endian だし IBM フォーマットとか?
>>446 > 生成したソフトは販売されているものなので問題はないと思うし、
なぜそのソフトの名前を書かないの?
> 他のソフトで読み取ってもちゃんと 2.5e-04 が出てくるのでデータに問題はなさそうです。
他のソフトって何よ?
みんなエスパーじゃないんだから出せる情報は出しなよ
>>448 すみません、calmaという大昔のもので今はもう販売されていません。
Calmaでググるとこれがヒットするけどこれかな?
https://en.m.wikipedia.org/wiki/Calma これだとかなり古いソフトウェアだから浮動小数点のフォーマットが違うような気がする
>>450 数値をバイナリ変換していそうなコードを今見つけました。
ただのビッグエンディアン表記ではなさそうです。
もう少し調べて見ます。
下記で数値からバイナリへの変換ができましたが、何の計算をしているのかさっぱりわかりません……
逆変換できるのでしょうか?
http://codepad.org/oSvOJP1p ---結果---
変換前の値:0.000250
変換後の値:3e 10 62 4d d2 f1 a9 fc
----------
浮動小数の正規化っぽいけど ( A < 0.0625 ) || ( A >= 1.0 ) ってのが特殊だと思う 何かそういう事情があったんでしょう 浮動小数の正規化ってのは検索すればわかる 別環境でデコードするだけならたぶん気にしなくて大丈夫
確かに、IBM方式ってやつっぽい 気にしないといかんわw 無駄なこと書いてごめんね
>>453-455 ありがとうございます。
今 IBMフォーマット や IBM方式 でググってますが中々それらしいものが出てきません。
かなりマイナーなものなのでしょうか?
こんな感じかな?保証はせん uint64_t ibm = 0x3e10624dd2f1a9fcULL if (ibm == 0x0) { return 0.0; } uint64_t sign = ibm >> 63; uint64_t ibmexp = (ibm >> 56) & 0x7f; uint64_t ibmfrac = ibm & 0x00ff'ffff'ffff'ffffULL; if (ibmexp == 0x0) { return std::numeric_limits<double>::quiet_NaN(); } //てきとう uint64_t ieeeexp = (ibmexp - 64) * 4 + 1023; uint64_t ieeefrac = ibmfrac; while(ieeefrac & 0x0100'0000'0000'0000) { ieeefrac <<=1; --ieeeexp; } ieeefrac ^= 0x0100'0000'0000'0000; ieeefrac >>= 1; uint64_t ieee = (sign << 63) | (ieeeexp << 55) | ieeefrac; return *reinterpret_cast<double*>(&ieee);
というか指数部のビット長勘違いしてたわ 459は捨ててください恥ずかしい
ieee形式は自前で変換せずにdoubleで計算してしまえばいいんでは?
frexpとldexpでやっちゃう方が間違えにくくていいのかな
エクセス64か 半導体とかで使われるGDSIIの実数がそれなんだよね。 自力で実装したわー。 4bitを16進数一桁として考えてて、指数部は16^xで表現されててケチ表現なし。
じゃあどっかにライブラリでもあるんじゃねえの 探したら出てくるパターンだろこれ
>>457-466 コメントやサンプルコードありがとうございます。
こんな複雑なコードになるんですね。。
何やってるのかさっぱりわかりませんが、上記コードを参考に勉強してみます。
しかしエクセス64で検索してもそんなに記事が出てこないですね。
かなりの難易度の予感……
これか?
GitHub - enthought/ibm2ieee: Cross-project library for converting IBM-format hexadecimal floating-point to IEEE format binary floating-point.
https://github.com/enthought/ibm2ieee >>469 かぶりました。
探していただきありがとうございます。
それも調べてみたいと思います。
>>467 フォーマットは
>>458 のリンク先に書いてある
3e 10 62 4d d2 f1 a9 fc の最初の1バイト(3e)は符号ビットと指数
0x3e = (0 0111110) で最初の0は符号(正)
残りの0111110が指数で10進では62
指数は64の時に0と解釈するので62 - 64 = -2
IBM形式では16の指数なので16^(-2) = 1/256
一方仮数部は
1: 1/16
0: 0/256
6: 6/4096
2: 2/65536
:
計 0.064
なので結果は0.064*(1/256) = 0.00025 = 2.5e-4
>>472 わかりやすい解説ありがとうございます。
仮数部の計算がまだいまいち理解できていませんが、符号ビットと指数のところは理解できました。
なんとかプログラム作れそうです。
とても勉強になりました。ありがとうございました。
>>472 仮数部の計算も理解できました。
ネットで浮動小数点を解説している記事を見るとどこも2進数で書かれていましたが、
>>472 はこのスレで会話に出しているバイト単位(16進数)で計算してもらってるんですね。
この辺の話になるとこのスレの趣旨から外れてきているのでこの辺にしておきます。
以上、お礼を兼ねての書き込みでした。ありがとうございました。
bit単位でもいいんだけど元の値との対応が取りにくいから16進の1文字(4bitなのでByteじゃなくてNibbleって言う)単位で計算してる
そうでした。4bitでした。 今回バイナリ読みで初めてどっぷり16進数を扱ってますがバイトとニブル?がすぐわからなくなります。。
http://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02007.html 上記URLで
・クラスの宣言はヘッダファイルにする
・クラスの実装部はソースファイルにする
・そのクラスを使いたいときはヘッダファイルのみインクルード
とありますが、これが一般的なのでしょうか?
なるべく基本にのっとった書き方に慣れることで、他の人が書いているプログラムもある程度読めるようになれたら調べるときに助かりそうだと思っています。
だからさ、そういう疑問を持つってことは お前なりに考えた別のやり方があるんだろ? それを書けよ
どういう意味や効果があってそうしてるかじゃなくて「一般的」かどうかばかり気にしてるあたりがプログラマ向きの性格じゃなさそう
iOSのC++の勉強アプリ何個か試してみたんだけど、未だにC++03時代の事までしか教えてないのね。 でも付属の簡易コンパイラはC++17の機能が使えたりする...
初心者のうちから shared_ptrやunique_ptr を積極的に使うようにしてほしい。
いくら便利なものがあるといってもさすがにC++をナマポや自前RAIIの知識なしで使うのは不可能だから、 初心者は最初はメモリ破壊で苦しんだ方がいいと思うわ
https://ideone.com/10xlAn ギャグなんですけど、
これファイル間またいで定義したい時って何か特別な事しないといけなかったでしたっけ?
「日本語C++」書いてみたい人生だった。
>>491 検証ありがとう。自分はVCなんだけどね。書き忘れてごめん。
VCも無理かな。
最近プリプロセッサは、すたれる流れのようなのでメンテされてないのかなぁ・・・。
マクロは名前空間に閉じ込めることができないからしょうがない
VCはソースを全てBOM付きのutf8にすれば通るんじゃないかな。
#define 違うなら else これは もしくは の方がいいんじゃねえか?
もし i == 0 なら
printf("
>>497 はちょっと頭悪い");
もしくは
printf("
>>497 はちょっと頭弱い");
…なるほど正しいかも
ってそんなわけ無いだろw
>>80 >Pythonは「CPythonの実装が規格だ」だし
それrubyと勘違いしてないか?
明文化されていない仕様なんてそんなに残っていないと思うが。
あと、MATLABはアカデミック分野では少なくともRやOctaveなんかより
信用されていると思うよ。
make環境を作ると更新ファイルだけコンパイルしてくれたり、色々便利そうなので コンパイルコマンド直たたきからmake環境に移行しようと考えています。 下記で正常動作しているので、これでmake環境を作りたいと考えていますが 「c++ make」で検索してもあまり情報がないため苦戦しています。 どのように書けば良いかわかりますか?もしくは参考のURLなどあれば教えていただけないでしょうか。 #!/bin/sh - export CC=~local/bin/gcc export CXX=~local/bin/g++ g++ -c -g -Wall -pthread -std=c++11 ./Func.cpp -lm -lz -Wextra -o Func.o && g++ -c -g -Wall -pthread -std=c++11 ./Main.cpp -lm -lz -Wextra -o Main.o && g++ Main.o Func.o -o main.exe -lz
>>501 簡単に言えばMakefileに
作ってほしいファイル名: そのファイルを作るのに必要なファイル
(タブ(なぜか空白はダメ))作るためのコマンド
をズラズラ書いておけばいい
なのでその例だと
Func.o: Func.cpp
g++ -c -g -Wall -pthread -std=c++11 ./Func.cpp -lm -lz -Wextra -o Func.o
Main.o: Main.cpp
g++ -c -g -Wall -pthread -std=c++11 ./Main.cpp -lm -lz -Wextra -o Main.o
Main.exe: Main.o Func.m
g++ Main.o Func.o -o main.exe -lz
って書いておいて(わかると思うがg++の前はタブな)
make Main.exe
ってやればいい
毎回Main.exeを指定するのが面倒なら
Main.exe: Main.o Func.m
g++ Main.o Func.o -o main.exe -lz
の行を一番上に持って行けば make だけで作成できる
(makeは指定がないと最初に見つけた作りたいファイルを作ろうとする)
>>501 以下の文献とオライリーのGNUmake読んで、あとは自分で考えるのが良い。
http://aegis.sourceforge.net/auug97.pdf この辺り、まともに理解してる奴が本当に少ないから。
だからconstexprとかboostとかクソみたいなものをありがたがるんだろうなと思う。
ビルドツール選びの時にC++の言語機能をたたく理由がわからない。
>>506 ビルドと言語機能は綿密に絡み合ってるから。
c++使っててこれだけ当たり前の話を理解できないというのが理解できない。
> ビルドと言語機能は綿密に絡み合ってるから。 具体例の1つも出せないクズ乙
>>508 505の内容見て具体例に思えないようならもう話すことはないな。
> タブ(なぜか空白はダメ) こういうところがクソ
Makeは古い AntかMavenかGradle使え、 いや知らんけど
素のMakefileは最終的なオブジェクトファイルとヘッダファイルの依存関係を書き下すのが大変に面倒臭い なぜなら、 Target: Dependencies1 Dependencies2 ... (TAB)Command という記述において、Commandが具体的にTargetお生成しないと事実上立ち行かないので、 インクルードファイルAがインクルードファイルB、Cをインクルードしているという状況を A: B C (TAB)echo Hello World! などと書くわけには逝かず、あくまで foo.obj : foo.cc A B C (TAB)gcc foo.cc 式に.objなターゲットに対して関連付けねばならない ファイルがあるだけで勝手にヘッダファイルの依存関係を解決させることは GNU Makeの昨日とシェルコマンドを組み合わせてできた気がするが(忘れた たかがこれだけのためになんでそんな糞面倒なことをせねばならんのじゃ、というキモス ※ 個人の感想です
Ruby のRake, Thor などのタスクランナーで、コンパイル出来ないのか? Webpack, Gulp とか
C++のモジュールシステムはいけてないよね という話ならわかるが、 constexprとboost? 全く意味がわからねぇ
>>515 そこは gcc -M 類の出番。まぁ面倒なのは変わらないんだろうけど。
一応昔はコンパイル単位がすなわちモジュールとして機能していたはずだったのに、どこで間違えたんだろうな
>>501 簡単に言えばMakefileに
作ってほしいファイル名: そのファイルを作るのに必要なファイル
(タブ(なぜか空白はダメ))作るためのコマンド
をズラズラ書いておけばいい
なのでその例だと
Func.o: Func.cpp
g++ -c -g -Wall -pthread -std=c++11 ./Func.cpp -lm -lz -Wextra -o Func.o
Main.o: Main.cpp
g++ -c -g -Wall -pthread -std=c++11 ./Main.cpp -lm -lz -Wextra -o Main.o
Main.exe: Main.o Func.m
g++ Main.o Func.o -o main.exe -lz
って書いておいて make Makefile Main.exe
>>503 CC, CXXは個別インストールしているgccがあり、以前何かのモジュールをインストールしたときに、元からある
/usr/bin/g++
に関連したライブラリパスが使われることがありこれを設定しました。
今回の単純コンパイルには不要かもしれませんが、おまじないで残していました。
>>504 ありがとうございます。
基本はコマンドを並べていけばいいんですね。
何も指定しない時には先頭のものを指定したことと同じになることも参考になりました。
>>505 このあたりもちゃんと理解できるようになりたいです。
少しづつ勉強したいと思います。
>>512 こんなのもあるんですね。
これも調べてみたいと思います。
>>521 いえいえありがとうございます。
まずは単純羅列から入ってCXXFLAGS、OBJS、LIBSなどを使いこなしていこうと思います。
>>512 それらが make に比して優れた点はなんでしょうか?
>>517 横からすまんが意味はわかる
c++はコンパイル時になんでもかんでも解決しようと必死すぎ
フェーズ分けてbinutils使いこなした方が素直と思うことが多々ある
>>525 binutilsを使う例として、具体的にはどういうことがありますか?
なんなんだろうなこの「俺に手取り足取り教えろ」みたいな要求は。
スキル不足なのに見下してるやつに教えてやる義理はないんだよね 逃げますね
>>525 国際標準になってないbinutilsなんて使ったら、環境依存でコンパイル通らなくなったりする。
VC++2017で std::string str = "abcd";ってやると debugモードだとビルドできてるのに ReleaseモードだとLNK2001エラーが出てしまいます 他に何か宣言かlibがいるのでしょうか 昨日一日この点で一日悪戦苦闘していました ちなみにプロジェクトはコンソールアプリで リンカーのシステムは処理の都合上、Windows(/SUBSYSTEM:WINDOWS)にしてあります
プロジェクトの構成変更したときにDebug版だけ変えたとかじゃねえの
>>524 遅レススマンが、知っている単語を並べてみただけなので
全く
わかり
ません
>ファイルがあるだけで勝手にヘッダファイルの依存関係を解決
俺はこれカスタムして使ってます
https://postd.cc/makefile-c-projects/ >>535 いつの間にかReleaseの方ばかり設定いじるというアホなことやらかしてました。
プロジェクトを作り直してソースをコピーすることで解決しました。
VC++2017でコンソールアプリとしてプロジェクトを立ち上げました。 しかし、コンソール(dos窓)を非表示にするべく 構成プロパティのリンカー→システム→サブシステムを Windows(/SUBSYSTEM:WINDOWS)にしてwindows.hをincludeして int main(void)からint WINAPI WinMain(void)に変更してビルドすると 「C2731 'WinMain':関数はオーバーロードできません」と言われました。 構成プロパティのリンカー→詳細設定→エントリ ポイントをmainにしてビルドしても 結果は変わらず、int main(void)に戻すと大量にエラーが発生しました。 この場合、どうすればよろしいのでしょう?
>>539 エラーメッセージにしたがって修正すればよろしいですよ。
>>539 なぜ手でsubsystem変えようとしてんの?
VSのテンプレートそのまま使えばいいじゃん
それができないならその理由を説明すべき
>>540-541 ありがとうございます。
以前ググって見つけたものをだまされたと思って
int WINAPI WinMain(void)から
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char* lpCmdLine, int nCmdShow)に
変更したらReleaseモードでも上手くいきました。
でも、元が(void)なんで、引数の設定に釈然としないところありますが…
>>542 普通にやったらどうしても大きなdos窓がしばらく現れるので
(処理の都合上system関数からのexe実行が必要だからです)
ググって調べたらそういう風にいじれと書いてあったからです。
boostなしで128ビット複素数を使う最もシンプルな方法ってなんですか?
>>546 c++における4倍精度三角関数の呼び方が分かりません
cosq()とかsinq()のことです
コスキュー、シンキューじゃあかんの? コサインクアドラント、サインクアドラント
4倍精度ライブラリでまともな速度出るものってないのでは。
template+constexpr => これ最強!!!
unifyde call syntax => 邪道。 でも、欲しいのである。 関数型食えると思うんだけどなー。
バイトデータの比較を高速に行いたいのですが、以下@Aを考えました。 連続したバイトデータを比較するのに下記以外に簡素に書ける方法はありませんか? memcpyはコピーが発生するのでちょっと遅くなるかなと思っています。 int main(){ unsigned char byte[6] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 }; // @1バイトずつ比較 if( byte[2] == 0x03 && byte[3] == 0x04 && byte[4] == 0x05 && byte[5] == 0x06 ){ printf("yes\n"); }else{ printf("no\n"); } // Aビット演算した結果を比較 if( (byte[2] << 24 | byte[3] << 16 | byte[4] << 8 | byte[5]) == 0x03040506 ){ printf("yes\n"); }else{ printf("no\n"); } }
std::int8_t A[]={0,1,2,3}; std::uint32_t* B=(std::uint32_t)A; //care align. if(*B == 0x03020100){ //yes. }else{ //no } SIMDライクな感じで比較できる気がするけど、おススメはしない。 エンディアン注意。
>>554 memcmp とか std::equal とか。速度はどうなるかわからないので推測じゃなくて実測でよろしく。
データの性質によるけどテーブル使ったCRC16で比較するのは?
>>554 ぐだぐだ考えてないでてめえで計測しろ
計測しないなら黙ってmemcmp使っとけ
>>554 少量のメモリ上の値比較やコピーの処理時間なんて無視できる程度で考える必要もない。
大量のデータの比較を行うとしたら、その大量のデータがメモリ上に存在するために多くの場合はファイルI/Oなり通信なり演算なりしているはずで、そちらのコストの方が桁違いに大きいから単純な比較処理のコストを気にするのは無意味。
ほんとに気にする必要があるのか、まずは確認すべきだろう。つまらない高速化を考えるより、可読性の高い素直なコードを書いた方がいいよ。
高速化って言ったら、やっぱりよく使う変数をレジスタに割り当てることが大事だよな メンバ変数は毎回メモリとやり取りするので遅くなるから ループ外で自動変数に読み込んでから使うとビックリするぐらい速くなったよ
(
>>562-564 こいつらの自信はどっから来てるんだろう)
よくあるような、 if ( (c >= 'A' && code <='Z') || (c >= 'a' && code <='z') || c == '_' ) { ・・・ } の部分を、条件jmp文が少しでも少なくなるようにと思って、 予め作成しておいたテーブル(配列)を使って、 if ( eiji_or_underscore[c] != 0 ) { ・・・ } として実測してみたところ、何度計測しても後者の方が遅くなった。 アセンブリコードを見てみても、前者だと5つの条件jmp命令、後者だと1つの条件jmp命令と、 後者の方が命令数が少なくっていた。しかし、前者だと、レジスタとcmp命令を使っていたが、 後者だとグローバル変数の配列を読み出しに行っていた。 最近のCPUは非常に複雑で高度な「分岐予測」をしていて、配列は読み出してみないと 値が分からないので、「予測」ができず、分岐予測の「予測間違い」がおきるが、 レジスタをcmpで比較する場合には予測が出来るためだろうか。 しかし、昔より最適化する際にどっちが高速になるかの予想が難しくなってしまってる。
>>567 誤:if ( (c >= 'A' && code <='Z') || (c >= 'a' && code <='z') ||
正:if ( (c >= 'A' && c <='Z') || (c >= 'a' && c <='z') ||
最近の環境では「実測」の信頼性確保も、また難しいです。 なぜかある時には何度測定しても遅いのに、あらためて別の時に 測ると速く出る事があったりします。
単にテーブル参照はメモリーから読み出すから遅いだけだろ
俺が書いた通り、単にメモリへのアクセスが遅いんだよ
理論上は、メモリがキャッシュに乗っている限り、メモリの読み書きとレジスタ への読み書きの速度は同一です。 ただし、メモリとメモリは add, sub, mov 命令で2つのオペランドに同時指定は 出来ないのに対し、レジスタは出来るので、確率的にレジスタの方が必要な 命令数が少なくて済むので高速になる場合があります。 あとキャッシュに乗って無い場合はメモリは遅くなります。
あ、すまん俺の方が間違えてた・・ まさかとは思うけど最適化してないとか無いよね
>>575 最適化はどちらも同じオプションでしてますし、出力されたアセンブリ・コード
も見て、テーブルを使った方が命令数の少ないコードになっていることも
確認してます。条件jmp命令も少なくなっています。
あと前者のコードは与えたcの値がA-Zだと分岐の回数2回で済むからじゃないかね
>>577 実はその影響もあると思っているのですが、それだけだと前者の場合には、
命令数から言えば1〜2クロックほど速くなる場合がある程度です。
しかし、実測してみると、後者のやり方の方がもっと遅くなっている
ようなんです。
面倒ですが、マクロスイッチでコードを切り替えられるようにして
短時間の内に二つを切り替えて速度比較してみようかと思っているところです。
最近のCPUは温度によってクロック数が変動する可能性もあるそうですね。
テーブルがキャッシュに乗ってなかったり、
>>561 と同じでテーブルがグローバル変数だと書き換えを懸念して最適化ぎ抑制されてんじゃないかな
マクロスイッチ切り替え方式にして、ほぼ同時に両方を測定してみたら、 テーブル方式の方が速くなっていました。
>>580 アセンブリコードを見る限り、特に問題なく、人間が単純に書いた場合
と似たようなコードになっています。
ただし、一点、テーブルの c 番目の要素を参照する際、バイト整数の c
をゼロ拡張して32BIT 整数にする必要があるのですが、自分の使ってるVC++
だと、movzx 命令を使わずに、xor eax,eax; mov al,cl のように2命令
を使ってしまっている点が、人間が最適化するより遅いコードになってしまって
います。
コメントありがとうございます。
>>555 エンディアンを気にしないといけないのは後々分かりづらくなりそうですね。。
memcmpというのがあったんですね。
連続バイト比較ができてシンプルで良さそうです。
これを使ってみます。
volatile命令の他にキャッシュ命令とか無いのかよ ルックアップテーブルをキャッシュに載せときゃ爆速じゃん もっと言えばテーブルを石に焼いた時一番早い
>>569 >分岐予測はデータの内容関係ないやろ
分 岐 予 測 は デ ー タ の 内 容 (統計的偏り) に 関 係 あ る
>>567 最近のCPUは黒魔術で製造されているからミクロな最適化を下手に人が手を加えるより
単純なアルゴリズムにした方が速いことが多くなた
印象
>>587 お前はアレか
>>567 の言う「配列は読み出してみないと値がわからないので、予測が出来ず」
が正しいと?
多分メモリが読めてない状態でも分岐予測して投機的実行はするんじゃないかな 近代的なCPUは
>>567 の前半部のコード >if ( (c >= 'A' && code <='Z') || (c >= 'a' && code <='z') || > c == '_' ) { > ・・・ >} はCPUレベルの分岐予測+投機的実行では入力データによっては速度向上し難いケースがある AaZz_AaZz_AaZz_.... という入力を考えたらワカル(cといして1文字入力される度に||か&&を打ち切る分岐箇所がちがーう 分岐予測キャッシュというのは分岐命令1個につき1状態か2状態記憶がせいぜい(しかもLRU式に記憶が消える のでこのような場合は投機的実行結果が捨てられ続けかねない >>598 ハイ論破 >>589 分岐予測と投機的実行が効力を発揮するのは多重ループで内側の分岐条件が大部分の時間変わらないというケース ちゅか&&や||の条件式に関数呼び出しが含まれない単純なケースにおいては、 OoOと分岐予測を備えた今日日のCPUでは途中で打ち切るより全部評価してしまった砲が速い可能性がおおきい このとき問題になるのは副作用のある式が問題であり、 副作用がある++や--があると、やっぱ言語規格どおり||や&&は条件成立で打ち切らないとソースコードに書かれた気体動作と オブジェクトコードの動作が別物になってしまうので諸悪の根源 C言語を引きずった仕様のままでは時代について逝けてない Rustで++や--を式の中で使えないのは故無きことでは無いんじゃ…
>>590 > (しかもLRU式に記憶が消える
知ったか乙
せめて
https://ja.m.wikipedia.org/wiki/ 分岐予測
くらいは読んでこい
> のでこのような場合は投機的実行結果が捨てられ続けかねない
そりゃ頑張って作れば最悪の状況は作れるよw
だから何?って話だが
>>590 そういう安価ミスはちゃんと訂正しろよ
あと反論になってない
語弊はあったろうけど配列だから分岐予測が効かないなんて話はないだろうと言いたかっただけだ
>>586 1バイトの即値データとの比較の方が速いに決まってんだろ。
命令デコードする段階で比較対象のデータとってこれるんだから
>>594 リンク先のどこにLRUでは無いと書いてあるんじゃ…
分岐予測キャッシュがあふれたときはLRUが基本
これは2次キャッシュを儲けても関係ない(それぞれの中で溢れたらLRU
むしろハードウェア実装の制限でLRUより性能の落ちるしくみを使うこともある
が(nウェイセットアソシアティブの「アソシアティブ」部分は一部アドレス線の固定解釈による簡素化
>>595 分岐予測が性能を発揮しない例が有る以上ハイ論破の訂正の必要は認められぬ
もし分岐予測制度を上げるためのキャッシュエントリのn状態化とキャッシュが溢れた場合の話を 混同しているんだとしたらきわめておめでたい話だといえる あるアドレスの分岐命令に対応するキャッシュエントリがどの状態に居たとしても、 そんあことはお構いなしに溢れたときはどれかのエントリが消される.。 このとき他の制約が無ければ理想解はLRUという話
ていうか
>1状態か2状態記憶がせいぜい(しかもLRU式に記憶が消える (
>>590 とまで書いたのだからキャッシュエントリのn状態化は機知の前提で話していることぐらいは読み取って
ホスイ
(雑駁なリンク先を示すよりはむしろ「1状態って何だよ2状態だろパーカwwwwwww」ぐらいの反応であれば
>>594 は知性を疑われずに済んだ
ただのこじつけじゃねーか てかそんだけ御託並べて質問者へのアドバイスはゼロかw (というかこいつの論調どっかで見たな・・・)
>>597-599 分岐予測はキャッシュじゃねーぞw
反論するなら分岐予測にLRUアルゴリズムを使ってる奴はCPU挙げてみな
いや、まてまて、そもそも今の話は、分岐予測の精度は関係無いのでは? >「配列は読み出してみないと値がわからないので、予測が出来ず」 がおかしいって話でしょ 精度はともかく、分岐予測はするでしょ というか、逆に、値が分からないから分岐予測するようなもので 分岐予測の精度に関しても、if文のかっこの中の計算が終わってない状態で 適当にジャンプするのは同じでしょ、配列が読めてようが読めてなかろうが
そりゃー予測なんかせず配列まるまる全部をキャッシュに乗せるから早いんだろ つまり予測しないルックアップテーブルの時が一番早い そのテーブルがCPUに焼きこんであればもっと早い
いやだから、ルックアップテーブルの結果を受けて分岐する話なんだから・・ おかしなこと言うな
イキってるパソコンの大先生の子供部屋おじさんがいますね…
多くのCコンパイラがサポートしてるquadmath (__int128とか__float128とかその関数)がかなり便利なのですが、なぜこれはC++の標準の機能にならなかったのですか?
殆んどのハードでの実装がソフトで遅いし、需要も少ない 使いたきゃboostにあるし 標準化されるとしたら、x86とかでハード実装された後に標準型として対応するんじゃね? てかlong doubleがワケわからんことになっているのをどうにかしろと
'A' から 'Z と 'a'から'z' は連続した文字コードである ここにcpuの速度の秘密がある はず
>>608 > 'A' から 'Z と 'a'から'z' は連続した文字コードである
はあ?
>>606 大型計算機にすら倍々精度をハードウェアで扱ってないもんな
命令体系は用意されてるけど
ソフトで十分ってこった
>>606 ところで、そんな精度を何に使ってるの?
float128よりdecimal64の方が需要あるんじゃね
>>612 それ金融でほしいやつだな。
国家予算研究できるな!
>>616 金融計算をIEEE754(?)でやってはいけないのだ。
2進化10進数でやらないと誤差が出る。
二進化十進数でも誤差でるから 当たり前だけど 有理数でやるんだよ
そういう話じゃない。 金融計算では10進数のどの桁でどういう丸めを行うか決まっているから、 その通りの結果になることが「誤差がない」状態なんだよ。
>>611 畳み込み和の計算はフーリエ変換して求めておいて最後に逆変換することで高速化できます (畳み込み定理) が、しばしば誤差の増大がネックになります
こういう問題で出てくる整数はとても大きいということもあります
だから巨大な数を普通に扱いたいのです
数論変換 (整数環上でのDFT) をすれば良いのですが、もっと単純化できないかという試行錯誤です
蒸し返すようですいませんがGNU Makeに取って代わるデファクトスタンダードなビルドシステムってCMakeじゃないんですかね
>>608 規格で保証されてるのは'0'から'9'が連続してることだけな
>>622 取って代わるというかmakefileをつくるメタビルドツールって方が認識として正しい。
実際cmakeでwindowsでもlinuxでもビルドできるように設定するのはマジ辛いぞ。
>>624 そういうのは windows 用と linux 用にわけるんじゃないでしょうか?
CMakeもAutoconfなんかと比べたら簡単になったんだろうけど、自分で書くならgypだな。
>>625 cmakeを何だと思ってる
使ったことないのかよ
automake/autoconfに慣れたからcmakeいらんわ うまくクロス環境みつけてくれないこと多いし
>>625 cmakeとかautomake系のツールのコンセプトはできるだけ分けないで書けるように
ってところではあるが、まあ実際はそれぞれの環境用に色々やるのと大して変わらん。
少なくともデバッグするときはその環境毎のビルドがわかってないとほぼ詰むし。
なんだかんだでまずlinux系統でmakeになれるのが近道だとは思うけどね。
あれでヘッダー依存の取り扱いがしっかり書けるようになれば大抵のビルドシステムにも慣れるだろう。
最終的にクロスプラットフォームでちゃんとやれることを目指すならmakeもmsbuildも 両方押さえておかなければならないわけで、どっちが先ってことはないと思うがな。
-
>>630 と
>>632 に話の脈絡が全くない
-
>>632 べつに楽な方から始めるのが良いという根拠もない
- というか
>>630 はmakeがわかれば他はもっと楽だという、逆のニュアンスだったんじゃないの?
- そもそもmsbuildの情報もMSDNで簡単に調べられるし
ツッコミどころ多すぎ。
>あれでヘッダー依存の取り扱いがしっかり書けるようになれば
いまどきlinuxでもそんなん手書きする奴はいないw
makeじゃなくてmsbuild教える方がいいと思うならお前はそうしろ。 それが本当にいいと思ってんならな。 俺だったらmakeを教えるというだけの話だ。
また支離滅裂なw makeとmsbuildの優劣なんて話はしてないんだが、日本語不自由なのか? >少なくともデバッグするときはその環境毎のビルドがわかってないとほぼ詰むし。 という理由でmakeを覚えなければならないと主張するなら、同じ理由でwindows環境向けには msbuildを覚えておかなければ片手落ちだろうと指摘しただけ。 まぁどうせ上の理由も後付けで、cmakeを知らない爺が横からmakeを布教しようとしただけなんだろうが。
手で触るもんじゃないけど 一度手で触っておかないと吐き出されたmakefileを見て何がおかしいか理解できない
std::condition_variableを使って複数のスレッドが待ち状態の時、 notify_oneで一つだけスレッドロック解除した場合、解除されるスレッドに優先度はある? 例えば、一番最初に待ち状態に入ったスレッドのロックが解除されるとか。 それとも完全に実装依存?
notify_one使ったことないけど解説読む限り実装依存に見える(待機中のスレッドからいずれか一つ、とかあるし) 順序あるならそう書かれると思う 曖昧ですまんけど
実装定義だと思うけど、wait呼び出した順だと考えていいと思う
俺は多分カーネルのスレッドのスケジューリングで たまたま選ばれたやつが走ると思う しらんけど
流れ読まずに申し訳ございません、質問させてください。
非エンジニアのものなのですが、下記のようなオープンソースのコードを使って
メッセージのウェブアプリケーションを創ってみたいのですが、
一番手っ取り早い方法はどういう方法でしょうか?
漠然とした質問で申し訳ございません
▶Telegram
https://telegram.org/apps#source-code ▶Signal
https://github.com/signalapp ▶Rocket Chat
https://github.com/RocketChat/Rocket.Chat ▶Tox
https://github.com/Tox/tox.chat ▶Wire
https://github.com/wireapp/wire >>636 お前ほんとにmsbuildいじったことあるのか?
あんなクソなものを本気で使ってんの?
てかヘッダ依存解決くらい書けなきゃまともなビルドシステムなんて絶対組めねーよ。
こういう誤誘導を平気でするやつってどういう神経してんだろうな。。
>>643 ウェブアプリなのにC++スレで質問するの? 根本的に間違ってるんじゃない?
最近C++を学び始めたのですが、 テンプレート引数の型をコンパイル時に文字列に変換する方法ってあるのでしょうか? できればテンプレートの特殊化やプリプロセス命令を使わずに以下の用な感じでかければよいのですが template<typename Type> class Hoge { public: static constexpr char* Text = Typeを文字列に変換して納入したい };
無理ゲー あくまで自動にこだわるならtypeid使え。 自作クラスだけならクラス名を名乗るメンバ関数でも作っとけ
>てかヘッダ依存解決くらい書けなきゃまともなビルドシステムなんて絶対組めねーよ。 いつの時代から来たんだよw ソースに #include 書く度にいちいちMakefile書き換えんのか?
>>649 以前nameofとかいうライブラリ?が同じくgithubにあったけどどっちが便利かな
というかこの手のは他にもあるっぽいな
>>651 いや合ってると思うけど
ウェブなのかネイティブなのか、多分ごっちゃになってるだろうからまずそこを指摘すべき
別にウェブだからって既存のブラウザ上で動くものという定義はあるまい サーバーサイドもクライアントサイドも両方C++で作ればいい そもそもブラウザだってC++で作られているんだから
>>653 両方自分で作るならもっとシンプルなプロトコルでやるよ
typeidってPFで戻ってくる値が違うからテスト書くとき気をつけるん
>>650 書き換えなくていいように書けるようにするってことだよバカ。
てか依存をしっかり見るって意味じゃヘッダを意識するってのは
相当大事なんだがな。
タスク管理を意識した場合、どんなレイヤーで仕事する場合でも重要になる。
てか想像以上にビルド周りの技術ってc+11から入った輩は理解してないのな。。 またクソシステムの再生産が10年単位で続きそうだわ。。
そりゃこのスレでも 「閃いた!stdを usingすれば文字を打つのが少なくなるよ!」って宣う輩がいるくらいだし
趣味でc++のパズルにはまってる人と 仕事で生産的に使いたい人とでは 言語に期待するものが違うからね 区別しないと
このビルド周りのクソ仕様のせいで年々インタプリタ型に人が流れていくんだわ
そのうちC++ライブラリ用リポジトリとかC++用パッケージマネージャとか作りはじめそう
車輪の再発明が好きなやつが多すぎてウンザリする 道具ばっか作ってどうすんだ 道具つかって絵描いたり家建築したりするのが仕事なのに
makefileなんて十数年触ってないしもう忘れたけど
>>656-657 には同意するわ
依存関係も考えた上で設計&利用しないとコンパイル時間の増大とかに全く対処できなくなる
新しい機能には飛びつくわりに古い部分(しかも無くなってるわけではない)をおざなりにするのはあかん
>>662 テンプレートの export の問題とかさ。。ほんと何周同じことしてんだよって思うわ。
>>656 これ、依存関係を自分で書くんじゃなくて gcc -M とかで自動的に判断させることを言っているんだろうか?
msbuildを含めて今どきの大抵のビルドシステムでできることなんだが。
>>649 こんな良いライブラリーがあるんですね。
非常に助かりました。ありがとうございます!
>>668 makeが実装が一番ネイティブでわかりやすいってことだよ。
bazelなんか中身はもろにmakeだろありゃ。
ただはじめからbazel使ってたらエラーメッセージ見てもわからんだろうし、
そういうのをはじめに薦める奴は詐欺だろ。
makeがネイティブ?わかりやすい?冗談だろ 暗黙ルールとか特殊変数とか特別扱いのターゲットとかやめろ アーカイブだの何だのを勝手に推定しておせっかいな処理挟み込むのを全部やめろ 積もり積もったウンコの山を無効にさせろ
本来のmakeのルールは単純なのにな なんであんなそびえ立つ糞になったのか
>暗黙ルールとか特殊変数とか特別扱いのターゲットとかやめろ まあこれはわかる。 >アーカイブだの何だのを勝手に推定しておせっかいな処理挟み込むのを全部やめろ これは逆に暗黙のルールを使ってるからだろ。 基本的に明示的なmakefileを書いてないのが原因だが、 こんなこと言い出したら他のビルドツールなんて使えんぞ。。 vc compilerなんかもっと暗黙の設定まみれだわ。
マルチプラットフォームで使えて、固定小数点を扱えるOSSっていいのないかな?
使われていないクラスのstaticメンバ変数って生成されないのでしょうか?
>>679 多分生成される可能性が高いね
何故ならC++にはコンストラクタがあるから
つまりはstatic変数のコンストラクタで何かしているかもしれないだろう
だからリンカの最適化は削除をしないだろうね
ただ、普通のintとかだとリンカの最適化で削除されるかもしれないけど
まぁ運しだい
ともかく、規格では多分決まってない
>>679 そのstaticメンバの定義を消してコンパイルしてもエラーにならなければ生成されてない
ちなみにstatic constとかの変数は元々ほとんどのケースで生成されてない
クラスのstatic変数といっても コンパイラからしたらグローバル変数みたいなものだからな 使ってないグローバル変数は削除されるのか? さあな
visual sutdioというかvc++だと使ってないコードを削除するみたいなオプションあったからもしかしたら消えるかもしれない 他はよく知らない・・・
libにしなかったらlinkしたobj全て libにしたらobj単位でシンボル一つでも参照があればlinkされるのが基本じゃね 組み込み用のコンパイラだとそれ以上に頑張ってサイズ削ることもあるだろうけど
グローバル変数のコンストラクタに起動時処理書いといたら、これが案外呼ばれるタイミングがわからない。 手続きの中で明示的に参照しにいかないとあかんと思った。
ここの動的初期化によるけど、まあ分からん・・・
定数初期化しとけるならそうしとくのがいいけどいつもできるわけでもない
https://ja.cppreference.com/w/cpp/language/initialization 一見使ってないからと言ってコンパイラが勝手にデータ構造替えちゃったら動的リンク時とか整合性取れなくなっちゃう気がする
動的ライブラリが元のバイナリの変数を暗黙に触るかはOSによる。 linuxは触れるがmacは触れない。
std::string="あいう"; c++って内部的な文字コードって何になるのかな? あといまいちwstringの使い分けがわかんない、日本語だとwstring使えばいいのか?
決まってない 最近ようやく明示的にutf8対応しだした wstringはワイド文字列
sringの中の文字コードは入れた文字列の文字コード 普通の文字列リテラルの文字コードはそのソースコードが書かれたテキストの文字コード 文字列リテラルはu8などのプレフィックスをつければUnicodeになる
試しただけじゃそれが処理系依存の結果かどうかなんて判断できんじゃん
コンパイラによって日本語シフトジスなどのマルチバイト文字列の解釈が違って移植の際にトラブることがある。
とりあえずリテラルにはu8やuをつけておけば問題ない
gccならutf-8だろうけれど、最近のVCはどうだろ。
文字コードの話題は盛り上がっていいね ある意味一番ハマる部分かも
char型および文字列リテラルが何になるのか不定なのがアレなので もうさいしょからu8""とchar8_tとstd::u8stringを使うように徹底するのは良いのかもしれない
WindowsはTCHARで書くべしみたいなのはまだあるの? 最近Windows使ってないもんでよく分からん
>>706 でもUTF16の方が問題起きにくい気がする
>>709 ファイルシステム関係は uft16 で、それ以外は utf8 で分けるしかないでしょうね、"ファイルシステム uft16" はやったことがありますが、utf8 はまだ触ったことがありません…
utf8は冗長コードの問題があるから内部処理用コードには向かないんだよね。
読みこみでハネるのが主流じゃね? utf16が一番中途半端
そうかな、場合にもよるけど、日常使う文字はほぼutf16に収まるし、 utf8だとstd::regexで日本語がまったくつかえないとかあるしで、 俺的にはutf16の方が便利かな。
ほぼ収まるってのが一番厄介な所だろ サロゲートペア対策してなさそう
絵文字はみんなサロゲートペアだもんな あれのおかげでようやく欧米人どもが真面目にUnicode対応するようになった
その代わり新宿ダンジョンよりも複雑奇怪になったけどな
絵文字はやめてほしいわ。そもそも架空の文字は登録しないんじゃなかったのかよ。 21bitも使えてコードポイントに余裕があるからといってロクなことしない。
足りなくなったらサロゲートペアを足せばいいからなw
もう全部utf32でいいんじゃね 一番簡単だしみんなハッピーや
いろいろ工夫を凝らし始めるとiso-2022でいいじゃんという
文字列なんか一番基本的な物の一つなんだから もっと簡単でもよかったのにね
4byteの配列にコードポイントまんま入れるんだ 結合文字は忘れろ
コードポイントじゃなくてメモリポインタじゃないの?
オブジェクト指向の3大要素をすべて満たしたプログラム作れって課題なんだけど、じゃんけんでいいかな?
じゃんけんでメッセージを送る機能が必要になるとは思わないが
チャットでいいんじゃね? 画像と文字送れば色々実験できるし
チャットを作ると カプセル化:ネットワーク部分、チャット部分 継承:継承元からサーバクラス派生、クライアントクラス派生 仮想:TCPクラス-UDPクラス切り替え 完璧じゃね?
別にじゃんけんだっていいだろ 継承:手の種類 多態性:手の画面出力 カプセル化:しわの数
タイマーで早出し遅出しの判定とか ネットワーク対戦機能とか 履歴取ってプレイヤーの手の傾向学習してくるAIとか 色々盛り込んでみればいい
期限が金曜だからあんまり凝ってる時間はないかな。クラス図とシーケンス図とオブジェクト図も作んなきゃいけないし 結局ケイスケホンダのジャンケン作ることにした
>>734 三大要素というとよくそんな風に言われるけど、実のところ継承ってオブジェクトの要素とは
言い難いし、多態も要素というより結果として得られる性質に近いと思うんだよなぁ。
まあすべては委譲です というか抽象化のためのパターンです
>>728 コードポイントで合ってるはず。
文字符号の1つずつの番号の場所をコードポイントと言う。
例えば、ASCIIコードなら、A の文字の番号である 0x41 の占めている
場所みたいなニュアンスがある。
>>742 追伸。なお、0x41の番号そのもののこともコードポイントと言う。
番号に就いては単に「コード」とも言うが、2019年現在において
単に「コード」と言ってしまうと、プログラムの内の命令が並んでいる
部分のことを指すことが多くて混乱が生じやすいので、文字符合の
番号に対しては、「コード」ではなく「コードポイント」という
ことがある。「文字符号」と言ってしまうと、ShiftJISの体系そのもの、
UnicodeやUTF8の体系そのものを指すことも有り、どうしても曖昧さが残る。
そこで、0x41という番号そのものの事を言っていることを曖昧さなく
示したい場合には、文字符号ではなく「コードポイント」ということがある。
int (*exec)(struct bContext *, struct wmOperator *) ATTR_WARN_UNUSED_RESULT; 上記はtypedef struct内に書かれていた関数ポインタの宣言で、 返り値がint、引数が(struct bContext *, struct wmOperator *)の関数ポインタexecなのは分かりますが 最後のATTR_WARN_UNUSED_RESULTって何でしょうか? 関数宣言って引数宣言の後に何か書けましたっけ?
いくつか用意した文字列の中から1つをランダムで表示するってどうやればいいかな?
配列辺りにぶっ混んでインデックスを乱数にして取り出すとか
std::minstd_rand mr std::uniform_int_distribution<> ui(0,StrS.size()-1); StrS[ui(mr)];//<- what? 大雑把にこういう感じ?
>>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; } >>752 C言語ですねぇ。C++だったら、<random>使いたいところですね。
なぜCで済むのにC++を使おうとするのか。 何のメリットがあるのか。 基礎が大事。
そもそも基本的にCもC++の一部なのでC風に書いたものはC++の回答としても 間違いではない。 「C++でのやり方」と言ってもC++は歴史が長いため、色々なやり方がある。 また最新の仕様を使うことがベストな選択とは限らず、むしろ分かりにくく なることも多い。
>>756 ちゃんと
>>752 のコードは、C++モードでもコンパイルは通るので、
立派にC++言語で書いたコードである。
> また最新の仕様を使うことがベストな選択とは限らず、むしろ分かりにくく > なることも多い。 自分がわからないだけでしょ
C++ は、もともとCにclassの概念を追加したものと言われている。 今回の様にclassを使うメリットが無い場合は、C++の内、 昔からあるCの部分で十分である。エンジニアリングの世界では 「simple is best」 だ。
>>759 新しい機能はC++委員会が好き勝手に追加しているだけで、
学ぶ意味が無い。
しかも、あなたも分かってないのに、人を馬鹿にするのはいかがなものか。
まずは動くコードが大事で、最新のやり方を使うことは重要ではない。
変に難しくしても意味がない。
better Cとか言ってる奴らが老害だってよくわかるね
Cで書いてもええけど > ((float)rand()) * STR_MAX / RAND_MAX ); この乱数に対する意識の低さがくそ
rand()なんか使ってる時点で商用ソフト書かせちゃいけないセキュリティ意識皆無のカスだって自白してるようなもの
>>765 間違えてた。正しくはこうだと思う: int idx = (int)( ((double)rand()) * (STR_MAX - 1) / RAND_MAX ); まだ間違いがあるかも知れんが。 >>766 知らなかっただけで、std::uniform_int_distribution のような便利なライブラリが
あるんだったらそっちを使ったほうがいい。
本当は、古いCに昔から入っているような rand() はアルゴリズムが良くなくて
モンテカルロシミュレーションなどでは余り良い結果が出ない。
昔やってみて分かった。ネットに転がってたもっといいアルゴリズムの乱数に
変えてみたら結果が良くなった。
今どきrand()が論外なのは別として剰余も知らんの?
何だこいつ > 新しい機能はC++委員会が好き勝手に追加しているだけで、 > 学ぶ意味が無い。 ↓ > 知らなかっただけで、std::uniform_int_distribution のような便利なライブラリが > あるんだったらそっちを使ったほうがいい。
>>769 rand()%Nは最悪のディストリビュータといわれている。
浮動小数でやるほうが幾分かましといわれる程度には。
>>769 剰余で
int idx = rand() % RAND_MAX;
のようにすると均等確率にはならないことがある。
俺の専門は数学に近いので分かる。
>>772 間違い修正:
誤:int idx = rand() % RAND_MAX;
正:int idx = rand() % STR_MAX;
このように書いた場合、直感では、RAND_MAXがSTR_MAXの倍数で無い場合
に均等確率にならないハズ。
低劣なrand()のさらに劣悪な下位ビットを使うくらいならアホが書いてる形の方がまだましではある rand()みたいな小学生でも推測できる危険極まりないゴミクズを使ってる時点で目くそ鼻くそだけど
>>771 おっしゃるとおり、そのやり方だと、
N が rand()の最大値 RAND_MAX の約数で無い場合には、均等確率になりませんね。
Nが2の累乗でない限り%Nは上位ビットも影響するけど
>>774 質問者は、
>>747 と書いただけなので、初心者的質問だとみなして
そんなに高度な乱数は必要ないと思ったので書いてみただけ。
初心者にこそrand()みたいな絶対に使ってはいけない危険物を紹介したらダメだろうが お前は初心者が入力読み込みの質問したらgets()を教えるのか?
>>774 >低劣なrand()のさらに劣悪な下位ビットを使うくらいならアホが書いてる形の方がまだましではある
あなたは、% と & を間違えてませんか。
x % y : x を y で整数除算したときの余り。
x & y : x と y の BIT 積 (and)。
std::minstd_rand は 線形合同法デス。 ! おわかりいただけただろうか。 mt19937最強!
>>780 劣悪だからっつってんだろ
あんなもの数個連続で観測されただけで簡単に予想できる
うっかりセッションIDやら初期パスワードやらの生成に使おうもんなら簡単に7pay案件だ
あんたそんな事も知らないでプログラマーやってんの?
>>781 rand()は昔も今もこれからも線形合同法のゴミだから今どきもクソもない
>>781 rand()が 閉区間 [0, RND_MAX] の整数値を均等確率で出力する場合に、
idx = rand() % STR_MAX;
とすると、STR_MAX が RND_MAX の約数で無い場合は端数のような部分が
同じ場所に集中して出現したり、抜けが起きたりして、idx は
[0, STR_MAX] の区間の整数値を均等確率で生じさせません。
>>783 >劣悪だからっつってんだろ
>あんなもの数個連続で観測されただけで簡単に予想できる
>うっかりセッションIDやら初期パスワードやらの生成に使おうもんなら簡単に7pay案件だ
>あんたそんな事も知らないでプログラマーやってんの?
自分の専門は自然科学系で、シミュレーションで使うことはありますが、
パスワード系で使うことは一度も想定したことが有りませんでした。
>>784 誤:[0, STR_MAX] の区間の整数値を均等確率で生じさせません。
正:[0, STR_MAX - 1] の区間の整数値を均等確率で生じさせません。
自然科学だとしてもあんな偏りまくりのクソ使っちゃダメだろ… まさかとは思うが2連続で呼んで座標値作ったりしてないだろうな もしやってたらそのシミュレーション全部カスだから作り直してやり直せ
>>787 実際、rand()を使ってモンテカルロ法をやってみたところ予想通りには行かなくて
かなりはまったことが有ります。その後、確か xor256 法などを使ってだいぶ
ましになりました。
>>788 さっきの例に出ていたキーワードで検索してさっき見てました。
なお、確率の均等性だけでなく、前後の相関が低いという意味において、
rand() より xor256 法は優れているようです。
モンテカルロやるんだったら、メルセンヌツイスタはグレートな動きするよ。 623次元均等分布とかいうよくわからんものだ。かなりクレイジー。 mt19937がそれだ。
みなさん、最初の質問は
>>747 というとても素朴なものであったのを
分かっておっしゃってますか?
お題:
>>794 ではvectorを返却値にしているが、これは何バイトコピーしていると考えられるか?
暇だったら考えてみて。
乱数って/dev/randomから取ってもいいんでしょ? なんか今システムコールもあるみたいだけど
>>796 うにっくす限定なので標準ライブラリを使ったほうがポータブルですよ。
まぁ、C++98とか使ってるならわからんでもない。
シミュレーションなら当然疑似乱数だけども 暗号用とか一発モノ
>>798 逆にメルセンヌツイスタでは秘匿情報を暗号化するのは絶対やめてくれといわれている。
詳しくはWikipedia読んでね。
明智抄の漫画持ってるくらいだからまあ理屈はわかっとると思うよ
>>747 です。たくさんアドバイスありがとうございます
C++のrandomすごい便利なんだけどstd::random_deviceが固定の乱数列しか返さない環境があることが問題だ。
https://cpprefjp.github.io/reference/random/random_device.html パスワード生成とかシミュレーションとかマウント取りたくてしかたない老害だらけだなw
>>747 はじゃんけんゲームだろ?
>>802 それマジクソだよな
エントロピー源が作れないなら作れないと例外でも投げろっての
黙ってインチキするなんて最低だ
線形合同法って下1ビット捨てればだいたい解決するんじゃね?やったことないからわからないけど
>>807 windowsのGCCじゃ無ければ問題ないだろうとiphoneのアプリで使ったら毎回同じ乱数列でな。
unixが何を制御してるか知らんが乱数のデバイスなんだからその先に原子炉の一つでも繋がってるんじゃねえの? そっからの出力が乱数じゃなくなったらヤバいことになってる
>>809 もしかして原子炉ではなくて、量子乱数生成器のことですかね。
なんで乱数のデバイスに原子炉がいるんだよw アバランシェでできるだろうが
乱数なんかでこんなに盛り上がってしまうのは これはアレだね
仕事がもらえてない駄目なプログラマーの集まりってことだな!
ずーっと安定して生かさず殺さず飼われている社畜が 肉食獣の食事後のような優雅な暇を知らねえのはまあ道理だ
乱数の扱いをミスるとXBOXのカルドセプトみたいになるぞ
vc++ でも、linux でも使える、STLライブラリとして、ずっと、STLPORT使っているけど、 今は、どんな状況になっているんだろ?
コンパイラのSTLでなんか不満あるんかいな。 今後は3年程度で新仕様はいるようになる予定だ。
>>808 マジかよ、他にもいたのか・・・
cpprefjpに書いといたら?
>>795 出題した者だが、自分の回答では、3変数程度のコピーで済む。
メモリへのポインタとキャパシティ変数と使用中を保持する変数。
64ビット変数だとして、24バイト程度と考えられる。俺には。
>>820 該当アプリはsololearnやね。
実務で使うわけでも無いしcpprefjpに書くのは恐れ多い。
>>779 % を使う、というのは「下位ビット」を使う、という意味と同じですよ
>>780 rand() は線形合同法でインプリメントされているので、乱数の質はあまりよろしくないのです
>>823 >>824
うぜーなーそんなもん誰でも知ってる
>>822 ああなるほど
あのアプリはどこかサーバーに送って実行してるというわけではないのね
それとも送った先がおかしいのか?
だれが rand() が危険と教えてるんだろう。 これが日本の教育か。嘆かわしい。
とりあえず rand 危険性 下位ビット 辺りで検索して出直してこい
このスレは、自分が馬鹿だと気づいてない人が多いのが問題。
質の悪い乱数 ≠ 危険 であることも理解できないとは。
頭の悪い人は、自分が頭が悪い事に気付かない。 それが最大の問題なんだ。 だから学歴フィルターで落とす。
馬鹿だから自分の判断よりも学歴で判断することになる。 あんなもんは足切り以外役に立たん。
馬鹿は馬鹿だと気付かないからな。 学歴フィルターがあるんだ。
& と% の違いもいくら言っても理解できないんだろ。 rand() の質が悪い事を危険と思っていたりとかな。
>>837 それはお前だろ。
今回の質問は、セキュリティー関係ないだろ。
mtだってセキュリティ目的で使うべきではないが他に分野では一般的に用いられる優秀な乱数 要件次第で何が良いかは変わる randは対応できる要件が少なくて大抵の場合xorやmtが上位互換になれる メモリ周りがキツい環境下ならmtは候補から外れることもある
一般に、ビット毎のANDと、剰余(余り)は別の演算だが、最適化によっては剰余がANDになることがある。
>>841 そんなもの誰でも知ってる。
and と mod は別の概念だ。
なんで最適化が出てくるよ?除数が2の冪かどうかだけだろ。
つか、事あることにセキュリティって言ってるけど、厳選された乱数を使うような、シビアなセキュリティのプログラム作るような人がここにいるの?
a=b*2^n だった場合、 rand() % a の下位 n ビットには元の rand() の下位 n ビットがそのまま現れる。 2の累乗だけでなく、2の累乗を約数とする場合も下位ビットの影響が大きい。
パスワード管理とか通信ソフトとかオンラインゲームとか。数える位は居るだろうよ。
>>826 試しにwebのsololearnでも試してみたとろmt19937のデフォルトと同じ乱数列を生成したのでcpprefjpに書いてあるWindowsのGCCと同じ挙動だな。
定義の前にvirtual付ければ仮想関数になるのは分かるんだけど、動的接続の意味がちょっと分からない
>>849 実行環境Mingwとは思えないので他にも同じことしてる実装があるんか
それとも独自実装なのか、まさか
>>851 定義済みマクロで調べてみたら実行環境Mingwぽい・・・・
sololearnの実行環境、Mingw GCC 7.2.0らしい Mingw GCCのrandom_deviceが治ったのは9.2から・・・
>>853 char_traitsのlengthがconstexpr対応してないのもあるよ。
その為にstring_viewがconstexprに出来ない。
constexpr を#if 〜 #endif マクロ で使えるようにできないですか?
rand使うときはまずMAXで割ってから、欲しい範囲をかけて使ってね
g++ -mtune=ivybridge -O3 -S こうやってもrdrand命令使ってくれないな
たぶんだけど、rdrand単体は信頼度が低いから必ずシステムの乱数源から取得するようにしてるんだと思う
>>840 純粋に質問です
>mtだってセキュリティ目的で使うべきではない
それはなぜですか?
cpprefjpでは624個の出力で次の出力を予想出来ると書いてるな。
>>865 ソフトウェアだけで作り出した乱数は予測可能だから
>純粋に質問です >>mtだってセキュリティ目的で使うべきではない >それはなぜですか? これはさすがにググレカス言うべきだろ。本人のためにも。 てかググって調べた方が実際本人のためだわ。
ちまたでは「丁寧な無視」がトレンドワードですが、C/C++でエラーを丁寧な無視することで得られるメリットを教えろください。
QZは不備のあるなし関係なしに質問には質問で返してるぞ マウント取りたいだけなんだろうな
大量の乱数(1000x1000)を高速に求める方法はありますか?
valarrayさんが仲間になりたそうにそちらを見ている。
Office2000でのイルカの消し方をイルカに質問する感性を大切にしたい。
文字列で指定したクラスのインスタンスを生成する方法ってあるのでしょうか?
コンパイル時ならテンプレート 実行時ならDBでも用意してcaseでも使え
あるけど生成したインスタンスを静的に受けとるには生成されるクラスの種類がポリモーフィズムをとれないといけない
>>885 個人的には C++ にはそういう機能はないんではないかと思うんですが。
生成したいクラスのリストがあらかじめわかっていれば可能
decl_typeが文字列を受け付ければいいが、あれも静的に解決してそうだなぁ。
>>882 文字列とクラスの対応はtype_info::name()で与えられているが
文字列の形式が処理系定義であることに注意が必要
>>886 その通りだが
自分で規定を作ってしまえ良い
全てのクラスを単一のメタクラスから派生するルールで統一汁
Typeを保持するタイプが欲しいわ。。 type t=int; 的な。
実行時に文字列で指定したいのかソースコードレベルの話なのかわかんねえ
共通の親クラス持たせてmapのキー文字列にして生成用の関数ぶっこめばいいけど 親クラスが共通じゃない場合は難しいのかな
全クラスに対応する必要なんてないんだったらこんな感じでいいんじゃないか enum ClassName{ Hoge, Hige, Hage } std::any func(ClassName name){ std::any out; switch(name){ case ClassName::Hoge: out = new Hoge(); break; case ClassName::Hige: out = new Hige(); break; case ClassName::Hage: out = new Hage(); break; } return out;} int main(){ //なんか文字列を受け取る ClassName name; //文字列をClassNameに変換する auto fuga = func(name); if(fuga.type() = typeid(Hoge*)){ auto hoge = std::any_cast<Hoge*>(fuga); //hogeの処理 } else if 以下略 }
全クラスをユーザーが把握している必要があるなんてクソ設計だな
なぜAbstractFactoryパターンを使わないのか
>>882 GUIDで指定したクラスのインスタンスを生成する方法なら
COMのCoCreateInstance()がそれだが参考になるか?
ユニークでなければならないクラス名を文字列で指定はかなりキツいという意味で
必要な情報が色々と抜けていたのに、色々と情報をいただきありがとうございます。 私が考えていたのは実行時に型を登録するようなクラスを使う方法です。 仮コードですが下記のような感じです。 template<typename BaseType> class InheritanceContainer{ struct IInheritance{ // BaseTypeを継承したクラスを生成 virtual BaseType* Create() const = 0; }; template<typename Type> struct Inheritance : public IInheritance{ virtual BaseType* Create() const{ return static_cast<BaseType*>( new Type() ); } }; public: // 型情報の登録 template<typename Type> bool Add(){ std::unordered_map<std::string, IInheritance*>::iterator it = m_InheritanceMap.find( ctti::nameof<Type>().cppstring() ); // ctti::nameof<Type>().cppstring() cttiライブラリーを利用して型の文字列を取得する if( it != m_InheritanceMap.end() ) return; m_InheritanceMap.insert( std::make_pair( ctti::nameof<Type>().cppstring(), new Inheritance<Type>() ) ); } // 文字列に合わせた BaseType を継承した物を生成 BaseType* Create( const std::string& _TypeText ){ std::unordered_map<std::string, IInheritance*>::iterator it = m_InheritanceMap.find( _TypeText ); return it != m_InheritanceMap.end() ? it->second->Create() : NULL; } private: std::unordered_map<std::string, IInheritance*> m_InheritanceMap; }; 一応これでも要件は満たしているのですが、 いかんせんこれだと使うクラスを予め手動で登録している必要があり、 保守管理が手間なので皆様のお知恵を拝借できればと思い質問した次第です。 頂いた情報はこれから勉強します。
基本的な事なのですが教えてください。 memcpy可能なクラス若しくは構造体はどうやって判定するのがスマートですか?
>>904 1から作られればそうするのですが、c言語のベースがあって、それをコピペでc++で改修して、そいつの改造なんでどうしても必要なんですよ。
手を出せない共通処理がmemcpyを使ってるから、チェック処理が必要だったので
>>903 自分で解析するかコード書いた人に保証してもらうしかないと思うよ。
基本型だからコピーしても大丈夫と思ったら参照カウンタとして使われていた、なんてこともあるだろうし
std::is_trivially_copyableとか?
C互換ということならstd::is_podがいいのかな
std::is_pod とかってどうやって実装されてるんだろう。 コンパイラのビルトイン? それとも template で作られてる?
type_traitsはだいたいビルトインでしょ コンパイラは知ってるはずの情報なんだから変なトリックコードで取る必要もない
>>911 自分で調査してみたところ、以下の様に、あなたのおっしゃるとおり、 中核部分は、__is_pod(クラス名) という「ビルトイン関数」を使っていました: // Could use is_standard_layout && is_trivial instead of the builtin. template<typename _Tp> struct is_pod : public integral_constant<bool, __is_pod(_Tp)> { }; /// integral_constant template<typename _Tp, _Tp __v> struct integral_constant { static constexpr _Tp value = __v; typedef _Tp value_type; typedef integral_constant<_Tp, __v> type; constexpr operator value_type() const noexcept { return value; } #if __cplusplus > 201103L #define __cpp_lib_integral_constant_callable 201304 constexpr value_type operator()() const noexcept { return value; } #endif }; >>901 pythonのPyObjectのコード観てみ
>>915 ありがとうございます
>>916 神になる方法が知りたくて‥
tk > wxWidgets > Qt > electron
stringstreamで std::stringstream ss; ss << value; std::string str = ss.str(); こんな感じで数値を文字列に変換すると、valueが3桁以上だった場合 12,000みたいな感じで勝手にカンマがついてしまうんだけど カンマがつかないフォーマットで出力する方法を教えてください
ss.imbue(std::locale("C")); でもしてみりゃいいんじゃね
ロケールの設定が原因でした wstringで日本語を扱いたくて std::locale::global( std::locale( "japanese" ) ); std::setlocale( LC_ALL, "japanese" ); ってやるとstringstreamでカンマが付くなんて知らなかった
std::list<int> l = { 7, 5, 16, 8 };
とすると、 l というリスト右辺で指定した要素で初期化した状態で作成されますが、
このときの std::list 自体の実装方法が知りたいです。
最新の C++ の方法論(?)によれば、右辺がコンパイラによって initiailer_list に
なって、list のコンストラクタにそれが仮引数の型として宣言してあるものがあって、
そこで処理しているのかと思い、確認のため、
http://cs.brown.edu/people/jwicks/libstdc++/html_user/stl__list_8h-source.html ↑
で、std::list のソースを見てみると、initiailer_list というキーワードが見つかりません。
ではいったいどういう仕組みで初期化しているのでしょうか。
operator=() は見つかります。
>>926 誤:とすると、 l というリスト右辺で指定した要素で初期化した状態で作成されますが、
正:とすると、 l というリストが右辺で指定した要素で初期化した状態で作成されますが、
誤:initiailer_list
正:initializer_list
>>926 一応マジレスしておくと、そのサイトの一番下を見よう
> Generated on Fri May 6 01:09:09 2005 for libstdc++-v3
initializer_listが導入されたのはC++11だからね
stl_list.hなんてコードは標準にはありません。 リンクドリストのよくあると思われる実装は、 struct node{ node* next=nullptr; node* prev=nullptr; T value(); } という構造体の操作等をクラス化したモノ。 なので、インデックサが無いはずである。
VC2019 の list ヘッダではちゃんと見つかりました。 みなさんありがとうございました。
また質問させてください。 VS2019 の tuple の実装を調べていて、utility というヘッダファイルに以下の ようなコードを見つけました。自分の直感では、これは、パターンマッチングを していると思うんですが、実は、以下の (1) にマッチングする場合、 (2) にもマッチングする場合があります。しかし、現実には (1) にマッチングする 場合には、コンパイラは (2) を無視して (1) だけを採用する必要があると 思うんですが、template には、マッチングに優先順位があって、定義した 順にマッチングするかを調べて、一番最初にマッチングしたものを採用して それ以後のものは無視すると言うような規則があるのでしょうか? // (1) template <class _This, class... _Rest> struct _Tuple_element<_This, tuple<_This, _Rest...>> { // select first element using _Check_type = int; static_assert( is_void_v<typename _Tuple_element<_This, tuple<_Rest...>>::_Check_type>, "duplicate type T in get<T>(tuple)"); using type = _This; using _Ttype = tuple<_This, _Rest...>; }; // (2) template <class _Ty, class _This, class... _Rest> struct _Tuple_element<_Ty, tuple<_This, _Rest...>> : _Tuple_element<_Ty, tuple<_Rest...>> { // recursive _Tuple_element definition };
>>933 なお、_Tuple_element は、 tuple tpl; に対し、get<番号>(tpl) としたときに呼び出される以下のコードから使われます。 結論的には、template を書いた順序ではなく、パターンマッチングおける強弱のような もので優先順位が決まっているようです。それは丁度、同じ名前に仮引数の型だけが 異なる複数の関数 が overload 定義されている場合に、どの関数が呼び出されるかを 決めるときのアルゴリズムに似ているようです。詳しくは分かりません。 // FUNCTION TEMPLATE get (by type) template <class _Ty, class... _Types> _NODISCARD constexpr _Ty& get(tuple<_Types...>& _Tuple) noexcept { // get reference to _Ty element of tuple using _Ttype = typename _Tuple_element<_Ty, tuple<_Types...>>::_Ttype; return ((_Ttype&) _Tuple)._Myfirst._Val; } >>934 誤:get<番号>(tpl) としたときに呼び出される以下のコードから使われます。
正:get<型名>(tpl) としたときに呼び出される以下のコードから使われます。
>>934 ちなみに、C++ における tuple とは、異なる型のオブジェクトの集合体のような もので、get<idx>(tpl) とすると idx 番目の要素が参照できます。 動的配列 vector、リンクリスト list は同じ型の集合体ですが、tupleは char, int, string 任意の順番で任意個数入れたりするようなことが可能です。 tuple は class を次々に継承することで実現され、N個の要素の場合は、 (N - 1) 回継承されて実現されています。 get<idx>(tpl) は、コンパイル段階で静的に型が決まるようになっており、 idx を 1 ずつ減らしながら idxが0 になるまでtemplateを再帰的に具現化(展開)し て行っています。その際、基本クラスへの「cast」を利用して上手く実装されています。 get<TYPE>(tpl) は、その TYPE 版で、tuple の中の TYPE 型の要素を取り出すもので、 TYPEの要素が一個だけであることを仮定しています。 >>934 の using _Ttype = typename _Tuple_element<_Ty, tuple<_Types...>>::_Ttype; return ((_Ttype&) _Tuple)._Myfirst._Val; の部分は、丁度 TYPE = _Ty の場合のもので _Tuple_element<_Ty, tuple<_Types...>> の部分が、再帰的に template 具現化を使って _Ty の型の要素が先頭になるまで tuple の要素を減らす処理を行っており、_Ttype には、その tuple の型が入ります。 次の return 文は、cast を行っている部分です。 >>933 の(2)は、再帰的に tuple の先頭の要素を除去して行くマクロで、(1)は、 tuple の先頭が _Type になった場合にマクロ展開の動作を停止するためのものです。 recursive _Tuple_element definition って書いてあるから
>>933 の(1)(2)併せてtupleのバッカス・ナウア記法
>>938 >>933 は単純な BNFとはかなり違うはず。
C#には文字列で指定したメソッドを呼び出す方法がありますが、 C++ではそういった事をしたい場合、どういった方法があるのでしょうか?
なんかこのスレだけ(っていうか特定のレスだけ?)貼られてるソースのフォントが微妙に違う気がするんだが気のせい?
>>940 最近他のスレで同じ質問を観たけどマルチ?
mapに入れるにしても呼び出す関数の引数戻り値の型が一致してる必要があるくね
>>946 なるほど
何が引っかかってるんだろ
>> とか << が多い程度じゃ判別されないはずだが
>>940 関数名の文字列ではなく、関数ポインタを使えばやりたいことができる可能性は高い。
または仮想関数。
C++は名前と引数が同じで戻り値が違うくらいでは別物として扱ってくれない。 ドットネットだと大丈夫だった気がする。
https://ideone.com/0A6NGs こんなコード書いてみた。やはり戻り値を推定して関数分けてもらえない。
factory<int>の<int>を消したい。
>>951 うろ覚えだから、間違ってたらそーりー。
んなめんどいことせんでも関数2つぐらい作って関数ポインタの配列に入れりゃいいだけだろ
>>944 俺が見たのは、文字列からクラスのインスタンス作りたいだったから微妙に違う
まあそれ用のレイヤ噛ますのが素直だよね .netみたいなのがあればそれでいいし、CのGLibみたいなのもちょっと無理を感じなくもないがアリ
>>953 昔のC++では、確かに戻り値の型は同名関数の絞込みには使用されなかったよ。
今は知らない。
戻り値だけ違う関数を作りたきゃテンプレートを使え 以上
TypeHolderTypeがほしい。 リフレクションは23で入るそうな。
リフレクションどうやって実装するんだろう・・ 現行のC/C++とリンカの仕様と互換性たもったまま実装するのかなり難しそうだけど
>>963 不可能はあるよ
バカにC++を理解するのは不可能
structured bindingで定義した変数をラムダ式でキャプチャするとclang7はエラー、gcc7は通る。 いずれもc++17指定。 使用上正しいのはどっち? const auto [a,b]=std::make_tuple(1.0,0.0); auto f=[&](){ return a+b; };
>>965 clangが正しい
N4713 8.5.4.2 Capturesの段落8にこう書いてある
If a lambda-expression explicitly captures an entity that is not odr-usable or captures a structured binding (explicitly or implicitly), the program is
ill-formed.
>>966 ありがと
この仕様の真意が理解できないが、そういう仕様では仕方ないな…
ちなみに [a,b] は、std::tie(a,b) と書くのと同じですか? また、[a,b] はなんという名称(概念)ですか?
>>969 自己レスですが、[a,b] は、これですか:
https://en.cppreference.com/w/cpp/language/structured_binding ↑Structured binding declaration (since C++17)
int a[2] = {1,2};
auto [x,y] = a; // creates e[2], copies a into e, then x refers to e[0], y refers to e[1]
auto& [xr, yr] = a; // xr refers to a[0], yr refers to a[1]
>>969 tieでは事前に定義した変数に代入することになるじゃん
つーことはconst変数にできない
>>961 decltype(auto) f(){} ができればよいのだけどね。
Aクラスを継承したテンプレートで型を指定したメンバー変数cを持つ、Bクラスがある。 BクラスをキャストしたAポインタ仮想メソッド使ってBのメンバー変数cを取得したいんだけど、ダウンキャストしかないかね? class A{}; template<typename _T> class B : pubulic A{ pubulic : _T c;} A *a = new B<int>; int ret = A->???;
BのインスタンスをAにアップキャストした時点でAにないメンバは破棄されるのでAのポインタからcにアクセスすることはできない
いろんな型をリスト化する為です。 実際はAポインタの配列
TypeHolderTypeがほしいのじゃーーーーー!!!
cにアクセスしたい人はBを知ってるんだから、ダウンキャストでもなんでもやりゃぁええがな。
ダウンキャストより先にテンプレートメソッドパターンを検討してみては?
>>976 class A {
public:
virtual void func(void *) = 0;
};
ダウンキャストの必要が出てきたらvirtualで何とかならんか考えれ
AとBだけじゃなくてどうせAの派生クラスはCやらDやらあってそれらもA*で扱うんでしょ。 ホントの型の判別やって型に応じて処理するんだろうしダウンキャストでええがな
それって欲しいのはunionてことじゃね? それかAにすべてのメンバ乗せたらええやん。
コンパイル時に自身のソースコード解析してリフレクション作ることとかできないですか?
>>988 そんなことやっても結局正体を知った上での個別処理になるわけだから
素直にダウンキャストしとけと
vtableがあればdynamic_castもできるのに何でダウンキャストなんだ?
read.cgi ver 07.7.25 2025/07/21 Walang Kapalit ★ | Donguri System Team 5ちゃんねる
lud20251025053103caID:29yFlgBGのレス一覧: まあすべては委譲です というか抽象化のためのパターンです
>>728 コードポイントで合ってるはず。
文字符号の1つずつの番号の場所をコードポイントと言う。
例えば、ASCIIコードなら、A の文字の番号である 0x41 の占めている
場所みたいなニュアンスがある。
>>742 追伸。なお、0x41の番号そのもののこともコードポイントと言う。
番号に就いては単に「コード」とも言うが、2019年現在において
単に「コード」と言ってしまうと、プログラムの内の命令が並んでいる
部分のことを指すことが多くて混乱が生じやすいので、文字符合の
番号に対しては、「コード」ではなく「コードポイント」という
ことがある。「文字符号」と言ってしまうと、ShiftJISの体系そのもの、
UnicodeやUTF8の体系そのものを指すことも有り、どうしても曖昧さが残る。
そこで、0x41という番号そのものの事を言っていることを曖昧さなく
示したい場合には、文字符号ではなく「コードポイント」ということがある。
int (*exec)(struct bContext *, struct wmOperator *) ATTR_WARN_UNUSED_RESULT; 上記はtypedef struct内に書かれていた関数ポインタの宣言で、 返り値がint、引数が(struct bContext *, struct wmOperator *)の関数ポインタexecなのは分かりますが 最後のATTR_WARN_UNUSED_RESULTって何でしょうか? 関数宣言って引数宣言の後に何か書けましたっけ?
いくつか用意した文字列の中から1つをランダムで表示するってどうやればいいかな?
配列辺りにぶっ混んでインデックスを乱数にして取り出すとか
std::minstd_rand mr std::uniform_int_distribution<> ui(0,StrS.size()-1); StrS[ui(mr)];//<- what? 大雑把にこういう感じ?
>>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; } レス:1-200 201-400 401-600 601-800 801-1000 ALL
このスレへの固定リンク: http://5chb.net/r/tech/1563769115/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓「C++相談室 part144 ->画像>1枚 」 を見た人も見ています:・C++相談室 part163 ・C♯相談室 Part20 ・C++相談室 part135 ・C++相談室 part142 ・C++相談室 part145 ・C++相談室 part138 ・C++相談室 part134 ・C++相談室 part136 ・C++相談室 part137 ・C++相談室 part132 ・C++相談室 part117 ・C++相談室 part140 ・C++相談室 part166 ・C++相談室 part149 ・C++相談室 part154 ・C++相談室 part151 ・C++相談室 part153 ・C++相談室 part157 ・C++相談室 part158 ・SC相模原60 ・C++相談室 part165 ・Excel総合相談所 147 ・Excel総合相談所 153 ・東海地方の結婚相談所 ・Excel総合相談所 157 ・Excel総合相談所 144 ・東海大相模part57 ・Access総合相談所 30 ・Excel総合相談所 144 ・Access総合相談所 31 ・Excel総合相談所 152 ・田中邦衛相が初会談 ・Excel総合相談所 150 ・Excel総合相談所 128 ・Excel総合相談所 156 ・登山靴購入相談スレ ・Excel総合相談所 145 ・Excel総合相談所 149 ・Excel総合相談所 140 ・Excel総合相談所 124 ・エアコン修理相談 2 ・Excel総合相談所 148 ・Excel総合相談所 139 ・Excel総合相談所 143 ・相談サイトを語るスレ ・Excel総合相談所 132 ・メイ「書き方相談」 ・東海大相模part51 ・ホモ増田の人生相談 ・Excel総合相談所 89 ・換気総合・相談スレ ・C++Builder相談室 Part21 ・ツーリングコース相談 ・C++相談室 part148 ・人生相談 ・お薬相談 ・恋愛相談です ・荒らし相談室 ・相談なのですが ・恋愛相談します ・相談があります。 ・C++相談室 part156 ・C++相談室 part162 ・C++相談室 part159 ・【初心者】キリスト教@歓談室75【歓迎】
13:08:24 up 23 days, 4:30, 4 users, load average: 122.81, 89.69, 82.69
in 3.7443358898163 sec
@[email protected] on 111503