C++相談室 part131 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
次スレを立てる時は本文の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 "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::を省略する方法ってあるでしょうか? >>694
最適化が有効なら C++17 であろうがなかろうが clang なら RVO が効くはずだけど、 u.p の値は null になっちゃうな。
RVO がどうこうじゃなくて this の挙動に関するなんか変なルールが適用されてるとかかも? >>696
クラス内部にインライン関数を埋め込む方法しかない。 >>697
いやだからISO/IEC DIS 14882:2017 15.2/p3の規定により常にRVOが働くわけではないのではないかと申しているのですよ
ついでにu.pがnullptrになることはない 右辺値参照の暗黙適用は例外の処理で不都合があるよね
元の値をTmpにコピっといて例外発生で書き戻すにしても
関数A処理内で呼び出した関数Bからの例外をAのユーザコードでは完スルーなのに
コンパイラコードではコッソリ捕まえて書き戻す必要が有る
そんときロックでも掛かってたらどーすんのよと
呼び出し繋がりを横断的に管理要するとんでもないコスト増なんじゃね? Tmpのアドレスを関数B(およびその先の関数)が知る可能性がコンパイラから見て排除できない限り
関数Aから関数Bを呼び出す前にTmpは元の値の完コピーにならざるおえないのでは…
(そうでなければ副作用のある関数を安全にコンパイルできない&安心して書けない
さらにロックに入るときと出るときは上と同じ理由で結果的に完コピーになる上に、
まともなOSならメモリバリアまで手当てしてくれるんじゃ… つまり右辺値参照の暗黙適用が効力を持つのはスゲー広範にインライン展開されるような場合
(当然いかなるOSのAPIやシステムコール類の呼び出しも含まない
「だけ」
であって、通常のプログラマーにはあんまありがたみがはっきりしない仕様
※ 個人の感想です コンパイラに頼らないで、素直にパラメーターの参照にしよう >>700
意図するところをあらためて説明すると、
最適化オプションを有効にする (RVO が効くはず) と実際に null になるんだから
clang があてにならないのじゃない? という話。 いや noexcept 付きを呼ぶ場合も有難味あると思うよ
C++は const祭りに noexcept祭り追加でござる
特殊化も爆発 >>706
なるほど理解した
C++11の頃に輝いたclangはその後、規格的にはG++にも劣るゴミなのでそのへんは致し方ない tcp/ipの勉強のためにC++で何か作れば勉強になるかな?って思ってるのだけど
こういうものを作れば勉強になるよってものある??
パケットの動きだったり階層の考え方だったりを学びたい >>710
TCP/IPの勉強ならWireSharkの使い方覚えた方が早いかも
その上のプロトコルレベルなら勉強したいプロトコルの簡単なクライアントから始めればいいと思う
ちなみに俺はNetNewsに流れるむふふ画像を取り込みたかったのでnntpのクライアントをperlで組んで勉強した >>711
プロトコルレベルの勉強をしたい
そうなるとhttpサーバを立てることになるのかな?
そういう場合は簡単なhttpサーバとクライアントを作成すれば良いのかね?
それで通信しあってwiresharkで中身を見てtcpだったりhttpだったりを見るべき? おれは一昔前、深夜ボリュームでかくする姉貴のPCが煩くてTCP通信でマスターボリューム弄るサーバー&クライアント作ってコッソリ仕込んでコントロールしてたな。
まぁ、やってやるぞというモチベーションは大事だとおもうよ。
ガンバってね。 >>713
姉貴のパソコンにサーバプログラム常駐させる
そいつがポートXXXで待ち構える
同じ家なのでネットワーク帯は同じで
自分のpcからポートXXXにメッセージ送信する
姉貴のサーバプログラムが受け取ってボリューム下げる処理をする
こんなことしてたってことかね? >>715
まぁ大体そんな感じなんだが、急に音量小さくすると即効でばれるので、まず、姉貴PCの音量を取得するのが第一だな。
そこからスライダーでボリューム下げていった値をサーバーに順次送信しサーバープログラムがその値に応じて音量を徐々にフェードコントロールするといった具合だな。 >>716が>>715の三人きょうだいの次女である可能性が否定できない >>716
いつも音量小さくなってたのはあんたのせいだったのね??
ってことはそれって通信はhttp? >>718 http関係ない
ボリュームと改行の平文を繰り返し送るだけの超簡易仕様
だれでも作れる >>719
相互にsend recvしてるだけってことかな >>712
サーバーよりクライアントの方が簡単だからサーバーは適当な奴持ってきて簡単なクライアントを作るところから始めればいいと思う >>721
IISサーバとかってことかな?
あの辺の使い方も基本は同じよね?
ポート指定して使うみたいな >>722
> IISサーバとかってことかな?
環境ならWindows IISが簡単だろうね
ネットでググれば情報たくさんあるし そもそも、TCP/IPの練習にC++は妥当なのか? >>724
CとC++しか言語知らんのや...
IISサーバーと通信できない
これのポートとかどう設定するんや... >>725
以前ネットワークプログラム勉強するのにこのサイト利用させてもらった
わかりやすいと思う
http://x68000.q-e-d.net/~68user/net/ 初歩の初歩の初歩の質問なんだけど
あるPCにポートXXを口とするサーバソフトを同時に二つ立てることはできないよね?
1つめはXXを使うとしてその後にたてられた2つめはどうなる?
(スレチっぽくなってますがよろしくです...) 出来ます
サーバー側はリクエストに応じて複数のプロセスを起動し、
同じポート番号を使って複数のプロセスが受け答えします
各プロセスはそれぞれで生成したソケットを使ってクライアントとやり取りします >>730
それってプログラム内でforkして子プロセスを作る場合の話です?
サーバソフトAとサーバソフトBの両立ができたとすると
ポートXX使用します!ってのはどこでどちらを使うと判断するのでしょうか... 特定ポートでlistenするプロセスは一つだけです。
複数のプロセスで共用は出来ません。 >>729
LANポートが複数あればできるし、LANポートがひとつしかなくてもIPアドレスを複数割り当てられるなら可能 >>733
ああ言えばこういうの典型
どうでもいいけどC++と関係ないクソ話もうヤメロよカスども C++98ではできない
C++11以後できるようになった
だろ、通信は本質的にマルチタスクだ 規格外のライブラリならほぼ何でもありといえばありだけどさ。
ライブラリ自信はまだ策定中でしょ。 bind()する時のローカルのIPアドレスを別々にすれば同一ポートで別々のサーバプログラムって動かないの? >>741
だから動くってば
ユニークである必要があるのはIPアドレス:ポート番号の組み合わせだから
>>730
>各プロセスはそれぞれで生成したソケットを使って
まさかその生成されたソケットがサーバーと同じポート番号を持つとか思ってないよな?
いずれにせよこんなのはネットワーク初心者の話題であってC++とは何も関係ない >>737
それが間違ってるって話
>>741が言うようにローカルアドレスを指定すれば同じPCで同じポートを使用するサーバーを複数立てられる 自己訂正
>まさかその生成されたソケットがサーバーと同じポート番号を持つとか思ってないよな?
あはは、これは俺の勘違いだったわ
acceptで返されるソケットはlistenポートと同じポート番号を持っている 質問です。
{ 10/*%*/ } = { a,b,c };
というのは、
a = 10%
b = 10%
c = 10%
なのでしょうか?それとも、
a+b+c = 10%
なのでしょうか? C++を習得するのに莫大な時間を費やしました。
C++のプロフェッショナルなプログラマーになりたかった。
なのに、ハード系の知識が無いと言う理由で、もらう仕事はVB.NET、C#.NET系ばかりでした。 質問を書くのを忘れやんした。
C++の仕事ってハード系、通信系、制御系以外、通常業務のシステム開発はないんでしょうか? ポート重複で同じアドレスでBananaサーバーみたいなラックマウントサーバーの仕組みってあれは一つのサーバーがlistenで待って接続してきたクライアントの処理を複数の子サーバーに割り振っているだけなのか? struct unko { unko()=delete; };
int main() { unko u{}; }
何故コンパイルが通るのかを理解するのに半日かかった
やはりこの言語はクソ >>746
他人から降って湧いてくることしか期待してないからそうなる
自分がやりたいことは自分で始めろ >>747
C++はC#とかでできないことがあるときに仕方なく使うイメージがある >>749
あれ
何で動くんだ?
plain old dataあたりの話が噛んでる? C#の方が楽なところが特に無いのでC#という選択肢が無い >>752
PODがかかわってる部分はあるけど基本として理解しておくべきことは
=default,=delete指定はコンストラクタの宣言でも定義でもない
ということ
つまり>>749の文脈では
struct unko { unko()=delete; };
int main() { unko u{}; }
は
struct unko {};
int main() { unko u{}; }
と等価でありuはaggregate初期化されコンストラクタは呼ばれないからエラーにならない
(unko();みたいにはっきりとデフォルトコンストラクタが呼ばれる状況ならエラーになる) >>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ではないと見なされている(たぶん) >>748
パケットレベルで振り分けたり、プロキシとして動作したり色々
ロードバランサ 仕組み
とかでググるがよろし
あとそこまで行くと完全にスレチなので
ネットワーク
http://mevius.2ch.net/hack/
とかに行っとくれ >>747
20年前は普通にあった、ていうかそれしか方法がなかったが
今はもっと楽な方法があるのでほぼ無くなった
僅かな例外はパフォーマンスを求めるようなプログラムを作る場合だが
それでもライブラリなどの表から見えない部分の作成に限られる 各添字が 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」を関数の中で解釈する方法も分からなくて困っています。 >>760
その例だと A[X][X][X] の3次元相当だけど3次元限定でいいの? >>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;
} 左辺が j, k ,i 右辺が i, j, k のようだが ……素直に3次元の配列にすりゃあいいんじゃねえのかなコレ
どーーーしても1次元にしなきゃいけない重大な理由が背後に控えてんのかな? B[ii][jj][kk] = A[i][j][k];
でも通るな >>761
もちろん任意の次元を一度に扱えたら最高です。
ゆくゆくは各添字の次元を変えることも考えています。
>>762>>765
すみません。
全要素を並び替えたいです。
>>766
カラムメジャー、ロウメジャーを任意にしたいという背景があります。
また、各添字の次元が本当は任意であるということもあります。
>>763
ありがとうございます。
確かにこれで>>760はできそうです。
パーミュテーションの実装の仕方が分かりました。
原理的にはこれで任意の添字の数、次元に対応できる (それぞれ関数を作る必要はある) と思うのですが、もっとアカデミックな方法ともあるのでしょうか? >>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; >>770
ありがとうございます。
あとは任意個数の引数を取れるようにすれば添字がいくつあっても、各添字がどのように走っても一つの関数で対応できますね。
勉強になりました。 任意個数の引数って、まさか省略記号と可変個数実引数では・・・
と思ったらモロじゃねえか おいおい
このスレ的にはinitializer_listやtemplate parameter packだろ >>773
template parameter pack って variadic template と同じもの?
後者の呼び方には馴染んでるんだけど。 >>773
ほっといたっていずれ覚えるだろうに何故押し付けるのか >>776
より良い代替案があるんだったらそっちに誘導すべきだろう。
実際使うべきじゃないし。 >>776
このスレ的にはって書いてあるのが読めてないのか
自分が苦手なものに触れられたくないのか
どっちだ? >>779
最近お前みたいなニワカが増えてうんざりするわ
というかCの可変長引数がどこに出てきた? つかぬことを伺いますが、
あるクラス内で定義した構造体を同クラス内でstatic constメンバとして宣言し、
外部で定義しようとしたところ、「〜との互換性がありません」と出て上手く行きません
どうすればよいのでしょうか
〜ヘッダ内
class Hage{
public:
struct A{
int a;
int b;
};
static const struct A M;
}
〜ソース内
#include "ヘッダ"
const struct A Hage::M; //不正 const struct Hage::A Hage::M; >>781
少なくとも Hoge::A としなけりゃダメなんじゃないか
>>771を読んでもCの可変長引数とは決めつけられなかった うわあ何でこんな初歩的なことに躓いていたんだアホらしい
>>783-784サンクス ###HUM###
000-K,AZ,0,1,
001-KI,L,I.T,DEF,11.2,TE,F,0.12235,
002-EM,OBLA,7##END >>780
うわーおまえ、それ人に聞かなきゃ判んねえの?
省略記号は右端という初歩の初歩でミスりながら
ドヤってる笑い地獄が2日前あったんだが
突っ込めなきゃせっかくボケた芸人も泣いてるだろうな >>773の「モロじゃねえか」がどっから出てきてるのか謎だ 多分Cの可変長引数なら右端以外にも書けると思ってんじゃないかな こんなイメージかな?
#define X (100)
#define f(a,b,c,d,e) ((b)[(c)+X*(d)+X*X*(e)] = (a)[(e)+X*(c)+X*X*(d)]) >const struct A Hage::M; //不正
初歩的でなく相当に高度な気がしてならない
規格の3.4.1/p7,p8,p14あたりを頭に入れていないといけない
「class NS::C;」のように何でも「::」を付ければ良いと言うわけでもないので ■ このスレッドは過去ログ倉庫に格納されています