エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります
コードを貼れる所
http://codepad.org/
https://ideone.com/
前スレ
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
2018/07/01(日) 03:44:53.53ID:4MMF8cDN
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が発生するんだけど、なんかだめなの?
#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
実行してもtextファイルに変化ありません…
visualstudioと同じフォルダに入れてもなんとも無い
どうすれば書き込み出来るんですか?
http://codepad.org/IJwmFcAD
467さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/10/04(木) 07:37:56.66ID:MLculXgy468さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/10/04(木) 07:39:02.67ID:MLculXgy テキストエディタが排他ロックをすることがある。
469デフォルトの名無しさん
2018/10/04(木) 07:46:06.55ID:TASd8bzQ >>467
ありがとうございます
確認で…https://gyazo.com/475adc0e6966d65477f0702b17202ab4 これで書き込みできる準備は出来ていますよね?
せっかくなので書き込み出来るようにしてこの章を終えたいんですが(´Д`)
ありがとうございます
確認で…https://gyazo.com/475adc0e6966d65477f0702b17202ab4 これで書き込みできる準備は出来ていますよね?
せっかくなので書き込み出来るようにしてこの章を終えたいんですが(´Д`)
470デフォルトの名無しさん
2018/10/04(木) 09:43:58.74ID:knyldx34 >>469
その指定だと実行ファイルと同じ場所にtxtできてない?
その指定だと実行ファイルと同じ場所にtxtできてない?
471デフォルトの名無しさん
2018/10/04(木) 16:40:22.50ID:TASd8bzQ472デフォルトの名無しさん
2018/10/04(木) 16:45:04.26ID:qnqRQVWC473デフォルトの名無しさん
2018/10/04(木) 17:45:40.20ID:TASd8bzQ 普通にプロジェクトと同じフォルダに出来てました。ありがとうございます
自分で作ったtxtファイルに書き込みがされるのかと思ってました…
自分で作った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 を使う分には日本語ロケールでも例外にはらない。
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で作るとか、定数なのでそんなことはしたくないのですが
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";
古い仕様 (C++03) だとこう。
class test
{
static const char c[];
};
const char test::c[] = "abc";
479デフォルトの名無しさん
2018/10/05(金) 18:43:28.91ID:X1kF7PG7480デフォルトの名無しさん
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();
}
クラス配列のメンバー関数を呼び出すところでセグメントエラーになるんだが、なぜできないの?
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+MKo485デフォルトの名無しさん
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 != "" );
}の直前にジャンプって出来ないのでしょうか
ここで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: が ) の前に使えないってのはなんででしょうね
forだけじゃなくwhileが後ろにくるパターンでも使えるのですね
でも、 label: が ) の前に使えないってのはなんででしょうね
488デフォルトの名無しさん
2018/10/06(土) 17:31:40.03ID:5XBjQGBu continueは、 { } の最後に飛ぶのではなく頭に飛ぶものだと思ってましたが、
コンパイラは、} の方に飛ぶようにつくるのですね。 for でもそうなのか。 頭に飛ぶものと思ってました
コンパイラは、} の方に飛ぶようにつくるのですね。 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: と コロンでとめるとエラーになったので
ダミー文と入れました。 やってないけど、 セミコロンだけでよかったのですね
ありがとう。 } の直前にジャンプしたかっただけです。 で、 label: と コロンでとめるとエラーになったので
ダミー文と入れました。 やってないけど、 セミコロンだけでよかったのですね
494452
2018/10/09(火) 17:17:22.89ID:JymqGv4u >>関数へのポインタの利用用途がスラスラと言えるレベルで中級
と書いてしまいましたが誤りでした
正しくは、以下でした
Cプログラミング診断室
第2章 これでもプロ ポインタ
より
C言語中級レベル認定問題
関数へのポインタの配列とはどういうもので、どういう使い方があるでしょうか。
藤原先生の名誉のためにも訂正しておきます
スレ汚し失礼しましたm(_ _)m
と書いてしまいましたが誤りでした
正しくは、以下でした
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<*>
こんな感じが嬉しいです
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:PBtwUpWj497デフォルトの名無しさん
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);
});
_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);
});
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を使うとかしないとダメですか
数秒間、処理を止めたいのですが、C言語のsleepという関数がありますが、これを使うのが一般的なのでしょうか
心配なのは、これを使って10秒とか時間を止めると、その間CPU時間が100%になったりしないのかという点です。
MFC環境で上手に処理を止めるのにはどうしたらいいのでしょうか。 OnTimerを使うとかしないとダメですか
501デフォルトの名無しさん
2018/10/14(日) 11:05:53.59ID:eBgdRWtd 自己解決
MFCで、sleepという関数は使えませんでした
その代り、Sleepという関数が提供されていました
MFCで、sleepという関数は使えませんでした
その代り、Sleepという関数が提供されていました
502デフォルトの名無しさん
2018/10/14(日) 12:48:33.48ID:gKOdVSwA >>501
MFCに限らず、UIスレッドの関数内で10秒もSleepで待つのはダメ。
そのウィンドウをユーザーが操作したら「応答なし」と表示されてしまう。
OnTimerで定期的に監視し続けるなり、
独自のメッセージを送って終了を通知するなりしないと。
もちろん、その間は
×ボタンを含めてすべてのコントロールを操作不可にしたり、
ユーザーが閉じられない別ダイアログをモーダルで出したりする対応も必要。
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/xWUWOY506デフォルトの名無しさん
2018/10/14(日) 16:30:02.81ID:nFpB0nHw 本来ダメなんだけどエクセルとかも盛大にUIスレッドで長期間マクロ実行したりするからね
数秒くらいならいいんじゃないの
金とってプログラム作ってる風でもないし
数秒くらいならいいんじゃないの
金とってプログラム作ってる風でもないし
507デフォルトの名無しさん
2018/10/14(日) 16:40:58.09ID:qQZu4oFT508デフォルトの名無しさん
2018/10/14(日) 16:46:29.33ID:nFpB0nHw 俺はメインスレッドでそのまま何かやってると感じたな
sleep の挙動を5ちゃんで質問する人がすでにワーカスレッドを使ってるとは全く想定しなかった
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の方が普通の感覚なのかな
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 むしろ本人説
515デフォルトの名無しさん
2018/10/21(日) 19:42:24.72ID:zGGokTqn tupleの要素取り出すときstd::get<>以外の方法ありますか?
tuple[index]みたいに取り出せたら良いんですけど
tuple[index]みたいに取り出せたら良いんですけど
516さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/10/21(日) 19:58:45.33ID:nRIFUd/K テンプレート特殊化を使えば出来るけど、そういうのは汚いコードだね。
517デフォルトの名無しさん
2018/10/22(月) 16:17:14.28ID:H1W4+XYR >>515
tuple の要素が char * だとして
std::vector<char *> vec;
int i = 0;
std::_For_each_tuple_element(t, [&h, &i](auto&& v){
printf("%d: %s\n", i++, v);
vec.push_back(v);
});
tuple の要素が char * だとして
std::vector<char *> vec;
int i = 0;
std::_For_each_tuple_element(t, [&h, &i](auto&& v){
printf("%d: %s\n", i++, v);
vec.push_back(v);
});
518デフォルトの名無しさん
2018/10/22(月) 16:18:27.73ID:H1W4+XYR ああ
色々間違ってるけど適当に読み替えてくれ
色々間違ってるけど適当に読み替えてくれ
519デフォルトの名無しさん
2018/10/22(月) 18:32:15.28ID:N4Dlk9u9 std::apply 呼んだ方が良いかな
520デフォルトの名無しさん
2018/10/22(月) 18:56:43.86ID:2ulzHApM521デフォルトの名無しさん
2018/10/23(火) 08:46:28.85ID:0c85p6oM すごく初級の質問なんですが、
int * x =3;
auto y=*x;
としたときに、コンパイラがyの型をintと推測するのはなぜでしょうか?
ポインタのポインタになるので、最初の*でint型の変数のアドレスを示すことになるまでは分かるのですが、
その後の*でアドレスのアドレス?を指すことになるので、元のint型の値を指すのは違うように思えてしまいます。
int * x =3;
auto y=*x;
としたときに、コンパイラがyの型をintと推測するのはなぜでしょうか?
ポインタのポインタになるので、最初の*でint型の変数のアドレスを示すことになるまでは分かるのですが、
その後の*でアドレスのアドレス?を指すことになるので、元のint型の値を指すのは違うように思えてしまいます。
522デフォルトの名無しさん
2018/10/23(火) 08:57:12.64ID:el+h+kWN x は 0x00000003をアドレスとして認識
y(*x) は int型アドレス0x00000003にある値を指す
アドレス(x)のアドレスを指す場合は &x になる
y(*x) は int型アドレス0x00000003にある値を指す
アドレス(x)のアドレスを指す場合は &x になる
523デフォルトの名無しさん
2018/10/23(火) 11:21:13.83ID:1h9PfZX9 多分、変数yの型が省略されているから、
デフォルトのintと推定して処理しているのだろう
デフォルトのintと推定して処理しているのだろう
524デフォルトの名無しさん
2018/10/23(火) 12:10:40.16ID:joSIbJ7d ここ内容C++なんだけど何で化けてるん
http://www.booran.com/menu/cplus/ope_overload.html
http://www.booran.com/menu/cplus/ope_overload.html
525デフォルトの名無しさん
2018/10/23(火) 12:26:32.22ID:0c85p6oM >>522
ありがとうございます。
ということは*がついてる変数は、変数がアドレスのときはそのアドレスに収納されてる値を指し、変数がアドレスに収納されてる値のときは、そのアドレスを指すという理解でよろしいんでしょうか?
ありがとうございます。
ということは*がついてる変数は、変数がアドレスのときはそのアドレスに収納されてる値を指し、変数がアドレスに収納されてる値のときは、そのアドレスを指すという理解でよろしいんでしょうか?
526デフォルトの名無しさん
2018/10/23(火) 12:51:45.73ID:wh2qZljY >>525
違うよ。
型名の一部としての*と、式の中の演算子としての*が別物だと言うのは分かる?
1行目の方は「intをさすポインタ」という型を表すためのもの。
2行目は「xというint型の変数の値に対して、その値が指しているメモリ領域上にあるint型の値を参照する」という演算を行うというもの。
違うよ。
型名の一部としての*と、式の中の演算子としての*が別物だと言うのは分かる?
1行目の方は「intをさすポインタ」という型を表すためのもの。
2行目は「xというint型の変数の値に対して、その値が指しているメモリ領域上にあるint型の値を参照する」という演算を行うというもの。
527デフォルトの名無しさん
2018/10/23(火) 13:02:04.09ID:LNtdy1l4 この変数はポインタです 宣言の *
ポインタで指している先の内容を得ます 式の *
ポインタで指している先の内容を得ます 式の *
528デフォルトの名無しさん
2018/10/23(火) 13:13:20.29ID:d9/C5RHb C++コードの部分を間違って読み込んだとか?
エンコードはEUC-JPだね
エンコードはEUC-JPだね
529デフォルトの名無しさん
2018/10/23(火) 14:23:01.94ID:LNtdy1l4 Firefox だと右上メニューからエンコーディングで明示的に EUC-JP 指示で化け解消
(unicode にチェックが入ってたが、自動だとそっちに誤爆判別してた?)
Chrome での明示的なエンコーディング変更は拡張プラグインつっこまないとできないっぽい
(unicode にチェックが入ってたが、自動だとそっちに誤爆判別してた?)
Chrome での明示的なエンコーディング変更は拡張プラグインつっこまないとできないっぽい
530はちみつ餃子 ◆8X2XSCHEME
2018/10/23(火) 16:21:42.79ID:L3KABBTH C/C++ のポインタの表現が分かり難いってのは確かにあると思う。
宣言のときも * は変数名の側にくっついているものと考えれば理解しやすいんじゃないかな。
int * x; と宣言したとき、 *x が int であるような x を宣言したことになる。
宣言のときも * は変数名の側にくっついているものと考えれば理解しやすいんじゃないかな。
int * x; と宣言したとき、 *x が int であるような x を宣言したことになる。
531デフォルトの名無しさん
2018/10/23(火) 16:53:31.99ID:yFsvvFWj Cの頃は
int *hoge;
と書くことが多かったのに、
C++になってから
int* hoge;
と書く人が増えた。
悪い習慣だと思う。
int *hoge;
と書くことが多かったのに、
C++になってから
int* hoge;
と書く人が増えた。
悪い習慣だと思う。
532デフォルトの名無しさん
2018/10/23(火) 17:02:30.81ID:oFF/C26V Javaとかから入る人が増えたからかね?
その習慣はあかん。
ポインタは型じゃないから、例えば
int* a,b;
って書くとaは「int型のポインタ」で、bは「int型の変数」になる。
その習慣はあかん。
ポインタは型じゃないから、例えば
int* a,b;
って書くとaは「int型のポインタ」で、bは「int型の変数」になる。
533デフォルトの名無しさん
2018/10/23(火) 17:05:53.09ID:J7zWeAP4 ハゲのせい
534はちみつ餃子 ◆8X2XSCHEME
2018/10/23(火) 18:09:41.43ID:L3KABBTH >>532
いや、そこらへんは C/C++ のおかしなところで、ポインタはあくまでも型だ。
その上で文法上は * は変数名の側と結合するの。
もういっそ
std::add_pointer<int> a, b;
のスタイルを普及させればいいんじゃないのかなーと思う。
C++ だとなるべくスマートポインタを使う習慣が出来つつあるから、
その記法とも一貫性があるし。
いや、そこらへんは C/C++ のおかしなところで、ポインタはあくまでも型だ。
その上で文法上は * は変数名の側と結合するの。
もういっそ
std::add_pointer<int> a, b;
のスタイルを普及させればいいんじゃないのかなーと思う。
C++ だとなるべくスマートポインタを使う習慣が出来つつあるから、
その記法とも一貫性があるし。
535デフォルトの名無しさん
2018/10/23(火) 19:19:19.30ID:6eYDBZzc536デフォルトの名無しさん
2018/10/23(火) 19:36:08.31ID:ArZ/Inm7 型変換は (型)式 と書くわけで型を単体で書く書き方はあるのに変数宣言は
型 変数[, 変数]...
じゃないからねえ
void f(void);
void (*f_ptr)(void) = f; // ふむ
void (*g_ptr)(void) = (void(*)(void)) f; // 関数ポインタ型の記法はこうか…
void (*)(void) h_ptr = f; // 型 変数で書いてみた→エラーかい!
みたいな
型 変数[, 変数]...
じゃないからねえ
void f(void);
void (*f_ptr)(void) = f; // ふむ
void (*g_ptr)(void) = (void(*)(void)) f; // 関数ポインタ型の記法はこうか…
void (*)(void) h_ptr = f; // 型 変数で書いてみた→エラーかい!
みたいな
537デフォルトの名無しさん
2018/10/23(火) 19:49:01.78ID:36KTqSlz 初期化リストで二次元配列を0で初期化したいときはどう表記したら良いですか?
538デフォルトの名無しさん
2018/10/23(火) 20:01:35.24ID:ArZ/Inm7 初期値式リストの個数が足りない場合残りの要素は0で初期化されるので
int a[5][6] = {};
でok
int a[5][6] = {};
でok
539デフォルトの名無しさん
2018/10/23(火) 20:47:58.43ID:ZxbJzPkh >>538
CやC++では、ゼロクリアされるのか。されないと思っていたが
CやC++では、ゼロクリアされるのか。されないと思っていたが
540デフォルトの名無しさん
2018/10/23(火) 21:45:29.42ID:1rFbBQfH >>539
Cはされないだろ
Cはされないだろ
541デフォルトの名無しさん
2018/10/23(火) 22:10:00.30ID:cC1ZIpo7 初期化値リストをつければ足りないところは0で埋められる
付けなければ初期化されない
太古から変わらない仕様
付けなければ初期化されない
太古から変わらない仕様
542デフォルトの名無しさん
2018/10/23(火) 22:13:12.65ID:HIyGo7BY あ、でも c だと空の初期化リストは書けないから {} じゃなく {0} にしなきゃダメか
543はちみつ餃子 ◆8X2XSCHEME
2018/10/24(水) 00:07:31.69ID:PadB6FUj >>535
変数宣言の基本的な形式
型指定子 宣言子1, 宣言子2, …;
で言うと * は宣言子の一部ということになるが、
型指定子でないから型 (の一部) ではないというわけではない。
これは文法上の呼び名に過ぎず、
意味論的にはポインタは型の一部だよ。
変数宣言の基本的な形式
型指定子 宣言子1, 宣言子2, …;
で言うと * は宣言子の一部ということになるが、
型指定子でないから型 (の一部) ではないというわけではない。
これは文法上の呼び名に過ぎず、
意味論的にはポインタは型の一部だよ。
544デフォルトの名無しさん
2018/10/24(水) 00:25:51.42ID:shD/xjVg 視点の問題ではあるが宣言の構文上のポインタは型の種類ではなく入れ物の種類ともいえる
int *a, b;
は
int pointer a, int variable b;
を意味する省略構文であり意味論的に
variable:値をいれるもの
pointer:間接的に他の入れ物を指すもの
と区別されてると見ることもできる
int *a, b;
は
int pointer a, int variable b;
を意味する省略構文であり意味論的に
variable:値をいれるもの
pointer:間接的に他の入れ物を指すもの
と区別されてると見ることもできる
545デフォルトの名無しさん
2018/10/24(水) 00:41:21.11ID:ht/B3MxL >>544
そういうのは単純なポインタ(foo*)の時にだけ通じる話で、配列や関数ポインタや引数込みでのそれらの再帰的な組み合わせとかも考えたら、きちんとBNFで理解して型の宣言の構文を定義通りに覚えるのが一番誤解がなくてシンプルだと思うよ。
そういうのは単純なポインタ(foo*)の時にだけ通じる話で、配列や関数ポインタや引数込みでのそれらの再帰的な組み合わせとかも考えたら、きちんとBNFで理解して型の宣言の構文を定義通りに覚えるのが一番誤解がなくてシンプルだと思うよ。
546デフォルトの名無しさん
2018/10/24(水) 00:41:23.34ID:8GMcdoBP >>543レスサンクス
自分でも調べてみた
手元のc99ドラフト版から適当に抜粋
declaration:
declaration-specifiers init-declarator-list ;
declaration-specifiers:
storage-class-specifier declaration-specifiers
type-specifier declaration-specifiers
type-qualifier declaration-specifiers
function-specifier declaration-specifiers
init-declarator-list:
init-declarator
init-declarator-list , init-declarator
init-declarator:
declarator
declarator = initializer
declarator:
pointer direct-declarator
pointer:
* type-qualifier-list
* type-qualifier-list pointer
宣言時の * は declarator なんやね構文としては
自分でも調べてみた
手元のc99ドラフト版から適当に抜粋
declaration:
declaration-specifiers init-declarator-list ;
declaration-specifiers:
storage-class-specifier declaration-specifiers
type-specifier declaration-specifiers
type-qualifier declaration-specifiers
function-specifier declaration-specifiers
init-declarator-list:
init-declarator
init-declarator-list , init-declarator
init-declarator:
declarator
declarator = initializer
declarator:
pointer direct-declarator
pointer:
* type-qualifier-list
* type-qualifier-list pointer
宣言時の * は declarator なんやね構文としては
547デフォルトの名無しさん
2018/10/24(水) 00:47:37.13ID:pa4PW987 >>535
詳しい人とかハードル上げられるとな。。。
プログラミング言語C売っちゃったから、厳密な仕様は記憶の彼方だが、ポインタは厳密なカテゴリ的にもポインタだったと思う。
ここからは私の解釈だが、ポインタはアドレスを入れる「変数」。
当たり前じゃんと言われればそうなんだけど、感覚的にも型というより変数って感じ。
ポインタに型があるとすればOSがアドレスを扱うビット数と同じになる。
intとかの型はポインタが指す先にどの大きさのどういう扱いのデータがあるかを知る為で、ポインタ型そのものの大きさは変わらない。
んで、普通の変数とポインタはCだと大分違うように思うけど、アセンブリ言語だと
LD GR0,TEXT ; 変数TEXTの内容を読む。
LDA GR0,TEXT ; 変数TEXTのアドレスを読む。
程度の違いしか無いわけね。
この場合、内容もアドレスもレジスタが読むけど、Cにレジスタに相当する変数を用意する為にポインタが生まれたんだと思う。
詳しい人とかハードル上げられるとな。。。
プログラミング言語C売っちゃったから、厳密な仕様は記憶の彼方だが、ポインタは厳密なカテゴリ的にもポインタだったと思う。
ここからは私の解釈だが、ポインタはアドレスを入れる「変数」。
当たり前じゃんと言われればそうなんだけど、感覚的にも型というより変数って感じ。
ポインタに型があるとすればOSがアドレスを扱うビット数と同じになる。
intとかの型はポインタが指す先にどの大きさのどういう扱いのデータがあるかを知る為で、ポインタ型そのものの大きさは変わらない。
んで、普通の変数とポインタはCだと大分違うように思うけど、アセンブリ言語だと
LD GR0,TEXT ; 変数TEXTの内容を読む。
LDA GR0,TEXT ; 変数TEXTのアドレスを読む。
程度の違いしか無いわけね。
この場合、内容もアドレスもレジスタが読むけど、Cにレジスタに相当する変数を用意する為にポインタが生まれたんだと思う。
548デフォルトの名無しさん
2018/10/24(水) 00:53:06.37ID:8GMcdoBP549デフォルトの名無しさん
2018/10/24(水) 00:54:55.11ID:pa4PW987 x Cにレジスタに
o CにLDA使用時のレジスタに
o CにLDA使用時のレジスタに
550デフォルトの名無しさん
2018/10/24(水) 01:19:39.17ID:PoD9V6zI carとcdrに付いて小一時間
こちらの方が先だべ
こちらの方が先だべ
551デフォルトの名無しさん
2018/10/24(水) 01:36:02.36ID:uSP3iZ9v >>538
ありがとうございます説明が足りなかったかもしれません
メンバ変数の配列をコンストラクタでリスト初期化する場合どうしたらいいですか?
Hoge::Hoge() : mPiyo(0) ←これの二次元配列版を知りたいのです
ありがとうございます説明が足りなかったかもしれません
メンバ変数の配列をコンストラクタでリスト初期化する場合どうしたらいいですか?
Hoge::Hoge() : mPiyo(0) ←これの二次元配列版を知りたいのです
552はちみつ餃子 ◆8X2XSCHEME
2018/10/24(水) 01:52:38.02ID:PadB6FUj553デフォルトの名無しさん
2018/10/24(水) 10:45:25.32ID:jfcHBGCr >>547
言語実装ベースの思い込みが過ぎる。
言語規格中のポインタは型だし、変数ではない値もあり得るし、ポインタの指す先の型の違いは大きさだけではない。
↓「ポインタ型」で検索して確認されたし。
http://kikakurui.com/x3/X3010-2003-01.html
言語実装ベースの思い込みが過ぎる。
言語規格中のポインタは型だし、変数ではない値もあり得るし、ポインタの指す先の型の違いは大きさだけではない。
↓「ポインタ型」で検索して確認されたし。
http://kikakurui.com/x3/X3010-2003-01.html
554デフォルトの名無しさん
2018/10/24(水) 11:12:54.29ID:uSP3iZ9v555デフォルトの名無しさん
2018/10/24(水) 11:21:48.24ID:wUNs4a59 > void (*)(void) h_ptr = f; // 型 変数で書いてみた→エラーかい!
当然知ってると思うけど
void (*h_ptr)(void) = f;
これは * と () の優先順位が原因だ
よく * と [] で混乱してるひともいるけど
char **hoge;
char *hoge[];
char (*hoge)[123]:
char (*hoge)[]: // エラーかい!
当然知ってると思うけど
void (*h_ptr)(void) = f;
これは * と () の優先順位が原因だ
よく * と [] で混乱してるひともいるけど
char **hoge;
char *hoge[];
char (*hoge)[123]:
char (*hoge)[]: // エラーかい!
556はちみつ餃子 ◆8X2XSCHEME
2018/10/24(水) 11:24:53.60ID:PadB6FUj >>551
今では (C++11 以降では) 宣言時に初期化も書けるから、
struct Hoge {
int a[10][10] = {};
public:
Hoge(void);
};
って感じでも書ける。
複数のコンストラクタがあるときに、
どのコンストラクタが起動したときでも初期化はしないといけないみたいなときには、
この方式で書いた方が何度も同じことを書かなくてよいので面倒くさくなくて良いかも。
今では (C++11 以降では) 宣言時に初期化も書けるから、
struct Hoge {
int a[10][10] = {};
public:
Hoge(void);
};
って感じでも書ける。
複数のコンストラクタがあるときに、
どのコンストラクタが起動したときでも初期化はしないといけないみたいなときには、
この方式で書いた方が何度も同じことを書かなくてよいので面倒くさくなくて良いかも。
557デフォルトの名無しさん
2018/10/24(水) 11:47:35.18ID:uSP3iZ9v558はちみつ餃子 ◆8X2XSCHEME
2018/10/24(水) 11:57:27.21ID:PadB6FUj アセンブラとかから C に入門したら色々と自動化されてて
ありがたいなーってなってポインタで躓いたりしづらいけど、
レイヤが違うという意識を持ってないと変に機械の理屈に引きずられることもある。
言語の理屈だとポインタはアドレスを入れるものじゃなくて、
ポインタを値として見たものをアドレスと呼んだりもするってだけ。
結局はポインタにアドレスが入ってるんだけど、まずポインタありき。
ポインタに対する演算ってのは指す先をいくつ進めるとか、
指す先の間隔がいくつだというものであって、
アドレスを演算して実現するってのは実装上の都合。
アドレスが連続しているということさえ保証はない。
たとえば
char a[2];
とあったときに
(intptr_t)(&a[1])-(intptr_t)(&a[0])
が 1 になることは言語仕様では保証されない。
(これが 1 にならないような変な環境はまず無いと思うんだけど。)
具体的に機械でどう動いているかから見ると肌感覚として理解しやすい場合もあるのはわかるが、
言語の理屈と混同しないように、一旦それは抽象の壁の向こうに押しやる必要もある。
ありがたいなーってなってポインタで躓いたりしづらいけど、
レイヤが違うという意識を持ってないと変に機械の理屈に引きずられることもある。
言語の理屈だとポインタはアドレスを入れるものじゃなくて、
ポインタを値として見たものをアドレスと呼んだりもするってだけ。
結局はポインタにアドレスが入ってるんだけど、まずポインタありき。
ポインタに対する演算ってのは指す先をいくつ進めるとか、
指す先の間隔がいくつだというものであって、
アドレスを演算して実現するってのは実装上の都合。
アドレスが連続しているということさえ保証はない。
たとえば
char a[2];
とあったときに
(intptr_t)(&a[1])-(intptr_t)(&a[0])
が 1 になることは言語仕様では保証されない。
(これが 1 にならないような変な環境はまず無いと思うんだけど。)
具体的に機械でどう動いているかから見ると肌感覚として理解しやすい場合もあるのはわかるが、
言語の理屈と混同しないように、一旦それは抽象の壁の向こうに押しやる必要もある。
559デフォルトの名無しさん
2018/10/25(木) 06:51:43.64ID:GIa2VIfF ラムダ式でthisを指定してそのクラスのメソッドを呼び出したところ、そのクラスのメンバ変数がすべて0になっててコンストラクタも動作してない状態になってたのですが、使い方間違ってますか
560デフォルトの名無しさん
2018/10/25(木) 07:15:13.40ID:kug3Loto561デフォルトの名無しさん
2018/10/25(木) 11:40:30.80ID:5Cy/pQlU562デフォルトの名無しさん
2018/10/25(木) 22:05:25.00ID:GIa2VIfF ラムダ式にはthisを指定しました
インスタンスは生きています
ラムダ式内から直接呼ばずにグローバル変数に保持したインスタンス変数経由で同じメソッドにアクセスしたら正しい値が読み取れました
インスタンスは生きています
ラムダ式内から直接呼ばずにグローバル変数に保持したインスタンス変数経由で同じメソッドにアクセスしたら正しい値が読み取れました
563デフォルトの名無しさん
2018/10/25(木) 22:40:27.12ID:ovezBLdW auto f = [this]() {... };
てな感じにキャプチャはしてるんだよね。してないとコンパイルエラーになるし。
デバッガでみておかしいだけならデバッガがうまく動いてないだけでは?
cout << this->hoge;
とかして見てみたらどうでしょう。
てな感じにキャプチャはしてるんだよね。してないとコンパイルエラーになるし。
デバッガでみておかしいだけならデバッガがうまく動いてないだけでは?
cout << this->hoge;
とかして見てみたらどうでしょう。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 空自機レーダー照射、音声データ公開 中国 [蚤の市★]
- 【熊本】園児に強制性交か 保育所勤務の男を逮捕「性的な欲望が我慢できなかった」警察は余罪を調べる [七波羅探題★]
- 日銀「歴史的」利上げ迫る 35年ぶりの年間上げ幅、0.5%の壁を突破 [蚤の市★]
- 堀江貴文、キャッシュレス非対応の店にモヤッ 『PayPay』立ち上げの人物にまさかの直談判「現金決済しかできないんだけど…」 [冬月記者★]
- 【サッカー】上田綺世の活躍は「一過性」 15戦18発も…オランダ英雄は懐疑的な姿勢「確信に至っていない」 [ゴアマガラ★]
- 【おこめ券】鈴木農相 米価維持の意図「一切ない」★3 [ぐれ★]
- 【悲惨】中国軍が自衛隊に「事前通告」し自衛隊も返答した音声が公開されてしまうwwwこれは高市チェックアウトゕ [597533159]
- 中国の日本向けレアアースの輸出止まる、高市のせいで日本終了のお知らせ [931948549]
- 現役JKのお茶会スレ( ¨̮ )︎︎𖠚ᐝ180
- 🏡
- 韓国政府、高市早苗の「竹島領土」発言にブチギレwwwwwwwwwwwwwwww [834922174]
- 高市早苗「竹島は日本領土」 [834922174]
