【初心者歓迎】C/C++室 Ver.103【環境依存OK】

1デフォルトの名無しさん2018/07/01(日) 03:44:53.53ID:4MMF8cDN
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります

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

前スレ
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/

464はちみつ餃子 ◆8X2XSCHEME 2018/10/03(水) 02:06:15.76ID:jiQInXAP
>>463
仲間内で使うためのツールとして作ったので公開はしていない。

465デフォルトの名無しさん2018/10/04(木) 00:21:59.55ID:C6FTp/Pz
windows 10 でmingw5.3使ってて

#include <clocale>
#include <regex>
int main() {
std::setlocale(LC_ALL, "");
std::regex reg("^ [cC]");
return 0;
}

これでbad_allocが発生するんだけど、なんかだめなの?

466デフォルトの名無しさん2018/10/04(木) 07:26:56.12ID:TASd8bzQ
ファイルに書き込みを行うプログラムの章を勉強中なんですが
実行してもtextファイルに変化ありません…
visualstudioと同じフォルダに入れてもなんとも無い
どうすれば書き込み出来るんですか?
http://codepad.org/IJwmFcAD

467さまよえる蟻人間 ◆T6xkBnTXz7B0 2018/10/04(木) 07:37:56.66ID:MLculXgy
>>466
すでに開かれていて排他ロックがかかってるかも。
書き込めないフォルダかも。

468さまよえる蟻人間 ◆T6xkBnTXz7B0 2018/10/04(木) 07:39:02.67ID:MLculXgy
テキストエディタが排他ロックをすることがある。

469デフォルトの名無しさん2018/10/04(木) 07:46:06.55ID:TASd8bzQ
>>467
ありがとうございます
確認で…https://gyazo.com/475adc0e6966d65477f0702b17202ab4 これで書き込みできる準備は出来ていますよね?
せっかくなので書き込み出来るようにしてこの章を終えたいんですが(´Д`)

470デフォルトの名無しさん2018/10/04(木) 09:43:58.74ID:knyldx34
>>469
その指定だと実行ファイルと同じ場所にtxtできてない?

471デフォルトの名無しさん2018/10/04(木) 16:40:22.50ID:TASd8bzQ
>>470
出来てないです。自分でデスクトップで作成したtest,txtファイルをフォルダに入れました
同名のファイルに書き込みが出来るプログラムかと思ってたのですがもしかして勘違いしてますか…?

472デフォルトの名無しさん2018/10/04(木) 16:45:04.26ID:qnqRQVWC
>>470
ファイルを絶対パスではなく相対パスで指定した場合は
プログラムを実行した時の作業ディレクトリが基準になる

473デフォルトの名無しさん2018/10/04(木) 17:45:40.20ID:TASd8bzQ
普通にプロジェクトと同じフォルダに出来てました。ありがとうございます
自分で作ったtxtファイルに書き込みがされるのかと思ってました…

474デフォルトの名無しさん2018/10/04(木) 18:52:20.74ID:knyldx34
>>473
それだと同名のファイルが全て上書きされてしまうからな

475はちみつ餃子 ◆8X2XSCHEME 2018/10/04(木) 20:10:36.56ID:1wg41Y30
>>465
mingw の setlocale は msvcrt の setlocale で、
空文字で呼出すとシステムにセットされているロケールになるんだけど、
日本語環境だともちろん日本語がセットされる。

で、どうにも std::regex はマルチバイト系の文字符号には対応してないっぽい。
英語、フランス語、ドイツ語とかで試すと問題なかったが、
日本語、中国語、韓国語で試すと bad_alloc になる。
bad_alloc になるのが意図的な動作なのかどうかわかんないけど。

std::wregex を使う分には日本語ロケールでも例外にはらない。

476デフォルトの名無しさん2018/10/05(金) 18:01:44.43ID:X1kF7PG7
クラスの宣言に下記のように書いたらエラーになりました

class test
{
char c[] = "abc";
}

このcという文字列はこのクラスの中でずっと定数として固定で使うのが目的です
class宣言部では宣言できないのでしょうか。どうしたらいいですか
char *c; とだけして、クラスのコンストラクタでnewで作るとか、定数なのでそんなことはしたくないのですが

477デフォルトの名無しさん2018/10/05(金) 18:17:00.47ID:3qR/q5rp
static constexpr char c[] = "abc";

478はちみつ餃子 ◆8X2XSCHEME 2018/10/05(金) 18:21:51.16ID:Cnw78CfH
今どきは必要ないだろうけど、
古い仕様 (C++03) だとこう。

class test
{
static const char c[];
};

const char test::c[] = "abc";

479デフォルトの名無しさん2018/10/05(金) 18:43:28.91ID:X1kF7PG7
>>478
ありがとう。今どきは必要ないっていうのが気になりますが、今ではもっと他の方法があるということですか
C++の最新仕様では他の方法があるのでしょうか

480デフォルトの名無しさん2018/10/05(金) 18:44:21.08ID:X1kF7PG7
ああ、それがconstexprってやつですか。 これは初めてみます

481デフォルトの名無しさん2018/10/05(金) 19:26:12.63ID:X1kF7PG7
できました。ありがとうございました。

482デフォルトの名無しさん2018/10/06(土) 15:18:56.24ID:n32kY+69
clsA a;
clsA b;
clsA c;
clsA *h[] = {&a, &b, &c};
void main{
h[0]->mfunc();
}
クラス配列のメンバー関数を呼び出すところでセグメントエラーになるんだが、なぜできないの?

483デフォルトの名無しさん2018/10/06(土) 15:54:02.13ID:G/WcE1FD
できますん

484デフォルトの名無しさん2018/10/06(土) 16:27:51.24ID:Gg92+MKo
普通に呼び出せるけど?
お前さんの書いてるメンバ関数がおかしいんじゃね?
https://ideone.com/EE6GhY

485デフォルトの名無しさん2018/10/06(土) 16:46:18.35ID:5XBjQGBu
こんなのを見つけました。 下記でここってかいてある1行を書かないとエラーになります。ラベルの次に直接 } は来たらダメなのですか
}の直前にジャンプって出来ないのでしょうか
ここでfuncxは、funcx( CString& s, CString& sHit )となっています。sを与え小さくなっていきます
またこれでgotoを使わないようにはどう書けばいいでしょうか
これが楽なのでgotoを使っちゃいましたけど
コンパイラーは昔のVC++6.0です

CString ret, sHit;
do{
ret = func1( s, sHit );
if( sHit != "" ) goto label;
ret = func2( s, sHit );
if( sHit != "" ) goto label;
ret = func3( s, sHit );
if( sHit != "" ) goto label;
ret = func4( s, sHit );
if( sHit != "" ) goto label;
label:
ret = ret; <---- ここ !
}while( ret == "" && s != "" );

486デフォルトの名無しさん2018/10/06(土) 16:49:21.57ID:eKUUdPRJ
もう一方のトリップは使うのやめたの?

487デフォルトの名無しさん2018/10/06(土) 17:29:07.42ID:5XBjQGBu
ああ、goto labelのところ、continueでいいのか
forだけじゃなくwhileが後ろにくるパターンでも使えるのですね
でも、 label: が ) の前に使えないってのはなんででしょうね

488デフォルトの名無しさん2018/10/06(土) 17:31:40.03ID:5XBjQGBu
continueは、 { } の最後に飛ぶのではなく頭に飛ぶものだと思ってましたが、 
コンパイラは、} の方に飛ぶようにつくるのですね。 for でもそうなのか。 頭に飛ぶものと思ってました

489デフォルトの名無しさん2018/10/06(土) 17:55:44.09ID:FAIH8E2E
> ret = ret; <---- ここ !

ちなみにコレ
なにやってんの

490デフォルトの名無しさん2018/10/06(土) 18:05:27.90ID:5XBjQGBu
だから、それを入れないとエラーになるのですよ

491デフォルトの名無しさん2018/10/06(土) 18:06:58.86ID:5XBjQGBu
今気づいたけど、 ; を入れるだけでもいいのか

492デフォルトの名無しさん2018/10/06(土) 18:10:02.18ID:FAIH8E2E
要するにになにもしたくなかったワケか
だったら余計なことしないで空文でいい

493デフォルトの名無しさん2018/10/06(土) 18:12:36.42ID:5XBjQGBu
>>492
ありがとう。 } の直前にジャンプしたかっただけです。 で、 label: と コロンでとめるとエラーになったので
ダミー文と入れました。 やってないけど、 セミコロンだけでよかったのですね

4944522018/10/09(火) 17:17:22.89ID:JymqGv4u
>>関数へのポインタの利用用途がスラスラと言えるレベルで中級
と書いてしまいましたが誤りでした
正しくは、以下でした

Cプログラミング診断室
第2章 これでもプロ ポインタ
より
C言語中級レベル認定問題
関数へのポインタの配列とはどういうもので、どういう使い方があるでしょうか。

藤原先生の名誉のためにも訂正しておきます
スレ汚し失礼しましたm(_ _)m

495デフォルトの名無しさん2018/10/11(木) 17:09:46.75ID:6FntMPLi
std::tuple<hoge, fuga>
std::tuple<hoge, hage, ...>
std::tuple<fuga, hoge, hage, ...>
という具合に<>の中が何パターン(ほぼ無限)もある場合

template<typename T>と
std::tuple<T>
で代表させるみたいなこと出来ますか?

出来るなら
template<typename *>
std::tuple<*>
こんな感じが嬉しいです

496はちみつ餃子 ◆8X2XSCHEME 2018/10/11(木) 17:17:29.95ID:PBtwUpWj
>>495
やりたいことがよくわからんけど……。
欲しいのは variadic template かな?

497デフォルトの名無しさん2018/10/11(木) 17:26:33.96ID:6FntMPLi
ありがとうございます!
勉強してきます!!!

498デフォルトの名無しさん2018/10/12(金) 10:08:09.64ID:46Wm2YVF
MSVC 専用らしいのですが
_For_each_tuple_element の引数として指定されたλ関数の中で
_For_each_tuple_element を呼ぶ前に宣言した変数にアクセスするにはどうすれば良いですか


int i = 0;
std::_For_each_tuple_element(tuplevaluse, [](auto&& v){
fprintf(stdout, "%d: ", i++); // ← ここの i でエラー
fprintf(stdout, "%d\n", (int)v);
});

499デフォルトの名無しさん2018/10/12(金) 10:21:25.26ID:46Wm2YVF
解決しました

int i = 0;
std::_For_each_tuple_element(tuplevaluse, [&i](auto&& v){
fprintf(stdout, "%d: ", i++);
fprintf(stdout, "%d\n", (int)v);
});

500デフォルトの名無しさん2018/10/14(日) 10:27:05.28ID:eBgdRWtd
VC++6.0 MFCを使っています。

数秒間、処理を止めたいのですが、C言語のsleepという関数がありますが、これを使うのが一般的なのでしょうか
心配なのは、これを使って10秒とか時間を止めると、その間CPU時間が100%になったりしないのかという点です。
MFC環境で上手に処理を止めるのにはどうしたらいいのでしょうか。 OnTimerを使うとかしないとダメですか

501デフォルトの名無しさん2018/10/14(日) 11:05:53.59ID:eBgdRWtd
自己解決
MFCで、sleepという関数は使えませんでした
その代り、Sleepという関数が提供されていました

502デフォルトの名無しさん2018/10/14(日) 12:48:33.48ID:gKOdVSwA
>>501
MFCに限らず、UIスレッドの関数内で10秒もSleepで待つのはダメ。
そのウィンドウをユーザーが操作したら「応答なし」と表示されてしまう。

OnTimerで定期的に監視し続けるなり、
独自のメッセージを送って終了を通知するなりしないと。

もちろん、その間は
×ボタンを含めてすべてのコントロールを操作不可にしたり、
ユーザーが閉じられない別ダイアログをモーダルで出したりする対応も必要。

503デフォルトの名無しさん2018/10/14(日) 13:21:17.04ID:G4e8iFcg
いまどきのSleepは他プロセスを止めたりはしないぞ

504デフォルトの名無しさん2018/10/14(日) 14:29:07.08ID:bkAbhEU5
(話が噛み合ってないけど傍観しよう…)

505デフォルトの名無しさん2018/10/14(日) 15:51:12.23ID:P/xWUWOY
アホか
>>503>>500宛だろ

506デフォルトの名無しさん2018/10/14(日) 16:30:02.81ID:nFpB0nHw
本来ダメなんだけどエクセルとかも盛大にUIスレッドで長期間マクロ実行したりするからね
数秒くらいならいいんじゃないの
金とってプログラム作ってる風でもないし

507デフォルトの名無しさん2018/10/14(日) 16:40:58.09ID:qQZu4oFT
>>506
Sleepで待ちたくなるということは、処理自体は
別スレッドなり別プロセスなりで動いているのだと思ったが

508デフォルトの名無しさん2018/10/14(日) 16:46:29.33ID:nFpB0nHw
俺はメインスレッドでそのまま何かやってると感じたな
sleep の挙動を5ちゃんで質問する人がすでにワーカスレッドを使ってるとは全く想定しなかった

509デフォルトの名無しさん2018/10/15(月) 07:13:26.05ID:VdTb4WVU
本人解決したと言ってるのにいつまでもマウント取りたがってんじゃねーよ

510デフォルトの名無しさん2018/10/15(月) 07:41:31.34ID:klZR/UFz
>>508
へーすごいねー

511デフォルトの名無しさん2018/10/15(月) 07:46:47.81ID:PSoKrj1X
なんかえらい反感買っちゃったな
Sleep知らなくてもワーカスレッドは使ってるだろうという>>507の方が普通の感覚なのかな

512デフォルトの名無しさん2018/10/15(月) 10:28:47.73ID:/DZZgAIK
みなさん判りましたか
条件後出しするとこうなります

513デフォルトの名無しさん2018/10/15(月) 11:18:21.50ID:/mdlwLZy
そうなの。詳しいな

514デフォルトの名無しさん2018/10/15(月) 13:36:44.47ID:BkxplBJy
むしろ本人説

新着レスの表示
レスを投稿する