エスケープシーケンスや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:NYxCuvMY679デフォルトの名無しさん
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関数が呼ばれる仕組みとかも
知ってた方が良い
例外の仕組みは機種依存が大きいのでもうちょっと先で
762デフォルトの名無しさん
2018/05/11(金) 14:03:43.45ID:lM6VzEPt763デフォルトの名無しさん
2018/05/11(金) 15:32:04.47ID:L7FGnh/N >>761
そう。
でもスタックを理解するにはメモリという概念モデルの理解が必要
だけど皆が勧めてるようなx86の解説書はやめたほうが良いと思う
セグメントレジスタとか原理を学ぶには邪魔なノイズが多過ぎる
そう。
でもスタックを理解するにはメモリという概念モデルの理解が必要
だけど皆が勧めてるようなx86の解説書はやめたほうが良いと思う
セグメントレジスタとか原理を学ぶには邪魔なノイズが多過ぎる
764デフォルトの名無しさん
2018/05/11(金) 16:43:05.52ID:ArEHxDOw Z80からはじめよう。
765デフォルトの名無しさん
2018/05/11(金) 17:23:03.14ID:fUD4+ayW 実用レベルのCで関数ローカル変数がどう実現されてるか、となると
ベースポインタというほぼ専用のレジスタが出てくるからなぁ。
そういえば昔、Cが全然分からない頃にMASMの本を読んだら、
Z80や6502のアセンブラではついぞ出てこないディレクティブが色々あって
まったく意味が分からなかったのを思い出した。
高級言語のコンパイラを作ったり、ライブラリとして呼べるマシン語の
サブルーチンを作るための機能なんだと後になって腑に落ちたけど。
ベースポインタというほぼ専用のレジスタが出てくるからなぁ。
そういえば昔、Cが全然分からない頃にMASMの本を読んだら、
Z80や6502のアセンブラではついぞ出てこないディレクティブが色々あって
まったく意味が分からなかったのを思い出した。
高級言語のコンパイラを作ったり、ライブラリとして呼べるマシン語の
サブルーチンを作るための機能なんだと後になって腑に落ちたけど。
766はちみつ餃子 ◆8X2XSCHEME
2018/05/11(金) 17:39:10.37ID:e+Ei11A7 C の言語としての理屈が現代のコンピュータの仕組みと乖離しててもはや低級言語とは言えないということを
「C は PDP-11 エミュレータ」なんて揶揄してるのをどこかで見たことがあるな。
「C は PDP-11 エミュレータ」なんて揶揄してるのをどこかで見たことがあるな。
767デフォルトの名無しさん
2018/05/11(金) 17:48:59.53ID:S57n19k4 Cに引きずられて仕様のできたMIPSはCの理解にとてもいいよ
768デフォルトの名無しさん
2018/05/11(金) 19:45:01.89ID:CPfY1M+a 龍芯3号か
マシン語をやるのなら、実際に石を触れる感じのする環境がいいなあ、あくまで「感じ」だけれども
仮想マシンの中間コードを触るのは疑問
仮想マシンの中間コードを触るのは疑問
770デフォルトの名無しさん
2018/05/11(金) 20:52:01.78ID:Mluu9Rs0 PCはPCで面白いし、
8bitは8bitで面白い
8bitは8bitで面白い
771はちみつ餃子 ◆8X2XSCHEME
2018/05/11(金) 20:54:19.03ID:e+Ei11A7 AKI-80 の時代の人なのでラズパイで電子工作とかやってるのを見ると隔世の感がある。
772デフォルトの名無しさん
2018/05/11(金) 20:56:49.04ID:2EGPeEG9 Donald Knuth の MMIX っていう言語は勉強するとためになりますか?
773デフォルトの名無しさん
2018/05/12(土) 01:53:53.98ID:Cq1QtQw6774デフォルトの名無しさん
2018/05/12(土) 04:35:38.94ID:F7LxnV/h wikipedia の「コールスタック」の項に意外にしっかりした説明あるな
コールスタックって何?スタックフレームってなに?
って人は読んでおくといいと思う。
コールスタックって何?スタックフレームってなに?
って人は読んでおくといいと思う。
775デフォルトの名無しさん
2018/05/12(土) 14:17:18.55ID:CbmhA0Cx メモリとかスタックとかヒープとかって、C/C++ 言語仕様とは直接の関係がないけど、使う上では結構重要な情報だよねー。
Cを学習する上で避けられない割に、C視点側からの詳しい学習書って無いよなー。
環境依存部分だから、言語学習書に適さないってのもわかるんだが…何とかできないものかと常々思ってる。
(思ってる「だけ」で実行には移さないのだけれどもw
Cを学習する上で避けられない割に、C視点側からの詳しい学習書って無いよなー。
環境依存部分だから、言語学習書に適さないってのもわかるんだが…何とかできないものかと常々思ってる。
(思ってる「だけ」で実行には移さないのだけれどもw
776デフォルトの名無しさん
2018/05/12(土) 14:20:15.63ID:CbmhA0Cx777デフォルトの名無しさん
2018/05/12(土) 15:41:16.04ID:9vavBtpK RISC-Vの方がまだ有用な可能性が
778デフォルトの名無しさん
2018/05/23(水) 19:24:44.84ID:Au5e7VGg 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
AA6VB
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
AA6VB
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- テレ朝本社から社外スタッフの男性が転落し死亡 テレビ朝日がコメント [ひかり★]
- 【米FRB】0.25%利下げ決定 3会合連続、雇用下支え [蚤の市★]
- 訪米認証「ESTA」、SNS利用情報の提出義務化へ 日本人観光客も対象に [蚤の市★]
- <櫻坂46松田里奈>ランジェリーカット公開 照れながらTシャツ脱ぐ [ひかり★]
- 「身を切る改革」どこへ? 維新「身内」への公金支出、地方でも続々 [蚤の市★]
- テレビ朝日 本社から男性が転落し死亡。関連会社社員か 当たった通行人が左肩軽傷 [阿弥陀ヶ峰★]
- (´・ω・`)おはよ
- 【画像】東京都民「助けて!満員電車もう無理いいぃぃいいぃぃぃいいいいいぃ😭」!!!! [732289945]
- 楽天株買っといたわ
- お前らって議論できないよな
- 【悲報】女「いやああああ!夫が息子にビンタしたぁああぁ!!」 弁護士の男逮捕
- 一般人「起きなきゃ…」 俺ら「寝ようかなzzz」
