X



C++相談室 part139
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ f65b-zn+7)
垢版 |
2018/10/06(土) 00:59:48.54ID:CdYUXXMG0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/

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

■長いソースを貼るときはここへ。■
 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
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は問題なく仕事を続けられる
データ共有というのは後者
0667デフォルトの名無しさん (ワッチョイ ebf2-2dqZ)
垢版 |
2018/12/16(日) 13:20:15.29ID:OmvADhcW0
今度は「共有」という言葉の定義論か。それを>>647で言っていたんならそう問題はなかったろうがな。
どっちにしても通信時間が云々というのが的外れなのは変わらない。
見苦しい。
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の気持ちが分かってしまう
■ このスレッドは過去ログ倉庫に格納されています

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