C++相談室 part131 [無断転載禁止]©2ch.net

レス数が950を超えています。1000を超えると書き込みができなくなります。
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
2017/10/01(日) 19:51:59.11ID:P+J8m3XL0
悩む理由がよく分からないが。適当な管理クラス作ればいいだけでは。
2017/10/01(日) 19:54:30.69ID:+enXMbbO0
>>849
寿命の長いオブジェクトをどうやって保持し続けるかがテーマなので、
「a というデータはクラスBのオブジェクトbに持たせればいい」では
じゃあそのbはどこにどうやって保持し続けるのかという無限後退に陥る。

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

一長一短あるのでそれ以外に何かないかなという話
2017/10/01(日) 20:03:44.13ID:P+J8m3XL0
別に永続化、シリアライズの話までしてないわけでしょ。
mainかグローバルの2択で推奨はmain、どのスコープからも見えてアクセスしたいならグローバルもありで終わりでしょ。
2017/10/01(日) 20:06:34.68ID:+enXMbbO0
>>853
あなたの意見は>>833以降ずっと一貫しているからいいですよ。

>>823の意見がわかるようでわかりにくい
2017/10/01(日) 20:15:10.00ID:P+J8m3XL0
MFC? H社のソフトのことかな?
2017/10/01(日) 22:22:01.91ID:SWvA/SVx0
>>846
>>もちろん参照元からは参照先の実態があることが保障されないのでよくある
ソースコードで意図的にdeleteとか、アドレス移動する命令をいれてなくても起こるんですか?
(ガベージコレクションみたいなことが)
2017/10/01(日) 22:50:35.76ID:LFbo+6zld
>>829
無知を謝る必要はない

マルチコアのDSPをOSレスで使うとか
2017/10/01(日) 22:54:38.73ID:LFbo+6zld
>>826
パラメータで渡すべき情報と
そうじゃない情報と
がある
2017/10/01(日) 23:00:12.89ID:LFbo+6zld
>>852
スタティックメモリ(グローバル変数など)
auto変数(スタックやレジスタなど)
OSやAPI側の保存領域(APIを用いた設定など)
ファイルなど
2017/10/01(日) 23:08:17.57ID:A+1idbvt0
>>856
起こるわけないが
2017/10/01(日) 23:28:49.53ID:LFbo+6zld
意図的じゃないdelete
862デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/02(月) 15:27:40.28ID:jSh1mr/v0
> プログラムのあらゆる箇所で
>  theApp()->getMemberA()->getMemberAA()->getMemberAAA()->...->getMemberZZ()->getValue()
> と書かねばならなかった

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

ヘボ野郎
2017/10/03(火) 15:26:50.04ID:tYdASm94H
二次元配列の中身を1命令で一気に出力する方法はないでしょうか
いちいち2重ループかくのめんどくさいです
874デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/03(火) 16:01:22.87ID:ZkSEHHAS0
CならあるがC++では一般的な方法はない
875デフォルトの名無しさん (ワンミングク MMa3-IV3n)
垢版 |
2017/10/03(火) 16:16:18.00ID:vTZ8MAnuM
>>874
Cでの方法を教えていただけると嬉しいです
876デフォルトの名無しさん (ワンミングク MMa3-IV3n)
垢版 |
2017/10/03(火) 16:16:57.77ID:vTZ8MAnuM
すいませんIDかわりました
>>875>>873です
877デフォルトの名無しさん (ワッチョイ 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);
}
878デフォルトの名無しさん (ワッチョイ 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);
}
2017/10/03(火) 16:54:32.30ID:hqWXgVBV0
暇じゃないので横着しました
int* it = (int*) mat;
for_each(it, it + ROW * COL, [](int i){cout << i << " ";});
2017/10/04(水) 18:26:58.85ID:O2xwfga8d
linuxの質問です
・koファイルからコマンドライン実行で実行ファイルを実行したい
どうやって実現するか調べてもわからなくてやり方教えて欲しいです
A --B みたいな呼び出しかたをしたい
・複数スレッドを立てているBプロセスを
全スレッドsleepにすることできる?
2017/10/04(水) 18:34:16.19ID:O2xwfga8d
>>880
親プロセスをスリープにできるだけでも問題ないです
2017/10/04(水) 18:45:43.87ID:HMkkIXOid
system, execl, execlp, execle, execv, execvp, execvpe, spawn, popen, fork
2017/10/04(水) 18:47:36.46ID:HMkkIXOid
sleep, usleep, nanosleep
2017/10/04(水) 19:21:33.45ID:HMkkIXOid
解説が必要ですか?
はい/いいえ
2017/10/04(水) 19:29:13.24ID:N0mfbhbs0
>>880 上半分だけ
.ko ってデバイスドライバとかのローダブルモジュールじゃないかな。
動作中のカーネルにinsmodで組み込まなきゃ使えないと思うんだけど。
2017/10/04(水) 19:36:09.54ID:N0mfbhbs0
すまん、質問の意図を取り違えたかも。

カーネルモジュールの中から外部コマンドを呼びたいって話かな。
可能かも知れん、と言うかカーネルがコマンドを実行するのと同じ手順のはずだが、
具体的な方法はさっぱり分からん。役に立たなくて申し訳ない。
2017/10/04(水) 22:05:29.41ID:O2xwfga8d
>>884
とても欲しいです...

>>886
カーネルオブジェクトから外部コマンド(実行ファイル)をコマンド形式で呼び出したいって意味ですね
2017/10/04(水) 22:07:13.92ID:UdMKuk5G0
ハッカーですね。
2017/10/04(水) 22:16:13.63ID:HMkkIXOid
>>882に書かれている関数のそれぞれの機能を比較し、該当する関数のソース(in Linux kernel)を読んでみては?
2017/10/04(水) 22:19:51.52ID:O2xwfga8d
>>889
今解説読んでいてsleep関連が終わったとこ
exec関連多すぎて大変
2017/10/05(木) 07:00:51.51ID:AZey7Nzq0
>>880
ちょいと検索したところ call_usermodehelper て関数があるみたい。
2017/10/05(木) 21:41:51.13ID:/Agpj2+3d
>>891
今調べたら出てきました!
自分が望んだことできそうですありがとうございます
893デフォルトの名無しさん (ワッチョイ eef2-qWqy)
垢版 |
2017/10/06(金) 09:41:37.58ID:aNGBh62I0
("a,b,c")とは、a,b,cの合計を表すのでしょうか?
それとも、a,b,c各それぞれを表すのでしょうか?
2017/10/06(金) 10:15:40.40ID:tNPv5Oyi0
ここの住人はソースコードをコメントで装飾するのに、どういう書き方をしていますか?
参考にさせて下さい
895デフォルトの名無しさん (スプッッ Sdda-Qn8V)
垢版 |
2017/10/06(金) 10:26:06.63ID:8EN3J+m8d
doxygen方式
2017/10/06(金) 11:28:24.20ID:u49AV52wd
>>893
ただのC文字列。
2017/10/06(金) 14:25:11.99ID:aNGBh62I0
>>896
ありがとうございました。
2017/10/06(金) 19:52:03.20ID:sTEh17J80
C++リテラル文字列だろ
2017/10/06(金) 19:54:12.06ID:sTEh17J80
いや、やっぱただの文字列か
900デフォルトの名無しさん (ワッチョイ 76b3-yS8h)
垢版 |
2017/10/06(金) 21:08:44.42ID:vfMxTM1h0
→ の意味教えて下さい。
2017/10/06(金) 21:15:27.43ID:fyJ+AUec0
そんなものありません。
2017/10/06(金) 21:46:37.43ID:u49AV52wd
「ptr->member」は、「(*ptr).member」と同じ意味。
2017/10/06(金) 23:48:23.51ID:vfMxTM1h0
参考書の一部です
http://fast-uploader.com/file/7062856811993/

どう言う意味なのでしょうか?
2017/10/06(金) 23:52:15.96ID:vfMxTM1h0
本を読んでも
 structやunionが具体的に、どの様に動作してるのか分かりません。
2017/10/06(金) 23:58:13.70ID:yrQN1jb/0
基本の基本なので、
先ずは、小さなサンプル作って、実際に動かしてデバッガで追ってみる。
その上で、判らない事を質問すべき。
906デフォルトの名無しさん (ワッチョイ 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だとだめなんでしょうか エラーになる理由を教えて下さい
2017/10/07(土) 01:49:12.44ID:IjrnmnS30
>>906
anyつかえ。
2017/10/07(土) 05:28:19.29ID:9j2tI+ab0
>>900
こりゃ -> の誤植だな。
印刷屋さんがC知らなくて矢印記号と思ったんだな。
コード部分は執筆者が念を入れてチェックしなきゃね。
909デフォルトの名無しさん (ワッチョイ b632-rzHd)
垢版 |
2017/10/07(土) 08:30:30.38ID:r58+Koxz0
>>906
エラーメッセージに書いてあるだろ
structure->type = "HogeHoge"; の代入先がオブジェクトじゃねえぜと
おまえさんはvoid = char const*;をやろうとしたんだよ
910デフォルトの名無しさん (ワッチョイ b632-rzHd)
垢版 |
2017/10/07(土) 08:31:55.56ID:r58+Koxz0
あ、すまんちょいミスった
指摘できるやついる?解説頼むわ
2017/10/07(土) 08:41:11.20ID:eyY86HOM0
>>906
unique_ptrあんまりしらんから想像で書くけど
そいつがデストラクタまで管理したいからvoidじゃなくてちゃんと型渡せってことじゃね
2017/10/07(土) 09:00:22.02ID:y2Dkbadu0
>>906
> エラーになる理由を教えて下さい
void 型の変数なんてないから
そもそも何をしたいんだよ...
2017/10/07(土) 09:03:55.62ID:7nonADk70
unique_ptr<void>という型なので、
中にtypeというメンバーがあることがコンパイラからはわからない。

static_cast<Structure*>(structure.get())->type = "HogeHoge";
のように明示すればコンパイルだけは通るかと思ったんだが、
こっちだと>>911の問題に引っかかって、その前の行でエラーになる。
2017/10/07(土) 09:27:45.88ID:7nonADk70
>>913の最後の行は勘違いだった。
こちらの環境だと、unique_ptr<void>の時点でエラーになる。
2017/10/07(土) 11:35:23.13ID:NngrEkye0
unique_ptr<void *> だとどうなる?
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));

なら通った。
2017/10/07(土) 12:19:56.83ID:jvf7kHO4M
void型なんて定義もなければサイズもないから
素で使うがそもそもNG
918デフォルトの名無しさん (ワッチョイ 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使うやり方とカスタムデリータ渡すやり方両方やってみます
皆さんレスありがとうございました
2017/10/07(土) 13:41:40.48ID:j+yonEy7d
ひとつのカスタムデリータでいろんな型をdeleteするってなら無理
2017/10/07(土) 14:16:25.95ID:LB5EP+Z/0
いまだにforkとthreadの動作の違いがわからない
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回数が少ない方法が知りたい
922デフォルトの名無しさん (ササクッテロリ Sp75-o/K3)
垢版 |
2017/10/07(土) 15:34:33.81ID:cqowZFEsp
配列もう一個用意してその添え字に移動するんじゃだめなん
2017/10/07(土) 16:00:10.47ID:ZvmF6v7F0
>>922
それが一番速そうだよね
2017/10/07(土) 16:14:50.00ID:Mcd7mBScM
std::vector<any_struct_t> ret(index_list);
std::transform(index_list.cbegin(), index_list.cend(), ret.begin(), [&array](auto i){ return array[i]; });
2017/10/07(土) 16:25:34.07ID:jvf7kHO4M
>>924
それタイプミスあります?
でももう一つ配列を用意してコピーする点では
他の方と一緒ですね

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

参考になりました
ありがとうございました
2017/10/07(土) 16:38:58.22ID:Mcd7mBScM
一行目初期化はsizeだった
すまん
2017/10/07(土) 16:55:14.57ID:rHfSD+zL0
>>925
別領域を全く使わずin-placeでかつ汎用性のあるやり方ってすごく難しそう。
でも不可能性の証明も難しそうなんだよな。
2017/10/07(土) 17:23:03.40ID:9j2tI+ab0
index_list に含まれる値がそれぞれ重複なく1回だけ出現とか、
いかにも破られそうな条件を暗黙に期待するライブラリ、
てのも変な感じだしねぇ。
2017/10/07(土) 17:39:38.90ID:7nonADk70
任意の置換は互換の積で表せるので、swap繰り返せばin-placeで可能。
http://rikei-index.blue.coocan.jp/senkei/teigi4senkei.html
2017/10/07(土) 17:47:14.55ID:IjrnmnS30
>>906
https://ideone.com/j7lHlZ
こういうことでしょ?
2017/10/07(土) 18:00:13.73ID:rHfSD+zL0
>>929
まだやってない場所どこだっけ?
2017/10/07(土) 18:14:41.26ID:7nonADk70
>>927
「別領域を全く使わず」を見落としてたすまぬ
2017/10/07(土) 18:35:30.53ID:rHfSD+zL0
「別領域を全く使わず」とはいっても、テンポラリの変数を1個とか2個の固定数だけ使うのは除く。
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 ) );
}
2017/10/07(土) 19:26:56.50ID:7nonADk70
おっと、index_list.begin()+i+1の「+1」は消してくれ
2017/10/07(土) 19:44:23.58ID:rHfSD+zL0
この話をきっかけに、std::next_permutation の仕様を見てみたが、どういう時に使うのかよくわからない。
2017/10/07(土) 20:14:16.81ID:jvf7kHO4M
流石にO(n)は維持しないと
厳しいと思います
2017/10/07(土) 20:23:01.47ID:vDiuGwTad
お前ら、プログラム書くとき、普通にnoexceptを何回も書いてるの?
2017/10/07(土) 20:25:42.72ID:vDiuGwTad
>>936
permutation を実装するときに決まってんだろ?
2017/10/07(土) 20:53:48.18ID:Mcd7mBScM
>>938
今までthrow()と書いてた場所には書いてるよ
むしろ、書いてないの?
2017/10/07(土) 21:02:34.40ID:vDiuGwTad
>>940
コンパイラーのバカ。
2017/10/07(土) 21:05:19.53ID:JUuMz14c0
>>918
any は C++17 で標準に入ったよ。
2017/10/07(土) 21:13:10.52ID:x4ka+ayCr
規格と規格じゃないものの区別も付かない低能はすっこんでて
2017/10/07(土) 21:13:19.89ID:m/msdGTM0
>>908
ありがとうございます。

いくら検索しても出て来ないので、困ってました。
2017/10/07(土) 21:17:07.24ID:rHfSD+zL0
>>939
わからんがな
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;
}
2017/10/08(日) 00:16:09.42ID:FGX6bPrh0
>>946
二重ループなのにO(n)なの?
2017/10/08(日) 00:28:37.42ID:wi1g/BWB0
後出しのようで心苦しいけどindex_listを壊すのはダメだと思う。
const参照で渡すインタフェースにできないという意味で汎用性条件を満たしていない。
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を壊している時点で屁理屈なのは自覚しているんで、仕方ない。
一応、別配列にムーブする場合と比べると、
最初から正しい位置にある要素への処理が不要になるというメリットは有る。
2017/10/08(日) 11:20:44.83ID:HosRocIl0
>>928, >>948
ライブラリに対するオレオレ定義をいちいち開陳しなくていいよ、チラ裏にでも書いとけ
2017/10/08(日) 11:34:33.36ID:+SudLjvR0
駄目な理由が引数を壊すってことだけなら、引数を値渡しにしてやれば、
呼び出し時に勝手にコピーされるので問題ないはず。
壊していい引数を渡す時はstd::move()すればいいし。
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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