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

■ このスレッドは過去ログ倉庫に格納されています
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
70デフォルトの名無しさん (ワッチョイ 1a49-d9WE)
垢版 |
2017/08/11(金) 15:47:46.79ID:L0uHlCp20
>>68
そのコード本当に動く?
本質じゃなくて申し訳ないが、そのまま追試出来るコードじゃないと…

ちなみに質問の回答はスライスな。
2017/08/11(金) 15:57:28.65ID:GPxw37uF0
おかしいな、確かに
コピーコンストラクタもないのにコンパイラ通るのかコレ
72デフォルトの名無しさん (ワッチョイ 1a49-d9WE)
垢版 |
2017/08/11(金) 16:00:31.30ID:L0uHlCp20
コピコンは省略可能だよー。
2017/08/11(金) 16:11:31.54ID:CTzRRQx/0
>>69
ありがとうございます
ポインタにすることで解決しました
>>70-71
動かしてるコードを簡略化したのでもしかしたら動かないかもしれないです
2017/08/11(金) 16:51:11.96ID:+GdUPlS/r
「本当に動く? (中略) そのまま追試出来るコードじゃないと…」
 ↓
「もしかしたら動かないかもしれない」
これがアスペというやつだな
2017/08/11(金) 16:54:58.31ID:mfxycmdp0
会話としては成り立ってる
2017/08/11(金) 17:09:12.83ID:MFH9oRFs0
この言語はどこの業務で使われてるの?
組み込み・制御はC++使ってますとか言いながら大体これCじゃん!だから論外として
2017/08/11(金) 17:11:30.49ID:Ca8C76qb0
gcc が c++ で書き直された、という話はあったな
2017/08/11(金) 17:29:47.32ID:fw1fdXf30
>>76
https://github.com/search?utf8=%E2%9C%93&;q=language%3AC%2B%2B+stars%3A%3E%3D1000&type=Repositories
2017/08/11(金) 18:02:24.77ID:bpB/tg4h0
Webブラウザとかゲームとか
2017/08/11(金) 18:34:36.55ID:eZ0/1svY0
>>76
Better C として使ってもええんやで
2017/08/11(金) 19:29:34.92ID:rA3728Ge0
>>76
Simulaの置き換え
2017/08/11(金) 20:50:37.74ID:W25jNYVm0
C言語としてg++使ってる
2017/08/11(金) 21:45:37.12ID:U5fbDsCj0
ウチじゃモータ制御に使ってるな
84デフォルトの名無しさん (ワッチョイ 7665-KsLg)
垢版 |
2017/08/12(土) 16:56:14.99ID:srjAo6Ap0
質問です。

宣言は、全ての要素に対して必要なのですか?

n = a+b:

という行があるとすると、

#include <n>
#include <a>
#include <b>

が必要なのですか?
とても初心者なので、なにとぞ教えてください。
お願いします。
2017/08/12(土) 17:13:58.34ID:AoA5DjYT0
意図がわかりにくいがその場合だったら#include <n> だけあればいいんじゃないの?
そうでないとしたらinclude順は#include <a>と#include <b>を先に書くべき。
2017/08/12(土) 17:17:09.90ID:lBXwiOpA0
>>84
#include は宣言じゃない
多分
int n;
int a:;
int b;
のことじゃないかな?
2017/08/12(土) 17:21:05.88ID:Yn7dYYpz0
>84

#include
というのは、外部にあるファイルを読み込め
という命令なので、変数の宣言ではありません。

#include <a>

というのは、aというファイルを読み込めという
命令です。
n=a+b
という場合には、この式の前に、n, a, bという
変数の型を宣言する必要があります。
全てが整数ならば、
int a, b, n;
単精度実数ならば
float a, b, n;
と、倍精度実数ならば、
double a, b, n;
と書きます。
と変数の型を宣言します。

このことは、基本の基本なので、解説書の最初に書いてあるはずです。
解説書をよく読んで、その上で分からないことを
質問しましょう
2017/08/12(土) 17:27:53.44ID:srjAo6Ap0
>>85-87
googleだけの独学なので、とても勉強になりました。

とても、ありがとうございました。
2017/08/12(土) 17:28:31.16ID:AoA5DjYT0
文字通りの意味だったのかよ
2017/08/12(土) 18:07:41.60ID:B05a5g6/r
>#include <a>
>というのは、aというファイルを読み込めという命令です。

んなこたーない
2017/08/12(土) 18:16:01.28ID:B05a5g6/r
>>87
>この式の前に、n, a, bという変数の型を宣言する必要があります

それは規格のどこに書いてあるのですか?
2017/08/12(土) 19:18:12.75ID:qkSSCQjy0
DEFINEもincludeも本質的にやってることは同じだしファイルを読み込めは間違ってるな
2017/08/12(土) 19:23:05.89ID:6XNTCj+p0
includeがファイルをその位置に展開しろっていうのはあってると思うけど、何が不満なんだ?
defineはただの文字列置換。
2017/08/12(土) 21:29:22.94ID:B05a5g6/r
× #include <a>というのは、aというファイルを読み込めという命令
○ #include <a>というのは、aというヘッダーを読み込めという命令
○ #include <a>というのは、#include <a>をaというヘッダーの内容で置き換えろという命令
2017/08/12(土) 22:23:06.24ID:AoA5DjYT0
またヘッダー警察が来るぞ
2017/08/12(土) 23:15:33.63ID:wV3c1N0ta
>>84のレベルの人に説明するのに、厳密な用語をどうこういうより、>>87レベルの説明の方が適切だろう
2017/08/12(土) 23:26:56.30ID:IKUtZym10
仕様だとヘッダーとソースファイルは区別されてるみたいだけど
#includeはヘッダーとソースファイルのどちらも扱うから
二つを纏めてファイルと呼称しているとしたら>>94は間違いじゃないの?
2017/08/13(日) 06:37:43.35ID:/9jKf3580
「C++の#includeがファイルを読み込むとは限らない」
という説明を何かで読んだ記憶がある。

例えばソースに #include <hoge.h> と書いてあっても
hoge.h というファイルの実体は存在しなくて、
コンパイラが内部的なスイッチとして使っても構わない、みたいな話。
実際にそういう動作をするコンパイラは知らんけど。
2017/08/13(日) 07:15:34.96ID:CgemGkhrr
>>97
もとの>>87は#includeでなく#include <>なのだが

>二つを纏めてファイルと呼称しているとしたら
いきなり自分の結論を大前提に置かれても
まあこのへんはC++17で少し変わるだろう
2017/08/13(日) 11:33:24.03ID:P6N6OiXF0
CSVファイルを読み込むときに#include使うことある
2017/08/13(日) 20:57:49.74ID:R0DVX6mKM
てか、学ぶなら1冊くらい本買えよ
Googleで独学とか効率悪すぎる
2017/08/14(月) 00:14:24.38ID:N3oVMbyu0
軸がわからないと自分が何をわかってないかすらわからないからクソみてぇな思い込みで検索して見当違いの方向に突っ込んでしまうから、
そうなってから質問しても質問が見当違いすぎて回答しようがないことはよくある。
2017/08/15(火) 18:55:44.72ID:Q70B1fQS0
>>102
いっちょコンパイラを書いてやろうと思っているんだが何をやっていいかわからない…
手元の教科書は必死に正規表現やらチューリングマシンやらを追求している…
これってコンパイラ本だと思って買ったのだが、どうも本を間違えてしまったらしい
軸がわからないと悲惨ですね
2017/08/15(火) 19:28:20.65ID:GzAS59pw0
>>103
スゲー古い本だけどこの辺りを参考にするとか
https://www.amazon.co.jp/dp/4782850573
2017/08/15(火) 19:38:22.48ID:AjDM7F7/0
http://ideone.com/RcWgQx
これ、C++17でできるようになるんだっけ?どうだっけ?
2017/08/15(火) 19:51:33.69ID:nijih07Br
少なくとも似たケースを支援する機能は追加されるがそのままでは通らない
[*this]
2017/08/15(火) 19:53:35.30ID:nijih07Br
と思ってよく読んだら関係無かったしTは生存期間内だった
つまりC++17では無理
2017/08/15(火) 19:56:48.90ID:AjDM7F7/0
そうなんだ。ありがとう。
またウインドウを出せないのか。
綺麗なウインドウクラスを書く日は遠い・・・。
2017/08/15(火) 19:59:11.57ID:vSz72Ekj0
>>103
LLVMのtutorialでもやってみたら? (↓の一番上)
https://llvm.org/docs/tutorial/
たしか日本語訳もあったと思うけど、内容が古いので注意。
110デフォルトの名無しさん (ワッチョイ 3323-Eq/3)
垢版 |
2017/08/15(火) 20:03:18.47ID:BftRsONU0
>>103
yacc, lex (または bison, flex) とかは知ってる?
使うと構文解析が楽になるよ。
111デフォルトの名無しさん (ワッチョイ 5baa-ixYY)
垢版 |
2017/08/15(火) 21:06:58.79ID:K8T9Hr6g0
>>108
単にstd::function使えって話じゃねーの?
2017/08/15(火) 21:16:01.46ID:AjDM7F7/0
>>111
WindowsのウィンドウをWin32APIで出すときは、Cのインターフェースに渡さないといけない。
なので、デフォルトキャプチャにthisのアドレスコピーが入ってくれないと厳しい。
113デフォルトの名無しさん (ワッチョイ 5baa-ixYY)
垢版 |
2017/08/15(火) 21:38:42.75ID:K8T9Hr6g0
>>112
typedef bool(*Fun)();
にキャプチャしたデータを置いとく場所が無いんだからいつまでまっても実現しないよ
そういうC言語のAPIにはvoid*でユーザーデータ渡せて引数で取得できるようになってるはずなんだからそれに規則性があるのなら(例えば最初の引数がユーザーデータになってるとか)テンプレートでラッパー書くの簡単でしょ
114デフォルトの名無しさん (ワッチョイ 1a49-d9WE)
垢版 |
2017/08/15(火) 21:53:17.41ID:+1mFvI7w0
>>105
できるも何も型が違うからエラーでしょ。
ラムダ型のオブジェクトはautoでしか受けられない。
2017/08/15(火) 23:43:23.71ID:AjDM7F7/0
>>113
クロージャって知らない?

>>114
条件を限定することで関数ポインタに束縛できるようになりました。
まぁ今回書いたのは願望ですけど。
116デフォルトの名無しさん (ワッチョイ 5baa-uFAa)
垢版 |
2017/08/15(火) 23:55:50.09ID:K8T9Hr6g0
>>115
キャプチャしないラムダ式は関数ポインタに変換出来るだけ。束縛じゃない。
2017/08/15(火) 23:58:52.92ID:AjDM7F7/0
あぁ、語弊があったね。ゴメン。
2017/08/16(水) 06:02:38.98ID:1FqF77kw0
クロージャがどのように実装されているか調べてみることを勧める。
そしてそれをC言語の関数ポインタと互換性がある形で実装可能か考えてみるといい。
2017/08/16(水) 06:31:25.68ID:3XX715Yb0
>>117だよ。
駄々っ子みたいになってるが、
スレッドローカルみたいな変数を持たせれば持てないことも無いと思う。
まぁ、もうできないことはわかったので抜けます。
120デフォルトの名無しさん (ブーイモ MMba-d9WE)
垢版 |
2017/08/16(水) 12:58:58.53ID:+9oABFYpM
もういない宣言出てるけど、スレッドローカルでやられても困るだけだと思う。
2017/08/16(水) 14:20:28.94ID:5HjXxUQN0
>そしてそれをC言語の関数ポインタと互換性がある形で実装可能か考えてみるといい。
もともとC言語はλ式とか、(束縛変数がクラスのこともありえるが)クラスを構文でサポートしていないのだから
「C言語の関数ポインタと互換性がある形」と逝っただけでは何を指しているのか不明確にならざるおえない
呼び出し側がいかに煩雑な記述になろうとも、動けば互換性があるという立場をとってみるテスト、

束縛変数も毎回引数渡しすればC言語の関数ポインタと互換にできるのでは…
もはやクロージャでも何でも無いが一応動く
2017/08/16(水) 14:36:46.12ID:53LlWcImr
>>121
>もはやクロージャでも何でも無いが一応動く
ちなみにどうでもいいことだがラムダ式から取得した関数ポインターはC++リンケージ型なのでC関数に渡してコンパイルが通る保証が無い
2017/08/16(水) 15:18:13.19ID:5HjXxUQN0
>>122
関数ポインタ経由の関数呼び出しに関数名のマングルは関係無いのでは…
2017/08/16(水) 15:34:56.89ID:53LlWcImr
>>123
関数名だけではない
extern "C" using CF = void(); と
using CPPF = void(); は似て非なる関数型
この二つはオーバーロード可能で互換性も無い
恐らくマングリのみならず関数呼び出し規約の違いを許容する思想
ただこれを正しく実装したコンパイラーを見たことは無い
2017/08/16(水) 15:57:26.34ID:07vifjzr0
「正しく実装」すると互換性がないってこと?
2017/08/16(水) 15:59:31.27ID:CMzvSoma0
a = 0
2.times do
b = 1
3.times do
p a, b
end
end

「Rubyのしくみ」に書いてあるけど、Rubyは、Cで作ってあり、
do 〜 end のブロックは、クロージャの実装。
ラムダ・Proc も、ほとんど同じ

子のブロック内で、変数が見つからなければ、
外のスコープ(先祖の方向)へ遡って、探しに行く
2017/08/16(水) 16:07:27.94ID:53LlWcImr
>>125
そのとおり
規格では別の型と規定されている
atexitなど関数ポインターを渡す関数ではCリンケージの関数ポインターを渡すかC++リンケージの関数ポインターを渡すかで
C版atexitとC++版atexitのオーバーロード呼び分けができることになっている

clang/G++は意図的に規格に従っていないというのが痛説
Visual C++は規格より自分が正しいという意味不明な見解
2017/08/16(水) 16:16:58.46ID:07vifjzr0
や、互換性がない→別の型 は真でも 別の型→互換性がない はそうじゃないような。
2017/08/16(水) 16:31:53.97ID:53LlWcImr
そのとおりだ
暗黙の変換は禁止されていない
ただ暗黙の変換が可能というルールも存在しないので「コンパイルが通る保証が無い」と書いた
2017/08/16(水) 16:48:50.64ID:07vifjzr0
なるほど。
上の方で原理的に無理みたいなことが書いてあった気がしたので念のため。
2017/08/16(水) 18:09:49.22ID:VpF+jov/0
マングリングっていやらしいよな
2017/08/16(水) 18:35:35.31ID:lmNMFTOO0
そういうCのインタフェースにはたいてい関数ポインタの他にユーザデータを指定できるようになっててそこにthisなんかを入れておくものだが、 >>105 は関数オブジェクトを関数ポインタだけに変換したいと言っているわけか……

コードを動的に生成すれば不可能ではないだろうけど、色々トレードオフがあるから言語の機能にするのはどうだろうね。
ライブラリを作っても良いんだろうけど、おとなしく定石に従っておいた方が良いよ
133デフォルトの名無しさん (ワッチョイ 5baa-uFAa)
垢版 |
2017/08/16(水) 22:53:19.96ID:VOMe5hsv0
>>132
動的にコードを生成したとしてもどこにその生成したコードを置くのか、それをどうやって解放するのかが問題になるね。だったらコード生成してもしなくても同じ事。
2017/08/16(水) 23:14:18.00ID:lmNMFTOO0
>>133
> 動的にコードを生成したとしてもどこにその生成したコードを置くのか、それをどうやって解放するのかが問題になるね。
そうだね。

> だったらコード生成してもしなくても同じ事。
同じではないね。
135デフォルトの名無しさん (ワッチョイ 5baa-uFAa)
垢版 |
2017/08/16(水) 23:47:46.20ID:VOMe5hsv0
>>134
言い方が悪かったかな?
「どこにその生成したコードを置くのか、それをどうやって解放するのか」が解決するのであれば、コードを動的に生成しなくてもキャプチャしたデータ自体をそこに置けばいいだけ。
2017/08/17(木) 02:40:17.43ID:PxJqlDv90
>>135
キャプチャしたデータ(またはそれへのポインタ)をコード以外のどこかに置くとして、それは関数ポインタ一つ(コードへのポインタをとるCのAPIにそのまま渡せる形)にはならないだろ。
何の話をしてるんだ?
2017/08/17(木) 05:10:47.78ID:gXVZW44o0
WTL/ATLでそれっぽいことをやってるね。
http://hp.vector.co.jp/authors/VA022575/c/msgmap.html
2017/08/17(木) 08:39:28.71ID:rYxoi1+/d
MS は mfc の頃から動的コード生成でやってだ記憶がある。

this をロードして jmp みたいな小さいコードを生成して Window Proc として使う。
2017/08/17(木) 09:01:01.55ID:6E9r52D/0
それ動的生成だろ。コードじゃなくてインスタンス。
2017/08/17(木) 10:51:29.58ID:rYxoi1+/d
>>139
コードだっつーの
関数ポインタ一つしか渡せないwindowprocにthisを渡すためにそうやってるんだよ。
なんで知らんのに反論するかなー
2017/08/17(木) 11:04:19.66ID:OslnP8rdM
>>140
ひょっとして各インスタンスにコードが含まれてるとか思ってる? w
2017/08/17(木) 14:38:16.10ID:B8c7/K0xr
>>138
そのサンクらしきものはどこのセグメントに置くの?
2017/08/17(木) 15:30:51.11ID:PxJqlDv90
自分でソース読めば良いのに。
最近はDEPとかあるから工夫が必要そうだよね、と検索したらこんなのが出てきた。
https://support.microsoft.com/ja-jp/help/948468/applications-using-older-atl-components-may-experience-conflicts-with
2017/08/17(木) 16:53:07.66ID:6E9r52D/0
>>143
MFCのどのクラスに動的コード生成の実装が書いてんの?
2017/08/17(木) 17:43:39.99ID:PxJqlDv90
なんか頭悪そうなのがつっかかってきた
2017/08/17(木) 17:47:21.07ID:fzzVUP+8d
DOS時代は動的コード生成とか良く使ったな
2017/08/17(木) 18:37:40.30ID:6E9r52D/0
>>145
なんで急にキレるんですか?
あなたがソース読めとアドバイスしたからMFCのどのソースか聞いただけなのに。
2017/08/17(木) 18:53:03.48ID:p6ewHhXhd
理解しようという気持ちも理解する力もないのに質問すんなよ…
mfc ではやってたっけ?やってないんじゃないの?
というツッコミならともかく、
>>141>>142なんて思考力が虫以下だろ…どこのセグメントとかアホか
Win32 は古来よりフラットなリニアアドレスモデルだろ。
VirtualAlloc も知らなそうだし。
2017/08/17(木) 18:56:13.88ID:wL10pSGX0
質問だと思ってる時点で低能確定やん w
まあセグメントと聞いてセグメントレジスタしか頭に思い浮かばない低能はROMってろ
2017/08/17(木) 19:26:52.61ID:KC+pdSEir
>古来よりフラットなリニアアドレスモデル
まさかそっちのセグメントに反応するとは予想外だった
2017/08/17(木) 19:47:30.76ID:6E9r52D/0
>>148
だいたいあなたがMFCの頃から動的コード生成でやってたって言い出したんですよ。
だから私はMFCにあるのはインスタンスの動的生成だという指摘をしたんですよ。
そしたら、再度あなたがATLのような実装があるんだと言ったんですよ。
ソース見ろとか言う人までいるから、どのソースか聞いたらキレて、なんで言い出したおまえまでキレんだよ。アル中か?
ここは相談室だぞ。
2017/08/18(金) 07:51:05.48ID:mSCO2cNh0
C++を身に着けたいと思いつつも、自分でC++で何かを作るモチベーションが湧かなくって、数千行程度のC++プログラムの写経でもしようかと思ってるのですがおすすめありませんか?

SDLを使ったゲームとか興味を持ちやすくて写経しやすいかと思ってgithubとか漁ってるのですがなかなかいいのが見つからなくて悩み中です
QtみたいなC++を拡張してるのは勘弁です
2017/08/18(金) 08:26:03.23ID:cQGhZEXD0
あなたが何に興味を持つかなんてわかりません
C++以外の技能は?
2017/08/18(金) 09:19:25.85ID:q7vLALqK0
てんそるふろーでも読んでみるとか。
今を時めくフレームワークだよ。
2017/08/18(金) 12:28:43.04ID:vqpgoPDk0
クソだと思うやつを俺が叩き直してやるってやっていればそのうち上達してる
2017/08/19(土) 00:15:55.63ID:LWJoSxYpr
ぜひ叩き直してください!
2017/08/19(土) 10:13:11.47ID:2Vqw9aXW0
>>156
思いっきり叩いてやるからまず自分が書いたソースをどこかにアップしろ
2017/08/19(土) 11:23:26.49ID:w9JmRxmV0
>>157
http://mevius.2ch.net/test/read.cgi/tech/1434079972/20
2017/08/19(土) 12:05:03.25ID:uvlmBKsV0
他人に使わせる気のないコードなんていくら書いても意味ない
ソフトウェアとして公開して叩かれろ
2017/08/19(土) 12:07:34.16ID:w9JmRxmV0
>>159
>他人に使わせる気のないコード
どうすれば他人に使わせる気満々のコードになるのでしょうか?
ソースを公開する以外に何かしないといけないのでしょうか?
2017/08/19(土) 12:13:16.84ID:YuM2o2hA0
3行以内で書く、とか?
2017/08/19(土) 12:46:02.69ID:dHC0uy3l0
使いたくなるか否か、それを判定するソースコードを見せてくれれば一番早い
そしてそのソフトウェア自体をその判定にかけると得点はMAXになるのは当然
2017/08/19(土) 15:54:33.73ID:/pRbJcl80
>>160
・OSSライセンスを適用する
・有名処のOSSホスティングサービスで公開する
・ソフトウェアの目的と利用方法を理解しやすいようにドキュメント化する
・CPUやメモリなどのリソースを効率よく使用する
・汎用性が考慮された作りにする
・特殊化も考慮された作りにする
・バクが無いようにする
・こまめに更新し継続して改善されている事をアピールする

このくらいやれば他人に使わせる気満々のコードに見える
2017/08/19(土) 16:03:12.53ID:w9JmRxmV0
>>163
なるほど

でも >>158 をやる気満々で公開しようと思ってもアピール点が見つからないんです
「C++ だけで簡潔する多桁演算」というのは訴求ポイントとしてはどうなんでしょうか
誰かやってるかどうかはさておき、魅力的がどうかは気になります
2017/08/19(土) 16:04:19.60ID:w9JmRxmV0
×簡潔○完結
2017/08/19(土) 18:29:45.94ID:xqVOePdU0
右辺値参照がやっぱりわからん
template<class T>
void test(T&& t) {
f(std::forward<T>(t))
}
このstd::forward<T>(t)は左辺値なの?
名前持つt(左辺値)を転送してるから左辺値でいい?
f()はf(T&)を呼ぶであってる?
2017/08/19(土) 18:30:36.24ID:eKyb4lix0
C++11,14を勉強するのにいい本おしぇーてください。
2017/08/19(土) 19:12:00.26ID:o+HPRhwX0
effectiveなんちゃらフォイ
2017/08/19(土) 19:19:27.18ID:eKyb4lix0
もだーん?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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