C++相談室 part136
■ このスレッドは過去ログ倉庫に格納されています
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part135
https://mevius.5ch.net/test/read.cgi/tech/1522495206/
このスレもよろしくね。
【初心者歓迎】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 メンバ関数ポインタ面倒だから出会ったら大体ラムダでラップしてしまう・・・ std::stack や std::queue に begin() end() clear() などが無いのは何故ですか
begin() end() はともかく clear() は有ったほうが良いと思うのですが >>550
機能を絞っていることが彼らコンテナアダプタの唯一の存在価値なので許してあげてください。 template<class ... Args>
void func1(Args ... args) {
outputs(buf, args...);
}
こういう可変長引数のテンプレートの場合に別のファイルで利用する場合には
どう宣言したらいいの?
void func1(???); >>546
> バインダ使うときどうすんだよ
だからバインダ使いまくるとか覚えたての初心者か
って話な
> そりゃあエンドユーザーは滅多にというか一生使わんが
誰もしてない話を勝手に始めて
> そんな話してねえぞ
とか、ギャグかよ w
>>548
>>545の日本語も理解できないのか? >>554
バインダ使えないアホか
マジになって悪かったな 関数型テンプレートってのは、型でもなしに、実態でもない。不思議な存在だ。
型だとすれば、関数プロトタイプのように繰り返して宣言しても問題ないはずだ
が、そうするとエラーになる。実態かというと、これ自体では何のコードも生成しない。
利用するときに始めてコードが生成される。 unsigned long address;
int dt;
*(char *)&address = dt;
コンパイラエラーにはならないが動作しない。ところが
uint8_t *address ;
*address = dt;
これだと動作する。なぜなんだ? =0x20000;を書き忘れていた。あとは上に同じ。 >>559 俺の環境だと上の方でも動作するみたい。
dtの下位8bitがaddressの下位8bitに格納され、addressの上位24bitは不変。
期待通りと思える。 前者はaddressの最初(または最後)の1byteだけを書き換えようとしているけど、それは意図通りなの?
後者は0x20000番地の値を書き換えようとしてるけど、そこは書き換えてもよい領域なの? おっと、未定義動作がらみで「何が起きても不思議じゃない」かも知れん。
リトルエンディアンの機械での素朴な予想レベルでの「期待通り」ね。 uint8_t *address = 0x20000;
がコンパイル通るわけねえだろ質問したいならちゃんとしろ >>546
c++で閉じてるなら関数ポインタ渡すインターフェイスより、
クラスを継承してメソッド実装させるインターフェイスのが普通だろ。
まあcからの関数ならよくあるが。
>>557
単なる型付マクロだっつーの。 マクロで再帰ができるか!!!!!!!1111!1!11!1!1!
前半は同意
あと関数を単に差し替えたい目的ならファンクタとk そういう事言うとプリプロの怖い人達が来るからやめれ
本物の再帰じゃないけど再帰っぽいことはできるらしいぞ スフィ姉を使った技についてスレッドがあってもいいかもしれない。 「マクロ使う奴はアホ」とか言う奴は、goto文も絶対に使わなそう >>563
damecaseの理由がわからない。
void Test::clear(unsigned long baseadd, unsigned int dt, int leng)
{
#if(okcase)
uint8_t * addp = (uint8_t *)baseadd;
for(int i=0; i<leng; ++i){
*addp++ = dt;
}
#endif
#if(damecase)
unsigned long addp = baseadd;
for(int i=0; i<leng; ++i){
*(char *)&addp++ = dt;
}
#endif
} baseadd=0x20000でダンプすると初期値は全部ffが入っている。
leng=100としてdt=0を書き込むとokcaseはOK100バイト0クリアされる。
damecaseは全く反応しない。 >>566
とおるよ。頭の中でCastしてくれたら >おっと、未定義動作がらみで「何が起きても不思議じゃない」かも知れん。
>リトルエンディアンの機械での素朴な予想レベルでの「期待通り」ね。
どうして?
何処が、どういう理由で未定義なの?
リトルエンディアンが問題というのはバイトオーダーが関係するということ?
1バイトのエリアに代入するのにバイトオーダーが関係するはずはないでしょ。どいういうこと?
char*pのpは1バイトデータのポインタ(アドレス)だよ。代入先が1バイトなのでエンディアンは関係ないと思うが、、、 >>579
strict aliasing ruleでググるか死ぬかどっちか選べ >>576
damecaseの*(char *)&addp++ = dt;
&いるぅ? >>579
「ある型へのポインタの値をキャストで別の型へのポインタとして扱い、
その(キャストで得られた)ポインタに対して * 演算子で格納する」行為自体が
規格で未定義になってるかも知れんてこと。確実じゃないんだけど。
キャストの時点でか、*でアクセスしたときか、格納の時か、
どことは言えないけど何となく未定義クサい感じがする。 ↓addpをインクリメントとか頭悪いの?
*(char *)&addp++ = dt;
unsigned longのaddpをインクリメントしてる
addpはポインタじゃないぞ。。。
きっとバカが動作しないといってるのは
落ちるということではない
動作はするが期待どおりの結果にならないということで間違いない
バカはなにがやりたいのか意味不明 unsigned long addr = 12345678;
char* pByte = &addr;
ならいけるハズ
*pByte++ = dt
で leng が sizeof(unsigned long)/sizeof(char) 回までの繰り返しなら
普通に落ちずに動作するハズ
ばああああああああああああああか
しかいないわこのスレ いやねcすら理解できてないヤツラが
c++とか一億年早い
こんなヤツラがc++でコード組んでるかと思うと
ぞっとするわ。。。
シロウトはおとなしくjavaにしときなさい for(int i=0; i<leng; ++i){
((char *)&addp)[i] = dt;
}
バカ向けのコードを書いてやったぞ
コレでバカにとってはすべて解決
コレがなんのことか分からないなら
もう二度とプログラムなんかやらないほうがいい
センスない、むいてない >>586
strict aliasing ruleでググるか死ぬかどっちか選べ ぐぐったぞ
http://d.hatena.ne.jp/yohhoy/20120220/p1
> 文字型。規格ではchar*, signed char*, unsigned char*が別の何かを指すことが特別に許されています。
> これは文字型がメモリ上の任意のaliasになり得ることを意味します。
どうかしたのか
もうねバカばっかりで困るわマジで
池沼しかいないの? このスレ? ちなみになchar以外で変なメモリアドレス(メモリ上有効なアドレスあっても)の位置からcharより大きいサイズの数値を参照すると
memory wrapの切れ目の問題(つまりwrap over)で
bus errorを普通に起こす計算機がある
このスレにいるようなマヌケたち以外にとっては常識だからな 役に立つ情報ありがとう。
でも、半角カナは止めてね。 >&いらん
コンパイルエラーにはならない。ワーニングにもならん。という事実を書いている。
些末なことで糞ほどワーニングやエラー出すC++だ。ワーニングにならんということは正しい
ということか、コンパイラがアフォかさもなくば、何か別の意味があるということになる。
わかるか? お前にも質問の意味が分かるように、そしてちゃんと回答ができるようにもう一度簡単に書いてやろう。
1.正しい
2.コンパイラがアフォ
3.意図とは別の意味になっている。
さあどれが正解だ。答え見ろ。 >584
はあー、未定義かもしれんて? 未定義ならエラーになるだろ。 >>589
理由を書いてごらん。理由がないと回答にならんよ。 >>585
俺はやらないがそこは問題じゃない。
アドレス値が格納されている正数を1ずつ増分しているだけだ。
>>589
お前は>>576のコードをそれに書き換えて正しく動作すると思ってるのか?
>>582>>583で答えが出てるのに、馬鹿には理解できなかったのだろうな。
俺なら恥ずかしすぎて首吊って死ぬわ。
>>594
4. お前がアフォ なにが書いてごらんだ
バカのくせにえらそうに。。。
addpはアドレスじゃない
で、addpはどこのアドレスをさしてる?
で、なにがインクリメントされてる?
バカにはまだわからないらしいわ、、、
int hoge[10]
int boo = 1234;
char* hogeee = (char*)hoge;
ex1
for (int i = 0; i < 10; ++i) {
*((int*)hogeee) = boo;
hogeee += sizeof(int) / sizeof(char);
}
ex2
for (int i = 0; i < 10; ++i) {
((int*)hogeee)[i] = boo;
}
ex1とex2、この違いわかる?
わからないなら、もうすべてを諦めたほうがいい
オレはオマエを諦める >>>582>>583で答えが出てるのに、馬鹿には理解できなかったのだろうな。
>俺なら恥ずかしすぎて首吊って死ぬわ。
ではその理由を書いてごらん。理由がないと回答にならんよ。理由が説明できないなら試験も受からんだろ。 >で、addpはどこのアドレスをさしてる?
>で、なにがインクリメントされてる?
まず、どこをさしているのか?何がインクリメントされているのか答えてごらん。 致命的に脳ミソが足りないのは理解した
アンリカバブルだ お前は解ったふりをしているだけだよ。言葉にして説明できないならな。 ここまで説明して
なんで同じ結果にならないか
分からないならもうムリだからな
向いてない
諦めなさい
なにごとも諦めが肝心 誤魔化して変なコードを追加するな。問題はこれだ。
unsigned long addp = baseadd;
for(int i=0; i<leng; ++i){
*(char *)&addp++ = dt;
}
このコードが何故動作しないか? それを説明するのが問題なのだ。 多分解っている人なら、直ぐに説明できる筈だ。
分からない人は説明できない。罵るのはさらに愚。 同じ結果にならないことはすでに説明してるからな
アドレスを格納する変数を使わないで同じ結果にしたいならどうすばいいか
まで書いた
それに対する補足説明まで書いた
もうこれ以上書くことはない
ムダ >アドレスを格納する変数を使わないで同じ結果にしたいならどうすばいいか
>まで書いた
>それに対する補足説明まで書いた
思わせぶりな回答を書いて欲しいといっているのではない。頭がいいと思ってほしいのかもしれないが
それでは「思わせぶり」でしかない。説明としてきちんとした形式を備えた自信のある回答を書いてごらん。 >>599
え、なんで?
礼儀を知らないおっさんに教えてやることなんて一つもないよ。
ちな>>597で馬鹿呼ばわりしたのは半角でバカバカ言ってるやつのことなんで。 >608
「教えない」習性の人は成長しない。ということは知っているだろ。習性というくらいだから今に始まったこと
ではない。つまり嘗て勉強を始めた時点ですでに成長はとまっているということだ。 俺は無償でお前等に考え方、回答の方法を教えている。教えることが一番勉強になる。
いままでのところ質問にたいして誰も合格点をあげることができるような回答がない。 addpの値として期待されているのがアドレス値X。&addpは、アドレス値Xを格納している変数addpのアドレス値Y(ポインタの値)。代入によって期待されているのが、アドレスXへのdtの値の格納。
XはYではないから、間違い。 というか&addp++の時点でエラーでるなこれ
コンパイラ何使ってるの? >>612
正に初歩的な質問というものは質問自体に間違いが含まれている可能性がある。
そのことに先ず言及できたのは君が初めてだ。素晴らしい。
質問者が正確に質問できた時点で回答は既になされたも同然だといわれるが今回も
例外ではない。これで終わる。 なめたことをしてくれたな。。。
558 名前:デフォルトの名無しさん (ワッチョイ 469d-mzC7)[] 投稿日:2018年06月30日(土) 08時17分40秒24 [朝] ID:p5lz5e260 [2/19] (PC)
コンパイラエラーにはならないが動作しない。
594 名前:デフォルトの名無しさん (ワッチョイ 469d-mzC7)[] 投稿日:2018年06月30日(土) 22時22分23秒05 [夜] ID:p5lz5e260 [8/19] (PC)
コンパイルエラーにはならない。ワーニングにもならん。という事実を書いている。
(ワッチョイ 469d-mzC7) ID:p5lz5e260
オマエを特定した
震えて眠りなさい ことさらに難しいコードを書いて得意がってる馬鹿がうようよ
1行に詰めるのがプロか?
新入社員が読めないようなコード書いて喜んでいるお前らが
バグを仕込む糞プログラマだわ 有能なプログラマはこんな場所で遊んでいない
暇なプログラマっていうか、仕事が無いプログラマ? プログラマにまともなコード書いてもらうも仕事の一つだからな
まともなコード書いてもらうには
こっちもプログラムが分かってないといけない
日本はウンコみたいな低品質低能のプログラマしかいない
いかに踏みとどまらないといけない最低限の一線のラインを越えさせないようにするか
そこが腕のみせどころになる
このスレみれば分かる通り
日本のプログラマは低学歴低能しかいないことがよく分かるハズ
しかも相手がなにを期待してるかも読みとれない
コミュニケーション能力も著しく低い
こんなのに仕事をお願いするほうも大変だからな
可読性が高いコードを書くことは重要だが
それ以外にもイロイロなものが欠落している struct addp_t
{
int& operator ++ (int)
{
return a;
}
int a;
};
int main()
{
addp_t addp;
&addp++;
}
# アンカーつけるのももったいない
# 5chという狭苦しい箱庭の中で目撃したことが
# おまえの全てのようだな
#
# なぜ学歴が出てくるのかよくわからんが
# 高学歴のPGくらいどこにでもいるよ >>591 ありがとう。
(signed/unsigned)char* のポインタで他の型の格納領域にアクセスすることは
規格で許されてるんだね。char* だけ特別扱いってことか。
俺も >>581 の指摘を見て検索して同じページに到達したんだけど、
> 文字型。規格ではchar*, signed char*, unsigned char*が別の何かを指すことが特別に許されています。
> これは文字型がメモリ上の任意のaliasになり得ることを意味します。
の部分を見つけることができなかった。
すると >>558 のコードに未定義動作を引き起こす点はないのだな。 >>619
最近文字コードスレで騒いでいる半角カナの人と同一人物かな? 循環参照があっても無問題で解放するスマポ作ったけど何か質問ある?
http://codepad.org/Hu6vP4qR
いやまあ確かに解放に当たり(塗り潰しのアルゴリズムで)循環を検出するだけでは済まず、
*(this->m_pRef)の解放条件が*thisの解放「だけ」である
ということの証明が必要やったわ;(訂正1)
ここで*thisはsumapo<T>インスタンス、*(this->m_pRef)は*thisが保持しているcounted_refオブジェクト
(T型のインスタンスに参照カウント等を付加してwrapしたもの)。
詳細はsumapo<T>::proveRoot()のコメント参照、
これ以外は訂正は無し >>225
Tのメンバを公開(publicにする)するだけで、
sumapo<T>の定義内のコードからTが保持するsumapo<*>にアクセスできるというなら
>>226の忠言に従ってコードを書いてみると良いんじゃー
一方リフレクションが使えるなら、sumapo<T>::setLandowner()メソッドは不要となる
(これのメソッド>>222において
>あんま使い勝手の良いものにはならんかったorz
>m_pCarやm_pCdrとptrが裏で手を握る必要がある
が指していたブツ。>>222の時点でtest01()が通るコードは書いていたんじゃわ;; >>624訂正
誤: これのメソッド>>222において
正: このsumapo<T>::setLandowner()メソッドが>>222において >>624
なんつうロングパスよ、と思ったが、コードを書いた姿勢だけは褒めてやる。
とはいえ、俺は最近「馬鹿が書いたコードは読む価値がない」と結論を出したので読まないが。
(大体において意味不明な制御を行っており、結果、
解読に時間がかかる割に得る物が全くない)
それ、アルゴリズム説明してみ。
そしてそれが正しく動くとして、何故C++がそれを採用しないかも説明してみ。 クラスTのオブジェクトを参照するスマポsumapo<T>のインスタンスpaが、クラスTのインスタンスaを参照している状況を
pa→[a]
と書くとする。ここで、[a]は、aに参照カウントその他を追加してwrapしたもの。(>>623におけるcounted_refクラスに当たる。
[a]はインスタンスaにつき唯一だが、[a]を参照するsumapo<T>は複数有り得る。
で、paとpbが循環参照しているとは、次のような状況である。
例1: pa→[a], pb→[a]、ここでpbはaのメンバ(paとpbが循環参照
例2: pa→[a], pb→[b], pc→[a]、ここでpbはaのメンバ、pcはbのメンバ(pa、pb、pcが循環参照
例1では[a]がpaとpbから参照されていることになっており(参照カウント2
結果、paの解放時、paのデストラクタで[a]の参照カウントが1になるが0にはならないので、
参照カウントだけに頼るとその時点でpaのデストラクタは[a]が解放されない。(引き続きpbから参照され続ける。
一方、pbの解放条件は、[a]の解放である(∵pbがaのメンバであるため)。というわけで解放がデッドロックに陥る。
しかしpa→[a]==>pb→[a]、という参照関係(paのみが参照関係の根である)をpaの解放時に把握できていれば、
paの解放で[a](とそのメンバpb)を解放して無問題であることがワカル
この参照関係のうち、「==>」をpb.setLandowner(&pa)とすることで設定し、-- (1)
paの解放時に全体として参照関係の根がpa自身「のみ」であることを証明する -- (2)
ことにより、安全に解放が行える。((1)と(2)がshared_ptr<T>にたいしsumapo<T>で追加になった要素
標準ライブラリに入っていないのは、(2)の証明コストがイマイチかかるからだろうJK >>627
pa→[a]==>pb→[a]、という参照関係において、pbの地権者はpa。
なお、ソースコードコメント内には「立地」という言葉も出てくるが、pb立地が[a]。 >>628
まずそういうのはインタフェースを揃えろ。
(俺はスマポは使ったことがないが、俺の理解の範囲では)
お前はスマポの仕様を勘違いしている。
オブジェクト側をラップするのはソースコードの全面的書き換えが必要になるだろ。
だからそんなことはしてない。
スマポも普通のクラスでしかなく、スマポ側に制御に必要な情報全てを持っている。
オブジェクトと癒着はしてないんだよ。
> 一般的な実装では、 std::shared_ptr は2つのポインタを保持します。
> 格納されたポインタ (get() で返されるもの)
> 制御ブロックへのポインタ
> https://ja.cppreference.com/w/cpp/memory/shared_ptr
が、まあ、言いたいことは分かるし、ここは本質的には重要ではないので、
今回はお前のオレオレ用語のままでいい。
さて本題だが、(1)は誰が管理するんだ?
プログラマが明示的に手動で管理するのなら、現行のshared_ptr/weak_ptrと手間が変わらない。
だから自動的に出来る必要があるが、これは出来るのか?
具体的に言えば、お前が言っている「参照関係の根」をshared_ptrで、
「pa→[a]==>pb→[a]、という参照関係」のpbをweak_ptrで実装しろというのが現行の仕様だが、
これに対して何が便利になってるんだ? >>631
それはC++的には意味がないだろ。
結局、現行の仕様が何故そうなのかを理解出来ない馬鹿が吠えただけだろ。
まあJavaScripterなんて所詮こんなもんだが。
「スクリプト言語使いをプログラマと呼ぶな」というのは、多少は当たってる。
彼らが書けるのは「動けばいい」程度のコードまででしかない。 pythonしか使えないやつが作った特定のサイトから画像を大量にダウンロードするだけのツールが
クソ遅いうえにメモリ4GBも使ってたので頭pythonってクソだなって思った 使える言語を聞かれてC++含めて複数答えたら
確かPHPあたりで「それプログラムじゃなくてスクリプトだよね」って言われたことはあるな
そこまで上から目線で突っ込むことか?とイラッとした記憶があるな いるよね、やたら偉そうに
自分を大きく見せようとするやつ c++,c,sh,bash,zsh,csh,tch,screen,glsl,php... >>635
それはその使えない奴の問題だろ
言語の問題とプログラム固有の問題の切り分けもできないアホなら黙っとけ >>636
PHPは言語自体の性能が低いので使いこなすのはかなり難しい。
Javascriptも同じ。
つまり、楽に性能を出せるC++に乗り換えた方がいい。 >>635
その程度のもの、文句言うなら自分で作れや。 >>635
wgetはサイトから再帰ありで指定のファイル取得できるよ。 お前らは知らないからそんな呑気なことが言える。
実際、JavaScriptはマジでゴミコードの山だ。
商用サイトでも糞重いしリークしまくりだ。
PHPはJavaScriptに比べ露出は低いが、OSSを見る限りやはり糞だ。
とはいえコードの質はPHP>>>JavaScriptだが。
DB接続があり、初心者にもコードの質が見える所が違うのだろう。
PHPerは虐げられているが、その分勘違い野郎は少ない。
最悪なのはJavaScripterだ。
一般のスクリプト言語(Python, Ruby含む)とC++等のプログラミング言語の違いは、
前者は圧倒的に「一回動作させれば終わり」な使われ方をすること。
だから、メモリリーク?何それ美味しいの?
コードが美しい?そんなことよりちゃっちゃと書いて実行させた方が早いでしょ、となる。
長期的保守の必要がない使い捨てコードばかり書いているから、
保守に耐える品質のコードを書けるようにならないだけ。
だから正確には、
「保守に耐える品質のコードを書けない馬鹿をプログラマと呼ぶな」であり、
それがほぼ「スクリプト言語しか使えない馬鹿」と一致する、というだけ。
一般的に(JavaScript除く)スクリプト言語は圧倒的に遅く、
味見ではなくガチならC/C++に書き換えるケースも多々発生する、というのも
これを後押ししている。
とはいえ、JavaScripterやPHPerみたいな馬鹿揃いでも
何とかるように出来ているのがWeb系()の凄いところ。
あれは学ぶ価値あると思うぞ。
色々C++では無駄に難しく考えすぎていたな、ということに気づかされるから。
今更導入されたラムダもしかり。あれは手抜きにはかなり便利だ。
コルーチンもそうでしょ。無しで同じ事をやろうとするとそれなりにエグくなる。 >>630
>さて本題だが、(1)は誰が管理するんだ?
いやすまん>>628の最後の一文ではそれをすっかり失念してたわ;;
標準ライブラリにsumapo<T>が入りえない最大の理由は、(1)の管理を手動でせねばならない、という使い勝手の悪さのが最大の理由
(>>222で書いた「使い勝手の悪さ」のことじゃわ
これを自動化するにはリフレクションが要る
それはそうとして、
1. オブジェクト側をラップする
というのと、
2. オブジェクトと癒着
は別の話じゃわ;
1は標準的なshared_ptrの実装ではそうなっている(counted_refという名前のクラスは実在の実装から拝借したものであって漏れの独創ではない
だいたい
>[a]はインスタンスaにつき唯一だが、[a]を参照するsumapo<T>は複数有り得る。 (>>628)
なので、参照カウンタを所有するのはオブジェクト側をラップした[a]以外ありえんのじゃわ
[a]を参照する全てのsumapo<T>は、[a]より長く生き長らえることは無い
2はsumapo<T>にとっては必要だが、shared_ptrには要らん ちなご興味のお有りの方にカミングアウトすると、>>623のコードのSUMAPO_ONマクロを0にすると
sumapo<T>は普通のshared_ptr<T>になりぬ
動作やコードを比べて見られるのも一興かと、 ちな(2)、
>「pa→[a]==>pb→[a]、という参照関係」のpbをweak_ptrで実装しろというのが現行の仕様だが(>>630)
これは、ちげう
weak_ptrを使って[a]の解放の根がpaのみであることを証明できるのは、実際に[a]を解放したときに限られるが
もし[a]の解放の根がpaだけではないと反証されたら[a]を解放してしまった後で藻前責任とれんの…?
一方sumapo<T>はそんな迂闊なことはせず、解放「前」に証明を試みるんである >>639
だから頭pythonだと言ったろ
俺がこれ遅くねえかって言ったら頭ひねった結果理由がわからんと言ってきた
俺が作り直してやったら速度が倍増したけどHTTPリクエストするだけでメモリを数十MB使われたからPythonもクソだわ ■ このスレッドは過去ログ倉庫に格納されています