C++相談室 part131 [無断転載禁止]©2ch.net
レス数が950を超えています。1000を超えると書き込みができなくなります。
次スレを立てる時は本文の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 最近WindowsのほうでVSを入れまして、簡単なSTGを作って遊んでいるのですが、MacOSでもC++でSTGを作ることはできるのでしょうか?
Windowsでは、DxlibといったSTG制作に特化したライブラリがありますが、MacOSではどうなのでしょうか…?実際にMacでSTG制作の経験がある方、挫折した方の話をお聞かせください。よろしくお願いします。 >>864
何かおかしなことを言っていたらすみません。
STG制作入門のホームページでそのようなことが書かれていたので、そう認識していた次第です。 それはDirectXの薄いラッパなので何に特化しているとかはない
マルチプラットフォームで作りたいならOpenGLで作れ OpenGLか…
難しそうだしまだ取っ付くべきじゃないような気がするんだけどそんなことはない? >>845
それぞれアクセス関数が用意されているので馬鹿なことはやめなさい >>862
黙れよキチガイ
theApp()はtheAppかthisの間違いだがそれは別にして
メソッドgetMenberA()を有するクラスから始まって、
メソッドgetValue()を有するクラスFooまでの全てのクラス
が完璧にカプセル化された設計の元で
theAppから配下のFooのメンバにアクセスするアクセッサは実質的に>>862な状況を呈する
これはもう完璧なカプセル化を諦めて途中までグローバル変数にする(挿し木設計)か
インライン展開による最適化を期待するぐらいしか手が無い まあ神の視座に立てば完璧な抽象化を徹底してそんな深いアクセッサをいらなくすれば良いのだが
そんなことが最初からできるなら苦労は無い、 > カプセル化を諦めて途中までグローバル変数
ヘボ野郎 二次元配列の中身を1命令で一気に出力する方法はないでしょうか
いちいち2重ループかくのめんどくさいです >>874
Cでの方法を教えていただけると嬉しいです すいませんIDかわりました
>>875は>>873です 俺も暇なヤツだな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);
} #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);
} 暇じゃないので横着しました
int* it = (int*) mat;
for_each(it, it + ROW * COL, [](int i){cout << i << " ";}); linuxの質問です
・koファイルからコマンドライン実行で実行ファイルを実行したい
どうやって実現するか調べてもわからなくてやり方教えて欲しいです
A --B みたいな呼び出しかたをしたい
・複数スレッドを立てているBプロセスを
全スレッドsleepにすることできる? >>880
親プロセスをスリープにできるだけでも問題ないです system, execl, execlp, execle, execv, execvp, execvpe, spawn, popen, fork >>880 上半分だけ
.ko ってデバイスドライバとかのローダブルモジュールじゃないかな。
動作中のカーネルにinsmodで組み込まなきゃ使えないと思うんだけど。 すまん、質問の意図を取り違えたかも。
カーネルモジュールの中から外部コマンドを呼びたいって話かな。
可能かも知れん、と言うかカーネルがコマンドを実行するのと同じ手順のはずだが、
具体的な方法はさっぱり分からん。役に立たなくて申し訳ない。 >>884
とても欲しいです...
>>886
カーネルオブジェクトから外部コマンド(実行ファイル)をコマンド形式で呼び出したいって意味ですね >>882に書かれている関数のそれぞれの機能を比較し、該当する関数のソース(in Linux kernel)を読んでみては? >>889
今解説読んでいてsleep関連が終わったとこ
exec関連多すぎて大変 >>880
ちょいと検索したところ call_usermodehelper て関数があるみたい。 >>891
今調べたら出てきました!
自分が望んだことできそうですありがとうございます ("a,b,c")とは、a,b,cの合計を表すのでしょうか?
それとも、a,b,c各それぞれを表すのでしょうか? ここの住人はソースコードをコメントで装飾するのに、どういう書き方をしていますか?
参考にさせて下さい 「ptr->member」は、「(*ptr).member」と同じ意味。 本を読んでも
structやunionが具体的に、どの様に動作してるのか分かりません。 基本の基本なので、
先ずは、小さなサンプル作って、実際に動かしてデバッガで追ってみる。
その上で、判らない事を質問すべき。 質問です
以下のコードがコンパイルに通りません
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だとだめなんでしょうか エラーになる理由を教えて下さい >>900
こりゃ -> の誤植だな。
印刷屋さんがC知らなくて矢印記号と思ったんだな。
コード部分は執筆者が念を入れてチェックしなきゃね。 >>906
エラーメッセージに書いてあるだろ
structure->type = "HogeHoge"; の代入先がオブジェクトじゃねえぜと
おまえさんはvoid = char const*;をやろうとしたんだよ あ、すまんちょいミスった
指摘できるやついる?解説頼むわ >>906
unique_ptrあんまりしらんから想像で書くけど
そいつがデストラクタまで管理したいからvoidじゃなくてちゃんと型渡せってことじゃね >>906
> エラーになる理由を教えて下さい
void 型の変数なんてないから
そもそも何をしたいんだよ... unique_ptr<void>という型なので、
中にtypeというメンバーがあることがコンパイラからはわからない。
static_cast<Structure*>(structure.get())->type = "HogeHoge";
のように明示すればコンパイルだけは通るかと思ったんだが、
こっちだと>>911の問題に引っかかって、その前の行でエラーになる。 >>913の最後の行は勘違いだった。
こちらの環境だと、unique_ptr<void>の時点でエラーになる。 unique_ptr<void *> だとどうなる? >>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));
なら通った。 void型なんて定義もなければサイズもないから
素で使うがそもそもNG >>907
anyは知りませんでした
stdじゃなくてboostにあるんですね つかってみます
>>909
つまり void*->type は void.type になるってことですね
voidポインタは使ったことなくて、あれから調べたのですが
アクセスする前にキャストが必要だと知りました・・
無知ゆえの初歩的なミスです 指摘ありがとうございます
>>911, >>913, >>916
スマートポインタなのでデストラクタを呼び出せるようにしないといけないんですね
カスタムデリータは知りませんでした コード参考になります
void型なのはStructureの他にもプリミティブ型とかも入れたかったからです
boost::any使うやり方とカスタムデリータ渡すやり方両方やってみます
皆さんレスありがとうございました ひとつのカスタムデリータでいろんな型をdeleteするってなら無理 いまだにforkとthreadの動作の違いがわからない ある配列がありそれを指定した順番で並び替えしたい
std::vector< any_struct_t > array; //これを並び替えたい
std::vector< unsigned int > index_list = { 3,8,6,0,2...}; //この順番にしたい
探しているんだけど適当なライブラリが見つからない
標準ライブラリに入ってたりする?
またはアルゴリズムが知りたい
出来ればswap回数が少ない方法が知りたい 配列もう一個用意してその添え字に移動するんじゃだめなん std::vector<any_struct_t> ret(index_list);
std::transform(index_list.cbegin(), index_list.cend(), ret.begin(), [&array](auto i){ return array[i]; }); >>924
それタイプミスあります?
でももう一つ配列を用意してコピーする点では
他の方と一緒ですね
別配列を用意せず全てswapで済ます方法も作ってみましたが
これにはindex_listが更に2本必要になり
効率は別配列と変わらないと予想される結果でした
参考になりました
ありがとうございました >>925
別領域を全く使わずin-placeでかつ汎用性のあるやり方ってすごく難しそう。
でも不可能性の証明も難しそうなんだよな。 index_list に含まれる値がそれぞれ重複なく1回だけ出現とか、
いかにも破られそうな条件を暗黙に期待するライブラリ、
てのも変な感じだしねぇ。 >>927
「別領域を全く使わず」を見落としてたすまぬ 「別領域を全く使わず」とはいっても、テンポラリの変数を1個とか2個の固定数だけ使うのは除く。 屁理屈を言うと、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 ) );
} おっと、index_list.begin()+i+1の「+1」は消してくれ この話をきっかけに、std::next_permutation の仕様を見てみたが、どういう時に使うのかよくわからない。 お前ら、プログラム書くとき、普通にnoexceptを何回も書いてるの? >>936
permutation を実装するときに決まってんだろ? >>938
今までthrow()と書いてた場所には書いてるよ
むしろ、書いてないの? >>918
any は C++17 で標準に入ったよ。 規格と規格じゃないものの区別も付かない低能はすっこんでて >>908
ありがとうございます。
いくら検索しても出て来ないので、困ってました。 >>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;
} 後出しのようで心苦しいけどindex_listを壊すのはダメだと思う。
const参照で渡すインタフェースにできないという意味で汎用性条件を満たしていない。 >>947
以下の2つの理由により、外側のループがn回まわる間に
内側のループの中身はたかだかn回しか実行されない。
1. 内側のループ内で処理済みのインデックスjに対し index_list[j]=j が実行される。
2. index_list[i]==i の条件が最初から満たされていた場合、内側のループは実行されない
要するに、内側のループを実行済みかのフラグとしてindex_listを使ってるだけ。
>>948
index_listを壊している時点で屁理屈なのは自覚しているんで、仕方ない。
一応、別配列にムーブする場合と比べると、
最初から正しい位置にある要素への処理が不要になるというメリットは有る。 >>928, >>948
ライブラリに対するオレオレ定義をいちいち開陳しなくていいよ、チラ裏にでも書いとけ 駄目な理由が引数を壊すってことだけなら、引数を値渡しにしてやれば、
呼び出し時に勝手にコピーされるので問題ないはず。
壊していい引数を渡す時はstd::move()すればいいし。 引数がconst参照=引数の状態を変更しない(てか、できない)という意思表示
に対して
引数が右辺値参照=引数の状態を変更する(しても文句言うな)という意思表示
というのはアリ?
右辺値参照に対する理解が曖昧なんで漠然とよく分からない(何が分かって
ないかも分からないw)んだが、もっと別な意思表示方法もある? ほ〜ん>>946の奴はちゃんと動いたわ;
ttps://ideone.com/6lwMOn >>946の奴は要素[i]が内側のwhile()ループからは1回以上アクセスされないから確かにO(N)な気配、 右辺値参照というのは、関数f()へのT型データの値渡し時に暗黙のうちに行われる(C++03までは無条件に行われていた)
(左辺値) = (右辺値)
という代入処理において、
当該代入処理後、右辺値が関数呼び出し元によって使われなくなることが明白なとき、
左辺値へのコピー後、右辺値をデストラクトする
という処理に暗黙のうちになっていたものを、
右辺値から左辺値への移動
と「も」書けるようにするためのしくみ
Tに効率の良いムーブコンストラクタ(か右辺値参照を引数とする代入演算子)を定義しないとメリットが生じない
ポインタに__restrictを付けるべきかどうか悩まねばならないレベルの人用
C++03でもコンストラ・デストラ呼び出し回数削減の最適化がかかって同じような効果になるケースが多々あるから
そういうのが信用できない神経質な人向け
※ 個人の感想です >>957
右辺値参照には一時オブジェクトしか代入できない縛りがあるから_
関数fooを
voiid foo(int&& x)
というバージョンしか定義していないとすると、
int g_x = 10;
foo(g_x);
がビルドが通らないのではないか;
一般的な使用を想定すれば、結局foo(const int& x)も定義必要
C++03までしか使ったこと無いから知らんけど;; >>958
その場合はfoo(int(g_x));が通るから、必須ではないよ
コピーを外側で明示的にやらせることで、こっちのほうが責任が明確になるので好きという人もいる オブジェクトのコピーとかムーブのためにここまで言語仕様を複雑にしないといけないのか。おれにはさっぱり理解不能だわ。 レス数が950を超えています。1000を超えると書き込みができなくなります。