エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります
コードを貼れる所
http://codepad.org/
https://ideone.com/
前スレ
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1500329247/
探検
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2017/11/04(土) 16:33:35.07ID:NYxCuvMY662デフォルトの名無しさん
2018/04/24(火) 15:48:30.83ID:Z9G2Fq/H663デフォルトの名無しさん
2018/04/24(火) 18:56:34.08ID:Z9G2Fq/H vector について質問です。
コピーコンストラクタ、operator=
について一応勉強したのですが、 vector などのクラスでは、
コピーコンストラクタや operator= はどうなっているのでしょうか?
コピーコンストラクタ、operator=
について一応勉強したのですが、 vector などのクラスでは、
コピーコンストラクタや operator= はどうなっているのでしょうか?
664デフォルトの名無しさん
2018/04/24(火) 19:23:44.30ID:4uyKjeBM 実際にヘッダ読んで見るしかないと思うが
ディープコピーしてるよとしか
ディープコピーしてるよとしか
665片山博文MZ ◆T6xkBnTXz7B0
2018/04/24(火) 19:27:47.73ID:Eukzbh8y Visual Studioなどでデバッグするとヘッダーが見れるよ。vectorはテンプレートのクラスだから、
読み進めるにはテンプレートの知識が必要かもね。
読み進めるにはテンプレートの知識が必要かもね。
666デフォルトの名無しさん
2018/04/24(火) 19:32:21.39ID:Z9G2Fq/H667デフォルトの名無しさん
2018/04/24(火) 19:40:11.28ID:4uyKjeBM >>666
それはディープコピーのコストがかさむのでおすすめしない
それはディープコピーのコストがかさむのでおすすめしない
668デフォルトの名無しさん
2018/04/24(火) 20:11:58.65ID:Ukt80uX+ >>666
>何も考えず引数で渡しても良いですね
何をもってして「良い」と評価するのかはわかりませんが、
そういうのは拙い知識で独断せずそこら中にある
経験豊富な先人の書いたコードを読んで真似するのがいいですよ
引数は大抵 const 参照で渡しているでしょう
>何も考えず引数で渡しても良いですね
何をもってして「良い」と評価するのかはわかりませんが、
そういうのは拙い知識で独断せずそこら中にある
経験豊富な先人の書いたコードを読んで真似するのがいいですよ
引数は大抵 const 参照で渡しているでしょう
669デフォルトの名無しさん
2018/04/26(木) 01:34:48.58ID:Z7x9U0tp class TestA
{
TestA() {}
~TestA() {}
};
class TestB
{
TestB() {}
~TestB() {}
TestA getA() { return TestA(); }
};
int main() { TestB b; TestA a = b.getA(); }
TestBクラスの getA() メソッドがこのテストコードで正しく動作しているのですが、TestAの
インスタンスは一体どこで作られてるんでしょうか?
TestA getA() { TestA a; return a; }
としないでいきなり reurn TestA() で良い理由が良く分かりませんでした。
{
TestA() {}
~TestA() {}
};
class TestB
{
TestB() {}
~TestB() {}
TestA getA() { return TestA(); }
};
int main() { TestB b; TestA a = b.getA(); }
TestBクラスの getA() メソッドがこのテストコードで正しく動作しているのですが、TestAの
インスタンスは一体どこで作られてるんでしょうか?
TestA getA() { TestA a; return a; }
としないでいきなり reurn TestA() で良い理由が良く分かりませんでした。
670デフォルトの名無しさん
2018/04/26(木) 07:25:57.17ID:E0/AuDcr >>669
どこのメモリにどう作られているのかという質問だと思うけど、
C や C++ では式の値として構造体やオブジェクトが認められていて、
コンパイラがどこぞにメモリを用意して上手いこと作ってくれることになっている。
式や式の一部の値としてだけ現れて変数に格納されないオブジェクトはテンポラリーオブジェクトとか言うので、
詳細はテンポラリーオブジェクトでぐぐって。
>>669
のmain はテンポラリーオブジェクトを使って b を用意せず TestB().getA(); ともかける
ところで今回の質問の、関数の戻り値に関するコンパイラの動作は
「戻り値最適化」なる最適化によって色々複雑なことになっているので
これは自分で戻り値最適化でググって調べて欲しい。
どこのメモリにどう作られているのかという質問だと思うけど、
C や C++ では式の値として構造体やオブジェクトが認められていて、
コンパイラがどこぞにメモリを用意して上手いこと作ってくれることになっている。
式や式の一部の値としてだけ現れて変数に格納されないオブジェクトはテンポラリーオブジェクトとか言うので、
詳細はテンポラリーオブジェクトでぐぐって。
>>669
のmain はテンポラリーオブジェクトを使って b を用意せず TestB().getA(); ともかける
ところで今回の質問の、関数の戻り値に関するコンパイラの動作は
「戻り値最適化」なる最適化によって色々複雑なことになっているので
これは自分で戻り値最適化でググって調べて欲しい。
671デフォルトの名無しさん
2018/04/26(木) 07:37:06.21ID:E0/AuDcr >>669
質問が文法的なことについてだとすると、式中の項ととして
TestA()
std::string("foo")
などのように型名にコンストラタの引数を加えて関数呼び出しのように書くと
テンポラリーオブジェクトを生成してそれを値とする頃ということになる。
例
size_t l = std::string("abc").length();
std::string 型のテンポラリーオブジェクト(中身は"abc") が作られ、
それのメンバ関数 length が呼ばれ、l はその値(3)で初期化される。
質問が文法的なことについてだとすると、式中の項ととして
TestA()
std::string("foo")
などのように型名にコンストラタの引数を加えて関数呼び出しのように書くと
テンポラリーオブジェクトを生成してそれを値とする頃ということになる。
例
size_t l = std::string("abc").length();
std::string 型のテンポラリーオブジェクト(中身は"abc") が作られ、
それのメンバ関数 length が呼ばれ、l はその値(3)で初期化される。
672デフォルトの名無しさん
2018/04/26(木) 11:26:25.34ID:Z7x9U0tp673デフォルトの名無しさん
2018/04/26(木) 14:19:03.06ID:LZqqVlEY 共同ツール 1
https://seleck.cc/685
https://trello.com/
ボードのメニュー → Power-Upsから拡張可能 Slack DropBoxなど
Trello Chrome拡張機能 elegant
ttp://www.kikakulabo.com/service-eft/
trelloのオープンソースあり
共同ツール 2
https://www.google.com/intl/ja_jp/sheets/about/
共同ツール 3
https://slack.com/intl/ja-jp
https://www.dropbox.com/ja/
https://bitbucket.org/
https://ja.atlassian.com/software/sourcetree
https://sketchapp.com/extensions/plugins/
ttp://photoshopvip.net/103903
ttps://goodpatch.com/blog/sketch-plugins/
https://seleck.cc/685
https://trello.com/
ボードのメニュー → Power-Upsから拡張可能 Slack DropBoxなど
Trello Chrome拡張機能 elegant
ttp://www.kikakulabo.com/service-eft/
trelloのオープンソースあり
共同ツール 2
https://www.google.com/intl/ja_jp/sheets/about/
共同ツール 3
https://slack.com/intl/ja-jp
https://www.dropbox.com/ja/
https://bitbucket.org/
https://ja.atlassian.com/software/sourcetree
https://sketchapp.com/extensions/plugins/
ttp://photoshopvip.net/103903
ttps://goodpatch.com/blog/sketch-plugins/
674デフォルトの名無しさん
2018/04/27(金) 13:24:43.31ID:wnXDwKhi for (int i = 0; i < n + 1; ++i) {;}
とやると、 i が n + 1 未満かどうかの判定をする際、毎度
n + 1 を計算してそれを i と比較するということになるので
しょうか?
もし、そうなら、
m = n + 1
for (int i = 0; i < m; ++i) {;}
としたほうがよいのでしょうか?
とやると、 i が n + 1 未満かどうかの判定をする際、毎度
n + 1 を計算してそれを i と比較するということになるので
しょうか?
もし、そうなら、
m = n + 1
for (int i = 0; i < m; ++i) {;}
としたほうがよいのでしょうか?
675はちみつ餃子 ◆8X2XSCHEME
2018/04/27(金) 13:35:12.84ID:GhhThAV7 >>674
ただの整数の足し算程度なら最適化されることが期待できるのであまり気にしなくていい。
ただの整数の足し算程度なら最適化されることが期待できるのであまり気にしなくていい。
676デフォルトの名無しさん
2018/04/27(金) 14:09:53.91ID:ouRrzssA 【マイトLーヤとPS4】 FFとDQの最新作、VR開発は危険、プレーヤーの日常感覚を損なうおそれ
http://rosie.5ch.net/test/read.cgi/liveplus/1524621704/l50
http://rosie.5ch.net/test/read.cgi/liveplus/1524621704/l50
677デフォルトの名無しさん
2018/04/27(金) 18:21:42.79ID:qED012zx https://ideone.com/TVzVzF
上記のコードで、read関数を持ったIReadableクラス(基底クラス)があって、そのクラスから派生したCFileReaderクラス、
直接は派生していないけどread関数を持ったCMemoryReaderクラスがあって、その両方を受け取れるvector<IReadable*>を作りたいのですがコンパイルが通りません。
どうしたらいいでしょうか? どなたか教えてください。。。
上記のコードで、read関数を持ったIReadableクラス(基底クラス)があって、そのクラスから派生したCFileReaderクラス、
直接は派生していないけどread関数を持ったCMemoryReaderクラスがあって、その両方を受け取れるvector<IReadable*>を作りたいのですがコンパイルが通りません。
どうしたらいいでしょうか? どなたか教えてください。。。
678デフォルトの名無しさん
2018/04/27(金) 18:38:42.04ID:yKF4ET93 >>674
いまだに最適化されないコンパイラもあることはある
8bitマイコンとかの話
あと、nがvolatileだと当然毎回計算する
nがSFRだったり複数スレッド共有変数だったりするなら気を付けよう
普通は気にしなくて大丈夫
コンパイラの最適化の基本の基本なので
このループの比較がパフォーマンスに大きく影響するなら
高速化テクニックは色々とある
いまだに最適化されないコンパイラもあることはある
8bitマイコンとかの話
あと、nがvolatileだと当然毎回計算する
nがSFRだったり複数スレッド共有変数だったりするなら気を付けよう
普通は気にしなくて大丈夫
コンパイラの最適化の基本の基本なので
このループの比較がパフォーマンスに大きく影響するなら
高速化テクニックは色々とある
679デフォルトの名無しさん
2018/04/27(金) 19:03:28.59ID:uctWpHV6 >>677
なんとなく互換性のある read を持つものをエンベロープして IReadable になるエンベロープクラスを用いるのはどう?
ifstream も IReadable じゃないからエンベロープする。
https://ideone.com/27yhhu
なんとなく互換性のある read を持つものをエンベロープして IReadable になるエンベロープクラスを用いるのはどう?
ifstream も IReadable じゃないからエンベロープする。
https://ideone.com/27yhhu
680デフォルトの名無しさん
2018/04/27(金) 19:06:52.81ID:O6TOHWbP >>674
> for (int i = 0; i <= n; ++i) {;}
> for (int i = 0; i <= n; ++i) {;}
681デフォルトの名無しさん
2018/04/27(金) 19:18:38.40ID:uctWpHV6 for ループといえばつい手癖で
for (int i =0; i < count-1; ++i ) {...}
と書いてて、
後日に count を int から size_t にしたとき
countが0のケースではまったことがあるなあ
for (int i =0; i + 1 < count; ++i ) {...}
と書けば良いだけなんだけど
for (int i =0; i < count-1; ++i ) {...}
と書いてて、
後日に count を int から size_t にしたとき
countが0のケースではまったことがあるなあ
for (int i =0; i + 1 < count; ++i ) {...}
と書けば良いだけなんだけど
682デフォルトの名無しさん
2018/04/27(金) 19:27:34.55ID:mctUhDKo n+1未満とn以下は違うと思うの
683デフォルトの名無しさん
2018/04/27(金) 19:33:05.63ID:AimUsleE684デフォルトの名無しさん
2018/04/27(金) 19:37:07.17ID:uctWpHV6685デフォルトの名無しさん
2018/04/27(金) 19:37:30.10ID:wnXDwKhi int **a を利用して2次元の動的配列を作ります。
a を関数に渡して、計算に利用します。
2次元配列 a の要素は変更しないので、
int func(const int **a){ ... }
としました。
main 内には以下のように書きました。
ret = func(a);
すると、 a を int** から const int** に変換できませんというエラーが出てしまいます。
これはなぜでしょうか?
a を関数に渡して、計算に利用します。
2次元配列 a の要素は変更しないので、
int func(const int **a){ ... }
としました。
main 内には以下のように書きました。
ret = func(a);
すると、 a を int** から const int** に変換できませんというエラーが出てしまいます。
これはなぜでしょうか?
687デフォルトの名無しさん
2018/04/27(金) 19:49:10.59ID:O6TOHWbP688デフォルトの名無しさん
2018/04/27(金) 19:51:18.26ID:mctUhDKo >>683
そんなにヘンテコでもないと思う
for (size_t count = 0 ; count < 10 ; count++){
for (size_t i = 0 ; i < count - 1 ; i++){
....
}
}
こんなのはありがちかと
そんなにヘンテコでもないと思う
for (size_t count = 0 ; count < 10 ; count++){
for (size_t i = 0 ; i < count - 1 ; i++){
....
}
}
こんなのはありがちかと
689デフォルトの名無しさん
2018/04/27(金) 19:52:51.39ID:mctUhDKo690デフォルトの名無しさん
2018/04/27(金) 20:02:30.96ID:AimUsleE ふむ、なくはないか。
やはり条件の方に+1とか-1とか書くんじゃなくて初期値変える方が素直だろうな。
最適化の下手なコンパイラ対策も含めて。
やはり条件の方に+1とか-1とか書くんじゃなくて初期値変える方が素直だろうな。
最適化の下手なコンパイラ対策も含めて。
691デフォルトの名無しさん
2018/04/27(金) 20:03:21.75ID:O6TOHWbP692片山博文MZ ◆T6xkBnTXz7B0
2018/04/27(金) 20:10:35.47ID:HF3+Vuoy レイアース
693デフォルトの名無しさん
2018/04/27(金) 20:28:24.05ID:wnXDwKhi >>685
具体的なコードは以下です:
int func(const int **a) {
return 0;
}
int main() {
int n = 10;
int **a = new int*[n];
for (int i = 0; i < n; ++i) {
a[i] = new int[n];
}
func(a);
for (int i = 0; i < n; ++i) {
delete[] a[i];
}
delete[] a;
}
具体的なコードは以下です:
int func(const int **a) {
return 0;
}
int main() {
int n = 10;
int **a = new int*[n];
for (int i = 0; i < n; ++i) {
a[i] = new int[n];
}
func(a);
for (int i = 0; i < n; ++i) {
delete[] a[i];
}
delete[] a;
}
694はちみつ餃子 ◆8X2XSCHEME
2018/04/27(金) 20:32:49.73ID:GhhThAV7 >>692
さくらの続編を放送してる今日この頃、レイアースの第三章もワンチャン有るかもな!
さくらの続編を放送してる今日この頃、レイアースの第三章もワンチャン有るかもな!
695デフォルトの名無しさん
2018/04/27(金) 20:36:06.84ID:mctUhDKo696デフォルトの名無しさん
2018/04/27(金) 20:43:41.07ID:mctUhDKo697デフォルトの名無しさん
2018/04/27(金) 20:52:32.49ID:wnXDwKhi ありがとうございます。
const についてよくわからないのですが、
func の中で、
a[i][j] = 1;
みたいなことをできないようにしたいのですが、どうすればいいでしょうか?
const についてよくわからないのですが、
func の中で、
a[i][j] = 1;
みたいなことをできないようにしたいのですが、どうすればいいでしょうか?
698デフォルトの名無しさん
2018/04/27(金) 20:55:03.35ID:qED012zx >>679
ありがとうございます。その方法で取りあえずの目的は果たせそうなのですが、ほかの方法はないでしょうか?
というのも、他のクラスでラッピングしたりキャストしたりせずにifstreamを食わせたいのです。
たとえば、STLの各種関数はポインタでもvector等のコンテナでも大体OKですよね?
あれと同様に関数ポインタでもクラスのインスタンスへのポインタでもread()を持つものなら何でも突っ込めるようにしてforでぶん回したいのです。
標準のコンテナや自作クラス等の違いを吸収できるような構造にしたいのです。条件が後出しになってしまって申し訳ありません。
ありがとうございます。その方法で取りあえずの目的は果たせそうなのですが、ほかの方法はないでしょうか?
というのも、他のクラスでラッピングしたりキャストしたりせずにifstreamを食わせたいのです。
たとえば、STLの各種関数はポインタでもvector等のコンテナでも大体OKですよね?
あれと同様に関数ポインタでもクラスのインスタンスへのポインタでもread()を持つものなら何でも突っ込めるようにしてforでぶん回したいのです。
標準のコンテナや自作クラス等の違いを吸収できるような構造にしたいのです。条件が後出しになってしまって申し訳ありません。
699デフォルトの名無しさん
2018/04/27(金) 20:57:43.26ID:mctUhDKo キャスト
が一番コストが少ないと思う
関数の中で
delete [] a[i];
a[i] = new int[10];
は出来ても良いの?
が一番コストが少ないと思う
関数の中で
delete [] a[i];
a[i] = new int[10];
は出来ても良いの?
700デフォルトの名無しさん
2018/04/27(金) 20:58:32.28ID:mctUhDKo701デフォルトの名無しさん
2018/04/27(金) 21:19:24.66ID:wnXDwKhi702デフォルトの名無しさん
2018/04/27(金) 21:19:40.66ID:wnXDwKhi int func(const int **a) {
return 0;
}
int func2(const int *b) {
return 0;
}
int main() {
int n = 10;
int **a = new int*[n];
for (int i = 0; i < n; ++i) {
a[i] = new int[n];
}
func(a);
int *b = new int[n];
func2(b);
for (int i = 0; i < n; ++i) {
delete[] a[i];
}
delete[] a;
delete[] b;
}
return 0;
}
int func2(const int *b) {
return 0;
}
int main() {
int n = 10;
int **a = new int*[n];
for (int i = 0; i < n; ++i) {
a[i] = new int[n];
}
func(a);
int *b = new int[n];
func2(b);
for (int i = 0; i < n; ++i) {
delete[] a[i];
}
delete[] a;
delete[] b;
}
703デフォルトの名無しさん
2018/04/27(金) 21:47:52.98ID:uctWpHV6 >>701
それは c / c++ の欠点の1つで、
T * は const T * に文句も言わず変換してくれるが
T ** は const T ** に変換してくれないという問題
T は const T と定数性以外 compatible だよね、という判断を 1 段階しかしてくれない。
キャストが必要
const_cast<const int**>(a) など
それは c / c++ の欠点の1つで、
T * は const T * に文句も言わず変換してくれるが
T ** は const T ** に変換してくれないという問題
T は const T と定数性以外 compatible だよね、という判断を 1 段階しかしてくれない。
キャストが必要
const_cast<const int**>(a) など
704デフォルトの名無しさん
2018/04/27(金) 22:48:56.90ID:bqnCmOTp >>702
皆が言っているのは質問の内容とはちょっと違うけど、
func の中で a[0] = 0; などを禁止するために内側のポインタ自体も const にして
const int * const * にした方がいいよということ
皆が言っているのは質問の内容とはちょっと違うけど、
func の中で a[0] = 0; などを禁止するために内側のポインタ自体も const にして
const int * const * にした方がいいよということ
705704
2018/04/27(金) 22:53:34.55ID:bqnCmOTp いやごめん
func(int * const * )にすればコンパイル通るのか…
T * const * ==> const T * const * という変換は暗黙でokなのか
自分がバカでした
func(int * const * )にすればコンパイル通るのか…
T * const * ==> const T * const * という変換は暗黙でokなのか
自分がバカでした
706デフォルトの名無しさん
2018/04/29(日) 14:10:11.64ID:uFYPLUkV707デフォルトの名無しさん
2018/04/29(日) 15:26:18.04ID:AQKaesvC T * を const T * には勝手に変換するけどな
708デフォルトの名無しさん
2018/04/29(日) 15:27:57.34ID:AQKaesvC T * を volatile T * にも
709デフォルトの名無しさん
2018/04/29(日) 16:08:44.48ID:p2Z/45DS >>706
ちょっと興味があるので困るコードを教えて
ちょっと興味があるので困るコードを教えて
710デフォルトの名無しさん
2018/04/29(日) 16:11:13.28ID:p2Z/45DS >>705
慌ててたのかこのレス書き間違ってた
func(const int * const * )にすればコンパイル通る、
T ** ==> const T * const * という変換は暗黙でok、
と書きたかった(全然違うな)
慌ててたのかこのレス書き間違ってた
func(const int * const * )にすればコンパイル通る、
T ** ==> const T * const * という変換は暗黙でok、
と書きたかった(全然違うな)
711デフォルトの名無しさん
2018/04/29(日) 18:37:23.21ID:uFYPLUkV712711
2018/04/29(日) 18:50:17.15ID:uFYPLUkV おっと ipp の初期化忘れた
int** ipp;
const int ci=0;
const int ** cipp;
int *ip;
ipp = &ip;
cipp = ipp;
*cipp= &ci;
**ipp = 3;
int** ipp;
const int ci=0;
const int ** cipp;
int *ip;
ipp = &ip;
cipp = ipp;
*cipp= &ci;
**ipp = 3;
713デフォルトの名無しさん
2018/04/29(日) 18:55:31.07ID:tn8JNm3m ロベールの本に、
ios::out | ios::trunc
が意味がないと書いてあります。
既存のファイルを破棄してから書き込むということだとすると意味があるように思います。
ios::in | ios::out | ios::trunc とした場合のみ意味があると書いてあります。
どういう意味なのでしょうか?
ios::out | ios::trunc
が意味がないと書いてあります。
既存のファイルを破棄してから書き込むということだとすると意味があるように思います。
ios::in | ios::out | ios::trunc とした場合のみ意味があると書いてあります。
どういう意味なのでしょうか?
714デフォルトの名無しさん
2018/04/29(日) 23:14:14.46ID:hAJLRgtx truncate は、ファイルサイズを切り詰め・縮小する。
これは、読み書き両用時に使える機能
ファイルを読み込んで、ファイルサイズを縮小して書き込む
ファイルの書き込みでは、使えない。
書き込みでは、ファイルサイズ0で開くから、前のファイルが消える
これは、読み書き両用時に使える機能
ファイルを読み込んで、ファイルサイズを縮小して書き込む
ファイルの書き込みでは、使えない。
書き込みでは、ファイルサイズ0で開くから、前のファイルが消える
715デフォルトの名無しさん
2018/04/30(月) 03:21:44.30ID:/NJkj9K4 >>712
なるほどね。
T ** => cont T ** は許すとcont T を操作できてしまうから禁止されていて、
T * => const T *
T ** => const T * const *
...(以下略)
にはその問題が無いから許可されているわけか
なるほどね。
T ** => cont T ** は許すとcont T を操作できてしまうから禁止されていて、
T * => const T *
T ** => const T * const *
...(以下略)
にはその問題が無いから許可されているわけか
716デフォルトの名無しさん
2018/05/05(土) 10:57:39.35ID:dx2uIifv file.read((char*)buf, sizeof buf);
は buf のサイズ分だけ読み込めということだと思います。
ファイルの最後の部分を読み込むとき、サイズが WIDTH 未満の場合にはどうなるのでしょうか?
fstream file;
file.open("hello.txt", ios::in | ios::binary);
do {
unsigned char buf[WIDTH];
file.read((char*)buf, sizeof buf);
for (int i = 0, size = file.gcount(); i < size; ++i) {
printf("%02X ", buf[i]);
}
cout << endl;
} while (!file.eof());
file.close(); 👀
Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b)
は buf のサイズ分だけ読み込めということだと思います。
ファイルの最後の部分を読み込むとき、サイズが WIDTH 未満の場合にはどうなるのでしょうか?
fstream file;
file.open("hello.txt", ios::in | ios::binary);
do {
unsigned char buf[WIDTH];
file.read((char*)buf, sizeof buf);
for (int i = 0, size = file.gcount(); i < size; ++i) {
printf("%02X ", buf[i]);
}
cout << endl;
} while (!file.eof());
file.close(); 👀
Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b)
717デフォルトの名無しさん
2018/05/05(土) 11:15:19.94718デフォルトの名無しさん
2018/05/05(土) 11:22:41.78ID:dx2uIifv >>717
ありがとうございました。
あともう一つ質問させてください:
ロベールの本なのですが、
int n = 0x41424344;
file.write((const char*)&n, sizeof n);
というコードがあるページにあります。
その少し後ろのページには、以下のコードがあります。
char buf[BUF_SIZE];
dst.write(buf, src.gcount());
ここで、なぜ
dst.write((const char*)buf, src.gcount());
としていないのでしょうか?
ありがとうございました。
あともう一つ質問させてください:
ロベールの本なのですが、
int n = 0x41424344;
file.write((const char*)&n, sizeof n);
というコードがあるページにあります。
その少し後ろのページには、以下のコードがあります。
char buf[BUF_SIZE];
dst.write(buf, src.gcount());
ここで、なぜ
dst.write((const char*)buf, src.gcount());
としていないのでしょうか?
719デフォルトの名無しさん
2018/05/05(土) 11:28:13.02ID:4WOSF73M 【マイトLーヤとUFO】 『月面にはウサギやウルフが棲息』 『宇宙人グレイは溶けてゼリーに』
http://rosie.5ch.net/test/read.cgi/liveplus/1525483483/l50
http://rosie.5ch.net/test/read.cgi/liveplus/1525483483/l50
720片山博文MZ ◆T6xkBnTXz7B0
2018/05/05(土) 11:56:29.00ID:y1NIMmWz >>718
char *はconst char *に互換だから。constは書き換えないという意味で、constなしはconstありに対して互換性がある。
char *はconst char *に互換だから。constは書き換えないという意味で、constなしはconstありに対して互換性がある。
721デフォルトの名無しさん
2018/05/05(土) 11:58:03.35ID:dx2uIifv すみません。もう一つ質問です。
またロベールの本なんですが、以下のコードが書いてあります。
ファイルから入力中にエラーが起きたときの対処法です。
if(src.fail()) {
ではなく、
if(src.fail() && ! src.eof()) {
と書いてあります。その理由として、
「読み込みの場合はファイルの終端に到達した際も fail メンバ関数が
真となるため、 eof メンバ関数が真になる場合は除外しておきます。」
と書いてあります。
そこで質問です。
ファイルの終端の直前の部分を読み込む最後の読み込みの際に何等かのエラーが起こった場合、
src.fail() == true かつ src.eof() == true となります。
そのため、
src.fail() && ! src.eof() == false となってしまいます。
この場合、読み込みエラーが起こったにもかかわらず、その対処ができないことになりはしないでしょうか?
それともロベールさんのコードはOKなコードなんでしょうか?
またロベールの本なんですが、以下のコードが書いてあります。
ファイルから入力中にエラーが起きたときの対処法です。
if(src.fail()) {
ではなく、
if(src.fail() && ! src.eof()) {
と書いてあります。その理由として、
「読み込みの場合はファイルの終端に到達した際も fail メンバ関数が
真となるため、 eof メンバ関数が真になる場合は除外しておきます。」
と書いてあります。
そこで質問です。
ファイルの終端の直前の部分を読み込む最後の読み込みの際に何等かのエラーが起こった場合、
src.fail() == true かつ src.eof() == true となります。
そのため、
src.fail() && ! src.eof() == false となってしまいます。
この場合、読み込みエラーが起こったにもかかわらず、その対処ができないことになりはしないでしょうか?
それともロベールさんのコードはOKなコードなんでしょうか?
722デフォルトの名無しさん
2018/05/05(土) 11:58:46.39ID:dx2uIifv fstream src;
…
char buf[BUF_SIZE];
src.read(buf, sizeof buf);
if(src.fail() && ! src.eof()) {
error = true;
break;
}
…
char buf[BUF_SIZE];
src.read(buf, sizeof buf);
if(src.fail() && ! src.eof()) {
error = true;
break;
}
723デフォルトの名無しさん
2018/05/05(土) 12:03:26.22ID:dx2uIifv >>720
ありがとうございます。
つまりどちらもエラーにはならないということですね。
ですが、記述が統一していない理由というのは何か考えられるでしょうか?
int n = 0x41424344;
file.write((const char*)&n, sizeof n);
に const がついているのは、 n は int 型だから write に渡すときには絶対に
キャストしなければならない。(char *) でもいいが、どうせなら const もつけて
しまおうということですかね?
一方、
char buf[BUF_SIZE];
dst.write(buf, src.gcount());
の方は、キャストの必要がないからわざわざ (const char*) とキャストすることも
ないかなという感じですかね?
ありがとうございます。
つまりどちらもエラーにはならないということですね。
ですが、記述が統一していない理由というのは何か考えられるでしょうか?
int n = 0x41424344;
file.write((const char*)&n, sizeof n);
に const がついているのは、 n は int 型だから write に渡すときには絶対に
キャストしなければならない。(char *) でもいいが、どうせなら const もつけて
しまおうということですかね?
一方、
char buf[BUF_SIZE];
dst.write(buf, src.gcount());
の方は、キャストの必要がないからわざわざ (const char*) とキャストすることも
ないかなという感じですかね?
724デフォルトの名無しさん
2018/05/05(土) 12:05:14.84ID:dx2uIifv ロベールさんの本は色々細かいことが書いてあって有用なのですが、なぜこういうコードなんだろう?という
疑問を持って読んでいくと次から次へと疑問が生まれてきて読み進むのが大変です。
疑問を持って読んでいくと次から次へと疑問が生まれてきて読み進むのが大変です。
726片山博文MZ ◆T6xkBnTXz7B0
2018/05/05(土) 12:19:01.91ID:y1NIMmWz Cスタイルのキャストは強力すぎて、効果が分かりにくいので、モダンでは、そのキャストは、reinterpret_cast<const char *>(&n)って書いた方がいい。
727デフォルトの名無しさん
2018/05/05(土) 12:23:53.42ID:LkKePK4y winsowsにはC#コンパイラが標準付属してますが、C++コンパイラは標準付属してないんですか?
728片山博文MZ ◆T6xkBnTXz7B0
2018/05/05(土) 12:24:24.44ID:y1NIMmWz つまり、その本は古い。温故知新とは言うが、Cスタイルのキャストの使用はモダンではない。
729片山博文MZ ◆T6xkBnTXz7B0
2018/05/05(土) 12:35:42.78ID:y1NIMmWz >>726
訂正。
× reinterpret_cast<const char *>(&n)
○ reinterpret_cast<char *>(&n)
そのCスタイルのキャストは
const_cast<const char *>(reinterpret_cast<char *>(&n))と同じ。
下手なキャストはバグのもと。キャストは最小限に。
訂正。
× reinterpret_cast<const char *>(&n)
○ reinterpret_cast<char *>(&n)
そのCスタイルのキャストは
const_cast<const char *>(reinterpret_cast<char *>(&n))と同じ。
下手なキャストはバグのもと。キャストは最小限に。
730片山博文MZ ◆T6xkBnTXz7B0
2018/05/05(土) 12:43:36.49ID:y1NIMmWz コンパイラによっては、reinterpret_castとconst_castをCスタイルのキャストで一度にしようとすると、警告やエラーになるものもある。
731片山博文MZ ◆T6xkBnTXz7B0
2018/05/05(土) 12:53:07.14ID:y1NIMmWz file.write((const char*)&n, sizeof n);
ここでconstをわざわざ付けるのは、型で書き換えないことを確認するためだが、
このCスタイルのキャストは強力すぎて、行儀が悪い。reinterpret_castとconst_castに分けるべきだと考える。
ここでconstをわざわざ付けるのは、型で書き換えないことを確認するためだが、
このCスタイルのキャストは強力すぎて、行儀が悪い。reinterpret_castとconst_castに分けるべきだと考える。
732はちみつ餃子 ◆8X2XSCHEME
2018/05/05(土) 23:49:27.10ID:/wbyRxeL 元の趣旨がキャストについての質問だけどそれは置くとして、
そういうことするなら fstream じゃなくて basic_fstream<int> を使った方がよくなくなくない?
そういうことするなら fstream じゃなくて basic_fstream<int> を使った方がよくなくなくない?
733デフォルトの名無しさん
2018/05/06(日) 00:07:10.95ID:RbjPx358 そんなもんがいいと思ってる人に何言っても無駄だし
他人に強要しなけりゃそれ使ってもいいんじゃないの
他人に強要しなけりゃそれ使ってもいいんじゃないの
734デフォルトの名無しさん
2018/05/06(日) 00:56:59.17ID:G6stHO5N >>732
初心者が入門書で学習している段階で、途中の過程をすっ飛ばしてこっちの方がいいからこれ使えなんて進めるのはかえって理解を妨げるんでないの?
初心者が入門書で学習している段階で、途中の過程をすっ飛ばしてこっちの方がいいからこれ使えなんて進めるのはかえって理解を妨げるんでないの?
735はちみつ餃子 ◆8X2XSCHEME
2018/05/06(日) 02:31:33.69ID:ATh7OHAm 繰返すが趣旨と外れてることはわかってるので、元質問は忘れて。
こっちの手段もアリだよね? っていう別の質問。
こっちの手段もアリだよね? っていう別の質問。
736デフォルトの名無しさん
2018/05/09(水) 14:30:37.57ID:YgEwOBRT 競技プログラミングってやった方がいいんですか?
738デフォルトの名無しさん
2018/05/09(水) 17:28:08.89ID:bhGLBTeZ ロベールの本に以下のコードがあります。
buf という配列ですが、 for 文の中で宣言されています。
PAGE_HEIGHT 回、配列 buf が作られるのでしょうか?
何か非効率的な気がします。
for (int h = 0; h < PAGE_HEIGHT; ++h) {
unsigned char buf[PAGE_WIDTH];
m_file.read((char*)buf, sizeof buf);
for (int w = 0, size = m_file.gcount(); w < size; ++w) {
printf("%02X ", buf[w]);
}
cout << endl;
}
buf という配列ですが、 for 文の中で宣言されています。
PAGE_HEIGHT 回、配列 buf が作られるのでしょうか?
何か非効率的な気がします。
for (int h = 0; h < PAGE_HEIGHT; ++h) {
unsigned char buf[PAGE_WIDTH];
m_file.read((char*)buf, sizeof buf);
for (int w = 0, size = m_file.gcount(); w < size; ++w) {
printf("%02X ", buf[w]);
}
cout << endl;
}
739デフォルトの名無しさん
2018/05/09(水) 17:38:59.81ID:J0gm0Ysv スタックポインタをずらす量が変わるだけ
これによる時間はゼロと思って良い
これによる時間はゼロと思って良い
740デフォルトの名無しさん
2018/05/09(水) 17:44:16.81ID:bhGLBTeZ741デフォルトの名無しさん
2018/05/09(水) 17:45:58.33ID:J0gm0Ysv もしパフォーマンスが問題になるなら
printfをなんとかすべき
printfをなんとかすべき
742デフォルトの名無しさん
2018/05/09(水) 17:52:37.44ID:J0gm0Ysv743デフォルトの名無しさん
2018/05/09(水) 18:27:14.15ID:bhGLBTeZ >>742
ありがとうございました。
ありがとうございました。
744デフォルトの名無しさん
2018/05/09(水) 19:10:47.36ID:WcTkBSWX745デフォルトの名無しさん
2018/05/09(水) 19:12:26.96ID:bhGLBTeZ >>744
ありがとうございます。
newした場合にはもちろん毎回別の領域が確保されるわけですよね。
文法だけからでは分からないことだと思うので、そのような部分を解説した本が
あればよいのですが。。。
ありがとうございます。
newした場合にはもちろん毎回別の領域が確保されるわけですよね。
文法だけからでは分からないことだと思うので、そのような部分を解説した本が
あればよいのですが。。。
746デフォルトの名無しさん
2018/05/09(水) 19:21:16.91ID:sQgpoJ7Q コンストラクターを起こすようなクラスならアレだけど
基本型はループの外においやらている可能性が高い
まぁ使ってるコンパイラの最適化次第というのはある
文法/規格だけで解決しない自由な部分は
実際に使ってるコンパイラの吐き出すコードをみるなり
実測して違いが出るか確認いてみたり……
初心の「それ無駄だろうという直感」は最適化で瑣末ごとになることが多い?かな?
基本型はループの外においやらている可能性が高い
まぁ使ってるコンパイラの最適化次第というのはある
文法/規格だけで解決しない自由な部分は
実際に使ってるコンパイラの吐き出すコードをみるなり
実測して違いが出るか確認いてみたり……
初心の「それ無駄だろうという直感」は最適化で瑣末ごとになることが多い?かな?
747デフォルトの名無しさん
2018/05/09(水) 20:03:17.36ID:bhGLBTeZ748デフォルトの名無しさん
2018/05/09(水) 20:03:43.32ID:tbbSaefy >>745
C++ スタック ヒープで検索すると解説しているページは山ほどヒットするけどいい本ってあるのかな。
CPUとメモリの動作とか簡単に学んでおくといい気がする。
スタックに収まらないような大きな領域をスタックに取ってはいけないとか
実践的に必要な知識でもあるんだよね。
C++ スタック ヒープで検索すると解説しているページは山ほどヒットするけどいい本ってあるのかな。
CPUとメモリの動作とか簡単に学んでおくといい気がする。
スタックに収まらないような大きな領域をスタックに取ってはいけないとか
実践的に必要な知識でもあるんだよね。
749デフォルトの名無しさん
2018/05/10(木) 00:46:37.51ID:hNESkqkP750デフォルトの名無しさん
2018/05/10(木) 12:36:43.93ID:dXwOta4y クラスの練習に文字列クラスっぽいものを作ったんですが
Mystr Mystr::operator=(Mystr &obj){
//左辺に右辺を代入
return *this
}
こうすると代入のたびに戻り値を返すためにコピーコンストラクタとデストラクタがわざわざ呼ばれてるみたいなんですが
関数の戻り値をvoidにする以外でなくす方法はありませんか?
一応コード全文 https://ideone.com/A1iQ3Y
Mystr Mystr::operator=(Mystr &obj){
//左辺に右辺を代入
return *this
}
こうすると代入のたびに戻り値を返すためにコピーコンストラクタとデストラクタがわざわざ呼ばれてるみたいなんですが
関数の戻り値をvoidにする以外でなくす方法はありませんか?
一応コード全文 https://ideone.com/A1iQ3Y
751デフォルトの名無しさん
2018/05/10(木) 12:55:29.56ID:vDlJ/Ca2752デフォルトの名無しさん
2018/05/10(木) 13:00:33.59ID:TqAsciuR Mystr & Mystr::operator=(const Mystr &obj);
753デフォルトの名無しさん
2018/05/10(木) 13:59:44.86ID:dXwOta4y ありがとうございました
戻り値にも参照が使えることを知りませんでした
戻り値にも参照が使えることを知りませんでした
754デフォルトの名無しさん
2018/05/10(木) 14:05:03.21ID:vDlJ/Ca2 >>753
おそらくわかっていると思うけど、ローカル変数や
テンポラリーオブジェクトの参照は返しちゃダメなので注意
ダメな例
T& f() { T a; .....; return a;}
string& g() { string a, b; .....; return a+b;}
おそらくわかっていると思うけど、ローカル変数や
テンポラリーオブジェクトの参照は返しちゃダメなので注意
ダメな例
T& f() { T a; .....; return a;}
string& g() { string a, b; .....; return a+b;}
>>749
はじめて読む 486 は良書だけれでも、今、これを実際のマシンで試してみることはできなくなりましたね…
はじめて読む 486 は良書だけれでも、今、これを実際のマシンで試してみることはできなくなりましたね…
756はちみつ餃子 ◆8X2XSCHEME
2018/05/10(木) 18:38:04.46ID:RiSXhiCD アセンブラって「低水準言語」なはずだけども、今となっては機械語すらもかなり高水準だもんな……。
機械語の並びをコンパイルして最適化された μop にするみたいなことが CPU の中で起こってて、
機械の気持ちを理解するには機械語はまだまだ外側の方って感じ。
>>755
動かすための情報を集約しようとしてはしてるよ。
ある程度は動く。
https://github.com/tkmc/486
機械語の並びをコンパイルして最適化された μop にするみたいなことが CPU の中で起こってて、
機械の気持ちを理解するには機械語はまだまだ外側の方って感じ。
>>755
動かすための情報を集約しようとしてはしてるよ。
ある程度は動く。
https://github.com/tkmc/486
758デフォルトの名無しさん
2018/05/10(木) 20:45:54.69ID:CLWEept/ アドレスでアクセスできるメモリってものがあってデータやコードが書かれてるのかー
スタックなる仕組みでローカルな記憶域をほぼコストゼロで確保してんのかー
と言うことがわかれば十分な気がする
スタックなる仕組みでローカルな記憶域をほぼコストゼロで確保してんのかー
と言うことがわかれば十分な気がする
759デフォルトの名無しさん
2018/05/11(金) 00:09:23.84ID:cA/jbwin760デフォルトの名無しさん
2018/05/11(金) 07:04:43.76 薄い本ならコミケで売れや
761デフォルトの名無しさん
2018/05/11(金) 13:11:04.97ID:Mluu9Rs0 アセンブラの前に
まずは変数がどこにどのように確保されるかとか
どのように初期化されるかとか
そっちの方が先だろ
スタティック、スタック、ヒープ
をまず理解する
C++であればvirtual関数が呼ばれる仕組みとかも
知ってた方が良い
例外の仕組みは機種依存が大きいのでもうちょっと先で
まずは変数がどこにどのように確保されるかとか
どのように初期化されるかとか
そっちの方が先だろ
スタティック、スタック、ヒープ
をまず理解する
C++であればvirtual関数が呼ばれる仕組みとかも
知ってた方が良い
例外の仕組みは機種依存が大きいのでもうちょっと先で
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- ミス・ユニバース フィンランド代表の「つり目」写真が波紋… 本人釈明も批判やまず 協会謝罪「徹底的に検証」へ [冬月記者★]
- 自民・麻生太郎副総裁 石破政権の1年は「どよーん」 高市政権発足で「何となく明るくなった」「世の中のことが決まり動いている」★2 [Hitzeschleier★]
- 【おこめ券】鈴木憲和農相 小泉前農相の備蓄米放出を“反省”「備蓄の円滑な運営を図ってまいります」 [Hitzeschleier★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- ゆたぼん 二重手術を報告「めちゃくちゃ気に入っています」 [muffin★]
- 【山形】クマ駆除で誤射した猟友会隊員に町が1663万円請求へ...弾当たり男性大けが2023年 小国町 [nita★]
- 【WOWOW】UEFAチャンピオンズリーグ・ヨーロッパリーグ ★18
- とらせん
- 巨専】
- 【WOWOW】UEFAチャンピオンズリーグ・ヨーロッパリーグ ★17
- こいせん 全レス転載禁止
- わしせん ようこそ佐藤直樹くん ありがとう石井さん
- 中国人、ガチ超正論。「日本人がアイヌに対してやったことを『問題ない』とするなら、中国が日本人に同じことをしても文句ないだろう?」 [314039747]
- 【悲報】新米、全く売れなくて倉庫が満杯になってしまうwwwwwwwwwwwwwwwwwwww [802034645]
- 最近レッテル貼りしてドヤ顔してるガチガイジが嫌儲に増えてない? [866936191]
- 木曜日のんなっしょい❗(・o・🍬)仕放題スレ🏡
- 【悲報】日本共産党、ツイッター速報にブチギレ法的措置WWWWWWWWWWWWWWWWWWWWWWWWWWWW [935793931]
- 官僚「台湾有事についての質問か、『政府として逐一答えない』と…(カタカタカタ)」高市「私1人で答弁できるわよ!」 [972432215]
