X



C++相談室 part131 [無断転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 3b96-ov1m)
垢版 |
2017/07/29(土) 11:28:28.97ID:o30VDF4g0
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part130
http://mevius.2ch.net/test/read.cgi/tech/1490917669/

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

■長いソースを貼るときはここへ。■
 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
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0003デフォルトの名無しさん (ワッチョイ 6a90-qWRz)
垢版 |
2017/07/29(土) 12:46:26.94ID:Gw88XuqA0
2 名前:デフォルトの名無しさん (ワッチョイ bf54-lR6P)[sage] 投稿日:2017/03/31(金) 16:52:18.52 ID:CoeIAoH10
STLつかうと一気に実行ファイルサイズが10倍に?!

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

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

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

#include <stdafx.h>
後死ね。

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

---- テンプレ ここまで ----
0005デフォルトの名無しさん (ワッチョイ 738e-PRKf)
垢版 |
2017/07/29(土) 17:57:29.77ID:mj0H/MXI0
>>1
乙TL
0008デフォルトの名無しさん (ワッチョイ 3bb4-749T)
垢版 |
2017/07/30(日) 06:50:23.38ID:qWNYkf/a0
やめとけやめとけ
Cでリスト構造あたりがすらすら書けるようになったならC#にしとけ。

生産性あがらずそっぽ向かれてるのに、
ムーブコンストラクタとか、コード増えて、さらに生産性低下。
完全にオナニー規格で、自分でとどめ刺した。
まるで民進党の蓮ポ
0013デフォルトの名無しさん (ワッチョイ 3bb4-749T)
垢版 |
2017/07/30(日) 10:57:13.10ID:qWNYkf/a0
プログラミング言語C++と言いたいところだが、C++11で止まってるとこらがもうね。
vol3まで原書と邦訳つきあってきたけど、もう気力も失せたわ。
可能性を期待してたの90年代前半 ANSI時代までだな。
電話帳より分厚い言語解説本て。多分完全理解した頃エンジニア生命終わってるわ
0014デフォルトの名無しさん (ワッチョイ 6a9f-ns/O)
垢版 |
2017/07/30(日) 11:11:05.70ID:HMlHttTQ0
最新の情報はテメェで調べりゃいいんでねぇの?
まず基本という基礎固めが重要だろ
Cプログラマでやってきた奴に総てを全うさせるのは荷がおもすぎるだろ
0024デフォルトの名無しさん (ワッチョイ 7357-PRKf)
垢版 |
2017/08/02(水) 08:31:16.93ID:j5kUV6O90
でもC/C++は互換性をかなり重視してくれているから、時系列に沿って勉強しても無駄ではない気がする。
っていうか、いきなりC++14勉強するのは辛いんじゃねって気がする。
0028デフォルトの名無しさん (ワッチョイ a311-lyvM)
垢版 |
2017/08/02(水) 11:37:56.91ID:Mxrfj49o0
Effective C++ 第3版持っている人に質問
33項に書いてある「仕事を送る関数」なんだが
private継承しているのに、なんで派生クラスで基底クラスの関数を呼び出せるの?
inline関数ってところが関係しているのだろうか
0036はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a15-ZO1u)
垢版 |
2017/08/02(水) 23:32:57.07ID:84D7BovY0
>>34
private 継承している場合は基底にキャストできない。
スライシングを起こしたくない場合には private 継承した上で
一部のメンバを using で公開するというようなテクニックもある。
0041デフォルトの名無しさん (ブーイモ MMc1-mf2b)
垢版 |
2017/08/03(木) 12:34:54.88ID:NztkOdZ3M
セマンティクス的には、
public継承はis-a関係
private継承はhas-a関係
0048デフォルトの名無しさん (アウアウエー Sa2b-690I)
垢版 |
2017/08/06(日) 11:38:12.92ID:57DyNeACa
>>46
あなたのその文字も立派な個人資産。
ここに書いた瞬間2chに帰属するが。
0052デフォルトの名無しさん (ワッチョイ 49ad-mf2b)
垢版 |
2017/08/06(日) 20:55:29.92ID:BHhmDaJC0
>>50
privateをpublicでdefineするやつじゃ?
0058デフォルトの名無しさん (オッペケ Sr35-6sbn)
垢版 |
2017/08/08(火) 08:21:06.59ID:RV4q7wpsr
>>57
うむ、こんなところだろう
1.既存のクラスに普通に手入れている
2.それは違うと>>53で言っているのに投下されるアスペなレス
3.privateな変数にアクセスするかと思いきや、privateな変数を出力するprivateな関数を呼び出すという意味の無い構成
4.deleteを使用するUNKOなコード
5.newを使用する残念なコード
6.コードへのリンクを投下するのでなくクソスレを経由するクソレス
7.例外安全でない
8.非staticにする必要性が感じられない
9.「(hoge->*(hoge->g()))();」というブザマな呼び出し方
0061C言語ますたー《ますたー軍団(常時募集)の長》 ◆oa6k//3vOQ (ラクッペ MMaf-bbbG)
垢版 |
2017/08/09(水) 18:43:38.11ID:s1XZJ5NhM
読んでないけどg()は関数ポインタを返す関数?
設計からしてダメだろ
0066デフォルトの名無しさん (ワッチョイ 9ac5-OW3C)
垢版 |
2017/08/11(金) 13:08:18.43ID:rA3728Ge0
C++の場合クラス(およびその基底クラス)内のメンバは全部ヘッダファイルを辿っていけばワカルのだから
まず全く同じ内容のヘッダファイルのコピーを作り、
ファイル名を適当に変えて、多重インクルード箇所もコピーしたもので閉じるように変更して、
privateやprotectedを全部publicにして、
クラスの名前をFoo→Foo2とか改変して、
仮想関数は適当に空の定義でもつけて、
 ((Foo2*)p)->(Fooのデータメンバ)
式にキャストしてアクセスすればデータメンバと仮想関数については問題なくアクセスできる

(ODR違反は都市伝説なので事実上これで動く
 だいたいprivate破りを意図している時点で実コードレベルで影響しない規約とか気にしても仕方が無い
0067デフォルトの名無しさん (ワッチョイ 9ac5-OW3C)
垢版 |
2017/08/11(金) 13:10:51.21ID:rA3728Ge0
Foo2の仮想関数が空ではないか、というのは動作上問題にならない
vtableのしくみがわかっているならワカル以下略

一方非仮想関数の方はちょっとうまい方法が思いつかない…
private属性のメンバ関数のアドレスがとれれば勝つるのだが
0068デフォルトの名無しさん (ワッチョイ 5b2b-7NHe)
垢版 |
2017/08/11(金) 15:28:00.96ID:CTzRRQx/0
class Base {
public:
Base() {};
virtual void func() {};
};

class Sub: public Base {
public:
Sub() {};
virtual void func() {};
};

Sub a();
std::vector<Base> b;
b.push_back(a);
b[0].func();
これだと継承前のBaseのfuncが実行されてSubのfuncが実行されないんですが
Subのfuncを実行するにはどうしたらいいですか
0070デフォルトの名無しさん (ワッチョイ 1a49-d9WE)
垢版 |
2017/08/11(金) 15:47:46.79ID:L0uHlCp20
>>68
そのコード本当に動く?
本質じゃなくて申し訳ないが、そのまま追試出来るコードじゃないと…

ちなみに質問の回答はスライスな。
0072デフォルトの名無しさん (ワッチョイ 1a49-d9WE)
垢版 |
2017/08/11(金) 16:00:31.30ID:L0uHlCp20
コピコンは省略可能だよー。
0084デフォルトの名無しさん (ワッチョイ 7665-KsLg)
垢版 |
2017/08/12(土) 16:56:14.99ID:srjAo6Ap0
質問です。

宣言は、全ての要素に対して必要なのですか?

n = a+b:

という行があるとすると、

#include <n>
#include <a>
#include <b>

が必要なのですか?
とても初心者なので、なにとぞ教えてください。
お願いします。
0087デフォルトの名無しさん (ワッチョイ 9ab1-KsLg)
垢版 |
2017/08/12(土) 17:21:05.88ID:Yn7dYYpz0
>84

#include
というのは、外部にあるファイルを読み込め
という命令なので、変数の宣言ではありません。

#include <a>

というのは、aというファイルを読み込めという
命令です。
n=a+b
という場合には、この式の前に、n, a, bという
変数の型を宣言する必要があります。
全てが整数ならば、
int a, b, n;
単精度実数ならば
float a, b, n;
と、倍精度実数ならば、
double a, b, n;
と書きます。
と変数の型を宣言します。

このことは、基本の基本なので、解説書の最初に書いてあるはずです。
解説書をよく読んで、その上で分からないことを
質問しましょう
008884 (ワッチョイ 7665-KsLg)
垢版 |
2017/08/12(土) 17:27:53.44ID:srjAo6Ap0
>>85-87
googleだけの独学なので、とても勉強になりました。

とても、ありがとうございました。
0094デフォルトの名無しさん (オッペケ Srbb-iw66)
垢版 |
2017/08/12(土) 21:29:22.94ID:B05a5g6/r
× #include <a>というのは、aというファイルを読み込めという命令
○ #include <a>というのは、aというヘッダーを読み込めという命令
○ #include <a>というのは、#include <a>をaというヘッダーの内容で置き換えろという命令
0097デフォルトの名無しさん (ワッチョイ 1a1b-8zUn)
垢版 |
2017/08/12(土) 23:26:56.30ID:IKUtZym10
仕様だとヘッダーとソースファイルは区別されてるみたいだけど
#includeはヘッダーとソースファイルのどちらも扱うから
二つを纏めてファイルと呼称しているとしたら>>94は間違いじゃないの?
0098デフォルトの名無しさん (ワッチョイ a30d-wsxY)
垢版 |
2017/08/13(日) 06:37:43.35ID:/9jKf3580
「C++の#includeがファイルを読み込むとは限らない」
という説明を何かで読んだ記憶がある。

例えばソースに #include <hoge.h> と書いてあっても
hoge.h というファイルの実体は存在しなくて、
コンパイラが内部的なスイッチとして使っても構わない、みたいな話。
実際にそういう動作をするコンパイラは知らんけど。
0102はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5a15-aEKd)
垢版 |
2017/08/14(月) 00:14:24.38ID:N3oVMbyu0
軸がわからないと自分が何をわかってないかすらわからないからクソみてぇな思い込みで検索して見当違いの方向に突っ込んでしまうから、
そうなってから質問しても質問が見当違いすぎて回答しようがないことはよくある。
0103デフォルトの名無しさん (ワッチョイ 336d-gaVt)
垢版 |
2017/08/15(火) 18:55:44.72ID:Q70B1fQS0
>>102
いっちょコンパイラを書いてやろうと思っているんだが何をやっていいかわからない…
手元の教科書は必死に正規表現やらチューリングマシンやらを追求している…
これってコンパイラ本だと思って買ったのだが、どうも本を間違えてしまったらしい
軸がわからないと悲惨ですね
0110デフォルトの名無しさん (ワッチョイ 3323-Eq/3)
垢版 |
2017/08/15(火) 20:03:18.47ID:BftRsONU0
>>103
yacc, lex (または bison, flex) とかは知ってる?
使うと構文解析が楽になるよ。
0111デフォルトの名無しさん (ワッチョイ 5baa-ixYY)
垢版 |
2017/08/15(火) 21:06:58.79ID:K8T9Hr6g0
>>108
単にstd::function使えって話じゃねーの?
0113デフォルトの名無しさん (ワッチョイ 5baa-ixYY)
垢版 |
2017/08/15(火) 21:38:42.75ID:K8T9Hr6g0
>>112
typedef bool(*Fun)();
にキャプチャしたデータを置いとく場所が無いんだからいつまでまっても実現しないよ
そういうC言語のAPIにはvoid*でユーザーデータ渡せて引数で取得できるようになってるはずなんだからそれに規則性があるのなら(例えば最初の引数がユーザーデータになってるとか)テンプレートでラッパー書くの簡単でしょ
0114デフォルトの名無しさん (ワッチョイ 1a49-d9WE)
垢版 |
2017/08/15(火) 21:53:17.41ID:+1mFvI7w0
>>105
できるも何も型が違うからエラーでしょ。
ラムダ型のオブジェクトはautoでしか受けられない。
0116デフォルトの名無しさん (ワッチョイ 5baa-uFAa)
垢版 |
2017/08/15(火) 23:55:50.09ID:K8T9Hr6g0
>>115
キャプチャしないラムダ式は関数ポインタに変換出来るだけ。束縛じゃない。
0120デフォルトの名無しさん (ブーイモ MMba-d9WE)
垢版 |
2017/08/16(水) 12:58:58.53ID:+9oABFYpM
もういない宣言出てるけど、スレッドローカルでやられても困るだけだと思う。
0121デフォルトの名無しさん (ワッチョイ 9ac5-OW3C)
垢版 |
2017/08/16(水) 14:20:28.94ID:5HjXxUQN0
>そしてそれをC言語の関数ポインタと互換性がある形で実装可能か考えてみるといい。
もともとC言語はλ式とか、(束縛変数がクラスのこともありえるが)クラスを構文でサポートしていないのだから
「C言語の関数ポインタと互換性がある形」と逝っただけでは何を指しているのか不明確にならざるおえない
呼び出し側がいかに煩雑な記述になろうとも、動けば互換性があるという立場をとってみるテスト、

束縛変数も毎回引数渡しすればC言語の関数ポインタと互換にできるのでは…
もはやクロージャでも何でも無いが一応動く
0122デフォルトの名無しさん (オッペケ Srbb-iw66)
垢版 |
2017/08/16(水) 14:36:46.12ID:53LlWcImr
>>121
>もはやクロージャでも何でも無いが一応動く
ちなみにどうでもいいことだがラムダ式から取得した関数ポインターはC++リンケージ型なのでC関数に渡してコンパイルが通る保証が無い
0124デフォルトの名無しさん (オッペケ Srbb-iw66)
垢版 |
2017/08/16(水) 15:34:56.89ID:53LlWcImr
>>123
関数名だけではない
extern "C" using CF = void(); と
using CPPF = void(); は似て非なる関数型
この二つはオーバーロード可能で互換性も無い
恐らくマングリのみならず関数呼び出し規約の違いを許容する思想
ただこれを正しく実装したコンパイラーを見たことは無い
0126デフォルトの名無しさん (ワッチョイ 4eaa-Kd4M)
垢版 |
2017/08/16(水) 15:59:31.27ID:CMzvSoma0
a = 0
2.times do
b = 1
3.times do
p a, b
end
end

「Rubyのしくみ」に書いてあるけど、Rubyは、Cで作ってあり、
do 〜 end のブロックは、クロージャの実装。
ラムダ・Proc も、ほとんど同じ

子のブロック内で、変数が見つからなければ、
外のスコープ(先祖の方向)へ遡って、探しに行く
0127デフォルトの名無しさん (オッペケ Srbb-iw66)
垢版 |
2017/08/16(水) 16:07:27.94ID:53LlWcImr
>>125
そのとおり
規格では別の型と規定されている
atexitなど関数ポインターを渡す関数ではCリンケージの関数ポインターを渡すかC++リンケージの関数ポインターを渡すかで
C版atexitとC++版atexitのオーバーロード呼び分けができることになっている

clang/G++は意図的に規格に従っていないというのが痛説
Visual C++は規格より自分が正しいという意味不明な見解
0132デフォルトの名無しさん (ワッチョイ b632-iGin)
垢版 |
2017/08/16(水) 18:35:35.31ID:lmNMFTOO0
そういうCのインタフェースにはたいてい関数ポインタの他にユーザデータを指定できるようになっててそこにthisなんかを入れておくものだが、 >>105 は関数オブジェクトを関数ポインタだけに変換したいと言っているわけか……

コードを動的に生成すれば不可能ではないだろうけど、色々トレードオフがあるから言語の機能にするのはどうだろうね。
ライブラリを作っても良いんだろうけど、おとなしく定石に従っておいた方が良いよ
0133デフォルトの名無しさん (ワッチョイ 5baa-uFAa)
垢版 |
2017/08/16(水) 22:53:19.96ID:VOMe5hsv0
>>132
動的にコードを生成したとしてもどこにその生成したコードを置くのか、それをどうやって解放するのかが問題になるね。だったらコード生成してもしなくても同じ事。
0134デフォルトの名無しさん (ワッチョイ b632-iGin)
垢版 |
2017/08/16(水) 23:14:18.00ID:lmNMFTOO0
>>133
> 動的にコードを生成したとしてもどこにその生成したコードを置くのか、それをどうやって解放するのかが問題になるね。
そうだね。

> だったらコード生成してもしなくても同じ事。
同じではないね。
0135デフォルトの名無しさん (ワッチョイ 5baa-uFAa)
垢版 |
2017/08/16(水) 23:47:46.20ID:VOMe5hsv0
>>134
言い方が悪かったかな?
「どこにその生成したコードを置くのか、それをどうやって解放するのか」が解決するのであれば、コードを動的に生成しなくてもキャプチャしたデータ自体をそこに置けばいいだけ。
0136デフォルトの名無しさん (ワッチョイ 5b32-eSaa)
垢版 |
2017/08/17(木) 02:40:17.43ID:PxJqlDv90
>>135
キャプチャしたデータ(またはそれへのポインタ)をコード以外のどこかに置くとして、それは関数ポインタ一つ(コードへのポインタをとるCのAPIにそのまま渡せる形)にはならないだろ。
何の話をしてるんだ?
0148デフォルトの名無しさん (スッップ Sdb3-2DsO)
垢版 |
2017/08/17(木) 18:53:03.48ID:p6ewHhXhd
理解しようという気持ちも理解する力もないのに質問すんなよ…
mfc ではやってたっけ?やってないんじゃないの?
というツッコミならともかく、
>>141>>142なんて思考力が虫以下だろ…どこのセグメントとかアホか
Win32 は古来よりフラットなリニアアドレスモデルだろ。
VirtualAlloc も知らなそうだし。
0151デフォルトの名無しさん (ワッチョイ 994d-jLVh)
垢版 |
2017/08/17(木) 19:47:30.76ID:6E9r52D/0
>>148
だいたいあなたがMFCの頃から動的コード生成でやってたって言い出したんですよ。
だから私はMFCにあるのはインスタンスの動的生成だという指摘をしたんですよ。
そしたら、再度あなたがATLのような実装があるんだと言ったんですよ。
ソース見ろとか言う人までいるから、どのソースか聞いたらキレて、なんで言い出したおまえまでキレんだよ。アル中か?
ここは相談室だぞ。
0152デフォルトの名無しさん (ワッチョイ 19cd-eViR)
垢版 |
2017/08/18(金) 07:51:05.48ID:mSCO2cNh0
C++を身に着けたいと思いつつも、自分でC++で何かを作るモチベーションが湧かなくって、数千行程度のC++プログラムの写経でもしようかと思ってるのですがおすすめありませんか?

SDLを使ったゲームとか興味を持ちやすくて写経しやすいかと思ってgithubとか漁ってるのですがなかなかいいのが見つからなくて悩み中です
QtみたいなC++を拡張してるのは勘弁です
0163デフォルトの名無しさん (ワッチョイ 931b-sCIl)
垢版 |
2017/08/19(土) 15:54:33.73ID:/pRbJcl80
>>160
・OSSライセンスを適用する
・有名処のOSSホスティングサービスで公開する
・ソフトウェアの目的と利用方法を理解しやすいようにドキュメント化する
・CPUやメモリなどのリソースを効率よく使用する
・汎用性が考慮された作りにする
・特殊化も考慮された作りにする
・バクが無いようにする
・こまめに更新し継続して改善されている事をアピールする

このくらいやれば他人に使わせる気満々のコードに見える
0164デフォルトの名無しさん (ワッチョイ 616d-MHKs)
垢版 |
2017/08/19(土) 16:03:12.53ID:w9JmRxmV0
>>163
なるほど

でも >>158 をやる気満々で公開しようと思ってもアピール点が見つからないんです
「C++ だけで簡潔する多桁演算」というのは訴求ポイントとしてはどうなんでしょうか
誰かやってるかどうかはさておき、魅力的がどうかは気になります
0166デフォルトの名無しさん (ワッチョイ 5ba6-T01/)
垢版 |
2017/08/19(土) 18:29:45.94ID:xqVOePdU0
右辺値参照がやっぱりわからん
template<class T>
void test(T&& t) {
f(std::forward<T>(t))
}
このstd::forward<T>(t)は左辺値なの?
名前持つt(左辺値)を転送してるから左辺値でいい?
f()はf(T&)を呼ぶであってる?
0171デフォルトの名無しさん (ワッチョイ d34b-uBYh)
垢版 |
2017/08/19(土) 20:21:54.83ID:3jYO+FxO0
>>166
それはforwarding referenceという機能を使ったperfect forwardingというテクニックで
右辺値参照を理解した先にあるものだ
右辺値参照の勉強中なら今は気にせず忘れておくもので
右辺値参照を理解してるなら右辺値参照とは別物として新たに勉強しなくてはならないものだ
0172166 (ワッチョイ 5ba6-T01/)
垢版 |
2017/08/19(土) 20:37:29.73ID:xqVOePdU0
>>170
やっぱり右辺値参照へのキャストか
左辺値参照ぽい動きなんで質問してみた。ありがと
>>171
俺にはforwardはまだ早いってことスね
まずforwardなしでもう少し考えてみるわ
0173デフォルトの名無しさん (ワッチョイ 93aa-jLVh)
垢版 |
2017/08/19(土) 22:34:08.72ID:s/7RraD70
>>166
もとの test という関数が右辺値、左辺値どっちでも引数に取れる、そして std::forward でそのまま転送している
f がとる引数の型は test がとった引数と同じ。
つまり答えは実引数次第だ。
0180デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/20(日) 14:59:30.48ID:sGdhnhOm0
トーバル君は単に自分のニーズに最適な言語はCと言っているだけで
他の言語がどうなろうと知ったこっちゃないでしょ
それを周りのアフォどもが色々押しつけに来ることに時折ブチキレるだけで
0181デフォルトの名無しさん (ワッチョイ 994d-jLVh)
垢版 |
2017/08/20(日) 15:24:25.28ID:4v9fraNU0
スキルの差によって読める、読めないの差がありすぎてもはや言語としての体をなしていない。
コンパイラによってもコンパイルできる、できないの差も激しい。大きなプロジェクトを管理する側はキレて当然。
癌のように誰も望んでない仕様拡張が続けられている。
0184デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/20(日) 16:05:02.55ID:sGdhnhOm0
>>181
誰も望んでいない仕様拡張?
autoは? range-based-forは? R"リテラルは?
initializer_listは? ラムダ式は? template parameter packは?
<random>は? shared_ptrは? <regex>は? <system_error>は?
0185デフォルトの名無しさん (ワッチョイ 817f-jLVh)
垢版 |
2017/08/20(日) 16:10:46.08ID:H9uxxda60
>>181
ふつう、どの規格を使うかとか、場合によってはどの開発環境のどのバージョンを使うかまで
プロジェクトで規定するものだろう。
決めたことと違うコードを混ぜようとするメンバーがいたりしたらキレてもいいが。
0186はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1315-oL0b)
垢版 |
2017/08/20(日) 16:14:30.65ID:ikEvsZIR0
少なくとも個別の提案はプログラムが読みやすくなるし楽になる方向なんよね。
だからまぁ、 >>181 の言い分にある「誰も望んでない」という言説には違和感があるな。
嫌だという人がいるのはわからんでもないが、
勝手にユーザ全体の意見を代表してしまうやつは単にクズなので、
誰も耳をかさないよ。
0188デフォルトの名無しさん (ワッチョイ 8123-jLVh)
垢版 |
2017/08/20(日) 16:41:18.86ID:gPEOCHBy0
>>181
> スキルの差によって読める、読めないの差がありすぎてもはや言語としての体をなしていない。
日本語(自然言語)でも同じだろ。
馬鹿と天才でおなじ結果(コード)にしかならない、という方が問題だ。
それが天才側に揃っていれば理想的だが、実際は馬鹿側に揃うわけだし。

>>186
> 少なくとも個別の提案はプログラムが読みやすくなるし楽になる方向なんよね。
これは同意だが、問題は一部が本質的なところ(骨組み)まで変えられる程な点だろ。
現実的には>>185のようにプロジェクトリーダーが何を使うか厳密に決めればいい話で、
Linuxの場合はCだ、って言うんだから他の奴が布教しなければ丸く収まる話だ。

とはいえ通常製品の場合は「何でも出来る=何にも使えない」ではあるのだが、
C++の場合は半製品(製品を作る道具)ではあるし、
実際、機能はあった方が便利だったりするので、(使う側がどこまで使うか決めればいいだけ)
プロジェクトリーダーがしっかりしていれば、現在の貪欲な拡張方向も悪くない。
「全部の機能を使わないといけない」と信じている馬鹿と初心者は混乱するだろうけどね。
0190デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/20(日) 18:05:26.65ID:sGdhnhOm0
>>188
馬鹿側に揃えるポリシーを見事なまでにやってのけた言語と言えば。。。
IDENTIFICATION DIVISION.
再帰できない、ダミーセクションできない、動的記憶ない、オラこんな村いやだ♪

で、その結果なにが起きたか。。。
エロパブの嬢がどこかで見覚えのある顔だと思ったら、うわあ(kwskはガン無視します)
0191デフォルトの名無しさん (ワッチョイ 8123-jLVh)
垢版 |
2017/08/20(日) 18:47:40.43ID:gPEOCHBy0
>>190
COBOLの事か?だとするとあれは試行錯誤の結果だ。非難されるべき物でもない。
そもそもあの時代の言語は再帰出来ないのも多かった。Fortran77もBASICもそうだろ。

俺が思うに、第一世代言語(C以前)は「プログラミングとはこうあるべき」、
つまり、プログラミング自体を規定しようとしている。

COBOL:自然言語の仕様書がそのままソースになるべき
C:所詮アセンブラ
smalltalk:オブジェクト間のメッセージングこそが真の未来
Lisp:ラムダこそ真理
BASIC:馬鹿でも使えることが重要
Fortran:所詮計算機だろ

で、C以外が全部糞だったのでCで統一された。
当然第二世代言語はCの後継で、C++/Java/C#のような面子になる。
とはいえ、COBOLの方向性は間違いでもないよ。
ソース自体が可読性のあるドキュメントであるべき、ってのは今でも理想だろ。
0192デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/20(日) 19:00:58.06ID:sGdhnhOm0
>>191
BASICは再帰できたぞ
FORTRANを実装できないマシン用に作られた縮小版で、
でもFORTRANより新しく作られた分、改良が図られていた
そのうちの、すべての行に行番号というのが賛否両論だった
当時初心者だった俺にとってはあれがラベルの概念の入り口になってくれたが
1桁KBのパーコンで構造化などという寝ぼけた老害たちがGOTOがどうたら言ってた
あ、嫁が呼んでるw じゃあな
0194デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/20(日) 19:39:46.63ID:sGdhnhOm0
メインフレーム用の一部の言語が再帰できないのは
当時のS/370がスタックのないアーキテクチャだったからだ
逆にBASICが実装された多くのPCではCPがにスタックを持っていた
なので全変数がグローバルなのでやりにくいができるにはできた
俺もBASICでの再帰は大道芸の域を出ることがなく
実用上の手の内に入ったのはCからだった
0195デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/20(日) 19:45:06.60ID:sGdhnhOm0
s/CP/CPU/

CPじゃ制御プログラムだねw
0196デフォルトの名無しさん (ワッチョイ 8123-jLVh)
垢版 |
2017/08/20(日) 21:07:10.22ID:gPEOCHBy0
>>194
> 全変数がグローバルなのでやりにくいができるにはできた
これは一般的には出来るとは言わない。
再帰が出来る=関数ローカルの変数が定義出来る、だよ。
変数共通で突っ込むのは今なら「再入」と呼ばれる物に近く、
これは言語として云々ではなく、対応する構造にするかどうかだけ。

また、CPUのスタック操作命令は高速化に寄与するだけであって、
無ければエミュレートすればいいだけだろ。
その論法だとスタック操作命令がないCPUではC言語を実装出来ないことになるが、
これはないだろ。
(S/370上のC言語実装も無いとは思えないし)
0197デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/20(日) 21:48:19.43ID:sGdhnhOm0
>>196
そこは俺とは見解が違うね
再帰の定義はサブルーチンの中からそのサブルーチンを呼び出すことで、
それをやりやすく補助する存在は本質じゃない
なのでスタックですら再帰の本質ではない
マシンによってはサブルーチンのネストが6層までとか限定されていて
それは何かというとリンクレジスタの個数でありスタックじゃない
再入は共通変数なんか使わないし、使ったらRENTじゃなくなる
メインフレームの流儀ではいちいちGETMAINとかね
メインフレーム上のCの実装は、俺が目撃したのはS/370じゃなく
ESA/370だったけどいちいちGETMAINはしてなかった
0198デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/20(日) 22:03:55.37ID:sGdhnhOm0
秀和の解析本にはBASICのくせにunwindがあるぞってなのが載ってたね
0199デフォルトの名無しさん (ワッチョイ 8123-jLVh)
垢版 |
2017/08/20(日) 22:43:04.76ID:gPEOCHBy0
>>197
> 再帰の定義はサブルーチンの中からそのサブルーチンを呼び出すことで、
> それをやりやすく補助する存在は本質じゃない
これは屁理屈だ。
なぜならこの定義では、「再帰出来ない」言語なんて無いから。
再帰出来る/出来ない『言語』を議論している時点で、この定義は無意味で、
「普通に再帰を記述した時に問題なく動くか」が議論用の定義になる。
これは当然であり、自明だ。

つか、君は何が言いたかったんだ?
君の定義ならCOBOLだって再帰出来るだろ?
0200デフォルトの名無しさん (ワッチョイ 93c5-8P7d)
垢版 |
2017/08/21(月) 04:24:06.96ID:LgR8oR3f0
再帰アルゴリズムを繰り返し(ループ)アルゴリズムに変換することは普通のアーキテクチャー上では常に可能、
再帰回数に応じて新規のメモ化用領域を本質的に必要とするという重症なケースでも、最悪配列が使えればどうとでもなる、

>>197
メインフレームってグローバル変数として配列とか確保できなくて
いちいちGETMAINするしかないのスゲー

>>199
System/370で動くGCCの実装があったと聞いたわ(ただし今はSystem/390が動作下限とのこと)
再帰ができるかどうかはしらんwwwwwww
0204デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/21(月) 08:10:41.60ID:M1FJxIMj0
>>199
だから見解が違っているねと言ったろ
アセンブラは再帰できるのか、できないのかという問いと、
COBOLは再帰できるのか、できないのかという問いに、
同じバックボーンで答えることが俺には出来ないが
おまえさんには出来るということだろ?

>>200
bfdではi370だね
0206デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/21(月) 23:00:08.39ID:M1FJxIMj0
犯人扱いしておいて違ったら知らん顔という制度そのものが間違ってる
捜査協力した人には謝礼だろうが
にせ伝票で架空の謝礼費を着服なんかしてないで
やるべきことをやれっての!
0207デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/21(月) 23:01:02.71ID:M1FJxIMj0
架空の謝礼費を内部告発した仙波さん、えらい扱い受けたよね
0208デフォルトの名無しさん (ワッチョイ b391-MHKs)
垢版 |
2017/08/21(月) 23:09:51.41ID:BkgqT9qm0
C++の最新仕様を追い続けられる人ってのはやっぱどこかちょっと変わり者というか
ふわふわしたものが許せないというか、なんとなく動いてるからいいや的な緩さが
許せないというか、白黒はっきりつけようぜ的な性格なのかな?って思ったw
0209デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/21(月) 23:12:01.91ID:M1FJxIMj0
たったの千円でも知らん顔とは次元が違う
謝礼の対象でないという取り決めがあるばかりに
警察官の横柄な態度を誘発しているんだよ
0210デフォルトの名無しさん (ワッチョイ 99e4-njFf)
垢版 |
2017/08/21(月) 23:56:14.20ID:pHph3yYu0
>>208
たかだか3年に1度の更新がそんなにしんどいのかよ
追い続けるもクソもねえ
重箱の隅をつついても1冊程度にまとめられる量しかないのに
0214デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/22(火) 01:03:51.34ID:NIldwpVs0
>>208
ほとんどが待ってた機能だぜ?
言語仕様だけでなくライブラリまで
おまえろくすっぽC++使ってねえだろ
0215デフォルトの名無しさん (ササクッテロラ Sp4d-d1ZX)
垢版 |
2017/08/22(火) 02:32:46.66ID:Z58zmq8rp
全くわからない
雰囲気でc++を使っている
0218デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/22(火) 12:26:19.96ID:NIldwpVs0
そういうおまえはあるのか?
0220デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/22(火) 12:42:39.12ID:NIldwpVs0
それが本当なら恥ずかしい見積もりミスしてんぜおまえさん
0222デフォルトの名無しさん (ワッチョイ 616f-faiX)
垢版 |
2017/08/22(火) 15:03:21.13ID:d7ebk59r0
うん。するどい。
0223デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/22(火) 15:14:35.21ID:NIldwpVs0
雑誌ってエロ本か何かだろどーせ
技術系の雑誌やっててあーゆーバカ言っちゃ自殺もんの恥だぜ
0226デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/22(火) 17:20:14.07ID:NIldwpVs0
あいたた、本にまとめることも、実装とテストも、
とにかく量的な感覚がどこにもないのか
0227デフォルトの名無しさん (ワッチョイ 0b32-xhIi)
垢版 |
2017/08/22(火) 20:47:37.89ID:0/CmF7JC0
>>213
なら、publicにしちゃえばいいじゃんといってみる。

関数は振る舞いを書くべきだと思うし、変数の代わりに使うものじゃないと思うんだ。

あと、オブジェクト指向的にクラス変数は基本悪である、ということも考えるべきではないだろうか。
0238デフォルトの名無しさん (ワッチョイ 8123-jLVh)
垢版 |
2017/08/22(火) 22:58:36.57ID:D8nSL4rC0
>>233
逆にそれが入らない原因なのでは?
軽い処理(public変数)なのか重いかもしれない処理(関数呼び出し)なのか、
見た目分かるようにしろってのがC++の流儀なんだろ。

俺はあった方がいいと思うけどね。
速度チューニングでこの手のマイクロマネージメントは全く意味がないから。
0242デフォルトの名無しさん (ワッチョイ 817f-jLVh)
垢版 |
2017/08/22(火) 23:13:00.45ID:zLx3ukqP0
>軽い処理(public変数)なのか重いかもしれない処理(関数呼び出し)なのか、
>見た目分かるようにしろってのがC++の流儀なんだろ。

C++って、それを判断するのが最も困難な部類の言語だと思うが。
0243デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/22(火) 23:20:46.21ID:NIldwpVs0
set/get用のデータメンバをちまちま用意するという
狭い考えに限定してきやがる思考妨害アイテムは無用
0250デフォルトの名無しさん (ワッチョイ 8123-jLVh)
垢版 |
2017/08/23(水) 00:09:19.34ID:CuDbJhab0
つかお前ら他言語使ってないだろ。
逆に言えばC++はその程度の精度での見積もりが出来る、ということなんだよ。

GC言語なんてGCがどこで走るか予測不能だから、実行時間の保証なんて全く出来ないし、
JIT言語はJIT側にその最適化が入っているかどうかで全く速度が変わってしまう。
つまりJava/C#/JavaScript等はその精度での見積もりはそもそも不可能なんだよ。

それとは別に、C++はその辺の仕組みがかなり複雑になっているのは認めるが、
それでも他言語と比べたら精度高く見積もれる方だよ。

getterを使った場合の問題は、それが見積もりにくくなることと、
あまりに多用するとどこで処理しているのか分かりにくくなる点だが、
まあ、適切に使っている限りはかなり使える機能だから、有った方が便利なんだけどね。
だから普通に考えれば「貪欲」なら当然入れるべきだし、
むしろラムダより先に入れるべきだが、入れないんだから何か引っかかってんでしょ多分。
0253デフォルトの名無しさん (ワッチョイ 817f-jLVh)
垢版 |
2017/08/23(水) 07:57:53.52ID:KTb6BBkr0
a = 1;

こんなコード片で、aの型がプリミティブ型かconstr(int)/operator=(int)を持つクラスなのかによって
実際に実行される処理内容が違う時点で

>軽い処理(public変数)なのか重いかもしれない処理(関数呼び出し)なのか、
>見た目分かるようにしろってのがC++の流儀なんだろ。

そんなものないとわかるだろう。
それににしても、そこからGCのオーバーヘッドに話が飛ぶのはさすがにアクロバティックすぎるw
実実行時間の話なら、マルチスレッドの非リアルタイムOS上のプログラムはどれも正確な見積もりなどできん。
0254デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/23(水) 08:29:43.04ID:kvkWqUxa0
プリミティブ型? ああJava訛りね、C++用語はISO/IEC14882:2011 3.9.1に規定あるから

a = 1; がビルトインの代入か、トリビアルのoperator=か、
ユーザー定義のoperator=か、コンストラクタを呼び出すか、
コピーかムーブか、読めない人はC++には向いてないので無理しなくていいよ
要するにアセンブラ苦手なんだろ

マルチスレッドでもタイムクリティカルとか割り込みマスクとかあるしね
別にRTOSに限ったことじゃなく
0256デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/23(水) 12:25:37.91ID:kvkWqUxa0
C++を批判するには
おまえ足んねーものが
多すぎつってんだよ
0257デフォルトの名無しさん (ワッチョイ 2baa-PF2c)
垢版 |
2017/08/23(水) 18:58:23.34ID:HlA0mWJs0
C++ 標準委員会のドワンゴ江添は、職務質問の手荷物検査を拒否したら、
警官10人に、現場で1時間半以上、拘束されたらしい

捜査でもない、任意の行政処分なのにw

それで東京都を訴えた
0258デフォルトの名無しさん (ドコグロ MMb3-x4Vn)
垢版 |
2017/08/23(水) 19:16:52.69ID:Rd2CDMDCM
>>254
> a = 1; がビルトインの代入か、トリビアルのoperator=か、
> ユーザー定義のoperator=か、コンストラクタを呼び出すか、
> コピーかムーブか、読めない人
それがわかったからと言ってなんになるんだ?
定義が常に読めるとは限らんだろ

> 要するにアセンブラ苦手なんだろ
逆アセしてでも読めとか言ってるなら単なる老害のアホ
0259デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/23(水) 22:25:37.71ID:kvkWqUxa0
>>258
ほーお、おまえさんは定義が読めないと判断できないのか
普通の人は宣言まで読めれば判断できるんだがw

逆汗読まないほうがバカガキ
バカガキからみて普通の人は老害というだけ
0263デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/24(木) 10:04:23.28ID:VdsYrxcW0
いらね
0264デフォルトの名無しさん (ワッチョイ ca32-2x4P)
垢版 |
2017/08/24(木) 11:04:12.57ID:h3Bt5TkH0
プロパティじゃないと出来ないことってなになの
0266デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/24(木) 11:45:56.43ID:VdsYrxcW0
IDEがやれば済むこと
わざわざ言語に入れる必要なし!
0268デフォルトの名無しさん (ワッチョイ 8642-mY/i)
垢版 |
2017/08/24(木) 14:05:25.76ID:5zDLSTW70
オブジェクトの状態と操作の区別
関数でも代用できてしまうけど、変数のように扱えるってのが大きい
変数のような使い方で処理を挟める、これはPublicなメンバ変数では出来ない
0269デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/24(木) 14:20:51.13ID:VdsYrxcW0
できるよバーカ
C++98より前、ARM C++の時代から
0273デフォルトの名無しさん (ワッチョイ cac5-5mwo)
垢版 |
2017/08/24(木) 18:52:57.63ID:4nWMkj3x0
質問ですが
std::string str("abcdefghi"); // (*1)
str.resize(8); // (*2)
size_t len = strlen(str.c_str()); // <-- "abcdefgh\0"の長さが返る (*3)
となるのですが、(*3)の時点でできる終端NUL文字"\0"って、
いつのタイミングでどこの領域に確保されるのですか、
0276デフォルトの名無しさん (ワッチョイ ca9f-tmrH)
垢版 |
2017/08/24(木) 20:00:39.22ID:kJk0ElnZ0
>>270
そのスマートオブジェクトをメンバ変数にした場合、一々親へのポインタをそのスマートオブジェクトに記憶してやらんといけないからすごく面倒なのだよ
プロパティはその点何の束縛もないから良いのだ
0277デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/24(木) 20:11:18.34ID:VdsYrxcW0
>>272
アフォwww
template と try catch それと typeid はARMで新設されたんだよ
おまえ多重継承だけだと思ってんだろ
0280デフォルトの名無しさん
垢版 |
2017/08/24(木) 20:39:47.98ID:oFKMCsHnd
🐒
0287デフォルトの名無しさん (ワッチョイ cac5-5mwo)
垢版 |
2017/08/24(木) 22:12:47.64ID:4nWMkj3x0
Windows Phoneの開発で使うC++/CXにはpropertyが構文でサポートされているで
ていうかpropertyがあることが存在意義な感じ?(ネイティブなC++は別にあってそれはそれで利用可能
0292デフォルトの名無しさん (ワッチョイ ad23-vgeI)
垢版 |
2017/08/25(金) 00:06:28.73ID:w8QRZZ7K0
>>287
それ以前のVC++/CLIからサポートされてる。

>>286
駄目。
propertyは新規機能ではなく、見た目だけの問題だから、
逆に言えば、見た目がpropertyで書いた時より分かりにくいようなら駄目なんだ。
ほぼ同じ事はラムダとファンクタでもそうだけど。
0293デフォルトの名無しさん (ワッチョイ b632-+Jgu)
垢版 |
2017/08/25(金) 00:10:22.03ID:hVYhQQjP0
>>268
オペレーターのオーバーライドとにたような感じになると思うけど、その挟み込む処理の重さが隠蔽されてしまうという問題があって、一般には、非推奨だとおもうのだけど今はかわってきてるのかね?

たとえば、代入しているだけだとおもったら、実はファイルアクセスまでしてたとかかな。
0294デフォルトの名無しさん (ワッチョイ cac5-5mwo)
垢版 |
2017/08/25(金) 00:19:32.01ID:4dE2HuPo0
>>293
>258理論によれば、老害じゃなければ一目で処理の重さがわかるんじゃね
もっとも処理の重さに関するC++の不透明さに警戒を抱くことを老害とするならば、
カーニハンやリッチーも老害にカテゴライズされてしまうが
0295デフォルトの名無しさん (ワッチョイ ad23-vgeI)
垢版 |
2017/08/25(金) 00:49:30.90ID:w8QRZZ7K0
>>294
K&Rというか生Cが嫌っている理由は「余計なことをするな」だ。
適切に使っている限りC++は不透明ではない。それでも彼等は嫌うだろ。

>>293
横だが結局は使い方次第だよ。C++はいくらでも読みにくいコードを書けるから。
ただ、きちんと使えば有用な機能だよ。
演算子オーバーロードについてはgoogleは「慎重にやれ」だね。
https://ttsuki.github.io/styleguide/cppguide.ja.html#Operator_Overloading

どうでもいいが、何故演算子は「オーバーロード」なんだ?
言われてみれば「オーバーライド」の方が適切な気がする。
0296デフォルトの名無しさん (ワッチョイ 8642-mY/i)
垢版 |
2017/08/25(金) 02:45:57.11ID:g+9HiqWa0
>>293
それは言語機能の問題じゃなく実装の問題じゃない?

propertyってメンバ変数がどうなっているかに関わらずオブジェクトの状態を表すもの
言語機能の話をしているのであって
既存の機能をやりくりして似たことは出来るって言われてもって感じ
0298デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/25(金) 05:23:39.04ID:RGmsOxnq0
>>295
オーバーロードは新設で、たいていのoperatorがこっち
オーバーライドは変更で、代入やnewが本当はこっち
0301デフォルトの名無しさん (ドコグロ MM72-+ULf)
垢版 |
2017/08/25(金) 06:55:30.90ID:s9vD7wq8M
>>295
> どうでもいいが、何故演算子は「オーバーロード」なんだ?
> 言われてみれば「オーバーライド」の方が適切な気がする。
オーバーロードとオーバーライドの違いもわかってないの?
まあ>>298も色々おかしいが
0304デフォルトの名無しさん (ワッチョイ cac5-5mwo)
垢版 |
2017/08/25(金) 07:49:18.88ID:4dE2HuPo0
>>300
>>254>>258の流れをa=1;の実行速度が一目見てわかるのかどうかという問題提起の意味に解釈すた、
パフォーマンスを読みきるには何の言語であれボトルネック(ループ回数×1回の実行時間が最大の処理)の特定が必要だが
C++は演算子のオーバーロードとかインライン展開とかテンプレートがそれ以前の障害として立ちはだかる点がCより重症
パフォーマンスを上げるための手段を豊富に提供してプログラムを書く人の選択に委ねているみたいな?
つまりC++はソースコードのROM専はお断りな言語

>>295
スマン言いたかったのはK&Rではなくてカーニハンとロブ・パイクやったorz
『プログラミング作法』の第7章「性能」のところにC++の特性について(CやJavaとの比較が)書かれていた希ガス、
(目次)ttps://tatsu-zine.com/books/practice-of-programming
ちな本は売ったから手元に無い

>>297
本来のK&Rがまさにそれなのでは…
Unixの移植目的で作られた言語なので、移植性と意図通りのアセンブリコードに落ちること
(ソースコードからアセンブリコードが透けて見えること)の両立が着手時点の第一優先だったはず
故に生ポインタが言語の前面に出てきてインクリメント/デクリメントがそれぞれ2種類あった
0305デフォルトの名無しさん (ワッチョイ c6ba-E8CI)
垢版 |
2017/08/25(金) 08:42:44.14ID:XasQqnRJ0
>>298
いや、new もオーバーロードでしょ。
0311デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/25(金) 09:52:04.11ID:RGmsOxnq0
>>305
「本当は」って書いてるだろ

# 流れを読んでない近視眼的なアフォどもは無視
0314デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/25(金) 10:21:51.52ID:RGmsOxnq0
わかんなくていい
バカ以外とさえ話せれば
0316デフォルトの名無しさん (ブーイモ MMf1-E8CI)
垢版 |
2017/08/25(金) 12:58:22.38ID:BrjL74izM
>>311
いや、グローバルのオペレーターに対して、型特化を新設するんだから、newも代入も、オーバーロードでいいんだよ。って話。

c++の実現方法(クラス内定義)でイメージしちゃうから、オーバーライドと思っちゃう気持ちはわかるけど。
0319デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/25(金) 14:12:03.69ID:RGmsOxnq0
::operator newは新設か?
ユーザー定義するとビルトインを置き換えるだろ
0327片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sdea-sbdr)
垢版 |
2017/08/25(金) 22:45:02.30ID:M7y+0IYNd
operator==を仮想化したら、多態性が必要な状況であれこれはかどるだろう。
Numberクラスを基底として、RealクラスやらComplexクラスを作ったりしたら、同値確認にoperator==を使いたくなるだろう。
0333デフォルトの名無しさん (ワッチョイ c6ba-E8CI)
垢版 |
2017/08/26(土) 00:07:55.23ID:NVd9gXan0
>>327
RealクラスとComplexクラスを比較した時の振る舞いが直感的じゃなくね?
0339デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/26(土) 08:56:30.09ID:jcvKb5O50
>>336
言い争ってなんかいねえぜ
一部のアフォどもをこっちはスルーしてるんで争いになってない
0343デフォルトの名無しさん (ワッチョイ cac5-5mwo)
垢版 |
2017/08/26(土) 19:44:51.20ID:dtKp7Pu80
>>342
あー左様かvoid B::f(int)のオーバーライドとf()のオーバーロードが同時にありえるのか、
完全に排他的(背反)というわけでもないな

ただしそれぞれ独立な概念とは言える
なぜなら下記の4通り全ての組み合わせが有り得、互いの成立要件に他方の成立の真偽が関係しないだから、
1. オーバーライド∧オーバーロード
2. オーバーライド∧¬オーバーロード
3. ¬オーバーライド∧オーバーロード
4. ¬オーバーライド∧¬オーバーロード
0350デフォルトの名無しさん (ワッチョイ 29e4-xRau)
垢版 |
2017/08/27(日) 02:06:53.19ID:99717IEt0
みんな人に説明できるだけのまともな言語能力を備えてから来てくれ
あとクソみたいな反論をするのもやめよう
0353デフォルトの名無しさん (ワッチョイ cac5-5mwo)
垢版 |
2017/08/27(日) 13:59:49.66ID:nap9vlyD0
constオブジェクトのデストラクタって
一般に中で非constメソッドを呼んでいるのに
なんで合法に呼び出されるの?
それとも合法に見えるのはVC++固有?
プロセスが死ぬまで破棄されないのが正しいロジックなんじゃないの
0354はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0a15-2x4P)
垢版 |
2017/08/27(日) 15:08:55.59ID:hmah67i90
const の考え方には logical const と bitwise const があって、
logical const を実現するために言語としては bitwise const を基本として要求してる感じ。
logical const ってのは論理的な const 性で、
bitwise const ってのはビットパターンとして不変ってことね。

mutable キーワードを付ければ const なメンバ関数からも操作できるデータメンバを
作れるけど、これは bitwise const でなくてもよくなるだけで
logical const であることは要求される。
(その性質を満たすようにプログラマが配慮しないといけない。
コンパイラは面倒みてくれない。
reinterpret_cast と同じくらいには危険で面倒くさいと思う)

寿命が尽きたオブジェクトにはアクセスは許されないから
もはや logical も bitwise も関係なく const 性は無意味になる。
0355デフォルトの名無しさん (ワッチョイ cac5-5mwo)
垢版 |
2017/08/27(日) 15:29:34.75ID:nap9vlyD0
>>354
>寿命が尽きたオブジェクトにはアクセスは許されないから
>もはや logical も bitwise も関係なく const 性は無意味になる。
これはだいたいワカタ

前半はわからん
bitwise const でないオブジェクトがROMに割り付けられたり、とか、
bitwise const でないオブジェクトがmemcpy()的手段で同じビットパターンに繰り返し上書きされるみたいな
処理があったりするとbitwise constでないことは致命的だが
それ以外のケースではconstといいつつクラス内部ではmutableな扱いであっても全く実害無いんじゃ…
ていうかそもそもC++の非PODオブジェクトに対するconstはbitwise constなのかかなり疑問が、、
0356はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0a15-2x4P)
垢版 |
2017/08/27(日) 16:21:07.86ID:hmah67i90
>>355
logical const であれば性質として充分だよ。
だけど、それをコンパイラがチェックすることは出来ないから、
原則としては bitwise const を要求して、
それがちゃんとできてなけりゃエラーも出す。

だけど、 bitwise でなくても logical に出来る場面では
プログラマの責任でやるよっていうのを mutable キーワードで表すってわけ。
0358デフォルトの名無しさん (ワッチョイ 29e4-xRau)
垢版 |
2017/08/27(日) 16:50:02.45ID:99717IEt0
しかし現実には使われているもよう
0362デフォルトの名無しさん (ワッチョイ c6ba-E8CI)
垢版 |
2017/08/27(日) 19:19:01.73ID:+rBIMmXP0
>>359
いやいやおいおい…
0363デフォルトの名無しさん (オッペケ Sr6d-9IFt)
垢版 |
2017/08/27(日) 22:57:23.47ID:epttQBO0r
「C++の非PODオブジェクトに対するconstはbitwise constなのかかなり疑問が」
標準レイアウトではないconstexprなオブジェクトはビットレベルでconstなのだろうか
constexpr struct A { constexpr A()=default; int m=1; private: int n=2; } a;
確かに疑問だ
0364デフォルトの名無しさん (ワッチョイ 294d-vgeI)
垢版 |
2017/08/27(日) 23:06:36.65ID:Pcpci17F0
どんどんキーワードが増えるのは思いつきで仕様を決めてるからだ。
無能SEの下のプロジェクトではよくあること。
50年は仕様を追加しないつもりで仕様を決めてほしい。
0366デフォルトの名無しさん (ワッチョイ 29e4-xRau)
垢版 |
2017/08/28(月) 00:12:36.48ID:OtmMiMVk0
永久に仕様が追加されない言語なんてたくさんあるから好きなのを使いなよ
機能が必要になった背景やそれを追加することが適当だという根拠まで知ってろとは言わないからさ
0368デフォルトの名無しさん (ワッチョイ cac5-5mwo)
垢版 |
2017/08/28(月) 00:26:53.59ID:GiFa6ZsP0
つ、追加しなくても1.5年待てば倍速くなるもん…!

ていうかメモリバリア周りの扱いが未だに規格化されていないのは言語としてはお寒い状況だといわざるおえない
ゆくゆくはOpenMPIを正式に取り込んでキャッシュスヌープ無しのメニーコア環境でも
最高のパフォーマンスを発揮できるだけの選択肢をプログラマに提示し、
さらにはGPGPU対応もしてホスイ、
0370デフォルトの名無しさん (ワッチョイ 41e1-xc3z)
垢版 |
2017/08/28(月) 01:19:26.30ID:83bJD8zl0
openmpみたいなマクロまみれよりtbbのほうが好き
0371デフォルトの名無しさん (ワッチョイ 294d-vgeI)
垢版 |
2017/08/28(月) 01:23:37.61ID:JtlNpsV60
そんなに新機能を追加したいなら、新しく別言語を創れ。JavaやC#みたに成功して普及した事例はいくらでもある。
一度普及した言語に、碌に実務でコードも書いたことないような輩が後からやってきてデタラメな糞仕様を追加するんじゃない。
0375はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0a15-2x4P)
垢版 |
2017/08/28(月) 03:06:17.85ID:yPLR2tUq0
ライブラリの蓄積もあるからさ。 負債の蓄積とのバランスだよねー。
ときどき Go とか Rust とかみたいなのが出てきて一新してくれりゃいいんだけど、
C++ はともかく C はいつまでも死なない気がする。
0376デフォルトの名無しさん (ワッチョイ cac5-5mwo)
垢版 |
2017/08/28(月) 07:31:44.71ID:GiFa6ZsP0
別に新機能のほしいものリストを無秩序に書き連ねたわけではないもん;;
C++はSimulaの代替品として登場した時点から実行時パフォーマンスの追求を意識していたし、
理解しやすさなら他の言語を選択すればよい昨今においては
特に実行時パフォーマンスの追求こそがC++の存在意義として強調されるべき
テンプレートによるメタプログラミングに最高の効率を阻害する穴があれば塞がれねばならないし、
最適化がほっといたら中途半端にとどまるケースには尻を叩くキーワードが追加されねばならないし、
そのときどきのアーキテクチャーの詳細に立ち入ってでもあらゆる実行時パフォーマンス追求手段が
プログラマに提示されねばならない
インテリセンスがまともに働かないとかテンプレートの分割コンパイルがもはや完成しないバベルの塔だとか
言語規格が変わり続けて解説書が分厚くなる一方だといった側面の不調法はそうであってこそ許容される、
0379デフォルトの名無しさん (ワッチョイ ad09-tVhQ)
垢版 |
2017/08/28(月) 07:43:38.48ID:96+DvSIX0
>>377
機会が賢くなったら、あらゆる言語をCに一回トランスコ―ドするようになる気がする。
そこでパフォーマンスチューニングしてコンパイル。
人間だとコストかかってできない方法。
0381デフォルトの名無しさん (ワッチョイ ad09-tVhQ)
垢版 |
2017/08/28(月) 08:00:37.13ID:96+DvSIX0
>>380
あーそんなもんか。
それじゃ、アセンブリにした方が早いね。
もしくはあらゆる言語がLLVMを介してコンパイルされるとかね。
LLVMのストラクチャも自動生成とか。
あー怖い。
0382デフォルトの名無しさん (ブーイモ MMb9-E8CI)
垢版 |
2017/08/28(月) 12:49:34.85ID:0HhHgrwNM
ちょっとしたコーディングミスで、以下の簡易コードように書いてしまって、ハマったのですが、コンパイルエラーにならなかった事に驚きました。

string a(何らかの文字列);
string s = s.replace(置換指示); //a.replace() と書こうとした。

コピーコンストラクトの右辺に、構築中(?)の自分自身を使ってしまったと言う事なのですが、これは規格上合法なのでしょうか?
0383デフォルトの名無しさん (ブーイモ MMb9-E8CI)
垢版 |
2017/08/28(月) 12:59:59.78ID:0HhHgrwNM
↑のサンプル貼っておきます。
https://ideone.com/X4ILlf
0385デフォルトの名無しさん (スップ Sdca-vlGO)
垢版 |
2017/08/28(月) 16:57:17.16ID:KK7lC/68d
>>384
それの使い道がよくわからん

コンパイラと環境によっては x=0 より速かったりとか?
即値は全て名前を付けなきゃいけないとかいう糞コーディングルールの回避とか?
volatileをつけて、
ダミーリードと0クリアを1文で書けるとか?

思い付くのはこのくらい
0386デフォルトの名無しさん (ワッチョイ 4acd-Xu5m)
垢版 |
2017/08/28(月) 17:22:45.55ID:3VrqihWx0
コンストラクタが実行される前なのでオブジェクトの内容は不定だろうし
不定なオブジェクトにも適切にアクセスする場合なら合法かもしれない
ただ不定な変数を使って何かしようとすると途端に undefined behavior 地雷を
踏むことが多いのでそこで頑張っても実りがあるとも思えないけど
0387デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/28(月) 17:43:39.28ID:+dyqlMtL0
>>385
アセンブラでよく使う xor eax,eax を逆コンパイルするとアレになる
0391デフォルトの名無しさん (ワッチョイ b500-vlGO)
垢版 |
2017/08/28(月) 18:08:57.91ID:Wq6HqE7w0
さすがにPC系コンパイラで
0クリアを最適化しないのは無いかと

xor eax, eax は0イディオムとか言って、
普通のxorとは微妙に扱いが異なる

昔は sub ax, axより xor ax, axの方が微妙に速かったりした
今はフラグ以外は同じ

>>390
何もしないわけじやない
ちゃんとフラグが変わる
0396デフォルトの名無しさん (ブーイモ MMb9-E8CI)
垢版 |
2017/08/28(月) 19:37:58.17ID:y0vE8H3MM
>>382
質問を変えると、
何でコンパイルエラーにしてくれないんだろう?
ってところが気になっています。
0404デフォルトの名無しさん (アウアウウー Sa91-WCa5)
垢版 |
2017/08/28(月) 22:22:13.51ID:Na7nyTMka
そう言えば64bitアセンブラ勉強してた時ウェブで64bitレジスタでxor rax raxってするより、64bitプログラムでもxor eax eaxってした方が機械語短いって書いてたな。
アセンブラ上は同じ長さだけど、機械語上は64bit命令の方が長い&32bitレジスタへの操作は自動的に64bitレジスタの上位bitがゼロクリアされるから同じ動きになるとかなんとか。
キャッシュに入るコードが増えるから速くもなるらしい。
0406デフォルトの名無しさん (ワッチョイ 4a19-vgeI)
垢版 |
2017/08/29(火) 00:27:36.33ID:AHYNkT+D0
OpenMPIを用いたプロセス並列コードのプロファイルを取りたいんですが、
gprofだとテンプレートがごちゃごちゃしててすごく見にくいです。
何か勧めなフリーのプロファイラはないでしょうか?
0407デフォルトの名無しさん (ワッチョイ 3e23-tLez)
垢版 |
2017/08/29(火) 01:49:03.35ID:skpcufF70
座標を動的配列で格納していき、
(50,50),(100,100) //直線1の座標
(30,30),(70,70)  //直線2の座標
↑こんな感じに直線の数だけ座標の組み合わせが増えます。

この上から2個の座標の組み合わせ、
つまり座標4点を使い交点を計算するプログラムを作ろうとしています。

計算式を作っていく際にfor文を使っているのですが
1つ目の座標の組み合わせと2つ目の座標の組み合わせを計算式内で使うので
二重ループがいいかと思い作ろうとしましたが動的配列での二重ループの作り方が分かりません。

助けて頂けないでしょうか…。
長々と申し訳ありません。
0408デフォルトの名無しさん (ワッチョイ ca4c-oKtA)
垢版 |
2017/08/29(火) 02:17:37.67ID:On05DpTS0
>>396
void* p = &p;
↑こういうのは受け入れないといけない一方で >382 を NG とするための境目を
ちゃんと定めてコンパイラ実装するのはめんどくさそうだなと思う。
頻繁に踏む問題でも無くてコンパイラ実装者がそこに注力する動機も薄そうだし。
0409デフォルトの名無しさん (ワッチョイ c6ba-E8CI)
垢版 |
2017/08/29(火) 02:27:26.09ID:KA5Uf3Ix0
>>397
む、なるほど…
確かに未定義であれば、コンパイルエラーにしなくとも文句は言えませんね。

>>408
!!!なるほど!!!
実用性はさておき、その例文で納得してしまった。
0410デフォルトの名無しさん (ワッチョイ feea-w74m)
垢版 |
2017/08/29(火) 02:33:36.21ID:vHDkbJz50
>>407
動的配列だと何が問題あるの?
何につまずいているのかよくわからんなあ
例えばキューで実装するとか
直線をひとつづつプッシュ、
描画タイミングで直線を必要数ポップし交点を描画
0412デフォルトの名無しさん (ワッチョイ 3e23-tLez)
垢版 |
2017/08/30(水) 00:38:16.23ID:95r+Hm0D0
はい
iteratorでの二重ループが分かりません。
x1={1,2,3}
x2={4,5,6}
1*4 , 1*5 , 1*6
2*4 , 2*5 , 2*6
3*4 , 3*5 , 3*6
といったような計算が出来るプログラムを動的配列でつくりたいです。
0419デフォルトの名無しさん (ワッチョイ 3e23-tLez)
垢版 |
2017/08/30(水) 08:57:17.67ID:95r+Hm0D0
>>415
通常のループも、二重ループもあらかじめ用意した配列でなら書けます

動的配列になるとiteratorの使い方が分からずプログラムが動かなくなってしまうのですが笑

>>416
ありがとうございます使ってみます!
0423デフォルトの名無しさん (ワッチョイ ad09-tVhQ)
垢版 |
2017/08/30(水) 10:44:38.77ID:VpX1ZCKl0
イテレータは繰り返しを前提としているので基本的に進むと戻るの操作しか提供しない。ランダムアクセスっていうのもなくはないけどね。
it++で前進、it--で後退。操作して、Container.begin()と同じ値なら先頭を、Continer.end()と同じ値になったらそのコンテナの末端を指している。
基本的にはポインタを抽象化したものだからポインタの操作を思い出すと少しわかりが早い。
0424デフォルトの名無しさん (ワッチョイ 29e4-xRau)
垢版 |
2017/08/30(水) 12:11:28.40ID:NGfIYJwv0
>>422
君には早いのでまずはポインタでぐぐってくれ
x[i + 1] == *(x + i + 1)
0426デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/30(水) 12:35:06.14ID:BJd10UjW0
>>419
それ、end()が何を返しているかとか、
連続領域でないのにポインタを返しているとか
そういう系の問題じゃね?

あと「イテレータのループ」というのが
range-based-forだったりすると
x[i+1]はそもそも無理だぞ
0428デフォルトの名無しさん (ワッチョイ 0946-R9zi)
垢版 |
2017/08/30(水) 20:58:46.39ID:UeWdSpDY0
Cとjavaの基礎やったから基本の文法とオブジェクト指向の触りみたいな部分だけわかるんだけどこの状態でテンプレートとかの勉強初めていいの?
あそこらへん急に難しくなるイメージあるけど他に先にやるべきこととかあります?
あとそういう人におぬぬめの本とかもしあったら教えてくだされ
0436デフォルトの名無しさん (ワッチョイ 6f65-b8Mh)
垢版 |
2017/08/31(木) 05:33:17.64ID:5oi4R35S0
あのー、このスレに限らずどこもなんだけどさ、
初心者をケナスくせは、やめた方が良いよ。
ちょっと知ってる者の傾向だね。
ちょっと自分が物事を知ってるから、
「自分らが、上だ。と、知らない者をけなす癖」が多大に有るよね。
本当に知ってる者は、初心者にもやさしく教えてあげるよ。
0442デフォルトの名無しさん (スッップ Sd1f-gM2o)
垢版 |
2017/08/31(木) 10:24:10.68ID:DHTk7O50d
全くその通りだよね
ポインタ滅ぶべしとか思ってるのかも知れないけど、初心者はまずイテレータを理解してその後
ポインタを学べば良いなんてプロセスは効果的とは限らないし、個人的には無理があると思う。
0443デフォルトの名無しさん (ワッチョイ 33e4-p7en)
垢版 |
2017/08/31(木) 10:46:40.85ID:8V5/tdJ10
C++使ってて初心者は隠蔽された中身を理解しなくていいとか本気で思ってる奴いるのかよ
それにイテレータはポインタのような操作ができるインターフェイスなのでポインタを理解してることは前提となっている
0446デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/08/31(木) 12:45:17.10ID:JYM1pg890
「あたかもポインタのように振る舞うオブジェクト」を使うにあたって
そもそもポインタを知らないことの何が問題か本気でわからないのか?
0449デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/08/31(木) 15:09:44.78ID:JYM1pg890
>>447
どっかから引用したわけじゃないんで
そういうフレーズにはなってないだろうなあ

ポインタの使い方に、イテレータの使い方を似せてあるのは
誰の目にも明らかなんだが、おまえだけ違うのか?
重箱の隅でない説明がもしできるなら拝聴したいぜ
0450デフォルトの名無しさん (ワッチョイ 33e4-p7en)
垢版 |
2017/08/31(木) 15:25:08.02ID:8V5/tdJ10
ポインタに似せるというコンセプトではないので、ポインタと同じ構文で操作できてもポインタとは何の関係もありませ〜んwwww


そんな話してねえだろコミュ障か?
0452デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/08/31(木) 16:22:24.21ID:JYM1pg890
あ、ふじこったw
そのザマ見て気が済んだ
0453デフォルトの名無しさん (ワッチョイ 33e4-p7en)
垢版 |
2017/08/31(木) 16:48:47.10ID:8V5/tdJ10
>>451
はいはい
イテレータはポインタの操作方法と互換性がある
ただし静的配列やvectorで使われているランダムアクセスイテレータはすべての操作をサポートしているが、それ以外ではサポートしていない操作もあるので注意
とまで補足を入れたらいいんだろ

配列の話をしていたはずなのにアスペはすぐ話の腰折るから困る
0454デフォルトの名無しさん (スッップ Sd1f-gM2o)
垢版 |
2017/08/31(木) 16:53:43.88ID:DHTk7O50d
むしろ初心者ほど中身を知りたがるもの。
イテレータなんて実装が隠蔽されてるわけじゃなし、知った上で抽象化したらこうなるってのが妥当な方向だ。
コンパイラがやる最適化等とは別の話だ。
0457デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/08/31(木) 17:03:23.95ID:JYM1pg890
さあねえ
俺はポインタを知らんやつにイテレータを教えたことがない
それを馬鹿にしたければするがいい
じゃあ、あんたはどうやって教えたのか、こっちが聞きたい
0458デフォルトの名無しさん (ワッチョイ 33e4-p7en)
垢版 |
2017/08/31(木) 17:29:30.90ID:8V5/tdJ10
>>456
その場でイテレータを使うだけなら必要ないが、それでは何故か動くおまじないになるだけ
マンツーマンじゃあるまいし基礎を理解していない者に教えるのは疲れるし両者にとって不毛だ
複雑な実装のイテレータを理解しろともコンピュータの仕組みを理解しろとも言ってないし
キーワードだけ見つけて何がなんだか分からない助けてくれと言う前に簡単な基礎からやれという指摘はおかしいか?
0459デフォルトの名無しさん (ワントンキン MM9f-KFeJ)
垢版 |
2017/08/31(木) 17:43:42.94ID:N6KLaE+9M
>>453
ちがうちがう
イテレータっていうのは繰り返しの抽象化だから、ランダムアクセスだのなんだのってのはおまけ
ポインタっていうのはアドレスに少し機能を付け加えたもの

リストのイテレータはリストのポインタと関係ないが、リストの特別版である配列のイテレータは配列のポインタと互換がある
だから、イテレータの操作とポインタの操作に互換があるというのは間違えてる
人に教える前にデータ構造について一から勉強しなおしたほうがいいのでは?
0460デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/08/31(木) 17:59:29.96ID:JYM1pg890
ポインタに限ったことではなく、イテレータでもハンドルでも
「何が」「どこにある」という情報を持つもの、という概念を説明するとき

ポインタが最も直接的な実装となっているので
具体的なアドレス値を図に書いて説明できるし
復習するにも実測値でその図を書いてみることができるし
デバッガでも関係性を追ってみることが出来る
++で何をどう増やしているのか、比較とはどういうことかも
実測値から直感しやすい

そして、それで憶えたことがvectorのイテレータでならとりあえず通用する
そこからlistだとかistream_iteratorだとかへと差分学習で進めば楽だし
algorithmもポインタさえ知ってればとりあえず使えて
そこからまた差分学習でイテレータで使う場合を憶えれば楽という経験則

何か間違っているかね?
0461デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/08/31(木) 18:04:14.09ID:JYM1pg890
誰かさんみたいに、ちがうちがうと自分の繊細さに酔うやつが
学習者の思考を丹念に潰しやる気を削いでいく有害な騒音源となる

語学の先生にもいるだろ?
0462はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff15-X0kF)
垢版 |
2017/08/31(木) 18:05:11.71ID:Ev17QaWq0
イテレータはポインタに似せたというよりは、部分的にポインタと共通のインターフェイスに抽象化されたものであって、
C にも有ったポインタという機能と新しい機能を無理なく (?) 統合するアイデアでしょ。
だから、どちらが先にありきと言えるものではないけども、
大抵の C++ 入門書だと時代的に早く出現したポインタを先に説明するのが一般的だと思うし、
初心者がその流れに沿わない学習をしているのだとしたら
体系的に学ぼうとせず場当たり的に調べてるんじゃないのと疑うって話じゃないかな。

前提がちゃんと出来上がってない人の質問にきちんと答えるのは無理だよ。
だからこれとこれを先にやった方がいいよっていうのは誠実な回答だよ。
0463デフォルトの名無しさん (ワッチョイ 33e4-p7en)
垢版 |
2017/08/31(木) 18:10:20.20ID:8V5/tdJ10
>>459
マジでアスペか
実用上どのように使うかって話をしてるのに、聞いてもいないのに一人で勝手に賢いイテレータの定義の話をしている
お前は>>412>>419>>422を100回読んでから入門サイトでどんな説明をしてるか見てこい
俺はその上で質問者のやろうとしていることは、ポインタを操作することと同じなのでまずポインタを理解してくれと言っている
0464デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/08/31(木) 18:24:58.66ID:JYM1pg890
>>462
は? イテレータは少なくとも1993年以後にできたもので
ポインタはBにもあったもので、どちらが先にありきは明白だ

イテレータの設計にあたりポインタを意識しなかったなんて珍説を唱えるには膨大な説明がいると思うが
おまえやってみるか?
0465デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/08/31(木) 19:01:39.56ID:JYM1pg890
33e4-p7enの主張が二転三転していて何が言いたいのかわからん
0472デフォルトの名無しさん (ワントンキン MM9f-KFeJ)
垢版 |
2017/08/31(木) 19:33:38.32ID:N6KLaE+9M
>>460
もちろんvectorを例にイテレータとポインタをまとめて教えるのは一つの手段として有りだと思うよ
ただ、何度も書いてる通りポインタとイテレータは独立した概念だから、その差分学習は論理必然じゃない

現に、俺は学部時代に授業でプログラム習ったときは、vectorのような連続領域じゃなくlistのような抽象リストで習ってるし
ポインタはCの授業で、アドレスの抽象として習ってるし、イテレータはデザパタの本で知ったからね

どの学び方がいいかは人それぞれなんだろうけど、独立した概念を一緒だよとか変な方便使うのは間違ってると思うよ
0475デフォルトの名無しさん (ワッチョイ 33e4-p7en)
垢版 |
2017/08/31(木) 19:58:01.09ID:8V5/tdJ10
>>471
この意見はさすがに論外だわ
ポインタは難しいものでもややこしいものでもないから、ちゃんとした読み物があれば問題なく理解できる
難しいなら後回しにしてもいいならわかるが、最初から教えないというのは学習の機会を奪っているとさえいえる
0478デフォルトの名無しさん (ワッチョイ ffc5-JjKz)
垢版 |
2017/08/31(木) 20:08:55.54ID:4TB5IpyN0
尤も、C++の配列とか要素型であるクラスの継承とか多態性を表現しきらん欠陥品ではあるのだが
(インターフェースの配列はポインタの配列としてやるしかない;;
それゆえにやっぱC++で入門するなら中身知っとけと、
0481デフォルトの名無しさん (ワッチョイ ffc5-JjKz)
垢版 |
2017/08/31(木) 20:17:41.92ID:4TB5IpyN0
>>480
左様動的なポリモーフィズムにガッツリ対応したコンテナクラスのテンプレートを
曲がりなりにもかけるようになってからがC++の入門編

抽象化された上位レイヤーの知識だけあれば詳細は知らなくて良い、というのは
漏れのない抽象化が達成された後のみ通用する話だが
ずんねんながらC++はそうではないし言語の性格上っ今後とも永遠にそうはならない
0482デフォルトの名無しさん (ワッチョイ 334d-6h2J)
垢版 |
2017/08/31(木) 20:25:29.52ID:SvYtbMXE0
>>471
その有益というrange-based forを説明してくれよ。
0485デフォルトの名無しさん (ワッチョイ 334d-6h2J)
垢版 |
2017/08/31(木) 21:32:29.56ID:SvYtbMXE0
>>483
悪いが馬鹿老害は黙っててくれないか。

若い人がせっかく説明したほうが有益だと言ってくれてるのだから。他の人も賛同してくれてる。
0489デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/08/31(木) 23:19:12.52ID:JYM1pg890
>>471
おまえさ、じゃあ配列の添字は何だと思っているわけ?
「どこにある」という情報をもつもの、という点で同じだぞ
だから for(i = first ; i != last; ++i) において first や last や i が
整数であろうがポインタであろうがイテレータであろうが
同じ論理が通用するんだろうがよ
ポインタで範囲外アクセスこくような大馬鹿者が
整数ならそんなことないとでもぬかすのか?
0490デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/08/31(木) 23:24:55.90ID:JYM1pg890
>>472
おまえC++やCよりも前に何かやってただろ
俺だってC++をCより先に憶えたクチで
そんな真似ができたのはアセンブラ使いだったからな

間接の概念をまっさらから憶えるのに
イテレータは無駄に難しいマゾプレーだつってんだ
ポインタわかっててもハンドルで悩むやついるくらいで
それに輪を掛けて++まであるのがイテレータであって
0491デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/08/31(木) 23:27:04.06ID:JYM1pg890
>>488
悪かったよ
そのようで
0492デフォルトの名無しさん (ワッチョイ 334d-6h2J)
垢版 |
2017/08/31(木) 23:32:03.77ID:SvYtbMXE0
>>471
まだ説明してないのか。説明頼むよ。キミが言い出したことなんだよ。
0493デフォルトの名無しさん (ワッチョイ ffaa-6h2J)
垢版 |
2017/08/31(木) 23:40:32.47ID:y40vazij0
(void*以外の)ポインタ自体も生のアドレス概念からは抽象化されている。
指されるオブジェクトの型やサイズを持っているんだからね。

それをさらに(ある方向に)抽象化したものがイテレータなんであって、そのように段階を追って
抽象化されていくストーリーを語るのは初心者向けにも有意義だと考える。
0494はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff15-X0kF)
垢版 |
2017/08/31(木) 23:59:46.91ID:Ev17QaWq0
イテレータに限らないけど抽象化されたものは抽象化されたままで扱わないと抽象化した意味がなくて、
(内部の実装を意識しなきゃならないのなら抽象化の甲斐が無い。)
一方では、その抽象化を作る側になることもあるので抽象化が出来上がるまでは抽象化の内側も知ってなきゃいけない。
つまり、層を積み重ねるたびに抽象化の壁を作っていくってのがプログラムを構成する基本的なやり方だろう。
だから、プリミティブな方から積み重ねながらその抽象化が意味するところを学ぶってのは普通の方法だと思う。
そういう意味で >>493 に賛成。

抽象化の内側を知ってしまった人が抽象化の壁の向こうを忘れて抽象化されたものとしてだけ
扱うってのはそれなりにセンスがいるんじゃないかとも思うんだけど、
C/C++ の背景にあるセマンティクスは良くも悪くも機械の理屈なんで、
どうあがいても高級アセンブラだと割り切って泥臭いポインタの側から学ぶのがいいと私は思うよ。
その泥臭いところを頑張って隠してるのが C++ ってもんなんで、
泥臭いところを知ったら C++ の色んな機能が「あー、こういうの欲しかったわー」ってなってありがたみを感じる。
0495デフォルトの名無しさん (ワッチョイ 33e4-p7en)
垢版 |
2017/09/01(金) 00:30:44.48ID:oWX+X4Ay0
ストラウストラップが言うにはC++は
低レイヤーにアクセスできる機能とオーバーヘッドが無く使いやすいように隠蔽できる機能を持っている言語というようなことを言っていて
低レイヤーの部分を知らなくていいとは言っていない
0496デフォルトの名無しさん (ワッチョイ 334d-6h2J)
垢版 |
2017/09/01(金) 01:02:22.22ID:E+DzN2Xf0
アセンブラの代替言語なのだから当たり前だ。用途もOSやドライバ、マイコン向けばかりだ。
COBOL、FortranやPerl、C#やJavaの代わりに使う人などいない。
低層を隠蔽する機能などお呼びではない。
0497デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/01(金) 02:01:03.59ID:2msaHTP30
いやCOBOLの代わりには使うぞ
Fortranの代わりつーとCな客はいたねえ
0498デフォルトの名無しさん (ワッチョイ cf51-tIp8)
垢版 |
2017/09/02(土) 16:34:51.42ID:Vkplowcj0
http://opencv.jp/cookbook/opencv_img.html#image-resize
ここのソースコードをコピペしてコンパイルしようとしたのですが
関数 `cv::Mat::release()' 内:
test.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x47): `cv::Mat::deallocate()' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
このようなエラー文が出てしまいます
使っているOSはdebian stretchです
/usr/include/opencv2には必要なファイルはありました
どのようにコンパイルすればいいのでしょうか
0503デフォルトの名無しさん (ワッチョイ cf51-tIp8)
垢版 |
2017/09/02(土) 17:03:12.44ID:Vkplowcj0
>>501
すみませんでした
こっちで質問してみます
0505デフォルトの名無しさん (ワッチョイ fff0-6h2J)
垢版 |
2017/09/02(土) 18:45:42.87ID:qDvIb2f40
ちがう
一般的にはフィールドたるメンバ変数の方が先に来る

学習の都合で、メンバ変数を先に説明した方が、どう考えてもラク
メンバ関数を先に説明すると、入門書を読むレベルの初心者は間違いなく混乱するので、そんな参考書はまず見かけない

そもそもメソッドの中で使う変数は始めに宣言しておかないと使えない

結論としてはあなたが用語の取り違えをしてる……としか
0510デフォルトの名無しさん (ワッチョイ 2304-k/3h)
垢版 |
2017/09/02(土) 21:02:43.47ID:EU1kDRi00
普通アクセス修飾子の順じゃなくてフィールド→メソッドの順じゃないの
カプセル化するから変数なんてほとんどprivateだろうし
変数は変数でまとめて書いてもらわないと混乱する
0511デフォルトの名無しさん (ワッチョイ ff32-X0kF)
垢版 |
2017/09/02(土) 21:08:20.92ID:Wuw432Mc0
ユーザーにとって重要な項目から順に書く
つまり、public→protected→privateで
ユーザーに見せる必要のないprivateは一番下で
0512デフォルトの名無しさん (ワッチョイ ffc5-JjKz)
垢版 |
2017/09/02(土) 21:13:48.77ID:FGRVT/X40
変数の宣言と関数の宣言の順序がどうでも良いのは自明
メンバ関数の定義がメンバ関数内で使用するメンバ変数の宣言に先行する場合も実験する限り合法
(規格に具体的にどういう文言で規定してあるのかは知らん

まあ定義時点で不完全な型やら値やらはテンプレートの定義で頻出するから
あんま定義と宣言の順序にこだわらない処理系の作りなのだと納得しておく

しかしなぜかテンプレートの引数でない型の定義(または宣言)と使用には厳格な順序を求められる…
次のコードはビルドが通らない
class Baz {
// struct Bar; // 左のコメントアウトを外したら逝ける
 void foo(Bar& b);
 struct Bar { int x, y; }
};
多分Cとの互換性のために仕様がワケワカメになった例
0516デフォルトの名無しさん (ワッチョイ 7f89-eV1K)
垢版 |
2017/09/02(土) 22:01:20.86ID:VLpwNclp0
コンストラクタ実行時のメンバ変数の初期化の実行順が、初期化子の記述順ではなくクラス定義での並び順に従うっていうのがあった気がするけど、新しい規格では変わったんだっけ?
0518デフォルトの名無しさん (オッペケ Src7-mvsT)
垢版 |
2017/09/02(土) 22:21:28.04ID:MiX3UcgLr
>>516
微妙な表現以外、特に変わったという話は聞いたことがない

C++03 12.6.2/5
Then, nonstatic data members shall be initialized in the order they were declared in the class definition (again regardless of the order of the mem-initializers).

C++20 draft 15.6.2/(13.3)
Then, non-static data members are initialized in the order they were declared in the class definition (again regardless of the order of the mem-initializers).
0523はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff15-X0kF)
垢版 |
2017/09/03(日) 15:42:16.65ID:XXf7E2cS0
あ〜、そんなこと考えたことなかったけど、クラス (メンバ関数) 内部から見たら近いっちゃ近いのかも?
クラスを定義する側じゃなくてそのクラスを使う側の気持ちで考えて。
0526デフォルトの名無しさん (ワッチョイ 7fef-6h2J)
垢版 |
2017/09/03(日) 16:12:00.06ID:5WRYI1ZX0
何度も宣伝するようで気が引けますが,前に書いたのは >>158
演算子のオーバーロードに絡むものは基本 friend で,内輪で使うものは private の static メンバ関数で,
くらいの線引きをしています.
書いてみてわかったのは「自明」という感じはしないこと,かな,考えてみれば friend 関数って他の言語にはなさそうです
0527デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/03(日) 16:48:05.14ID:jXGwZqzU0
何で? operatorはグローバルに出さなくても多重定義候補に挙がるぞ
俺は別の理由でoperatorをグローバルにする傾向があるが
0529デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/03(日) 17:23:08.48ID:jXGwZqzU0
何が不思議?
friendを外すとメンバoperator+に過剰な仮引数となりエラー
friendは「メンバではない」のでアクセス指定は無関係
1点だけ気になるのが、friendは当該クラス自体と同じスコープに新しい識別子を導入しないはず・・・
識別子はoperator+で、これのみは某か標準のヘッダで既に宣言されているということか?
0530 ◆QZaw55cn4c (ワッチョイ 7fef-6h2J)
垢版 |
2017/09/03(日) 17:29:26.39ID:5WRYI1ZX0
>>529
>operator+に過剰な仮引数となりエラー
つまり operator+ の >>528 とは違うもう一つの呼び出し書式にしないといけないわけですね.
でもこの場合は private に置くとコンパイルできない
http://codepad.org/RLo9fKuI

friend はアクセス制御如何にかかわらず「強引にpublic にする」ように見えますね‥わからない‥
0534デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/03(日) 17:39:19.97ID:jXGwZqzU0
>>530
強引にpublic・・・で憶えやすいならそれでいいんじゃね?
ちな俺の憶え方はメンバでないものをどうやってprivateにするんだ、だ
0535片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd1f-dw5s)
垢版 |
2017/09/03(日) 17:40:51.54ID:zmbOaeS6d
あるクラスX内部のstaticでpublicな関数fは、Xのインスタンスの存在に関係なくX::fという名前でアクセスできる。
あるクラスX内部のfriendな関数gは、X内部のプライベートなメンバーm_aにアクセスできる。
0537デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/03(日) 19:02:31.58ID:jXGwZqzU0
friendは他のクラスのメンバかも知れない
そういうときも俺の憶え方なら動揺せずに済む
0538デフォルトの名無しさん (ワッチョイ ff32-X0kF)
垢版 |
2017/09/03(日) 19:05:08.53ID:/S0gLPFy0
メンバ関数より、メンバでもfriendでもない関数を使おう
って誰かが言ってた
0539デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/03(日) 19:11:23.65ID:jXGwZqzU0
欲しい機能がメンバでない関数で使えないとなれば
それはクラスの設計ミスないしはダサい設計だかんな
クラックできちまうのと違う提供すべき機能の欠落
0541デフォルトの名無しさん (ワッチョイ ffc5-JjKz)
垢版 |
2017/09/03(日) 19:55:19.54ID:eN0Ud7+B0
>>530
(1) friendが無い場合
「z = x + y;」に出くわしたコンパイラは
 1. インスタンスxに対しするC::operator+(y)(1引数)の呼び出し
 2. グローバルな関数C operator+(C const& a, C const& b)(およびその亜種)の呼び出し
のあてはめを順次試みるがどちらの関数も宣言が存在しないからあてはまるものが無くエラーになる

(2) friendがある場合
friendがつくことでoperator+()はCのメンバ関数ではなく、グローバルな関数として宣言されたことになる
このとき「z = x + y;」に出くわしたコンパイラは、上の1、2の順で当てはめを試み、
グローバルな関数C operator+(C const& a, C const& b)の呼び出しと解釈する。
本来この関数はクラスCのprivateメンバにアクセスできないが、friendの力でそれができ、めでたくビルドできて動く。

細かい話は規格の人がフォローして☆ホスイ
0542デフォルトの名無しさん (オッペケ Src7-mvsT)
垢版 |
2017/09/03(日) 21:08:24.75ID:Kvjfvtnar
>(2) friendがある場合
最も近い(内側の)名前空間の関数になる(11.3/6-7)
friend関数がメンバーではないことがC++14に明記されていなかったようで、C++17ドラフトに追記された模様(N4659 12.2/2)

<おまけ>
宣言の場所がクラス内という事情により、リンカーはともかくコンパイラーから存在が見えにくい関数となる
この関数を使うには
・名前空間スコープで明示的に宣言し直す
 C operator+(C const& a, C const& b);
・ADL(argument dependent lookup)でクラススコープの検索を発動させる
 >>541でoperator+が呼び出せているのはADLによる
0543デフォルトの名無しさん (オッペケ Src7-mvsT)
垢版 |
2017/09/03(日) 21:36:42.85ID:Kvjfvtnar
つまりクラスの外で定義された関数をイメージすればいい
struct A { friend void operator+(A,A) {/**/} };
 ↓
struct A { friend void operator+(A,A); };
void operator+(A,A) { /**/ } // ただしADLが無いと見えない
0544デフォルトの名無しさん (ワッチョイ b3e4-7rWm)
垢版 |
2017/09/03(日) 21:38:57.90ID:ipvja13x0
ドット拡張とかすればいいのにね
int static_value.fanction() = 0; // function専用
vid functionx.function(char*p){} // function専用

ファイル内スコープなんて今時ほとんど使わないから無視するか識別子重なったら同一と見做すかして
ついでにドット型はファイル内の前方参照も無くし宣言を省けるようにするとかさ
0545 ◆QZaw55cn4c (ワッチョイ 7fef-pwmx)
垢版 |
2017/09/04(月) 01:15:45.54ID:rnM3x3Xp0
>>541
>friendがつくことでoperator+()はCのメンバ関数ではなく、グローバルな関数として宣言された
なるほど,そんなところだろうと >>528 で考えておりました.
件のライブラリもどきでは,operatorX のみクラス外に公開できればいいので,friend 関数で公開しておりました
その他は(基本的に)(公開すらしたくなかったため)static メンバ関数でのprivate 宣言となりました.

そうしたいようにそう書けばいいのですが今一つ統一感を見えてなかったかもしれません.
>>540
すみません
0547デフォルトの名無しさん (スップ Sd1f-TajK)
垢版 |
2017/09/04(月) 08:11:17.30ID:6a+3L2fAd
>>546
みなさんこれが典型的ななんの役にも立たない回答の好例です
0550 ◆QZaw55cn4c (ワッチョイ a36d-pwmx)
垢版 |
2017/09/04(月) 08:28:42.00ID:CIc3tQw70
>>546
static 関数をpublic に置くか,friend 関数にするかの判断がよくわからないのです.
なにか指針があればうれしいのですが
0563デフォルトの名無しさん (ブーイモ MM1f-Gtnu)
垢版 |
2017/09/04(月) 12:57:07.34ID:KIEUzmnzM
クラス内に定義されたstatic関数は、そのクラスのオブジェクトが存在しなくても使える関数ってのが本来の意味。
動的なオブジェクト状態には依存せず、静的なクラス構造のみに依存するからstaticね。

対してfriendは、自分をさらけ出す人を指定するめのもの。

stream のから呼び出されるオペレーターを定義する時には、既に完成している stream (だけ)に対して自オペレーターをさらけ出してしまうのがいろいろな意味で最も効率的。

以上から、friend関数は、静的ポリモーフィズムを関数レベルでお手軽に実現したいときに使うと思っている。
0565デフォルトの名無しさん (ワンミングク MM9f-KFeJ)
垢版 |
2017/09/04(月) 13:05:20.90ID:ByDgWFhHM
>>561
なんで素っ裸でコートきてんの?露出狂なの?って聞かれて
コート脱いだらちんこ見えるようにする為だよって答えてんのと同じだぞ

まったく…露出狂は社会に出ちゃいけない存在なんだから、もう二度とプログラミングするんじゃないぞ
0567デフォルトの名無しさん (ワッチョイ ff90-D/08)
垢版 |
2017/09/04(月) 15:31:51.46ID:xMNR7APW0
>>565
うまい事言うなあ
friendは「なんで俺にだけ素っ裸見せんの?露出狂なの?」と聞かれて
「だってお前友達じゃん。だからお前にだけ俺の裸見せてやんよ」と言ってるわけだしな」
0568デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/04(月) 16:26:06.19ID:pd3pCmCq0
あれだろ
日本語のガールフレンドと
英語のgirl friendじゃ意味が違うというアレ
0571デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/04(月) 17:07:07.44ID:pd3pCmCq0
継承をほとんど使わないってどんな分野だろう
俺んとこではポートを叩くときのプロトコルが
似ているようで少しずつ違うなんての普通にあるし
0579デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/04(月) 23:45:07.31ID:pd3pCmCq0
そうだね、ニュアンス的にはそっちだ
0583デフォルトの名無しさん (ワッチョイ 33e5-6h2J)
垢版 |
2017/09/05(火) 13:50:03.50ID:MHv2cVQ40
printf("We are the World."); ←わかる
cout << "We are the World" <<endl; ←わからない

printfは「関数」だからわかります。
coutの<<はシフト?よくわからないです。
なぜC++はこんな文字の出力のさせ方にしたんでしょうか?関数じゃダメだったんですか?
0586デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/05(火) 14:04:00.15ID:5KjI8r3d0
>>583
それはまさにC++の作者(以下、禿)が
彼の著書でアピールしていたことだ
coutとは何か? <<とは何か?
記号と意味はどこでどのように関連付いているのか
意味は関数で表記することにしよう
<<の意味を表記する関数の関数名をoperator<<としよう
プログラム言語の命令とデータは動詞と目的語だ
動詞は関数と1対1対応でよいが目的語の定義は動詞の蓄積だ
・・・てな具合
0591デフォルトの名無しさん (ワッチョイ c397-Pjaj)
垢版 |
2017/09/05(火) 18:48:59.76ID:Ol0Fklqi0
using namespace std;
double value = 1.23;
cout << "value = " << value << endl;
0592デフォルトの名無しさん (ワッチョイ 33e4-73wU)
垢版 |
2017/09/05(火) 19:06:29.40ID:/x4Q9Nfh0
>>587
お約束を破っているが流し込んでる感が出ているので芸術点高い
0598デフォルトの名無しさん (ワッチョイ 630d-8qEQ)
垢版 |
2017/09/05(火) 20:04:52.50ID:Xvi9WQb30
数学の演算子とプログラム言語の演算子のことじゃないかな。

+ - は数学とプログラム言語で一致
* / は数学と違うけど文字セットに乗除の記号がないし妥当な代用
<< をシフトに使うのはC系プログラム言語の独特の使い方
だったら << が出力になってもええじゃないか、という話。
0602デフォルトの名無しさん (ブーイモ MMff-QCDP)
垢版 |
2017/09/05(火) 20:11:12.82ID:TUBHCjnbM
>>595
ありがとうございます
保証するにはどうすればいいですか?
ググってstackoverflowとか見たんですが、できないという人もいたり
clear()を使えという人もいてよくわかりません
0603デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/05(火) 20:17:36.79ID:5KjI8r3d0
禿が言い出した<<と
おまいらが言い出す<<では
悪いが社会への影響度がまるで違う
大勢のPGが<<はI/Oだと素直に従うかどうかでだ
新しい言語に旧来の言語と似た記号が出てきたからって
同じ意味でなければならないという法はどこにもない
0608デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/05(火) 21:50:59.32ID:5KjI8r3d0
>>605
それな
俺も時々欲しくなるんだけど
キャリーを含む/含まないとかCHAR_BITの違いとかで
移植性が確保しにくそうだよな
記号を何にするかなんて後から決めりゃいいことだ
0609デフォルトの名無しさん (ワッチョイ c300-sFCB)
垢版 |
2017/09/05(火) 22:29:35.14ID:NIuXE25q0
>>605
ローテートなんて頻繁に使うものじゃないから

ビットが立ってる数を数えるとか、
ビットが立ってる位置を調べるとか、
バイト単位の並び替えとか、
小数から整数へ四捨五入とか、
他にいくらでも足したいものはある
0612デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/05(火) 23:58:08.13ID:5KjI8r3d0
ジョンバッカスだろ
0614デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/06(水) 00:21:11.51ID:eLdBXtqw0
operator?:ならマジで提案してみそ
あわよくば大手柄だぞ
0616デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/06(水) 00:47:00.85ID:eLdBXtqw0
613なりのcxxfrontでも作ればいい
0620デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/06(水) 08:45:25.92ID:6GspjXt70
>>618
BASICのように=の意味が文脈で変わるべきだと?
0625デフォルトの名無しさん (ワッチョイ 33a6-SDEO)
垢版 |
2017/09/06(水) 09:44:12.68ID:f82uiC9X0
自民党の恐怖の言論弾圧が迫る! 

売国安倍は憲法改正で国民主権と基本的人権
を奪うつもりだ。 ← 民主主義の崩壊

http://www.data-max.co.jp/280113_ymh_02/

↑ マスコミは 9条しか報道しないが 自民案
の真の恐さは21条など言論の自由を奪うこと

自民案が通ると 政府批判しただけで逮捕されるぞ!

https://www.youtube.com/watch?v=h9x2n5CKhn8

上のビデオで 自民党は 日本人に基本的人権
は必要ないと 異常なことを平気で言う。

http://xn--nyqy26a13k.jp/archives/31687

↑ 都民ファーストも安倍と同じく 憲法改正で 人権
無視の大日本帝国憲法に戻すつもりだから
絶対に投票してはだめだ。 民主主義が崩壊する

http://blog.goo.ne.jp/ngc2497/e/8899f65988fe0f35496934dc972e2489

↑ ネトウヨ= 安倍サポーター工作員はネットで国民を騙す。

https://dot.asahi.com/aera/2016071100108.html?page=3
http://blog.goo.ne.jp/kimito39/e/c0dd73d58121b6446cf4165c96ebb674

↑ 安倍自民を操るカルト右翼「日本会議」は国民主権否定。
国民投票や選挙では自民党、維新、小池新党に絶対に入れるな。
0626デフォルトの名無しさん (ワッチョイ c397-Pjaj)
垢版 |
2017/09/06(水) 11:33:15.11ID:Mqa6x7N10
2003年8月の第1回から2007年3月の第6回までいずれも中国北京で計9次の会合が行なわれた
話し合いで解決しなかった
原爆、弾道ミサイルの開発にカネ、時間を与えてしまった
軍事力でつぶすしかないのに、まだこんなこといってる


         ,,-―--、
        |:::::::::::::;;;ノ  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
        |::::::::::( 」 < 対話で解決しよう
        ノノノ ヽ_l   \______________
       ,,-┴―┴- 、    ∩_
     /,|┌-[]─┐| \  (  ノ
      / ヽ| |  バ  | '、/\ / /
     / `./| |  カ  |  |\   /
     \ ヽ| lゝ    |  |  \__/
     \ |  ̄ ̄ ̄   |
      ⊂|______|
       |l_l i l_l |
       |   ┬   
0628デフォルトの名無しさん (スプッッ Sd1f-TajK)
垢版 |
2017/09/06(水) 12:36:56.86ID:/66SkMcqd
話が成り立たないアホばっかりだな
0629デフォルトの名無しさん (ワッチョイ 6f7b-DEiO)
垢版 |
2017/09/06(水) 15:29:10.13ID:fXx7GStM0
プログラミング勉強し始めた初心者ですが
手詰まりになったので質問させてください

ttp://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_3_C&lang=jp

この問題をやっていますが、以下のコードで「Time Limit Exceeded」となってしまいます
他の正解者のコード見てもやってることは同じな気がするのですが
なにがいけないのでしょうか?

C++14コード
ttp://codepad.org/2Yxb33Ab
0631629 (ワッチョイ 6f7b-DEiO)
垢版 |
2017/09/06(水) 15:40:37.11ID:fXx7GStM0
追記です

Case#8までは「Accepted」でOKなんですが
Case#9が「Time Limit Exceeded」でした

Case#9は入力が2000000行もあるっぽいです

でも他の人とやってること自体は同じなんだから
このコードでできるはずと思い込んでしまって
何が悪いのかさっぱり検討つきません。。。
0634デフォルトの名無しさん (ワッチョイ 6309-8f0a)
垢版 |
2017/09/06(水) 15:59:43.73ID:I6k6pGLy0
Listそのものがそんなに早くないとかかなぁ。
デリートはO(1)で終わるけど、ポインタの付け替えとかあるから、雑に遅いカモね。
最近のコンピュータだと配列の方が早かったりする。
0641デフォルトの名無しさん (ワッチョイ 6f7b-DEiO)
垢版 |
2017/09/06(水) 19:15:05.29ID:fXx7GStM0
>>630
>>632-639
ありがとうございます!

まさに>>635だったみたいです
1行ごとに入力を読み込みたいからsstream使ってたのですが
そのせいでwhileループで毎回sstreamとstringの変数を定義しているせいでした

cinとstringだけで入力を読み込むようにして
変数の定義をループの外にしたらようやく自分のコードで通りました

sstream使わなくてもstring変数の定義をループ内に書いたままにしてたら
ずっと通らなくてそれで何時間も四苦八苦してようやくすっきりしました

変数の定義って思いの外処理時間がかかるんだなあとしみじみ実感しました

わざわざコーディングまでしてくださってありがとうございました
0642デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/06(水) 21:33:01.28ID:6GspjXt70
> 変数の定義って思いの外処理時間がかかるんだなあとしみじみ実感しました

ものによる
テキトーこくな
0648デフォルトの名無しさん (ワッチョイ 9ac5-FXPZ)
垢版 |
2017/09/07(木) 06:02:40.83ID:sowmLjiv0
C++のstream関連は全て糞
operator<<()の多重定義で自作クラスのフォーマット文字列化(stringizing)ができる、というのがちょっと嬉しかったけど
しょせんコードの見かけだけの話やし、実行速度は速いし改造もしにくい、
(printf()ならvprintf()を使って関数1個書けば良いところをstd::streambufの派生クラスを作る羽目に、、
 行単位の排他とかの作り方を比べたらワカル

だいたい一般に1つのクラスに対して一般に
 (1) 人間が読むためのフォーマット文字列化
 (2) ストレージか何かへのシリアライズ
 (3) ストレージか何かからのデシリアライズ
の3つの要求が生じるのに対してoperator<<()とoperator>>()の多重定義の2個では数が足りない
だったら上記3メソッドのインターフェースを全部Cのstdioベースで実装して済ませるわ;

とにかくC++の中にあってstreamはパフォーマンスよりもコードの見かけに拘ってみました感が異端
0649デフォルトの名無しさん (ドコグロ MM92-Qch9)
垢版 |
2017/09/07(木) 06:46:38.33ID:9W4DbE9gM
>>644
> 変数の定義って処理なのか?
コンストラクタって知ってるか?

> stringが遅いのはどの言語でも同じ。ヒープに確保してるから。
そもそもstring型はすべての言語にないし文字列型と言う意味ならFORTRAN77のように固定領域にとる言語もある

>>645
モダンなバージョンなら普通にあるでしょ
Fortran ⇒ Allocate 文
Cobol もオブジェクト指向になってるぐらいだからあると思う
0652デフォルトの名無しさん (ワッチョイ 17e4-9lW3)
垢版 |
2017/09/07(木) 08:40:05.33ID:BwtgUJJf0
ライブラリなど不要
0654デフォルトの名無しさん (ブーイモ MMff-zX58)
垢版 |
2017/09/07(木) 12:51:16.16ID:m/W0Vwq0M
>>648
おちつけ。

> 実行速度は速いし改造もしにくい、

> だいたい一般に1つのクラスに対して一般に
0660デフォルトの名無しさん (ブーイモ MM26-7FiT)
垢版 |
2017/09/08(金) 21:05:50.39ID:VlEBq8a5M
>>648
モダンな言語の多くはprintfライクだし、javaも結局追加された。
printfライクのほうが効率的なことは経験的にわかってるのだからstreamにイマドキのformat関数を追加してくれればいいのに。
0669デフォルトの名無しさん (ワッチョイ 2309-g9be)
垢版 |
2017/09/09(土) 21:07:39.82ID:FtyOtgZ20
なんか、VCもGCCも半分くらいずつ間違えてる予感。
Setだけだとストレージがないからなんかバグの予感するし。
ストレージ持たせようとすると修飾が間違ってるって言われてる感じがする。
なんだこれ。
0674デフォルトの名無しさん (ワッチョイ 2309-g9be)
垢版 |
2017/09/10(日) 00:32:56.15ID:8Jhjgi9Q0
>>673
およ、折衷案できそうか?
自分はVC動けばいいんだけど、
コード公開するときに動かないと間抜けっぽいから良対応しようと一応やってる。
visualデバッガが便利すぎてVCやめるの大変。
0679デフォルトの名無しさん (ワッチョイ 2309-g9be)
垢版 |
2017/09/10(日) 07:35:26.76ID:8Jhjgi9Q0
折衷案色々あるなぁ、感心する。

>>676
別に個人のコードでどこかに迷惑かけてるわけじゃないし、この程度のコードも読めない方が問題。
それに高慢なお方は最初から相手にしてない。マウントしてほしくてやってるんじゃないんだよ。
0686デフォルトの名無しさん (ワッチョイ e311-xkdj)
垢版 |
2017/09/12(火) 09:35:13.31ID:M9yu8us30
何故そういうコードになっているかを理解せずに猿真似して意味があるかどうかはわからんけど
autoで受けるとおかしなことになるのは、キャストや代入で望む結果を得る方法(expression templateなど)全部そう
暗黙のキャストでなく関数呼び出しを強制すればautoでも大丈夫だけど
0687デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/12(火) 10:11:33.04ID:CGKPtYms0
> 馬鹿に触らせるなテンプレートって昔から言うしな。

自分が触りたくないのはわかったから
0691はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5a15-xkdj)
垢版 |
2017/09/12(火) 22:54:11.94ID:cQiNwo4o0
>>688
あ、なるほど、状況を勘違いしてた。

C++17 からは RVO が使える場合は常に RVO で処理する (従来は「してもよい」というオプショナルな動作) ことと、
そのときはコピー (ムーブ) コンストラクタが無くても良いというルールが念頭にあったのだけれど、
この場合は RVO は関係なかった。 スマソ
0695デフォルトの名無しさん (ワッチョイ ab1c-/PGn)
垢版 |
2017/09/14(木) 22:59:53.42ID:AfykdPhZ0
いい流れだ
0696デフォルトの名無しさん (ワッチョイ c1a6-PzL5)
垢版 |
2017/09/15(金) 15:29:03.53ID:zUPCfesd0
"clacla.h"
class Clacla {
void func1();
void func2();
void func3();
};

"clacla.cpp" //実装部
クラスClacla くくり { <-ここ
void func1() { printf( "1" ); }
void func2() { printf( "2" ); }
void func3() { printf( "3" ); }
};
のように関数の実装時にClacla::を省略する方法ってあるでしょうか?
0697はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1315-SGtB)
垢版 |
2017/09/15(金) 15:33:45.29ID:leF15WXE0
>>694
最適化が有効なら C++17 であろうがなかろうが clang なら RVO が効くはずだけど、 u.p の値は null になっちゃうな。
RVO がどうこうじゃなくて this の挙動に関するなんか変なルールが適用されてるとかかも?
0699696 (ワッチョイ c1a6-PzL5)
垢版 |
2017/09/15(金) 16:35:44.21ID:zUPCfesd0
>698
やっぱり無いですよね。
ありがとう。
0702デフォルトの名無しさん (ワッチョイ 59e4-HfMd)
垢版 |
2017/09/15(金) 21:27:27.94ID:5X/IRSU20
右辺値参照の暗黙適用は例外の処理で不都合があるよね
元の値をTmpにコピっといて例外発生で書き戻すにしても
関数A処理内で呼び出した関数Bからの例外をAのユーザコードでは完スルーなのに
コンパイラコードではコッソリ捕まえて書き戻す必要が有る
そんときロックでも掛かってたらどーすんのよと

呼び出し繋がりを横断的に管理要するとんでもないコスト増なんじゃね?
0703デフォルトの名無しさん (ワッチョイ 93c5-+NpA)
垢版 |
2017/09/15(金) 21:36:23.16ID:xDlOGQNS0
Tmpのアドレスを関数B(およびその先の関数)が知る可能性がコンパイラから見て排除できない限り
関数Aから関数Bを呼び出す前にTmpは元の値の完コピーにならざるおえないのでは…
(そうでなければ副作用のある関数を安全にコンパイルできない&安心して書けない

さらにロックに入るときと出るときは上と同じ理由で結果的に完コピーになる上に、
まともなOSならメモリバリアまで手当てしてくれるんじゃ…
0704デフォルトの名無しさん (ワッチョイ 93c5-+NpA)
垢版 |
2017/09/15(金) 21:42:30.18ID:xDlOGQNS0
つまり右辺値参照の暗黙適用が効力を持つのはスゲー広範にインライン展開されるような場合
(当然いかなるOSのAPIやシステムコール類の呼び出しも含まない
「だけ」
であって、通常のプログラマーにはあんまありがたみがはっきりしない仕様

※ 個人の感想です
0710デフォルトの名無しさん (スップ Sdf3-1/aj)
垢版 |
2017/09/18(月) 10:24:11.11ID:lVEmBRA9d
tcp/ipの勉強のためにC++で何か作れば勉強になるかな?って思ってるのだけど
こういうものを作れば勉強になるよってものある??
パケットの動きだったり階層の考え方だったりを学びたい
0711デフォルトの名無しさん (ドコグロ MM9d-BsvU)
垢版 |
2017/09/18(月) 10:40:29.87ID:U79GLBVsM
>>710
TCP/IPの勉強ならWireSharkの使い方覚えた方が早いかも
その上のプロトコルレベルなら勉強したいプロトコルの簡単なクライアントから始めればいいと思う
ちなみに俺はNetNewsに流れるむふふ画像を取り込みたかったのでnntpのクライアントをperlで組んで勉強した
0712デフォルトの名無しさん (スップ Sdf3-1/aj)
垢版 |
2017/09/18(月) 11:05:46.29ID:lVEmBRA9d
>>711
プロトコルレベルの勉強をしたい
そうなるとhttpサーバを立てることになるのかな?
そういう場合は簡単なhttpサーバとクライアントを作成すれば良いのかね?
それで通信しあってwiresharkで中身を見てtcpだったりhttpだったりを見るべき?
0713デフォルトの名無しさん (ワッチョイ 939f-0QkJ)
垢版 |
2017/09/18(月) 11:39:07.40ID:9mrqYCJU0
おれは一昔前、深夜ボリュームでかくする姉貴のPCが煩くてTCP通信でマスターボリューム弄るサーバー&クライアント作ってコッソリ仕込んでコントロールしてたな。
まぁ、やってやるぞというモチベーションは大事だとおもうよ。
ガンバってね。
0715デフォルトの名無しさん (スップ Sdf3-1/aj)
垢版 |
2017/09/18(月) 11:43:19.16ID:lVEmBRA9d
>>713
姉貴のパソコンにサーバプログラム常駐させる
そいつがポートXXXで待ち構える

同じ家なのでネットワーク帯は同じで
自分のpcからポートXXXにメッセージ送信する

姉貴のサーバプログラムが受け取ってボリューム下げる処理をする

こんなことしてたってことかね?
0716デフォルトの名無しさん (ワッチョイ 939f-0QkJ)
垢版 |
2017/09/18(月) 12:01:08.52ID:9mrqYCJU0
>>715
まぁ大体そんな感じなんだが、急に音量小さくすると即効でばれるので、まず、姉貴PCの音量を取得するのが第一だな。
そこからスライダーでボリューム下げていった値をサーバーに順次送信しサーバープログラムがその値に応じて音量を徐々にフェードコントロールするといった具合だな。
0729デフォルトの名無しさん (スップ Sdf3-1/aj)
垢版 |
2017/09/19(火) 10:23:20.37ID:mIuFgC1Fd
初歩の初歩の初歩の質問なんだけど
あるPCにポートXXを口とするサーバソフトを同時に二つ立てることはできないよね?
1つめはXXを使うとしてその後にたてられた2つめはどうなる?
(スレチっぽくなってますがよろしくです...)
0730デフォルトの名無しさん (ワッチョイ 2be3-SGtB)
垢版 |
2017/09/19(火) 10:38:02.75ID:S6233VLa0
出来ます
サーバー側はリクエストに応じて複数のプロセスを起動し、
同じポート番号を使って複数のプロセスが受け答えします
各プロセスはそれぞれで生成したソケットを使ってクライアントとやり取りします
0731デフォルトの名無しさん (スップ Sdf3-1/aj)
垢版 |
2017/09/19(火) 10:57:49.02ID:mIuFgC1Fd
>>730
それってプログラム内でforkして子プロセスを作る場合の話です?
サーバソフトAとサーバソフトBの両立ができたとすると
ポートXX使用します!ってのはどこでどちらを使うと判断するのでしょうか...
0738デフォルトの名無しさん (ワッチョイ ab1c-/PGn)
垢版 |
2017/09/19(火) 20:12:29.29ID:4ZFv917O0
C++98ではできない
C++11以後できるようになった
だろ、通信は本質的にマルチタスクだ
0741デフォルトの名無しさん (ワッチョイ 6123-pFfB)
垢版 |
2017/09/20(水) 03:12:29.17ID:E3lPvo/Y0
bind()する時のローカルのIPアドレスを別々にすれば同一ポートで別々のサーバプログラムって動かないの?
0742デフォルトの名無しさん (ワッチョイ 016f-V8Sm)
垢版 |
2017/09/20(水) 04:49:07.58ID:uOAr6bd90
>>741
だから動くってば
ユニークである必要があるのはIPアドレス:ポート番号の組み合わせだから

>>730
>各プロセスはそれぞれで生成したソケットを使って
まさかその生成されたソケットがサーバーと同じポート番号を持つとか思ってないよな?

いずれにせよこんなのはネットワーク初心者の話題であってC++とは何も関係ない
0744742 (ワッチョイ 016f-V8Sm)
垢版 |
2017/09/20(水) 10:56:07.53ID:uOAr6bd90
自己訂正
>まさかその生成されたソケットがサーバーと同じポート番号を持つとか思ってないよな?
あはは、これは俺の勘違いだったわ
acceptで返されるソケットはlistenポートと同じポート番号を持っている
0745デフォルトの名無しさん (ワッチョイ 0665-hoCt)
垢版 |
2017/09/21(木) 05:09:49.50ID:t8iqXrAz0
質問です。

{ 10/*%*/ } = { a,b,c };

というのは、
a = 10%
b = 10%
c = 10%
なのでしょうか?それとも、
a+b+c = 10%
なのでしょうか?
0746デフォルトの名無しさん (ワッチョイ de23-KbB0)
垢版 |
2017/09/21(木) 05:48:27.92ID:eSaSp7RC0
C++を習得するのに莫大な時間を費やしました。

C++のプロフェッショナルなプログラマーになりたかった。

なのに、ハード系の知識が無いと言う理由で、もらう仕事はVB.NET、C#.NET系ばかりでした。
0747デフォルトの名無しさん (ワッチョイ de23-KbB0)
垢版 |
2017/09/21(木) 05:51:26.56ID:eSaSp7RC0
質問を書くのを忘れやんした。

C++の仕事ってハード系、通信系、制御系以外、通常業務のシステム開発はないんでしょうか?
0748デフォルトの名無しさん (ワッチョイ 8a9f-Dwg9)
垢版 |
2017/09/21(木) 06:00:29.19ID:Bo0/1phe0
ポート重複で同じアドレスでBananaサーバーみたいなラックマウントサーバーの仕組みってあれは一つのサーバーがlistenで待って接続してきたクライアントの処理を複数の子サーバーに割り振っているだけなのか?
0754デフォルトの名無しさん (ワッチョイ 8a4b-nCCx)
垢版 |
2017/09/21(木) 13:21:38.51ID:TbHBi0+x0
>>752
PODがかかわってる部分はあるけど基本として理解しておくべきことは
=default,=delete指定はコンストラクタの宣言でも定義でもない
ということ

つまり>>749の文脈では
struct unko { unko()=delete; };
int main() { unko u{}; }

struct unko {};
int main() { unko u{}; }
と等価でありuはaggregate初期化されコンストラクタは呼ばれないからエラーにならない
(unko();みたいにはっきりとデフォルトコンストラクタが呼ばれる状況ならエラーになる)
0756デフォルトの名無しさん (オッペケ Sra3-u5jE)
垢版 |
2017/09/21(木) 17:36:23.55ID:E1HbcZFyr
>>752
規格によると unko u{}; は
8.5/p17『If the initializer is a (non-parenthesized) braced-init-list, the object or reference is list-initialized』によりリスト初期化される
リスト初期化は8.5.4/p3『If T is an aggregate, aggregate initialization is performed』
に該当するのでコンストラクターが呼ばれずにaggregate初期化される。

なおaggregateの定義は8.5.1/p1により『array or a class (Clause 9) with no user-provided constructors (12.1), no (略)』
ここで8.4.1/p1により「=delete」は関数本体だが、
8.4.2/p5によりuser providedではないと見なされている(たぶん)
0759デフォルトの名無しさん (ワッチョイ 0f23-Dc1X)
垢版 |
2017/09/23(土) 11:36:40.13ID:2CJ5RW/30
>>747
20年前は普通にあった、ていうかそれしか方法がなかったが
今はもっと楽な方法があるのでほぼ無くなった

僅かな例外はパフォーマンスを求めるようなプログラムを作る場合だが
それでもライブラリなどの表から見えない部分の作成に限られる
0760デフォルトの名無しさん (KR 0Hc2-GWmJ)
垢版 |
2017/09/23(土) 21:53:53.16ID:DdQqqOWmH
各添字が 1 から X まで動く多次元配列を一次元で
A[i + X*j + X*X*k]
のように表しているのですが、この多次元配列の各添字を入れ替える操作を頻繁に行うので、関数にしたいです。
どのようにするのが良いでしょうか。

たとえば
f(A, B, 2, 3, 1);
のように引数をとって B という配列に
B[j + X*k + X*X*i] = A[i + X*j + X*X*k]
と要素を入れたいです。

「2, 3, 1」を関数の中で解釈する方法も分からなくて困っています。
0763デフォルトの名無しさん (ワッチョイ 8aaa-Dc1X)
垢版 |
2017/09/23(土) 22:36:10.87ID:dWsmcDp10
>>760
こういう解釈でいいかな?

template <typename T, std::size_t X>
void fillA2B(T (&A)[X*X*X], T (&B)[X*X*X], int ax1, int ax2, int ax3)
{
int i, j, k;
int& ii = (ax1==1)? i: ( (ax1==2)? j: k );
int& jj = (ax2==1)? i: ( (ax2==2)? j: k );
int& kk = (ax3==1)? i: ( (ax3==2)? j: k );
for ( i = 0 ; i < X ; ++i )
for ( j = 0 ; j < X ; ++j )
for ( k = 0 ; k < X ; ++k )
B[ii + X * jj + X * X * kk] = A[i + X * j + X * X * k];
}

int main()
{
const int N = 2;
int A[N*N*N], B[N*N*N];
int n{0};
for ( int a = 0 ; a < N*N*N; ++a )
A[a] = n++;
fillA2B<int, N>(A, B, 1, 2, 3);
fillA2B<int, N>(A, B, 2, 3, 1);
fillA2B<int, N>(A, B, 3, 1, 2);
return 0;
}
0769デフォルトの名無しさん (KR 0Hc2-GWmJ)
垢版 |
2017/09/24(日) 00:25:12.68ID:QX+6yKIgH
>>761
もちろん任意の次元を一度に扱えたら最高です。
ゆくゆくは各添字の次元を変えることも考えています。

>>762>>765
すみません。
全要素を並び替えたいです。

>>766
カラムメジャー、ロウメジャーを任意にしたいという背景があります。
また、各添字の次元が本当は任意であるということもあります。

>>763
ありがとうございます。
確かにこれで>>760はできそうです。
パーミュテーションの実装の仕方が分かりました。
原理的にはこれで任意の添字の数、次元に対応できる (それぞれ関数を作る必要はある) と思うのですが、もっとアカデミックな方法ともあるのでしょうか?
0770デフォルトの名無しさん (ワッチョイ 8a4b-nCCx)
垢版 |
2017/09/24(日) 02:35:34.07ID:0uAENq5F0
>>769
アカデミックは知らんが一般化するなら
B[ i*bi[0] + j*bi[1] + k*bi[2] + ... ]
と各次元ごとの係数を変数にして設定だな
>>760のたとえばでは bi[0] = X*X, bi[1] = 1, bi[2] = X

あとはインターフェイスにあわせてヘルパ処理を用意すればいい
f(... int x, int y, int z)
int bi[3];
bi[x - 1] = 1;
bi[y - 1] = X;
bi[z - 1] = X*X;
0771デフォルトの名無しさん (オッペケ Sra3-GWmJ)
垢版 |
2017/09/24(日) 17:29:12.46ID:vw1eQBGxr
>>770
ありがとうございます。
あとは任意個数の引数を取れるようにすれば添字がいくつあっても、各添字がどのように走っても一つの関数で対応できますね。
勉強になりました。
0773デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/25(月) 10:20:39.11ID:c/fcx1bx0
任意個数の引数って、まさか省略記号と可変個数実引数では・・・
と思ったらモロじゃねえか おいおい
このスレ的にはinitializer_listやtemplate parameter packだろ
0779デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/26(火) 10:35:57.85ID:DAuKDJeY0
>>776
このスレ的にはって書いてあるのが読めてないのか
自分が苦手なものに触れられたくないのか
どっちだ?
0781デフォルトの名無しさん (ワッチョイ fa91-PvnN)
垢版 |
2017/09/26(火) 11:38:28.30ID:XSwUFkBD0
つかぬことを伺いますが、
あるクラス内で定義した構造体を同クラス内でstatic constメンバとして宣言し、
外部で定義しようとしたところ、「〜との互換性がありません」と出て上手く行きません
どうすればよいのでしょうか

〜ヘッダ内
class Hage{
public:
struct A{
int a;
int b;
};

static const struct A M;

}

〜ソース内
#include "ヘッダ"
const struct A Hage::M; //不正
0786デフォルトの名無しさん (ワッチョイ d311-Dc1X)
垢版 |
2017/09/26(火) 15:18:58.40ID:SDiSqFpw0
###HUM###
000-K,AZ,0,1,
001-KI,L,I.T,DEF,11.2,TE,F,0.12235,
002-EM,OBLA,7##END
0787デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/26(火) 15:24:00.47ID:DAuKDJeY0
>>780
うわーおまえ、それ人に聞かなきゃ判んねえの?

省略記号は右端という初歩の初歩でミスりながら
ドヤってる笑い地獄が2日前あったんだが
突っ込めなきゃせっかくボケた芸人も泣いてるだろうな
0792デフォルトの名無しさん (オッペケ Sra3-t5bw)
垢版 |
2017/09/26(火) 19:31:39.64ID:T9NefDHyr
>const struct A Hage::M; //不正

初歩的でなく相当に高度な気がしてならない
規格の3.4.1/p7,p8,p14あたりを頭に入れていないといけない
「class NS::C;」のように何でも「::」を付ければ良いと言うわけでもないので
0798デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/27(水) 00:14:02.46ID:LyDwKMB00
>>788
おーいバカ、省略記号の位置の件はわかったか?
まさか789なみの重度池沼じゃねえよな
0800デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/27(水) 00:57:18.03ID:LyDwKMB00
だからって770の大ボケを正当化する法はあんめえ
0802デフォルトの名無しさん (ワッチョイ eb11-Dc1X)
垢版 |
2017/09/27(水) 09:12:11.59ID:nsBNhogE0
>>800
お前まだ分からんのか・・・
>>770のどこが大ボケなんだよ
添え字演算子の中で二項演算子の後に省略記号書いて再帰的に計算させたり
パラメータパック(またはそれを含む式)も無しに引数の左端にいきなり省略記号書いたり
なんてのはCでもC++でも出来ないの
お前みたいにCの可変長引数もvariadic templateも分かってるつもりなら
>>770を見た瞬間にこれは文面上の省略であって動くコードではないと一瞬でわかるはずなんだよ

質問でもないのにageまくるわ自分も初心者のくせして同じ初心者(あるいはそれ以上)を聞きかじりの知識でバカにしようとするわ
憂さ晴らしにしか利用しないのなら出ていけ
0803デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/27(水) 09:30:35.39ID:LyDwKMB00
文面上の省略だっておw
大ボケに苦しい言い訳を上塗りして
アフォから超アフォに進化したなあ
0805デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/27(水) 10:03:04.41ID:LyDwKMB00
どう見ても770だな
必死さの理由が他にない
0807デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/27(水) 11:12:43.27ID:LyDwKMB00
驚いた、ム板にIP信者がいるとはね
嘆かわしい限りだ
0810デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/27(水) 14:47:33.57ID:LyDwKMB00
大ボケ+言い訳+IP信者+錯乱

この安定したアフォぶりは、どう見ても同一人物だなw
0811デフォルトの名無しさん (ワッチョイ 1511-Txnz)
垢版 |
2017/09/29(金) 01:30:30.30ID:ppl3WHHK0
%%%3%%%
000-DOK<NAZE-0.8112162>
001-3800%\73NMB/1,81,2,NB"IKKI"%
002-91.81%ML7"8.122231746668193,43@ML.4@"%^23.1444
003-1.33321444718%"YLD""SO"%{71.%{62.1339816{331.422231765%<<<NL6
004-LOOP%Go To"000"%

VCL
0817デフォルトの名無しさん (ワッチョイ 234c-Txnz)
垢版 |
2017/09/30(土) 01:39:01.97ID:zjlhf9G/0
VisualStudioでMFCのSDIテンプレートを作ると、ドキュメントクラス、ビュークラス、アプリケーションクラス、メインフレームクラスができますが、
これらのポインタを初期化時にグローバル化しておいて、以後あらゆるクラスから気軽にアクセスできるようにしとくのは良くないんでしょうか?
グローバル変数はあまり使うべきではないという考えは置いておくとして、動作上問題は起こるのでしょうか?
0821デフォルトの名無しさん (ワッチョイ 4b1c-HyX/)
垢版 |
2017/10/01(日) 04:08:21.65ID:EFR2vscz0
あーこの人、こうやっちゃったんだ(ニヤニヤ
しながら使うもの
ARM C++ベースなんで同情するところもあるけどね
0822デフォルトの名無しさん (ワッチョイ 23c5-+G6K)
垢版 |
2017/10/01(日) 11:18:29.65ID:coFT7XLp0
グローバル変数だからといって頭ごなしにぶち切れるのもいかがなものか…
CPU視点でやるべきことに対して処理順序にあいまいさが生じないなら実行上問題無いし、
プログラマーの視点で管理できる個数なら実用上も問題無い
同一クラスの複数インスタンスが欲しければグローバルな配列にしたらやり過ごせる

ていうか仮にtheAppを根とする木構造で全てのデータを管理することを思い立ったとして、
その木の根付近をぶち切って得た2〜3の大枝をグローバル変数を根とするそれぞれ別の木にする、ぐらいの
挿し木設計は設計上のショートカットとして許されるべきや
というのは、プログラムのあらゆる箇所で
 theApp()->getMemberA()->getMemberAA()->getMemberAAA()->...->getMemberZZ()->getValue()
と書かねばならなかったものが、
 g_dataAA->...->getMemberZZ()->getValue()
ぐらいで済む
0823デフォルトの名無しさん (ワッチョイ 032e-asy+)
垢版 |
2017/10/01(日) 12:31:41.44ID:A+1idbvt0
平気でグローバル変数を使う奴はtheAppの混じったコードを使いまわし続けて大量にデータを持たせるようになる
そして結合しまくりのクラスを他のソフトにコピペしていつのまにか神theAppができある
マルチスレッドで読み書きしてるもんだから予想外のバグが起こる
上司はそれでそれが当たり前だと思ってるから同じようにしろと俺に命令する
俺切れる
0824デフォルトの名無しさん (ワッチョイ 23c5-+G6K)
垢版 |
2017/10/01(日) 12:47:25.61ID:coFT7XLp0
>マルチスレッドで読み書きしてるもんだから予想外のバグが起こる
これはグローバル変数でなくとも起きる設計なら起きるから別件
ていうか
>CPU視点でやるべきことに対して処理順序にあいまいさが生じ(>>822)
ているケースにあたる

非同期呼び出しの同期化は呼び出される側のクラスで解決すべき、というだけ
メソッド内で完結できれば最も安全
パホーマンスや処理の粒度の関係でそれが適さない場合は
トランザクション処理をちゃんと設計汁、
0826デフォルトの名無しさん (ワッチョイ 032e-asy+)
垢版 |
2017/10/01(日) 14:12:37.21ID:A+1idbvt0
>>824
ちょっと足りなかったわ
マルチスレッドでかつ複数のクラスを跨って別々の場所で読み書きされているからいつどこで変更されるかわからないことが多々ある
そうなるとあちらを立てればこちらが立たずといった感じになり、きれいに書く気力が失われてさらに汚さが加速する

>>825
必要なデータだけを引数で与えるべき
0832デフォルトの名無しさん (ワッチョイ 2311-KCdQ)
垢版 |
2017/10/01(日) 15:35:52.14ID:7TdPvZgo0
>>831
> 引数を渡す側がそのデータをどこにどうやって保持すればいいのか、という問題が残るだけでは?
再帰的にたどって行けばいいだけかと
プログラムの寿命とほぼ同じ寿命が必要ならmain( )で定義することになるだろうし
0834デフォルトの名無しさん (ワッチョイ 23c5-+G6K)
垢版 |
2017/10/01(日) 15:41:47.38ID:coFT7XLp0
んまーマルチスレッド機能有りのOSであり
 (1) OSがプリエンプトしてくるのを止めるAPIが無い
 (2) ユーザープログラム独自に割り込み禁止命令を実行できない(特権命令違反でトラップされる
としたらユーザー側ではフラグのread modify writeのアトミック性を保証する術がまるきり無くなる
0836デフォルトの名無しさん (ワッチョイ 23c5-+G6K)
垢版 |
2017/10/01(日) 15:51:28.11ID:coFT7XLp0
しかしまあ同期処理はOSが提供すべき(理念としてだけでなく、その方が効率よく実現できるから
というのは同意
マルチスレッド機能があるOSなら必ずプリエンプトされないコード範囲を持つので、そこでなら
interlock系の命令を持たないZ-80みたいなCPUでも何も問題なくアトミックなread-modify-writeができる、
0841デフォルトの名無しさん (ワッチョイ 032e-asy+)
垢版 |
2017/10/01(日) 17:18:14.77ID:A+1idbvt0
>>831
どんどん上にたどっていく
そのデータを管理しなければいけないクラスあるいはmain関数が保持すればいい
externした変数はそのクラスが所有権を持っていることと同等なので、パフォーマンス上の都合が無ければ極力共有は避けるべき
あとコードを使いまわすときにも障害になる
ファイルにまとめて他でincludeしてもそのまま使えない
0842デフォルトの名無しさん (ワッチョイ 23aa-Txnz)
垢版 |
2017/10/01(日) 17:46:49.19ID:+enXMbbO0
>>841
>そのデータを管理しなければいけないクラスあるいはmain関数が保持すればいい

クラスが持つっていうのはそのクラスのスタティックメンバにしろという意味?
それでは結局グローバル変数とか無名namespace内変数とあまり変わらないような気がする。
0843デフォルトの名無しさん (ワッチョイ 032e-asy+)
垢版 |
2017/10/01(日) 18:21:24.53ID:A+1idbvt0
>>842
言ってる意味がわからない
クラスA内クラスBとCを宣言して

B b;
C c;
c.set_data(b);

だとか

main関数内で

Dptr d_ptr = D::get_resource();
Eptr e_ptr = E::get_resource();
F f(d_ptr, e_ptr);
f.excute();

とかこんな風にする
0844デフォルトの名無しさん (ワッチョイ 23aa-Txnz)
垢版 |
2017/10/01(日) 18:30:22.24ID:+enXMbbO0
>>843
んー

>そのデータを管理しなければいけないクラスあるいはmain関数が保持すればいい

「あるいは」ってどういう意味?

main関数内に持つ方はわかるんですよ。
そうでなく、「クラスが保持」の方の解説をお願いしたい。ずっと保持し続けるんだから
スタティックメンバなのかな?と思った。
0845817 (ワッチョイ 234c-Txnz)
垢版 |
2017/10/01(日) 18:34:27.58ID:SWvA/SVx0
>>820
では、例えば初期化時にtheApp内に、Doc、View、MainFrmクラスのポインタをメンバに持たせておいて、
以降、あらゆるクラスからtheAppを介してアクセスしてもよいということですね。

こういったやり方でふとよぎった不安なんですが、
長時間アプリを起動していたとき、とあるクラスの参照ポインタがいつのまにか変わっていて、
例えばビュークラスを取得しようと「theApp.GetView()」としたときにはすでにそこにViewクラスはいない。。。なんてことは起こりませんか?
0847デフォルトの名無しさん (ワッチョイ 032e-asy+)
垢版 |
2017/10/01(日) 19:06:45.42ID:A+1idbvt0
>>844
普通なパブリックなメンバでいいと思うけど
その所有権をもったクラスの寿命が尽きたら同時に開放される


>>845
もちろん参照元からは参照先の実態があることが保障されないのでよくある
特定のメンバの参照数が数百箇所になってたときは手に負えなくなったのでさすがに作り直した
0852デフォルトの名無しさん (ワッチョイ 23aa-Txnz)
垢版 |
2017/10/01(日) 19:54:30.69ID:+enXMbbO0
>>849
寿命の長いオブジェクトをどうやって保持し続けるかがテーマなので、
「a というデータはクラスBのオブジェクトbに持たせればいい」では
じゃあそのbはどこにどうやって保持し続けるのかという無限後退に陥る。

普通のグローバル変数やシングルトン
theAppにぶら下げるの
mainの中に置く

一長一短あるのでそれ以外に何かないかなという話
0853デフォルトの名無しさん (ワッチョイ ed4d-IQJU)
垢版 |
2017/10/01(日) 20:03:44.13ID:P+J8m3XL0
別に永続化、シリアライズの話までしてないわけでしょ。
mainかグローバルの2択で推奨はmain、どのスコープからも見えてアクセスしたいならグローバルもありで終わりでしょ。
0856デフォルトの名無しさん (ワッチョイ 234c-Txnz)
垢版 |
2017/10/01(日) 22:22:01.91ID:SWvA/SVx0
>>846
>>もちろん参照元からは参照先の実態があることが保障されないのでよくある
ソースコードで意図的にdeleteとか、アドレス移動する命令をいれてなくても起こるんですか?
(ガベージコレクションみたいなことが)
0862デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/02(月) 15:27:40.28ID:jSh1mr/v0
> プログラムのあらゆる箇所で
>  theApp()->getMemberA()->getMemberAA()->getMemberAAA()->...->getMemberZZ()->getValue()
> と書かねばならなかった

本当にあらゆる箇所に重複コードを書きまくっているとしたら相当なアフォだな
関数化かキャッシュするだろふつー
0863デフォルトの名無しさん (ワッチョイ 458a-gyUt)
垢版 |
2017/10/02(月) 17:30:53.86ID:wJY11lw/0
最近WindowsのほうでVSを入れまして、簡単なSTGを作って遊んでいるのですが、MacOSでもC++でSTGを作ることはできるのでしょうか?
Windowsでは、DxlibといったSTG制作に特化したライブラリがありますが、MacOSではどうなのでしょうか…?実際にMacでSTG制作の経験がある方、挫折した方の話をお聞かせください。よろしくお願いします。
0864デフォルトの名無しさん (ワッチョイ 03eb-IQJU)
垢版 |
2017/10/02(月) 17:45:41.63ID:M0wavUvt0
DXLibがSTG制作に特化したライブラリ…
0865デフォルトの名無しさん (ワッチョイ 458a-gyUt)
垢版 |
2017/10/02(月) 18:07:53.55ID:wJY11lw/0
>>864
何かおかしなことを言っていたらすみません。
STG制作入門のホームページでそのようなことが書かれていたので、そう認識していた次第です。
0867デフォルトの名無しさん (ワッチョイ 458a-gyUt)
垢版 |
2017/10/02(月) 20:27:58.95ID:wJY11lw/0
OpenGLか…
難しそうだしまだ取っ付くべきじゃないような気がするんだけどそんなことはない?
0868デフォルトの名無しさん (ワッチョイ c57f-Txnz)
垢版 |
2017/10/02(月) 20:36:13.43ID:/AEbHlJU0
Valkan行こう
0870デフォルトの名無しさん (ワッチョイ 23bd-+G6K)
垢版 |
2017/10/03(火) 00:06:57.08ID:AOU4wQiN0
>>862
黙れよキチガイ
theApp()はtheAppかthisの間違いだがそれは別にして
メソッドgetMenberA()を有するクラスから始まって、
メソッドgetValue()を有するクラスFooまでの全てのクラス
が完璧にカプセル化された設計の元で
theAppから配下のFooのメンバにアクセスするアクセッサは実質的に>>862な状況を呈する
これはもう完璧なカプセル化を諦めて途中までグローバル変数にする(挿し木設計)か
インライン展開による最適化を期待するぐらいしか手が無い
0872デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/03(火) 05:23:10.92ID:ZkSEHHAS0
> カプセル化を諦めて途中までグローバル変数

ヘボ野郎
0874デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/03(火) 16:01:22.87ID:ZkSEHHAS0
CならあるがC++では一般的な方法はない
0875デフォルトの名無しさん (ワンミングク MMa3-IV3n)
垢版 |
2017/10/03(火) 16:16:18.00ID:vTZ8MAnuM
>>874
Cでの方法を教えていただけると嬉しいです
0876デフォルトの名無しさん (ワンミングク MMa3-IV3n)
垢版 |
2017/10/03(火) 16:16:57.77ID:vTZ8MAnuM
すいませんIDかわりました
>>875>>873です
0877デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/03(火) 16:20:42.09ID:ZkSEHHAS0
俺も暇なヤツだなw

template <typename T> void print_dim(T&);

template <typename T, int RANK>
struct print_dim_t
{
void doit(T& x)
{
for(auto& y : x) print_dim(y);
}
};

template <typename T>
struct print_dim_t<T, 1>
{
void doit(T& x)
{
for(auto& y : x) std::cout << y << ',';
}
};

template <typename T>
void print_dim(T& x)
{
print_dim_t<T, std::rank_v<T>> obj;
obj.doit(x);
}
0878デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/03(火) 16:34:48.99ID:ZkSEHHAS0
#define print_dim(array, type) do_print_dim_##type((type *)&array, (type *)(&array + 1))

void do_print_dim_int(int *first, int *last)
{
for(int *p = first; p != last; p++) printf(" %d", *p);
}
0880デフォルトの名無しさん (スプッッ Sd03-h4xY)
垢版 |
2017/10/04(水) 18:26:58.85ID:O2xwfga8d
linuxの質問です
・koファイルからコマンドライン実行で実行ファイルを実行したい
どうやって実現するか調べてもわからなくてやり方教えて欲しいです
A --B みたいな呼び出しかたをしたい
・複数スレッドを立てているBプロセスを
全スレッドsleepにすることできる?
0886885 (ワッチョイ c593-bw2Z)
垢版 |
2017/10/04(水) 19:36:09.54ID:N0mfbhbs0
すまん、質問の意図を取り違えたかも。

カーネルモジュールの中から外部コマンドを呼びたいって話かな。
可能かも知れん、と言うかカーネルがコマンドを実行するのと同じ手順のはずだが、
具体的な方法はさっぱり分からん。役に立たなくて申し訳ない。
0893デフォルトの名無しさん (ワッチョイ eef2-qWqy)
垢版 |
2017/10/06(金) 09:41:37.58ID:aNGBh62I0
("a,b,c")とは、a,b,cの合計を表すのでしょうか?
それとも、a,b,c各それぞれを表すのでしょうか?
0895デフォルトの名無しさん (スプッッ Sdda-Qn8V)
垢版 |
2017/10/06(金) 10:26:06.63ID:8EN3J+m8d
doxygen方式
0900デフォルトの名無しさん (ワッチョイ 76b3-yS8h)
垢版 |
2017/10/06(金) 21:08:44.42ID:vfMxTM1h0
→ の意味教えて下さい。
0906デフォルトの名無しさん (ワッチョイ 1ab3-3Fj1)
垢版 |
2017/10/07(土) 01:41:08.30ID:6wfQSWva0
質問です
以下のコードがコンパイルに通りません
class Structure { public: std::string type; };
std::vector< std::unique_ptr<void> > data;

std::unique_ptr<void> structure(new Structure);
structure->type = "HogeHoge";
data.push_back(structure);

>g++ -Wall -std=c++11 -c hogehoge.cpp
>error: ‘std::unique_ptr<void>::pointer {aka void*}’ is not a pointer-to-object type
> structure->type = "HogeHoge";
> ^
std::unique_ptr<void>ではなくて、
std::unique<Structure>にするとコンパイル通りました
voidだとだめなんでしょうか エラーになる理由を教えて下さい
0909デフォルトの名無しさん (ワッチョイ b632-rzHd)
垢版 |
2017/10/07(土) 08:30:30.38ID:r58+Koxz0
>>906
エラーメッセージに書いてあるだろ
structure->type = "HogeHoge"; の代入先がオブジェクトじゃねえぜと
おまえさんはvoid = char const*;をやろうとしたんだよ
0910デフォルトの名無しさん (ワッチョイ b632-rzHd)
垢版 |
2017/10/07(土) 08:31:55.56ID:r58+Koxz0
あ、すまんちょいミスった
指摘できるやついる?解説頼むわ
0913デフォルトの名無しさん (ワッチョイ b651-iGo5)
垢版 |
2017/10/07(土) 09:03:55.62ID:7nonADk70
unique_ptr<void>という型なので、
中にtypeというメンバーがあることがコンパイラからはわからない。

static_cast<Structure*>(structure.get())->type = "HogeHoge";
のように明示すればコンパイルだけは通るかと思ったんだが、
こっちだと>>911の問題に引っかかって、その前の行でエラーになる。
0916デフォルトの名無しさん (ワッチョイ dae7-XSap)
垢版 |
2017/10/07(土) 11:58:47.95ID:rHfSD+zL0
>>913
delete できないからね
voidを渡すんならカスタムデリータもセットにしなきゃならない。

template <typename T>
struct vp_deleter {
void operator ()(void *p)const
{
delete static_cast<T*>(p);
}
};

std::unique_ptr<void, vp_deleter<int>> a(new int(8));

なら通った。
0918デフォルトの名無しさん (ワッチョイ 1ab3-3Fj1)
垢版 |
2017/10/07(土) 12:36:08.56ID:6wfQSWva0
>>907
anyは知りませんでした
stdじゃなくてboostにあるんですね つかってみます
>>909
つまり void*->type は void.type になるってことですね
voidポインタは使ったことなくて、あれから調べたのですが
アクセスする前にキャストが必要だと知りました・・
無知ゆえの初歩的なミスです 指摘ありがとうございます
>>911, >>913, >>916
スマートポインタなのでデストラクタを呼び出せるようにしないといけないんですね
カスタムデリータは知りませんでした コード参考になります

void型なのはStructureの他にもプリミティブ型とかも入れたかったからです
boost::any使うやり方とカスタムデリータ渡すやり方両方やってみます
皆さんレスありがとうございました
0921デフォルトの名無しさん (ブーイモ MMfa-0mrS)
垢版 |
2017/10/07(土) 14:17:50.50ID:jvf7kHO4M
ある配列がありそれを指定した順番で並び替えしたい

std::vector< any_struct_t > array; //これを並び替えたい
std::vector< unsigned int > index_list = { 3,8,6,0,2...}; //この順番にしたい

探しているんだけど適当なライブラリが見つからない
標準ライブラリに入ってたりする?
またはアルゴリズムが知りたい
出来ればswap回数が少ない方法が知りたい
0922デフォルトの名無しさん (ササクッテロリ Sp75-o/K3)
垢版 |
2017/10/07(土) 15:34:33.81ID:cqowZFEsp
配列もう一個用意してその添え字に移動するんじゃだめなん
0925デフォルトの名無しさん (ブーイモ MMfa-0mrS)
垢版 |
2017/10/07(土) 16:25:34.07ID:jvf7kHO4M
>>924
それタイプミスあります?
でももう一つ配列を用意してコピーする点では
他の方と一緒ですね

別配列を用意せず全てswapで済ます方法も作ってみましたが
これにはindex_listが更に2本必要になり
効率は別配列と変わらないと予想される結果でした

参考になりました
ありがとうございました
0934デフォルトの名無しさん (ワッチョイ b651-iGo5)
垢版 |
2017/10/07(土) 19:11:01.43ID:7nonADk70
屁理屈を言うと、index_listを壊していいなら、
以下の手順で別領域を使わない置換は可能。遅いけど。
for( size_t i = 0; i < array.size() - 1; ++i )
{
std::swap( array[i], array[index_list[i]] );
std::swap( index_list[i], *std::find( index_list.begin()+i+1, index_list.end(), i ) );
}
0946デフォルトの名無しさん (ワッチョイ b651-iGo5)
垢版 |
2017/10/07(土) 23:13:09.50ID:7nonADk70
>>934
別領域を使わない置換に再挑戦。今回はO(n)のはず。
for( size_t i = 0; i < array.size() - 1; ++i )
{
size_t j = i, k = index_list[i];
while( k != i )
{
std::swap( array[j], array[k] );
index_list[j] = j; j = k; k = index_list[k];
}
index_list[j] = j;
}
0949デフォルトの名無しさん (ワッチョイ b651-iGo5)
垢版 |
2017/10/08(日) 06:22:19.14ID:+SudLjvR0
>>947
以下の2つの理由により、外側のループがn回まわる間に
内側のループの中身はたかだかn回しか実行されない。
1. 内側のループ内で処理済みのインデックスjに対し index_list[j]=j が実行される。
2. index_list[i]==i の条件が最初から満たされていた場合、内側のループは実行されない
要するに、内側のループを実行済みかのフラグとしてindex_listを使ってるだけ。
>>948
index_listを壊している時点で屁理屈なのは自覚しているんで、仕方ない。
一応、別配列にムーブする場合と比べると、
最初から正しい位置にある要素への処理が不要になるというメリットは有る。
0951デフォルトの名無しさん (ワッチョイ b651-iGo5)
垢版 |
2017/10/08(日) 11:34:33.36ID:+SudLjvR0
駄目な理由が引数を壊すってことだけなら、引数を値渡しにしてやれば、
呼び出し時に勝手にコピーされるので問題ないはず。
壊していい引数を渡す時はstd::move()すればいいし。
0952デフォルトの名無しさん (ワッチョイ aaeb-qWqy)
垢版 |
2017/10/08(日) 13:39:35.60ID:GUxnbDfL0
引数がconst参照=引数の状態を変更しない(てか、できない)という意思表示
に対して
引数が右辺値参照=引数の状態を変更する(しても文句言うな)という意思表示
というのはアリ?

右辺値参照に対する理解が曖昧なんで漠然とよく分からない(何が分かって
ないかも分からないw)んだが、もっと別な意思表示方法もある?
0956デフォルトの名無しさん (ワッチョイ dabd-mvC5)
垢版 |
2017/10/09(月) 09:00:03.09ID:U0LcPFS10
右辺値参照というのは、関数f()へのT型データの値渡し時に暗黙のうちに行われる(C++03までは無条件に行われていた)
 (左辺値) = (右辺値)
という代入処理において、
当該代入処理後、右辺値が関数呼び出し元によって使われなくなることが明白なとき、
 左辺値へのコピー後、右辺値をデストラクトする
という処理に暗黙のうちになっていたものを、
 右辺値から左辺値への移動
と「も」書けるようにするためのしくみ

Tに効率の良いムーブコンストラクタ(か右辺値参照を引数とする代入演算子)を定義しないとメリットが生じない
ポインタに__restrictを付けるべきかどうか悩まねばならないレベルの人用
C++03でもコンストラ・デストラ呼び出し回数削減の最適化がかかって同じような効果になるケースが多々あるから
そういうのが信用できない神経質な人向け

※ 個人の感想です
0958デフォルトの名無しさん (ワッチョイ dabd-mvC5)
垢版 |
2017/10/09(月) 09:20:15.73ID:U0LcPFS10
>>957
右辺値参照には一時オブジェクトしか代入できない縛りがあるから_
関数fooを
 voiid foo(int&& x)
というバージョンしか定義していないとすると、
 int g_x = 10;
 foo(g_x);
がビルドが通らないのではないか;
一般的な使用を想定すれば、結局foo(const int& x)も定義必要

C++03までしか使ったこと無いから知らんけど;;
0969デフォルトの名無しさん (ワッチョイ dab3-Nz6W)
垢版 |
2017/10/09(月) 20:56:32.03ID:UEIAYP2F0
>>968
> 理解してないのでなにを指摘してるかさっぱり分からないが、
わからないなら絡んでくるなよ...

> つまり、気取ってC++でGCっぽいことしようとして破綻してるわけだな。
全然違うし
0973デフォルトの名無しさん (ワッチョイ b183-wbjw)
垢版 |
2017/10/09(月) 21:56:43.96ID:bLguG3ky0
ところでなんでそんなに一時オブジエクトを参照しなきゃいけないコードを書くの?
参照元を管理するのが面倒だから? そういう人は初めからGC言語使えばよくね? ということですか?
0974デフォルトの名無しさん (ワッチョイ 958a-ZNcz)
垢版 |
2017/10/09(月) 22:03:17.69ID:Rk3/uNWr0
なんでとか言われても。。。
壊してもいい一時オブジェクトの場合、特別に効率的な扱いをしたくなるケースなんて山ほどある
それが分からないならC++なんて触らずにGC言語専門でやってればいいと思うよ
0975はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ae6f-XSap)
垢版 |
2017/10/09(月) 22:10:35.64ID:GeS0S50a0
そのあたりはトレードオフなんだよ。
そりゃあ気にせずに済むなら気にしたくないが、気にしなきゃならないときに出来ることがないのはつらいって話で。
0984デフォルトの名無しさん (ワッチョイ dae7-XSap)
垢版 |
2017/10/09(月) 23:09:59.39ID:1ynB1O3m0
んん?
右辺値を束縛したい(一時オブジェクトだから左辺値としての実体はない)
けどconst左辺値じゃダメ(中身を変更したいから)
 ↑
これのどこにわかりにくい点があるというのか?
「RVOが保証されるようになったらいらない」という意見なら理解できるが・・・
0986デフォルトの名無しさん (オッペケ Sr75-BFoK)
垢版 |
2017/10/09(月) 23:16:20.29ID:7RyTvmhPr
>>973「なんでそんなに一時オブジエクトを参照しなきゃいけないコードを書くの?」
 ↓
>>984「右辺値を束縛したい(一時オブジェクトだから左辺値としての実体はない)けどconst左辺値じゃダメ」
 「これのどこにわかりにくい点があるというのか?」

これがアスペというやつか
0994デフォルトの名無しさん (ワッチョイ dabd-mvC5)
垢版 |
2017/10/09(月) 23:41:18.28ID:U0LcPFS10
>>986
右辺値を束縛したい文脈ではかわりにconst左辺値で常におkなのでは…(ていうかconstはあってもなくても良い

>>985
T型データのswapは素朴にはT型データのコピー3回+破棄2回ぐらいが生じる
のでわ…
0998デフォルトの名無しさん (ブーイモ MMa1-0mrS)
垢版 |
2017/10/09(月) 23:55:42.49ID:0USm99MRM
結局のところ
右辺値参照はコピーコストを削減出来るのが利点で
それぐらいしか使い道がないってことか

かつ、コピーコンストラクタよりムーブコンストラクタの方が
コストを軽く出来るクラスに限られると

struct a{ void* p; }; // これには効果が期待出来るが
struct b{ int p[65536]; }; // これには効果は期待出来ない

結論としては、やっぱいらねーやこんなのってことだな
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 72日 12時間 33分 11秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


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

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

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

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

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