X



C++相談室 part134
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん (ワッチョイ 5fcb-Q2eK)
垢版 |
2018/01/20(土) 09:05:42.21ID:mJKRg6iz0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part133
http://mevius.5ch.net/test/read.cgi/tech/1511509970/

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

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

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0002デフォルトの名無しさん (ワッチョイ e3cb-Q2eK)
垢版 |
2018/01/20(土) 09:07:45.45ID:mJKRg6iz0
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

いつまでこの糞テンプレ張り続けるんだおい

---- テンプレ ここまで ----
0006デフォルトの名無しさん (ワッチョイ 9d23-bNKV)
垢版 |
2018/01/20(土) 11:02:33.41ID:Bd+LbacS0
メモリ帯域が律速になる処理はわりとあるので
大容量のデータを処理してるならおかしくはない

キャッシュ効かないメモリアクセスするコストに比べたら整数の拡張など微々たるもんだ
0007デフォルトの名無しさん (ワッチョイ e3bd-16v+)
垢版 |
2018/01/20(土) 11:46:34.01ID:slOCvU7H0
>>1
↓前スレの続き
std::vector<double> vec((size_t)1000);
...
size_t sz = vec.size();
for (int i = 0; i < (int)sz; ++i) {
 cout << i << " " << vec[i] << "\n";
}
の方がiをsize_tにするよりループ命令の部分が軽量化されることにより早いかも試練(x64では気のせい?
およびループ内で他に32 bit演算をやる場合、x64だと全てレジスタ上で賄える可能性が高まるから
速くなるかも試練、

結論: アセンブリコードを確認せよ
0008デフォルトの名無しさん (ワッチョイ e3bd-16v+)
垢版 |
2018/01/20(土) 12:06:11.44ID:slOCvU7H0
いやスマン
例が不適切やったわ;
ループ内でstd::coutみたいな重量のある関数呼び出しをしたら
「全てレジスタ上で賄える」とか
「キャッシュが有効活用で劇速化」とかも糞も無いな
0012デフォルトの名無しさん (スップ Sd03-3us9)
垢版 |
2018/01/20(土) 14:00:41.11ID:gdCBjjapd
>>3
ん?
プロファイラの確認?
だとしたら[ ] が遅いんじゃなくてメモリの読み込みが実際に遅い可能性があるのでは?

そもそも、
[ ] が問題になるような小さなループで
[ ] の時間を正しく測れるのか?

いずれにしろ、生ポと比較してみるのが一番
0013デフォルトの名無しさん (スップ Sd03-3us9)
垢版 |
2018/01/20(土) 14:02:23.47ID:gdCBjjapd
メモリ帯域の問題なら
もっと大きな視野で最適化をしないとな

複数ループをくっつけてメモリアクセスを減らすとか
細切れに処理をしてキャッシュを効かすとか
0015デフォルトの名無しさん (スップ Sd03-3us9)
垢版 |
2018/01/20(土) 14:05:12.48ID:gdCBjjapd
あ、可能性だけで言えば
signedよりunsignedの方が速い
32bit から 64bit の符号拡張はコストが微妙にかかることもあるが、
ゼロ拡張はなにもしなくて良いから
レジスタの上位32bitは勝手にゼロになる
0021デフォルトの名無しさん (ワッチョイ 25b3-GP+B)
垢版 |
2018/01/20(土) 20:30:37.09ID:w1mvJepJ0
質問させてください。
以下のコードで push_back 時にコピーコンストラクタが呼ばれます。
ttps://ideone.com/Zodd94

こちらとしては、下のページにあるように、ムーブコンストラクタが呼ばれることを期待しています。
ttps://qiita.com/_meki/items/90f9815a1e899593daa3

なぜムーブではなくてコピーになるのか、教えて頂けないでしょうか。
0024デフォルトの名無しさん (ワッチョイ 25b3-GP+B)
垢版 |
2018/01/20(土) 21:07:26.00ID:w1mvJepJ0
追加で質問させてください。

コンパイラが自動生成する関数で、noexceptがついているのは
・デストラクタ
・ムーブコンストラクタ
・ムーブアサインメントオペレーター
の3つでよろしいでしょうか。

よろしくお願いします。
0026デフォルトの名無しさん (ワッチョイ 25b3-GP+B)
垢版 |
2018/01/20(土) 21:18:07.18ID:w1mvJepJ0
回答ありがとうございます。

データメンバと基底クラスのそれぞれのデフォルトコンストラクタが全て noexcept なら、
noexcept なデフォルトコンストラクタが自動生成される。
コピーコンストラクタ、コピーアサインメントオペレーターも同上
という理解でよろしいでしょうか。

また、その条件が成立しないときは、>>24で挙げた3つということになるのですしょうか。

よろしくお願いいたします。
0027デフォルトの名無しさん (ワッチョイ 25b3-GP+B)
垢版 |
2018/01/20(土) 21:36:13.58ID:w1mvJepJ0
>>26について自己解決しましたので、質問を取り下げます。
ありがとうございました。
0032デフォルトの名無しさん (ワッチョイ 559f-x16F)
垢版 |
2018/01/21(日) 19:49:20.49ID:FwsOgvVZ0
記述上 int* であるが、上書きされた場合に自動的に中身を delete してくれるポインタの入れ物を、
operator= のオーバーロードなしで定義できますか?

ちょっと変な質問なのだけど、native C++なら多分以下コードで出来る。

struct PatHead {
int* ptr;
int* operator=(int* value){
if (ptr) delete [] ptr;
ptr = value;
return value;
}
operator int*(){ return ptr;}
};

void test(){
PatHead ph[10]; // int* ph[10] と同じ記述で通るのがミソ

ph[1] = (int*)1;
int* tgt1 = ph[1];
}

問題はこちらが使っているのはVC++/CLIで、
なぜか value struct では operator= のオーバーロードが出来ず、(C3194)
マネージ配列に直接入るのは value型だけなのでちょっと詰んでいる。
なお ref struct なら出来るのだが、こちらは逆に初期化部分で記述が増えるので、
それなら諦めようかな、って感じ。

というわけで回避策を思いつく人がいればお願いします。
何で値型で禁止されているか分かる人も居ればよろしく。
0033デフォルトの名無しさん (ワッチョイ ae81-MBfL)
垢版 |
2018/01/26(金) 13:51:50.30ID:duEsoqcC0
イテレータでendの一つ前を表すのはありますか。
endからの引き算必須ですか。
0039デフォルトの名無しさん (アウアウウー Sa77-fQjY)
垢版 |
2018/01/27(土) 19:12:13.06ID:Boft2e8Ea
SHA256のハッシュをkeyにしたmapを高速で扱いたいんだが、
keyのoperator <,>それぞれでmemcmpしてて、多分このせいで性能悪くなってる

なんか良い解決策ってないですかね?
Linuxのrbtreeと比較すると100万件あたり150msec程度差がついてました
0044デフォルトの名無しさん (アウアウウー Sa77-fQjY)
垢版 |
2018/01/27(土) 22:15:03.18ID:Im+FAy1Qa
>>40
便利そうだと思ったけど、データ構造的にアライメント揃えられないから使えなさそう

>>41
ソート済みデータを扱いたいパターンもあるので使えないです

コード的にさっくり改善する方法がなさそうなので
map諦めてそこだけ完全自作することにしました
レスしてくれた方々サンクスです
0048デフォルトの名無しさん (ワッチョイ 9abd-xSVK)
垢版 |
2018/01/28(日) 03:22:06.75ID:vIDP+sWr0
コピーしたくないオブジェクトへのポインタ(ていうか全体をシリアライズするの可能性も考えたらindexがマジお勧め)の配列おソートすれば良い
そういった実装の詳細はクラスの中に隠すことができる 何のためにC++を使っているのやヽ(`Д´)ノ!!!11!1
0051デフォルトの名無しさん
垢版 |
2018/01/28(日) 14:41:11.23
そりゃハッシュ衝突用のフィールドくらい作ってるだろうよ
質問にないことは心配しなくていいよ
0055デフォルトの名無しさん (ワッチョイ bbb3-rgA5)
垢版 |
2018/01/28(日) 20:42:03.84ID:NzqukFwp0
すいません。途中で書き込んでしまいました。

以下のようなクラスを作ったのですが、
derivedがImp::baseを継承しているため、
インクルードの順番が固定されてしまいます。(Impliment.hが先でないといけない)

こういったクラスは使う人から見て嫌がられるでしょうか。
ご意見をいただけるとありがたいです。

Impliment.h

class Impliment
{
public:
class base {}
};


Interface.h

template<class Imp>
class Interface
{
private:
class derived : public Imp::base {}
}
0056はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 966f-rgA5)
垢版 |
2018/01/28(日) 20:56:07.47ID:Xl/BPHGJ0
>>55
「XXの実装とインターフェイスが分かれている」ということをユーザが意識しないといけないのは抽象化の不足だと思う。
分離した形のデザインで開発するのはかまわないけど、ユーザに対してはなるべく隠すのが望ましい。

#include<Implement.h>
#include<Interface.h>

と書いたヘッダファイルを用意しておく程度のことでもだいぶんマシになる。
(インクルードガードはしておくこと)
0059デフォルトの名無しさん (ワッチョイ bbb3-rgA5)
垢版 |
2018/01/30(火) 20:17:26.27ID:fsahOVUj0
レスありがとうございます。

>>56
Implimentは複数あって、ユーザーが選ぶことができる
というのを想像して作っていました。

>>57
template化する前はそこでインクルードしていました。

>>58
たしかに、このコードだけでは大丈夫ですね。
正確にはこのコードだけではないので、他に原因があるのかもしれません。
ご指摘ありがとうございます。
0062デフォルトの名無しさん (ワッチョイ 9fbd-CNA0)
垢版 |
2018/02/04(日) 11:20:04.76ID:r6E1M8790
質問ですが
「このクラスはバイト列としてコピーできる」ということを明らかにするために
明示的にコピーコンストラクタを書くとして、
どう書けば処理系に依存することなくデフォルトのコピーコンストラクタ以上の性能になることを保証できますか
(もしくは、「このクラスはバイト列としてコピーできる」ということを明示する構文はありますか)
0064はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-wbgk)
垢版 |
2018/02/04(日) 11:36:31.71ID:H9FebDBN0
デフォルトのコピーコンストラクタはメンバのコピーコンストラクタを起動するので、
そのクラス (に属するオブジェクト) 全体がバイト列としてコピーするわけではない。

trivially copyable class の要件を満たすように書けばバイト列としてコピー可能と保証される。
コンストラクタの書き方だけでは保証できない。
0066デフォルトの名無しさん (ワッチョイ 9fbd-CNA0)
垢版 |
2018/02/04(日) 13:46:35.82ID:r6E1M8790
>>63
なるほど「= default;」のありがたみがわかりた

>>64
なるほどそれだと安全性の点でイマイチ…
バイト列としてそのままリモートPCに送ったりするクラスに誰かが
バイト列としてのコピーが可能でないコードを追加したとしても
コンパイラで検出する術が無いっぽいように読める
0072はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-wbgk)
垢版 |
2018/02/04(日) 17:24:06.38ID:H9FebDBN0
流れをぶった切って質問するんだけど、
配列の一部をとる参照とかって作れない?
実際にはコンパイルが通らないけど、やりたいことはこんな感じ。

int a[3];
int (&b)[2] = static_cast<int (&)[2]>(a);
0079デフォルトの名無しさん (ワッチョイ 9fbd-CNA0)
垢版 |
2018/02/05(月) 23:20:37.74ID:y5vbQcAP0
メンバのコピーコンストラクタを起動すべきところをmemcpy()しかしない手製コピーコンストラクタで済ませようとしたら破滅が訪れる

MyClass(const MyClass&) = default; なら勝手にやってくれるのでその心配が無いので安心
0091デフォルトの名無しさん (ワッチョイ 7723-Us3F)
垢版 |
2018/02/06(火) 14:01:35.47ID:rGp9SuaC0
そもそも memcpy は前者の性能保証も後者の仕様の保証もどちらも満たしてない
仕様が保証されてるなら多分性能的に大丈夫だろうという程度

間違いを認めると死ぬ病気なんだろうからもうこれ以上は言わない。
009462 (ワッチョイ 9fbd-CNA0)
垢版 |
2018/02/06(火) 22:02:19.27ID:MckGyr3K0
memcpy()より速いコピー手段Xが仮にあったとして
論理的にmemcpy()で済むケースについてコンパイラが提供する
デフォルトのコピーコンストラクタがコピー手段Xにならない理由がわからん…

個人的には「=default;」と書いたら最高性能なんなら毎回手でmemcpy()とか書きたくないカンジ
0100デフォルトの名無しさん (ワッチョイ 9fbd-CNA0)
垢版 |
2018/02/06(火) 23:21:41.18ID:MckGyr3K0
仕方ないので漏れが訂正するわ;
ttps://ideone.com/TZnGv4

↑のコードの
(*1)は「=default;」でデフォルトのコピコンの使用を明示
(*2)は手でmemcpy()でコピーするように書いたコピコン

次の条件で試したら(*1)も(*2)も同じコードになったわ
x86-64 gcc 7.2
-O2 -fno-strict-aliasing -std=c++14 -pedantic -Wall -Wextra

こことかで試せるが保存と公開方法がわからんかったのでideoneを使わせてもろうた
ttps://gcc.godbolt.org/

漏れの国語力ではようわからんが、さすがに多分>>84は間違いなんジャマイカ、
0105デフォルトの名無しさん
垢版 |
2018/02/07(水) 07:27:28.65
頭のいいコンパイラなら勝手にベクトル処理とかしてくれるんじゃないの?

知らんけど
0106デフォルトの名無しさん (ワッチョイ 57b3-wbgk)
垢版 |
2018/02/07(水) 22:28:51.20ID:MTpdY7NJ0
"!"!"!MOHYO!"!"!"2"

1.[[[HUn≒MUL=POSI≠MAHO+Set*HUGE=SAGE=LOGE=NOISIA=0≒1]]]

2-[[[[[[[E=RAT%2^10%SPELAn!%]&!TOWA&!PEG#!NOLNOL8!#!HYAGO!2#]1*2=1]U]S]0]O]!#PAL!

3--->PAGODOL7&!@17,2222734.15&[[[%%RENRAK6,9,99"^10"]#$11.2%}]KAIJ]{

41.2SSS = RALQI2.β{{{RA4,0,238^97,1,$.S.L.E.I.L."Q5352.15Q"JOL"5*3>>>41.3q}}}>1.2<0
.3φTALHOSI"0">>>105.10<1.235<1.2>51≠52===55.632>V="E=0.835"of"1.32","632",0.683,1.end

{
0107片山博文MZ ◆T6xkBnTXz7B0 (スププ Sd62-d/x4)
垢版 |
2018/02/10(土) 19:52:35.19ID:x9I4Wn6Pd
C++では、
int i;
for (i = 0; i < 9; ++i) { ... }
が、
for (int i = 0; i < 9; ++i) { ... }
って書けるのは知っているだろう。( )の中で、変数を宣言できる。

だが、ifやwhileの( )の中で、変数を宣言できることを知らない人は多い。
0110デフォルトの名無しさん (ワッチョイ 4539-102K)
垢版 |
2018/02/11(日) 17:00:15.07ID:RGzNlubj0
それほど待ち遠しいか?
0111デフォルトの名無しさん (ワッチョイ 99b3-7Au1)
垢版 |
2018/02/11(日) 17:27:44.93ID:QA9xO9uU0
待ち遠しくない
0112デフォルトの名無しさん (ドコグロ MM0a-/0XS)
垢版 |
2018/02/11(日) 17:34:07.64ID:A61Ds/EIM
for( ) の制御変数はそのループでしか使わないことが多いから意味あったけど、if( ) でそんなケースはまれだしなぁ
あれば使うけど待ち遠しいって言うほどじゃない気がする
0118デフォルトの名無しさん
垢版 |
2018/02/11(日) 20:06:43.52
>>116
>if(DWORD err = GetLastError(); err != NO_ERROR)

普通こうやろ
if((DWORD err = GetLastError()) != NO_ERROR)

変数宣言は少しは意味あるかもしれんが(Perlと同じことができるってこと)
複文書けるのは特にメリット感じないわ
0120デフォルトの名無しさん
垢版 |
2018/02/11(日) 20:56:03.30
>>119
それが通るという変更だと思ってたわ

こう書けるPerlのほうがまだ優位性あるね

if((my $err = GetLastError()) != NO_ERROR)
0121デフォルトの名無しさん (ワッチョイ d27e-jA6l)
垢版 |
2018/02/11(日) 22:10:23.49ID:p+z832PL0
if(init ; expr)だと初期化と式が関連していなくてもいいので>>120とは違う構文になる
だからこんなのでもよい
if(int err = GetLastError(); hoge.aho())

lock_guardもしておける
if(std::lock_guard<std::mutex> lock(m); flag)

構造化束縛も使える
if(auto [a, b, c] = f(); b > c){ std::cout << "b > c" << std::endl; }
0122デフォルトの名無しさん (ワッチョイ ddc3-saCW)
垢版 |
2018/02/12(月) 12:22:30.52ID:sATukCOa0
Cでは名前空間っていうのをすごい扱っていた気がするんだけどC++は名前空間扱うことってないの?
一つのアプリケーションも完成させたことがないど素人の質問ですまんが
0125デフォルトの名無しさん (ワッチョイ 319f-R9JW)
垢版 |
2018/02/12(月) 20:44:41.93ID:gfcybQxo0
>>122
気のせい。
0127はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 066f-jA6l)
垢版 |
2018/02/13(火) 17:30:20.31ID:tUR5ZBgZ0
構造体タグと型名の名前空間が分かれているといったような意味での名前空間は C に有るが
C++ では構造体タグはそのまま型名としても使えるし、そういう意味での名前空間の話かな?
0134デフォルトの名無しさん (ワッチョイ 9f23-TT3E)
垢版 |
2018/02/15(木) 12:08:37.28ID:Sgd3BwBT0
std::mapのように文字列や構造体をキーにした高速アクセスができて、
要素の数が一定数を超えたらLRU形式で勝手に削除してくれる、
キャッシュのような機能を実装したいのだけど、
C++でそのような仕組みを作れるクラスはないですか?
0137デフォルトの名無しさん (ブーイモ MMbf-4Nx+)
垢版 |
2018/02/15(木) 19:13:27.39ID:CSnzpiZpM
C++のプログラマーって性格ねじ曲がってるなあ
初めてGo応援したくなったわ
0143デフォルトの名無しさん (ワッチョイ 9fa8-yZIn)
垢版 |
2018/02/16(金) 00:43:14.82ID:uaG+5sVQ0
>>135じゃないけどシンプルにいくなら
{
map<key,value> data; // 本来のデータ
map<key,list<key>::iterator> lruindex; //
list<key> lrulist; // LRUリスト
... // mapと同じインターフェイス
}
みたいなクラスで要素の追加・削除・参照とかの時にLRUリスト見て処理すればいい
0144デフォルトの名無しさん (ワッチョイ ff80-Pey1)
垢版 |
2018/02/16(金) 03:16:29.76ID:DpsRPWWQ0
辞書・線形リスト・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
0145デフォルトの名無しさん
垢版 |
2018/02/16(金) 04:31:51.17
>>144
> # ary は、hash に追加・アクセスした順

参照のたびに最後尾に追加しなおすの?
0146デフォルトの名無しさん (ワッチョイ d7e3-2H/C)
垢版 |
2018/02/16(金) 06:27:04.53ID:HICjIKnm0
プログラムを作っていて困っています。
プログラム動作環境、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\
0147144 (ワッチョイ ff80-Pey1)
垢版 |
2018/02/16(金) 07:56:00.35ID:DpsRPWWQ0
>>145

>>134
で、LRU と書いてあるから、Hash に追加しようとした度に、
すでに存在する場合でも、配列の最後尾に追加しなおした

どういう意味か、正確にはわからないけど
0149134 (ワッチョイ 9f23-TT3E)
垢版 |
2018/02/16(金) 09:56:21.20ID:+b2iJMK40
みなさんありがとうございます。
std::mapにLRUや最大要素数の仕組みを持たせた派生クラスでも
無いかと思ったのですが、標準ではやっぱり無いですか。

>>143のように、std::mapをメンバの一つに持たせた独自クラスを
一から作っていくことになるんですかね。
0150デフォルトの名無しさん (ワッチョイ 9f12-pjg9)
垢版 |
2018/02/16(金) 10:11:55.71ID:JoalkiMd0
amazonランキングの謎を解く とか言う本でmove-to-frontを見た

本の紹介「Amazonランキングの謎を解く」
http://www.kenkyuu.net/whatsnew/2011/08/book2011-08-01.html
>「move-to-front規則」(最後に売れた順に並べる、つまり、注文のたびに1位にジャンプする)

Move To Front - Wikipedia
https://ja.wikipedia.org/wiki/Move_To_Front
0162デフォルトの名無しさん (マクド FF6b-xgEu)
垢版 |
2018/02/17(土) 09:43:48.64ID:Lqib7/b9F
以下のように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;
}
0164デフォルトの名無しさん (ワッチョイ 1f7e-T3WU)
垢版 |
2018/02/17(土) 10:21:38.22ID:4SqFrjwY0
何故stringそのものじゃなくて内部データをdeleteしようと思ったのか
newで確保した配列じゃないからdeleteはできない
stringの内部データは静的な配列と動的な配列を組み合わせて表現されている
mscvの場合先頭16文字はchar[16]でそれ以降は動的な配列に入るようになっている
psz[0]のアドレスはchar[16]の先頭アドレスなので当然deleteできない
msvcはdeleteに失敗しても落ちないのかな
0165デフォルトの名無しさん (ワッチョイ ff80-Pey1)
垢版 |
2018/02/17(土) 10:47:53.57ID:IU1gsQgu0
>>155-159
本格的な本なら、ロベール、ハーバート・シルトの独習

軽めの本なら、柴田 望洋、林 晴比古、猫
0166デフォルトの名無しさん (ワッチョイ 9fcb-8YMj)
垢版 |
2018/02/17(土) 11:22:13.08ID:++v6vSjK0
ハンガリー人まだ絶滅してないのか。
stringはnull terminatedでないからpszはおかしい。
psz2もnull terminatedの保証がないからc_strを使うべき。
うまくいったらstrdupも調べとこうな。
0170デフォルトの名無しさん (ワッチョイ bf0e-qi38)
垢版 |
2018/02/17(土) 16:50:38.35ID:Q4Uv6cZz0
>>162
弁護士の唐沢です
しっかり「char* const」と「const char*」の違いを認識しなさい
const char*は参照先の定数を変更しない事を保証する宣言であり、char*は参照先の定数を変更できる為、const char*で保持するアドレスをchar*にコピーする事は言語仕様により禁止されています。それは分かるよね?
最初に宣言したポインタを間違えて別アドレスで上書きしないようにconstで固定したいのなら、char* constを使うようにしましょう。とりあえずとりいそぎ
0173デフォルトの名無しさん (ワッチョイ 1f7e-T3WU)
垢版 |
2018/02/17(土) 17:34:22.09ID:4SqFrjwY0
>>167
データは連続しているので同じになる
16文字まではスタックを使い、それ以上の長さになるとヒープにコピーされる
実装ではメンバの配列には何かしらのエスケープ文字が入る
ちなみにmsvcでは実装の都合上free(&str[0])で強引に解放できる
0174173 (ワッチョイ 1f7e-T3WU)
垢版 |
2018/02/17(土) 17:49:08.26ID:4SqFrjwY0
補足
スタックとヒープを使い分けるかどうかは実装依存
gcc、clang、msvcでは行われている
したがって短い文字列でnewを避けるためにstringを使わないというのは意味が無い
0175デフォルトの名無しさん
垢版 |
2018/02/17(土) 18:06:03.81
>>171
strdupで確保した領域をfreeでなくdeleteするのは正しいの?
0183デフォルトの名無しさん
垢版 |
2018/02/17(土) 18:59:50.35
>>182
strdup という答えが出てるのに何言ってるの?
0185デフォルトの名無しさん (ワッチョイ 9fbd-RFe/)
垢版 |
2018/02/17(土) 19:07:20.59ID:u7LZaTzx0
>>166
接頭辞を見ればデータ内容の属性がワカルというメリットは他に代え難い
ttp://local.joelonsoftware.com/wiki/間違ったコードは間違って見えるようにする

あといちいちthis->xと書くよりも、すすんでm_xと書きましょう
0188167 (ワッチョイ d793-MfWd)
垢版 |
2018/02/17(土) 19:53:11.68ID:szUqPRvW0
>>173-174 教えてくれてありがとう。
返されるアドレスは等しい値なのか、という単純な質問だったんだけど、
読み直してみたら分かりにくい質問文だと思っていた次第。

それにしても &(*psz)[0] って結構ややこしいのね。
オーバーロードされた[]演算子が返すcharへの参照、
に対してアドレス演算子&を作用させた結果、て感じかな。
0189162 (ワイモマー MMbf-xgEu)
垢版 |
2018/02/17(土) 20:37:30.76ID:uaRb1j8RM
すみません、たくさんレスありがとうございます。
_strdupにしてみたら期待の動作ができました。
ありがとうございました。
0190162 (ワイモマー MMbf-xgEu)
垢版 |
2018/02/17(土) 21:27:34.68ID:uaRb1j8RM
また質問してすみません。
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;
}
0193 ◆QZaw55cn4c (ワッチョイ 9f60-qi38)
垢版 |
2018/02/17(土) 22:35:58.53ID:I0BNlfaX0
>>165
独習C++ はいいですね、特に演習問題「std::stringを再実装する」を絶賛します
これが書けるようになったらC++初級者をかたってもいいかもしれない、もしかすると解答は載ってなかったかもしれないけれども
0195 ◆QZaw55cn4c (ワッチョイ 9f60-qi38)
垢版 |
2018/02/17(土) 22:43:42.94ID:I0BNlfaX0
>>194
(システム)ハンガリアンってそんなに悪いものなんですかねえ
いや、win32api がバンバンハンガリアンしているので、そんなもんか、と思っていましたが
0201 ◆QZaw55cn4c (ワッチョイ 9f60-qi38)
垢版 |
2018/02/17(土) 23:08:35.57ID:I0BNlfaX0
>>191
それは「ポインタ変数の参照」で、たしか便利に使えた気がしますが…
明日にでもちょっと書いてみます、今日は疲れました…
0204デフォルトの名無しさん (ワッチョイ 9fbd-RFe/)
垢版 |
2018/02/17(土) 23:38:55.74ID:u7LZaTzx0
データの属性としてサイズとか型そのものを明示したいときはシステムハンガリアンするしかないし、
よってWIN32APIがシステムハンガリアンを使って定義されるのは全く正しい

問題なのはアプリケーションハンガリアンすべきときと
システムハンガリアンすべきときが区別できない香具師が適当に使うと
被害甚大だということやがな…
0205デフォルトの名無しさん (ワッチョイ d77f-T3WU)
垢版 |
2018/02/17(土) 23:41:05.97ID:YmD9lILj0
今時システムハンガリアンは無いだろ
20年前で時間が止まってるのかよ
0207デフォルトの名無しさん (ワッチョイ d77f-T3WU)
垢版 |
2018/02/17(土) 23:49:32.45ID:YmD9lILj0
ググればいいだろ

積極的批判

システムハンガリアンを使っているソースコードを修正してデータ型を変更した際、同時に変数名も変更するコストがかかる。変更を怠ると、たちまち不整合となり、保守の障害となるだけで一利もない。
C++やC#のような言語では型付けが存在するためにシステムハンガリアンを使用することによる利点はない[3]。
移植性を阻害する。
総称型、メタプログラミングとの相性が悪い。

消極的批判

いわゆる良書と呼ばれるようなC++本で、現在[いつ?]システムハンガリアンを採用している例が皆無。
かつてWindows API/MFCにおいてハンガリアンを全面的に採用していたMicrosoft自身が、.NET Frameworkではハンガリアンを禁止[1]している。
0210はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-T3WU)
垢版 |
2018/02/18(日) 00:10:56.39ID:OOIPfNvY0
>>190
デリータはポインタが指す先のリソースを後始末するのが仕事であって、
ポインタが無効になるという処理は unique_ptr の側でやってくれるので、
ヌルを代入する必要はない。
むしろ unique_ptr 内で管理しているものをデリータが勝手に弄るのは好ましくないので、
参照で受けるのはやめてさしあげろ。

私なりに仕様を読んでこの場合をエラーにする根拠は発見できなかったが、
エラーになってくれる方がありがたい場面だと思う。
0212はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-T3WU)
垢版 |
2018/02/18(日) 00:25:54.07ID:OOIPfNvY0
N3337 だと 516 ページの説明がデリータの要件だと思うんだけど、
デリータ d の型が D で ptr の型が unique_ptr<T, D>::pointer のとき式 d(ptr) が valid であることと書いてあって、
ptr が rvalue か lvalue かってのは特に指定がない。 (どこかに書いてあったりする?)
この説明で言ってる ptr が変数名なのだとしたら暗に lvalue とほのめかしてるようにも思えなくもないし、よくわからん。
わからんことは避けて通りたい。
0214デフォルトの名無しさん (ブーイモ MM3b-zxnT)
垢版 |
2018/02/18(日) 00:35:36.09ID:ju8BsRCFM
>>206
ABIにシステムハンガリアン関係ないだろ…
APIを指してるとして、呼び出し側はリファレンスマニュアルなりIDE機能なりを利用して引数の型情報も
システムハンガリアンが付いている仮引数名と同時に参照しているはずだよね?情報重複してるけど本当に必要?
仮引数名のシステムハンガリアンの有無に関わらず、APIのシグネチャは用意に変更してはならないものだけど、
そもそも仮引数名はシグネチャじゃないからシステムハンガリアンがついていたって何の保証にもならないよ?
0215はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-T3WU)
垢版 |
2018/02/18(日) 00:51:32.90ID:OOIPfNvY0
重複する情報をコンパイラの支援なく一致させ続けることが出来るだろうか。 いや、できない。
って話よね。
まあ世の中にはそういうのを検査するツールとかもあるんだろうけどさぁ、
そういうツールを導入できる環境ならまともな IDE だって使えるだろう。
0216162 (マクド FF6b-xgEu)
垢版 |
2018/02/18(日) 08:06:35.40ID:F3zIry6ZF
>>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
}
0217デフォルトの名無しさん (ワッチョイ 9fbd-RFe/)
垢版 |
2018/02/18(日) 12:41:44.81ID:OWXn9djh0
>>207
藻前はレスをきちんと読んでいないのではないか
>システムハンガリアンを使っているソースコードを修正してデータ型を変更した際、同時に変数名も変更するコストがかかる。(>>207
に直接対応する元レス>>206は、
>データの属性としてサイズとか型そのものを明示したいとき(>>204
について述べているのでデータ型変更時のコストを言い立てても批判にならない

消極的批判については、アプリケーションハンガリアンすべきときと システムハンガリアンすべきときが
区別できない香具師の的外れな批判がクソウゼーからそうなったのかもしれん、
(ちな両者を区別できない香具師への警戒も>>204で言及済み
0218デフォルトの名無しさん (ワッチョイ 9fbd-RFe/)
垢版 |
2018/02/18(日) 12:42:38.82ID:OWXn9djh0
>>214
十分賢いIDEが人間のミスを完璧に排除してくれるんならそうかもしれんが
システムハンガリアンをしてはいけないという積極的理由にはやはりならないのであった
それとも「間違ったコードは間違って見えるようにする 」(>>185)の効能を全否定する?

APIの定義は変わらなくとも、それを利用するソースコードがころころ変わり得るわけで、
byStrLength
にある日だれかがDWORD型の値を突っ込んだとしたら…

こういうケースを考えたら、「接頭辞を見ればデータ内容の属性がワカルというメリット(>>185)」は
ありえないぐらい賢いIDEでも使わないと他に代え難いと思うがどうか、

>>198
>嫌いだからハンガリアン意地でも使わなかった
おk ようやく建設的な議論に着手できる、
0220デフォルトの名無しさん (ワッチョイ d7b3-hxII)
垢版 |
2018/02/18(日) 13:02:14.72ID:hSV7DJYb0
マウスオーバーで変数の型を確認できたり、縮小変換に警告を出してくれたりする程度のありふれた機能が、ありえないぐらい賢いとな
お前さんはメモ帳でコーディングしてるのか
0222デフォルトの名無しさん (スッップ Sdbf-0Jtz)
垢版 |
2018/02/18(日) 13:20:53.92ID:y51LwXumd
システムハンガリアンでミスを減らせるなんて事はない
むしろ害悪
0226デフォルトの名無しさん (ブーイモ MM3b-zxnT)
垢版 |
2018/02/18(日) 13:41:43.01ID:IMbK2zhKM
>>218
間違ったコードは間違ったように見えるようにする、について、
あなたが指し示した引用元が言及してるのはアプリケーションハンガリアンについてなんだけど…
システムハンガリアンについては否定的意見。
ちゃんと読んだの?
0228デフォルトの名無しさん (ブーイモ MM3b-zxnT)
垢版 |
2018/02/18(日) 14:15:44.65ID:IMbK2zhKM
>>218
APIの仮引数にシステムハンガリアンをつけたことで、間違ったAPI呼び出しが間違ったように見えるのはいつ?
APIのリファレンスなり宣言文なりを自分のコードと見比べたときでしょ?その時必ず型情報も見てるよね?情報重複してるよ?
あとIDEが自動でミスを排除してくれるなんて書いてないよ?ちゃんと読んで
0229デフォルトの名無しさん (ワッチョイ 1f7e-T3WU)
垢版 |
2018/02/18(日) 15:46:49.02ID:Tc3/Tap60
入れる変数の型と引数の型を確認しない奴とかいるのか
暗黙の型変換は警告を出せばいいし
どうしても見落とすのならコンパイルエラーにしてしまえばいい
あとメンバ変数もテキストの色を変えればいいからm_もいらない
0233デフォルトの名無しさん (ワッチョイ 9f12-pjg9)
垢版 |
2018/02/18(日) 21:14:42.68ID:SQcbDAgv0
ちげえんだよなぁ
thisというキーワードが存在してるから、その存在そのものが、それを書かねばならないような強制力を産み出してる
「存在するが、書かなくてもいい」っていうどっちつかずが、一番論争になる

その反対が「存在しないから書けない」だ
これだと単純明快だ
なんせ、書けない

「書くべきか書かざるべきか」のどーーーでもいい二択に迫られると、とたんに宗教になる
0239デフォルトの名無しさん (ワッチョイ d77f-T3WU)
垢版 |
2018/02/18(日) 22:00:36.01ID:tWqaO5mz0
m_xxx も xxx_ もなんの保証にもならんからな
this->は必ずメンバになるけど
0242デフォルトの名無しさん (ワッチョイ bf0e-qi38)
垢版 |
2018/02/18(日) 23:21:23.43ID:AjuHfv4B0
thisで明示した方が所在がハッキリして良いナリ
当職は名前空間もusingせずに明示しろ派ナリ
安易な省略はタイプ数を減らすという軽微なメリットと引き換えに可読性を落としケアレスミスを誘発するという恐ろしいデメリットを孕むナリ
0245デフォルトの名無しさん
垢版 |
2018/02/19(月) 00:18:14.94
C/C++なら必然的に末尾に付けるしかない
先頭に_付けるような情弱は死ねばいい
Perl/Pythonだと先頭に付けるけどな
0247デフォルトの名無しさん (ワッチョイ 1f7e-T3WU)
垢版 |
2018/02/19(月) 00:57:15.60ID:hDVR9PRD0
未定義なのは
_始まりでグローバルスコープにあるもの
_始まりでアルファベットの大文字が続くもの全て
__で始まるもの全て

1番目の_始まりなだけならローカル変数、引数、メンバでは予約されていないので使ってもよい
0250デフォルトの名無しさん (ワッチョイ 1f7e-T3WU)
垢版 |
2018/02/19(月) 02:05:55.66ID:hDVR9PRD0
コーディング規約はうろ覚えだけど自由度の高いBoostスタイルを薦める

publicな識別子はstdに合わせて小文字スネークケース
マクロはBOOST_から始める
インデントはスペース、一行の文字数は80文字を推奨
意味のある名前を付けることを推奨
ファイル構成に関するもの
その他細々としたもの
ライブラリごとのローカルルールがある場合もある

あとは自由
thisを付けろだとか改行の仕方だとかは一切書かれてない
0251デフォルトの名無しさん (ワッチョイ bf0e-qi38)
垢版 |
2018/02/19(月) 02:37:36.58ID:SEa8F8NC0
>>248-249
お互いにマナーを守る世界は過ごしやすいがマナーの厳守を要求し出すと途端に息苦しくなるナリ
自分にも他人にも読み易いコードを書こうという気遣いが見て取れるなら細かく突っ込んだりはしないナリ
0253デフォルトの名無しさん (アウアウアー Sa4f-rtnb)
垢版 |
2018/02/19(月) 12:45:29.69ID:yTAVcy/Ya
使うライブラリや開発環境の内部のスタイルに合わせるけどな。
派生クラスとかAPIのラッパークラスとか作り始めると、
どうしても内部の書き方に合わせておいた方が読みやすいし。

今でもWin32とかMFCでやることもあるけど、
そのときはm_とかpとかhとかdwとかバンバンつける。
0254はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-T3WU)
垢版 |
2018/02/19(月) 13:19:17.15ID:gMMBYzvP0
使う側の都合に合わせろよ。 ラップしてるのに中身のスタイルが漏れてるんじゃラップの甲斐がなくね?
中身を知ってる人がちょっとした便利のためだけに薄いラッパを作る場合ならそういう選択もあるだろうけど。
0255デフォルトの名無しさん (ワッチョイ 9f9d-MriG)
垢版 |
2018/02/19(月) 14:36:30.11ID:00nJVfHA0
コンバータにあわせろよ。C#で作ってコンバータかけた方が綺麗スッキリするんだから。
0258 ◆QZaw55cn4c (ワッチョイ 9f60-qi38)
垢版 |
2018/02/21(水) 00:43:21.00ID:jU0tYaxw0
Windows メインで作業されている方で、
valgrind を併用している方はおられませんか?
もしよろしければ使用感をお聞かせいただけませんか

operator new()/operator delete() 乗っ取りデバッグに限界を感じてしまっている状況です
(cl や bcc32/bcc32c/bcc64 では new/delete 乗っ取りができません)
いや、さっさと入れればいいのですが、仮想環境とかよくわからないし…Vine Linux 以来触ってないし…
0263260 (マクド FF6b-xgEu)
垢版 |
2018/02/21(水) 19:34:37.06ID:EmINyJBAF
すみません、BOOST_TTI_HAS_MEMBER_FUNCTIONを使って短くする以前に元々が間違っていました。
以下の3つでオーバーロードしたかったのでした。
・funcというメンバ関数を持つダブルポインタ
・funcというメンバ関数を持たないダブルポインタ
・それ以外

それで思ったのですが多分、Boost.TTIライブラリで
〇〇というメンバ関数を持つクラス、を識別するメタ関数は作れても
〇〇というメンバ関数を持つクラスのダブルポインタ、は無理な気がしてきました。
一旦諦めようと思います。
0267デフォルトの名無しさん (ワッチョイ c667-x4Or)
垢版 |
2018/02/22(木) 21:55:24.65ID:qwLRFwLN0
システムハンガリアン発祥の会社が何か作ったら否定論者がぎゃふんと言うのか?
おまえの頭の中は論点先取だか循環論法だかがグルグル回っているようだな
0271デフォルトの名無しさん (ワッチョイ ba12-SJjx)
垢版 |
2018/02/24(土) 10:44:07.22ID:mn7A8TMg0
一分間で間違いに気づいてはいるものの
そもそもの書く瞬間にはどうやら人智を用いても気付けないらしいから
IDEにエラー出してもらった方が早いんじゃあねえの

実は人間の集中力を超えたところにある方法論で、実践するとストレスが溜まるっぽいから、機械任せにした方がいい
それに、書いてる最中は変数の型まで考えたくない

見て分かることは、機械任せにすれば見なくても分かるから、
今のご時世、人間の有限の集中力を目視チェックなんかに使いたくない
脳みそのリソースはもっと別のところに使うべきだ

つまりは、書いてる最中は脳みそが「それが正しい」と思い込んでるから、
間違いは自分自身では絶対に分からない
これがバグを作り込む
hだったかdwだったかを脳が自動的に混同してるから、その分だけ余計に脳のリソースを使っている

「なんで書いている最中に自分自身で気付かないのか」、これ、とても重要だよ
0272デフォルトの名無しさん (スップ Sd02-2/+O)
垢版 |
2018/02/24(土) 11:11:20.01ID:51zBno3Kd
変数名と型が一致してるという保証がゼロだからシステムハンガリアンなんて無駄以外の何物でもない
無駄というか悪
0277デフォルトの名無しさん (ワッチョイ 520e-MTlB)
垢版 |
2018/02/24(土) 12:51:07.68ID:d7+fd25J0
>>272
そういう事言い出すと「関数名と機能が一致してる保証がゼロ」や「クラスメンバの隠蔽が完璧である保証がゼロ」などといくらでも難癖を付けれるナリ
ヒューマンエラーを理由に不要と結論付けるのならあらゆるコーディング規約が不要という結論になってしまう、これはいけない
命名規則は可読性の向上に結びつくものでなければならない、規約を違反する事で起きるトラブルはプログラマ側の責任、それは分かるよね?
0283デフォルトの名無しさん (ワッチョイ 2f93-IXLF)
垢版 |
2018/02/24(土) 17:03:03.20ID:agv5rOmv0
>>276 >>282
両者は共存不可能な対立概念ではないけどね。

細かいことを言わせてもらえば、
「ハンガリアンとポリッシュ」か「ハンガリーとポーランド」と
並べてくれた方が座りがいい気もするけど…。
「ハンガリアン記法とポーランド記法」だとあまり気にならない不思議。
0285デフォルトの名無しさん (ワッチョイ 70b3-Tnpk)
垢版 |
2018/02/25(日) 14:16:53.97ID:8l5JrV0a0
>>266
名前付き引数イディオムとenable_if<is_same<...>::value>が最強と言うことだな

※プログラマが、使用者が型を間違えないようにと気を使うのが正しいなら、間違えたらコンパイルエラーになるこれが最強だろ?
0286デフォルトの名無しさん (ワッチョイ ba12-SJjx)
垢版 |
2018/02/25(日) 14:35:24.31ID:zhzj1IkW0
>>277
ちげえんだよんぁ
可読性じゃねえんだよ

>>268を見てみろよ、
読む時じゃなくて書く時のヒューマンエラーだ
なんで入り込んだのか全く分からんようなミステイクだ
プログラミングが工業的生産の一種なら、その手のヒューマンエラーは無い方がいい

で、改めて>>268を見てみると、「可読性」があってプレフィクスの間違いに気付いてはいるものの、
そもそも書く段でなんで間違えたのか、それが全く分からない
他人はおろか本人すらも自覚できない謎の理由でプレフィクスを間違えてる(これがヒューマンエラーなんだけどな)

なんで、後だしジャンケンだと、「プレフィクスが最初から無ければ、間違いも発生しえなかった」、とも言える

もしかすると、書く時に間違える/読む時に間違える の比率を考えると、ハンガリアン記法は書く時に間違えやすいが読むときに間違いにくい……のトレードオフなだけかもしれん
要するに、可読性と生産性のトレードオフだけなんじゃあねえのか?
それに、読む時のヒューマンエラーと書く時のヒューマンエラーをわざと混同してるのはいただけない
0290デフォルトの名無しさん (ワッチョイ 8abd-2pQG)
垢版 |
2018/02/25(日) 19:14:43.19ID:4jIr3vvu0
>>288
func()が常に1画面に収まって1万行の関数とかでありえないという根拠は

>>289
テンプレート定義時の引数に対して引数内容固有の命名が難しいのは
ハンガリアンに限ったことではないからハンガリアンに対する批判になんね

テンプレート批判論者には考える力がないのかね…
0292デフォルトの名無しさん (ワッチョイ df7f-x4Or)
垢版 |
2018/02/25(日) 19:29:08.16ID:s+qaK1zS0
テンプレートに対してはハンガリアンは全くの無力だよなあ
一貫性の観点からやっぱりハンガリアンは無い方がいいわ
0294デフォルトの名無しさん (ワッチョイ 0637-rG1w)
垢版 |
2018/02/25(日) 20:11:05.52ID:fbPK05Px0
そもそも関数が長い場合は型情報を持たすのもありだよな
システムハンガリアンをやめさせようとして先に関数を短くしなきゃだめだなと追う結論に至って放置した
0300デフォルトの名無しさん
垢版 |
2018/02/25(日) 23:57:37.89
>>299
dwをiに置換するだけだからリファクタリングが楽っていう意味?
0307デフォルトの名無しさん (ワッチョイ 8a05-x4Or)
垢版 |
2018/02/26(月) 04:56:46.87ID:lxlU26hn0
>>298
おまえは間違いなく1万行と書いた
その史実を誤魔化すことはできない

「ありえないという根拠は」という問いを反論として用いるのは
俺が「ありえない」と言った(事実と違うが)ことが
おまえが「ありうる」と思っているのと違ったからだろう

いずれにせよ「アホかおまえは」にふさわしいハチャメチャだな
0309デフォルトの名無しさん
垢版 |
2018/02/26(月) 08:09:57.39
>>307
史実とか言っちゃうのって。。。
0315デフォルトの名無しさん (スップ Sdc4-aBV2)
垢版 |
2018/02/26(月) 11:21:30.74ID:mt/mMzV6d
間違えると大変だからハンガリアンを使ってはならないんだよ
偽の情報に頼るんではなくて元を逐一確かめないと
0317デフォルトの名無しさん (ワッチョイ 520e-MTlB)
垢版 |
2018/02/26(月) 11:36:50.47ID:TvC1o7QC0
>>315
不一致が存在しない事が保証されてれば問題無いんやな
そういう事ならつまり変数宣言とプレフィックスが全て一致してるかチェックするスクリプトとかがあれば満足って事でええんか?
0318デフォルトの名無しさん (アウアウカー Sa11-2orQ)
垢版 |
2018/02/26(月) 11:38:09.46ID:n/n1Eejna
>>316
ポインタも必要に応じて使うけど、メモリ管理の煩雑さとミスの危険性を避けるために参照やスマートポインタやコンテナ、イテレータなど他に適切な物がある時はなるべくそちらを使うのが流儀かな。
0319デフォルトの名無しさん (ワッチョイ 8a05-x4Or)
垢版 |
2018/02/26(月) 11:51:17.55ID:lxlU26hn0
>>316
デフォ・・・まあ、そう言えなくもないか
参照でもポインタでもどっちでもいい用途には参照
ポインタでしかできないことはNULLに++や絶対番地指定
参照でしかできないことは一時オブジェクトやコピコン類
0322デフォルトの名無しさん (ワッチョイ df7f-x4Or)
垢版 |
2018/02/26(月) 12:21:09.58ID:W3q5coR10
グーグル規約だと書き込む引数は参照ではなくポインタにしろってなってる
でも標準ライブラリが普通に参照で書き込んでるので意味ないかなと思う
0327デフォルトの名無しさん (アウーイモ MM3a-QuQl)
垢版 |
2018/02/26(月) 18:25:47.85ID:aHz4HBvIM
ローカルで宣言したunique_ptrを他のメソッドに渡してデータをつめたいばあいってどういう引数で渡せば良いの?
unique_ptr<Hoge> ptr(new Hoge);
hogehoge(ptr);

Hogehoge::hoge(const unique_ptr<Hoge>& ptr){
ptr->aaa = 123;
}

これでいける?
なんかウェブサイトみてると&&二つとかあったりするの見かけて混乱してきた
0332デフォルトの名無しさん (ワッチョイ 8610-QuQl)
垢版 |
2018/02/26(月) 21:01:42.73ID:k0ghrbBh0
所有権を渡すのってstd:move()だと思ってたんだけどconst &&でもいけるの??
0339デフォルトの名無しさん (ワッチョイ 8610-QuQl)
垢版 |
2018/02/28(水) 18:07:41.72ID:IZRayiSM0
右辺値参照とか難しいなー
最近ようやくC++11使えるようになったから全然いってることがわからん
0340片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd94-HaFh)
垢版 |
2018/02/28(水) 18:34:51.95ID:jmOf6Upnd
右辺値参照が使えなかった頃は、std::swapでスピード最適化していた。ポインタとメモリー確保を含む構造体は、
単純にスワップしたり、単純にバイト単位コピーしたりするのはまずいことがある。
そういうときに、std::swapを使う。右辺値参照は、それよりちょっと速くて賢いが、テンプレート型を理解してないと多分理解できないと思われる。
0344はちみつ餃子 ◆8X2XSCHEME (ワッチョイ e66f-x4Or)
垢版 |
2018/02/28(水) 19:18:07.29ID:7ezW7mFb0
実際のところヘッダファイルから 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 してるだけ。
0345片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd94-HaFh)
垢版 |
2018/02/28(水) 19:24:03.59ID:jmOf6Upnd
そのstd::remove_reference<T>::typeはTから左辺値参照や右辺値参照をはずした型になるね。それに&&を付けるんだから、左辺値参照が右辺値参照になる。
0347はちみつ餃子 ◆8X2XSCHEME (ワッチョイ e66f-x4Or)
垢版 |
2018/02/28(水) 19:35:33.38ID:7ezW7mFb0
C++17 では noexcept は型の一部という扱いに変更された。
例外を投げないなら投げないと書いておかないと他のライブラリとの組合せで型エラーになったりすることもあるかもしれんぞ。
0350デフォルトの名無しさん (ワッチョイ eff2-x4Or)
垢版 |
2018/02/28(水) 21:27:43.47ID:LDTKKB+20
江添ってあれか。ニートの時にやることないからたまたま目についたC++の仕様書を読み込んでたら
いつの間にかすごく強くなったという、ホリランみたいな。
0351デフォルトの名無しさん (ワッチョイ 1651-x4Or)
垢版 |
2018/02/28(水) 21:32:34.60ID:eOQjYTv40
おまえそれをバカにできるのか?
仕事ってそういうもんだぜ
目の前の案件のために必死こいても付け焼き刃にできることは知れてるんだよ
「ヒマ」なときに遠くを見て投機的にコツコツ努力したことが
あとで花咲くことがあるし咲かないこともある
賭に勝った者を、降りたやつがバカにできるのか? え、おい
0352デフォルトの名無しさん (ワッチョイ 8abd-2pQG)
垢版 |
2018/02/28(水) 22:02:12.40ID:debsNNov0
>>320
>>322
書き込むときポインタ渡しにするのは
C++には参照渡しがin/out/refのどの意味なのか表すシンタックスが現状無いから
というのが主要な動機だと思うが
inならconst T& aというのは比較的読み筋だが
T* pと書いただけだとoutなのかrefなのかやっぱりわからん…
0354デフォルトの名無しさん (ワッチョイ f680-IMbs)
垢版 |
2018/02/28(水) 22:38:47.40ID:ugxprRf80
&& は、Rust のmove の事。
所有権移転。移転元が空になる

基本的に数年は、ドワンゴ江添と共に、山ごもり!
江添が空海なら、漏れは最澄w

悟りを開くまで、空海・最澄の一問一答が、延々と続くw
0357デフォルトの名無しさん (ワッチョイ bfe7-s382)
垢版 |
2018/03/01(木) 07:05:17.46ID:/bb7E7Gp0
&&参照は「このオブジェクトもういらないからぶっ壊してもいいよ」というサイン
言うなれば肉屋へ行く馬車
野生のオブジェクトは誰に断る必要もないので勝手に連れてかれて解体される
家畜を渡す時は解体に同意するサイン(std::move())が必要
0358デフォルトの名無しさん (アウーイモ MM2b-wIew)
垢版 |
2018/03/01(木) 07:13:49.75ID:YKLxBKOvM
Fooクラスのunique_ptrがつまったvectorを作って、他クラスのメンバ変数にセットするときはどう渡すべき?
作った元ではもう使わないから所有権放棄していいとする

const参照渡しにして、渡された側でvectorの中身を全部std:move()して新しいvectorにつめるのが一番最初に思い浮かんだ
そんなことしなくても最近ここででてる、&&つけて渡してそのままセットすれば解決するのかな?
0360デフォルトの名無しさん (アウーイモ MM2b-wIew)
垢版 |
2018/03/01(木) 08:22:01.82ID:YKLxBKOvM
なるほどー
コードにするとこんな感じかな?

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;
}
0363デフォルトの名無しさん (アウーイモ MM2b-wIew)
垢版 |
2018/03/01(木) 10:38:08.68ID:YKLxBKOvM
ありがとう!勉強になりました
0365デフォルトの名無しさん (アウアウカー Sabb-5mf3)
垢版 |
2018/03/02(金) 07:10:33.20ID:GbvR6g/La
noexceptにtrue,falseがある理由については

#include <type_traits>

template<typename T>
void test(T t)noexcept(is_unsigned<T>){
//Tの型がunsignedの時だけは例外は投げない
}

こういう事が出来ると書いてあったけど、c++17以降も問題なく使えるだろうか?
0373デフォルトの名無しさん (マクド FFbb-x7J7)
垢版 |
2018/03/02(金) 22:27:40.22ID:3pZ6Fb9JF
visualstudio2017 でスタックトレースがしたいのですができません。
最初はBoost.StackTraceで試みたのですがMSVCでは行数やファイル名の出力が非対応で
アドレスまでしか取れませんでした。

次にWinAPIを使って解決させようとしたのですがこれもうまく行きません。
SymGetSymFromAddrを使うとどうやってもエラー126が帰ってきてしまいます。

以下のプログラムがVisualstudio2017で動作している人はいないでしょうか?
ttps://github.com/shive/blogpost/blob/master/20130918-stacktrace/main.cpp
0374デフォルトの名無しさん (ワッチョイ 7f95-A/Ur)
垢版 |
2018/03/02(金) 23:27:18.83ID:KYEHMUiK0
スタートレックと空目した
0375デフォルトの名無しさん (ワッチョイ 5f7e-m1UI)
垢版 |
2018/03/02(金) 23:40:43.96ID:vziGgrtU0
>>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 ----
0377373 (ワイモマー MMff-cxM0)
垢版 |
2018/03/03(土) 01:05:16.48ID:7bxI8Ps/M
>>375
プロジェクトの設定はdbghelp.libを追加しただけでしょうか?
あとWindows10ですか?7ですか?

>>376
自分もそれを読んでx86とx64両方試したのですがダメでした、、、
0379373 (マクド FFbb-x7J7)
垢版 |
2018/03/03(土) 07:43:32.07ID:MjEj/kk+F
>>378
自分はWindows7&VisualStudio2017なのですが
dbghelp.lib、dgbhelp.hを探すと以下の場所にあるのでWin10でしか対応していないのかなと…

C:\Program Files (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関数で呼べばいけるのかも
0380373 (マクド FFbb-x7J7)
垢版 |
2018/03/03(土) 08:51:25.52ID:MjEj/kk+F
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をインストールするかしかないのかもしれません;;
0381デフォルトの名無しさん (ワッチョイ 8723-WWZl)
垢版 |
2018/03/03(土) 09:17:35.93ID:iGrPHQq30
>>380
Visual Studio 2017 スレの919あたりから話題になっているけど、
VS2017 の Windows 旧バージョンサポートはおかしいみたい。
2015と同じツールセット、SDKを用いても動作が違う。

2015をインストールするのがいい気がする。

参考
Visual Studio 2017 Part4 ・
http://mevius.5ch.net/test/read.cgi/tech/1509244956/

https://www.visualstudio.com/ja/vs/older-downloads/
0386デフォルトの名無しさん
垢版 |
2018/03/03(土) 12:49:02.99
sizeofが小数を返しちゃいけないって誰が決めたの?🙄
0387はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-m1UI)
垢版 |
2018/03/03(土) 13:15:05.21ID:uc6Z/AdW0
>>386
仕様。
C99 だと 7.17 に size_t は sizeof 演算子の結果の符号無し整数型って書いてある。
C++11 だと 5.3.3 に sizeof 演算子の返却値の型は size_t って書いてあって、
18.2 に size_t は符号無し整数型って書いてある。
0389はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-m1UI)
垢版 |
2018/03/03(土) 13:43:14.93ID:uc6Z/AdW0
どうせ汎整数昇格で int になることばかりなので、
アドレス単位以下の小さなオブジェクトにする意味なんてないよ。
大きな配列で扱いたいときは std::bitset が有るし。
0390デフォルトの名無しさん
垢版 |
2018/03/03(土) 14:56:24.32
>>387
ありがとう🤣
0393デフォルトの名無しさん (ワッチョイ df8f-obH6)
垢版 |
2018/03/03(土) 18:28:41.77ID:OIzMcqKj0
この板に書いてあることがほとんどわかっていないようなクソ素人ですみませんがちょっとお聞きしたいことがあります。
Windows 7でOpenCVをTDM-GCCにて動かしたいと思っているのですが、どなたかこの設定で動かされている方など居られますでしょうか?
もしくは素直にVisualStudioなど使ったほうが良いのでしょうか?
昨日からあれこれ試しているのですがまったく動かないです。
0394片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sdff-dixK)
垢版 |
2018/03/03(土) 19:01:36.20ID:ZgUZF4A1d
>>393
俺ならパッケージマネージャがあるMSYS2+MinGW使うよ。
パッケージマネージャがないTDM-GCCなら、まず、OpenCVをビルドして、リンクできるようにしないといけない。
まあ、めんどうくさい訳で。
0396デフォルトの名無しさん (ワッチョイ df8f-obH6)
垢版 |
2018/03/03(土) 20:12:29.49ID:OIzMcqKj0
片山様
レスありがとうございます。
そうですね、VSは重いという理由で避けていましたがやはりまずはちゃんと王道からやっていこうと思います。
慣れたらソースからビルドもしてみたいですが、まずはOpenCVであれこれしたいのでやりやすい環境で頑張りたいと思います。
ありがとうございました。
0399デフォルトの名無しさん (ワッチョイ 8723-WWZl)
垢版 |
2018/03/03(土) 21:37:46.21ID:iGrPHQq30
主に使ってるライブラリ/フレームワークに合わせれば?

何でもいいなら multibyte で utf-8 一択だろう
ucs2 (16bit) にしても ucs4 (32bit) にしてもどうせ
合字とかで1コードポイント1文字にならないから意味ないし
コンテナは string でも何でも好きなものを
0401デフォルトの名無しさん (ワッチョイ 5f7e-m1UI)
垢版 |
2018/03/03(土) 21:55:03.34ID:e0EB+SLu0
>>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>とか使ってもいい
0408デフォルトの名無しさん (ワッチョイ 4781-atej)
垢版 |
2018/03/03(土) 23:43:29.67ID:q1dNIabI0
utf8に統一したら、ロケールの切替って表示する文字列の言語を決める位の意味しか無いのではないかな
異なる言語の文字列でもそのまま字化けせずに表示出来た方が都合が良いように思うけど
0409はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-m1UI)
垢版 |
2018/03/04(日) 00:38:00.37ID:R9gQD4Ga0
Windows はもう 20 年以上前から Unicode 化はやってるんだってば。
UNICODE 版の API を正しく使う限り文字化けしない。
フォントの設定とかで化けることはあるかもしれんけど、
それも今はフォントリンクとかでおおよそ上手いこと処理してまうしな。

UNICODE 化できていない今までに作られたカスなアプリが消し去れないし、
カスなアプリのために ANSI 版の API (の挙動を制御するためのコードページの切替えの仕組み)
は残しておかなきゃならないけど、
Unicode への統一そのものは出来てるから満足するしかない。
っていう話ね。
0414デフォルトの名無しさん (ワッチョイ dfbd-lEE9)
垢版 |
2018/03/04(日) 01:15:23.20ID:BtVPmkEs0
だいたいwchar_tとかcharの倍容量を食うじゃん?
2が3になるとかならまだしも1が2になるというのは精神的にインパクトがデカイ
L"Hello World!"のバイナリをダンプしてみたらトラウマを抱え込むレヴェル
というのもあるし他環境とのソースコード共通化も視野に入れる場合やっぱマルチバイトしか…
0417デフォルトの名無しさん (ワッチョイ 8723-WWZl)
垢版 |
2018/03/04(日) 02:20:02.75ID:8pLLmBBd0
>>416
iOS / macOS / Windows / Java と多くのプラットフォームの
API で文字列としてUTF-16 が使われてるから割と使うけど、

近年多用される絵文字とかが全然1文字1符号にならんので
ロジックを基準する上ではUTF-8より便利ってわけでもない。
文字列の処理を描くときは合字以外は1文字1符号になるUCS4 の方が良い。
0423はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-m1UI)
垢版 |
2018/03/04(日) 03:02:39.39ID:R9gQD4Ga0
>>417
どうせイテレータでアクセスするから、合字はどうしようもないにしても
先頭からコードポイント単位で読む分にはどの符号化を使っててもあんまり変わらん気がするが。
0424デフォルトの名無しさん (ワッチョイ 8723-WWZl)
垢版 |
2018/03/04(日) 03:56:38.94ID:8pLLmBBd0
>>423
UTF-16 だとサロゲートペアが出てくるからマルチバイトがマルチワードになるだけ
ucs4 だとそれが要らなくて符合とコードポイントが1:1対応になるんだよ。

何年か前まではサロゲートペア?なにそれおいしいの?でも済んでたけど
今の時代それは無理だし
0425デフォルトの名無しさん (ワッチョイ 8723-WWZl)
垢版 |
2018/03/04(日) 04:09:09.92ID:8pLLmBBd0
要は
utf-8、utf-16 → 1符合 ≠ 1コードポイント ≠ 1文字
ucs4 → 1符合 = 1コードポイント ≠ 1文字
だから完全自作の文字列処理ではucs4が楽だよという意見でした
テキストなんてたいしてメモリ食わないしね
おしまい
0432デフォルトの名無しさん (マクド FFbb-x7J7)
垢版 |
2018/03/04(日) 14:09:11.62ID:GeBypOU0F
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のテスト アダプター」はデフォルトでインストールされるようになっていたので
インストールされています。
0433デフォルトの名無しさん (ワッチョイ a7b3-m1UI)
垢版 |
2018/03/06(火) 00:41:37.37ID:MSLc23us0
標準ライブラリを前方宣言にすることに意味ってありますか?
0434デフォルトの名無しさん (ワッチョイ 677f-m1UI)
垢版 |
2018/03/06(火) 00:45:13.63ID:jqoml9jL0
メイヤーズは普通にインクルードしろって言ってた
0438デフォルトの名無しさん (ワッチョイ bfe7-s382)
垢版 |
2018/03/06(火) 07:39:27.47ID:YXZKPZh60
・どっかでメモリの取り扱い間違えてnewの管理情報を踏んづけて壊してる
・unique_ptrやshared_ptr、その他スマートポインタ的なものに理解せずに渡してる
多分このどっちか
0440デフォルトの名無しさん (ワッチョイ e75b-m1UI)
垢版 |
2018/03/06(火) 11:04:41.26ID:PuW1uuBL0
>>436
「解放されてて」というのは、どうやって確認した?
たとえば要素のデストラクタが実行されているとか、
別件で確保するメモリに再使用されているとか、
そういうことが起きているのか?
0443デフォルトの名無しさん (ワッチョイ 7fcc-wl/W)
垢版 |
2018/03/06(火) 15:12:07.82ID:p6GeX8860
ファイル分割をしてみたく、プログラムをヘッダファイルとcppファイルに分割しようと挑戦したのですがよくわからないエラーが出まくります・・
プログラム超初心者なので凄い初歩的な部分を間違えているかもしれません・・・

エラーですが、ヘッダファイルの方で
'vector':'std'のメンバーではありません
'vector':定義されていない識別子です
'string':定義されていない識別子です
'cv': 識別子がクラス名でも名前空間名でもありません。
'Mat':定義されていない識別子です
'ofstream':'std'のメンバーではありません
'ofstream':定義されていない識別子です

みたいなエラーが出ます。
ヘッダファイルは、二重インクルードガードと関数のプロトタイプ宣言しかしていないのですが
上のようにそ、のプロトタイプ宣言の型とかに対してのエラーが出まくります


何かヘッダファイルに付けたほうがいいのでしょうか?
分かる方がいたら、教えていただけますでしょうか。

ちなみに、visual studio で作業していて、プロジェクトはコンソールアプリケーションで作っています。
もしかして、自分でmakefileとかを作る必要があるのでしょうか?
0445デフォルトの名無しさん (ワッチョイ 7fcc-1LYG)
垢版 |
2018/03/06(火) 15:40:05.75ID:p6GeX8860
よく見たら、自分の参考にしていたページでヘッダファイルのincludeは最小限に抑えると書いていました…
てっきり、ヘッダファイルではincludeはしないものなのかと…

最小限というのは、エラーが回避できるstdio.hとかの最小限のファイルだけヘッダでincludeして、他のmath.hなどはcppファイルでincludeすればいい感じですか?
0446片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sdff-dixK)
垢版 |
2018/03/06(火) 15:50:38.20ID:W0MQjqG0d
最小限というのは、コンパイル時間、ビルド時間を短縮するためだから、小さなプログラムでは気にする必要はない。
cppとhppで#includeを分けるというのはよくあることだ。
0448デフォルトの名無しさん (ワッチョイ 6793-fJrP)
垢版 |
2018/03/06(火) 16:16:08.19ID:r6wtBatS0
>>443 の書きぶりからして
自作のヘッダファイルに std::vector を使った関数のプロトタイプがある、
しかしヘッダファイルの先頭では <vector> を#includeしてない、て感じね。
これは >>444 と同じ話。

あと >>445 で <stdio.h> と書いてるところを見ると
参考にしてるページは少々古い情報かも。
「あえて<cstdio>でなく<stdio.h>をインクルードする」ことについて
何か理由があるのかも知れないけど。
0449デフォルトの名無しさん
垢版 |
2018/03/06(火) 17:54:41.92
Cソースのincludeの位置にヘッダファイルの中身を貼り付けたときにコンパイルできなきゃだめ
たぶんCソースの中で他のincludeよりも前に新しいヘッダファイルのincludeを書いてるんだろう
0452デフォルトの名無しさん (アウアウウー Sa2b-wl/W)
垢版 |
2018/03/06(火) 23:34:50.60ID:pZOZvbRza
C++のリファレンスとかで[first,last)というふうに左右で括弧が違う表記があるんだけど、これはIteratorに関しての表記ですか?
0456デフォルトの名無しさん (アウアウウー Sa2b-wl/W)
垢版 |
2018/03/06(火) 23:50:38.84ID:pZOZvbRza
>>453,454 数学でしたか!勉強になります。
0457デフォルトの名無しさん (ワッチョイ 2723-SQy9)
垢版 |
2018/03/07(水) 00:29:35.52ID:+JS1hm360
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>がスコープから外れアンロック

というシーケンスを期待しています。
0459デフォルトの名無しさん (アウアウウー Sa2b-m1UI)
垢版 |
2018/03/07(水) 10:09:55.97ID:ukyKg6LAa
基本的な質問なのですが、以下のプログラムがエラーになるのはなぜでしょうか?


char* pc = "abc";
pc[0] = 'z';
cout << pc << endl;

以下のプログラムでは意図通りに動きます。

char ac[] = { 'a', 'b', 'c', '\0' };
cout << ac << endl;
ac[0] = 'z';
cout << ac << endl;
0460はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-m1UI)
垢版 |
2018/03/07(水) 10:14:51.80ID:TWOfgg7C0
>>459
上は変数 pc はリテラル文字列の先頭を指すポインタ。
下の変数 ac は配列で、それを文字列 "abc" で初期化するって意味。

リテラルの破壊は未定義。
破壊しないことをあてにして破壊不可能なセクション (メモリ領域) に配置されたりすることもあるので、アクセスエラーが生じる。
あくまで未定義だから出来ちゃうこともあるし、コンパイラオプションで制御できたりもするけど、基本的にはあかんやつ。
0463デフォルトの名無しさん (アウアウウー Sa2b-m1UI)
垢版 |
2018/03/07(水) 11:10:02.03ID:ukyKg6LAa
すみません、また、ベーシックな質問です。

char* pc1 = 1; → エラー
char* pc2 = NULL; → OK
char* pc3 = 0; → OK

なぜ、2番目と3番目はOKなのでしょうか?

char* pc1 = 1;

がエラーになるのは、 int 型の値で char* 型の変数を初期化できないからだとすれば、

char* pc3 = 0;

もエラーになると考えることもできると思います。
0464はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-m1UI)
垢版 |
2018/03/07(水) 11:10:26.68ID:TWOfgg7C0
>>462
Python なんか知らんがな。
Python の immutable は Python の immutable であって、それが C++ の何物かであったりはしないよ。
C++ のリテラルを破壊した結果は未定義というのは C++ のリテラルを破壊した結果は未定義という規則であるだけ。
似て感じられたとしても一対一に対応付くような単純なものではないので、
背景にあるメカニズムを理解せずに翻訳して理解しようとするような方法はお勧めできない。
0466はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-m1UI)
垢版 |
2018/03/07(水) 11:22:08.82ID:TWOfgg7C0
>>465
書き忘れてたけど、 C++ の文字列リテラルの型は const char[] なので、
const 付きでないポインタに渡すと単純に型が合わなくてエラーになるはず。
C だと型に const が付いてないのに破壊するのは未定義ってことになっててあまりにもクソだったから改められた。
0467はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-m1UI)
垢版 |
2018/03/07(水) 11:32:07.41ID:TWOfgg7C0
>>463
0 はポインタに型変換可能で、型変換した結果が空ポインタと等しいことが保証されてる特別な存在。
(ビットパターンが等しいとは限らないことには注意が必要。)

互換であることが保証されているので、処理系によっては
#define NULL 0
として定義していることもある。

余談だが、これはオーバーロードされた関数でうっかりしやすいので気を付けた方がいい。
たとえば関数 foo が以下のような型でオーバーロードされている場合、

void foo(int);
void foo(int*);

これを

foo(NULL)

と呼び出すと void foo(int) が呼び出されたりする。
今ではヌルポインタを表すキーワード nullptr が用意されたので、
NULL はあまり使わない方が良い。
0472デフォルトの名無しさん (ワッチョイ e75b-m1UI)
垢版 |
2018/03/07(水) 16:29:51.37ID:ylRgY7un0
違う

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以後ではこう書く
0473デフォルトの名無しさん
垢版 |
2018/03/07(水) 17:54:06.02
>>472
それもだめじゃね?
const領域に非constでアクセスするなんて罪深いことなんだから、ちゃんと別領域にコピーしてから扱わないと。
0474デフォルトの名無しさん (ワッチョイ df80-zeCZ)
垢版 |
2018/03/07(水) 18:18:25.20ID:TnxtYBSc0
>>459
>char* pc = "abc";
文字列リテラルは不変だから、const を付けないといけない

古いライブラリで、const を付けていないものを動作させるために(互換性)、
例外的に使う場合だけに許される

>>463
>char* pc3 = 0; → OK
この0 は、数値型の0じゃない。
予約語を増やすのが嫌だから、= 0 と書いたら、特別な意味に解釈する。
分かりにくい、クソ仕様

virtual func( ) = 0;
これも、そう。
純粋仮想関数という特別な意味を表す
0477デフォルトの名無しさん (スップ Sdff-WWZl)
垢版 |
2018/03/07(水) 22:07:54.67ID:eXkgxxlqd
純粋仮想関数と関連付けてはいないだろう
それはともかくとして

char * p = 7-7; // no error

class T {
virtual void f() = 7-7; // error
};

となる気がするので言ってることは合ってるか
0490デフォルトの名無しさん (ワッチョイ 2a8f-HFNi)
垢版 |
2018/03/08(木) 18:35:02.35ID:uuOHCrug0
C++の勉強+機械学習も勉強しようとVisual Studio 2017でtiny-dnnを用いたいのですが、tiny-dnn内でコンパイルエラーが発生します。
具体的にはxcontainer.hpp内でC3203というエラーが頻発したり、feedfoward_layer.hppではC2760というエラーが発生したりしています。

環境はWindows 7でVisual Studio 2017 communityです。
プロジェクトはwindowsデスクトップアプリケーションを用いています。
tiny-dnnのインクルードはプロパティのインクルードディレクトリに追加しています。

どなたか心当たりのある方がいらっしゃれば教えていただけると嬉しいです。
0491デフォルトの名無しさん (スプッッ Sd2a-dsCQ)
垢版 |
2018/03/08(木) 19:27:19.96ID:i2S5Knpdd
linux windows両対応のコードを考えている最中の質問です
unsigned int型の変数xの32bitに、char型の配列y[4]の8bit×4を当て込みたいです
y[0]から順にxの先頭ビットに入れたいのだけど
そういう時はどのようなコードになるのでしょうか
符号の問題で単純に24bitシフト+16bitシフト...みたいなことをすると期待の値にならないときが存在してます
0500はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 666f-uQtz)
垢版 |
2018/03/09(金) 13:35:32.12ID:nl8HCt1x0
>>498
その手があったか。
でも C++98 で自動で推論させようとするとヘルパー関数を使う必要があるじゃろ。
意味のないオブジェクト生成 (最適化で消えるかもしれんけど) がださい感じはするよね。
0502デフォルトの名無しさん
垢版 |
2018/03/09(金) 22:17:46.30
>>496
マクロ駆使すれば

TYPEDEF_FUNC_DECL(なんちゃら);
FUNC_DEF(かんちゃら)
{
return;
}

みたいな書き方できないのかな?

なんちゃらは識別名と戻り値と引数
かんちゃらは識別名を指定するイメージ
0503デフォルトの名無しさん (ワッチョイ 0b9f-uQtz)
垢版 |
2018/03/09(金) 23:46:50.00ID:yn7GHiyb0
>>491
unsigned int x;
char y[4];

.
.
.

memcpy(&x, y, 4);
0505デフォルトの名無しさん (スップ Sd2a-6rgV)
垢版 |
2018/03/10(土) 00:45:01.61ID:8ENKFfsbd
メモリ上でのレイアウトとかもあるのでuint8_t経由でのシフトがいい
クロックが(メモリアクセスが問題にならない程)低くてシフトが遅いマイクロプロセッサは別
0506デフォルトの名無しさん
垢版 |
2018/03/10(土) 04:49:25.72
>>503
x = ntohl(x);
も忘れずに
0508デフォルトの名無しさん (ワッチョイ 0b9f-RK0z)
垢版 |
2018/03/10(土) 17:21:32.19ID:a2p+alti0
>>506
それが必要になるかどうかは場合による。
0510デフォルトの名無しさん
垢版 |
2018/03/10(土) 19:22:25.29
>unsigned int型の変数xの32bitに、char型の配列y[4]の8bit×4を当て込みたいです
>y[0]から順に

っていう要件だから、ホストバイトオーダーがビッグエンディアンかリトルエンディアンか分からない以上は常にntohlを付けるべき
0511デフォルトの名無しさん
垢版 |
2018/03/10(土) 19:24:15.74
char y[4] = { 0x12, 0x34, 0x56, 0x78 };
unsignd in x = 0x12345678;
これを等価にしたいという意味だろうから。
0522デフォルトの名無しさん (ワッチョイ 0b9f-uQtz)
垢版 |
2018/03/11(日) 01:22:57.30ID:ry5KQfC80
unsigned int x;
char y[4];

.
.
.

x = ((y[0] & 0xff) << 24) | ((y[1] & 0xff) << 16) | ((y[2] & 0xff) << 8) | (y[3] & 0xff);
0523デフォルトの名無しさん (ワッチョイ 6a80-csLy)
垢版 |
2018/03/11(日) 01:34:50.04ID:P1lOCLpn0
Scott Meyers

Effective C++ 第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTI)、2014
Effective Modern C++ ―C++11/14プログラムを進化させる42項目、2015

Effective C++ は、昔の本のリバイバルかな?
内容が新しいかどうかまでは、分からないけど
0524デフォルトの名無しさん (スップ Sd2a-A/UC)
垢版 |
2018/03/11(日) 08:34:37.66ID:XWEx9Mlwd
テンプレートを使ったメタプログラムの有用性が分からん。コンパイル時処理で定数の階乗を計算してるけど実行時に値を変えれないなら、答えをベタ書きすればいいだけでは?
0527デフォルトの名無しさん (ワッチョイ da7e-uQtz)
垢版 |
2018/03/11(日) 09:03:15.99ID:6KlfnVLZ0
>>526
3ならいいけど10の階乗は?15の階乗は?21の階乗は?
それは整数型で表現できるか?
それは何桁になるのか?
適切な型をどうやって選ぶのか?
その値を静的な配列のサイズにしたいが数値を変えるたびに電卓で計算はしたくない
ならばfactorial<N>::valueと表現できれば便利ではないか
ということ
0528デフォルトの名無しさん (ワッチョイ fb7f-uQtz)
垢版 |
2018/03/11(日) 09:03:17.33ID:0BygLdlM0
その3という数値が別のファイルの特定の値に依存してる場合もあるし
0529デフォルトの名無しさん (ワッチョイ da7e-uQtz)
垢版 |
2018/03/11(日) 09:08:13.99ID:6KlfnVLZ0
意地悪するのはこの辺にしておいて
それはメタプログラミングでこいういうこともできるよ程度のものにすぎない
テンプレートメタプログラミングとはテンプレートを使ってソースコードを生成することだ
ソースコードを作るためのプログラミングだと思ってくれてかまわない
一般的な目的としてはジェネリックプログラミングを実現するために使われる
標準ライブラリではvectorからchoronoやtupleまでテンプレートメタプログラミングありきの設計になっている
0536デフォルトの名無しさん (ワッチョイ da7e-uQtz)
垢版 |
2018/03/11(日) 11:13:25.26ID:6KlfnVLZ0
>>535
現代の言語でジェネリクスをサポートするのは一般的
テンプレートをこねくり回して整数演算をするのはおかしいという意味なら、普通の構文で書けるconstexprが追加されたからそっちを使うように
0545デフォルトの名無しさん (ワッチョイ e6e7-frl3)
垢版 |
2018/03/11(日) 18:36:06.03ID:i1Cv6XBY0
はーい

constexpr unsigned long long unsafe_factorial(int n){
 unsigned long long r=1;
 for(int i=1;i<=n;++i){r*=i;}
 return r;
}

constexpr int min_factorialable(){
 for(int i=1;;++i){
  if(unsafe_factorial(i) > unsafe_factorial(i+1)){ return i; }
 }
}

constexpr unsigned long long factorial(int n){
 if (n < 0 || n > min_factorialable()) { return 0; }
 return unsafe_factorial(n);
}
0550デフォルトの名無しさん (ワッチョイ fb7f-uQtz)
垢版 |
2018/03/11(日) 21:19:50.46ID:0BygLdlM0
>>548
なんでそんなめんどくさくてミスしそうな方法をチョイスするんだよ
0551デフォルトの名無しさん
垢版 |
2018/03/12(月) 01:21:50.18
>>548
計算&書き換え手順をマニュアル化して、何十種類の仕向け別にバージョンアップの度に人海戦術で計算&書き換え&コードレビュー&テストするんですね、わかります
0552デフォルトの名無しさん (ワッチョイ fb93-ao9L)
垢版 |
2018/03/12(月) 05:00:24.40ID:kBVT8YZa0
min_factorialable() は、階乗を正しく計算できる最大の値を返す
constexprな関数(コンパイル時にint定数に置き換えられることを期待)、
と読み取ったんだけど、なぜにmin_なの?
0553デフォルトの名無しさん
垢版 |
2018/03/12(月) 05:41:37.75
上限を求めるときに使うのはminだから、かな

知らんけど
0555デフォルトの名無しさん (スッップ Sd8a-ted0)
垢版 |
2018/03/13(火) 09:59:46.06ID:CGjn2uNbd
一日の秒数を86400と書いてたらマジックナンバーやめろと言われたんだけど、
プログラムを少しでも書く人間にとってその数字は常識でいいよね?
60*60*24 と書いて「その60とか24は何だ?」と言われないでしょ?
それと同じレベルだと思ってるんだけど。
0557デフォルトの名無しさん (スプッッ Sd2a-ymMl)
垢版 |
2018/03/13(火) 10:13:40.69ID:bAh/W6qqd
>>555
言われないとわからない奴は言ってもわからないだろうから
お前は一生マジックナンバー使いまくりでいいぞ
0563デフォルトの名無しさん (ワッチョイ cb38-rkOG)
垢版 |
2018/03/13(火) 11:45:51.13ID:92t/zLSk0
2147483647なら俺の常識だが
0572デフォルトの名無しさん (ワッチョイ 260e-hn8E)
垢版 |
2018/03/13(火) 14:53:30.50ID:qHQADaBY0
というかマジックナンバー言われるのって数字の意味とか集団の常識とかじゃなく書式の問題だよね
計算式の中に定数ポン置きしてる書き方してる奴がチームにいたらそりゃマズいよ、変数とか定数に置き換えろって俺も言う
0574デフォルトの名無しさん (スップ Sd8a-6rgV)
垢版 |
2018/03/13(火) 15:34:48.40ID:VrugGyEjd
>>572
しかしこうはしないだろ?

const int int8_bits = 8;
uint16_t word = (hi << int8_bits) | lo;

こうもしない
const int sec_per_min = 60;
int sec = m * sec_per_min + s;

数値リテラルで書くのが許容される数値というものがある
sec = day * 86400 はどうかというのが>>561
個人的には知らない人でも暗算もせずに初見で合ってるかどうかわかるか、
を基本にすべきだと思う (小さな2の冪乗は除く。2の冪乗知らん奴はシネ)
0575デフォルトの名無しさん (ワッチョイ cb38-uQtz)
垢版 |
2018/03/13(火) 15:51:51.20ID:92t/zLSk0
uint16_t word = (hi << CHAR_BIT) | lo;
これCHAR_BIT != 8な環境を意識するんなら、16って書いてあるのも問題だね

const int micro_per_sec = 1000000;
int us = sec * micro_per_sec;
こう書けって言われたら俺はお断りする
0577デフォルトの名無しさん (スップ Sd8a-6rgV)
垢版 |
2018/03/13(火) 16:11:31.80ID:VrugGyEjd
>>575
bit_per_char や shortでもintでもなく int8、uint16_t と明記したのは所与の仕様のつもり。

最近のapiはよくナノ秒返してくるから1000000000 倍
1000.0*1000*1000と分かち書きしたくなる
0578デフォルトの名無しさん (ワッチョイ 6a8a-6CfZ)
垢版 |
2018/03/13(火) 16:29:39.63ID:cL/fN0Uj0
時刻を自動的に合わせますというコマンドボタンを作って
押すだけで済むのに
0580デフォルトの名無しさん (スッップ Sd8a-klMS)
垢版 |
2018/03/13(火) 18:34:24.26ID:5mSkIm9zd
86400って書くと、ideで定義の参照も使えんし
86400で検索したときに
1日の秒数なのか、適当に決めたタイムアウトとかの秒数なのか、ただのIDなのか、連番で出てきただけの数値なのかとか、無意味な数列なのかまざってわからんくなるやろ
0587デフォルトの名無しさん (ワッチョイ e6e7-frl3)
垢版 |
2018/03/13(火) 20:30:42.63ID:My0TInc10
21世紀も5分の1が過ぎようかっていうこの時代に
何が悲しゅうてたかが時刻を扱うだけでtime_pointの他にtmやらtime_tやらをガチャガチャさせられにゃならんのだよまったく
0589デフォルトの名無しさん
垢版 |
2018/03/13(火) 22:08:40.50
86400って何のために使うんだろう

うるう日とかうるう秒とか考慮しなきゃ気持ち悪くね?
0592デフォルトの名無しさん
垢版 |
2018/03/13(火) 22:28:43.21
>>591
1日に1秒満たないかもしれないだろ
0594デフォルトの名無しさん (スップ Sd8a-bl9z)
垢版 |
2018/03/13(火) 23:06:58.39ID:+Yto8Znfd
閏秒の有無等で可変のものなら可変のものなりの書き方するでしょ
計算して変数に入れるとか

問題は不変の数値定数をどう正規化して書くか、正規化する必要はあるか。
24*60*60 派の人と 60*60*24 派の人が両方プロジェクト内にいたらなんか嫌だな
0596デフォルトの名無しさん (スップ Sd8a-bl9z)
垢版 |
2018/03/13(火) 23:17:41.96ID:+Yto8Znfd
絡むわけじゃないけど
決めたら従うのは当たり前で、それが「決める」ってことだろ。
派閥の話じゃなく混ざってたら気持ち悪いってことが言いたかったんだよ。
0598デフォルトの名無しさん (ワッチョイ be81-uQtz)
垢版 |
2018/03/13(火) 23:44:10.62ID:U9FOV+VD0
気持ち悪いと思うかどうかは感性の問題だからなあ
例えばある日地球の回転速度が変わって1分が61秒になった
プログラムを修正しろと言われて、
場所によって書き方が違っていると大変だね
と言う話なら理解出来るけど
0604デフォルトの名無しさん (ワッチョイ da7e-uQtz)
垢版 |
2018/03/14(水) 08:42:21.15ID:eC4PF2tM0
閏秒を考慮するのと1日を86400秒とするのは全く関係ないのに閏秒がどうとか言い出した奴が悪いのでは
丁寧に書くなら計算の根拠として60*60*24を見えるところに書いておけばいい
0606デフォルトの名無しさん
垢版 |
2018/03/14(水) 10:28:48.31
>>604
全く関係ないは言い過ぎ
0608デフォルトの名無しさん (ワッチョイ 260e-hn8E)
垢版 |
2018/03/14(水) 11:03:01.46ID:2oR7xNCJ0
うるう秒がどうのこうのと言う、問題じゃなく86400秒をそこでしか使わないって根拠が無いんだよね
後でまたその数値が出てくるとしてその度に86400と書くのか、もしその数値を修正する事になったら全部書き直すのか、2回3回使うようになって始めて変数なり定数なりに入れるのか
それなら最初から式中に出てくる数値は変数に格納してから使えって統一した方が話が早い
0609デフォルトの名無しさん (スプッッ Sd2a-ymMl)
垢版 |
2018/03/14(水) 11:14:21.74ID:G0IAn/x5d
今時マジックナンバーとか昭和からタイムスリップしてきたのかよ
0610デフォルトの名無しさん (ワッチョイ 6a34-e70/)
垢版 |
2018/03/14(水) 11:43:33.36ID:xovkfTzX0
プログラムにおけるマジックナンバー(英: magic number、魔法の数字)とは、何らかの識別子もしくは定数として用いられる、プログラムのソースコード中に書かれた具体的な数値である。
そのプログラムを書いた時点では製作者は数値の意図を把握しているが、他のプログラマーまたは製作者本人がマジックナンバーの意図を忘れたときに閲覧すると「この数字の意味はわからないが、とにかくプログラムは正しく動く。
まるで魔法の数字だ」という皮肉を含む。
by Wikipedia
0617デフォルトの名無しさん (ワッチョイ 260e-hn8E)
垢版 |
2018/03/14(水) 14:16:09.81ID:2oR7xNCJ0
>>616
まぁ可読性高くて損する事は無いし、なるべく要素は分解して書いた方がいいんじゃないの
何かどうしても86400じゃなきゃ困る理由とかあるなら話は別だろうけど、無いだろ?
0622デフォルトの名無しさん (ワッチョイ fb7f-uQtz)
垢版 |
2018/03/14(水) 16:27:34.05ID:9D6+Eo6Z0
俺がわかるからみんなわかるだろうというコードはすげー困るな
例えその場の全員がわかったとしても今後わからない奴が出てきた時の事を考えて
できうるかぎりわかりやすいコードを書くべきだな
0623デフォルトの名無しさん (ワッチョイ cb74-uQtz)
垢版 |
2018/03/14(水) 17:02:40.84ID:L/3+Hz1H0
そのためのコストにもよる
空想論じみた「わかりやすさ」にまで付き合ってらんないこともある
特に最低限のプロとしてのスキルを欠く者を想定することはしない

ちょっと飛躍するがプログラム言語だってそうなっている
マシンの性能を使いやすさに振るということを無限にはやらない
どのくらいのアホまで付き合ってやるのか性能とのトレードオフで
色んなバランスで棲み分けになっている
0625デフォルトの名無しさん (ワッチョイ fb7f-uQtz)
垢版 |
2018/03/14(水) 17:11:14.36ID:9D6+Eo6Z0
86400を60*60*24と書くことにはなんのコストも支払ってないから書けばいいな
いちいち話を飛躍させる奴はなんなんだ
0629デフォルトの名無しさん (ワッチョイ fb7f-uQtz)
垢版 |
2018/03/14(水) 17:51:03.64ID:9D6+Eo6Z0
当然その程度のリファクタリングはするべきだしそもそもマジックナンバーをどうにかするべきだし
お前の残業代とかいう飛躍した話はどうでもいい
0634デフォルトの名無しさん (ワッチョイ 260e-hn8E)
垢版 |
2018/03/14(水) 18:48:33.76ID:2oR7xNCJ0
まぁコスト次第で可読性を犠牲にするケースもあるだろうけど
この場合はメモリ食う訳でも処理遅くなる訳でもソースの構造が変わる訳でもない
86400でも十分分かりやすいかも知れんが60*60*24なら更に分かりやすくなる

どっちが良いかなんて議論の余地無いよね
0636デフォルトの名無しさん (ドコグロ MM22-3fsH)
垢版 |
2018/03/14(水) 18:54:56.26ID:uMO7yRavM
>>626
> 16を2*2*2*2っていちいち書く人はいないでしょ
> まぁ1<<4って書けと言われるかもしれんが
状況次第だろ
場合分けの条件が4個あって各々2状態をとるとかなら2*2*2*2って書くかもしれない
下から4ビット目のマスクが欲しいなら1<<4って書くこともある
0641デフォルトの名無しさん (ワッチョイ c193-y/L7)
垢版 |
2018/03/15(木) 06:36:14.64ID:F+InEeO+0
議論の本筋(1日の秒数として即値で86400と書くことの是非)とはさらに離れるけど、
ビットシフトを使う定数は常にカッコで囲んでくれ。

res = a + 1<<4 + b;
res = a +(1<<4)+ b;
0642デフォルトの名無しさん
垢版 |
2018/03/15(木) 07:15:43.22
>>641
3つ以上の項があると静的解析ツールで怒られるから
res = (a +(1<<4))+ b;
と書く
0657デフォルトの名無しさん (アウアウウー Saaf-0FUd)
垢版 |
2018/03/15(木) 22:07:51.82ID:dQGk6ayHa
cpprefjpの任意の式によるSFINAEの頁でdecltype(a + b, bool())と記載されているコードがあるんだけれど、
このa+b, bool()はラムダ式?

該当頁
https://cpprefjp.github.io/lang/cpp11/range_based_for.html
0661デフォルトの名無しさん (ワッチョイ af7e-hKdO)
垢版 |
2018/03/15(木) 22:41:47.80ID:XNo6/02A0
>>657
>a + b
a + bが可能かどうか調べる

>,
次の式を評価する

>bool()
bool型の初期値を返す

つまりdecltype(a + b, bool())はa + bでSFINAEをしつつカンマ演算子でdecltypeにbool型の値を与えて返り値の型をbool型にしている
0662デフォルトの名無しさん (アウアウウー Saaf-0FUd)
垢版 |
2018/03/15(木) 22:57:18.20ID:dQGk6ayHa
decltypeで,も使えたんですね。一番右の型が帰るということはdecltype(a+b,a-b,a*b,a/b,bool())とかしてもよさそう。。。

自分ではその機能を説明してるページを見つけれませんでした。
ありがとうございます。
0671デフォルトの名無しさん (アウアウアー Sa83-2N1f)
垢版 |
2018/03/19(月) 18:07:03.75ID:/U1oheuNa
インスタンスにdeleteかけたとき、メンバ変数が破壊されるのとデストラクタが実行されるのはどっちが先?
今書いてるコードがデストラクタでメンバ変数アクセスすると落ちることがあるから、破壊されるのが先なんだろうか?
0674片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sdd7-5vKF)
垢版 |
2018/03/19(月) 18:43:06.07ID:SpFx62hRd
>>673に同意。確保と破棄は生ポインタを触らずに自動化した方がいい。スマートポインタとかコンテナとか。
二回deleteを避けるためにポインタにNULLを代入する技もある。
0675デフォルトの名無しさん (アウアウウー Saaf-0FUd)
垢版 |
2018/03/19(月) 21:03:24.06ID:kCg91IvDa
そろそろNULLは駆逐してnullptrに移行させたい
0676デフォルトの名無しさん (ワッチョイ 53bd-mA8b)
垢版 |
2018/03/19(月) 22:46:40.23ID:jnDGFLZz0
>今書いてるコードがデストラクタでメンバ変数アクセスすると落ちることがある
へ〜んなの
ていうかメモリを壊しているかすでにdeleteされた死骸を再deleteしてるとしか、

>二回deleteを避けるためにポインタにNULLを代入
OpenCVのC言語インターフェースのやつ、
0680デフォルトの名無しさん (ワッチョイ 53bd-mA8b)
垢版 |
2018/03/19(月) 23:27:24.60ID:jnDGFLZz0
std::getline()は読み込んだ文字列に改行文字を含めないから
行末まできちんと読んだのか
文字数カウントのせいで読み込みが行の途中でぶちきれたのか
直ちにはわからないといいうアホウな仕様
判別には結局std::basic_istream<T>::unget()の助けが要る

C++標準ライブラリのうちストリーム関連だけは腐っているからC言語のを使いなしゃれ

※ 個人の感想です
0681デフォルトの名無しさん (ワッチョイ 53bd-mA8b)
垢版 |
2018/03/19(月) 23:28:25.97ID:jnDGFLZz0
訂正
△: C++標準ライブラリのうちストリーム関連だけは腐っているからC言語のを使いなしゃれ
◎: C++標準ライブラリのうちストリーム関連だけは本当に腐っているからC言語のを使いなしゃれ
0682デフォルトの名無しさん (ワッチョイ f3e7-dVgQ)
垢版 |
2018/03/20(火) 01:02:22.15ID:mI6/gPTY0
入出力はCもC++もクソまみれだからなぁ
ちょっとコンソール出力を整形しようとして、あの肥溜めのクソくだらない落とし穴地獄にいちいち付き合わされた結果
プログラミングそのものが嫌いになる人達が山のようにいるのが本当に残念だ
0683デフォルトの名無しさん (ワッチョイ e19f-M10G)
垢版 |
2018/03/20(火) 01:12:22.56ID:PXcTmg8I0
いるか?
0687デフォルトの名無しさん (ワッチョイ e19f-hKdO)
垢版 |
2018/03/20(火) 02:48:01.36ID:PXcTmg8I0
printf()は便利ではあるが桁を揃えて出す時に面倒になることもある。
特にこの頃は UTF-8 で漢字混ざりだと文字幅とバイト数または文字数が一致しない。
そもそもそんなものの一致をあてにすること自体が間違いかも知れないが、Unicode
には一応 HALF WIDTH, FULL WIDTH 等があるんだから何とかしてこれを生かした
フォーマッタが欲しいところではある。
0688デフォルトの名無しさん (アウーイモ MMb3-2N1f)
垢版 |
2018/03/20(火) 06:49:53.60ID:eswqOupsM
>>672
>>673
あるクラスがあって、その中でスレッド立ててるの
それでクラスのデストラクタが呼ばれたら、メンバ変数のスレッドポインタをつかってスレッドcancel->joinってやろうとしてて
それでjoin呼ぶあたりで落ちるんだよね

作られた逆順ってことはデストラクタのほうが先に実行かな?それだとメンバ変数はいきてるよね
0694デフォルトの名無しさん (ワッチョイ 53bd-mA8b)
垢版 |
2018/03/20(火) 22:33:41.91ID:f35CyiEk0
>>685
「<<」と「>>」の2種類しか用意できんやんけ
それらを表示と入力に割り当ててしまえば結局シリアライズのための固有なメソッドなりインターフェースなりを別途作らねばならんぬ、
そもそもの構想からして頓挫してゐる、
頓挫してゐるのだ…!
0696デフォルトの名無しさん (ワッチョイ 53bd-mA8b)
垢版 |
2018/03/21(水) 00:33:52.80ID:7c9Ne47J0
ちょっなんで数億年の生物史史上はじめて
ようやっとSTDINとSTDOUTとSTDERRの3種類に世界が抽象化されたストリームという概念|を
細分化するという元の木阿弥にしますか;;

藻前は
  some_command | tee result.txt > some_file.bin
とかいったパイプやリダイレクトを表示専用とかシリアライズ専用とかに分けたいのかっていうか、
0697デフォルトの名無しさん (ワッチョイ e17f-hKdO)
垢版 |
2018/03/21(水) 00:44:24.33ID:p0rFESlF0
なに藻前って
0698はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3b6f-hKdO)
垢版 |
2018/03/21(水) 01:10:44.31ID:MouF+uE40
>>696
お前は何を言ってるんだ。
ここで言ってるストリームは C++ 用語のストリームだぞ。
「ストリーム『型』」ってわざわざ書いてるんだからわかれよ。
下位レイヤでは好きなところに繋げればいい。
0701デフォルトの名無しさん (ワッチョイ b180-lboF)
垢版 |
2018/03/21(水) 06:52:22.30ID:fTbDiwfs0
ストリームはもう捨てたほうが良いぞ。
おじさんからの警告だ。
0703デフォルトの名無しさん (ワッチョイ ebb6-CZ08)
垢版 |
2018/03/21(水) 07:18:35.01ID:zecIlzA/0
「29歳既婚、2年前に会社を辞めた。ボードゲーム作りを始めて3700万円を
売り上げたけど何か聞きたいことはある?」回答いろいろ
http://labaq.com/archives/51880196.html
日本ボードゲーム界の異端児に聞く!ボードゲームデザイナーとして生きていくには?
https://bodoge.hoobby.net/columns/00013
はじめてボードゲームを作ってはじめてゲームマーケットに出店した ので、ひとり反省会をしてみる。
http://datecocco.hatenablog.com/entry/2015/11/26/000000
はじめて作ったボードゲームを売った話
http://nrmgoraku.hateblo.jp/entry/2017/05/17/210000
ボードゲームイベント「ゲームマーケット」から業界が見えた!
https://entertainmentstation.jp/61107
ゲームマーケットに挑む人向けガイド
http://spa-game.com/?p=4830
ボードゲームはどう作るのか、自分なりに考えた
http://roy.hatenablog.com/entry/2014/07/09/124824
オトナも遊べるボードゲーム!自作するといくらになるのか
http://www.d-laboweb.jp/special/sp312/
ボードゲームの展示イベント「ゲームマーケット」の成長記録からこれからの
市場に必要なことを妄想してみた。6年間の来場者数推移(2016年4月時点調べ)
https://bodoge.hoobby.net/columns/00001
ボードゲーム市場がクラウドファンディングの出現で急成長を遂げ市場規模を拡大中
http://gigazine.net/news/20150820-board-game-crowdfunding/
0704デフォルトの名無しさん (ワッチョイ 1ff3-hKdO)
垢版 |
2018/03/21(水) 10:36:30.48ID:DQv7yGEy0
>>696
カンブリア紀からオルドビス紀にかけて行われた抽象化は
今でいうインターフェイスの考え方で、当たり前だが
インターフェイスを継承する実装クラスは無数にあってよい
そういうのは元の木阿弥とは言わないぞ
0705はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3b6f-hKdO)
垢版 |
2018/03/21(水) 15:09:48.71ID:MouF+uE40
>>696
さっき >>698 で説明した C++ の話題を置くとしても、
(まあ C++ スレで C++ の話題を置いちゃうのはどうかと思うが)
標準入力、標準出力、標準エラー出力のみっつしかないってことはない。

エラー出力をリダイレクトするときに 2> って書くの、どういう意味だと思ってる?
2 はファイルディスクリプタな。
デフォでオープンされてるのが 0, 1, 2 ってだけで、やりたければ 3 でも 4 でも使っていい。
0706 ◆QZaw55cn4c (ワッチョイ 9360-MOYc)
垢版 |
2018/03/21(水) 15:42:02.21ID:ZGJmhAHm0
>>705
空いているディスクリプタが使用されるとしても、自分で特定の数字を指定してディスクリプタにすることはできなかったんじゃなかったかな?
0708デフォルトの名無しさん (ワッチョイ af7e-hKdO)
垢版 |
2018/03/21(水) 15:58:29.69ID:9NBOfW2C0
coutがSTDOUTにつながってるだけでここは何につなげてもいいということ
streambufの中身はただの配列でもいいし、アプリケーションのロガーでもいいし、循環バッファでもいいし、通信のポートでもいい
0712はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3b6f-hKdO)
垢版 |
2018/03/21(水) 20:33:11.12ID:MouF+uE40
read なり write なりを「使う」のは別にいいよ。
それを C++ 上でどのように抽象化すればいいかって話なんだから。
そういうレイヤの違う話を混ぜ込んでくるなよ。
0713デフォルトの名無しさん (スップ Sd03-tAvx)
垢版 |
2018/03/21(水) 20:43:51.09ID:KgSvodNyd
そこで新しい型を設けてまで << を使う意味がない
cout にバイナリでシリアライズするときはどうすんの?
size_t serialize(const T& t, ostream& os)
とかを各型用に書く方がマシ
0714デフォルトの名無しさん (スップ Sd03-tAvx)
垢版 |
2018/03/21(水) 20:47:43.15ID:KgSvodNyd
バイナリでシリアライズするに際して
別の型のストリームオブジェクトを作ってまで
<< だの dec だの endl を使えるようにすることの利点を説明して欲しい
0715デフォルトの名無しさん (ワッチョイ af7e-hKdO)
垢版 |
2018/03/21(水) 21:36:05.23ID:9NBOfW2C0
例外を除いて
operator<<()は書式化出力
write()は非書式化出力
なのでバイナリを出力するときはwrite()を使うべき

>size_t serialize(const T& t, ostream& os)
シリアライズのような複雑な操作をするときはこれは悪い選択じゃない
というかstreamそのものを放り込むのはたまに見かける
0717はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3b6f-hKdO)
垢版 |
2018/03/21(水) 22:15:54.63ID:MouF+uE40
>>715
書式化 (formatted) ってのと、結果がバイナリかというのは直行する概念だよ。
シリアライズってのはオブジェクトのバイト列をそのまま出力することじゃなくて、
バイナリ形式の特定のフォーマットにして出力することだろ。
それは書式化って言うんだよ。
0718はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3b6f-hKdO)
垢版 |
2018/03/21(水) 22:26:24.75ID:MouF+uE40
>>714
マニピュレータを使える意味はないかもな。
使えないように定義することも出来るし、意味がないなら使えないようにしておくべき。

ここでは抽象化の話をしているんだ。
出力先が人向けのテキスト表現であるか機械向けのシリアライズ表現であるかによって
書き方を変えなきゃならない、相手を意識しなきゃならないというよりは、
相手によって自動で切り替わって欲しいってことなんだよ。

意識しなくていいデザインってのは意識しにくくなるってことと表裏一体だから、
見えなくなるのが気にくわないってのならわかる。
0722はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3b6f-hKdO)
垢版 |
2018/03/21(水) 23:50:04.75ID:MouF+uE40
>>721
俺は一貫して抽象化の話をしてるつもりなんだが。
プログラマの意図を表現できる書き方をすべきって話をしてんの。
無意味な処理をしろと書いてあるのをプログラマの意図として読み取っていいのか?
そうじゃないだろう。

C++ がせっかく用意しているライブラリを活用するのが無駄なのか?
そうじゃないだろう。
0723デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/22(木) 07:21:49.59ID:tiDItZ1f0
ハッキリ言ってストリームは蛇足だったわ。
廃止したほうが良いわ。
0724デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/22(木) 07:25:52.15ID:tiDItZ1f0
Boostもそうだけど、有り余るC++のパワーをカッコよく使いこなそうとしてやっちまったみたいな。
もうちょっと使う側の立場にたつべきだな。
0731デフォルトの名無しさん (ワッチョイ a393-4ZrE)
垢版 |
2018/03/22(木) 19:57:57.53ID:sR+euIcT0
>>726
どの資料だったか覚えてないけど、演算子オーバーロードに関して
先生は「元の演算子の意味とかけ離れた挙動をさせるのは避けるべきだ」
みたいなことも書いてるよな。

まぁ、原則は指針であって絶対の規則じゃないわけだけど、
<< >> をビットシフトからストリーム入出力に振り替えておいて
どの口で言うか、このハゲッー! とか思ったり。
0733はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b66f-zkh5)
垢版 |
2018/03/22(木) 20:22:42.90ID:HExEyyqO0
>>731-732
まああれくらいのものになると、オブジェクトに追加で突っ込んでいくような動作が「元の演算子の意味」になっちゃってるよな。

そんなことより C++20 に入る予定のカレンダーでは日付を 2018y/mar/22 とか書けるらしくて、
これはさすがにクソやろ……。
これもいずれ普通に受け入れる気持ちになるだろうか。
0737デフォルトの名無しさん (ワッチョイ a393-4ZrE)
垢版 |
2018/03/23(金) 08:21:50.21ID:VCdaFb7Y0
>>733
標準に「日付を表す型」みたいのが追加され、
それ用リテラルの接尾語(のひとつ)が ""y で 2018y は2018年を表す、
さらにこの型では / は日付要素を区切る演算子としてオーバーロードされてる。
…といった感じか?

確かに虚心坦懐に / を見れば、割り算のコンピュータ向け代用記号だけでなく
日付の区切りや、ファイルシステムの階層区切りでもあるけど。
0740デフォルトの名無しさん (アウアウウー Sac7-zkh5)
垢版 |
2018/03/23(金) 10:45:38.60ID:COiOJTLla
「静的」、「動的」というのがよく分からないのですが、詳しく書いてある本はありますか?

ヒープ領域がどうたらとかいうのもよく分かりません。
スタックとかいうのもよく分かりません。

詳しく解説している本を教えてください。
0741デフォルトの名無しさん (アウアウウー Sac7-zkh5)
垢版 |
2018/03/23(金) 10:48:57.55ID:COiOJTLla
ロベールのC++の本を読んでいて疑問に思いました。
0746 ◆QZaw55cn4c (ワッチョイ ba60-fzSc)
垢版 |
2018/03/23(金) 19:55:59.42ID:J4dYcx4H0
>>740
C/C++ のメモリ構造について、になります。
これは基本的な事項で、初級を脱するためにはぜひとも必要な知識なんですが、
そのわりにあまりに解説されることがないような気がします
適切な説明がないものか…
0747 ◆QZaw55cn4c (ワッチョイ ba60-fzSc)
垢版 |
2018/03/23(金) 19:59:40.83ID:J4dYcx4H0
>>740
まず、メモリの管理方法として

1. スタックエリア、に格納するやり方
2. ヒープエリア、に格納するやり方

の大きく分けて二通りがあり、

2. ヒープエリア、二格納するやり方について

2-1. 「静的」:static キーワードを使うやり方
2-1. 「動的」:malloc()/free() または new/delete を使うやり方

が分類されます。
0749デフォルトの名無しさん (アウアウウー Sac7-zkh5)
垢版 |
2018/03/23(金) 20:39:25.53ID:COiOJTLla
>>746-747

ありがとうございました。

あまりそういう本はないんですか。

もしかしたら、ヘネシーらのコンピュータのハードの本とか読まないといけないんですかね?

あるいはコンパイラの本ですかね?
0752 ◆QZaw55cn4c (ワッチョイ ba60-fzSc)
垢版 |
2018/03/23(金) 20:45:34.35ID:J4dYcx4H0
>>749
手っ取り早いのは「マシン語」を書いてみる、マシン語(アセンブリ言語)のルーチンを C にリンクさせる、ていうのが王道ですが、
昨今はマシン語のいい教科書がない、という気がします

gcc のインラインアセンブラとかが有望だとは思いますが、まあ簡単にマシン語を記述している教材なんていうものが思いつかない、マシン語の需要というか動機がないのかもしれませんが
0755はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b66f-zkh5)
垢版 |
2018/03/23(金) 22:32:48.28ID:ehYNLgPn0
どうだろ?
C++ の言語仕様的にはオブジェクトの寿命に違いがあるだけで、
それを実現するメカニズムについては詳細な規定があるわけではない。

まずは C++ のパラダイムの中で理解を深めれば自然に理解できるんじゃないの?
手を広げすぎても収集が付かなくなる気もするんだけどなぁ。
0756デフォルトの名無しさん (アウアウカー Sac3-E6if)
垢版 |
2018/03/23(金) 22:56:58.27ID:io4DvPx8a
マシン語に手を出すのは飛躍しすぎだしやめといた方がいい。ある程度C++になれてより深く理解したいと思うようになってからがいいよ。

動的、静的は大雑把に言えば、コンパイル時つまりソースを書いた時点で決まるものを静的、実行時に変化するものを静的と呼ぶ。
変数の型とかメモリ領域の確保の仕方とか、いろんな文脈で使われる。
0759デフォルトの名無しさん (ワッチョイ 7abd-aumg)
垢版 |
2018/03/24(土) 00:54:38.69ID:LvcaB4Q+0
メモリについて知りたいんならC言語から始めたら良い
Unixの移植目的で設計されたC言語は、実行効率のためほとんど必然的にメモリが透けて見える言語になったんである
『プログラミング言語C』という名著もある
これの後ろの方のmalloc()の実装サンプルまで通読したら
シングルCPUの範疇ならメモリについて嫌でもワカル

『プログラミング言語C++』と違って三日もあれば読めれる手頃な分量やしな!
0760デフォルトの名無しさん (ワッチョイ a39f-aRf7)
垢版 |
2018/03/24(土) 01:27:57.09ID:eFb1d56B0
>>758
横だが。

何でも、だよ。
型なら静的型、動的型というし、メモリ確保なら静的確保、動的確保という。

マシン語は飛躍しすぎ。
CのエンハンスとしてC++を使うのならマシン語(インラインアセンブラ)もありだが、
C++をJava/C#/C++の並びで使うつもりならインラインアセンブラとか禁止でしょ。

というかそもそもその辺が分からない=全くの初心者がC++からやろうというのが間違い。
PythonかRubyあたりから始めとけ。(どっちも俺は知らんけど)
0761デフォルトの名無しさん (ワッチョイ 36e7-0D9k)
垢版 |
2018/03/24(土) 01:40:25.62ID:nPxx/G4d0
コンパイラがコンパイル時に決めるものが静的、出来上がったプログラムを実行した時に決まるのが動的
C++だとそういう理解の方がわかりやすいと思う

マクロ、テンプレート、constexpr、リテラル、式や変数や関数やクラスの宣言型なんかは静的
静的なものは全部コンパイラが決めるからプログラムの実行時にはいちいち計算しないし、バグで決められなかったらコンパイラが怒る

変数やインスタンスの中身、関数呼び出し、仮想クラスのオブジェクト型なんかは動的
実行環境や食わせた入力・ファイルなんかに依存するからプログラムを実行してみないと決まらない
動的なバグはコンパイラは感知できないから客先でプログラムを実行するとクラッシュする

適当だけどだいたいこんな感じ
0762デフォルトの名無しさん (ワッチョイ a39f-aRf7)
垢版 |
2018/03/24(土) 02:04:25.06ID:eFb1d56B0
細かいようだが、

コンパイル時に確定=静的
実行時に確定=動的(=コンパイル時に確定できない)

で若干の例外(staticとか)があるが大体あってる。

「プログラミング言語C」はやめとけ。名著だが、あれは
「既にプログラミングを出来る人が、C言語を学ぶ」用であって、全くの初心者じゃ読めない。
「プログラミング言語C++」も止めとけ。あれも「既にCを使える人が…」で以下同文。
他本は総じてゴミなのも事実だが。
0763デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 02:06:26.05ID:Z79Bg+7E0
特定のアドレスにデータを配置して割り込みかける必要があるからじゃないだろか。
0766デフォルトの名無しさん (ワッチョイ a39f-aRf7)
垢版 |
2018/03/24(土) 02:29:56.73ID:eFb1d56B0
そんなに混乱するか?例外としてしまって問題ないと思うが。
俺は規格には詳しくないが、(というより色々混ざってしまっているが)

・Cのstatic関数=ファイルスコープに限定、externの反対 --- (A)
 はC++ではなんとかされたのではなかったっけ?(どうせ使わないからどうでもいいが)
・staticクラス、あるいはクラスのstaticメソッド --- (B)
 は「静的」で矛盾しないから、そもそも問題ない。
・関数内static変数でプチグローバル(みたいなやつ) --- (C)
 も普通にクラスにしろ、って話でしかないし、使わないだろ。

結果、普通に使う分には特に混乱しないと思うが。
文法オタクは気にするのかもしれんが。

(C)は「動的関数にしよう」という意図があったのかもしれんが、
結局C/C++の世界は静的関数しかないから、意味無かったし。
というかそもそも俺は動的関数のメリットがよく分からん。
C#は動的関数だが、結局ロード/アンロードはアセンブリ単位=ほぼ起動時に纏めて、
であって、活用してない。
Javaは動的関数でメリットを享受してるんだっけ?(知らんから教えて)
0767デフォルトの名無しさん (ワッチョイ a304-h0dl)
垢版 |
2018/03/24(土) 02:33:41.17ID:y/z0A0hW0
https://ideone.com/Epp30z
お兄ちゃん助けて、コンパイルが通らないの。

VCで開発してます。
jsonのメモリーモデル研究にとりあえずシェアードPTRの組んでそれからやっぱユニークPTRの変更しました。
色々いじってるのですが、意味不明なエラーが出てさっぱりわかりません。
自前のコードなら自分でどうにかするのですが、コードステップするとライブラリの中でえらーおこしててさっぱりです。
どなたかご教示ください。お願いします。
0771デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 03:55:06.40ID:Z79Bg+7E0
毎回思うんだけど、なんでgccで勉強しようとするんだろうな。
エラーメッセージ読めと言われても読めるわけがない。
一番わかりにくいメッセージを出すコンパイラで勉強する子が不憫でならない。
0772デフォルトの名無しさん
垢版 |
2018/03/24(土) 04:28:06.63
>>771
VCで開発って書いてんだろーが
0773デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 04:30:46.18ID:Z79Bg+7E0
確かに書いてあるな。
じゃあエラーメッセージ読めよ。
0775デフォルトの名無しさん
垢版 |
2018/03/24(土) 06:12:32.26
いつも大量のWarningが出るのを真面目に対処せず放置してるからErrorが出ても理解できない罠
0777デフォルトの名無しさん (ワッチョイ f397-zkh5)
垢版 |
2018/03/24(土) 06:25:04.10ID:0qB0BmlJ0
static_castの動作内容は翻訳時に全て確定する
dynamic_castの動作内容は実行時のvtableにより変化する

static_assertは翻訳時に検査を行う
assertは実行時に検査を行う

static link libraryは翻訳時に結合する
dynamic link libraryは実行時に読み込む
0778デフォルトの名無しさん (ワッチョイ a393-4ZrE)
垢版 |
2018/03/24(土) 06:57:20.04ID:XPzSeRia0
どうやら >>740 の質問は C++ に限定した話ではないみたいだから、
C と C++ の両方を扱うスレッドに移動するのが良いんじゃないかな。

「Cの場合は…」「ここC++のスレッドだし」レベルの齟齬が避けられるし、
このスレッドを見てないC専門の人が有用な情報を持ってるかも知れん。


【初心者歓迎】C/C++室 Ver.102【環境依存OK】
ttp://mevius.5ch.net/test/read.cgi/tech/1509780815/

スレを勃てるまでもないC/C++の質問はここで 25
ttp://mevius.5ch.net/test/read.cgi/tech/1471100645/
0779デフォルトの名無しさん (ワッチョイ a39f-aRf7)
垢版 |
2018/03/24(土) 09:00:52.23ID:eFb1d56B0
>>778
質問者はそれ以前の、プログラミング一般の「静的」「動的」の区別が付いてない。
スレ移動しても意味無い。というかどこのスレでも同じ。

C++のstaticは、Cのグダグダな仕様を引きずっているからおかしくなっているだけで、
C++で新たに設定されたstaticは他言語とも整合取れてる。
これに関しては「Cが悪い」でいいと思うよ。

説明している本が無いのは、そもそもそんなところで引っかからないだろう。
教習所でハイオクの話をしても意味無い。
一通り動く物を組めるようになるまではそれにフォーカスしろ、でいい。
0780デフォルトの名無しさん (ワッチョイ 36e7-0D9k)
垢版 |
2018/03/24(土) 09:28:18.28ID:nPxx/G4d0
静的動的の区別は大事だし引っかかりやすい所でもあるでしょ
テンプレート引数に変数突っ込んでなんで動かないのぉぉとか初心者はよくあるよ

説明してる本がないって本当か?本当なら世の本がクソすぎる
0781デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 10:20:48.01ID:Z79Bg+7E0
で、静的と動的の違いは何なんだよ。
ガンダムで説明してくれ。
0783デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 10:38:33.14ID:Z79Bg+7E0
ガンダムで説明できないうちは理解できてることにならないぞ。
0788デフォルトの名無しさん (ワッチョイ a39f-aRf7)
垢版 |
2018/03/24(土) 11:28:25.89ID:eFb1d56B0
>>780
> テンプレート引数に変数突っ込んでなんで動かないのぉぉとか初心者はよくあるよ
ねえよ

> 説明してる本がないって本当か?本当なら世の本がクソすぎる
世の本は概して糞だ。これは事実だ。

というかここら辺の認識がずれるのは世代ギャップだ。
現状の本を書いてきている世代は全員CをやってからC++をやっている。
だから「静的」「動的」の区別が付かない状態でテンプレートを触ることがなかった。
当然そこを解説した本もそんなにあるはずがない。

お前らの世代がCをやらずにいきなりC++を始め、それで色々苦労した経験があるのなら、
お前らの世代の連中が本を書かなければならない。ただそれ以前に、
俺はその必要(全くの初心者がCをやらずにC++を始める)があるとは思えないが。

入門書を書いている連中はプログラマでも宣教師でもなく、ただのテクニカルライタだ。
だから需要(売れる)があれば書くだけ。今無いのは需要がないと見られているから。
俺もこの見方については同意する。
最初のプログラミング言語がC++ってのは単純に選択を間違えてる。
0789デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 11:30:12.41ID:Z79Bg+7E0
C++とJavascript以外学ぶ必要があるとは思えない。
0791デフォルトの名無しさん (ワッチョイ 5b80-AyCB)
垢版 |
2018/03/24(土) 12:18:09.21ID:Z79Bg+7E0
Javaは当初の理念を失ってしまったように感じる。
0794デフォルトの名無しさん (アウアウウー Sac7-zkh5)
垢版 |
2018/03/24(土) 18:05:30.46ID:upExxHyGa
みなさん、ありがとうございました。

カーニハン他の本をまず読んでみようと思います。

>>793

そうなんですか?

Robert SedgewickらのAlgorithmsという教科書がJavaで書かれているため、
Javaの本も買って読んでいます。

ところで、学術的?な本では、オブジェクト指向言語としてC++かJavaが
大抵使われていますが、C#は使われていません。これはマイクロソフト
という一企業が設計した言語だからでしょうか?
0800デフォルトの名無しさん (ワッチョイ a39f-aRf7)
垢版 |
2018/03/24(土) 18:50:18.42ID:eFb1d56B0
>>796
なら素直にC#やっとけ。
その後に必要ならC++で何も問題ない。

C#は商業的につまずいたのでJavaほどの知名度はないが、
言語自体はJavaよりは断然いい。(後発だから当然だが)
0801デフォルトの名無しさん (スププ Sdba-kSjP)
垢版 |
2018/03/24(土) 19:07:41.38ID:weQnYJFBd
ねーねー。
STL作った人は、共産主義国で食中毒にあって、ベッドの上で朦朧とした頭で閃いたって話だった気がしたけど、どっかにその話のソースある?
ググっても見つからないよー
0807デフォルトの名無しさん (アウアウウー Sac7-zkh5)
垢版 |
2018/03/25(日) 11:36:01.08ID:Lywxeunja
char* str = "abc";

とは書かずに、

const char* str = "abc";

と常に書くようにと本に書いてあります。

理由は文字列リテラルは直接書き換えてはいけないからであると書かれています。

●コンパイルは通っても、実行するとエラーになることもある。
●同じ内容の他の文字列リテラルまで書き換えられてしまうことがある。

とも書かれています。

禁止されているにもかかわらず、コンパイルが通る可能性があるというのはどういう
ことなのでしょうか?

(1)コンパイルエラーが発生
(2)コンパイルは通るが実行するとエラーが発生
(3)コンパイルは通り、実行してもエラーが発生しないが、同じ内容の他の文字列
リテラルまで書き換えられてしまうという不具合が起こることがある。

コンパイラーの設計者には、(1)、(2)、(3)の選択肢があるのはなぜでしょうか?

禁止されているのだから、一律にコンパイルエラーにするのが自然に思われます。 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
0808デフォルトの名無しさん (アウアウウー Sac7-zkh5)
垢版 |
2018/03/25(日) 11:39:58.12ID:Lywxeunja
const char* str = "abc";
const char ca[] = {'a', 'b', 'c', '\0'};

の二つは同じことだと思っていましたが、これは違うということでしょうか?

const char* str = "abc";

では、"abc"をある場所に格納しておき、それを使いまわしたりすることがある
ということでしょうか?

例えば、

const char* str1 = "abc";

const char* str2 = "abc";

と書いたときに、 str1 == str2 になることがあるということでしょうか?

一方、

const char ca1[] = {'a', 'b', 'c', '\0'};
const char ca2[] = {'a', 'b', 'c', '\0'};

と書いた場合には、それぞれ、別に格納場所が確保されるということでしょうか? 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
0810デフォルトの名無しさん (アウアウウー Sac7-zkh5)
垢版 |
2018/03/25(日) 11:44:30.72ID:Lywxeunja
すみません。
カーニハンらの本の日本語版のp.127に書いてありました。

char amessage[] = "now is the time";
char *pmessage = "now is the time";

の違いについてです。

そして、文字列の内容を変えようとすると、その結果は不定となる

と書かれいます。なぜ不定としているのかについては理由は書いてありません。
0814デフォルトの名無しさん
垢版 |
2018/03/25(日) 13:01:03.23
C++相談室で出す話題でもなかろに
0818デフォルトの名無しさん
垢版 |
2018/03/25(日) 15:22:53.51
C++スレでK&Rの話すんなや
0819デフォルトの名無しさん (ワッチョイ f397-zkh5)
垢版 |
2018/03/25(日) 17:38:21.10ID:S7OmeNGW0
>>807
ISO/IEC14882:2017 C.1.1の段落3で
char* p = "abc"; // valid in C, invalid in C++
となっているので、C++ではコンパイルが通ってはいけない

なぜ通ることがあるのかというと、
JIS X3014:2003 D.4で
定値文字列からの暗黙変換 文字列リテラルに対し,定値から非定値へ暗黙変換することは,推奨しない(4.2参照)。
となっており、C++03に従う限りコンパイルは通ることになっていた名残だ
0823デフォルトの名無しさん (ブーイモ MMe7-Dh3i)
垢版 |
2018/03/25(日) 18:55:57.82ID:HW+VfLnzM
可変長配列とか名前付きの構造体初期化とかc++に取り込まれたんだっけ?
スーパーセットは20年前にとっくに終わったんじゃないかと。

すでに導入されてたらスマソ
0824はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b66f-zkh5)
垢版 |
2018/03/26(月) 05:22:15.91ID:S9VCdiyC0
>>823
たぶん入ってないな。

可変長配列 (VLA) って確か C でもオプショナルに格下げされてただろ。 (C11 から)
C++ のイニシャライザはだいぶん複雑になっちゃったから辻褄の合うようにするの大変だろうし、
もうやらないんじゃないかな。
0826デフォルトの名無しさん
垢版 |
2018/03/26(月) 11:51:36.03
実用レベルではCがC++のサブセットだし🙄
0831デフォルトの名無しさん (ワッチョイ b69b-g2oz)
垢版 |
2018/03/27(火) 01:36:13.83ID:tW2Kdf3t0
あるクラスAのラッパークラスWで
A&を受け取る場合はWの全てのメソッドが使えて
const A&を受け取る場合はWのconstメソッドだけが使えるように制限する設計って
ありましたっけ?
0834デフォルトの名無しさん
垢版 |
2018/03/27(火) 06:53:48.55
>>831
制限っていうのは、コンパイルエラーにしたいの?
0837デフォルトの名無しさん
垢版 |
2018/03/27(火) 07:35:02.82
>>835
NGっていうのは、コンパイルエラーにしたいの?
0840デフォルトの名無しさん (ワッチョイ 0723-14g7)
垢版 |
2018/03/27(火) 11:34:17.37ID:bA2HN2rY0
クラスを
W
MutableW (変更可能なW)

と分けるのがよく使われる現実的な解だと思う
MutableW は W の派生型として実装すると楽

>>835
>で、Wの非constメソッドには必ずconstメソッドが対応して存在している

この部分は意味不明なので聞かなかったことにしておく
0843デフォルトの名無しさん (アウアウウー Sac7-fzSc)
垢版 |
2018/03/28(水) 18:32:49.43ID:rzqMRle+a
C言語ってこんなので就職できるらしい…

【企業】「”C言語…?どこかで見た”程度でOK」 名古屋のアテック、求人広告が話題に エンジニアの人材不足、面白求人でカバーできる?
https://asahi.5ch.net/test/read.cgi/newsplus/1522229305/

本物のC++プログラマーを募集してる某社とはえらい違いだな
0845デフォルトの名無しさん
垢版 |
2018/03/28(水) 20:50:12.70
>>843
言語ヲタなんてプロジェクトに一人いれば十分だし

兵隊は言語の知識よりコミュニケーション能力、報連相、Excel方眼紙スキルが大事よ
0848デフォルトの名無しさん
垢版 |
2018/03/28(水) 22:29:42.33
上司なんか関係ないやろ

お客さんを味方に付けることや
0850デフォルトの名無しさん (ワッチョイ a37f-zkh5)
垢版 |
2018/03/28(水) 22:46:49.55ID:2H+8IznE0
上司も客も関係無いよバカども
プログラミングの話だバカども
0852デフォルトの名無しさん (ワイモマー MMb3-TX0Y)
垢版 |
2018/03/29(木) 00:40:46.75ID:zCjdEvGWM
visualstudio2017 Win32アプリケーションでSQLiteを使いたいのですが
Nugetにそれらしきものが合ったのでインストールしようとしたのですが以下のエラーでインストールできません。
https://www.nuget.org/packages/SQLite/

パッケージ 'SQLite 3.13.0' をインストールできませんでした。このパッケージを 'native,Version=v0.0' を対象とするプロジェクトにインストールしようとしていますが、
そのフレームワークと互換性があるアセンブリ参照またはコンテンツ ファイルがパッケージに含まれていません。

どうすればよいのでしょうか。
0853デフォルトの名無しさん (ワッチョイ d180-3UCh)
垢版 |
2018/03/29(木) 00:42:57.97ID:+dX3Weor0
CoAppのタイムスタンプ調べてみて。
NuGetは捨てろ。
0854デフォルトの名無しさん (ワッチョイ d180-3UCh)
垢版 |
2018/03/29(木) 00:48:50.94ID:+dX3Weor0
代わりに何を使うか。
VCPKG。
ただし、MSは三年後にVCPKGも捨てているだろう。
逆に我々がVSを捨てる時期に来ている。
0855デフォルトの名無しさん (ワッチョイ d180-3UCh)
垢版 |
2018/03/29(木) 00:53:15.59ID:+dX3Weor0
MSの方針としてC++を捨ててC#に移行させるというのがあって、C++ユーザーはあの手この手で改宗を迫られる。
もはやVSでC++は苦行。
というか、WindowsでC++が苦行。
0856デフォルトの名無しさん (ワッチョイ d180-3UCh)
垢版 |
2018/03/29(木) 00:55:08.86ID:+dX3Weor0
C++を捨ててC#に移行するか、Windowsを捨ててOSXかLinuxに移行するか。
二択。
WindowsではC#が正解。
なぜならMSがそれを望んでいるから。
0857デフォルトの名無しさん (ワッチョイ b37e-YG9/)
垢版 |
2018/03/29(木) 01:05:50.70ID:xx4XvERn0
C++のチームも頑張って更新してるけどな
IDEとコンパイラは十分なのに
・パッケージマネージャーがクソ
・再起動しないとPATHが更新されない
・VSのプロジェクトが用意されていないとビルドが面倒
と環境が整備されてなさすぎる
0859デフォルトの名無しさん (ワッチョイ d180-3UCh)
垢版 |
2018/03/29(木) 01:14:03.03ID:+dX3Weor0
我々が間違っている公算も高い。
我々はC++を使いこなせる。
だから、C++なら簡単にできるのになぜそうしない?と思ってしまうが、これから学ぶならC#のほうが簡単だろう。
MSがC#を推すのは正しいのかもしれない。
0861デフォルトの名無しさん (ワッチョイ 7923-KOzE)
垢版 |
2018/03/29(木) 02:12:12.07ID:Hc4kPWXM0
Android でも iPhone でも Windows でも使える共通部分のコードは c++ で、
ってのを C# に変えたいのかもしれんが
別段 c++ で不自由ないしなあ…

てか c# って .Net のイメージ強すぎて単体で使える気がまるでしない
0870デフォルトの名無しさん (ワッチョイ d180-3UCh)
垢版 |
2018/03/29(木) 10:39:27.42ID:+dX3Weor0
しかしVisual Studioは何だってUTF-8で保存されるのをそんなに嫌うんだろうか。
あの手この手でUTF-8で保存するのを妨害してくるけど。
0871デフォルトの名無しさん (ワッチョイ d180-3UCh)
垢版 |
2018/03/29(木) 10:40:42.80ID:+dX3Weor0
VSで開発してLinuxに移植されるのを嫌がってるんだろうかね。
その割にはgdbと接続できるようにしてるし。
0874デフォルトの名無しさん (スップ Sdf3-Myl/)
垢版 |
2018/03/29(木) 10:57:10.36ID:HNpF58Nud
a.Hoge+=100;
みたいな事をできて便利だなと思うことはあるけど無けりゃないでいいわレベル
0875デフォルトの名無しさん (ワッチョイ 59d3-kUw7)
垢版 |
2018/03/29(木) 11:06:30.37ID:q+sj+Afe0
プロパティはメソッドともフィールドとも区別できるメタデータとしての活用が唯一の動機なんだが
結局のところ実行時の型システムまで整備しないととただの構文糖だしなあ
0879デフォルトの名無しさん (ワッチョイ 7923-KOzE)
垢版 |
2018/03/29(木) 11:32:58.49ID:Hc4kPWXM0
UI とのバインディングを失笑されたら
シンタックスシュガーでこんなに楽にかける!と主張し始めたよw
そりゃ楽にかけて便利だよな。
そのためのものだもの。そこは同意する
0881デフォルトの名無しさん (ワッチョイ b37e-YG9/)
垢版 |
2018/03/29(木) 12:12:32.14ID:xx4XvERn0
>>878
そういう風にお手軽にメンバを書き換えるのは事故のもとなのでやめましょうってことでめんどくさくしたのに
戦争を知らない世代みたいな
現状でもa.value()++とかif(a.Width()==100)でできるしな
これまでのコードとの一貫性を破壊してなおかつ年代物のコンパイラに更に複雑なパースをさせて得られるものがちょっと括弧を省略するだけとは
0884デフォルトの名無しさん (ワッチョイ d180-3UCh)
垢版 |
2018/03/29(木) 12:18:48.50ID:+dX3Weor0
C++builderってプロパティなかったっけ。
たいそう便利だったような気がするのだが、思い違いだろか。
0885デフォルトの名無しさん (ワッチョイ d180-3UCh)
垢版 |
2018/03/29(木) 12:19:57.65ID:+dX3Weor0
そもそも最近のGUIビルダってC++ビルダーの影響受けまくってるような感じがする。
0890デフォルトの名無しさん (ワッチョイ d180-3UCh)
垢版 |
2018/03/29(木) 12:31:30.92ID:+dX3Weor0
使うな!
0893デフォルトの名無しさん (ワッチョイ b37e-YG9/)
垢版 |
2018/03/29(木) 13:03:56.15ID:xx4XvERn0
>>887
これらを採択する人の中にGCCやMSVCの人がいないわけないじゃん
関数として扱うのか、変数として扱うのか決めなきゃいけない
そしてどうやってポインタをとるのかなど色々な問題がある
そしてさっきも言ったけど括弧を少し減らせるだけでできることが増えるわけじゃないというのが最大の問題
0896デフォルトの名無しさん (アウアウウー Sa45-kUw7)
垢版 |
2018/03/29(木) 13:33:25.09ID:f5JOZCzba
ん?
参照した値を変えるとGUIの表示とか更新してくれんの?
getterとsetterあったとして実行してくれんの?

a.width()とa.widthが同じgetter的な動作してくれるのはわかるけど
0914デフォルトの名無しさん (ワッチョイ 417f-kUw7)
垢版 |
2018/03/30(金) 08:42:16.05ID:u8hlmR9G0
それはプロパティに限った問題ではないな
0921デフォルトの名無しさん (ワッチョイ 417f-kUw7)
垢版 |
2018/03/30(金) 11:58:36.02ID:u8hlmR9G0
変数でも演算子がオーバーロードされてる場合もあるからな
結局調べないとダメ
0923デフォルトの名無しさん (ワッチョイ c1b3-kUw7)
垢版 |
2018/03/30(金) 15:53:31.37ID:l98ixrSj0
>>910
お前のレスの意味がわからん
実際C#もソースコード公開されてるソフトの改造程度にしか触ったことないんでちゃんと理解してないが
getter/setterの自動生成するだけのクソ機能と誤解してる人がこのスレでも前スレでも見られたから
>>902を書いただけなんだが

というか書き込む前の1〜2レスすら読めんのかお前は
0924デフォルトの名無しさん (ワッチョイ 1908-kUw7)
垢版 |
2018/03/30(金) 17:21:54.28ID:6y8tfNRe0
C++erが通常prvalueで返しているリファレンサを、データメンバにするってことなら
テンポラリを作らなくなる分、速度的なメリットはありそうだな

# でも、俺はイヤだな
# データメンバがドカドカ増えるのがなんか気持ち悪い
# 慣れの問題っちゃそうかも知れんが
0930デフォルトの名無しさん (ワッチョイ c1b3-kUw7)
垢版 |
2018/03/30(金) 20:59:28.09ID:l98ixrSj0
>>927
いや、なんか根本的に誤解されてる気がするが
C#とかだと、多分プロパティ作ると自動である程度書いてくれるんだろうけど
その話じゃなくて「C++におけるpublicなGetXX(), SetXX()が暗黙的に作られる(だけ)」、みたいな誤解
(C#やBuilder知らずに議論をぱっと見するとそういう誤解しがち、俺も以前はしてたが)
があるんだよな
説明不足だったかもしれんけどIDEの支援機能の話ではない

というか前スレのリンクにあったブログの
http://ufcpp.net/study/csharp/oo_property.html?key=property#property
これが個人的にはわかりやすかった
0934デフォルトの名無しさん (ブーイモ MMab-q1Nq)
垢版 |
2018/03/30(金) 22:16:15.58ID:8D6duvwPM
お前らの書き込み見ると、プロパティがものすごい大発明なんじゃないかと錯覚するけど
変数のようにかける件を含めても糖衣構文以上のものじゃないだろ。
+=したけりゃそういうプロキシ書けばいい。
0937デフォルトの名無しさん (ワッチョイ 5be7-Cooj)
垢版 |
2018/03/30(金) 22:28:08.90ID:FlBD8vqz0
クソ機能というわけではないが、ものすごく便利というわけでもない
あればあったで使うけど、ないならないで困らないし、言語設計として採用するしないの判断はどっちもあり
C++は採用しない判断をした

その程度の話
0938デフォルトの名無しさん
垢版 |
2018/03/30(金) 23:12:27.73
実体が関数なら漢らしく見た目も関数にしろよwww

見た目が変数なのに処理が走るとか、見た目が割り算なのに文字列連結するとか変態野郎は死にくされやwwwww
0939デフォルトの名無しさん (ワッチョイ c1b3-kUw7)
垢版 |
2018/03/30(金) 23:32:31.76ID:l98ixrSj0
その辺はC++のコンストラクタ・デストラクタに嫌悪感を示すCユーザーが昔よく言ってた台詞と似てるw
「裏で何が起きてるかわかりづらいから嫌だ」、とかね
別に本気でプロパティ推してるわけじゃないが、いざプロキシクラスで代用しようとするとめんどい
ETなんかを仲介するとテンプレートの実体化の数でコンパイラへの負担がデカいし、
メンバ関数の呼び出しをサポートしようとすると継承が必要になるし・・・それなりに問題点はある
0940デフォルトの名無しさん (スフッ Sdb3-VlFK)
垢版 |
2018/03/30(金) 23:40:02.53ID:vpP76l93d
>>934
大発明じゃなくて、もはや常識。C++にはないって聞いて最初驚いたもん
いやまあたしかになくてもいいんだけど、演算子オーバロードはあるのにプロパティはないって変な言語だわ
0944デフォルトの名無しさん (ワッチョイ 2b9a-ePcA)
垢版 |
2018/03/31(土) 00:19:06.77ID:iyPH7JTK0
ダイヤモンド継承使われてるんだっけ
あれ使ったことないな
いらない機能だと思うなら使わないってだけだしプロパティはあった方がらくだと思うけどね
独自拡張でつけてるのもあるし
0948はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b6f-kUw7)
垢版 |
2018/03/31(土) 01:48:24.57ID:nFIfPX7B0
>>947
サブオブジェクトがユニークアドレスを取れなくてもいいことを示す [[no_unique_address]] 属性が C++20 のドラフトに入った。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0840r1.html
オブジェクトがユニークなアドレスを持つ原則を捨てたわけ。

これを踏襲するなら、プロパティのアドレスは取れないってことにして解決するのが自然で、揉める余地はそんなにないと思う。
実際にアドレスは存在しないわけだし、存在しないものを返しようがないじゃん。
0950デフォルトの名無しさん (ワッチョイ 9368-uaFS)
垢版 |
2018/03/31(土) 04:29:43.55ID:O6Ruc86y0
抽象クラス"Super"から派生した子クラス、"A", "B", "C"があったとします。

Super* obj1 = new A();
Super* obj2 = new B();
Super* obj3 = new C();

訳あって動的に作成したインスタンスobj1〜3を一度deleteしたのち
再び同じ子クラスでインスタンスを作成しようと思います。

obj2がクラスBのインスタンスであることが一目で分からない場合に
obj2がクラスBのインスタンスであることを突き止め、一度deleteし、
再度クラスBでインスタンスを作成する方法はあるでしょうか?

ちなみに必死に考えて考えついた方法ですが
クラスA, B, Cにそれぞれ「私はAクラスです」「私はBクラスです」みたいな
文字列を出力する共通メソッドをpublicで作成し、そのメソッドを実行して
帰ってきた文字列からそれがどのクラスのインスタンスか判別が付くのではないかなと思いました。
決してスマートな方法とは言えませんが・・・

もっとスマートな方法はありますか?
0953デフォルトの名無しさん (ワッチョイ 5be7-Cooj)
垢版 |
2018/03/31(土) 06:37:47.25ID:C63IJ9vb0
>>948
単純に &obj.int_prop と書いた時に、この式の型と値をどうするかは難しい問題じゃない?
intの一時オブジェクトへのポインタ、intのぬるぽ、int_propのgetterへの関数メンバポインタ、ill-formed
どれも問題あると思う
0958はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b6f-kUw7)
垢版 |
2018/03/31(土) 09:16:04.32ID:nFIfPX7B0
>>953
一時オブジェクトへのポインタってことにする一択だと思うけどなぁ。

あくまでも「変数に見せかける」、
つまりは、ゲッタの呼出しに構文糖を付けて見かけ上だけ変数 (データメンバ) っぽいって立場を貫かないと、
余計な気を回してもわかり難さが増すだけだよ。
rvalue なのは仕方がない。
0966はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b6f-kUw7)
垢版 |
2018/03/31(土) 09:26:00.49ID:nFIfPX7B0
>>959
変数に見せかける以上は変数と同じようにふるまうことを期待するってのは普通の要求じゃないか?
データメンバに対して操作するテンプレートはプロパティを操作するテンプレートとしても使えて欲しい。
でもまあ充分に「見せかける」ことが出来ないのなら問答無用でエラーになった方がマシではあるかもしれん。
0967デフォルトの名無しさん (ワッチョイ 5be7-Cooj)
垢版 |
2018/03/31(土) 09:41:17.12ID:C63IJ9vb0
objがlvalueなのにobj.int_propがrvalueになるのはまずいと思うんだよなあ
うっかり関数の戻り値でその参照なんか返そうものなら相当わかりにくいバグになる
C#とかはその辺の問題どう解決してるのかしらね
0968デフォルトの名無しさん (ワッチョイ 9334-3URi)
垢版 |
2018/03/31(土) 09:48:31.98ID:Nj0xu+770
property int count {
>>() {return count_ ; } // getter
<<(int cnt) {SetCount(cnt):} // setter
&() {return &count_;} // address getter
};
みたいにアドレス抽出用のメソッドを追加すりゃ良いだけのような気がする
0976デフォルトの名無しさん (ワッチョイ 9334-3URi)
垢版 |
2018/03/31(土) 11:10:24.41ID:Nj0xu+770
using count = int {
() {return count_ ; } // getter
=(int cnt) {SetCount(cnt):} // setter
&() {return &count_;} // address getter
++() {return ++count; } // incrementer
};
予約語増やさないならこんな感じに書けなくもない
0982デフォルトの名無しさん
垢版 |
2018/03/31(土) 13:50:16.75
>>950
クラスA, B, Cにそれぞれ自分自身のインスタンスを生成するstaticメソッドを用意し、
そのstaticメソッドへのポインタを返す共通メソッドを用意する。
0983デフォルトの名無しさん (ワッチョイ d3bd-qsUw)
垢版 |
2018/03/31(土) 14:23:30.31ID:aFk+9CH40
リフレクションがある言語でGUIの画面またはユーザーコントロールを作成する際に
YSIWYGで作ることをやれるIDEを作りたい、というときに、メンバー関数とプロパティーの2種類あったら便利なのや

C++にプロパティー入れたらリフレクションも来るでこれは…

もっとも上記課題解決のための技術は10年も前にWPFの登場で丸ごと過去の技術やがな…
0984デフォルトの名無しさん (ワッチョイ d3bd-qsUw)
垢版 |
2018/03/31(土) 14:30:32.65ID:aFk+9CH40
ていうかWPFのコンバーターの書き方とか、メンバ関数に逆戻りやぞ…
(IValueConverter.Convert(), IValueConverter.ConvertBack(),
 IMultiValueConverter.Conver(), IMultiValueConverter.ConvertBack(), ...
0986デフォルトの名無しさん (ワッチョイ d180-3UCh)
垢版 |
2018/03/31(土) 16:09:17.20ID:D1vbg0pQ0
リフレクションがあれば死なずに済んだ人もいるだろうに。
0992デフォルトの名無しさん (アウアウウー Sa45-HAdz)
垢版 |
2018/04/01(日) 19:11:40.34ID:BG5JJopwa
pimplイデオムはなんとなくわかるけど、俺の友達の友達は編集したい対象を別のクラスに分けてしまうこと?
0999デフォルトの名無しさん
垢版 |
2018/04/02(月) 11:52:25.29
>>998
WYSIWYGのtypoなだけやん
アスペか
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 72日 3時間 44分 41秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


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

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

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

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

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