18/02/12 12:43:48.54 qekpeHDJ0.net
>>122
まずは"C"の入門書を読んで、何を見間違えたのかはっきりさせてからにしようか。
128:デフォルトの名無しさん
18/02/12 14:08:57.84 sGdsmrZD0.net
初心者スレに池
129:デフォルトの名無しさん
18/02/12 20:44:41.93 gfcybQxo0.net
>>122
気のせい。
130:デフォルトの名無しさん
18/02/13 00:10:36.10 YGwN9DGw0.net
>>122
Cにnamespaceは無いだろ
131:はちみつ餃子
18/02/13 17:30:20.31 tUR5ZBgZ0.net
構造体タグと型名の名前空間が分かれているといったような意味での名前空間は C に有るが
C++ では構造体タグはそのまま型名としても使えるし、そういう意味での名前空間の話かな?
132:デフォルトの名無しさん
18/02/13 17:45:08.06 a1RYP/Gm0.net
こんな名前空間もあるね
int x;
int main(void)
{
x = 1;
int x;
x = 2;
{
int x;
x = 3;
}
return 0;
}
133:デフォルトの名無しさん
18/02/13 17:55:17.58 Xr6xvVy+M.net
それはスコープでは
134:デフォルトの名無しさん
18/02/13 18:15:03.36 a1RYP/Gm0.net
変数だよ
代入でもあるね
135:デフォルトの名無しさん
18/02/13 20:09:02.02 NNOtJgpO0.net
謎すぎワロタがそこから上のスコープのxを参照してくれ
136:デフォルトの名無しさん
18/02/13 20:19:22.41 Za/EZbH7M.net
ブロックって言ってる
137:デフォルトの名無しさん
18/02/13 21:49:01.90 a1RYP/Gm0.net
アホばっかり
がっかり
138:デフォルトの名無しさん
18/02/15 12:08:37.28 Sgd3BwBT0.net
std::mapのように文字列や構造体をキーにした高速アクセスができて、
要素の数が一定数を超えたらLRU形式で勝手に削除してくれる、
キャッシュのような機能を実装したいのだけど、
C++でそのような仕組みを作れるクラスはないですか?
139:デフォルトの名無しさん
18/02/15 17:00:44.45 GbCJk+7h0.net
自分で実装するならどうにでもなるだろ
そのための道具は全て標準で揃っている
140:デフォルトの名無しさん
18/02/15 18:15:51.96 6url8MQd0.net
バックグラウンドならスレッド使うしかないんじゃないかな
141:デフォルトの名無しさん
18/02/15 19:13:27.39 CSnzpiZpM.net
C++のプログラマーって性格ねじ曲がってるなあ
初めてGo応援したくなったわ
142:デフォルトの名無しさん
18/02/15 19:34:35.63 95vLe5Bi0.net
>>137
どんな点が、性格悪い、と思わせるのですか?
143:デフォルトの名無しさん
18/02/15 20:03:21.73 qihnyYvs0.net
それだよそれ
144:デフォルトの名無しさん
18/02/15 21:14:35.68 MoAPifjS0.net
C++は多分チューリング完全だと思う
145:デフォルトの名無しさん
18/02/15 21:20:32.50 6nYos/bmM.net
>>136
要素数が閾値を超えるのは要素が追加される時だからその時に古い奴を削除すりゃいいだけじゃね?
146:デフォルトの名無しさん
18/02/15 23:50:52.95 fG1U9Z3qM.net
>>135
簡単で良いのでサンプルコード書いてもらえませんか?
147:デフォルトの名無しさん
18/02/16 00:43:14.82 uaG+5sVQ0.net
>>135じゃないけどシンプルにいくなら
{
map<key,value> data; // 本来のデータ
map<key,list<key>::iterator> lruindex; //
list<key> lrulist; // LRUリスト
... // mapと同じインターフェイス
}
みたいなクラスで要素の追加・削除・参照とかの時にLRUリスト見て処理すればいい
148:デフォルトの名無しさん
18/02/16 03:16:29.76 DpsRPWWQ0.net
辞書・線形リスト・2分木を、組み合わせる。Ruby で書くと、
class LRU_hash
def initialize (max_size = 3)
# ary は、hash に追加・アクセスした順
@hash = {}; @ary = []
@max_size = max_size
end
def push (key)
if @hash.has_key? key
# 一旦、要素を削除してから、最後尾に追加しなおす
@ary.delete key
else
if @max_size == @hash.size
# 先頭要素を削除してから、最後尾に追加する
@hash.delete(@ary.shift)
end
@hash[key] = true
end
@ary.push key
end
def print_buf
puts @ary.join ', '
end
end
ary = ["あ", "a", "あ", "い", "b", "あ", "c"]
hash = LRU_hash.new 4
ary.map { |key| hash.push key }
hash.print_buf #=> い, b, あ, c
149:デフォルトの名無しさん
18/02/16 04:31:51.17 .net
>>144
> # ary は、hash に追加・アクセスした順
参照のたびに最後尾に追加しなおすの?
150:デフォルトの名無しさん
18/02/16 06:27:04.53 HICjIKnm0.net
プログラムを作っていて困っています。
プログラム動作環境、windows 7 x86_x64
プロセスをExplorerを親として、
起動したプロセスにファイルの存在するディレクトリを作業ディレクトリとして
割り当てたい。
ただし、プロセスへのアタッチによる変更は禁止とする。
ようするにファイルをダブルクリックして起動するのと同じ状況を再現したいのです。
例
C:\hoge\fuga.exe
[現状]
Explorer C:\hoge\fuga.exe
親
explorer.exe
カレントディレクトリ
C:\Windows\System32\
[理想]
Explorer C:\hoge\fuga.exe
親
explorer.exe
カレントディレクトリ
C:\hoge\
151:144
18/02/16 07:56:00.35 DpsRPWWQ0.net
>>145
>>134
で、LRU と書いてあるから、Hash に追加しようとした度に、
すでに存在する場合でも、配列の最後尾に追加しなおした
どういう意味か、正確にはわからないけど
152:デフォルトの名無しさん
18/02/16 08:03:01.53 TOIQut300.net
>>146
explorer.exeへのショートカットを作ってプロパティで作業ディレクトリを指定するか、
COMでIShellLink::SetWorkingDirectoryを使って同じことをするあたりか?
153:134
18/02/16 09:56:21.20 +b2iJMK40.net
みなさんありがとうございます。
std::mapにLRUや最大要素数の仕組みを持たせた派生クラスでも
無いかと思ったのですが、標準ではやっぱり無いですか。
>>143のように、std::mapをメンバの一つに持たせた独自クラスを
一から作っていくことになるんですかね。
154:デフォルトの名無しさん
18/02/16 10:11:55.71 JoalkiMd0.net
amazonランキングの謎を解く とか言う本でmove-to-frontを見た
本の紹介「Amazonランキングの謎を解く」
URLリンク(www.kenkyuu.net)
>「move-to-front規則」(最後に売れた順に並べる、つまり、注文のたびに1位にジャンプする)
Move To Front - Wikipedia
URLリンク(ja.wikipedia.org)
155:
156:デフォルトの名無しさん
18/02/16 10:54:10.09 TOIQut300.net
ageだね
157:デフォルトの名無しさん
18/02/16 14:25:37.67 UjPhOEUu0.net
>>149
「c++ lru map」でググったか?
いくつかサンプルになりそうなコードが見つかるんだけど
158:デフォルトの名無しさん
18/02/16 18:05:58.99 GGXfeEqkM.net
江添さんのC++17本予約しようかな
159:デフォルトの名無しさん
18/02/16 18:26:06.12 waI0am5S0.net
予約しなくても売れ残るからいつでも買える
160:デフォルトの名無しさん
18/02/16 20:04:35.13 1Lr9lxEpa.net
C++を勉強しようと思ってる者ですが書籍を探しております。Cはある程度書けるのでそれを前提とした書籍が欲しいです
161:デフォルトの名無しさん
18/02/16 20:33:50.33 Rc+MuzY40.net
C++ クイック入門&リファレンス
プログラミング言語C++ 第4版
162:デフォルトの名無しさん
18/02/16 20:36:34.10 9b60nRDg0.net
>>155
C++11 以前だが accelerated c++, ここでフォローするよ
163:デフォルトの名無しさん
18/02/16 20:37:11.23 TOIQut300.net
禿4は俺も推奨する
C++11の良本だ
164:デフォルトの名無しさん
18/02/16 21:09:12.34 +EaaPhKWa.net
めっちゃ高いけどその価値あるのね
165:デフォルトの名無しさん
18/02/16 21:46:03.21 5AmFsIq1M.net
こっちはフッサフサやでURLリンク(images-na.ssl-images-amazon.com)
166:デフォルトの名無しさん
18/02/16 22:03:34.89 qDhjnryl0.net
誰がハゲやねん
167:デフォルトの名無しさん
18/02/17 09:43:48.64 Lqib7/b9F.net
以下のようにconst char*型の文字列でchar*型の変数を初期化したいときに
strcpyやstrlenを書かずにstd::stringを利用して短くかけないかと思うのですが
msvcだとエラーにならず、clang, gccだとdeleteでセグメンテーション違反になります。
どうすればより良い感じになるでしょうか?const_castはできれば使いたくないです。
#include <string.h>
#include <string>
#include <iostream>
int main()
{
const char* asdf = "asdf";
// char* psz2 = new char[strlen(asdf)+1];
// strcpy(psz2, asdf);
std::string *psz = new std::string(asdf);
char* psz2 = &(*psz)[0];
std::cout << psz2 << std::endl;
delete psz2;
return 0;
}
168:デフォルトの名無しさん
18/02/17 09:51:35.08 mykV+fTk0.net
delete psz2なんてしちゃだめconst関係ない
169:デフォルトの名無しさん
18/02/17 10:21:38.22 4SqFrjwY0.net
何故stringそのものじゃなくて内部データをdeleteしようと思ったのか
newで確保した配列じゃないからdeleteはできない
stringの内部データは静的な配列と動的な配列を組み合わせて表現されている
mscvの場合先頭16文字はchar[16]でそれ以降は動的な配列に入るようになっている
psz[0]のアドレスはchar[16]の先頭アドレスなので当然deleteできない
msvcはdeleteに失敗しても落ちないのかな
170:デフォルトの名無しさん
18/02/17 10:47:53.57 IU1gsQgu0.net
>>155-159
本格的な本なら、ロベール、ハーバート・シルトの独習
軽めの本なら、柴田 望洋、林 晴比古、猫
171:デフォルトの名無しさん
18/02/17 11:22:13.08 ++v6vSjK0.net
ハンガリー人まだ絶滅してないのか。
stringはnull terminatedでないからpszはおかしい。
psz2もnull terminatedの保証がないからc_strを使うべき。
うまくいったらstrdupも調べとこうな。
172:デフォルトの名無しさん
18/02/17 11:25:45.81 szUqPRvW0.net
>>162
char* psz2 = &(*psz)[0]; って
char* psz2 = psz->c_str(); と同じなのかな?
いずれにせよ delete psz; は出来る(するべき?)だけど、
delete psz2; は出来ないんじゃないかな。
173:デフォルトの名無しさん
18/02/17 11:30:29.43 mykV+fTk0.net
必要ないところでnew/delete使う人は根本からして
174:何も分かってない
175:デフォルトの名無しさん
18/02/17 15:18:23.73 YAgvIyFy0.net
>>162
お前はstringがただの配列だと思っているのか?
このトンチキ野郎!
176:デフォルトの名無しさん
18/02/17 16:50:38.35 Q4Uv6cZz0.net
>>162
弁護士の唐沢です
しっかり「char* const」と「const char*」の違いを認識しなさい
const char*は参照先の定数を変更しない事を保証する宣言であり、char*は参照先の定数を変更できる為、const char*で保持するアドレスをchar*にコピーする事は言語仕様により禁止されています。それは分かるよね?
最初に宣言したポインタを間違えて別アドレスで上書きしないようにconstで固定したいのなら、char* constを使うようにしましょう。とりあえずとりいそぎ
177:デフォルトの名無しさん
18/02/17 17:22:58.60 0j+aLKWi0.net
>>162
strdupという手があるが何がしたいのか今一つ分からない
const char* asdf = "asdf";
char *p = strdup(asdf);
std::cout << p << std::endl;
delete p;
178:デフォルトの名無しさん
18/02/17 17:31:15.32 CLg9GPlRM.net
>>170
それ誰に指摘してんの?とりいそぎ。
179:デフォルトの名無しさん
18/02/17 17:34:22.09 4SqFrjwY0.net
>>167
データは連続しているので同じになる
16文字まではスタックを使い、それ以上の長さになるとヒープにコピーされる
実装ではメンバの配列には何かしらのエスケープ文字が入る
ちなみにmsvcでは実装の都合上free(&str[0])で強引に解放できる
180:173
18/02/17 17:49:08.26 4SqFrjwY0.net
補足
スタックとヒープを使い分けるかどうかは実装依存
gcc、clang、msvcでは行われている
したがって短い文字列でnewを避けるためにstringを使わないというのは意味が無い
181:デフォルトの名無しさん
18/02/17 18:06:03.81 .net
>>171
strdupで確保した領域をfreeでなくdeleteするのは正しいの?
182:デフォルトの名無しさん
18/02/17 18:09:26.31 Lp1rq1Kt0.net
良いみたいだ
中でmallocで確保している
183:デフォルトの名無しさん
18/02/17 18:10:04.88 Lp1rq1Kt0.net
違う、freeで開放する
184:デフォルトの名無しさん
18/02/17 18:14:21.37 Q4Uv6cZz0.net
>>175
弁護士の唐沢です
mallocとdeleteは併用厳禁です。freeを使用してください
185:デフォルトの名無しさん
18/02/17 18:18:24.62 DOQJ47ER0.net
昔から気になってるんだが「解放」だよね...
186:デフォルトの名無しさん
18/02/17 18:25:00.27 Lp1rq1Kt0.net
そうでした、ごめんね
187:デフォルトの名無しさん
18/02/17 18:25:45.10 JVoP/9zU0.net
>>176
良くねえだろ ぼけ
>>179
開放はpublic的なニュアンスだよな
188:はちみつ餃子
18/02/17 18:45:39.74 uBckbaXI0.net
>>162
ぶっちゃけた話、 strcpy が一番短いと思う。
189:デフォルトの名無しさん
18/02/17 18:59:50.35 .net
>>182
strdup という答えが出てるのに何言ってるの?
190:はちみつ餃子
18/02/17 19:05:58.96 uBckbaXI0.net
>>183
strdup は C++ の仕様の範囲内ではないので……。
POSIX と MSVCRT に有るからほとんどの場合に十分といえば十分なのかもしんないけど。
191:デフォルトの名無しさん
18/02/17 19:07:20.59 u7LZaTzx0.net
>>166
接頭辞を見ればデータ内容の属性がワカルというメリットは他に代え難い
URLリンク(local.joelonsoftware.com)間違ったコードは間違って見えるようにする
あといちいちthis->xと書くよりも、すすんでm_xと書きましょう
192:デフォルトの名無しさん
18/02/17 19:21:01.63 u7LZaTzx0.net
strdup()だと明示的に開放コードをどっかに書かなくてはならなくて必ず忘れるので
せっかくC++なのでスマポ的にwrapすると良いと思う
193:デフォルトの名無しさん
18/02/17 19:37:41.81 JVoP/9zU0.net
ホワイトボックスなCでは許せるが
ブラックボックスなC++の流儀には全く合わない
それがstrdup
194:167
18/02/17 19:53:11.68 szUqPRvW0.net
>>173-174 教
195:えてくれてありがとう。 返されるアドレスは等しい値なのか、という単純な質問だったんだけど、 読み直してみたら分かりにくい質問文だと思っていた次第。 それにしても &(*psz)[0] って結構ややこしいのね。 オーバーロードされた[]演算子が返すcharへの参照、 に対してアドレス演算子&を作用させた結果、て感じかな。
196:162
18/02/17 20:37:30.76 uaRb1j8RM.net
すみません、たくさんレスありがとうございます。
_strdupにしてみたら期待の動作ができました。
ありがとうございました。
197:162
18/02/17 21:27:34.68 uaRb1j8RM.net
また質問してすみません。
msvc(vs2017)だとコンパイラをC++17にしても以下のプログラムで
C2664 'void (T *&)': 引数 1 を 'hoge *' から 'hoge *&' へ変換できません。
となってしまうのですが、コードにバグが有るでしょうか?msvcのバグでしょうか?
GCCやClangではコンパイルできます。
#include <memory>
struct hoge {};
template <class T>
inline void safe_delete(T*& p) {
if (p) {
delete p;
p = nullptr;
}
}
int main() {
std::unique_ptr<hoge, decltype(&safe_delete<hoge>)> sp{new hoge(), safe_delete<hoge>};
return 0;
}
198:デフォルトの名無しさん
18/02/17 22:11:53.16 IU1gsQgu0.net
(T *&)
そもそも、ポインタ・参照を、同時に使えるのか?
199:片山博文MZ
18/02/17 22:23:52.63 EwTJGG8Pd.net
new hoge()は変数じゃないから、代入できない。
200:
18/02/17 22:35:58.53 I0BNlfaX0.net
>>165
独習C++ はいいですね、特に演習問題「std::stringを再実装する」を絶賛します
これが書けるようになったらC++初級者をかたってもいいかもしれない、もしかすると解答は載ってなかったかもしれないけれども
201:デフォルトの名無しさん
18/02/17 22:35:58.70 ++v6vSjK0.net
>>185
どこから引用したのか知らんけど、そのページ読んでないだろ…
システムハンガリアンはまるで役に立たないって書いてあるぞ。
202:
18/02/17 22:43:42.94 I0BNlfaX0.net
>>194
(システム)ハンガリアンってそんなに悪いものなんですかねえ
いや、win32api がバンバンハンガリアンしているので、そんなもんか、と思っていましたが
203:デフォルトの名無しさん
18/02/17 22:51:12.84 ++v6vSjK0.net
>>195
OOPともTMPとも型推論とも相性が悪いからね。
MS自身ももう使うなって言ってる。
204:デフォルトの名無しさん
18/02/17 22:52:19.16 YAgvIyFy0.net
頭悪いヤツが多様するハンガリアン
205:デフォルトの名無しさん
18/02/17 22:54:25.25 YAgvIyFy0.net
嫌いだからハンガリアン意地でも使わなかった
dwやらszやらせっかくのフリーフォーマッとが台なしだよ
206:デフォルトの名無しさん
18/02/17 22:59:56.16 Q4Uv6cZz0.net
フリーフォーマットはクソコードの温床ナリよ
207:デフォルトの名無しさん
18/02/17 23:03:12.11 4SqFrjwY0.net
型を変えるたびに変数名も変えるのか
ごくろうやな
208:
18/02/17 23:08:35.57 I0BNlfaX0.net
>>191
それは「ポインタ変数の参照」で、たしか便利に使えた気がしますが…
明日にでもちょっと書いてみます、今日は疲れました…
209:デフォルトの名無しさん
18/02/17 23:22:18.45 2kmwzB0g0.net
>>195
システムハンガリアンは弊害ばかりだろうけど、アプリケーションハンガリアンは適切に使えば有益だよ。
210:デフォルトの名無しさん
18/02/17 23:25:09.87 4SqFrjwY0.net
mとかいらなくねってなって削ったら_から始まるようになった
211:デフォルトの名無しさん
18/02/17 23:38:55.74 u7LZaTzx0.net
データの属性としてサイズとか型そのものを明示したいときはシステムハンガリアンするしかないし、
よってWIN32APIがシステムハンガリアンを使って定義されるのは全く正しい
問題なのはアプリケーションハンガリアンすべきときと
システムハンガリアンすべきときが区別できない香具師が適当に使うと
被害甚大だということやがな…
212:デフォルトの名無しさん
18/02/17 23:41:05.97 YmD9lIL
213:j0.net
214:デフォルトの名無しさん
18/02/17 23:42:44.53 u7LZaTzx0.net
>>205
なぜシステムハンガリアンが有り得ないのかkwsk
DWORDを渡すABIがある日突然気まぐれにUSHORTに変わったりしたら困りはしまいか
215:デフォルトの名無しさん
18/02/17 23:49:32.45 YmD9lILj0.net
ググればいいだろ
積極的批判
システムハンガリアンを使っているソースコードを修正してデータ型を変更した際、同時に変数名も変更するコストがかかる。変更を怠ると、たちまち不整合となり、保守の障害となるだけで一利もない。
C++やC#のような言語では型付けが存在するためにシステムハンガリアンを使用することによる利点はない[3]。
移植性を阻害する。
総称型、メタプログラミングとの相性が悪い。
消極的批判
いわゆる良書と呼ばれるようなC++本で、現在[いつ?]システムハンガリアンを採用している例が皆無。
かつてWindows API/MFCにおいてハンガリアンを全面的に採用していたMicrosoft自身が、.NET Frameworkではハンガリアンを禁止[1]している。
216:デフォルトの名無しさん
18/02/17 23:52:28.19 YEFSbrC50.net
申し訳ないがコピペディアからのウィキペはNG
217:デフォルトの名無しさん
18/02/17 23:54:40.85 4SqFrjwY0.net
型なんてマウスオーバーなりすれば表示されるだろ
変数名に書いておかなきゃわからないとかメモ帳で書いてるのかよ
218:はちみつ餃子
18/02/18 00:10:56.39 OOIPfNvY0.net
>>190
デリータはポインタが指す先のリソースを後始末するのが仕事であって、
ポインタが無効になるという処理は unique_ptr の側でやってくれるので、
ヌルを代入する必要はない。
むしろ unique_ptr 内で管理しているものをデリータが勝手に弄るのは好ましくないので、
参照で受けるのはやめてさしあげろ。
私なりに仕様を読んでこの場合をエラーにする根拠は発見できなかったが、
エラーになってくれる方がありがたい場面だと思う。
219:デフォルトの名無しさん
18/02/18 00:16:38.53 Ct2k6iqr0.net
デリータに渡されるのは左辺値と限らないからだろう。
220:はちみつ餃子
18/02/18 00:25:54.07 OOIPfNvY0.net
N3337 だと 516 ページの説明がデリータの要件だと思うんだけど、
デリータ d の型が D で ptr の型が unique_ptr<T, D>::pointer のとき式 d(ptr) が valid であることと書いてあって、
ptr が rvalue か lvalue かってのは特に指定がない。 (どこかに書いてあったりする?)
この説明で言ってる ptr が変数名なのだとしたら暗に lvalue とほのめかしてるようにも思えなくもないし、よくわからん。
わからんことは避けて通りたい。
221:はちみつ餃子
18/02/18 00:30:57.46 OOIPfNvY0.net
私なりの見解としては未定義だと思ってる。
未定義ならばやったらエラーになる方向にしてくれる方がありがたいという思い。
222:デフォルトの名無しさん
18/02/18 00:35:36.09 ju8BsRCFM.net
>>206
ABIにシステムハンガリアン関係ないだろ…
APIを指してるとして、呼び出し側はリファレンスマニュアルなりIDE機能なりを利用して引数の型情報も
システムハンガリアンが付いている仮引数名と同時に参照しているはずだよね?情報重複してるけど本当に必要?
仮引数名のシステムハンガリアンの有無に関わらず、APIのシグネチャは用意に変更してはならないものだけど、
そもそも仮引数名はシグネチャじゃないからシステムハンガリアンがついていたって何の保証にもならないよ?
223:はちみつ餃子
18/02/18 00:51:32.90 OOIPfNvY0.net
重複する情報をコンパイラの支援なく一致させ続けることが出来るだろうか。 いや、できない。
って話よね。
まあ世の中にはそういうのを検査するツールとかもあるんだろうけどさぁ、
そういうツールを導入できる環境ならまともな IDE だって使えるだろう。
224:162
18/02/18 08:06:35.40 F3zIry6ZF.net
>>210
>>211
レスありがとうございます。
shared_ptrだと行けるのでなんかすればコンパイル通るのではないかと
思ったのですがだめなんですね~。
普通に使う用とカスタムデリータに使う用と二種類用意してやり過ごしてみたいと思います。
template <class T>
inline void safe_release(T*& p) {
if (p) {
p->Release();
p = nullptr;
}
}
template <class T>
inline void custom_deleter(T* p) {
p->Release();
// p = nullptr; no meaning
}
225:デフォルトの名無しさん
18/02/18 12:41:44.81 OWXn9djh0.net
>>207
藻前はレスをきちんと読んでいないのではないか
>システムハンガリアンを使っているソースコードを修正してデータ型を変更した際、同時に変数名も変更するコストがかかる。(>>207)
に直接対応する元レス>>206は、
>データの属性としてサイズとか型そのものを明示したいとき(>>204)
について述べているのでデータ型変更時のコストを言い立てても批判にならない
消極的批判については、アプリケーションハンガリアンすべきときと システムハンガリアンすべきときが
区別できない香具師の的外れな批判がクソウゼーからそうなったのかもしれん、
(ちな両者を区別できない香具師への警戒も>>204で言及済み
226:デフォルトの名無しさん
18/02/18 12:42:38.82 OWXn9djh0.net
>>214
十分賢いIDEが人間のミスを完璧に排除してくれるんならそうかもしれんが
システムハンガリアンをしてはいけないという積極的理由にはやはりならないのであった
それとも「間違ったコードは間違って見えるようにする 」(>>185)の効能を全否定する?
APIの定義は変わらなくとも、それを利用するソースコードがころころ変わり得るわけで、
byStrLength
にある日だれかがDWORD型の値を突っ込んだとしたら…
こういうケースを考えたら、「接頭辞を見ればデータ内容の属性がワカルというメリット(>>185)」は
ありえないぐらい賢いIDEでも使わないと他に代え難いと思うがどうか、
>>198
>嫌いだからハンガリアン意地でも使わなかった
おk ようやく建設的な議論に着手できる、
227:デフォルトの名無しさん
18/02/18 13:01:54.53 Tc3/Tap60.net
あり得ないくらいバカなプログラマのことなんか考慮してない
228:デフォルトの名無しさん
18/02/18 13:02:14.72 hSV7DJYb0.net
マウスオーバーで変数の型を確認できたり、縮小変換に警告を出してくれたりする程度のありふれた機能が、ありえないぐらい賢いとな
お前さんはメモ帳でコーディングしてるのか
229:
18/02/18 13:06:54.12 AAhzNgFK0.net
>>220
emacs にもそんな機能がほしいと思うことがあります
230:デフォルトの名無しさん
18/02/18 13:20:53.92 y51LwXumd.net
システムハンガリアンでミスを減らせるなんて事はない
むしろ害悪
231:デフォルトの名無しさん
18/02/18 13:27:53.30 Tc3/Tap60.net
>>221
俺のemacsには搭載されてるんだが
環境構築もプログラマの腕のうちだからな
232:はちみつ餃子
18/02/18 13:30:05.77 OOIPfNvY0.net
>>221
有るよ。
irony-eldoc や company-mode を入れろよ。
Emacs こそ最強の IDE だろうが。
233:デフォルトの名無しさん
18/02/18 13:38:55.48 R2RwPqEs0.net
今時システムハンガリアンを使うやつはあり得ないくらいのバカだということが決定しました
234:デフォルトの名無しさん
18/02/18 13:41:43.01 IMbK2zhKM.net
>>218
間違ったコードは間違ったように見えるようにする、について、
あなたが指し示した引用元が言及してるのはアプリケーションハンガリアンについてなんだけど…
システムハンガリアンについては否定的意見。
ちゃんと読んだの?
235:
18/02/18 14:10:40.14 AAhzNgFK0.net
>>223 >>224
thanks a lot!!
236:デフォルトの名無しさん
18/02/18 14:15:44.65 IMbK2zhKM.net
>>218
APIの仮引数にシステムハンガリアンをつけたことで、間違ったAPI呼び出しが間違ったように見えるのはいつ?
APIのリファレンスなり宣言文なりを自分のコードと見比べたときでしょ?その時必ず型情報も見てるよね?情報重複してるよ?
あとIDEが自動でミスを排除してくれるなんて書いてないよ?ちゃんと読んで
237:デフォルトの名無しさん
18/02/18 15:46:49.02 Tc3/Tap60.net
入れる変数の型と引数の型を確認しない奴とかいるのか
暗黙の型変換は警告を出せばいいし
どうしても見落とすのならコンパイルエラーにしてしまえばいい
あとメンバ変数もテキストの色を変えればいいからm_もいらない
238:デフォルトの名無しさん
18/02/18 16:01:36.00 dLlRK2Wa0.net
m_はホント見苦しい
239:デフォルトの名無しさん
18/02/18 20:07:07.34 8oVyjimH0.net
m_だけならまだ我慢できるけど
this->を必ず付けるルールと併用するのは本当にやめろどっちかにしろ
240:デフォルトの名無しさん
18/02/18 20:15:52.43 eae4wPFh0.net
> this->を必ず付けるルール
破門だろ
C++使うなそんなボケどもは
241:デフォルトの名無しさん
18/02/18 21:14:42.68 SQcbDAgv0.net
ちげえんだよなぁ
thisというキーワードが存在してるから、その存在そのものが、それを書かねばならないような強制力を産み出してる
「存在するが、書かなくてもいい」っていうどっちつかずが、一番論争になる
その反対が「存在しないから書けない」だ
これだと単純明快だ
なんせ、書けない
「書くべきか書かざるべきか」のどーーーでもいい二択に迫られると、とたんに宗教になる
242:デフォルトの名無しさん
18/02/18 21:16:52.71 eae4wPFh0.net
キーワードが存在するのと実体が存在することの違いがそんなに大事なのか?
じゃあvtableのキーワードが存在しないことを、おまえはどう考えている?
243:デフォルトの名無しさん
18/02/18 21:33:09.71 Pbt6vSqU0.net
>>231
オケツに_をつけてますわ
244:デフォルトの名無しさん
18/02/18 21:33:14.46 dLlRK2Wa0.net
おれがそのソースを引き継いだらまず初めにやることは一つ
「this->」から「」への全ソース一括置換
245:デフォルトの名無しさん
18/02/18 21:56:25.56 Ct2k6iqr0.net
「m_」はダメで「_」ならいいってのはなんというか、合理的な理由よりも感覚・感情的なものかね。
246:
18/02/18 21:57:31.39 AAhzNgFK0.net
this-> つけるほうが分かりやすくていいと思うのですが、変てこな接尾辞・接頭辞よりも
247:デフォルトの名無しさん
18/02/18 22:00:36.01 tWqaO5mz0.net
m_xxx も xxx_ もなんの保証にもならんからな
this->は必ずメンバになるけど
248:デフォルトの名無しさん
18/02/18 22:37:59.28 UEE7OeWn0.net
_はグーグルスタイルの圧力
249:デフォルトの名無しさん
18/02/18 22:42:10.00 WjKwYRHz0.net
余計な命名規約を作るくらいなら言語機能を使った方が良いわな
this->派だわ
250:デフォルトの名無しさん
18/02/18 23:21:23.43 AjuHfv4B0.net
thisで明示した方が所在がハッキリして良いナリ
当職は名前空間もusingせずに明示しろ派ナリ
安易な省略はタイプ数を減らすという軽微なメリットと引き換えに可読性を落としケアレスミスを誘発するという恐ろしいデメリットを孕むナリ
251:デフォルトの名無しさん
18/02/19 00:00:39.93 hDVR9PRD0.net
>>237
「m_」はいらないな
↓
ローカル変数とかと名前が被ってめんどくさい
↓
キャメルケースにはしたくない
↓
「_」だけ残る
252:デフォルトの名無しさん
18/02/19 00:14:25.92 o8qstbSZ0.net
_付けるなら変数の後ろだろ
253:デフォルトの名無しさん
18/02/19 00:18:14.94 .net
C/C++なら必然的に末尾に付けるしかない
先頭に_付けるような情弱は死ねばいい
Perl/Pythonだと先頭に付けるけどな
254:デフォルトの名無しさん
18/02/19 00:42:17.66 SSx66hQd0.net
やらんけど、前一つなら規約には引っかからないんじゃなかったけ
255:デフォルトの名無しさん
18/02/19 00:57:15.60 hDVR9PRD0.net
未定義なのは
_始まりでグローバルスコープにあるもの
_始まりでアルファベットの大文字が続くもの全て
__で始まるもの全て
1番目の_始まりなだけならローカル変数、引数、メンバで�
256:ヘ予約されていないので使ってもよい
257:はちみつ餃子
18/02/19 01:15:36.25 gMMBYzvP0.net
>>238
名前に変なルールを導入するか this を付けるかの二択であれば this の方がマシというのはわかる。
わかるが、必ずつけるルールにしちゃうとかなりウザいわって話。
258:はちみつ餃子
18/02/19 01:20:40.79 gMMBYzvP0.net
>>242
わかるんだが、そういうルールってすぐに教条主義に陥るからうんざりする。
技巧として使う using にまでグダグダ言うやつが絶対に出てくる。
259:デフォルトの名無しさん
18/02/19 02:05:55.66 hDVR9PRD0.net
コーディング規約はうろ覚えだけど自由度の高いBoostスタイルを薦める
publicな識別子はstdに合わせて小文字スネークケース
マクロはBOOST_から始める
インデントはスペース、一行の文字数は80文字を推奨
意味のある名前を付けることを推奨
ファイル構成に関するもの
その他細々としたもの
ライブラリごとのローカルルールがある場合もある
あとは自由
thisを付けろだとか改行の仕方だとかは一切書かれてない
260:デフォルトの名無しさん
18/02/19 02:37:36.58 SEa8F8NC0.net
>>248-249
お互いにマナーを守る世界は過ごしやすいがマナーの厳守を要求し出すと途端に息苦しくなるナリ
自分にも他人にも読み易いコードを書こうという気遣いが見て取れるなら細かく突っ込んだりはしないナリ
261:デフォルトの名無しさん
18/02/19 05:40:18.76 wBFQMwB50.net
this->で必ずメンバというやつら
じゃあ必ずブロック内変数という表記もしたらどうだ
262:デフォルトの名無しさん
18/02/19 12:45:29.69 yTAVcy/Ya.net
使うライブラリや開発環境の内部のスタイルに合わせるけどな。
派生クラスとかAPIのラッパークラスとか作り始めると、
どうしても内部の書き方に合わせておいた方が読みやすいし。
今でもWin32とかMFCでやることもあるけど、
そのときはm_とかpとかhとかdwとかバンバンつける。
263:はちみつ餃子
18/02/19 13:19:17.15 gMMBYzvP0.net
使う側の都合に合わせろよ。 ラップしてるのに中身のスタイルが漏れてるんじゃラップの甲斐がなくね?
中身を知ってる人がちょっとした便利のためだけに薄いラッパを作る場合ならそういう選択もあるだろうけど。
264:デフォルトの名無しさん
18/02/19 14:36:30.11 00nJVfHA0.net
コンバータにあわせろよ。C#で作ってコンバータかけた方が綺麗スッキリするんだから。
265:デフォルトの名無しさん
18/02/19 19:36:41.65 2cNNs3G6M.net
>>253
そりゃAPIに渡す構造体でdwSizeとか使われてたらそこだけは合わせざるを得ないけど自分のコードスタイルを合わせる必要はないだろ
266:デフォルトの名無しさん
18/02/19 20:29:38.46 czaD+lHv0.net
>>230
m_のmは目立つのm、
>>228
ここ構造体メンバとか、
267:
18/02/21 00:43:21.00 jU0tYaxw0.net
Windows メインで作業されている方で、
valgrind を併用している方はおられませんか?
もしよろしければ使用感をお聞かせいただけませんか
operator new()/operator delete() 乗っ取りデバッグに限界を感じてしまっている状況です
(cl や bcc32/bcc32c/bcc64 では new/delete 乗っ取りができません)
いや、さっさと入れればいいのですが、仮想環境とかよくわからないし…Vine Linux 以来触ってないし…
268:デフォルトの名無しさん
18/02/21 01:13:14.52 wPLJFyuu0.net
windowsならapplication verifier使えば?
269:デフォルトの名無しさん
18/02/21 09:49:28.54 8k15W99L0.net
以下のURL
270:のプログラムでSFINAEを試してみていて https://wandbox.org/permlink/LqKmn50PaPbtohs5 BOOST_TTI_HAS_MEMBER_FUNCTIONを使えば has_funcというメタ関数を使わずに済んで、短くできないかと試行錯誤中なのですが うまく行きません。 どうやったらビルドが通るようになるでしょうか?
271:デフォルトの名無しさん
18/02/21 18:31:01.90 8+abUSIR0.net
まずはそのうまく行かないコードを示したら?
272:片山博文MZ
18/02/21 19:26:19.92 UifE8nP3d.net
>>260
URLリンク(stackoverflow.com)
273:260
18/02/21 19:34:37.06 EmINyJBAF.net
すみません、BOOST_TTI_HAS_MEMBER_FUNCTIONを使って短くする以前に元々が間違っていました。
以下の3つでオーバーロードしたかったのでした。
・funcというメンバ関数を持つダブルポインタ
・funcというメンバ関数を持たないダブルポインタ
・それ以外
それで思ったのですが多分、Boost.TTIライブラリで
〇〇というメンバ関数を持つクラス、を識別するメタ関数は作れても
〇〇というメンバ関数を持つクラスのダブルポインタ、は無理な気がしてきました。
一旦諦めようと思います。
274:260
18/02/21 23:10:49.37 EmINyJBAF.net
msvcでもGCCでもビルドできるのが
どうにかできました。お騒がせしてすみませんでした。
URLリンク(wandbox.org)
275:デフォルトの名無しさん
18/02/22 10:26:41.79 qwLRFwLN0.net
>>263
あと2年待てばconceptできるかもよ
276:デフォルトの名無しさん
18/02/22 21:31:34.66 SOkZDC9P0.net
(VBみたいな名前付き引数が実現されたら
システムハンガリアン否定論者をぎゃふんと言わせられるのに…
277:デフォルトの名無しさん
18/02/22 21:55:24.65 qwLRFwLN0.net
システムハンガリアン発祥の会社が何か作ったら否定論者がぎゃふんと言うのか?
おまえの頭の中は論点先取だか循環論法だかがグルグル回っているようだな
278:デフォルトの名無しさん
18/02/23 22:10:42.23 XlnyEs6k0.net
↑
想像してごらん全ての人々が
dwRet = ::WaitForSingleObject( hHandle = m_hThread, dwMillisecond = m_hTCTmo )
と書く世界を、
279:デフォルトの名無しさん
18/02/23 22:11:40.62 XlnyEs6k0.net
ごめ
誤: m_hTCTmo
正: m_dwTCTmo
見れば間違いがワカルのがハンガリアンの極めて良いところ
280:デフォルトの名無しさん
18/02/23 22:21:40.17 R3lraTlNM.net
>>269
>>196
281:デフォルトの名無しさん
18/02/24 10:44:07.22 mn7A8TMg0.net
一分間で間違いに気づいてはいるものの
そもそもの書く瞬間にはどうやら人智を用いても気付けないらしいから
IDEにエラー出してもらった方が早いんじゃあねえの
実は人間の集中力を超えたところにある方法論で、実践するとストレスが溜まるっぽいから、機械任せにした方がいい
それに、書いてる最中は変数の型まで考えたくない
見て分かることは、機械任せにすれば見なくても分かるから、
今のご時世、人間の有限の集中力を目視チェックなんかに使いたくない
脳みそのリソースはもっと別のところに使うべきだ
つまりは、書いてる最中は脳みそが「それが正しい」と思い込んでるから、
間違いは自分自身では絶対に分からない
これがバグを作り込む
h
282:だったかdwだったかを脳が自動的に混同してるから、その分だけ余計に脳のリソースを使っている 「なんで書いている最中に自分自身で気付かないのか」、これ、とても重要だよ
283:デフォルトの名無しさん
18/02/24 11:11:20.01 51zBno3Kd.net
変数名と型が一致してるという保証がゼロだからシステムハンガリアンなんて無駄以外の何物でもない
無駄というか悪
284:デフォルトの名無しさん
18/02/24 12:15:45.87 mm9B9rZ50.net
>>272
俺のレスもプログラムも表現と意図が一致してるという保証がゼロ、
まで読んだ
285:デフォルトの名無しさん
18/02/24 12:23:50.23 b3ZDZ7IS0.net
その場合、やめられる方だけやめればいいな
つまりハンガリアンを。
286:デフォルトの名無しさん
18/02/24 12:27:42.98 pqM6ijVV0.net
まともな開発環境使っていれば必要ないのでは
287:デフォルトの名無しさん
18/02/24 12:34:43.53 B9f7/evx0.net
ハンガリアンはもうだめだ。
ポーランドを使おう。
288:デフォルトの名無しさん
18/02/24 12:51:07.68 d7+fd25J0.net
>>272
そういう事言い出すと「関数名と機能が一致してる保証がゼロ」や「クラスメンバの隠蔽が完璧である保証がゼロ」などといくらでも難癖を付けれるナリ
ヒューマンエラーを理由に不要と結論付けるのならあらゆるコーディング規約が不要という結論になってしまう、これはいけない
命名規則は可読性の向上に結びつくものでなければならない、規約を違反する事で起きるトラブルはプログラマ側の責任、それは分かるよね?
289:デフォルトの名無しさん
18/02/24 13:26:14.86 b3ZDZ7IS0.net
ヒューマンエラーが起きる部分は極力排除して機械任せにできる部分は機械任せにすればいい
ハンガリアンを導入する理由はもはや無いな。可読性悪いし。
290:デフォルトの名無しさん
18/02/24 14:24:10.94 yWQ45jBy0.net
>>278
いや、ハンガリアンは可読性はよくなる方だよ
整合性維持に難があるだけで
291:デフォルトの名無しさん
18/02/24 14:29:08.35 mm9B9rZ50.net
可読性ぐらいテンプレートによる高度なメタプログラミングに慣れた諸兄なら
ハンガリアンごとき目を慣らして解決できるはずなんじゃ…
292:はちみつ餃子
18/02/24 15:03:19.72 ohURjCBl0.net
URLリンク(www.google.co.jp)
293:はちみつ餃子
18/02/24 15:06:09.97 ohURjCBl0.net
>>276
Lisper「せやな!」
294:デフォルトの名無しさん
18/02/24 17:03:03.20 agv5rOmv0.net
>>276 >>282
両者は共存不可能な対立概念ではないけどね。
細かいことを言わせてもらえば、
「ハンガリアンとポリッシュ」か「ハンガリーとポーランド」と
並べてくれた方が座りがいい気もするけど…。
「ハンガリアン記法とポーランド記法」だとあまり気にならない不思議。
295:デフォルトの名無しさん
18/02/24 17:08:35.75 4JIC+wG/M.net
なぁにその内、ロシアが併呑してくれるさ
296:デフォルトの名無しさん
18/02/25 14:16:53.97 8l5JrV0a0.net
>>266
名前付き引数イディオムとenable_if<is_same<...>::value>が最強と言うことだな
※プログラマが、使用者が型を間違えないようにと気を使うのが正しいなら、間違えたらコンパイルエラーになるこれが最強だろ?
297:デフォルトの名無しさん
18/02/25 14:35:24.31 zhzj1IkW0.net
>>277
ちげえんだよんぁ
可読性じゃねえんだよ
>>268を見てみろよ、
読む時じゃなくて書く時のヒューマンエラーだ
なんで入り込んだのか全く分からんようなミステイクだ
プログラミングが工業的生産の一種なら、その手のヒューマンエラーは無い方がいい
で、改めて>>268を見てみると、「可読性」があってプレフィクスの間違いに気付いてはいるものの、
そもそも書く段でなんで間違えたのか、それが全く分からない
他人はおろか本人すらも自覚できない謎の理由でプレフィクスを間違えてる(これがヒューマンエラーなんだけどな)
な
298:んで、後だしジャンケンだと、「プレフィクスが最初から無ければ、間違いも発生しえなかった」、とも言える もしかすると、書く時に間違える/読む時に間違える の比率を考えると、ハンガリアン記法は書く時に間違えやすいが読むときに間違いにくい……のトレードオフなだけかもしれん 要するに、可読性と生産性のトレードオフだけなんじゃあねえのか? それに、読む時のヒューマンエラーと書く時のヒューマンエラーをわざと混同してるのはいただけない
299:デフォルトの名無しさん
18/02/25 16:15:03.29 s5td7qK+0.net
void func(int a)
{
300:デフォルトの名無しさん
18/02/25 16:15:31.06 s5td7qK+0.net
void func(int a)
{
//aが何型かわからない
//アホかおまえは
}
301:デフォルトの名無しさん
18/02/25 16:46:37.12 s5td7qK+0.net
template <typename T>
void func(T lpszA)
{
//lpszって書いてあるからTはLPSTR型だな
//アホかおまえは
}
302:デフォルトの名無しさん
18/02/25 19:14:43.19 4jIr3vvu0.net
>>288
func()が常に1画面に収まって1万行の関数とかでありえないという根拠は
>>289
テンプレート定義時の引数に対して引数内容固有の命名が難しいのは
ハンガリアンに限ったことではないからハンガリアンに対する批判になんね
テンプレート批判論者には考える力がないのかね…
303:デフォルトの名無しさん
18/02/25 19:15:39.42 4jIr3vvu0.net
ごめ
×:テンプレート批判論者
○:ハンガリアン批判論者
304:デフォルトの名無しさん
18/02/25 19:29:08.16 s+qaK1zS0.net
テンプレートに対してはハンガリアンは全くの無力だよなあ
一貫性の観点からやっぱりハンガリアンは無い方がいいわ
305:デフォルトの名無しさん
18/02/25 19:48:52.19 4jIr3vvu0.net
.>>290のレスを見てテンプレートの実体化時までハンガリアンが無力なことにされてはかないませんなあ…
306:デフォルトの名無しさん
18/02/25 20:11:05.52 fbPK05Px0.net
そもそも関数が長い場合は型情報を持たすのもありだよな
システムハンガリアンをやめさせようとして先に関数を短くしなきゃだめだなと追う結論に至って放置した
307:デフォルトの名無しさん
18/02/25 20:37:38.24 s5td7qK+0.net
//1万行の最長不倒関数を書く
//アホかおまえは
308:デフォルトの名無しさん
18/02/25 21:00:14.67 s5td7qK+0.net
void func(int lpszA)
{
//lpszって書いてあるからLPSTR型だな
//アホかおまえは
}
309:デフォルトの名無しさん
18/02/25 21:58:30.83 qLuvVokt0.net
システムハンガリ理解してない人の例上げてね?
310:デフォルトの名無しさん
18/02/25 22:45:03.97 4jIr3vvu0.net
>>295
「1画面に収まらない」を都合よく無視しないように
311:デフォルトの名無しさん
18/02/25 23:43:59.89 yscCG2q60.net
システムハンガリアンはDWORDをintに型名変更するだけでその変数名全部終わるからなしかも一瞬で
312:デフォルトの名無しさん
18/02/25 23:57:37.89 .net
>>299
dwをiに置換するだけだからリファクタリングが楽っていう意味?
313:デフォルトの名無しさん
18/02/26 00:59:51.78 VDQLjiDS0.net
まったく逆だ
dwからiに全部置換していかないと変数名の意味を為さなくなるからシステムハンガリアンは愚かさ甚だしいと云うておる
314:デフォルトの名無しさん
18/02/26 01:02:48.27 VDQLjiDS0.net
アンパンマン調で例えるなら型名変えるだけでメンテ百倍みたいな
315:デフォルトの名無しさん
18/02/26 01:10:40.33 jQ6YvoyL0.net
組み込み型はいいけどクラスはどうすんのさ
意味の分からないサフィックスを付けられても困るぞ
316:デフォルトの名無しさん
18/02/26 01:11:26.04 VDQLjiDS0.net
ハンガリアン!新しい型だよ!
有難う!デザパタ娘ちゃん!
メンテ百倍!ハンガリアン!
317:デフォルトの名無しさん
18/02/26 01:55:04.49 4PPe6ndQ0.net
そもそもDWORDをintに変えることが滅多にない
318:デフォルトの名無しさん
18/02/26 02:10:59.71 jQ6YvoyL0.net
dwとか書かれてもDWORDの定義を知らないと意味不明だし
やるなら符号の有無とサイズが分かるように書かないと意味ないでしょ
319:デフォルトの名無しさん
18/02/26 04:56:46.87 lxlU26hn0.net
>>298
おまえは間違いなく1万行と書いた
その史実を誤魔化すことはできない
「ありえないという根拠は」という問いを反論として用いるのは
俺が「ありえない」と言った(事実と違うが)ことが
おまえが「ありうる」と思っているのと違ったからだろう
いずれにせよ「アホかおまえは」にふさわしいハチャメチャだな
320:デフォルトの名無しさん
18/02/26 08:02:35.99 SPD4iDfM0.net
ポインタのpとか参照のrとかは今でも使ってる
321:デフォルトの名無しさん
18/02/26 08:09:57.39 .net
>>307
史実とか言っちゃうのって。。。
322:デフォルトの名無しさん
18/02/26 08:16:32.18 TvC1o7QC0.net
>>307
もうちょっとまとめて喋れ
読みづらい
323:デフォルトの名無しさん
18/02/26 09:55:53.14 lxlU26hn0.net
>>308
俺も使う
ただし名前そのものをポインタっぽくするだけで
ハンガリアンのプリフィックスとしてではない
324:デフォルトの名無しさん
18/02/26 09:56:14.50 lxlU26hn0.net
>>310
ニホンゴワカリマスカ?
325:デフォルトの名無しさん
18/02/26 10:44:04.77 U+kFnN5D0.net
ハード直叩きのドライバ屋はデータバスやレジスタの幅を間違えると大変だから
物理層の実装ではハンガリアン使うこともあるよ
326:デフォルトの名無しさん
18/02/26 10:55:31.04 n/n1Eejna.net
>>313
むしろそれはアプリケーションハンガリアンじゃね?
327:デフォルトの名無しさん
18/02/26 11:21:30.74 mt/mMzV6d.net
間違えると大変だからハンガリアンを使ってはならないんだよ
偽の情報に頼るんではなくて元を逐一確かめないと
328:デフォルトの名無しさん
18/02/26 11:33:14.68 yfGCkThX0.net
今勉強してるんだけどC++ではポインタを使わずに参照で書くのがデフォルトなの?
329:デフォルトの名無しさん
18/02/26 11:36:50.47 TvC1o7QC0.net
>>315
不一致が存在しない事が保証されてれば問題無いんやな
そういう事ならつまり変数宣言とプレフィックスが全て一致してるかチェックするスクリプトとかがあれば満足って事でええんか?
330:デフォルトの名無しさん
18/02/26 11:38:09.46 n/n1Eejna.net
>>316
ポインタも必要に応じて使うけど、メモリ管理の煩雑さとミスの危険性を避けるために参照やスマートポインタやコンテナ、イテレータなど他に適切な物がある時はなるべくそちらを使うのが流儀かな。
331:デフォルトの名無しさん
18/02/26 11:51:17.55 lxlU26hn0.net
>>316
デフォ・・・まあ、そう言えなくもないか
参照でもポインタでもどっちでもいい用途には参照
ポインタでしかできないことはNULLに++や絶対番地指定
参照でしかできないことは一時オブジェクトやコピコン類
332:デフォルトの名無しさん
18/02/26 12:15:47.61 z/vehsiL0.net
書き込むときは参照ではなくポインタにしろと言ってた人がいた。
理由を聞いたら「なんか書き込んでる感がない」だった。
333:デフォルトの名無しさん
18/02/26 12:17:18.65 lxlU26hn0.net
std::cin >> &a;
やだよ、こんなの
334:デフォルトの名無しさん
18/02/26 12:21:09.58 W3q5coR10.net
グーグル規約だと書き込む引数は参照ではなくポインタにしろってなってる
でも標準ライブラリが普通に参照で書き込んでるので意味ないかなと思う
335:デフォルトの名無しさん
18/02/26 13:05:03.30 LqmnPPXld.net
やC++糞
336:デフォルトの名無しさん
18/02/26 13:30:49.55 jQ6YvoyL0.net
好きな方使えとしか言いようがない
ただ参照はnullポインタが無いという特性はある
337:デフォルトの名無しさん
18/02/26 13:42:09.37 z/vehsiL0.net
>>322
自分もその人の気持ちは理解できた。
func(a, &b);
と書かれていると、bに結果を書き込んでいる感があるし。
338:デフォルトの名無しさん
18/02/26 13:44:00.32 yfGCkThX0.net
レスサンクス
cからだからポインタで書いちゃいそうだわ
339:デフォルトの名無しさん
18/02/26 18:25:47.85 aHz4HBvIM.net
ローカルで宣言したunique_ptrを他のメソッドに渡してデータをつめたいばあいってどういう引数で渡せば良いの?
unique_ptr<Hoge> ptr(new Hoge);
hogehoge(ptr);
Hogehoge::hoge(const unique_ptr<Hoge>& ptr){
ptr->aaa = 123;
}
これでいける?
なんかウェブサイトみてると&&二つとかあったりするの見かけて混乱してきた
340:デフォルトの名無しさん
18/02/26 18:46:48.22 6OgFttId0.net
&&は所有権ごとぶん投げる時に使う
渡した後も呼び出し元で使うんだったらそれて合ってるぞ
341:デフォルトの名無しさん
18/02/26 19:00:19.12 r2m2Cr000.net
>>327
それだったらunique_ptrじゃなくて参照渡せば良いだけじゃ
342:デフォルトの名無しさん
18/02/26 19:31:15.52 NcBRNf650.net
知らない間に、&& みたいな参照渡しもできた
Rust の所有権ムーブの事
343:デフォルトの名無しさん
18/02/26 19:58:16.47 jQ6YvoyL0.net
何年も前からある
344:デフォルトの名無しさん
18/02/26 21:01:42.73 k0ghrbBh0.net
所有権を渡すのってstd:move()だと思ってたんだけどconst &&でもいけるの??
345:デフォルトの名無しさん
18/02/26 21:42:25.99 adcc2IaV0.net
C++17でstd::iteratorが非推奨ってなっているみたいだけど代わりに何使うの?
346:デフォルトの名無しさん
18/02/26 23:56:58.87 4PPe6ndQ0.net
[]
347:デフォルトの名無しさん
18/02/27 00:00:22.09 o+FKgYKC0.net
>>333
自分で実装する
348:はちみつ餃子
18/02/27 02:00:32.40 +XEdVvf40.net
>>332
std::move は rvalue にキャストするだけで、それ自体にはムーブする機能はない。
実際にムーブの処理をするのはムーブコンストラクタやムーブ代入演算子の方やで。
349:はちみつ餃子
18/02/27 02:10:59.44 +XEdVvf40.net
&& は単純に右辺参照って意味しかないから、 rvalue を受け取れるってだけ。
だけど lvalue でもムーブしてぇってときは std::move で rvalue にキャストすんの。
350:デフォルトの名無しさん
18/02/27 02:19:45.35 o+FKgYKC0.net
そこら辺はめんどくさいからテンプレート使え
351:デフォルトの名無しさん
18/02/28 18:07:41.72 IZRayiSM0.net
右辺値参照とか難しいなー
最近ようやくC++11使えるようになったから全然いってることがわからん
352:片山博文MZ
18/02/28 18:34:51.95 jmOf6Upnd.net
右辺値参照が使えなかった頃は、std::swapでスピード最適化していた。ポインタとメモリー確保を含む構造体は、
単純にスワップしたり、単純にバイト単位コピーしたりするのはまずいことがある。
そういうときに、std::swapを使う。右辺値参照は、それよりちょっと速くて賢いが、テンプレート型を理解してないと多分理解できないと思われる。
353:片山博文MZ
18/02/28 18:43:18.32 jmOf6Upnd.net
右辺値参照の型はテンプレートを使った特殊な型だと考えるのが自然。
T&& === rvalue_ref<T>.
std::move(T&)はrvalue_ref<T>という型。
354:片山博文MZ
18/02/28 18:44:28.64 jmOf6Upnd.net
訂正。
std::move(T&)の戻り値はrvalue_ref<T>という型。
355:片山博文MZ
18/02/28 19:01:47.21 jmOf6Upnd.net
すみません、テキトーなことを書いたので、銃殺されます。
356:はちみつ餃子
18/02/28 19:18:07.29 7ezW7mFb0.net
実際のところヘッダファイルから std::move の定義を抜き出すとこんな感じ。
template<typename _Tp>
constexpr typename std::remove_reference<_Tp>::type&&
move(_Tp&& __t) noexcept {
return static_cast<typename std::remove_reference<_Tp>::type&&>(__t);
}
テンプレートの都合で面倒くさくなってるけど、実態としては static_cast してるだけ。
357:片山博文MZ
18/02/28 19:24:03.59 jmOf6Upnd.net
そのstd::remove_reference<T>::typeはTから左辺値参照や右辺値参照をはずした型になるね。それに&&を付けるんだから、左辺値参照が右辺値参照になる。
358:片山博文MZ
18/02/28 19:25:31.22 AZJp7LrB0.net
やはり、constexprやnoexceptを付けた方が性能がいいんだな。
359:はちみつ餃子
18/02/28 19:35:33.38 7ezW7mFb0.net
C++17 では noexcept は型の一部という扱いに変更された。
例外を投げないなら投げないと書いておかないと他のライブラリとの組合せで型エラーになったりすることもあるかもしれんぞ。
360:片山博文MZ
18/02/28 19:43:54.33 jmOf6Upnd.net
やっぱ江添亮様ってスゲーや。
361:デフォルトの名無しさん
18/02/28 21:22:30.07 BlsGZA5I0.net
江添本にこの辺りのチートシートと問題集いれたら100部くらい売り上げ増えるのでは
362:デフォルトの名無しさん
18/02/28 21:27:43.47 LDTKKB+20.net
江添ってあれか
363:。ニートの時にやることないからたまたま目についたC++の仕様書を読み込んでたら いつの間にかすごく強くなったという、ホリランみたいな。
364:デフォルトの名無しさん
18/02/28 21:32:34.60 eOQjYTv40.net
おまえそれをバカにできるのか?
仕事ってそういうもんだぜ
目の前の案件のために必死こいても付け焼き刃にできることは知れてるんだよ
「ヒマ」なときに遠くを見て投機的にコツコツ努力したことが
あとで花咲くことがあるし咲かないこともある
賭に勝った者を、降りたやつがバカにできるのか? え、おい
365:デフォルトの名無しさん
18/02/28 22:02:12.40 debsNNov0.net
>>320
>>322
書き込むときポインタ渡しにするのは
C++には参照渡しがin/out/refのどの意味なのか表すシンタックスが現状無いから
というのが主要な動機だと思うが
inならconst T& aというのは比較的読み筋だが
T* pと書いただけだとoutなのかrefなのかやっぱりわからん…
366:デフォルトの名無しさん
18/02/28 22:22:45.57 n9jVMobsM.net
>>352
outは**だろ
367:デフォルトの名無しさん
18/02/28 22:38:47.40 ugxprRf80.net
&& は、Rust のmove の事。
所有権移転。移転元が空になる
基本的に数年は、ドワンゴ江添と共に、山ごもり!
江添が空海なら、漏れは最澄w
悟りを開くまで、空海・最澄の一問一答が、延々と続くw
368:はちみつ餃子
18/02/28 23:03:26.56 7ezW7mFb0.net
rvalue reference 自体はムーブしねぇつってるだろ。
369:デフォルトの名無しさん
18/03/01 02:40:44.97 Cta7ST2f0.net
&&は所有権付き参照オブジェクトのようなものだな
370:デフォルトの名無しさん
18/03/01 07:05:17.46 /bb7E7Gp0.net
&&参照は「このオブジェクトもういらないからぶっ壊してもいいよ」というサイン
言うなれば肉屋へ行く馬車
野生のオブジェクトは誰に断る必要もないので勝手に連れてかれて解体される
家畜を渡す時は解体に同意するサイン(std::move())が必要
371:デフォルトの名無しさん
18/03/01 07:13:49.75 YKLxBKOvM.net
Fooクラスのunique_ptrがつまったvectorを作って、他クラスのメンバ変数にセットするときはどう渡すべき?
作った元ではもう使わないから所有権放棄していいとする
const参照渡しにして、渡された側でvectorの中身を全部std:move()して新しいvectorにつめるのが一番最初に思い浮かんだ
そんなことしなくても最近ここででてる、&&つけて渡してそのままセットすれば解決するのかな?
372:デフォルトの名無しさん
18/03/01 07:20:14.18 /bb7E7Gp0.net
vectorを丸ごとmove付けてコンストラクタに渡せばいいよ
出来上がった後で渡したいならswapすればいい
373:デフォルトの名無しさん
18/03/01 08:22:01.82 YKLxBKOvM.net
なるほどー
コードにするとこんな感じかな?
std::vector<std::unique_ptr>vec_hoge;
...
Hoge hoge;
hoge.setHoge(std:move(vec_hoge))
Hoge::setHoge(vector<unique_ptr>&& vec_hoge) {
this-> vec_hoge = vec_hoge;
}
374:デフォルトの名無しさん
18/03/01 08:51:22.88 Z75vpagFM.net
>>360
最後にmove必要
375:はちみつ餃子
18/03/01 08:54:17.19 1485DW7Q0.net
せやな。
rvalue reference は lvalue だぞ。
376:デフォルトの名無しさん
18/03/01 10:38:08.68 YKLxBKOvM.net
ありがとう!勉強になりました
377:デフォルトの名無しさん
18/03/01 22:06:37.33 fp7iC0tG0.net
>>353
ちげう
378:デフォルトの名無しさん
18/03/02 07:10:33.20 GbvR6g/La.net
noexceptにtrue,falseがある理由については
#include <type_traits>
template<typename T>
void test(T t)noexcept(is_unsigned<T>){
//Tの型がunsignedの時だけは例外は投げない
}
こういう事が出来ると書いてあ�
379:チたけど、c++17以降も問題なく使えるだろうか?
380:デフォルトの名無しさん
18/03/02 07:15:24.27 bNTu0vGw0.net
is_unsigned_vだろ
なぜC++17以後で廃止になると思ったんだ?
381:デフォルトの名無しさん
18/03/02 07:38:40.59 GbvR6g/La.net
stdも抜けてた。。。
廃止になるじゃなく面倒な事になりそうだと。
382:デフォルトの名無しさん
18/03/02 08:07:40.62 mIGjbFX+0.net
unsigned は組み込み用だろ
0 ~ 255 のカウンターなどで、無限にループする。
255の次に、0が来る
overflow にされると困る
383:デフォルトの名無しさん
18/03/02 08:51:13.35 Du7whmdSM.net
>>368
組み込みでなくても極々普通に使うし、標準ライブラリ使ってれば知らぬ間に使ってる。
384:デフォルトの名無しさん
18/03/02 09:14:23.17 vziGgrtU0.net
size_t
385:デフォルトの名無しさん
18/03/02 09:29:49.65 bNTu0vGw0.net
それを言うなら
uintptr_t
386:デフォルトの名無しさん
18/03/02 12:01:58.77 D+SIA0G1d.net
普段は uint_xxt と size_t しか使わんわ
int と ptr あんまり相互に変換しないし
387:デフォルトの名無しさん
18/03/02 22:27:40.22 3pZ6Fb9JF.net
visualstudio2017 でスタックトレースがしたいのですができません。
最初はBoost.StackTraceで試みたのですがMSVCでは行数やファイル名の出力が非対応で
アドレスまでしか取れませんでした。
次にWinAPIを使って解決させようとしたのですがこれもうまく行きません。
SymGetSymFromAddrを使うとどうやってもエラー126が帰ってきてしまいます。
以下のプログラムがVisualstudio2017で動作している人はいないでしょうか?
URLリンク(github.com)
388:デフォルトの名無しさん
18/03/02 23:27:18.83 KYEHMUiK0.net
スタートレックと空目した
389:デフォルトの名無しさん
18/03/02 23:40:43.96 vziGgrtU0.net
>>373
こうなった
---- BEGIN BACKTRACE ----
1 : 0x00e76873 : Project1 : mycode::foo : c:\users\\source\repos\project1\project1\main.cpp(116) :
backtrace();
2 : 0x00e76513 : Project1 : mycode::bar : c:\users\\source\repos\project1\project1\main.cpp(120) :
foo();
3 : 0x00e76563 : Project1 : mycode::baz : c:\users\\source\repos\project1\project1\main.cpp(124) :
bar();
4 : 0x00e76b33 : Project1 : mycode::hoge : c:\users\\source\repos\project1\project1\main.cpp(128) :
baz();
5 : 0x00e76f0d : Project1 : main : c:\users\\source\repos\project1\project1\main.cpp(134) : try {
6 : 0x00e7870e : Project1 : invoke_main : f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl(78) : ?
7 : 0x00e785b0 : Project1 : __scrt_common_main_seh : f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl(283) : ?
---- END BACKTRACE ----
390:片山博文MZ
18/03/02 23:47:44.16 7K8TE86Qd.net
URLリンク(stackoverflow.com)
未確認
391:373
18/03/03 01:05:16.48 7bxI8Ps/M.net
>>375
プロジェクトの設定はdbghelp.libを追加しただけでしょうか?
あとWindows10ですか?7ですか?
>>376
自分もそれを読んでx86とx64両方試したのですがダメでした、、、
392:デフォルトの名無しさん
18/03/03 01:52:28.21 e0EB+SLu0.net
>>377
Windows10で実行
ライブラリは追加したのと
このFileNameがchar*でmsvcでは通らないから適当に文字列のバッファを作って渡した
>94 line.FileName = "?";
393:373
18/03/03 07:43:32.07 MjEj/kk+F.net
>>378
自分はWindows7&VisualStudio2017なのですが
dbghelp.lib、dgbhelp.hを探すと以下の場所にあるのでWin10でしか対応していないのかなと…
C:\Program Files (
394:x86)\Windows Kits\10\Lib\10.0.16299.0\um\x86 C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\um C:\Program Files (x86)\Windows Kitsの下には8.1と10 という名前のフォルダがあるのでOSの番号ぽいです。 dbghelp.dllならそこらじゅうにあるのでLoadModule関数で呼べばいけるのかも
395:373
18/03/03 08:51:25.52 MjEj/kk+F.net
VisualStudio Installerで構成の変更をしようとすると
'Windows XP Support for C++'というのがあって
これがWindows7用のSDKらしいです。(どんな名前の付け方だ…)
これをインストールするとめでたくdbghelp.libとdbghelp.hが追加されるので
それでコンパイルしようとすると
#include <dbghelp.h>
とかくだけでコンパイルエラーになってしまいました。
エラー C2760 構文エラー: トークン '識別子' は予期されておらず、'型指定子' が予期されています scratch c:\program files (x86)\microsoft sdks\windows\v7.1a\include\objbase.h 239
Windows10を買うかVisualStudio2015をインストールするかしかないのかもしれません;;
396:デフォルトの名無しさん
18/03/03 09:17:35.93 iGrPHQq30.net
>>380
Visual Studio 2017 スレの919あたりから話題になっているけど、
VS2017 の Windows 旧バージョンサポートはおかしいみたい。
2015と同じツールセット、SDKを用いても動作が違う。
2015をインストールするのがいい気がする。
参考
Visual Studio 2017 Part4 ・
スレリンク(tech板)
URLリンク(www.visualstudio.com)
397:デフォルトの名無しさん
18/03/03 10:29:47.52 eUUf6Fhxd.net
コンパイラを作っているんですが、char 10bit short 18bitの時はsizeofはいくつを返せばいいんですか?
398:デフォルトの名無しさん
18/03/03 10:36:52.34 /0Rk5gcF0.net
>>382
アドレス単位を返す。ワードアドレッシングなら通常全て1になる
399:デフォルトの名無しさん
18/03/03 10:42:04.53 iGrPHQq30.net
メモリ上のレイアウト次第
その18ビットを隙間だらけでchar8個分のメモリに置いてるなら8だし、
詰めて2個分で置いてるなら2
400:デフォルトの名無しさん
18/03/03 10:51:46.74 sKvL+uoJ0.net
sizeof(char)は必ず1じゃなかったっけ?
401:デフォルトの名無しさん
18/03/03 12:49:02.99 .net
sizeofが小数を返しちゃいけないって誰が決めたの?🙄
402:はちみつ餃子
18/03/03 13:15:05.21 uc6Z/AdW0.net
>>386
仕様。
C99 だと 7.17 に size_t は sizeof 演算子の結果の符号無し整数型って書いてある。
C++11 だと 5.3.3 に sizeof 演算子の返却値の型は size_t って書いてあって、
18.2 に size_t は符号無し整数型って書いてある。
403:デフォルトの名無しさん
18/03/03 13:20:00.43 Yc5zIgYv0.net
sizeof(bool) == 0.125 であって欲しいのかw
404:はちみつ餃子
18/03/03 13:43:14.93 uc6Z/AdW0.net
どうせ汎整数昇格で int になることばかりなので、
アドレス単位以下の小さなオブジェクトにする意味なんてないよ。
大きな配列で扱いたいときは std::bitset が有るし。
405:デフォルトの名無しさん
18/03/03 14:56:24.32 .net
>>387
ありがとう🤣
406:デフォルトの名無しさん
18/03/03 15:45:51.52 +GZAkR500.net
>>389
もしsizeofが小数を返したら汎整数昇格は適用されないんじゃない?
407:デフォルトの名無しさん
18/03/03 16:09:32.75 e0EB+SLu0.net
使用者が混乱するような仕様はちょっと
408:デフォルトの名無しさん
18/03/03 18:28:41.77 OIzMcqKj0.net
この板に書いてあることがほとんどわかっていないようなクソ素人ですみませんがちょっとお聞きしたいことがあります。
Windows 7でOpenCVをTDM-GCCにて動かしたいと思っているのですが、どなたかこの設定で動かされている方など居られ�
409:ワすでしょうか? もしくは素直にVisualStudioなど使ったほうが良いのでしょうか? 昨日からあれこれ試しているのですがまったく動かないです。
410:片山博文MZ
18/03/03 19:01:36.20 ZgUZF4A1d.net
>>393
俺ならパッケージマネージャがあるMSYS2+MinGW使うよ。
パッケージマネージャがないTDM-GCCなら、まず、OpenCVをビルドして、リンクできるようにしないといけない。
まあ、めんどうくさい訳で。
411:片山博文MZ
18/03/03 19:37:06.06 ZgUZF4A1d.net
初心者はVSやるとよろし。NuGetというパッケージマネージャがあるよ。
412:デフォルトの名無しさん
18/03/03 20:12:29.49 OIzMcqKj0.net
片山様
レスありがとうございます。
そうですね、VSは重いという理由で避けていましたがやはりまずはちゃんと王道からやっていこうと思います。
慣れたらソースからビルドもしてみたいですが、まずはOpenCVであれこれしたいのでやりやすい環境で頑張りたいと思います。
ありがとうございました。
413:はちみつ餃子
18/03/03 20:37:52.59 uc6Z/AdW0.net
VS の統合開発環境を外したツールセットだけの SDK もあったはず。
でもまあ初心者は統合開発環境があった方がいいってのは同意だな。
414:デフォルトの名無しさん
18/03/03 21:19:46.86 oo1zjTPVa.net
C++の文字列、u16やu32stringとか乱立してるけど今時TCHARとか使わないでしょうか?
string,wstring,u16string,u32string...どれか決め打ち?
415:デフォルトの名無しさん
18/03/03 21:37:46.21 iGrPHQq30.net
主に使ってるライブラリ/フレームワークに合わせれば?
何でもいいなら multibyte で utf-8 一択だろう
ucs2 (16bit) にしても ucs4 (32bit) にしてもどうせ
合字とかで1コードポイント1文字にならないから意味ないし
コンテナは string でも何でも好きなものを
416:はちみつ餃子
18/03/03 21:52:22.75 uc6Z/AdW0.net
どうやろな?
Windows だと API が UTF-16 前提だからそれで揃えるってのは悪くない選択だと思うし。
417:デフォルトの名無しさん
18/03/03 21:55:03.34 e0EB+SLu0.net
>>398
TCHARはcharとwchar_tをvisual studioのプロジェクトの設定で切り替えてtypedefしてる型だ
マイクロソフトのライブラリの一部
u16stringとu32stringはstd::basic_string<char16_t>とstd::basic_string<char32_t>のエイリアス
UTF-16とUTF-32の文字列を扱うクラスで標準ライブラリの一部
そもそもどっちかというものではない
std::basic_string<TCHAR>とか使ってもいい
418:デフォルトの名無しさん
18/03/03 22:02:34.74 i5AAIiVZ0.net
OpenCVのビルドぐらいCMakeでGUIでできる
419:デフォルトの名無しさん
18/03/03 22:07:02.05 i5AAIiVZ0.net
>std::basic_string<TCHAR>とか使ってもいい
ほんとそれ
ていうかWin32APIでサポートされるうちはやっぱマルチバイトが無難
420:デフォルトの名無しさん
18/03/03 22:12:10.73 q1dNIabI0.net
ShiftJisなんて廃止して、UTF8に統一してしまえば良かったよね
421:デフォルトの名無しさん
18/03/03 22:19:12.96 /0Rk5gcF0.net
UTFはソートのコストが高いから痛し痒しだけどね
SJISはその点は優秀かと
422:デフォルトの名無しさん
18/03/03 22:38:49.13 pbvBV+5A0.net
Windows10はutf8モードにできたような
423:はちみつ餃子
18/03/03 22:56:38.78 uc6Z/AdW0.net
文字コードを統一したところでロケールの切替えはどうせ必要なわけだし、
内部的な処理が UNICODE に統一されたので良しとするしかなかろ。
424:デフォルトの名無しさん
18/03/03 23:43:29.67 q1dNIabI0.net
utf8に統一したら、ロケールの切替って表示する文字列の言語を決める位の意味しか無いのではないかな
異なる言語の文字列でもそのまま字化けせずに表示出来た方が都合が良いように思うけど
425:はちみつ餃子
18/03/04 00:38:00.37 R9gQD4Ga0.net
Windows はもう 20 年以上前から Unicode 化はやってるんだってば。
UNICODE 版の API を正しく使う限り文字化けしない。
フォントの設定とかで化けることはあるかもしれんけど、
それも今はフォントリンクとかでおおよそ上手いこと処理してまうしな。
UNICODE 化できていない今までに作られたカスなアプリが消し去れないし、
カスなアプリのために ANSI 版の API (の挙動を制御するためのコードページの切替えの仕組み)
は残しておかなきゃならないけど、
Unicode への統一そのものは出来てるから満足するしかない。
っていう話ね。
426:デフォルトの名無しさん
18/03/04 00:59:55.95 LharAyAs0.net
だったらVisualStudioで作ったソースファイルのデフォルトがShiftJIS固定なのをそろそろなんとかしてくれよ
427:はちみつ餃子
18/03/04 01:01:33.87 R9gQD4Ga0.net
せやな。
428:デフォルトの名無しさん
18/03/04 01:07:55.85 BtVPmkEs0.net
LinuxとかのシステムコールもUnicode化されたら考えるわアデューノシ
429:デフォルトの名無しさん
18/03/04 01:14:01.78 fY1aJvVU0.net
>>410
2017で治ったんじゃなかったか
430:デフォルトの名無しさん
18/03/04 01:15:23.20 BtVPmkEs0.net
だいたいwchar_tとかcharの倍容量を食うじゃん?
2が3になるとかならまだしも1が2になるというのは精神的にインパクトがデカイ
L"Hello World!"のバイナリをダンプしてみたらトラウマを抱え込むレヴェル
というのもあるし他環境とのソースコード共通化も視野に入れる場合やっぱマルチバイトしか…
431:デフォルトの名無しさん
18/03/04 01:35:20.32 pARrwnK20.net
WindowsのUNICODE版APIはUTF-8と相性が悪いからクソ
432:はちみつ餃子
18/03/04 01:39:19.42 R9gQD4Ga0.net
せやろか?
内部表現として使う文には UTF-16 って良いと思うけどな。
UTF-8 との間なら変換コストも大したことないし。
433:デフォルトの名無しさん
18/03/04 02:20:02.75 8pLLmBBd0.net
>>416
iOS / macOS / Windows / Java と多くのプラットフォームの
API で文字列としてUTF-16 が使われてるから割と使うけど、
近年多用される絵文字とかが全然1文字1符号にならんので
ロジックを基準する上ではUTF-8より便利ってわけでもない。
文字列の処理を描くときは合字以外は1文字1符号になるUCS4 の方が良い。
434:デフォルトの名無しさん
18/03/04 02:23:18.11 FSOQNU6I0.net
なぜ世界中の頭脳を集結させても完璧な文字コードは作れないのか
435:デフォルトの名無しさん
18/03/04 02:28:31.88 BtVPmkEs0.net
x86アーキテクチャーがRISC-Vに置き換わったら考えるわノシ
436:デフォルトの名無しさん
18/03/04 02:42:05.74 BtVPmkEs0.net
ていうかコルモゴロフ複雑性が計算可能関数だったら考えるわノシ
437:デフォルトの名無しさん
18/03/04 02:53:03.62 QKjmCs/V0.net
韓国がUNICODEにすごい文字数予約済みにしてあるとか聞いたことある
438:デフォルトの名無しさん
18/03/04 03:02:28.08 ymM0nha90.net
あの言語動的に文字生成でもしないと無駄多杉だろ
439:はちみつ餃子
18/03/04 03:02:39.39 R9gQD4Ga0.net
>>417
どうせイテレータでアクセスするから、合字はどうしようもないにしても
先頭からコードポイント単位で読む分にはどの符号化を使っててもあんまり変わらん気がするが。
440:デフォルトの名無しさん
18/03/04 03:56:38.94 8pLLmBBd0.net
>>423
UTF-16 だとサロゲートペアが出てくるからマルチバイトがマルチワードになるだけ
ucs4 だとそれが要らなくて符合とコードポイントが1:1対応になるんだよ。
何年か前まではサロゲートペア?なにそれおいしいの?でも済んでたけど
今の時代それは無理だし
441:デフォルトの名無しさん
18/03/04 04:09:09.92 8pLLmBBd0.net
要は
utf-8、utf-16 → 1符合 ≠ 1コードポイント ≠ 1文字
ucs4 → 1符合 = 1コードポイント ≠ 1文字
だから完全自作の文字列処理ではucs4が楽だよという意見でした
テキストなんてたいしてメモリ食わないしね
おしまい
442:デフォルトの名無しさん
18/03/04 04:09:59.70 FSOQNU6I0.net
charset_cast<utf_8>()みたいなの欲しい
443:はちみつ餃子
18/03/04 08:42:48.43 R9gQD4Ga0.net
おっと、 u16string のイテレータはサロゲートペアは解決してくれないのか。
まあそれも小さなラッパを作ればどうとでもなる。
444:デフォルトの名無しさん
18/03/04 09:34:29.91 LharAyAs0.net
UTF16でサロゲートでガチャガチャやるくらいならUTF8でちゃんとやった方が実り多いし
そんなんやりたくないならUTF32使えばいいし
中途半端だよねUTF16
445:デフォルトの名無しさん
18/03/04 09:38:06.05 ZPPAxORI0.net
ワイドのようで実はマルチ
446:デフォルトの名無しさん
18/03/04 10:55:23.96 kJ02m0gha.net
どこかでみたけど歴史的にはutf32やutf16よりutf8が新しいんだろ?
447:デフォルトの名無しさん
18/03/04 12:59:59.04 hIgSiiXH0.net
オリジナルのXEROXのコードへの先祖返りではないかな?
448:デフォルトの名無しさん
18/03/04 14:09:11.62 GeBypOU0F.net
visualstudio2017でBoost.Testを試したいのですがうまく行きません。
Nugetでboost-vc141をインストールしてテストプロジェクトをWindowsコンソールアプリケーションとして
追加し、Helloworld的なテストプログラムを書きました。
ビルドは通るのですが、テストエクスプローラーにテストが認識されません。
#include "stdafx.h"
#define BOOST_TEST_MODULE MyTest
#include <boost/test/included/unit_test.hpp>
BOOST_AUTO_TEST_CASE(my_boost_test) {
const int x = 1;
BOOST_CHECK(x == 1);
BOOST_CHECK(x != 1);
}
VisualStudio2017のバージョンは15.5.7で
「Boost.Testのテスト アダプター」はデフォルトでインストールされるようになっていたので
インストールされています。
449:デフォルトの名無しさん
18/03/06 00:41:37.37 MSLc23us0.net
標準ライブラリを前方宣言にすることに意味ってありますか?
450:デフォルトの名無しさん
18/03/06 00:45:13.63 jqoml9jL0.net
メイヤーズは普通にインクルードしろって言ってた
451:デフォルトの名無しさん
18/03/06 01:45:01.96 RorZBCxf0.net
>>434
それどこに書いてあるの?
452:デフォルトの名無しさん
18/03/06 06:16:57.53 HL6NWtm0a.net
newした配列がいつの間にか解放されてて、
プログラムの最後でdeleteすると必ずアクセスエラーで落ちるんですが、
newは勝手に解放されることあるんですか?
453:デフォルトの名無しさん
18/03/06 07:19:59.92 18YefqDd0.net
>>436 どっかで未定義動作に堕ちてるならそんな結果になることもあるだろね。
454:デフォルトの名無しさん
18/03/06 07:39:27.47 YXZKPZh60.net
・どっかでメモリの取り扱い間違えてnewの管理情報を踏んづけて壊してる
・unique_ptrやshared_ptr、その他スマートポインタ的なものに理解せずに渡してる
多分このどっちか
455:デフォルトの名無しさん
18/03/06 07:56:08.66 4Jw7uGdF0.net
ポインタがnewで帰ってきたアドレスと違う可能性
456:デフォルトの名無しさん
18/03/06 11:04:41.26 PuW1uuBL0.net
>>436
「解放されてて」というのは、どうやって確認した?
たとえば要素のデストラクタが実行されているとか、
別件で確保するメモリに再使用されているとか、
そういうことが起きているのか?
457:デフォルトの名無しさん
18/03/06 13:48:19.62 xvhpcg6j0.net
>>436
constructor
destructor
copy constructor
operator=()
のいずれかに誤りがあるのでは?
概念コードを書いてみなさい
458:デフォルトの名無しさん
18/03/06 13:50:16.42 xvhpcg6j0.net
>>436
operator new()
operator delete()
を捕捉するのもいいかもね、根本的に見直す時期だと思う
459:デフォルトの名無しさん
18/03/06 15:12:07.82 p6GeX8860.net
ファイル分割をしてみたく、プログラムをヘッダファイルとcppファイルに分割しようと挑戦したのですがよくわからないエラーが出まくります・・
プログラム超初心者なので凄い初歩的な部分を間違えているかもしれません・・・
エラーですが、ヘッダファイルの方で
'vector':'std'のメンバーではありません
'vector':定義されていない識別子です
'
460:string':定義されていない識別子です 'cv': 識別子がクラス名でも名前空間名でもありません。 'Mat':定義されていない識別子です 'ofstream':'std'のメンバーではありません 'ofstream':定義されていない識別子です みたいなエラーが出ます。 ヘッダファイルは、二重インクルードガードと関数のプロトタイプ宣言しかしていないのですが 上のようにそ、のプロトタイプ宣言の型とかに対してのエラーが出まくります 何かヘッダファイルに付けたほうがいいのでしょうか? 分かる方がいたら、教えていただけますでしょうか。 ちなみに、visual studio で作業していて、プロジェクトはコンソールアプリケーションで作っています。 もしかして、自分でmakefileとかを作る必要があるのでしょうか?
461:片山博文MZ
18/03/06 15:14:49.26 W0MQjqG0d.net
ヘッダーの方で
#include <vector>
などが足りないのでは。
ヘッダーは、自己完結にした方がいいらしい。
462:デフォルトの名無しさん
18/03/06 15:40:05.75 p6GeX8860.net
よく見たら、自分の参考にしていたページでヘッダファイルのincludeは最小限に抑えると書いていました…
てっきり、ヘッダファイルではincludeはしないものなのかと…
最小限というのは、エラーが回避できるstdio.hとかの最小限のファイルだけヘッダでincludeして、他のmath.hなどはcppファイルでincludeすればいい感じですか?
463:片山博文MZ
18/03/06 15:50:38.20 W0MQjqG0d.net
最小限というのは、コンパイル時間、ビルド時間を短縮するためだから、小さなプログラムでは気にする必要はない。
cppとhppで#includeを分けるというのはよくあることだ。
464:デフォルトの名無しさん
18/03/06 16:05:55.81 p6GeX8860.net
ありがとうございます!
465:デフォルトの名無しさん
18/03/06 16:16:08.19 r6wtBatS0.net
>>443 の書きぶりからして
自作のヘッダファイルに std::vector を使った関数のプロトタイプがある、
しかしヘッダファイルの先頭では <vector> を#includeしてない、て感じね。
これは >>444 と同じ話。
あと >>445 で <stdio.h> と書いてるところを見ると
参考にしてるページは少々古い情報かも。
「あえて<cstdio>でなく<stdio.h>をインクルードする」ことについて
何か理由があるのかも知れないけど。
466:デフォルトの名無しさん
18/03/06 17:54:41.92 .net
Cソースのincludeの位置にヘッダファイルの中身を貼り付けたときにコンパイルできなきゃだめ
たぶんCソースの中で他のincludeよりも前に新しいヘッダファイルのincludeを書いてるんだろう
467:デフォルトの名無しさん
18/03/06 18:15:37.24 p6GeX8860.net
>>448
なるほど、cstdioの方が良いんですね
なんか二種類あるけど、どっちなんだろーと思ってたので、勉強なります
次からそちらを使います
468:デフォルトの名無しさん
18/03/06 22:17:21.07 i8Fah5dFa.net
>>438
前者っぽいでした
469:デフォルトの名無しさん
18/03/06 23:34:50.60 pZOZvbRza.net
C++のリファレンスとかで[first,last)というふうに左右で括弧が違う表記があるんだけど、これはIteratorに関しての表記ですか?
470:デフォルトの名無しさん
18/03/06 23:42:46.07 xvhpcg6j0.net
>>452
数学方面の書き方を源流にしていると思います
[x, y) は x は含み、y は含めない半開区間を示しますが、それを類推したものでしょう
471:デフォルトの名無しさん
18/03/06 23:43:09.96 ey0B6I8l0.net
>>452
範囲の数学的な書き方、半開区間とかなんとか
それだとfirst以上last未満の範囲、ということ
472:デフォルトの名無しさん
18/03/06 23:47:04.41 MSLc23us0.net
URLリンク(ttsuki.github.io)
前方宣言ってしたほうがいいのか、しないほうがいいのかどっちなんですかね
473:デフォルトの名無しさん
18/03/06 23:50:38.84 pZOZvbRza.net
>>453,454 数学でしたか!勉強になります。
474:デフォルトの名無しさん
18/03/07 00:29:35.52 +JS1hm360.net
mutex g_Mtx;
int g_Val = 0;
int Func( int A, int B )
{
int Val = A * B;
lock_guard<mutex> Lock( g_Mtx );
return g_Val = Val;
}
void ThreadFunc0()
{
int Val = Func( 2, 3 );
// Valを参照する処理
}
void ThreadFunc1()
{
lock_guard<mutex> Lock( g_Mtx );
// g_Valを参照する処理
}
上記のようなスレッド関数が非同期に実行されるとき、
Func()はスレッドセーフ(g_Val書き換え中に参照されない)でしょうか?
(1)lock_guard<mutex>によるミューテックスロック
(2)g_Valの書き換え
(3)戻り値を呼び出し元スレッドにコピー(あるいはムーブ)
(4)lock_guard<mutex>がスコープから外れアンロック
というシーケンスを期待しています。
475:デフォルトの名無しさん
18/03/07 00:29:47.60 6+ILModc0.net
endならともかくlastは区間内の最後の要素なんじゃ…
476:デフォルトの名無しさん
18/03/07 10:09:55.97 ukyKg6LAa.net
基本的な質問なのですが、以下のプログラムがエラーになるのはなぜでしょうか?
char* pc = "abc";
pc[0] = 'z';
cout << pc << endl;
以下のプログラムでは意図通りに動きます。
char ac[] = { 'a', 'b', 'c', '\0' };
cout << ac << endl;
ac[0] = 'z';
cout << ac << endl;
477:はちみつ餃子
18/03/07 10:14:51.80 TWOfgg7C0.net
>>459
上は変数 pc はリテラル文字列の先頭を指すポインタ。
下の変数 ac は配列で、それを文字列 "abc" で初期化するって意味。
リテラルの破壊は未定義。
破壊しないことをあてにして破壊不可能なセクション (メモリ領域) に配置されたりすることもあるので、アクセスエラーが生じる。
あくまで未定義だから出来ちゃうこともあるし、コンパイラオプションで制御できたりもするけど、基本的にはあかんやつ。
478:デフォルトの名無しさん
18/03/07 10:30:06.22 ylRgY7un0.net
>>458
仮引数名をendにすると関数名のendと紛らわしいからだよ
説明の文中にendが出てくる度毎にいちいち仮引数か関数か断るハメになる
479:デフォルトの名無しさん
18/03/07 10:35:31.71 ukyKg6LAa.net
>>460
ありがとうございました。
Pythonでimmutableとかいうのがありますが、それでしょうか?
480:デフォルトの名無しさん
18/03/07 11:10:02.03 ukyKg6LAa.net
すみません、また、ベーシックな質問です。
char* pc1 = 1; → エラー
char* pc2 = NULL; → OK
char* pc3 = 0; → OK
なぜ、2番目と3番目はOKなのでしょうか?
char* pc1 = 1;
がエラーになるのは、 int 型の値で char* 型の変数を初期化できないからだとすれば、
char* pc3 = 0;
もエラーになると考えることもできると思います。
481:はちみつ餃子
18/03/07 11:10:26.68 TWOfgg7C0.net
>>462
Python なんか知らんがな。
Python の immutable は Python の immutable であって、それが C++ の何物かであったりはしないよ。
C++ のリテラルを破壊した結果は未定義というのは C++ のリテラルを破壊した結果は未定義という規則であるだけ。
似て感じられたとしても一対一に対応付くような単純なものではないので、
背景にあるメカニズムを理解せずに翻訳して理解しようとするような方法はお勧めできない。
482:デフォルトの名無しさん
18/03/07 11:14:31.86 ukyKg6LAa.net
>>464
なるほど、そういう規則だからリテラルを破壊しようとするとコンパイルエラーにするわけですね。
ありがとうございました。
483:はちみつ餃子
18/03/07 11:22:08.82 TWOfgg7C0.net
>>465
書き忘れてたけど、 C++ の文字列リテラルの型は const char[] なので、
const 付きでないポインタに渡すと単純に型が合わなくてエラーになるはず。
C だと型に const が付いてないのに破壊するのは未定義ってことになっててあまりにもクソだったから改められた。
484:はちみつ餃子
18/03/07 11:32:07.41 TWOfgg7C0.net
>>463
0 はポインタに型変換可能で、型変換した結果が空ポインタと等しいことが保証されてる特別な存在。
(ビットパターンが等しいとは限らないことには注意が必要。)
互換であることが保証されているので、処理系によっては
#define NULL 0
として定義していることもある。
余談だが、これはオーバーロードされた関数でうっかりしやすいので気を付けた方がいい。
たとえば関数 foo が以下のような型でオーバーロードされている場合、
void foo(int);
void foo(int*);
これを
foo(NULL)
と呼び出すと void foo(int) が呼び出されたりする。
今ではヌルポインタを表すキーワード nullptr が用意されたので、
NULL はあまり使わない方が良い。
485:デフォルトの名無しさん
18/03/07 12:03:25.28 ukyKg6LAa.net
>>466-467
ありがとうございました。
>>466
Visual Stuidoを使っていますが、以下でエラーは発生しませんでした。
char* pc = "abc";
cout << pc << endl;
486:デフォルトの名無しさん
18/03/07 12:29:38.25 ylRgY7un0.net
>>468
それはISO/IEC14882:1998の4.2で許されていたことに由来する
その後ISO/IEC14882:2011のC.1.1で廃止されたが
古いソースを通すために故意に違反状態のままにしている
487:デフォルトの名無しさん
18/03/07 16:15:14.65 nnB4Kxzea.net
c++の規約に違反にしないためには一度変数に代入する必要があるという事?
488:はちみつ餃子
18/03/07 16:24:01.54 TWOfgg7C0.net
オプションで指定できるんじゃね?
俺は GCC を使ってるから知らんけど。
489:デフォルトの名無しさん
18/03/07 16:29:51.37 ylRgY7un0.net
違う
char const* cc;
cc = "abc"; //完全に合法
char* pc;
pc = cc; //不適格
pc = "abc"; //CとC++98では非推奨、C++11以後では不適格
pc = &"abc"[0]; //左辺値変形でこう解釈されていて
非constへのポインタに、constへのポインタを代入することになり、
暗黙のconst外しにあたるので、C++11が正論
pc = const_cast<char*>("abc"); //C++11以後ではこう書く
490:デフォルトの名無しさん
18/03/07 17:54:06.02 .net
>>472
それもだめじゃね?
const領域に非constでアクセスするなんて罪深いことなんだから、ちゃんと別領域にコピーしてから扱わないと。
491:デフォルトの名無しさん
18/03/07 18:18:25.20 TnxtYBSc0.net
>>459
>char* pc = "abc";
文字列リテラルは不変だから、const を付けないといけない
古いライブラリで、const を付けていないものを動作させるために(互換性)、
例外的に使う場合だけに許される
>>463
>char* pc3 = 0; → OK
この0 は、数値型の0じゃない。
予約語を増やすのが嫌だから、= 0 と書いたら、特別な意味に解釈する。
分かりにくい、クソ仕様
virtual func( ) = 0;
これも、そう。
純粋仮想関数という特別な意味を表す
492:はちみつ餃子
18/03/07 18:49:53.33 TWOfgg7C0.net
>>473
書き込まなければ問題は無い。
が、 const 外しが必要な状態ってのが良くないことは確か。
493:デフォルトの名無しさん
18/03/07 20:52:49.95 ylRgY7un0.net
>>474
いいや数値型の0だ
翻訳時に0と確定できる汎整数型の定数に限り
ポインタに暗黙変換できるという特例になっている
純粋仮想関数と関連付ける条項はない
494:デフォルトの名無しさん
18/03/07 22:07:54.67 eXkgxxlqd.net
純粋仮想関数と関連付けてはいないだろう
それはともかくとして
char * p = 7-7; // no error
class T {
virtual void f() = 7-7; // error
};
となる気がするので言ってることは合ってるか
495:デフォルトの名無しさん
18/03/07 22:10:57.06 NKcGF/Sn0.net
C言語でNULLが0をdefineしたものだったというだけだろ
496:デフォルトの名無しさん
18/03/07 22:12:59.22 eXkgxxlqd.net
C言語では ((void*)0) だった気がする
497:デフォルトの名無しさん
18/03/07 22:34:03.79 ylRgY7un0.net
>>477
7-7は定数式なので0と完全に等価
純粋仮想関数の = 0 はA.8のpure-specifierで=0という特定のスペルと規定されているので7-7がエラーになるのは当然
498:デフォルトの名無しさん
18/03/07 22:41:42.97 eXkgxxlqd.net
いや疑問も呈していないし否定しているわけでもないのに当然と言われてもな…
499:デフォルトの名無しさん
18/03/07 22:52:11.20 ylRgY7un0.net
じゃあ何のために、7-7とか言い出したんだ?
500:はちみつ餃子
18/03/07 23:02:40.75 TWOfgg7C0.net
>>479
それはあかん。
ひょっとしたら古い処理系でやってるのはあるかもしれんが、
規格違反のはず。
501:はちみつ餃子
18/03/07 23:12:03.15 TWOfgg7C0.net
>>483
と、思って調べてたんだけど、 C++ だと確実にあかんようだけど C だとアリなのかもしれない。
502:デフォルトの名無しさん
18/03/07 23:58:27.20 /Jrz1mw60.net
offsetof()がどう実装されているかやね
503:デフォルトの名無しさん
18/03/08 02:18:11.16 BQ11IIJi0.net
>>476-477
C++14 からリテラルだけに限定されてるよ。
URLリンク(d.hatena.ne.jp)
504:はちみつ餃子
18/03/08 03:31:21.90 +04GXVK30.net
おっ、こんな基本的なことで変更が入ってたのか。
でも当然といえば当然の処置よな。
505:デフォルトの名無しさん
18/03/08 06:41:46.04 DSeYC6Qd0.net
Cの無意味な汚いゴミが掃除されるのは良いことだ
506:デフォルトの名無しさん
18/03/08 07:33:41.79 dmEui5aT0.net
>>484
しっかりして
流石にこの件では C と C++ 混同されたら対話が成り立たないよ
507:デフォルトの名無しさん
18/03/08 18:35:02.35 uuOHCrug0.net
C++の勉強+機械学習も勉強しようとVisual Studio 2017でtiny-dnnを用いたいのですが、tiny-dnn内でコンパイルエラーが発生します。
具体的にはxcontainer.hpp内でC3203というエラーが頻発したり、feedfoward_layer.hppではC2760というエラーが発生したりしています。
環境はWindows 7でVisual Studio 2017 communityです。
プロジェクトはwindowsデスクトップアプリケーションを用いています。
tiny-dnnのインクルードはプロパティのインクルードディレクトリに追加しています。
どなたか心当たりのある方がいらっしゃれば教えていただけると嬉しいです。
508:デフォルトの名無しさん
18/03/08 19:27:19.96 i2S5Knpdd.net
linux windows両対応のコードを考えている最中の質問です
unsigned int型の変数xの32bitに、char型の配列y[4]の8bit×4を当て込みたいです
y[0]から順にxの先頭ビットに入れたいのだけど
そういう時はどのようなコードになるのでしょうか
符号の問題で単純に24bitシフト+16bitシフト...みたいなことをすると期待の値にならないときが存在してます
509:デフォルトの名無しさん
18/03/08 19:50:56.79 2k5PL6f/a.net
unionでどう?
510:デフォルトの名無しさん
18/03/08 20:26:39.82 FhiFltVyd.net
>>491
シフトする前にunsigned charにキャストする
511:デフォルトの名無しさん
18/03/08 20:29:17.36 FhiFltVyd.net
参考
URLリンク(stackoverflow.com)
512:はちみつ餃子
18/03/08 22:47:08.29 +04GXVK30.net
>>489
スマソ
513:デフォルトの名無しさん
18/03/09 11:50:12.37 XHk1xHdH0.net
ヘッダーファイルの関数定義から関数ポインタをtypedefする事は可能ですか?
C++98辺りのコンパイラです。
514:はちみつ餃子
18/03/09 12:25:38.00 nl8HCt1x0.net
>>496
昔の C++ には decltype が無いもんな。
出来ないと思うよ。
515:デフォルトの名無しさん
18/03/09 12:57:58.47 zqzgOSq4d.net
テンプレート使えないかな?
516:デフォルトの名無しさん
18/03/09 13:06:17.52 XHk1xHdH0.net
出来ませんか。ありがとう。
再定義が面倒だったので楽したいだけだったんですけどね。
517:はちみつ餃子
18/03/09 13:35:32.12 nl8HCt1x0.net
>>498
その手があったか。
でも C++98 で自動で推論させようとするとヘルパー関数を使う必要があるじゃろ。
意味のないオブジェクト生成 (最適化で消えるかもしれんけど) がださい感じはするよね。
518:デフォルトの名無しさん
18/03/09 19:06:34.98 CekgNpjOM.net
>>496
たくさんあるなら
> ヘッダーファイルの関数定義から関数ポインタをtypedefする
コードを生成するツールを作るとか
519:デフォルトの名無しさん
18/03/09 22:17:46.30 .net
>>496
マクロ駆使すれば
TYPEDEF_FUNC_DE
520:CL(なんちゃら); FUNC_DEF(かんちゃら) { return; } みたいな書き方できないのかな? なんちゃらは識別名と戻り値と引数 かんちゃらは識別名を指定するイメージ
521:デフォルトの名無しさん
18/03/09 23:46:50.00 yn7GHiyb0.net
>>491
unsigned int x;
char y[4];
.
.
.
memcpy(&x, y, 4);
522:デフォルトの名無しさん
18/03/09 23:57:54.33 5+PoAx/E0.net
>>491
xの先頭ビットとはMSBなのかLSBなのか
523:デフォルトの名無しさん
18/03/10 00:45:01.61 8ENKFfsbd.net
メモリ上でのレイアウトとかもあるのでuint8_t経由でのシフトがいい
クロックが(メモリアクセスが問題にならない程)低くてシフトが遅いマイクロプロセッサは別
524:デフォルトの名無しさん
18/03/10 04:49:25.72 .net
>>503
x = ntohl(x);
も忘れずに
525:デフォルトの名無しさん
18/03/10 06:32:30.15 Tg3hDFxK0.net
>>491
先頭ビットって32ビット目のことか?
526:デフォルトの名無しさん
18/03/10 17:21:32.19 a2p+alti0.net
>>506
それが必要になるかどうかは場合による。
527:
18/03/10 17:42:35.32 +Ww908Qw0.net
ネットワークバイトオーダーがここで関係あるのだろうか?
528:デフォルトの名無しさん
18/03/10 19:22:25.29 .net
>unsigned int型の変数xの32bitに、char型の配列y[4]の8bit×4を当て込みたいです
>y[0]から順に
っていう要件だから、ホストバイトオーダーがビッグエンディアンかリトルエンディアンか分からない以上は常にntohlを付けるべき
529:デフォルトの名無しさん
18/03/10 19:24:15.74 .net
char y[4] = { 0x12, 0x34, 0x56, 0x78 };
unsignd in x = 0x12345678;
これを等価にしたいという意味だろうから。
530:デフォルトの名無しさん
18/03/10 21:52:35.38 My21AM/A0.net
独習c++終わりそうなんだが次によむべき本とかある?
531:
18/03/10 22:03:20.54 +Ww908Qw0.net
>>512
スレリンク(tech板:312番)
あと STL の教科書、これもC++11以前のもの
URLリンク(www.amazon.co.jp)
532:デフォルトの名無しさん
18/03/10 22:09:22.02 Tk41qGXE0.net
本ばかり読まず実践しよう
533:デフォルトの名無しさん
18/03/10 22:09:43.95 lWictyCS0.net
>>512
cpprefjp
534:デフォルトの名無しさん
18/03/10 22:28:49.18 tBgkA+tH0.net
プログラミング言語C++とかどうやろ
535:デフォルトの名無しさん
18/03/10 22:50:35.99 My21AM/A0.net
ありがとうございます
ひとまず>>513の本にしてみます