C++相談室 part137

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 12c3-4saf)
垢版 |
2018/08/27(月) 16:02:00.94ID:vY3QDx2y0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part137
https://mevius.5ch.net/test/read.cgi/tech/1531558382/

このスレもよろしくね。
【初心者歓迎】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
2デフォルトの名無しさん (ワッチョイ 8ac3-4saf)
垢版 |
2018/08/27(月) 16:03:04.41ID:vY3QDx2y0
すまんスレ番ミスった
2018/08/27(月) 16:03:29.14ID:H/K1FpSE0
謝って許されることじゃないね
2018/08/27(月) 16:22:40.23ID:oonIPXiN0
こういうヤツがプログラミングするとえらいことになる
2018/08/27(月) 16:26:27.53ID:7PWma/MO0
1 はクズ
2018/08/27(月) 17:22:00.81ID:TVAO+u4x0
フェイルセイフ機構として
スレッドを立てて何分間あるいはレス何個までは
立てた人に限りタイトルを修正できる、
みたいな機能があっても良いかも知れん。

あるいは事前に「これから立てるスレッドは〜の後継である」
みたいな宣言ができて、重複や番号の間違いをチェックしてくれるとか。
2018/08/27(月) 17:25:07.23ID:H/K1FpSE0
>>6
それいいな。しばらく放置して、正当スレと認められたら
時間ギリギリで>>1の内容を書き換えるのにちょうどいい
2018/08/27(月) 18:21:58.03ID:xvf87VjGa
結局どうするん?
ここ使用?
2018/08/27(月) 22:39:11.81ID:oahf+hzU0
vector<object*>* func()
{
vector<object*>* vect = new vector<object*>;
for(int i = 0; i < 10; ++i)
{
object* obj = new object;
vect->push_back(obj);
}
return vect;
}

若干うろ覚えなんですけどこんな関数があります。ポインターを収納したベクターへのポインターを返すというものです。
まず質問なんですけど、関数内でnewして確保したメモリアドレスを返すってこれあまり良くないこと……ですよね?それともよくあることでしょうか。
それともう一つ。仮にmainなりどこかでこの関数の戻り値を受け取って利用したあと、メモリ解放はどうすればよいのでしょう
例えばdelete vectだけか、それともobject*をループで回して全部にdeleteすればいいのか、それとも両方やらにゃならんのか

よろしくお願いします。
10デフォルトの名無しさん (ワッチョイ 2561-+TX9)
垢版 |
2018/08/27(月) 22:45:10.99ID:X1STgCw40
どなたか c++でのソケット通信を使った複数人が使えるチャットのサンプルコード持ってる人いませんか?
ネットで色々調べてるんですけど、tcpじゃなくてUDPのやつだったりwindowsじゃなかったりcだったり書いてあることが難し過ぎたり...
そもそも1:1のコードばかりで複数人対応のサンプルコードが見つかりませんorz
11デフォルトの名無しさん (ワッチョイ 2561-+TX9)
垢版 |
2018/08/27(月) 22:46:54.38ID:X1STgCw40
複数人対応にするにあたって、複数のソケットを用意するのとselect関数が必要になると思うのですけど、selectの方はおそらく理解できています。
複数のソケットからアクセプトされるところの流れが全然分からないです。
今自分が書いてみたコードだとスタックオーバーフローというらしい現象が起こってしまってます。
2018/08/27(月) 22:47:25.25ID:CIUWIYCt0
難しくないものは存在しないとオモ
2018/08/27(月) 22:50:37.52ID:oonIPXiN0
>>9
ループで回して解放しないとダメ
JAVA脳だと放置するところだけど
2018/08/27(月) 22:57:17.24ID:AuFamtLr0
>>9
どっちもnewするなら両方deleteしないといけない(もちろんobjをループでdeleteするのが先
何が良い・良くないは自分で考えた方がいいよ

>>11
アクセプトされる、ってのは認識がおかしい
listenしたソケットに来た接続要求を、acceptで受け入れてクライアントとのセッションを開始する
サーバーはlistenで要求待ちするソケットと、acceptでクライアントと通信するソケットを持つ
クライアントはconnectでサーバーに接続して通信するだけ(ソケットは1つでよい)
2018/08/27(月) 23:00:46.13ID:CP0MczZVM
>>11
コードさらした方が話が早いよ
それより複数人だとどういうトポロジーで繋ぐの?
例えば4人だとどうなる?
2018/08/27(月) 23:09:16.63ID:W4qvSHyH0
>>10-11
次の本が、似たような状況(たしかレーシングゲームだったか)のサンプルを載せていたと記憶しています
https://www.amazon.co.jp/gp/product/4774117544/

Windows の winsock も UNIX のバークレーソケットと似たようなもので、若干の修正は必要ですが、そこはネットを参考にして書きなおせる範囲だと思います
この本は初版が 1992 年頃に出たときから htons()/ntohs() が書いていない、とボロカスだったんですが、私はとっても好きだったのです…
17デフォルトの名無しさん (ワッチョイ 2580-kiUO)
垢版 |
2018/08/27(月) 23:16:58.65ID:zX+eejgv0
listenで待ってるスレッド(もしくはプロセス、こっちならあとでfork()する)がいる

listenで待ってるスレッドやプロセスからacceptして
peerと新しいソケットで通信するスレッドを作る

もうコレで分かる
2018/08/27(月) 23:32:35.96ID:ba8BcfX30
>>9
ゲームエンジンの本には、よくメモリープールの実装が載っている。
こういう機能を抽象化した、モジュールを誰かが作っているはず

Effective とか、デザインパターンの本も読んだ方がよい
19デフォルトの名無しさん (ワッチョイ 2561-+TX9)
垢版 |
2018/08/27(月) 23:32:44.53ID:X1STgCw40
サーバーが自分用のソケット一つと複数個のユーザー用ソケットを作成し、ユーザー 一人につき一つのソケットが割り振られるイメージでした。
2018/08/27(月) 23:52:05.98ID:H8sSdLfla
こんな感じにpublicにもmainいてもエラーにならないのはどうしてですか?

Main.h

class CMain
{
public:
int main(int argc, char* argv[]);
};

Main.cpp

int main(int argc, char* argv[])
{
return 0;
}
21デフォルトの名無しさん (ワッチョイ ea5e-7kIV)
垢版 |
2018/08/27(月) 23:57:35.85ID:TZo7knfc0
一般関数のmainとメンバ関数Cmain::main()は別物だろうよ。
2018/08/28(火) 00:05:18.35ID:04IHxsB70
>>20
名前空間が違っていて区別がつくから同じ名前のものがあっても大丈夫。
2018/08/28(火) 00:18:40.52ID:wxxo3xcIa
>>21,22
なるほど、それもそうですね
2018/08/28(火) 07:30:50.31ID:r63k0nU70
>>13 >>14
ありがとうございました。やっぱ両方なんですね

>>18
メモリープール初めて知りましたがこんな方法あるんですね
あと上司がおよそ20年に渡って継ぎ足し継ぎ足ししてきたすぱg秘伝のコードなので今更構造変えられんのです……
2018/08/28(火) 07:39:23.68ID:oGnGbrSA0
スマポつかえよ!
2018/08/28(火) 07:44:24.16ID:BzDdgzNr0
上司のコードに文句言いつつデリートも知らん奴がなんか言っとる
2018/08/28(火) 07:49:16.32ID:oGnGbrSA0
勇んでデリートするようなコード書きたいか?
2018/08/28(火) 08:58:31.81ID:vCTFJ2QC0
>>24
リファクタリングの機会を設けないと秘伝が負債になるのがこの業界
2018/08/28(火) 08:59:48.56ID:TEJeUOom0
auto pointer, smart pointer ?
2018/08/28(火) 10:05:03.87ID:oGnGbrSA0
rip.auto_ptr.
31デフォルトの名無しさん (ワッチョイ 2561-+TX9)
垢版 |
2018/08/28(火) 15:32:29.83ID:2BUW4hJo0
>>19
1:1のソケットを4つ用意すれば4人でチャットできますよね?送ったメッセージをサーバーサイドが受け取って他の3人のソケットに送るイメージです
2018/08/28(火) 15:45:07.84ID:FmvTK/aC0
あー、それなら合ってるね
そのままのイメージで書いてみればいける
33デフォルトの名無しさん (ワッチョイ 2561-+TX9)
垢版 |
2018/08/28(火) 19:28:50.38ID:2BUW4hJo0
>>32
それぞれのソケットの中身で違うのはポートだけってことで大丈夫ですかね?
2018/08/28(火) 19:45:32.21ID:FmvTK/aC0
まぁポートだけ、というかリスニングの処理だけ特殊とは言えるかも
2018/08/28(火) 20:36:55.08ID:jw/yHSMpr
このスレって競プロerいる?
2018/08/28(火) 23:15:21.08ID:q8rsvszA0
>>35
いる
2018/08/29(水) 00:22:05.79ID:9tKCPoRq0
関数からreturnされる値は必ず自動的にmoveされる?
2018/08/29(水) 00:25:41.59ID:uf5REJu50
コンパイラと設定によると思う
39デフォルトの名無しさん (ワッチョイ 2580-kiUO)
垢版 |
2018/08/29(水) 00:26:07.98ID:zRPnCBM00
計算機S 192.168.0.1:40000 ⇔ 計算機A 192.168.0.16:41769
計算機S 192.168.0.1:40000 ⇔ 計算機B 192.168.0.17:61544
計算機S 192.168.0.1:40000 ⇔ 計算機C 192.168.0.18:61568
計算機S 192.168.0.1:40000 ⇔ 計算機D 192.168.0.19:63490
           ↑                      ↑最初に接続する計算機のポートは通常自動的に空き番が使われるようにする
計算機Sからみてpeerは
計算機Sが受付を待っているポートに
接続する必要がある
2018/08/29(水) 01:16:31.78ID:nUvoSPGm0
え、TCPいうてたしサーバーのIPとポート指定して接続してつなぎっぱなしを想定してたんだけど違うのか
いちいち切って繋ぎ直すなら別だけど
2018/08/29(水) 01:39:42.75ID:+EFc44O50
受付嬢は一人、ご相談は各担当に回す
みたいな
2018/08/29(水) 01:56:45.22ID:iljSGsda0
>>37
値が rvalue でムーブコンストラクタが存在するならばムーブされる。
(lvalue も状況によっては rvalue になることもある。)
ただし、 RVO の適用条件に叶う場合は RVO が適用されるかもしれないのでコピーもムーブもされないことは有りうる。
2018/08/29(水) 13:02:14.24ID:3zmBLDqv0
Hogeというクラスがあったとして、
Hoge getHoge();
という関数があるときに、
Hoge &hoge = getHoge();
と参照で受けて問題ない?
2018/08/29(水) 13:31:26.82ID:8DgsmGan0
ダメ
getHoge()の返却値はprvalueなので
constのない左辺値参照で受けることはできない

右辺値参照か、
constのついた左辺値参照が必要
2018/08/29(水) 15:21:15.25ID:iljSGsda0
>>43
getHoge() の返却値は一時的なオブジェクトなので
原則としては完全式の終わりに解体されることに
なっているが、 >>44 の述べる通りの方法で参照で受けたときに限って
例外的に寿命が延長される規則がある。
参照のスコープの終わりがオブジェクトの寿命になる。

RVO が発動するだろうから、そもそも参照で受ける意味があんまり無いと思う。
2018/08/30(木) 00:25:01.05ID:kCgj5iLA0
書籍スレで聞いたらスレチ(?)と言われたので質問させて下さい(m´・ω・`)m
C++で新し目(出来れば2016年以降に発売したもの)の入門書でオススメがあれば教えていただきたいのですが…
よろしくお願い致します。
2018/08/30(木) 01:05:42.98ID:RsXRD1vR0
ありません( ー`дー´)キリッ
2018/08/30(木) 02:11:48.32ID:0LlXI/R20
Effective Modern C++は読んどいたほうがいいけど入門書じゃねえな
うーん
49デフォルトの名無しさん (ワッチョイ 05fb-PgRe)
垢版 |
2018/08/30(木) 02:18:12.89ID:VcrE/h+O0
>>43
全く問題ない。
規格にもしっかり書いてある。
2018/08/30(木) 05:39:20.37ID:zs5ycFHj0
>>49
どこに?
2018/08/30(木) 07:30:44.91ID:3T0jr2180
>>46
あるわけいだろ
C++は入門言語じゃない
2018/08/30(木) 07:40:22.80ID:zs5ycFHj0
>>46
このへん

ISBN-10: 4797394633
日本人の著者では柴田氏の作風が俺的にはお奨め
入門だからって抜いちゃいかんことを押さえてる

ISBN-10: 4798119598
C++といえばこの人
出版が2011年とやや古めだが
プログラミングの地頭を鍛えてくれる
2018/08/30(木) 08:03:54.88ID:ff0XXJ3a0
そもそも、何も知らない初心者がなんで「2016年以降」とか限定するんだ?
何か根拠があるわけでもないだろう。
2018/08/30(木) 08:35:46.61ID:GbaSH31o0
古い本だと古い規格で説明されてるから、初心者には良くないって点はあるね。
#include <cstdio.h> みたいな中途半端な古さは特にやっかい。

『プログラミング言語C++』第4版を読んどきゃええじゃろ、と思ったけど
初版が2015年3月だから「古い本」だな。
55デフォルトの名無しさん (ブーイモ MMab-U3HC)
垢版 |
2018/08/30(木) 09:34:44.57ID:CAfiYqURM
2016年に何かあったの?
2018/08/30(木) 10:11:29.31ID:zs5ycFHj0
> #include <cstdio.h>

こんな時代あったか?
2018/08/30(木) 10:17:39.13ID:ABjDmLki0
ときどきCがわかってない日本人が入門書書いてたりして余計路頭に迷わせたりする
2018/08/30(木) 10:25:15.01ID:Usgn3Z4yr
>>48
effective 「modern」 c++ って良いの?
ただの effective は良いってほぼ全員認めてるが、more とか modern はあまり勧められないしどうでも良い本なのかと思ってた
2018/08/30(木) 10:56:25.83ID:6+1XpMNpM
math.hとcmathってどっちがいいの?
そもそもcmathインクルードしてもM_PI使えんしよく分からない
2018/08/30(木) 10:58:18.11ID:OpvYfh8NM
>>58
effectiveならいいっていう老害なんだろ
2018/08/30(木) 11:01:43.96ID:OpvYfh8NM
>>52
柴田の本は辞めとけ
初心者には無理
あれは大学の講義でかわされるやつ
2018/08/30(木) 11:49:16.45ID:zs5ycFHj0
>>61
初心者つーかオマエだろ?
大学の授業についていけない二回転5

難癖ばっかりつけてないで
幼児用のC++の本を出してみな
2018/08/30(木) 12:34:40.85ID:8c0RjkhV0
>>59
cmath を使うべき。
C のヘッダは互換性のために残されているだけで、積極的に使うようなものではない。

M_PI は C の規格にも C++ の規格にもないマイクロソフト独自の拡張だから、
マイクロソフトがどういう気持ちで用意しているのかは知らないけど、
_USE_MATH_DEFINES マクロを #define しておけば Visual Studio では有効になるらしいぞ。

https://msdn.microsoft.com/ja-jp/library/4hwaceh6.aspx
2018/08/30(木) 12:46:26.01ID:zs5ycFHj0
C++17でcmathが大幅強化されたね
ISO/IEC29124の特殊関数を取り入れた
2018/08/30(木) 12:52:55.39ID:5ZKhK1u9d
>>58
modernはC++11以降を使うなら必読だぞ
むしろ素effectiveやmoreの方が古くてあんまり役に立たなくなってる
2018/08/30(木) 13:14:44.70ID:ypFQk8hw0
>>63
gccの独自拡張じゃねえの
むしろMSはそれに合わせてる

長いものには巻かれろ、ってヤツだ
長い方はMSじゃなくgcc
2018/08/30(木) 13:37:08.32ID:ZM/Yh9noM
柴田の本は昔から悪書扱いされてる
あえて読むことはないと思うわ
2018/08/30(木) 13:37:55.22ID:zs5ycFHj0
だから読んでないわけか
2018/08/30(木) 13:58:51.87ID:ZM/Yh9noM
昔は読んでたよ
20年以上前かな
いまでもjavaやc++のやつは図書館でたまにペラペラしてみるけど
読みづらくて全然合わないと感じる


同じジャンルで山田祥寛の本があったらそっちを読む
2018/08/30(木) 14:09:38.78ID:zs5ycFHj0
つまり読んでないってことだろ

図書館でペラペラってなぜそんなことをするんだ
C++を20年以上やってるんだろ
2018/08/30(木) 14:38:25.23ID:A7u5khVs0
人にC++言語について教える時に、人口に膾炙した書籍の表現を使うのが無難だからでしょ。
2018/08/30(木) 15:34:47.96ID:GbaSH31o0
>>56 すまん <cstdio.h> は変ね。<stdio.h> と <cstdio> が混ざってしまった。
<cstdio.h> というヘッダが存在する処理系もあるか知れんけど、
#include で使えと教えてる本はないだろうな。

主旨は「半端に古い本だと」で変わらないけど、良い例が出せんわ。
2018/08/30(木) 15:49:06.15ID:zs5ycFHj0
>>72
それを言うなら
<stream.h> //cfront 1.0
<iostream.h> //ARM
<iostream> //C++98
じゃね?
2018/08/30(木) 16:04:11.38ID:pLYrs11p0
質問なんだがコンパイル時間の観点から見て、ヘッダをインクルードするときは必要でない限りcppファイルでincludeするべき?
2018/08/30(木) 16:13:39.13ID:zs5ycFHj0
#includeのネストを避けろということか?
そう主張する連中もいるが、俺は反対
2018/08/30(木) 16:18:52.75ID:8c0RjkhV0
>>74
ちょっと質問の意図がよくわかんないんだけど、逆に言えば
「ヘッダファイル (*.h) が他のヘッダファイルを include するのはコンパイル時間を増大させるか?」という意味?

あんまり関係ないよ。
よっぽど大きいプロジェクト (gcc とか) ならちょっとしたことで結構な差が出ることは無いとは言えないけど、
それでもプリコンパイルヘッダとかを活用すればだいぶん時間は短縮できるし、
更に高速化したいならキャッシュサーバを使うコンパイラもある。

https://github.com/yrnkrn/zapcc

・ 小さいプロジェクトでは気になるほどの差はない
・ 大きいプロジェクトではツールで解決しよう
2018/08/30(木) 16:23:45.00ID:zs5ycFHj0
コンパイラは可能な限り高性能なマシンで使うべし
2018/08/30(木) 16:52:55.72ID:pLYrs11p0
例えばstd::stringをhoge.hでは使わずhoge.cppのみで使われている場合
hoge.hで#include<string>と書くと、他のファイルからhoge.hをincludeしたとき無駄が出るはず
だからhoge.cppで#include<string>と書いた方がいいのが、それとも些細な差なので全部hoge.hにぶち込んでもいいのかということ
79デフォルトの名無しさん (ワッチョイ e3c3-tpL7)
垢版 |
2018/08/30(木) 16:55:06.24ID:zs5ycFHj0
なるほど、実装で使うだけで宣言にはいらないものか
だったらhoge.cppで#includeしたほうがいいね
80デフォルトの名無しさん (ワッチョイ fd61-XEe6)
垢版 |
2018/08/30(木) 17:19:10.16ID:X06N8JK80
http://www.geekpage.jp/programming/linux-network/select.php

なんかソケットごとに違うポートを割り振るものだと思ってたのですが、

listen(srcSocket, 1);//第二引数はクライアント上限数

この第2因数をいじったら同じポートでも普通に接続できました。
このまま気にせずselect処理書いていっても大丈夫ですかね...?
通信関係あまり知らないのでバグったりするとどうなるか分からずちょっと怖いです。

相手用のソケットは
int dstsocket[5]の様な感じで作って中身は全部一緒です
2018/08/30(木) 17:49:39.07ID:8c0RjkhV0
>>78
その場合だと .cpp に書いた方が当然良い。
2018/08/30(木) 18:56:44.69ID:aIx07XQj0
プリコンパイル済みヘッダを、いちいち書かなきゃいけなくなるのがあれだから使わない方がいいと言われたことがある
なぜそれでコンパイルが遅いって文句言ってるのか分からない・・・
2018/08/30(木) 21:34:38.22ID:A5r5+/4B0
https://ezoeryou.github.io/cpp17book/
辞書にするならこれ。役に立ったら書籍版買ってあげよう。
84デフォルトの名無しさん (ワッチョイ 0580-rkYf)
垢版 |
2018/08/30(木) 22:17:19.27ID:/0YXnEsV0
書いても大丈夫だが、そういうやりかたにするならselectでブロックしないように注意したほうがいい
selectをブロックしたままの状態にすると、当然、そのあと永遠にacceptされない
きっとスレッドにしたほうが簡単
2018/08/30(木) 23:08:40.56ID:yw5JoOBN0
>>78
hoge.hでstd::stringを使ってないのに#include<string>を書く、という発想が理解できない
#include<string>はstd::stringを使ってるところに書く、使ってないところには書かない、でいいじゃん

変更があって使わなくなったのに#includeは残ってるのがありがちで嫌なところ
静的解析とかで指摘して欲しい
2018/08/30(木) 23:48:27.87ID:Eu7R++g90
>>80 ひきすう
2018/08/31(金) 14:08:47.35ID:KIctO/Rq0
>>80
変な心配せずに書いて覚えた方が早いよ
あと最初TCPって言ってたよね?
もしTCPで通信ごとにポート変えなきゃいけないなら、Yahoo見に行く時毎回ポート変えてんの?
HTTPは80番って決まってるやろ?
あと何のためにその第二引数があるの?
2018/08/31(金) 19:45:34.91ID:3sSjwoo80
恥ずかしながら char と signed char が違うものだって知りませんでした…(独り言)
2018/08/31(金) 19:48:20.37ID:+YiNyVyB0
処理系による
2018/08/31(金) 19:53:07.91ID:saaKamBG0
>>88
signed char とか unsigned char とか明言されず、ただ char としか書いていない場合、
その char が signed char になるのか、それとも unsigned char なのかは
「処理系依存」・コンパイラ依存だった、という経緯が C の時代からあったのでした

「signed char でも unsigned char でもない『「alternative な char』がある」
という意味ではないのです
"alternative char"…なんかだ魅惑される響きだと感じ入ってしまうのは、私だけですか…
2018/08/31(金) 20:24:19.94ID:NWzNDPzW0
>>90
char は signed char でも unsigned char でもないです。
C でも C++ でも。
2018/08/31(金) 20:30:14.89ID:LcHwdHfr0

charとsigned charとunsigned charは全部別の型だろ。
2018/08/31(金) 20:39:51.15ID:NWzNDPzW0
char は (型システム的には) signed char でも unsigned char でもないけど、
符号付きか符号なしのどちらかではあり、
その表現は処理系によって signed char か unsigned char のどちらかと実質的に等しいことになってる。

だいたいは暗黙の型変換が自然にうまいことやってくれるんだけど、
C++ だとオーバーロードの解決にかかわるところとかややこしいな。
2018/08/31(金) 20:40:27.43ID:fKtAGZM00
std::byteとかいうゴミはどう使えばいいんだ?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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