C++相談室 part137

レス数が1000を超えています。これ以上書き込みはできません。
2018/07/14(土) 17:53:02.14ID:FOAGvAbs
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

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

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

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

■長いソースを貼るときはここへ。■
 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
2018/08/20(月) 18:47:45.43ID:VU5jvdn2
>>901
昔から使われている原始的といってよいビルドツールです
makefile に依存関係を書いておいて、コマンドラインで「 make -j」と起動すると、記述した依存関係にしたがってコンパイル・リンクが行われます
2018/08/20(月) 18:59:55.06ID:ftO9aq8g
Linuxなんかで配布されたソースから実行ファイルを作成したいって時にお世話になります
2018/08/20(月) 20:29:15.33ID:MlhHAxXO
>>904
この本を読めばコンパイルについても分かるの?
2018/08/20(月) 20:46:46.88ID:VU5jvdn2
>>906
>>900 は make を C で記述するものであり、コンパイル自体について記述するものではありません
2018/08/20(月) 23:46:22.40ID:qkN29+U3
クラス生成に挫折したのかな?w
2018/08/21(火) 00:03:12.90ID:Y1eCmHG/
C++自体の本はたくさんあるのにビルドやプロジェクト構成について解説した本って全くないよな
コピペで受け継いできた秘伝のMakefileやconfigureが蔓延してるのなんとかしてくれ
売れないだろうがCMakeの解説本が一冊欲しい
2018/08/21(火) 00:06:59.04ID:FygfW+En
cmake はつい最近のVisual Studio 2017アップデートで標準インストールされるようになったから潜在需要あるかもね…。
2018/08/21(火) 00:51:54.00ID:zakr4cIe
なんでビルドツールっていつも怪物化しちゃうんだろうな
makeがもう誰も手に負えない怪獣のくせにずっと定番に居座ってて、「Makefileを作るツール」が乱立してそれぞれ怪物化してるの勘弁してほしい
2018/08/21(火) 01:03:38.38ID:Wpz7rvAB
>>911
>makeがもう誰も手に負えない怪獣

make ですら怪獣になるのだったら、他の高機能ビルドツールはとっくに破綻している現状だったのか!と、ふと
2018/08/21(火) 01:35:58.44ID:mIqstMqN
makefileなんて複雑な事求めないなら手でかけるレベルだよ
これが複雑で手に負えないとなると、プログラミングも怪しくなる
2018/08/21(火) 01:36:31.95ID:Y1eCmHG/
ビルドについての教育がないがしろにされてるのが全ての元凶
ある程度以上の規模のプロジェクトを構成するベストプラクティスが示されているところを見たことがない
適当に好きなところから取ってきて動けばいいやくらいに改変して使ってるのが現状
2018/08/21(火) 07:06:57.27ID:agJOmNk0
丁寧に書いてるのはこれくらい。

ttp://aegis.sourceforge.net/auug97.pdf
2018/08/21(火) 11:19:53.91ID:zakr4cIe
複雑なことをしたいからビルドツールを使うわけでしてねぇ・・・
2018/08/21(火) 11:24:41.92ID:mIqstMqN
したいという意思があるなら、がんばって理解も出来るだろう
そこまでしなくても、最低限のルール覚えれば使える
2018/08/21(火) 11:53:12.22ID:gERn4ySS
>>915
goto有害説をもじってるんだなw

Makefileを書いていていつも思うのは
ソースファイルの依存関係はソースファイルの中に書いてあるのに
それをまた二度手間で書かねばならないのがイヤ
面倒くさいのはともかく間違えやすいから
2018/08/21(火) 12:20:54.13ID:JvEAafEP
>>918
automake とか gcc -MM とかの話?
2018/08/21(火) 12:38:18.13ID:Dn6CvPAP
rustとc++どっちも使ってる人いる?
2018/08/21(火) 12:59:21.72ID:gERn4ySS
>>919
gcc -MMか、いいこと聞いた
ありがとう
2018/08/21(火) 13:56:49.24ID:Y1HyydAv
>>919
詳しい解説サンクス
こんなのがあったのか
2018/08/21(火) 16:55:02.40ID:59eaeAGG
>>917
ここで根性論とはセンスあるわ
もちろんエンジニアでなく笑いの
2018/08/21(火) 17:26:56.17ID:/1sxYxCd
エンジニアでなく園児にゃ
2018/08/21(火) 19:40:42.98ID:Y1eCmHG/
WindowsでCMakeはfind_packageでだいたい詰む
vcpkgで対応できなければ結局自分で書くはめになり、面倒くさくなってmingw使うかVSのプロジェクトと同居することになる
2018/08/22(水) 16:26:31.16ID:BT6ndhEb
C++ とは直接関係ないけど make/Makefile は擬似ターゲットを使って
バッチ的な定型処理を1個のファイルでまとめて管理できるのが便利でね。

make find WORD=...
全ソースから WORD= で指定した単語を含む行を検索、みたいな。

自分で作った便利ターゲットの使い方を usage: に書いとくのを忘れるけど。
2018/08/22(水) 17:38:28.37ID:ua+EoSC8
>>926
perlでok
2018/08/22(水) 19:10:59.67ID:lMaJ9TV4
C言語のビルドシステムならC言語で書けるようにするべきだと思うのだがよく分からない専用の言語を使わされるのは何故
この手のスクリプト言語は可読性がデバッガもないから中身を探るのが難しすぎる
2018/08/22(水) 19:27:23.21ID:J6lVaoNe
君がそれを作って公開してみれば良いと思うんだが
2018/08/22(水) 20:50:10.20ID:4/HlUcDP
C++のビルドツールといえばboostでお馴染みのbjam
実質boost専用に作ってるだけなのにあんな聳え立つ糞の山になっちゃうんだからビルドツールって怖いね
2018/08/22(水) 22:31:38.77ID:G7PvCZFg
ソフト名がまだ決まっていないけどプログラム開発がスタートするって一般的だと思うんですが、
こういうときってコードネームを付けますよね?
このとき、VisualStudioのプロジェクト名もコードネームにしますよね?

アプリのウィンドウキャプションとかはアプリ名が決まり次第反映させられますけど、
プロジェクト名は途中で変えられないので、そのままになってしまいますが、しょうがないですよね?

要は社内の開発で問題なければOKで、
リリースしたときにコードネームがどこかに混じってしまわないように気を付ければいいだけですよね?

みなさんがどうされてるのか気になったのでお聞きしました。
2018/08/22(水) 23:03:51.57ID:4/HlUcDP
必要なら変えるよ
slnやvcxprojはただのxmlだから名前変えるだけならそんなに難しくない
2018/08/23(木) 00:06:20.88ID:0/a4zf/K
英国ポエムシリーズでしょう
bjam=ブージャムは言うまでも無く、パンジャンドラムすらも無論英国のポエムから採られた
他にも兵器界隈ではスナークとかが存在するのは周知の通り

日本だと仏教用語から採ればいいんじゃあないですかね
934931
垢版 |
2018/08/23(木) 00:10:54.70ID:U43QDDsh
>>932
なるほど〜、プロジェクト関連ファイルを編集することで名前を変えることはできるんですね。
なら気兼ねなく最初はコードネームにしときます。
ありがとうございました^^
2018/08/23(木) 22:00:21.31ID:NMfUyUL+
std::ref() について教えてください

void f(:ostringstream &os) { ... }
int main() {
ostringstream s;
std::thread(f, std::ref(s));
...

とありましたが、なぜ呼び出し側で「おまじない」のstd::ref() が必要なのか理解できません
どんなときに呼び出し側で std::ref() が必要なのでしょうか?

テンプレート関係かと思いましたが
https://ideone.com/7fF53F
は問題なく、std::ref() が必要となるプログラム例を思いつくことができません

よろしくお願いいたします
2018/08/23(木) 22:17:07.10ID:Z2Fii0dD
std::refの規格表とソースを見たか?
余計なコピーを抑制してるんだ。
2018/08/23(木) 22:18:22.48ID:Z2Fii0dD
s/表/票/
2018/08/23(木) 22:33:14.61ID:/6RK1Hlx
非参照なテンプレートな引数に一時変数を作らずに参照を渡せる
2018/08/23(木) 22:52:37.79ID:NMfUyUL+
>>938
コメントありがとうございます
コピーコンストラクタが禁止されている std::cout をテンプレート引数にわたす場合で理解できました(かもしれません)
https://ideone.com/3eqEJY

一つ質問ですが、私なら、このプログラム例の y()
template<class T> void y((*f)(), T &os) { ... }
のように、テンプレートを書く時点で参照に書いてしまうのですが、
あえて非参照なテンプレート引数を書く「便利さ」みたいなものはありますでしょうか?
940デフォルトの名無しさん
垢版 |
2018/08/24(金) 02:37:15.13ID:kcQyW4E+
大阪はいたって平和
しょぼいにもホドがある
2018/08/24(金) 03:55:21.10ID:A5L5xSI8
>>939
>あえて非参照なテンプレート引数を書く「便利さ」みたいなもの
std::thread のコンストラクタを眺めていて気が付いたこと…これ、可変長テンプレートですね
2018/08/24(金) 04:17:14.78ID:A5L5xSI8
x86 の cmpxchg を使いたくて、gcc 拡張の __sync_val_compare_and_swap() を試していました
http://shinh.hatenablog.com/entry/20060817/1155781747
https://ideone.com/tpefmL

c++11 に std::atomic::compare_exchange_weak() を見つけましたが、これは適当に(任意に) new で確保したヒープにも適用できるものでしょうか?
2018/08/24(金) 07:59:06.64ID:ZkSPfVdV
何で出来ないと思うの?
2018/08/25(土) 08:53:09.59ID:/11s7nnG
template <typename T, typename... ARGS>
class nested_error : public std::nested_exception, public ARGS...
{
public:
nested_error(T const& t, ARGS const&... args) : T(t), nested_error(args...) //C3511
{
}
nested_error(T const& t) : T(t)
{
}
};
何かうまい手ない?
2018/08/25(土) 13:51:57.64ID:rL3qzGy6
そりゃまー、実体化した内部ではTは決定済みだろうから無理だろう。
Anyつかうとか・・・。
2018/08/25(土) 14:24:43.54ID:rL3qzGy6
あ、すまん。おかしなこと言った。
えーっと、変数が一個じゃ足りないな。
イニシャライザーリスト使うか、下位関数にキックするか。
2018/08/25(土) 15:05:48.05ID:XmdDRLnv
そもそもコンストラクタの委譲は再帰禁止だったと思うが
別のクラステンプレートのメンバ関数とか関数テンプレートで再帰するしかないと思う
2018/08/25(土) 15:57:42.66ID:rL3qzGy6
https://wandbox.org/permlink/KrUV4MTPdV0l4OoO
興味があったのでそれっぽいコード書いてみた。
これキャッチするの無理だろ。
2018/08/25(土) 16:53:35.24ID:rL3qzGy6
そういえば、例外の時にメモリ確保したらなんか弊害あるんだっけ?
昔、例外投げるときはメモリが足りなかったりとかクリティカルな状況だからやめろって言われたような気がする。
どうやったっけ?
2018/08/25(土) 18:24:33.46ID:/11s7nnG
>>948
なんか面白そうなのうpしてくれてありがとう
すまん、今かなり酔っ払ってる
素面に戻ってからじっくり読むから
ちょっと待ってて
2018/08/25(土) 18:56:26.92ID:5ar3I1wr
>>948
つ catch(A<B, C> E)
2018/08/25(土) 19:23:40.93ID:r5O9PJUC
>>949
> そういえば、例外の時にメモリ確保したらなんか弊害あるんだっけ?
メモリー不足による例外発生時だとその例外処理時のメモリー確保自体が失敗するから例外処理(例えばログ出力)ができなくなるってこと
2018/08/25(土) 20:44:16.72ID:rL3qzGy6
>>951
そらまー、引数がそれの時はできるけど、必ず把握はしてないでしょ。

>>952
あぁ、なるほど。ありがとう。
2018/08/25(土) 20:51:49.46ID:cO/mJ1mq
>>952
メイヤーズ本に簡単な回避テクが書いてある
希ガス
2018/08/25(土) 20:52:40.48ID:cO/mJ1mq
真にご法度なのはデストラクタの中での例外発生なんじゃ…
2018/08/25(土) 21:06:57.48ID:tfF8aOe1
>>953
951だけど、何したいのか分からない。
catch (decltype(X) E)
ならええの?
2018/08/25(土) 22:12:01.59ID:rL3qzGy6
https://wandbox.org/permlink/uEH5L9KBV9L1BdYn
うはー、気が向いたから、コンストラクタに推論させようと思ったら手間食った。あー疲れた。
しかし、理解が深まって良かったかな。うえー。

>>956
投げた本人ならできるけど別のところから飛んできたやつはつかめなくない?
2018/08/25(土) 22:26:38.94ID:rL3qzGy6
しかし、色々試したが結局うまくいかず、解説ページの死角にぽろっとあるのが最高にリアル。
2018/08/25(土) 23:19:11.18ID:5ar3I1wr
>>957
例えばA<B, C>とA<D>は全く別の型なのだから、どっちの型が飛んでくるかわからないのに両方catchするのは無理でしょ。
Base型で試そうとした痕跡があるけど、catchした先でA<B, C>またはA<D>の関数を呼び出そうとしているからそれもできない。

「別のところ」から飛んでくる例外の型はコンパイル時には確定しているのだから、メタプログラミングが通常やるように、「別のところ」のテンプレ引数でthrowする型を決定できるようにすればいいんじゃね?
2018/08/25(土) 23:23:12.69ID:rL3qzGy6
>>959
うん。多分それで困ると思う。>>944が!
メタプロやらないから可能性は感じるけど限界がわからない。
まぁ、俺は興味で書いただけだから、>>944がどうするかはシラネ・・・。
961デフォルトの名無しさん
垢版 |
2018/08/25(土) 23:24:09.84ID:Efgla6YW
>>939
>あえて非参照なテンプレート引数を書く「便利さ」みたいなものはありますでしょうか?
threadの場合デフォルトで参照だとdata raceを気づかないで起こす可能性が上がる。
設計としてスレッドの引数はコピーして渡すほうが安全性は高い。

一般論で言えば一時オブジェクトを受け取るならconst&になるけど、
これだとmoveできないので逆に性能が劣化する場合がある。
962デフォルトの名無しさん
垢版 |
2018/08/25(土) 23:32:37.06ID:Efgla6YW
最近の提案なんかではメモリ確保失敗は回復が難しく一般的な例外とは
区別して考えるのが合理的なんじゃないかって話が出てきてる。
んで新しく静的な例外を導入しようっていう話が上がってる。
2018/08/25(土) 23:39:53.83ID:rL3qzGy6
>>962
コンパイルタイムで例外わかるんだったら、普通にコンパイルエラーにしよ?
2018/08/25(土) 23:47:31.99ID:cO/mJ1mq
メメント・メモリ
2018/08/26(日) 02:56:15.82ID:zhFpXu2e
ヒープが無くなったら、HeapCreateで作れば良いのに。
by マリー・アンチョワネット
2018/08/26(日) 14:06:36.91ID:Q8b2w7YQ
メモリがどれくらい必要なのか簡単に静的解析できたらいいなあと思うけど
再帰関数のメモリ消費量とか計算難しそう
2018/08/26(日) 14:10:00.99ID:BwlGzYMc
mcc68kなんかは-Sでアセンブラ出力させると
コメントにスタック使用量を入れてくれてたな
2018/08/26(日) 19:26:38.30ID:OiuVvKbz
割り込みになるけどちょっと質問させてください
struct hoge {

  int a, b, c;

};

auto a = hoge{1, 2, 3};

auto b = int[]{1, 2, 3, 4};

aみたいに型を明示して中括弧でくくった一時オブジェクトは作れるけど、
bみたいに配列を明示して作ることって出来ないですかね?
単に文法上の質問なんで「やる必要あるのか」とか「std::array使え」とか「構造体でラップしろ」は無しでお願いします
2018/08/26(日) 19:31:13.94ID:Ws2ZfrVi
int[]は int * のシンタックスシュガー
2018/08/26(日) 19:34:14.95ID:OiuVvKbz
int[4]でもだめだったんですよね・・・・
というか今思いついて(int[4]){1, 2, 3, 4}でやったらいけました
お騒がしてすみませそ
2018/08/26(日) 20:05:48.84ID:qnZA5cjL
auto b ={1, 2, 3, 4};
2018/08/26(日) 20:12:01.81ID:2rP1aXG6
>>970
それはC99の複合リテラルになるけど、C++で使ってよかったっけ?
2018/08/26(日) 20:19:57.43ID:qnZA5cjL
warning: pointer is initialized by a temporary array, which will be destroyed at the end of the full-expression [-Waddress-of-array-temporary]
974デフォルトの名無しさん
垢版 |
2018/08/26(日) 20:21:33.00ID:hANAm2gW
https://ideone.com/A9Bccy
#include <stdio.h>

int main() {
  int* b1 = {1, 2, 3, 4};
  int b2[4] = {5, 6, 7, 8};
  int b3[] = {9, 10, 11, 12};
  fprintf(stdout, "b1:%u\n", sizeof(b1));
  fprintf(stdout, "b2:%u\n", sizeof(b2));
  fprintf(stdout, "b3:%u\n", sizeof(b3));
  return 0;
}

https://ideone.com/rJw9cK
#include <iostream>
using namespace std;

int main() {
//  int* b1 = {1, 2, 3, 4}; コンパイルエラー
  int b2[4] = {5, 6, 7, 8};
  int b3[] = {9, 10, 11, 12};
//  cout << "b1:" << sizeof(b1) << std::endl;
  cout << "b2:" << sizeof(b2) << std::endl;
  cout << "b3:" << sizeof(b3) << std::endl;
  return 0;
}
975デフォルトの名無しさん
垢版 |
2018/08/26(日) 20:22:49.21ID:hANAm2gW
c
b1:8
b2:16
b3:16

c++
b2:16
b3:16
976デフォルトの名無しさん
垢版 |
2018/08/26(日) 20:27:01.66ID:hANAm2gW
うん
やっぱり
このスレにもアホしかいない
2018/08/26(日) 20:28:44.90ID:Vxoswi+g
>>976
自分が天才だと思っているなら、こんなところで遊んでないで、なんか凄いソフトを作ってくれよ。
2018/08/26(日) 20:31:31.48ID:BwlGzYMc
レス番が飛んでるなあ
979デフォルトの名無しさん
垢版 |
2018/08/26(日) 20:31:32.32ID:hANAm2gW
オレは自分を天才とか思ってない
オレは天才じゃないが普通の人間だ

この板にいる低学歴知恵遅れが
まともじゃないのがヤバイといってるワケ

教育の程度や知能に大きな問題があるといってるわけ
しかもその自覚がない
まずまともな人間になるところから
2018/08/26(日) 20:44:37.30ID:qnZA5cjL
誤解したまま帰った?

auto a=(int[4]){1,2,3,4};

for(int i=0;i<4;i++)

{

  printf("%d \n",a[i]);

}

出力
0
0
0
0
2018/08/26(日) 21:13:55.49ID:OiuVvKbz
あー、すみませんautoって書いたのがまずかったですね
試してみたんですが、実際にはコンストラクタに渡すので大丈夫でした

autoだと配列の一時オブジェクトへのポインタになるからまずいですね
2018/08/26(日) 21:54:34.00ID:7VGl0ROF
>>981
autoでなくても不味いよ
2018/08/26(日) 22:13:43.13ID:zpiwFHmU
>>977
ほんこれ
2018/08/26(日) 22:53:29.24ID:OiuVvKbz
>>982
なにがどうまずいですかね?
2018/08/27(月) 08:18:57.12ID:YiUsgylF
まったりとしてコクが無く、魚介類の生臭さを濃縮したような
スープと同じぐらい不味い
2018/08/27(月) 13:42:16.09ID:QRiCvp9j
きも
987944
垢版 |
2018/08/27(月) 13:55:56.63ID:vY3QDx2y
>>948
お待たせ

俺っちの質問はnested_exceptionを使うケースなので、
948のコードでいうとBaseを多相的クラスにしといて
catch(Base&)で捕獲し、dynamic_castでBやCへの
アクセスを試みるというようなことだ

ところで
template<class... Ts> overloaded(Ts...)->overloaded<Ts...>;
これが読めん、何やってるのか教えてくれんか
2018/08/27(月) 14:09:13.11ID:vY3QDx2y
>>955
std::uncaught_exceptionというのがあるね
2018/08/27(月) 14:23:40.86ID:QRiCvp9j
>>987
クラステンプレートの引数の推論補助(deduction guide
2018/08/27(月) 14:26:19.85ID:vY3QDx2y
>>989
deduction guideね、thx
2018/08/27(月) 15:42:34.96ID:JbKLTkj/
次スレ頼む
2018/08/27(月) 16:02:51.38ID:r/wp9j7z
わたくしがC++で書き上げた超高性能次スレ立てマシーンなら次スレなんて一発ですよ
2018/08/27(月) 16:03:14.62ID:vY3QDx2y
立てたよ
https://mevius.5ch.net/test/read.cgi/tech/1535353320
2018/08/28(火) 01:49:58.08ID:rjIDuLFn
スレ番インクリメント機能はC++でも実装不可能なまでに困難な作業だったか
2018/08/28(火) 06:13:26.80ID:UQgP5OTn
スレ立てが競合した時の排他制御を実装してくれ
2018/08/28(火) 06:22:11.76ID:XE/KW9kf

板復帰(OK!:Gather .dat file OK:moving DAT 703 -> 686:Get subject.txt OK:Check subject.txt 703 -> 690:Overwrite OK)0.84, 0.77, 0.74
age subject:690 dat:686 rebuild OK!
2018/08/28(火) 20:40:17.99ID:fGjEV9Ei
997
2018/08/28(火) 20:40:50.96ID:fGjEV9Ei
998
2018/08/28(火) 20:41:19.69ID:fGjEV9Ei
999
2018/08/28(火) 20:41:56.22ID:fGjEV9Ei
1000
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 45日 2時間 48分 54秒
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。