X



C++相談室 part139
レス数が1000を超えています。これ以上書き込みはできません。
0606デフォルトの名無しさん (ワッチョイ 899f-QT7o)垢版2018/12/11(火) 10:10:46.46ID:CMkzN/Tv0
>>605の一番近いnamespaceからというのは嘘でした
×https://ideone.com/LpC58v

正しくは、解決不可能だった場合は、同じ階層から選択されるみたい。

AとBがともにNS2に存在する場合
https://ideone.com/m5leMs

コンパイルエラー。 AがNS2 Bがひとつ外側のNS
https://ideone.com/9IY4BC

同階層にBがない場合、グローバルからも選択されることはない。
https://ideone.com/cMhwpW
0608デフォルトの名無しさん (ワッチョイ d9e3-1aIk)垢版2018/12/11(火) 14:13:57.27ID:TeIOtXwo0
>>604
ある。
単に人間に見えているタグ名が同じというだけで、コンパイラ内部では、
全く別の識別番号(というより、通常、コンパイラ内部の構造体定義データの先頭アドレス)
になっており、タグ名が同じでも識別番号が異なれば、全く別物と扱われる場合がある。
0609デフォルトの名無しさん (ワッチョイ d9e3-1aIk)垢版2018/12/11(火) 15:07:44.16ID:TeIOtXwo0
>>603
ものすごい微妙な動きをするみたいだ・・・。
struct Base の定義を見てみると、外側に既に struct Data が定義されていても、
なぜか、Data は、「nested Data」すなわち、Baseの内部クラスの方を「参照」して
しまうらしい。規則性はどこにあるんだろう。まだ英文読んでないけど。

struct Node {
struct Node* Next; // OK: Refers to Node at global scope
struct Data* Data; // OK: Declares type Data
// at global scope and member Data
};

struct Data {
struct Node* Node; // OK: Refers to Node at global scope
friend struct ::Glob; // error: Glob is not declared, cannot introduce a qualified type ([dcl.type.elab])
friend struct Glob; // OK: Refers to (as yet) undeclared Glob at global scope.
/* ... */
};

struct Base {
struct Data; // OK: Declares nested Data
struct ::Data* thatData; // OK: Refers to ::Data
struct Base::Data* thisData; // OK: Refers to nested Data
friend class ::Data; // OK: global Data is a friend
friend class Data; // OK: nested Data is a friend
struct Data { /* ... */ }; // Defines nested Data
};
0610デフォルトの名無しさん (ワッチョイ d9e3-1aIk)垢版2018/12/11(火) 15:29:10.50ID:TeIOtXwo0
【違いの分析】

1. 外部クラスを参照したい場合の書き方:
struct Data {
 struct Node* Node; // OK: Refers to Node at global scope
 ・・・
};

2. 内部クラスを参照したい場合の書き方:
struct Base {
 struct Data; // OK: Declares nested Data
 ・・・
};

【考察】
後者の方は、「『宣言子』を「何にも書かずに」、ただ不完全定義として、
「struct Data」と書いている。こういう独特の特徴的な書き方で、
新しいタグ名の導入と見なされているのではないか。

一方、前者の方は、 「struct Node」だけではなく、「*Node」という「宣言子」を
書いてしまっているので、新しいタグ名の導入とは見なされない気がする。


先日書いた、CRITICAL なんたらの例では、宣言氏を書いていたので、「1」
の方の扱いとなり、外部クラスの参照と見なされた・・・。
0611はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b6f-n9Ol)垢版2018/12/11(火) 15:34:19.91ID:pCenHJYt0
>>609
D&E の 6.3.1 にそのあたりの解説があるので読んでみると面白いかも。
「病的な例」を含めてわかりやすい解決ルールを作ろうと奮闘したあげくに
まあまあマシなルールとしてそうなったって感じ。
0613デフォルトの名無しさん (ワッチョイ 2b80-Po2/)垢版2018/12/11(火) 22:53:03.48ID:yA4tg2d20
ぜんぜん違う
ポインタだからサイズが決定できることになる

ポインタなら前方宣言で前方参照できる
0614デフォルトの名無しさん (ワッチョイ 93b3-eP6C)垢版2018/12/11(火) 22:54:56.40ID:essnCSQz0
2. のほうは構造体を宣言してるから、そこに新しく nested class が作られてる。
1. のほうは構造体へのポインタを宣言してるから、対応する構造体を探して外部の定義を見つけてる。

そんなに微妙でもないと思う。
0615デフォルトの名無しさん (ワッチョイ 2b80-Po2/)垢版2018/12/11(火) 22:59:45.95ID:yA4tg2d20
そもそもポインタでない場合、前方宣言でなくクラス(もしくは構造体)の宣言がないと
インスタンスのサイズが決定できないし
コンスタラクトタも呼び出せない

普通にコンパイルエラーになる

クラス(もしくは構造体)のメンバにアクセスする場合も同じく
前方宣言でなくクラス(もしくは構造体)の宣言がないと
メンバがわからない

普通にコンパイルエラーになる
0621デフォルトの名無しさん (ワッチョイ d9e3-1aIk)垢版2018/12/12(水) 08:48:09.25ID:RRyKxOPE0
>>614
C/C++ では、ある1つの宣言で、ポインタ変数を定義する場合でも、それと同時に構造体の
宣言(定義)が行われる事がある。たとえば、
TYPE *ptr; は、ポインタ変数の ptr を定義しているが、TYPE の部分が
struct TPerson { ・・・ }
だった場合は、変数 ptr の定義と同時に、構造体 TPerson も定義する。
さらに、TYPE の部分が、
struct TPerson
であった場合も、不完全定義として構造体 TPerson を定義することがある。
実際、先に挙げた例では、1つの行で、全く始めて _RTL_CRITICAL_SECTION 構造体が
出てきて、その不完全定義と同時にその構造体へのポインタ型のメンバ変数を宣言
していた。
0622デフォルトの名無しさん (ワッチョイ 93b3-eP6C)垢版2018/12/12(水) 21:29:50.61ID:6r+JK94x0
型が struct TPerson みたいに書かれてて、 TPerson の宣言が見つからない場合、そこで TPerson が前方宣言されたものとして扱われる。
この前方宣言は一番内側の namespace かブロックに所属する扱いになる。

要するに一部の前方宣言は省略できるってだけだよ。
0624デフォルトの名無しさん (ワッチョイ 93bd-e/g/)垢版2018/12/12(水) 22:45:13.11ID:rtWaVZVk0
>>622
>>610における2の書き方を前方宣言と解釈するなら、
構造体定義の中で前方宣言可能なブツが他にはfriendぐらいしか無い件について:
(externは書けない、staticは別の意味になる
しかもfriendは直後に完全型かポインタか参照を要求するですしおすし、
struct Data;という構文の際立ったユニークさは明らかすぐる…
0626デフォルトの名無しさん (ワッチョイ 93bd-e/g/)垢版2018/12/12(水) 23:07:33.30ID:rtWaVZVk0
こういうやつ↓↓↓

struct Data;

struct Foo {
  struct Data* m_pData; // struct Fooはstruct Dataへのリンクを有する
  /*....*/
};

struct Data {
  struct Foo* m_pFoo; // Dataはstruct Fooへのリンクを有する
  /*...*/
};

そもそもなんで型の名前やクラス名だけではなくて、タグ名なんてものが存在し続けているのかというと、
struct Data;というのがやりたかったから、およびその必要が(上のようなケースで)あったからに他ならない
0628デフォルトの名無しさん (ワッチョイ 8abd-U1IU)垢版2018/12/13(木) 00:40:06.98ID:6BRdw/E00
>>627
>struct Data* ptr;の記法が特殊なだけで、
(不完全型)* ptr; とされてもコンパイラはptrへの代入や関数に引数渡しするコードを問題なく吐けるから
int val; というのと大して変わらない話
コンパイラにとってはスゲー普通の日常業務

>struct Data;は一貫して前方宣言なのでは?
前方宣言というには>>610における2の書き方で新しいタグ名の導入と見なされるという挙動がビョーキ
もはやそれは内部クラスの定義にほぼ等しい(不完全な定義というだけ
0630デフォルトの名無しさん (ワッチョイ 079f-Buu6)垢版2018/12/13(木) 00:52:46.20ID:fs9Sguzb0
struct Data* ptr;の記法が特殊な根拠

struct A {
 struct Data* ptr; // ::Data
};

struct A {
 struct Data;
 struct Data* ptr; // A::Data
};


前方宣言のあるなしで、解釈の変わるstruct Data* ptr;の記法はやっぱり特殊なんだと思うけど。
C++において、不完全な型という概念はあるけど、不完全な定義という概念はないのでは?
0631デフォルトの名無しさん (ワッチョイ 079f-Buu6)垢版2018/12/13(木) 00:59:11.60ID:fs9Sguzb0
struct A { struct Data* ptr; };
と記述した場合、そこからたどれる名前空間のどの階層であっても
事前に宣言または定義が行われていれば、その時点で特定可能なstruct Dataへのポインタと解釈されるけど、

解決不可能であった場合には、struct Aと同階層にあるstruct Dataとみなされる <- この動作が特殊
0633デフォルトの名無しさん (ワッチョイ 8abd-U1IU)垢版2018/12/13(木) 01:25:06.35ID:6BRdw/E00
struct Bar;が前方宣言では「ない」という主張は撤回する
なぜなら、次のコードの(A)、(B)のコメントアウトを外しても
それ自体はエラーにならない(つまりstruct Bar; は同一スコープ内で重複が許される
このときは(D)でエラーになる

しかし、(A)と(B)をコメントアウトすると何のエラーにもならない
むしろstruct Bar* m_pBar; の方が普通に前方宣言的に働く(Fooのスコープに縛られない

#include <stdio.h>
struct Foo {
//struct Bar; // (A)
//struct Bar; // (B)
struct Bar* m_pBar; // (C)
};
struct Bar {
int x;
int y;
};
struct Bar* g_ptr;
int main()
{
Foo test;
test.m_pBar = g_ptr; // (D)
}
0634デフォルトの名無しさん (ワッチョイ 8abd-U1IU)垢版2018/12/13(木) 01:32:49.21ID:6BRdw/E00
ちょっち訂正
△: struct Bar;が前方宣言では「ない」という主張
○: 構造体の定義ブロック内のstruct Bar;が前方宣言では「ない」という主張

で、struct Bar* m_pBar; の方が普通に前方宣言的に働く(スコープローカルな新たなタグBarを作ったりしない)のに --(1)
構造体の定義ブロック内のstruct Bar;は明らかにスコープローカルな新たなタグBarを作り出すという変態機能を有している --(2)

つまり(2)を指して一貫して前方宣言だと主張するなら、(1)のstruct Bar* m_pBar;も前方宣言の一種だと言わねば不正直である
0637デフォルトの名無しさん (ワッチョイ 079f-Buu6)垢版2018/12/13(木) 08:36:49.07ID:fs9Sguzb0
>>634
>struct Bar;は明らかにスコープローカルな新たなタグBarを作り出す

構造体定義ブロック内に限らずとも、前本宣言はもともとすべてスコープローカルだけど。

それはグローバルであっても、中間階層の名前空間であっても、
多重ネストの構造体の中間階層で会っても同じ。
0638デフォルトの名無しさん (ワイーワ2 FF42-yWnt)垢版2018/12/13(木) 13:11:12.72ID:zFPTCGevF
拘ってる人は自前でコンパイラでも作ろうとしてるのか?
0640デフォルトの名無しさん (ワッチョイ 9fe3-S6R4)垢版2018/12/14(金) 15:03:53.29ID:TcnBR/ER0
最初に質問を書いた者だが、この話は、実は仕様が決まっていて、
記憶だと、手元にある ARM(Annotated Reference Manual) にも、確か
何か書いてあった。

見るのがメンドクサくてここに質問を書いたんだ。スマン。
0641デフォルトの名無しさん (ワッチョイ 2b23-yWnt)垢版2018/12/14(金) 17:33:38.94ID:6VLPSm+70
3日で忘れる脳みそ
0642634 (ワッチョイ 8abd-U1IU)垢版2018/12/14(金) 20:33:44.26ID:PXFrjbZo0
レスdクス、

>>636
なるほどスゲーよくわかりた

>>635
構造体の定義ブロック内のint i;は2回同じものを書いたらエラーになるから宣言ではなくて定義じゃわパオーン
構造体の定義ブロック内のint i;は2回同じものを書いたらエラーになるから宣言ではなくて定義じゃわパオーン

その他の方々もだいたいおk
0647デフォルトの名無しさん (ワッチョイ 8abd-U1IU)垢版2018/12/15(土) 20:36:21.43ID:NSrOcjuo0
質問者の意図がようわからんが
データ本体(スゲー巨大かもしれない)の共有にいちいち通信時間を要する手段は除外されるんじゃ…
やっぱプロセス間の同期をミューテックスか何かのプロセス間でも使える同期オブジェクトまたはソケット通信とかでとる前提で、
データ本体のはメモリ共有かファイルという手段になるのではなかろうかと、
0651デフォルトの名無しさん (ワッチョイ 8abd-U1IU)垢版2018/12/15(土) 22:05:56.86ID:NSrOcjuo0
>>649
共有のニーズが生じてからファイルを作るのならそうだが
最初から共有データとしてファイルが存在する場合はそうではない
というわけで質問者の意図にはようわからん点がある
0657デフォルトの名無しさん (ワッチョイ 1e80-2dqZ)垢版2018/12/15(土) 23:09:43.46ID:8aRCy95z0
同一の計算機で何度も読むことが分かってるのに
別の計算機でディスクアクセスさせて
それを通信でやりとするアホなシステム構成にするヤツがあとを絶たないのがよくわかる

著しい低学歴知恵遅れがそういうことよくやる
0658デフォルトの名無しさん (ワッチョイ 1e80-2dqZ)垢版2018/12/15(土) 23:23:37.08ID:8aRCy95z0
世の中には常識をこえるすごい頭悪いヤツラがいるからな

何度も何度も計算機Aから計算機Bの数十ギガを超える共有ファイルの内容を計算機Aにすべて読み込んで
計算機Aで処理をなん百回も繰り返す

しかも共有に使うSamba
つまりNBT()
Windows共有とまったく同じ

つまり毎回毎回計算機Bにディスクアクセスして通信(NBT経由)使って
計算機Aで読込むということを意味する

それで遅い遅いなんでといってたからな。。。
世の中には想像を超えるこんな頭悪いのが現実にいる
0659デフォルトの名無しさん (ワッチョイ 8abd-U1IU)垢版2018/12/15(土) 23:35:37.00ID:NSrOcjuo0
>>656
むしろ毎回データ全部を丸ごと送る想定なら、高速な通信手段で良くて
「データ共有する」(>>643)という質問者の動機にならない件について:

メモリ共有であれば通信より高速を目指す目的で毎回データ全部を丸ごと送る風に使われることもあるが
質問者>>643は共有手段として「ファイル」も挙げているから
いきなりそこまで話を限定できないワケ
0660デフォルトの名無しさん (ワッチョイ 8abd-U1IU)垢版2018/12/15(土) 23:49:56.32ID:NSrOcjuo0
んまー今思いついたがメモリ共有やファイルの他には
データベースみたいなデータを出し入れ管理するプロセスなりサーバなりを設けるというのも
>>643の答えに含まれるのかもしれん…

>>656の思い込みとはうらはらに、
データベースXにアクセスするプロセスA、Bは、明らかにXが管理するデータを共有しているが、
Xの管理するデータ丸ごとを毎回送りつけ合うわけではないし、
0661デフォルトの名無しさん (ワッチョイ ebf2-2dqZ)垢版2018/12/16(日) 08:13:31.96ID:OmvADhcW0
なんか長々と書いているようだが、全部送ろうが一部だろうが正しく同条件で比較すれば一目瞭然だろう。

1. プロセスAが巨大なファイル中の一部のデータの読み込みをファイルシステムに要求する
2. ストレージから読みだされたデータが返される

1. プロセスAがプロセスBが持つ巨大なデータ中の一部のデータをRPCで要求する
2. プロセスBからデータが返される
0662デフォルトの名無しさん (ワッチョイ d3b3-UKyl)垢版2018/12/16(日) 08:26:49.11ID:sqE5CAYo0
>>660
データベースなら例えばSQLでやりとりやね
既にオンメモリで数ギガ扱うのに対応してるしプログラム間通信も高速
なにより統一されたプロトコルでオンメモリからネットにまでアクセスできるのが便利
0664デフォルトの名無しさん (ワッチョイ d3b3-UKyl)垢版2018/12/16(日) 08:48:33.22ID:sqE5CAYo0
それはデータベースとは言わんのじゃ?
COPY_DATAやメールスロットはOS提供の簡易的なプロセス間通信サービス
RPCはデータ以に上さらに高度にアクセスするプロシージャ
0666デフォルトの名無しさん (ワッチョイ 8abd-U1IU)垢版2018/12/16(日) 12:31:06.96ID:DTKapPnl0
>>663
>これを実現する手段として>>644-646のような手段があるわけだが、それ認識してなかったのか。
>>644-646はデータを送りつけるという通信の手段のみ述べており、データ共有の実現に行き着いていない
もちろん通信だけでもプロセスAとBの間で情報の共有はできるが、
>>644-646の言説だけでは、情報を表す入れ物である「データ」の共有に行き着いていないワケ

>>644-646の言説が含意するのは、同じ情報iを、プロセスAがデータa、プロセスBがデータbとして持っている状況、
というところ止まりで、aとbは別物。さらにいうと、同じ形式のデータであることすら導くことができない

この差異は形而上の問題ではなく、現実の設計の問題である
>>644-646だけでは、AがBに情報伝達するにあたりBに通信する(通信のエンドポイントとしてBを起こす)必要があるから
Bが風邪で休んだりするとAの仕事まで止まってしまうことが確定する
一方、AがExcelシートXに情報を書き、Bが必要なときXの情報を参照する、という方式だと(他に付帯条件が無ければ)Aは問題なく仕事を続けられる
データ共有というのは後者
0668デフォルトの名無しさん (ワッチョイ 8ab3-skpA)垢版2018/12/16(日) 13:30:30.74ID:7UXd2BE00
なぜ機能とそれを実現する手段を混同して語るかなぁ…
Excelのブック共有だってExcelアプリケーションがファイル共有とか使って頑張ってるから実現できてるんだし
そもそも>>643は手段レベルの話だし
0677デフォルトの名無しさん (ワッチョイ 0a7c-S6R4)垢版2018/12/18(火) 13:15:19.65ID:G1V4hdx+0
>>643
実は、GDI の Device Context の HDC も、プロセスの垣根を越えて渡す方法がある、
メモリコピーは伴わずに。やり方は、PrintWindow(HWND hWnd, HDC hDC, DWORD flag)
API を使って、WM_PRINT メッセージを送るというもの。これを使えば、グラフィックデータ
ならBITMAPデータも伝達できる。たとえば、HDC を用いて GDI+ の LockBits() を
使うと良い。L。

https://mevius.5ch.net/test/read.cgi/tech/1474384848/338
0678デフォルトの名無しさん (ワッチョイ 2b23-yWnt)垢版2018/12/18(火) 13:30:16.37ID:/M0/bFGF0
共有メモリにクラウドが入ってくる時代はもう来てる
0679デフォルトの名無しさん (ラクッペ MMb3-74rI)垢版2018/12/18(火) 14:51:58.63ID:RxVtOB6VM
C++を使ってる仕事につきたいのですが、どこもC++を使ってるところは組み込み系とかの経験の募集ばっかです
私はwebしかやったことないので組み込み系の経験はありません
0680デフォルトの名無しさん (アークセー Sxa3-JU2d)垢版2018/12/18(火) 15:31:06.75ID:aA/jUlRpx
>>679
ここはダーマの神殿ではない、と言いたいとこだけど、年齢によるね。
未経験でも30歳前後なら余裕、35歳超えなら諦めろ。
というか組み込み系でC++を使っている分野ってあるにはあるけどそんなに多くはないよ。
組み込みLinuxでのアプリ開発ぐらいなんじゃない?
老害から言わせてもらうとアレは組み込みソフトじゃないけど。
0681デフォルトの名無しさん (ラクッペ MMb3-74rI)垢版2018/12/18(火) 17:11:33.44ID:RxVtOB6VM
>>680
25です
Linuxでのアプリ開発分野ならあるんですね‥
別に組み込みじゃなくてもいいんですけど、探したら組み込みがほとんどって感じです
本気で探しているのですが、難しいです‥
頑張って探してみます
0682デフォルトの名無しさん (バットンキン MM33-JU2d)垢版2018/12/18(火) 17:30:13.67ID:zLgJOfCSM
25歳なら第二新卒扱いで組み込み未経験でも全然OKよ。
募集要項に経験者って書かれてても怖がらずどんどん応募してみては?
相変わらずこの業界は人手(奴隷)不足なのでそう苦労せず転職できると思う。
売り手市場の今は転職先の会社を見極めて選り好みすることができるので、下手に妥協せず納得行くまで転職活動頑張って!
0692デフォルトの名無しさん (ワッチョイ 4ab3-UKyl)垢版2018/12/18(火) 23:31:30.78ID:6RhNbAj70
C++の最新仕様に詳しくてもあんまり仕事で使えないからな
メタプログラミング駆使して行数少なく書いてもぶっちゃけ大した価値ない
逆にやりすぎて嫌われるのがオチ
CPU、キャッシュ、バスアーキ、OS、ABI、Toolchain、各種デバッグ手法などを知ってる方が重要
0695デフォルトの名無しさん (ワッチョイ 1e80-2dqZ)垢版2018/12/19(水) 00:13:50.49ID:jOXn0Ht90
makeは依存ファイルと生成ルールをひたすら書くだけだからな
あんなしょうもないのを書けないほうがおかしい
0698デフォルトの名無しさん (ワッチョイ 83c3-UKyl)垢版2018/12/19(水) 00:38:35.31ID:PtV3oISf0
昔はmake書けないやつ馬鹿にしてたが、ひざに矢を受けてしまってな……
今いるのやや学術よりのとこなんだけど、回りがPythonばかりになってきて690の気持ちが分かってしまう
0705デフォルトの名無しさん (ワッチョイ fa7e-UKyl)垢版2018/12/19(水) 08:34:28.71ID:4vZcLUvu0
通信ライブラリですらいつ策定されるか分からない状態なのにGUIとかC++29くらいになりそう
それに最近はGUIはweb方面のエコシステムを流用するのが流行だしはっきり言って厳しい
0706はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 466f-UKyl)垢版2018/12/19(水) 10:09:57.72ID:i1OD7WIV0
GUI ライブラリの提案だけは出てるけどね。
cairo を取り入れようとか、
ウェブアプリケーション風の DOM ベースのやつ (?) とか。

動作モデルが色々とあるので、
どれかに統一するのはしんどいと思う。
ベースの動作モデルを意識させないほど厚いライブラリを
標準に入れるのもちょっとどうかと思うし。
0710デフォルトの名無しさん (ワッチョイ eb8a-S6R4)垢版2018/12/19(水) 13:04:47.28ID:RjqFkMVC0
質問です。
ノートPCのキーが勝手に連打されるような状態になったので、
「キー入力の連打を感知したら、連打された入力をキャンセルする」というソフトが欲しいのですが、
どこかにあるでしょうか?

無ければ、自作も考えますが、キー入力をキャンセルさせる方法がよくわかりません。
0712はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 466f-UKyl)垢版2018/12/19(水) 13:24:01.60ID:i1OD7WIV0
>>710
いわゆるチャタリングってことかな。
ざっとググってみた感じだと ccchattttter や Keyboard Chattering Fix というソフトがあるみたいだね。

ソフトウェアとしては、他のプロセスが受け取るイベントを横取りすることになるから、
アプリケーションレベルでやるならフックを仕掛ける (DLL Injection など) か、
あるいはデバイスドライバのレベルでどうにかするという方法も考えられる。
0713デフォルトの名無しさん (ワッチョイ eb8a-S6R4)垢版2018/12/19(水) 14:20:16.58ID:RjqFkMVC0
ありがとうございます。

> ccchattttter や Keyboard Chattering Fix
さっそく、試してみました。
これらは、同じキーが連打された場合のみのキャンセルでしょうか?
違うキーが連続で誤入力されたりするので、その場合は対応できないかも?

フックするというのは、どうやるのかわかりませんが、ちょっと調べてみます。
0716デフォルトの名無しさん (ワッチョイ 6acb-UKyl)垢版2018/12/19(水) 15:27:41.05ID:G6mG3us50
>>710
それキーボードに異物が入ってないか?
かつて俺が面倒見てた客先ではホチキスの針が原因の障害が複数回あったぞ

異物が入っていない正常な状態で起きるチャタリングは
設計の段階でしっかり対策されているはずなので
それまで問題なかったキーボードが突然そういう状態になったのなら
何らかの事故を疑ったほうがいい
0717デフォルトの名無しさん (ワッチョイ 9fe3-S6R4)垢版2018/12/19(水) 15:30:09.30ID:Yvire5cb0
https://www.codesdope.com/cpp-stdarray/


以下の二種類あるらしいけど、何で2.の方は二重括弧になってるの?
外側の括弧の意味、内側の括弧の意味がそれぞれ知りたい。

1. std::array<int, 5> n = {1, 2, 3, 4, 5};
2. std::array<int, 5> n { {1, 2, 3, 4, 5} };
0719デフォルトの名無しさん (ワッチョイ 6acb-UKyl)垢版2018/12/19(水) 15:56:47.23ID:G6mG3us50
外側の括弧はコンストラクタへの実引数ならびを囲む
内側の括弧はコンストラクタの仮引数がinitializer_listであることに対応
= は、一時オブジェクトを作ってコピコンかムブコンという意味だったが
C++17でこの意味が廃止され単なる過去の名残となった
0720デフォルトの名無しさん (ワッチョイ 9fe3-S6R4)垢版2018/12/19(水) 16:12:08.78ID:Yvire5cb0
>>719
つまり、2. の方は、以下の記法の ()を{} に変えただけということ?

3. std::array<int, 5> n ( {1, 2, 3, 4, 5} );

つまり、コンストラクタ名を Xxxx とすれば、
Xxxx( リスト型 &list1 ) {
}

みたいな事になってるということかな。
0721デフォルトの名無しさん (ワッチョイ 9fe3-S6R4)垢版2018/12/19(水) 16:21:41.32ID:Yvire5cb0
https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a00752_source.html

↑ libstdc++ の template struct(?) の array のソースを見てみたら、


// No explicit construct/copy/destroy for aggregate type.

とコメントされていた。明示的なデストラクタが何も無いので、その {・・・}
の部分は、コンパイラが初期化処理まで全部やってるってことなのかも
知れないけど、どういう仕組み?

TYPE _M_instance[N] みたいなメンバがあるけど、ここにコンパイラが初期値を
書き込むんだろうか。どういう仕様なんだろう。
0722デフォルトの名無しさん (ワッチョイ 9fe3-S6R4)垢版2018/12/19(水) 16:35:50.86ID:Yvire5cb0
まず、以下の 2, 3 のような書き方が出来て、それで array の場合は、
ああなるってことかな。まだよく分からん。

1. CPerson person = CPerson( 25, MALE, "Yamada Taro" );
2. CPerson person = { 25, MALE, "Yamada Taro" };
3. CPerson person { 25, MALE, "Yamada Taro" };
0723デフォルトの名無しさん (アウアウカー Sa6b-SUIi)垢版2018/12/19(水) 16:41:39.76ID:yP9yNdl2a
贅沢なお願いなんですが
OpenGLを使って
注視点を行列で回転させたいのですが
どなたか参考になるサイトやソースが
あれば頂けないでしょうか
0724デフォルトの名無しさん (ワッチョイ 1eeb-3flP)垢版2018/12/19(水) 19:25:23.79ID:UC31GMnJ0
>>721
std::arrayはpublicに内部の配列を公開してて、コンストラクタデストラクタを一切書かないことで集成体となって、その初期化は集成体初期化で行う
二重かっこの外側はarrayの初期化、内側のかっこはstd::array内部配列への集成体初期化
ただし、C++14以降は二重かっこを省略できる
https://cpprefjp.github.io/lang/cpp14/brace_elision_in_array_temporary_initialization.html
0725 ◆QZaw55cn4c (ワッチョイ aa60-D8NS)垢版2018/12/19(水) 20:44:10.56ID:C9bIO99C0
>>692
>バスアーキ
古い8086とかだったら書籍に載っていましたが、最近はどうでしょうか?わけのわからない仕様書しかないのでしょうか?
0727デフォルトの名無しさん (ワッチョイ ade3-u0Vw)垢版2018/12/20(木) 01:57:39.19ID:Gok/GJGq0
>>724
なるほどだんだん分かってきた。
struct CPerson {
int m_dat1[2];
int m_dat2[3];
};
なら、古い C の時代から、確か、
CPerson person = { {1,2}, {3,4} };   // (1)
みたいに書けた。だから、
struct CMyArray {
int m_dat1[5];
};
なら、
CMyArray a = { {1,2,3,4,5} };     // (2)
と書けるのは当然、ってことだよね。それでC++14以降はさらに、
(1)の場合は、全部一列に並べて、
CPerson person = { 1, 2, 3, 4 };   //(1')
と書ける様になった。結果として、(2)も、
CMyArray a = { 1,2,3,4,5 };     // (2')
と書ける様になった。

そういうことだよね、多分。それでさらに、「=」を省略したような書き方も
できると。そういえば昔から、コンストラクタを持つ CPerson の場合に、
1. CPerson person=CPerson(・・・);
2. CPerson person(・・・);
は確か等価で引数つきのコンストラクタが呼び出されるんだった。
そして、新しい C++ では、小括弧 () を、波括弧 {} に書き換えることも
可能になったみたいな話で、
3. CPerson person=CPerson{・・・};
4. CPerson person{・・・};
みたいなことも書けるようになったのかな。
0729デフォルトの名無しさん (アウアウカー Sa51-9xJM)垢版2018/12/20(木) 11:33:42.81ID:pms7BJwLa
贅沢なお願いなんですが
OpenGLを使って
注視点を行列で回転させたいのですが
どなたか参考になるサイトやソースが
あれば頂けないでしょうか
0734デフォルトの名無しさん (ワッチョイ f5d7-ESEE)垢版2018/12/20(木) 23:21:08.79ID:mxfZwT1A0
C++でこんな感じの構文見たんですが、どういったものなんでしょうか?
「const auto 関数名 = [変数名](引数) -> 戻り値の型」
例えば、以下のように書くとcに5が返ります。
int X;
const auto hoge = [X](int a, int b) -> int
{
return a + b;
}
int c = hoge(2, 3);
[X]のところは、宣言してある変数ならなんでもいいみたいですが、何者かよく分かりません。
0739デフォルトの名無しさん (ワッチョイ ade3-u0Vw)垢版2018/12/21(金) 00:39:41.69ID:JoOPbSrC0
>>734
その[X]は、関数外部の変数 X を関数内部で使えるようにする意味があるらしい。
それを書いておかないと、グローバル変数やクラスのメンバ変数以外は、参照できなく
なるようだ。
0741デフォルトの名無しさん (ワッチョイ 457f-q1e7)垢版2018/12/21(金) 00:57:46.38ID:8z6lrJJh0
必要ないなら何も書くなよ
0745デフォルトの名無しさん (スップ Sd43-odIk)垢版2018/12/21(金) 15:09:53.69ID:SQCtvUnrd
C++で言う所の関数オブジェクトはoperator()をオーバーロードしたクラスのオブジェクトであって、それは大昔からある
お前さんが思い浮かべてるカッコで括ったそれと同じものかどうかは知らん
0748デフォルトの名無しさん (ワッチョイ 05bd-4M5M)垢版2018/12/21(金) 22:37:25.80ID:Co0MMJAt0
#include <stdio.h>
class Hoge {
 int m_x;
 Hoge(int x) : m_x(x) { }
 int operator(int a, int b) const { return a + b + m_x; }
};
int main() {
 int X = 10;
 Hoge hoge(X);
 int c = hoge(2, 3);
 printf("c=%d\n", c); // 15
}
0750デフォルトの名無しさん (ワッチョイ 05bd-4M5M)垢版2018/12/21(金) 22:42:29.52ID:Co0MMJAt0
ちなhoge[&X]の場合の伝統的な関数オブジェクト版はこういったカンジになるヨカン↓↓↓
#include <stdio.h>
class Hoge {
 int& m_x;
 Hoge(int x) : m_x(x) { }
 int operator(int a, int b) const { return a + b + m_x; }
};
int main() {
 int X = 10;
 Hoge hoge(X);
 int c = hoge(2, 3);
 printf("c=%d\n", c); // 15

 X = 20;
 int c2 = hoge(2, 3);
 printf("c2=%d\n", c2); // 25
}
0751デフォルトの名無しさん (ワッチョイ cb80-5YD5)垢版2018/12/22(土) 00:09:01.87ID:b6CiPLFa0
バカほど新しもの好き
0753デフォルトの名無しさん (ワッチョイ bd7b-5YD5)垢版2018/12/22(土) 02:02:20.62ID:NPmZd5n00
関数オブジェクトって言わないのかな、良くしらんがw
つまり、

auto f1 = [](int x){ retrurn x;}
auto f2 = [&](int x){ reutrn x; }

この場合、f1の型は通常の関数ポインタ、f2の型はstd::functionになるということ。
0755デフォルトの名無しさん (ワッチョイ bd7b-pJxC)垢版2018/12/22(土) 02:21:53.10ID:NPmZd5n00
不明というか、auto以外で受けるのを禁止されているだけで、内部的にはちゃんと型を持ってるでしょ。

たとえば、

void hoge(auto func(int x)->int)
{
.....
}

こういう関数を作ったとして、f1は引数に渡せるけど、f2はエラーになるし、
f2を渡そうと思ったら、std::functionで受ける必要がある。
0756デフォルトの名無しさん (ワッチョイ 05bd-4M5M)垢版2018/12/22(土) 02:36:35.21ID:lj97J/9W0
関数オブジェクト==ファンクタ
多分、

>この場合、f1の型は通常の関数ポインタ、
mjk、
>>748に関数ポインタにならずにすむからくりまで示したのに…

>>755
f2はテンプレート引数で渡せば良い
主にそういう目的のブツのはず
0758756 (ワッチョイ 05bd-4M5M)垢版2018/12/22(土) 02:47:42.19ID:lj97J/9W0
スマンf2はテンプレート引数で渡せば良いは撤回
普通にf1を引数渡ししてインライン展開を気体するものでだいたい合ってるはず…
0760デフォルトの名無しさん (ワッチョイ bd7b-pJxC)垢版2018/12/22(土) 09:28:59.71ID:NPmZd5n00
関数ポインタとstd::functionじゃ実効コストが全然違うから、用途によって選べば良い。
qsortみたいな用途だったら、新しく書くコードでも関数ポインタが適していると思うけどね。
0766デフォルトの名無しさん (ワッチョイ 95b3-lUk2)垢版2018/12/23(日) 11:18:27.58ID:AQ4G8Wg10
クロージャみたいなものと、
関数の静的型チェック、自発的なメモリ管理
って恐ろしく相性悪いと思われる。
そんな無理するくらいならおとなしく継承、オーバーライド使った方がマシ。
0767デフォルトの名無しさん (ワッチョイ 95b3-Kal0)垢版2018/12/23(日) 13:14:37.02ID:zy+sQveZ0
キャッシュミスを許さない会。
0769デフォルトの名無しさん (ワッチョイ ade3-u0Vw)垢版2018/12/23(日) 17:41:57.71ID:Wgmswpxd0
最近、QueryPerformanceCounter() を使って色んな速度測定をしていたら、
32バイトくらいの memcpy() でも、数マイクロ・セカンド位(1.0*10^(-6)(s))かかる事が分かった。
ちなみに、1クロックは、3.3 * 10^(-10) 位なので、たった32バイトに1万クロックくらいかかって
いる事が分かった。
ためしに単純な for ループと DWORD *ptr で転送してみても結局、それ位の
小さなサイズだと、同じくらいかかることも判明。
同じマシンでも、もっと大きなサイズのコピーだと、for ループで行っても、
1回のループで、4クロックくらいしかかからない。

推測だが、jmp 命令は、10バイト程度前の番地に戻る程度でも、ループ回数が
少ない場合は、物凄く極端に遅いが、ループ回数が多くなるとなんと1クロックで
実行できるようになるらしい。

ただし、余り定かではない。
0770デフォルトの名無しさん (ワッチョイ ade3-u0Vw)垢版2018/12/23(日) 17:45:32.05ID:Wgmswpxd0
それか、QueryPerformanceCounter() の精度の問題かもしれない。
いくらなんでも、32バイトで1万クロックは遅すぎるように思う。
ちなみに、Sleep(1000); とすると、ちゃんと、1.0 (s) と表示されるので、
速度の計算ミスではないはず。
0773デフォルトの名無しさん (ワッチョイ 95b3-lUk2)垢版2018/12/23(日) 19:56:30.39ID:AQ4G8Wg10
>>768
引数がどんな型を持つ関数を渡すかを事前にどこで決めるかが問題だし、
それ事前に決められるならクロージャーの必要性は低くなるだろ。
あと資源解放のタイミングをどうするかを明示させるシンタックスってのは多分相当難しい。
その辺、クロージャーを用意する言語は普通はGCに任せる。
0775デフォルトの名無しさん (ワッチョイ 95b3-lUk2)垢版2018/12/23(日) 21:40:29.80ID:AQ4G8Wg10
色々シチュエーションは考えらるだろうけれどreactなら
var ChildInput = React.createClass({
_onChange: function (e) {
this.props.onChange(e.target.value);
}
}
)
とかするやつをイメージしてる。
0777デフォルトの名無しさん (ワッチョイ 05bd-4M5M)垢版2018/12/23(日) 23:48:12.36ID:UknIutZS0
>>774
>クロージャって関数とその外側の環境を合わせたものだろ
それは新たな関数を作ったことになるんじゃー
>>748
> int X = 10;
> Hoge hoge(X);
という部分は、f(a, b) = a + b + 10という関数を作ってゐる
Xを変えることによってg(a, b) = a + b + 9とかh(a, b) = a + b + 8とか
Hogeクラスのクロージャでいくらでもバリエーションを作れる
0778デフォルトの名無しさん (ワッチョイ c5f2-5YD5)垢版2018/12/24(月) 00:09:16.83ID:MCFE6K0T0
>>777
>>748で言えばHoge::operator()が関数でm_xがその外側の環境だろ。
そこで関数を渡すとか作るとかあるいは静的型チェックと相性が悪いというのが
どういうことを言っているのかわからん。
関数オブジェクトを作ってるというならわかるけど。
0779はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1b6f-q1e7)垢版2018/12/24(月) 01:08:30.96ID:+hyoXfJx0
C++ のラムダ式は関数オブジェクト生成の構文糖でしかないので、
従来と比べて特に良くなったり悪くなったりするわけはない。

オブジェクトの寿命の管理がやりづらいってのは C++ では今更な話で、
ラムダ式がどうこうとか言ってもしょうがなくない?
0780デフォルトの名無しさん (ワッチョイ 05bd-4M5M)垢版2018/12/24(月) 01:17:53.78ID:GJkiS2EE0
>>778
>m_xがその外側の環境だろ
オブジェクトhogeの中に囲い込まれている(キャプチャされたブツである)からちげう
hogeをコピーしたり別の関数に引数渡ししたら付いていくという意味でも外側の環境ではない
0781デフォルトの名無しさん (ワッチョイ 95b3-6UAB)垢版2018/12/24(月) 01:47:35.44ID:SeeEk3oh0
>>779
諦めたらそこで終了だよ!!!
0782デフォルトの名無しさん (ワッチョイ 6d1b-HeWt)垢版2018/12/24(月) 03:46:32.26ID:6FDZj5qC0
長時間のプログラム終了を手元のスマートフォンで確認したい(メールなど)という願望からそういったプログラムを書きたいんですがさっぱり分かりません
開発環境はvisual studioです
0783デフォルトの名無しさん (ワッチョイ cb80-JI52)垢版2018/12/24(月) 06:57:18.93ID:N0NAok1A0
普通に、Linux コマンドを並べたら、1・2の順番で実行される。
PowerShell でも良い

command_1 ;
command_2 ;

コマンド1 が終わったら、メール送信するなら、

command_1 ;
メール送信 ;

複雑な処理は、コマンド・シェルスクリプトよりも、Ruby などで作る方がよい
0784デフォルトの名無しさん (ワッチョイ ade3-u0Vw)垢版2018/12/24(月) 07:58:21.71ID:RySeMjgB0
>>782
今は知らんけど、数年前だったら、メール送信は知識が結構必要だった。
SendMail Transfer Protocol なるものを使うんだけど、それを便利に発行できる
関数なりCUIプログラムがあれば使えるんだけども。
0785デフォルトの名無しさん (ワッチョイ ade3-u0Vw)垢版2018/12/24(月) 08:02:13.26ID:RySeMjgB0
>>784
Linux だったら、aaa.txt に以下のような内容を書いて、
---------------------------------------
From: my@mail.address (あなたのメールアドレス)
To: foo@example.com
Subject: This is test mail.
(ここに空行を入れる。ここまでがヘッダ。ここから先がボディ)
メールの内容
.(ドットのみの行を入力すると終了)
---------------------------------------

$ sendmail foo@example.com < aaa.txt

とすると後れるらしい。sendmail は、CUI コマンド。
だから、VisualStudio からだと、

system( "sendmail foo@example.com < aaa.txt" );

とすれば、sendmail コマンドが存在しているなら動作する。
0788デフォルトの名無しさん (ワッチョイ 95b3-lUk2)垢版2018/12/24(月) 10:01:04.57ID:JYq0MjYj0
>>779
いやだからc++なら継承でメソッドでオーバーライドする方が
わかりやすいし、資源も管理しやすいんじゃない?って話。
他の言語にあるからみたいな理由で合わんもの入れてもなということなんだけど。
0789デフォルトの名無しさん (ワッチョイ 05bd-4M5M)垢版2018/12/24(月) 11:33:35.23ID:GJkiS2EE0
>>787
>結局どういうことを言いたいんだろう。
クロージャ=関数
特に()のオーバーライド(int Hoge::operator()(int a, int b) { ... })までやった場合、
HogeクラスのインスタンスhogeはC++の構文的にも関数同然に機能の呼び出しを行える
(関数オブジェクトとかファンクタとか呼ばれるやつになる

>元の「関数を渡す」って話
クロージャ=関数なのであるから、クロージャを、クロージャを受け取る他の関数またはクロージャに渡すという話、-- (A)
継承を使う場合のsome_typeのベースクラスをsome_typeのベースクラスを受け取る他の関数に渡すことに対応する --(B)

この場合、クロージャを使うやり方に対する継承を使うやり方のデメリットは…
、と静的型チェック周辺の話に持っていくことができるが、その前に(A)や(B)が共通認識になったのか、それとも理解不能なのかどうか確認しておきたい
0791デフォルトの名無しさん (ワッチョイ c5f2-5YD5)垢版2018/12/24(月) 12:34:04.96ID:MCFE6K0T0
>>789
>クロージャ=関数

そういう前提で言っていたのか?
ID:AQ4G8Wg10は明らかにクロージャと関数を使い分けているようだが。>>766>>773

じゃあそこは了解したとして、(A)(B)の条件の下でもう一度>>768の質問をするよ。
関数の静的型チェックとクロージャの相性が悪いところってたとえばどんな?
0792デフォルトの名無しさん (ワッチョイ 05bd-4M5M)垢版2018/12/24(月) 12:42:22.68ID:GJkiS2EE0
デリゲートは、オブジェクトを参照キャプチャするクロージャと同じ
(マルチキャストみたいなおまけ機能もファンクタとして実現したクロージャになら追加できる
ファンクタとしてクロージャする分には型安全性も同等なので、ファンクタとデリゲートは混同上等のはず…
0793デフォルトの名無しさん (ワッチョイ 05bd-4M5M)垢版2018/12/24(月) 12:55:51.01ID:GJkiS2EE0
>>891
>関数の静的型チェックとクロージャの相性が悪いところってたとえばどんな?
知らん
>>766はクロージャの実現方法について黒魔術的な何かを想定しているのではないか…
C++におけるクロージャの簡単な実現方法はファンクタ、であって、ファンクタには特に型安全や資源解放に関するファンクタ固有の問題は無いと思う
何しろファンクタは普通のクラスHogeの普通のインスタンスhogeとして>>748風に書けるので…

一方、広義のクロージャは、変数を束縛するしくみ=クロージャなので、型安全という概念をそもそも含まない
この広義のクロージャをC++上で実現しようとしているのだとしたら知らん
0794はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1b6f-q1e7)垢版2018/12/24(月) 13:03:08.89ID:+hyoXfJx0
>>788
> いやだからc++なら継承でメソッドでオーバーライドする方が
> わかりやすいし、資源も管理しやすいんじゃない?って話。

だからそんなことはないと私は述べてる。

ラムダ式を使いたいときというのはほとんどの場合は小さな関数を作りたいときなんだよ。
それも一回しか使われないような使い捨てのものをだ。
使い捨てるのならば、別の場所で定義して (名前を付けて) から使うのはまわりくどい。
わかりにくくて管理しづらくなる。

もちろん、場合によってはラムダ式が適さない場合だってある。
そういう場合まで何もかもをラムダ式に置き換えろってんじゃないだ。
ラムダ式が適しているときにラムダ式を使えってだけのことで、しかもそれは案外に多いってことだ。
0797963 (ワッチョイ 05bd-4M5M)垢版2018/12/24(月) 14:08:48.90ID:GJkiS2EE0
訂正orz
誤: 変数を束縛するしくみ=クロージャ
正: 変数を束縛して作った関数(ただし束縛すべき変数のリストが空のときもある)=クロージャ

型安全な言語なら型安全に、そうでない言語でもそれなりにやっぱクロージャ=関数ェ、
0798デフォルトの名無しさん (ワッチョイ 95b3-lUk2)垢版2018/12/24(月) 18:39:17.08ID:JYq0MjYj0
>>794

>ラムダ式を使いたいときというのはほとんどの場合は小さな関数を作りたいときなんだよ。
>それも一回しか使われないような使い捨てのものをだ。
ここが自分の感覚と違う。
ラムダ式を使いたい時ってもう少し動的な関数作成に関わる場合という感覚。
単に名前付けを省略したいくらいならどうとでもなると思うし、個人的にはそんな興味ない用途。
0803デフォルトの名無しさん (ワッチョイ 95b3-6UAB)垢版2018/12/24(月) 22:54:19.63ID:SeeEk3oh0
Javascriptのほうが速いのにな。
0805デフォルトの名無しさん (ワッチョイ 95b3-6UAB)垢版2018/12/24(月) 23:33:25.79ID:SeeEk3oh0
さてはオヌシ、Javascript使ったことござらんな。
0806デフォルトの名無しさん (スッップ Sd43-/Sup)垢版2018/12/24(月) 23:40:50.37ID:osgTLlKWd
何が速いの
0808デフォルトの名無しさん (ワッチョイ 23d2-5YD5)垢版2018/12/25(火) 00:08:46.01ID:66hcSiRr0
new演算子について教えてください。

自分で定義したクラスをインスタンス化してグローバル変数として扱いたいです。
グローバル変数には実体がないといけないと思うのですが、new演算子は
ポインタにしか使えないですよね?
この場合どうしたらいいでしょうか
0813はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1b6f-q1e7)垢版2018/12/25(火) 00:53:54.64ID:HIPAf7J10
>>810
オブジェクトとクロージャはメカニズム的には似たようなもんだ
という感覚は言語処理系に明るい人の感覚としては元々ある。

C++ にラムダ式が追加される前に書かれたこの記事が面白いよ。

"クロージャとオブジェクトの微妙な関係"
http://www.itmedia.co.jp/enterprise/articles/0703/29/news069.html

JavaScript の「オブジェクト」だって、その内実は環境への操作だ。
つまりはクロージャを基礎にしてオブジェクトに見せているんだから、
その逆をやる言語があったって別に不自然なことではなかろ。
0815デフォルトの名無しさん (ワッチョイ cb80-JI52)垢版2018/12/25(火) 03:05:41.87ID:hUN0giiJ0
クラス・クロージャは、同じ。
関数・メソッドから、引数渡しでもないのに、外側の変数を参照できるから

Ruby のブロックがクロージャ。
ブロックの外側の変数が参照できる

一方、Ruby の関数は、外側の変数を参照できないから、
JavaScript, Python, PHP よりも、すごい強固

Ruby だけは、クロージャの外に、関数をスコープを作っている。
さらに関数の外側がクラスで、クラスの外側がモジュール

モジュール > クラス > メソッド(関数) > ブロック(クロージャ)

Ruby 独特の構造!
0823はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1b6f-q1e7)垢版2018/12/25(火) 21:36:34.76ID:HIPAf7J10
>>821
繰返して述べるが、 C++ のラムダ式は単純なクラスの定義と使用を同時に出来る構文糖でしかない。
何故か「クロージャ」と混同した書き込みがあるが
(もちろんいわゆるクロージャの概念からおおいに影響は受けているのだろうが)
C++ のラムダ式は C++ に新しい概念を導入するものではない。
0825デフォルトの名無しさん (ワッチョイ 4bd7-q1e7)垢版2018/12/26(水) 06:42:20.48ID:GQqJjkng0
> C++ のラムダ式は C++ に新しい概念を導入するものではない。

これはさすがに言い過ぎ
関数型のリテラルという概念は C++98 にはなかった
だから C++11 になったとき新しく憶えた
既存の概念の組み合わせでできているから
割とすんなり憶えられたけどね
0827デフォルトの名無しさん (アウアウウー Sac9-6UAB)垢版2018/12/26(水) 21:22:57.27ID:qfoPSrF6a
VC++で[[deprecated]]使ったら警告じゃなくてエラーになっちゃう。
いやまあ正解なんだけどさ・・・
0832デフォルトの名無しさん (ワッチョイ 91e3-h5Ay)垢版2018/12/28(金) 15:46:17.14ID:50PB7VSs0
Emscripten で、マウスの動きに合わせて JS の canvasに直線を描いたりする
ようなGUIプログラムを作って試していて、local auto 変数に確保した
16バイトの char 配列に、sprintf で色の #RRGGBB の文字列を合成
して JS に渡して canvas の context の style に直線の色を設定していた。
で、同時に、KeyDown イベントでで20文字ほどのグラフィック文字列を出して
いた。なお、そっちの方でも、全く同じ関数を使って、上記の色の文字列
を合成していた。
すると不思議なことに、KeyDownイベントで文字列を書いた後は、
必ず、直線の方の色が変わってしまう。必ず青色で書くようにしているはずなのに。
ログをとってみると、
char szBuf[16];
sprintf(szBuf, "#%02X%02X%02X", r, g, b);
で szBuf に対して、最後の 0終端文字が、書き込まれていないことが判明。
よく見ると、KeyDownイベントで色のためではなく、出力したい
文字列そのものの文字の一部が直線描画の方の szBuf の #RRGGBB の直後に
残ったままコピーされているように振舞っていた。

ためしに、sprintf() の命令の直前に、memset(szBuf, 0, 16); とすると
正常化することも確認した。

Emscripten のライブラリの不具合だろうか?
0833デフォルトの名無しさん (ワッチョイ 91e3-h5Ay)垢版2018/12/28(金) 16:23:41.67ID:50PB7VSs0
char szCol[16];
memset( szCol, 0, 16 );
memset( szCol, 'W', 10 );
szprintf( szCol, ・・・ );

とした場合は、W の文字が残ったままになることも分かった。
0835デフォルトの名無しさん (ワッチョイ 5ad2-4fyn)垢版2018/12/28(金) 19:27:07.61ID:NSIH2Vow0
C++でクラスポインタにnewしたオブジェクトを配列の様に複数作りたいのですが、
エラーがでてしまいます。

ポインタの宣言
TimerParameter *_timerParameter;

インスタンス化
_timerParameter[_timerSize] = new TimerParameter(time, function, one_loop);

TimerParameterコンストラクタ
TimerParameter::TimerParameter(ULONG time, void(*function)(), bool one_loop)
{
_function = function;
_oneLoop = one_loop;
_timeSpan = time;
resetTimer();
}

自分で作ったTimerParameterクラスをnewして_timerParameterメンバに入れると以下のエラーが発生してしまいます
sketch\timerState.cpp: In member function 'bool TimerState::timerSet(long unsigned int, void (*)(), bool)':
timerState.cpp:14:30: error: no match for 'operator=' (operand types are 'TimerParameter' and 'TimerParameter*')
_timerParameter[_timerSize] = new TimerParameter(time, function, one_loop);

インスタンス化の左辺が適切でないのが原因だと思うのですが、この書き方はダメなのでしょうか?
0839デフォルトの名無しさん (ワッチョイ 71e3-5EXd)垢版2018/12/28(金) 21:37:00.90ID:IR9VtjpT0
_timerParameter[_timerSize]の型はTimerParameter
new TimerParameter(...)の型はTimerParameter *

あと、
Type * ptr;
ptr[2] = createType();
なんてやっちゃダメなのわかってる?

Type * ptr;
ptr = new Type[10];
ptr[2] = createType();
ならいいんだけど

あと、"_"で始まる名前は処理系予約だし
timeはcの標準関数にtime_t time(time_t *t);があるんでやめれ
0841デフォルトの名無しさん (オイコラミネオ MMad-vEXr)垢版2018/12/28(金) 23:49:39.38ID:foyNhCLxM
vector<vector<float>> = {
{1.33333334, 3.99918277},
{2.56883338, 1.29994666}
}

このようにvector<vector<float>>をdouble型の要素で初期化しようとすると縮小変換が必要とのエラーが出ます
どうしたら縮小変換しつつ初期化出来るんですかね?
0847デフォルトの名無しさん (ワッチョイ 61c3-WBK1)垢版2018/12/29(土) 17:05:30.58ID:mHcV7M6o0
テンプレートに限らずC++を極めてるのは当然の前提として
Developerとして参加するプロジェクトをどうしたいとか、どんな価値を提供できるかとかが重要じゃないかな
0848デフォルトの名無しさん (ワッチョイ aa7e-SF4R)垢版2018/12/29(土) 17:17:06.00ID:U1nQeVxJ0
BoostならBoost相当の性能のライブラリを作って水準に合うドキュメントと何故それがBoostに必要なのか説明する提案書を書いて提出すれば100回リジェクトされる頃には採用されるかも知れない
0849デフォルトの名無しさん (ラクッペ MMa5-O+vW)垢版2018/12/29(土) 17:35:17.80ID:UQDnLnHIM
>>847
C++をより良い言語にしたいです
今はアルゴリズムの研究をしてるのですが、C++をより良い言語にしたいと個人的に思ってるのと、自分が作った言語機能を人に使ってほしいんです
>>848
Boost‥
100回リジェクトされた頃には相当な経験が詰めるはずなので挑戦してみます
0852デフォルトの名無しさん (ワッチョイ 697b-4fyn)垢版2018/12/29(土) 18:34:59.20ID:EkrQifAZ0
すばらしい、C++標準化に参加して、文字コードの扱いの混乱した現状をなんとかしてほしいw
char型はwindowsがsjis、それ以外がutf8、
wchar型は64bit linuxが32bitで、それ以外は16bit、
どのプラットフォームでも同じようにつかえるchar16_t/char32_tはAPIやライブラリが未整備な上、エンディアンの問題がつきまとう、
と、マルチプラットフォームで各種文字コードの透過的な相互運用は事実上不可能な状態だからな……
0856デフォルトの名無しさん (アウアウウー Sa39-Rqk6)垢版2018/12/30(日) 08:17:58.30ID:vtZx8IN+a
visual studioはいろんなエンコードに対応してるように見せかけてshift-jis前提で動いてる気がする。


デバッガでpngのシグニチャ確認したら臼ngとなるとか、コメントにπを書いたら赤の波線が出るとか。
0861デフォルトの名無しさん (ワッチョイ 694e-4fyn)垢版2018/12/30(日) 11:59:41.73ID:bm6ZOgnS0
まぁ、マイクロソフトも徐々にUTF8を標準サポートにする方向みたいだから、2〜3年したらVisual Studioもデフォルトがutf8になるかもね。
エンディアンの問題も、x86,ARMに続いてRISC-Vがリトルだから、流れとしてはリトルで統一ってことになるのかな。そうなったら楽でいいなw
0862デフォルトの名無しさん (ワッチョイ 1a01-SF4R)垢版2018/12/30(日) 13:40:53.27ID:Ux/rKcR40
RISC CPUが出始めたときはビッグの勢いあったけど
結局リトルに収斂したな
おれは昔からリトルが自然と感じてたのでいい流れだ
ネットとの相性が悪いのは残ってしまうが
0863デフォルトの名無しさん (ワッチョイ 9161-h5Ay)垢版2018/12/30(日) 13:46:05.24ID:31DgsdhN0
Emscripten で Cソース中に以下のようなプログラムを作ると、MyPrintf()内の
(2) で (3)の vsprintf() を呼び出そうとした瞬間に、なぜか (4) に来ずに、
(5)に戻ってきて a4 に制御が戻って来てしまうことが判明。タイマーイベント
を使ってる。誰か原因の見当が付く人いない?
EM_ASM( {
  function js_OnTimer() {
    console.log( 'begin of js_OnTimer()\n' ); //a1
    var cl_OnTimer = Module.cwrap('OnTimer', 'number', ['number']);
    console.log( 'js_OnTimer(), before calling cl_OnTimer(1)\n' ); //a2
    var rc = cl_OnTimer(1);       //a3
    console.log( 'js_OnTimer(), after calling cl_OnTimer(1)\n' ); //a4
    console.log( 'end of js_OnTimer()\n' ); //a5
  }
  setInterval(js_OnTimer, 1000);
});
extern "C" int OnTimer( int a ) {
  OnTimerCore();
  return 0;
}
void OnTimerCore() {
  MyPrintf( "begin(MyPrintf) of OnTimerCore(), %d", 123 ); // (1)
  printf( "begin(printf) of OnTimerCore(), %d\n", 456 ); // (5)
}
0864デフォルトの名無しさん (ワッチョイ 9161-h5Ay)垢版2018/12/30(日) 13:46:34.18ID:31DgsdhN0
>>863
void MyPrintf( const char *pszFormat, ... ) {
  char      szBuf[2048];
  va_list     va;
  va_start( va, pszFormat );
  EM_ASM( { console.log( 'MyPrintf, before call vsprintf()\n' ); }); //(2)
  vsprintf( szBuf, pszFormat, va );    // (3)
  EM_ASM( { console.log( 'MyPrintf, after call vsprintf()\n' ); }); //(4)
  va_end( va );
}
0865デフォルトの名無しさん (ワッチョイ 9161-h5Ay)垢版2018/12/30(日) 14:57:17.90ID:31DgsdhN0
>>863
原因は、main 関数の最後に書いておいた、次のループにあった :
for ( ;; ) {
  emscripten_sleep(36000000);  // 何日間も待つ。
}
このループをコメント・アウトするだけで、vsprintf() が1つ前の戻り先に
戻ってしまう不具合も、sprintf() が 0 終端文字を書いてくれない不具合も
共に起きなくなった。

このループを書いていたのは、Emscripten 1.35 で、かつ、
wasm ではなく、asm.js で試していたときに、キー押下イベント
などが発生した時に
 Assertion failed: the runtime was exited (use NO_EXIT_RUNTIME to keep
 it alive after main() exits)
というエラーが出るためだった。つまり、main() 関数が終わると、
「ランタイム」(ランタイム・ライブラリ?) も終了してしてしまうので、
main() を終わらせられなかった。だから、main() の最後に、なんらかの
無限待機の仕組みが欲しくなって書いていたのだった。

現在は このループを除去しても警告が出なくなっているが、
Emscripten の Version を上げたせいか、asm.js ではなく、wasm の方を
使うようになったせいかは分からない。
0866デフォルトの名無しさん (ワッチョイ 557c-Oscs)垢版2018/12/30(日) 16:16:05.88ID:Y/PcKL5Q0
なんでリトルが自然なん?
あとから拡張しやすいって意味か?
0867デフォルトの名無しさん (ワッチョイ 95f2-4fyn)垢版2018/12/30(日) 17:21:44.51ID:JDxg8BDU0
加算器は下の桁から処理していって桁上げする方が自然とか、複数バイト長のワードで
ビットアドレスとバイトアドレスの増加方向が同じになるとかかな。
ワードサイズが変わっても低位バイトの位置が変わらないから拡張しやすいってのも
もちろんあると思う。
0868デフォルトの名無しさん (ワッチョイ da01-ZiiZ)垢版2018/12/30(日) 17:42:37.29ID:8KuoxE+z0
ハード作ってる時はビッグエンディアンの方が自然な気がするがソフト作ってる時はリトルエンディアンの方が自然な気がする
まあ、FPGAと高級言語を使うようになってからは滅多に気にすることは無くなったけど
0869デフォルトの名無しさん (ワッチョイ 91e3-h5Ay)垢版2018/12/30(日) 17:43:15.81ID:+xBnY0nz0
>>867
cast するときにも便利。

メモリに書かれた 32BIT整数を 8BIT 整数として取得したい際など、
先頭アドレスが変わらないので、速度効率が上がりやすい。

もし、BIG ENDIAN だとそのようなときに、「3」足さないといけなく
なってしまうと思う。
0872デフォルトの名無しさん (ワッチョイ 9161-h5Ay)垢版2018/12/30(日) 17:52:58.01ID:31DgsdhN0
Uint32 u32;
BYTE u8;
u8 = (BYTE )u32;

とするコードがあったとする。u32 を、ポインタで置き換えたいとき、

Uint32 *pUint32;
u8 = (BYTE )*pUint32;
と書くのも正解だが、

u8 = *(BYTE *)pUint32;
と書くのも正解で、実は、後者の方が効率は良い場合があるとされる。
なぜなら、メモリから前者は4バイト読んでから上位バイトを捨てるが、
後者では最初から上位バイトを読まないから。

この場合、Little Endian だと、後者の書き方でも混乱が少ないが、Big Endian
だと何を意味しているのか分かりにくくなる。というのは、
(BYTE *)のようなポインタ型への cast は、旧来の C では、アドレス値自体は
変更せずに、型だけを変更するというのが伝統的な実装だったため
(ただし、C++ の場合、多重継承していた場合は、その原則を破ってアドレス値が
変化する事があるが。)。

BigEndian の場合、最後の書き方の実装に不安定要素が残るように思える。
0874>>835 (ワッチョイ 5aad-4fyn)垢版2018/12/30(日) 18:10:27.41ID:Q7hIiacN0
>>836,>>839
ありがとうございました。
配列の実態作ったらできました!

_を接頭文字で使うのは結構規模の大きいオープンソースプロジェクトのソースで
メンバー変数の頭に_を使ってたのでやってました。
気を付けます。

話は少し変わるんですが、>>809でクラスをnewせずに使うというのが書かれていますが、
オブジェクトをnewせずに使うことって結構あるんでしょうか?
普段C#やっているのですが、クラスは基本的にnewでインスタンス化して使うものと思っていたので、(コンストラクタで特に初期化処理がなくても)
0875デフォルトの名無しさん (ワッチョイ 9161-h5Ay)垢版2018/12/30(日) 18:24:04.22ID:31DgsdhN0
>>874
>話は少し変わるんですが、>>809でクラスをnewせずに使うというのが書かれていますが、
>オブジェクトをnewせずに使うことって結構あるんでしょうか?

どちらかというと、C++では new する必要ない場合は、new しないことが
良い書き方。new は、好きなタイミングで削除したいようなオブジェクトの場合
のみ使用する。構造体やクラスのメンバの中に、別のクラスのオブジェクトが含まれている
ような場合は、new しないのが原則。

ある意味では、そのような習慣があるからこそ、C++ は効率が良いともいえる。
実は、new や malloc は、確保するサイズにかかわらず、大体 170 クロックほど
必要。delete や free と合わせると、合計 300 クロック必要となる。
一方、そのまま、new せずに「埋め込んだ」場合は、基本的に「0」クロック。

この差はとても大きなものとなることがある。
0876デフォルトの名無しさん (ワッチョイ 694e-4fyn)垢版2018/12/30(日) 18:27:37.01ID:bm6ZOgnS0
>>874
最初から最後まで存在し続けて、特別な終了処理が必要ないオブジェクトなら、わざわざヒープを確保して実行時に初期化する必要はないでしょ。
あと、staticなオブジェクトのコンストラクタはmain関数の前にグローバルコンストラクタから呼び出されるのだが、
これを利用して、プログラム起動時にやっておきたい初期化処理をクラス内で記述する目的に使うこともあるね。
0877デフォルトの名無しさん (ワッチョイ 694e-4fyn)垢版2018/12/30(日) 18:32:12.30ID:bm6ZOgnS0
>>875
さすがに良い書き方っていうのはどうかと思うけどな。
staticなオブジェクトにしちゃうと、初期化の順番が制御できないから、気をつけて使わないとコンパイラ依存のコードになってしまうし。
0879デフォルトの名無しさん (ワッチョイ 9161-h5Ay)垢版2018/12/30(日) 18:55:41.08ID:31DgsdhN0
>>877
必要な場合は new しても良い。でも、クラス Cxxxの中には、文字列の CString
クラスのオブジェクトや、何らかのリストのオブジェクトが複数含まれて
いたりすることも多い。それらのメンバを全て new する場合と、埋め込み
でそのまま使う場合とでは、Cxxx をインスタンス化するときの時間に雲泥の
差が出てしまう。Cxxx が、5つのクラス・オブジェクトを含んでいた場合、
それらを new するだけで、170 * 5 クロックも余分に掛かってしまう。
この数値には、各コンストラクタの処理時間は含まれていないので。

この場合だと、全て new すると、850 クロックも余計に掛かることになる。
さらに、Cxxx オブジェクトがデストラクトされる場合には、合計で、この
1.8 倍程度の時間が new しない場合より余計に掛かることになってしまう。
0880デフォルトの名無しさん (ワッチョイ 9161-h5Ay)垢版2018/12/30(日) 19:01:20.20ID:31DgsdhN0
>>872
思い出したので追加しておく。
Little Endian の場合、

>Uint32 u32;
>BYTE u8;
>u8 = (BYTE )u32;

の代わりに、

Uint32 u32;
BYTE u8;
u8 = *(BYTE *)&u32;

という書き方も出来て、こっちの方が、処理効率が良い場合があるとされている。

しかし、BigEndian だとこの書き方は混乱を招きやすく、かつ、処理効率も
上がらないと思われる。

総合的に考えると、Little Endian の方が処理効率が上がりやすいはずだ。
0883デフォルトの名無しさん (ワッチョイ 9161-h5Ay)垢版2019/01/01(火) 22:54:34.62ID:H66xOrDI0
>>882
確か、関数呼び出し連鎖の途中の関数が誰も catch せずに放っておけば、
親の関数にまで戻れるはずなので、一応、同じようなことが出来る気もする。
長い間使ってないので、むしろ、setjmp, longjmp がどういうものだったか
の方を忘れてしまったけど。

たしかそれでいけたと思うな・・・。
0885デフォルトの名無しさん (ワッチョイ 8901-ikDe)垢版2019/01/05(土) 08:34:01.93ID:rov9DpyB0
std::variantって見たんだけどこれいいね。
0890デフォルトの名無しさん (ワッチョイ d93d-3A6Y)垢版2019/01/05(土) 12:21:03.48ID:ZukYwWxe0
やっぱ整数なら下の桁から上の桁に向かって書いたり送ったりするのが自然
上の桁とか(整数という概念上は)何桁まで伸びるかわからないのだから

しかし一方人間の認識上は上の桁から見て量を把握したいという要求があり、
不幸にもラテン語が左から書くのにアラビア数字が右から書く慣習だったため
二つの文化を取り持つ玉虫色の解決策としてビッグエンディアンとかネットワークバイトオーダーみたいなものが生じた
0892デフォルトの名無しさん (ワッチョイ fb02-cuFO)垢版2019/01/05(土) 14:47:37.72ID:2c1WII2F0
だってビッグエンディアンはネットワークバイトオーダーでもあるから。
外に出すデータや互換性保ちたいデータは普通そうすると思うよ。
0894デフォルトの名無しさん (ワッチョイ 81ad-RM76)垢版2019/01/06(日) 10:53:29.24ID:2S4Gmo3N0
数の表記だけじゃないさ。日付、人名、住所の表記も。
単純なASCIIソートで正しくソートできるのはどれかという話にもつながる。
0895デフォルトの名無しさん (ワッチョイ 8901-ikDe)垢版2019/01/06(日) 13:34:28.45ID:q7b7d/XL0
数値を数字に直すとき桁数を調べるには対数とればいいよ。
0896デフォルトの名無しさん (ワッチョイ 917c-aDDJ)垢版2019/01/06(日) 14:27:57.77ID:UQlfmMBy0
中学生か
0897デフォルトの名無しさん (ワッチョイ 51e3-PFih)垢版2019/01/06(日) 16:25:01.53ID:gVP3A6Xh0
>>895
数学的にはそれで完全に正しい。
しかしコンピュータには誤差があるので、
itoa() や printf() などを自分で実装するような場合、
よく考えないといけないかも知れない。

log_10(x) で計算すると N 桁だということになったとしても、
itoa() などを実装するアルゴリズムによっては、ある条件の時に
誤差によって、1ケタだけずれるかもしれない。

めったに無いことだが、これで銀行システムや戦闘機のシステムが
ダウンしたりするかも知れないので、数学は重要。
0898デフォルトの名無しさん (ワッチョイ 51e3-PFih)垢版2019/01/06(日) 16:27:31.80ID:gVP3A6Xh0
ちなみにオイラは数学は首席だったが、どういう場合にそれが生じるかは
即答することは出来ない。アルゴリズムを慎重に選ばないと、その誤差によって
システム・ダウンやアプリのハングアップ、保護例外などを引き起こす可能性が
わずかだが存在するかもしれない。
0900さまよえる蟻人間 ◆T6xkBnTXz7B0 (ワッチョイ 1901-YfKw)垢版2019/01/06(日) 16:48:35.20ID:5fyS0TRC0
n>=0かつ10^n <= m < 10^(n+1)
のときに整数mは十進n桁の数と言える。
不等式に常用対数を適用し、
n <= log_10 (m) < n+1
が得られる。つまり、1以上の整数mに常用対数を適用し、さらにガウス記号を適用したものがmの桁数だ。
m=0のときは一桁になることに注意する。
0908デフォルトの名無しさん (ワッチョイ 81ff-xhm2)垢版2019/01/06(日) 17:41:26.55ID:kxJaA4Vn0
ふつー数値から文字列に変換する変換関数そのものに長さを報告させるだろ
文字列の格納先のメモリを確保するときのサイズ見積もりに対数を使う場合は
ワーストケースで誤差が出た場合に備えればいい
0911デフォルトの名無しさん (ワッチョイ 8901-ikDe)垢版2019/01/06(日) 18:12:46.00ID:q7b7d/XL0
本屋さんにはUnityコーナーがあるよ。
0916デフォルトの名無しさん (ワッチョイ 5161-PFih)垢版2019/01/06(日) 19:53:45.75ID:viPzIL890
>>908
変換関数そのものをプログラムしたい場合に、あらかじめ桁数が分かって
いる方が便利 or 効率が良い、場合があり、log_10(x)を使用したくなってしまう。
ところがが、log 計算には誤差が有る可能性があるので、その値を過信するのは
問題だと言うことが言いたかった。

例えば、文字列化する際には、多くのアルゴリズムでは、下の方の桁から
決まっていく。しかし、文字列バッファには、上のケタから左詰で入れて
行く必要がある。となると、最初から桁数が分かっていれば、簡単に
プログラムできるのではないかと言う誘惑に駆られてしまう。

後、10で割っていって余りを使う方法は簡単ではあるが、そのアルゴリズム
そのものにも誤差が有る可能性が指摘されている。
0917 ◆QZaw55cn4c (ワッチョイ d347-5am+)垢版2019/01/06(日) 20:10:05.15ID:COVE8lO90
>>916
>10で割っていって余りを使う方法は簡単ではあるが、そのアルゴリズムそのものにも誤差が有る可能性が指摘されている。
え?10で割っていくのにどうして誤差が出るの?
0919デフォルトの名無しさん (ワッチョイ d93d-3A6Y)垢版2019/01/06(日) 20:27:50.31ID:Tw0qXLcy0
んま実際にわ数値の桁数とか型を見たら一発でわかるんですけどねwwwwww
logは人間の感覚特性にマッチした量的尺度を表したり(例:dB)、
情報量の表現に使う(同じものがいっぱいあるという状況は情報量を上げない)という目的が大きい
0920デフォルトの名無しさん (ワッチョイ 8901-ikDe)垢版2019/01/06(日) 21:04:54.26ID:q7b7d/XL0
HTMLパーサーありますか?
0923デフォルトの名無しさん (ワッチョイ 5161-PFih)垢版2019/01/06(日) 22:46:51.25ID:viPzIL890
>>917
前提として浮動小数点数(float/double など) の話だけど、誤差が無いとは言い切れない
事は分かると思う。

誤差を少なくする方法として、10で割ったりせずに、最初から、
10000.0, 1000.0, 100.0, 10.0, 1.0, 0.1, 0.01, 0.001
20000.0, 2000.0, ・・・
30000.0, 3000.0, ・・・
40000.0, 4000,0, ・・・
のようなものを計算しておいて、比較したり引き算したりする方法が
あるそうな。

浮動小数点値の場合、当然かもしれないが log を使わずに、IEEE の仕様を元に
指数部のBIT部分を読んで利用する方がいいらしい。
0929デフォルトの名無しさん (ワッチョイ 5167-xhm2)垢版2019/01/07(月) 23:14:26.87ID:lPhgCzer0
Pythonには素の遅いPythonとJITを使った素のPythonよりとてつもなく速いPythonがあるようですが
Boost.PythonでPythonスクリプトを読み込んで実行した場合は素の遅いPythonの速度になる認識であっているでしょうか?
また、Boost.PythonでJIT版Pythonを実行することは可能でしょうか?
0930デフォルトの名無しさん (ワッチョイ 5161-PFih)垢版2019/01/09(水) 00:35:27.60ID:I3YK3qiz0
>>929
全然その辺知らないけど、
そもそも、python の言語仕様自体がJITを使ったとしてもC/C++ほどの速度には
ならないはずだし、そもそも NumPy 使わないと遅いということは聞いてる。
大体のスクリプト言語は、言語仕様の段階で例えコンパイル言語化しても
どうすることも出来ない遅さが含まれてしまってる。
0931デフォルトの名無しさん (ワッチョイ 917c-aDDJ)垢版2019/01/09(水) 11:18:19.67ID:+j6Vua/i0
numpy使えばC並みの速度が出るようにも書けるが
numpy使ったからと言って馬鹿が描くと素のpython以上に遅くなる
0936デフォルトの名無しさん (ワッチョイ 5161-PFih)垢版2019/01/09(水) 21:54:22.59ID:eG2hyzXv0
・動的型言語
・自動メモリ管理
・リンクリストと配列を余り区別しない書き方をする人が多い傾向。

これらがあるので、pythonをコンパイル型にしてもある程度以上の高速化は
難しいと思われる。
0939デフォルトの名無しさん (アウアウエー Sa22-oec2)垢版2019/01/10(木) 08:22:27.02ID:jdFEneY4a
Pythonにリンクリストなんか無いだろ
Pythonの配列(list)はvector相当の動的配列
実はリンクリストが動的配列より速いケースってC++でも現実にはほとんど無くて、あまり価値のないデータ構造だよ
拡張・縮小にメモリの再確保が不要で抽象化を必要としないから、Cのような生ポインタを好んで使いまくる言語と相性がいいだけ
0943デフォルトの名無しさん (ワッチョイ 4ea0-N8Dk)垢版2019/01/10(木) 20:06:55.51ID:Dp9bpyFY0
tupleってメンバ関数で値取り出せないのね。
std::get<N>( t ) ってファンキー過ぎやしませんか。
下手に使うとコンパイルに時間食われそう。
0949デフォルトの名無しさん (ワッチョイ 4ea0-N8Dk)垢版2019/01/11(金) 13:20:57.05ID:QV4rGvMY0
せめてstd::tuple::get<N>( t ) にして欲しかった。
std名前空間汚れすぎ。
0950デフォルトの名無しさん (ワッチョイ a57c-Iup+)垢版2019/01/11(金) 13:34:51.99ID:5RUmP2fm0
>>943
それは確かに糞仕様だと思うが
テンプレートの意味から言えば仕方ないのかも知れない
(どんな型でも入れられるならテンプレート以外でやるべき)
0955デフォルトの名無しさん (ワッチョイ 1902-l2tH)垢版2019/01/11(金) 17:29:27.31ID:qkp6ca1e0
ポリモーフィズムを使っていて、ダウンキャストを行うときって
dynamic_castをしてみてnullptrかどうかを判断するのがベストな手順なんですか?
RTTIから実際の型情報を引っ張ってくる手段はないものでしょうか
0958デフォルトの名無しさん (ワッチョイ 4ea0-N8Dk)垢版2019/01/11(金) 19:25:12.52ID:QV4rGvMY0
>>955
typeid で type_info 取れるよ。
基底クラスにenum Type 等を持たせてswitchも手の一つ。
処理内容によってはvisitor パターンが使える。俺が知ってるのはこれくらい。
0963デフォルトの名無しさん (ワッチョイ dd01-RNo8)垢版2019/01/11(金) 23:12:06.09ID:TUR+WyZ10
カミカゼキャストについて教えてください。
不意にフレーズが浮かんだのです。
0965デフォルトの名無しさん (ワッチョイ 4ea0-N8Dk)垢版2019/01/12(土) 01:42:52.85ID:Cfay/yS40
dynamic_castでnullptrなりbad-cast拾うのはお勧めできない。
0969デフォルトの名無しさん (ワッチョイ c1a5-M9p6)垢版2019/01/12(土) 04:35:25.22ID:vq0ymgcL0
opencvを使用して画像処理を行ってるんですが画像データにAWGNを加える方法が分かりません
グレースケール化させて処理をしています
乱数生成などは理解しているんですがその乱数を使ってどのような値として輝度値に影響させるのかが分かってません
よろしくお願いします
visual c++を使用しています
0970デフォルトの名無しさん (ワッチョイ c1a5-M9p6)垢版2019/01/12(土) 04:53:59.45ID:vq0ymgcL0
>>969
Mat s;
src.convertTo(s, CV_16S);
Mat noise(s.size(), CV_16S);
randn(noise, 0, sigma);
Mat temp = s + noise;
temp.convertTo(dst, CV_8U);

今こう考えているんですがあっていますでしょうか
srcが原画像、dstがノイズ画像です
0974デフォルトの名無しさん (ブーイモ MM71-oec2)垢版2019/01/12(土) 09:04:15.07ID:VES9RvQbM
>>973
さすがに神経質すぎる
そのライブラリの関数が文字列を書き換えない仕様なんだったら信用すればよい
そんなこと言い出したら何一つ信用できなくなってプログラムなんか書けん
0976デフォルトの名無しさん (ワッチョイ a57d-VK1S)垢版2019/01/12(土) 09:12:16.23ID:iREAiCU50
constついてないってことは内部で書き換えるという明確な意思表示だろ
0984デフォルトの名無しさん (スップ Sd7a-9pEX)垢版2019/01/12(土) 11:34:06.80ID:JcHNo1aqd
constは付いてないですけど内部で書き換えはしません
なんて仕様書に書いてあるのか
0985デフォルトの名無しさん (ブーイモ MM71-oec2)垢版2019/01/12(土) 12:01:03.58ID:VES9RvQbM
void displayText(char* text);
文字列を表示します
text : 表示する文字列

これが仮にtextを書き換えてしまうとして、それをコピーで回避できたとしても、
そんなレベルのゴミがまともに機能するとは到底思えん
そんなことを言い出したらキリがない
0986デフォルトの名無しさん (ワッチョイ 7a61-V+wx)垢版2019/01/12(土) 12:48:58.54ID:d9Np0YH50
>>942
1. 要素数を N としたとき、1つの要素の処理に要する時間が O(N) になるか、
  O(1) などの違いなので、本質的にハードがいくら良くなっても解決する
  問題ではない。O(N) のアルゴリズムは、N が大きくなった場合には、
  ハードの良さを台無しにしてしまう。なので、アルゴリズムの選定はとても
  重要。

2. 動的配列でも、配列の最後に追加する場合は、リンクリストと遜色ない速度は
  出る可能性は十分あるが、配列の途中に追加する場合は、宇宙人でも無理。

3. 逆に、リンクリストの場合は、先頭から数えて、「k 番目の要素」にランダム
  にアクセスすることを高速化することは、宇宙人でも無理。

4. 「宇宙人でも無理」の意味が理解できるためには、数学的感性が必要。
  理解できない人には理解できないかもしれない。
0987デフォルトの名無しさん (ブーイモ MM71-oec2)垢版2019/01/12(土) 13:04:53.68ID:VES9RvQbM
>>986
問題は、リンクリストの途中に挿入したいとき、予め挿入位置の直前や直後のノードへのポインタを持っていなければならないことだ
そんなケースは現実の開発において殆ど無い
持っていなければ挿入位置に辿り着くまでにO(N)のシーケンシャルアクセスが発生する
そして、リンクリストはメモリアクセスの局所性が欠片もないデータ構造であり、
動的配列と比較してシーケンシャルアクセスのパフォーマンスは極めて劣悪である
0991デフォルトの名無しさん (ワッチョイ 4ea0-N8Dk)垢版2019/01/12(土) 13:40:34.57ID:Cfay/yS40
>>968
あかん。データを壊したくなかったら、別途コピーしたものを渡すべき。
0994デフォルトの名無しさん (ワッチョイ 4a32-VK1S)垢版2019/01/12(土) 15:06:09.76ID:k4bgy+v70
>>986
で、そのリンクリストがパフォーマンス的に勝るデータ量はおいくらだと思ってる?
大きめの画像くらいのサイズならデータの中央に挿入するとき、リンクをたどって挿入するより再確保、再配置した方がシーケンシャルアクセスになるから早いからな
ハードウェアの特性によりシーケンシャルなコピーは相当速いためPythonで一般的に扱う問題では挿入だろうが何だろうがリンクリストが勝ることはまずない
0995デフォルトの名無しさん (ブーイモ MMe9-oec2)垢版2019/01/12(土) 15:20:37.52ID:T5Trh1u0M
よくリストの特定位置に挿入を繰り返してリンクリストの方が速いというベンチマークがあるけど、あれもほとんど詐欺なんだよな
動的配列に多数の要素を挿入するなら挿入する要素数分ブロックコピーでずらしてから空けた隙間に書き込むだけだからリンクリストより圧倒的に速い
予め要素数が分からない場合は、いったん別の動的配列に追加していってから纏めて挿入すればよい
0996 ◆QZaw55cn4c (ワッチョイ da47-jEXV)垢版2019/01/12(土) 15:20:48.59ID:yBCTPneO0
>>994
>再確保、再配置
ここ c++ だよね
再配置というのはコピーコンストラクタが働く、てことだよね
挿入のたびにコピーコンストラクタが動くなんて馬鹿のやることだ、という常識が通用するところだよね
0997 ◆QZaw55cn4c (ワッチョイ da47-jEXV)垢版2019/01/12(土) 15:21:48.44ID:yBCTPneO0
>>995
>ブロックコピーでずらしてから
ユーザーによるコピーコンストラクタが定義されていたら「それだけでは済まない」のでは?
10011001垢版Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 98日 16時間 29分 4秒
10021002垢版Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


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

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

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

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

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