X



【初心者歓迎】C/C++室 Ver.102【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2017/11/04(土) 16:33:35.07ID:NYxCuvMY
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります

コードを貼れる所
http://codepad.org/
https://ideone.com/

前スレ
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1500329247/
0390デフォルトの名無しさん
垢版 |
2018/03/27(火) 23:30:03.49ID:4E83+S2j
>>387
昔汎用メッセージポンプを検討したときのサーベイにstd::condition_variableと書いてある。
注意としてspurious wakeupというのも書いてある。
もうすっかり忘れてしまって何のことだか自分でも思い出せないのだが、「条件変数」というのがキーワードになるようだ。
0392はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/03/27(火) 23:46:19.51ID:6NyejsSC
>>389
ページ単位ではしていることがある。
OS がメモリの割付を管理していて、
足りなければ追加で割り当てたりもする。
割り付けてないメモリ空間に変に触ったら検出できる。
0393デフォルトの名無しさん
垢版 |
2018/03/28(水) 06:54:26.81ID:fYzIlbdt
>>389
スタックエリアの管理は当然してる
オーバーランの監視は環境次第

ハード的に仕組みがあるものもあし
ソフトで(コストをかけて)やる場合もあるし
全くしない環境もある
0396デフォルトの名無しさん
垢版 |
2018/03/30(金) 10:25:28.98ID:8epIcCej
最近のC++ってかなり進化していてTaskとかLinqなんかもできるんだろ? PCだとC#があるから
C++は使わないが組み込みだとC++を使いたい。CからC++に変えてみようとおもっってテスト
してみたことがあるが、メモリーを食い過ぎてStringはつかえなかった。
どこまでなら使えるんだろ? なにか目安はないか?
0397デフォルトの名無しさん
垢版 |
2018/03/30(金) 11:36:04.01ID:Wx9gH+Ym
組み込みなら自分で書いたものだけ使うというか
STLは一切使わないのが普通じゃないか?
0399デフォルトの名無しさん
垢版 |
2018/03/30(金) 12:36:38.56ID:MnRWcQoL
組み込みってピンキリだからなんとも言えんわ
業務用複合機なんてそこらのパソコンより凝ったハード積んでたりするし
0402デフォルトの名無しさん
垢版 |
2018/03/30(金) 13:46:55.20ID:8epIcCej
STLってC#のLinq並みに表現力があるんだろうか? Linqは最初嫌いだったが使い始めて
見ると非常に便利で驚いた。C++のSTLは全然しらなかったがWikiを読んだらなんかかなり魅力
的に見えてきた。 
0403デフォルトの名無しさん
垢版 |
2018/03/30(金) 13:52:10.17ID:Wx9gH+Ym
内部で new / delete 使用している stl は使わないリストに入れず
new / delete は使わないリストに入れんのかよ…
0405デフォルトの名無しさん
垢版 |
2018/03/30(金) 14:25:29.65ID:FxYI+k+J
コンテナ使わない有用なアルゴリズムってあるか
あるなら使いたいからご教授ください

min とかあるか
0406デフォルトの名無しさん
垢版 |
2018/03/30(金) 16:24:55.88ID:HVaF4kSp
>>403
内部でnew/deleteしてるものは当然含まれる
当たり前

そもそもヒープエリア自体無かったりするし
あってもアロケートのみで解放機能が無かったりする

小規模組み込みでメモリを確保出来ないなんてことは想定しないし
確保解放のコストもバカにならない
アドレス変換が無いから隙間だらけで連続領域が取れなくなるなんてことも心配したくない
0410デフォルトの名無しさん
垢版 |
2018/04/02(月) 16:24:48.19ID:MJzKsai7
ヘッダファイルを作るときに、2重インクルードを防止するための対策を書けと本に書いてあります。

注意していれば、2重インクルードをせずに済むにもかかわらずなぜ、このような
対策をしなければならないのでしょうか?
0413デフォルトの名無しさん
垢版 |
2018/04/02(月) 16:42:16.37ID:r6uHUG7/
2重includeに気付いてからでも遅くない
0415デフォルトの名無しさん
垢版 |
2018/04/02(月) 20:57:46.72ID:MJzKsai7
header_1
header_2

header_n

で共通に必要なヘッダ header_a がある。

header_1
header_2

header_n

のそれぞれの中で header_a をインクルードしている。

header_i と header_j (i ≠ j) が必要なファイル file1 がある。

というような状況でしょうか? 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
0416デフォルトの名無しさん
垢版 |
2018/04/02(月) 21:43:19.92ID:JDmrHTz8
あなたはstdlib.hとstdio.hの作者です
stdlib.hとstdio.hの両方でerrno.hが必要だとします

あなたはstdlib.h stdio.hの中でerrno.hをインクルードしますか?しませんか?
0417デフォルトの名無しさん
垢版 |
2018/04/02(月) 22:36:25.27ID:7E1ezZvV
>>416
入門書にこう書きます
「studio.h や stdlib.h をインクルードする際には、事前に errno.h をインクルードすること」

どうかなとは思うが実際こういう流儀でヘッダーファイル書く人も見かける
0423デフォルトの名無しさん
垢版 |
2018/04/02(月) 23:10:11.92ID:yv4S6fVx
関数名にしろヘッダーにしろ6文字の縛りって何か歴史的理由があったのだろうか?
0430デフォルトの名無しさん
垢版 |
2018/04/03(火) 00:51:55.59ID:cU9BUIMs
>>416-417
プリコンパイルヘッダが汚れたり無駄にでかくなったりするからな
0431デフォルトの名無しさん
垢版 |
2018/04/03(火) 01:02:56.47ID:FKLo0jPW
以下のboost::factoryを使う練習用コードにおいて
https://wandbox.org/permlink/K1TIhC61VQztTbOd

map<string, boost::function<base* (int)>> factories;
とするとコンパイルエラーになり、ググって見つけた方法で
map<string, boost::function<base* (int const&)>> factories;
とすると何故かコンパイルが通り、問題なく動作します。
コンストラクタの引数が実際の int ではなぜ駄目なんでしょうか?
0432デフォルトの名無しさん
垢版 |
2018/04/03(火) 01:48:18.62ID:JvEghgri
>>417
実装依存のヘッダファイルの場合とか、ユーザに事前にincludeしろとは言えないケースもあるよ
0433デフォルトの名無しさん
垢版 |
2018/04/03(火) 02:16:15.79ID:1GcrBwMo
stackoverflow では boost::factory が引数の参照渡しを前提にしてるから、とあるな。
実際 factory 以外の普通の関数なら問題ないし
0434デフォルトの名無しさん
垢版 |
2018/04/03(火) 02:31:59.43ID:uUh7wFma
dxd9みたいにincludeすると可笑しくなるヘッダもあるしなーω
0435デフォルトの名無しさん
垢版 |
2018/04/03(火) 08:56:24.86ID:1fV6RHaF
>>423-424
先頭6文字だけ見て一意に決まることが条件で、名前の長さ自体に制限はない、
じゃなかったかな。大文字小文字は同一視で。
0436デフォルトの名無しさん
垢版 |
2018/04/03(火) 11:32:26.11ID:R6gDm2yr
_st とか _s とかごちゃごちゃ付き始めたころからつまらなくなった
0438デフォルトの名無しさん
垢版 |
2018/04/03(火) 11:43:28.33ID:Z1fbtkqU
>>433
公式ドキュメントにはさらりと「技術的理由によりfunction objectに渡す引数はlvalueでないと駄目」と書いてあるのみなので、さっぱり理解できませんでした。
そもそもコンストラクタbase (int const&)は定義していないのにコンパイルが通るのが不思議・・・

結局 boost::bind(boost::factory<derived*>(), _1); が何しているのか理解しないと先に進めなそうですね。
0440デフォルトの名無しさん
垢版 |
2018/04/03(火) 13:48:08.68ID:Z1fbtkqU
>>439
引数のある関数の場合はboost::bindを使うのではないでしょうか?
いちおう公式にもその例が書いてあります。

ちなみにどんぴしゃな質問がstackoverflowにあり、Answerには親切にDemoまで付けてくれてて、
速攻で解決したと糠喜びしたんですが見事にコンパイルエラーでした。
https://stackoverflow.com/questions/37137117/passing-arguments-in-constructor-with-boost-factory
0441デフォルトの名無しさん
垢版 |
2018/04/03(火) 15:04:56.72ID:rDNMxPWT
>>440
引数を部分的に何かにbindしたfunctionを作るのがbindなわけで、
(add(a,b) の a だけ1にbindしてadd1を作るとか)
何もbindせず引数の順序も同じなら

factories["derived"] = boost::factory<derived*>();

で良い
0442デフォルトの名無しさん
垢版 |
2018/04/04(水) 23:06:46.13ID:t1HAuKeq
>>441
確かにbindのそもそもの目的はそれですよね>(add(a,b) の a だけ1にbindしてadd1を作るとか)
仰る通りの書き方でコンパイルも実行も通りました。
ただ、ググった限り引数のある場合はbindをかます例しか見つからなかったです。
「bindが必要」と明言してる人すらいて、結局よくわからないです・・・

その後、いくらコンパイルも実行も問題ないとはいえ実際のコンストラクタとは違うのを
boost::function<〜> に指定するのはなんとも気持ち悪く思い、試行錯誤したところ
boost::forward_adapter を使う方法を見つけました。
https://wandbox.org/permlink/D3Q75cgRNR43Nulc

ヒントとなったのは以下のサイトでした。
https://lists.boost.org/Archives/boost/2017/02/232695.php

正直なぜこれで通るのか完全には理解していませんが、とりあえずの解決とします。
ご助言どうもありがとうございました。
0444デフォルトの名無しさん
垢版 |
2018/04/05(木) 07:41:24.21ID:ev3xPrwL
>>443
公式ドキュメントはこれです。
https://www.boost.org/doc/libs/1_66_0/libs/functional/factory/doc/html/index.html

ここに以下のような「stringキーzとコンストラクタのmapにコンストラクタを登録」するという方法が書いてあればよかったのですが・・・
map<string, boost::function<〜>> factories;
factories["derived"] = 〜

でもboostの公式ドキュメントはこんなものというか、隅から隅まで説明しないわからない素人はお断りってやつですよね。
0445デフォルトの名無しさん
垢版 |
2018/04/05(木) 14:37:25.23ID:LhrJ/WaU
質問です.

以下のようなことが書いてあるファイルを読み込んで,

文字列,数値,...,数値,数値...数値
...

str, a[0],...a[n-1],b[0],...b[m-1]
という配列に入れたいです.
nとmは可変の場合,どうすればよいか教えてください.
スッキリとした書き方が知りたいです.
std::string str;
double a[n],b[m];
です.
0446デフォルトの名無しさん
垢版 |
2018/04/05(木) 14:51:56.82ID:8vk43UVU
std::string知ってるなら
std::vectorを使えば早かろう
std::vector<double> a, b;
a.resize(n);
b.resize(m);
a[0] = ...
0447デフォルトの名無しさん
垢版 |
2018/04/05(木) 14:54:56.53ID:AQLHpii5
可変の n, m が読み込む前に確定するのか
ファイルの記述内容から n, m が確定するのか
0448445
垢版 |
2018/04/05(木) 15:16:31.21ID:LhrJ/WaU
>>447
今回はstringを見て,nとmを決めます.
str="a"ならn=2,m=3のような感じです.
>>448
読み込み方が分かりません.すいません.
Google先生に聞いてこんな感じのプログラムを書いてます.
std::string line;
std::ifstream infile("hoge.dat");
std::getline(infile,line);
sscanf(line.data(),...//どう書くの?
0449デフォルトの名無しさん
垢版 |
2018/04/06(金) 18:11:46.66ID:CDFchtjR
void Show(const IntArray& array){
...
}

というような関数内で、 array の const メンバ関数ではないメンバ変数を変更しないメンバ関数を
使っているとコンパイルエラーになりますが、それはなぜでしょうか?

コンパイラーはarrayのメンバ関数がメンバ変数を変更していないことはソースコードから
分かるのではないでしょうか?

そういうチェックをするコンパイラを作るのは難しいからということでしょうか?
0450デフォルトの名無しさん
垢版 |
2018/04/06(金) 18:16:26.47ID:CDFchtjR
const メンバ関数の中でメンバ変数の内容を変更しているとコンパイルエラーになります。

ということはどのみちメンバ変数を変更しているかどうかはチェック可能ということですよね?
0451デフォルトの名無しさん
垢版 |
2018/04/06(金) 18:17:58.47ID:KjpzCJso
void Show(IntArray& const array)
0452デフォルトの名無しさん
垢版 |
2018/04/06(金) 19:04:45.09ID:zGB1Hjc3
>>449
コンパイル単位を越えたらチェックするのは難しいし言語の壁を越えたら不可能に近いから
中途半端な事をするくらいならconst明示されてるかという線引きの方が分かり易い
0453デフォルトの名無しさん
垢版 |
2018/04/06(金) 19:43:28.40ID:EFVHWowI
>>449
難しいというか不可能だからですよ
呼び出す関数はまだコンパイルされてないかもしれないしまだソースコードもないかもしれない
0454デフォルトの名無しさん
垢版 |
2018/04/07(土) 02:18:30.08
>>449
メンバ変数を変更しないなら素直にメンバ関数にconst付けれや
0455デフォルトの名無しさん
垢版 |
2018/04/07(土) 12:11:18.49ID:BRhgC8GS
コンタミュ連鎖地獄ω
0456デフォルトの名無しさん
垢版 |
2018/04/08(日) 06:44:19.17ID:fQMOYFpe
>>449-450 の質問者は、分割コンパイルにまだ慣れてないと思えるなぁ。
ソースファイルを分けてみればピンと来るかと。

片方をソースなしのオブジェクトやライブラリにしないとダメかな。
0457デフォルトの名無しさん
垢版 |
2018/04/08(日) 07:56:39.59ID:peS6i82l
C#のフォームからオフィスを立ち上げ、オフィスを終了したら立ち上げたフォームに
戻るようにするにはどうした出来ますか?
0459デフォルトの名無しさん
垢版 |
2018/04/08(日) 08:13:28.62ID:peS6i82l
そんなことは当たり前ですね。その方法が説明できますか?
0461デフォルトの名無しさん
垢版 |
2018/04/08(日) 08:29:30.70ID:fQMOYFpe
C#のことはC#のスレッドで尋ねればいいでしょ、てお話。
C/C++のスレッドに質問を持ち込むより確実で早いと思うよ。
0462デフォルトの名無しさん
垢版 |
2018/04/08(日) 08:37:40.87ID:peS6i82l
あ、ごめん。++が#に見えた。でも普通は++を#に書き間違ったんだろうと判断すると
思うが。
0463デフォルトの名無しさん
垢版 |
2018/04/08(日) 08:39:38.92ID:peS6i82l
ところでC++のフォームからオフィスを立ち上げ、オフィスを終了したら立ち上げたフォームに
戻るようにするにはどうした出来ますか?
0466デフォルトの名無しさん
垢版 |
2018/04/08(日) 08:56:58.76ID:peS6i82l
>>465 thanks yey!
0468デフォルトの名無しさん
垢版 |
2018/04/08(日) 09:14:13.86ID:peS6i82l
>>464
it is conditional on your ability, although its mean applying in the case of a usual Japanese.
0470デフォルトの名無しさん
垢版 |
2018/04/08(日) 09:44:32.26ID:nHJNjK41
main関数の中でstaticを使う意味は何でしょうか?

ロベールの本のpp.318-319にそのような例が出てきて意味不明です。
0472デフォルトの名無しさん
垢版 |
2018/04/08(日) 11:47:04.28ID:fQMOYFpe
ロベールの本を持ってないんで、適切な回答じゃないかもしれんが。

main() 関数の中でstatic変数を使う意味といえば、
単純型の初期化の処理時間を回避したいか、
セクション(変数のメモリ配置)の説明のためか、
「staticなインスタンスのコンストラクタはmain()より前に実行される」
ていう話の前フリかなぁ。
0473はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/04/08(日) 13:50:30.74ID:RvzgDq0H
>>472
ローカル変数に static 変数が付いていた場合は最初に通過したときに初期化されるルール。
(コンストラクタもそのときに走る。)
これは C のときから変わってないよ。
0474デフォルトの名無しさん
垢版 |
2018/04/08(日) 14:41:24.43ID:b4O4Usd0
普通に考えると、
単にスコープをローカルにしたいってのがまず考えられる
0475デフォルトの名無しさん
垢版 |
2018/04/08(日) 14:46:24.29ID:drN9+cfC
>>473
横からだけど訂正乙
初心者が読んで間違えて覚えるので、初心者スレでは嘘を書かないように特に気をつける必要ある
0476デフォルトの名無しさん
垢版 |
2018/04/08(日) 15:12:26.18ID:nkM5b3tX
>>474
mainの中だから意味無い

っつーかstaticは二つの意味があって全然別物
スコープと性的と混ぜるな危険
0478デフォルトの名無しさん
垢版 |
2018/04/08(日) 15:20:01.32ID:drN9+cfC
>>474
関数内でstatic変数を使うのは静的変数のスコープを関数ローカルにしたいからでは、
というごく当たり前の文意だろ普通に読むと。

どう読むと
関数内だからファイルローカルの話とか関係ない!勘違いするな!となるんだよ
自分以外は文法もセマンティックもろくに知らないという前提はやめるべき
0481472
垢版 |
2018/04/09(月) 08:00:59.66ID:4Qmw3/oH
関数スコープのstaticなクラス・インスタンスのコンストラクタは
main()以前でなく、最初にその部分が実行されたときに初期化されるんだっけか。

static なら一律にmain()の前、基本型や単純な構造体のstaticはロード時に初期化、
だと勘違いしていた。
訂正してくれてありがとう。そして間違ったことを書いてすまぬ。
0482デフォルトの名無しさん
垢版 |
2018/04/09(月) 08:28:16.55ID:arNj8dw4
初期化が固定データのメモリコピーで済むものはロード時に初期化するコンパイラが普通
0484デフォルトの名無しさん
垢版 |
2018/04/09(月) 15:10:57.47ID:cuDt6une
>>480

ありがとうございます。本とは内容が違うようです。

int main() {
static const double ARRAY1[] = {1, 2, 3, -1};
static const double ARRAY2[] = {0.5, 1.5, ,-1};
static const double ARRAY3[] = {-1};
static const double* const ARRAY[] = {ARRAY1, ARRAY2, ARRAY3};


}

というコードが該当箇所です。
0485片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2018/04/09(月) 15:13:59.63ID:4wbW7ji0
staticを付けなければスタックに確保されるかもしれない。その場合、どうしても遅くなる。
0486デフォルトの名無しさん
垢版 |
2018/04/09(月) 15:16:14.76ID:cuDt6une
>>485

でも、速さがどうとかいうことについては何も書いていないんです。
staticを付けていることについては何の説明もありません。
0487デフォルトの名無しさん
垢版 |
2018/04/09(月) 15:31:05.83ID:iBEYls0Z
>>486
>>485はきちんとした回答だと思うよ。
配列が大きくなれば顕著になる。
「その本に書かれていないから」と拒絶するのは憲法に基づいて自由だけど
0488デフォルトの名無しさん
垢版 |
2018/04/09(月) 15:38:58.45ID:7w9BViIO
定数だからstatic constにした
というだけのことでそれ以上の意味はないと思うが
0489デフォルトの名無しさん
垢版 |
2018/04/09(月) 15:39:52.73ID:Cpp6LEO8
その変数をコンパイル時点で確定しようとしている。
ローディング時間も早くなる
■ このスレッドは過去ログ倉庫に格納されています

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