[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 05/16 09:46 / Filesize : 287 KB / Number-of Response : 1022
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん [2017/11/04(土) 16:33:35.07 ID:NYxCuvMY.net]
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります

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

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

702 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:02:30.96 ID:AimUsleE.net]
ふむ、なくはないか。
やはり条件の方に+1とか-1とか書くんじゃなくて初期値変える方が素直だろうな。
最適化の下手なコンパイラ対策も含めて。

703 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:03:21.75 ID:O6TOHWbP.net]
>>689
だからそう言うのをレアケースって言ってるんだが...
よく書くと言うなら多分住む世界が違う

704 名前:片山博文MZ mailto:sage [2018/04/27(金) 20:10:35.47 ID:HF3+Vuoy.net]
レイアース

705 名前:デフォルトの名無しさん [2018/04/27(金) 20:28:24.05 ID:wnXDwKhi.net]
>>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;
}

706 名前:はちみつ餃子 mailto:sage [2018/04/27(金) 20:32:49.73 ID:GhhThAV7.net]
>>692
さくらの続編を放送してる今日この頃、レイアースの第三章もワンチャン有るかもな!

707 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:36:06.84 ID:mctUhDKo.net]
>>687
そんな事言ったら
countが0でループだってレアケースだぞ

708 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:43:41.07 ID:mctUhDKo.net]
>>693
const付きに変換出来るのは
ポインタの先がconstに変わる場合

int finc(int * const * a) なら大丈夫

709 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:52:32.49 ID:wnXDwKhi.net]
ありがとうございます。

const についてよくわからないのですが、

func の中で、

a[i][j] = 1;

みたいなことをできないようにしたいのですが、どうすればいいでしょうか?

710 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:55:03.35 ID:qED012zx.net]
>>679
ありがとうございます。その方法で取りあえずの目的は果たせそうなのですが、ほかの方法はないでしょうか?
というのも、他のクラスでラッピングしたりキャストしたりせずにifstreamを食わせたいのです。
たとえば、STLの各種関数はポインタでもvector等のコンテナでも大体OKですよね?
あれと同様に関数ポインタでもクラスのインスタンスへのポインタでもread()を持つものなら何でも突っ込めるようにしてforでぶん回したいのです。
標準のコンテナや自作



711 名前:クラス等の違いを吸収できるような構造にしたいのです。条件が後出しになってしまって申し訳ありません。 []
[ここ壊れてます]

712 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:57:43.26 ID:mctUhDKo.net]
キャスト
が一番コストが少ないと思う

関数の中で
delete [] a[i];
a[i] = new int[10];
は出来ても良いの?

713 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:58:32.28 ID:mctUhDKo.net]
>>699>>697あて

714 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 21:19:24.66 ID:wnXDwKhi.net]
>>699

ありがとうございます。

ちょっと回答が理解できないため、質問を代えさせてください

以下のプログラムの func はNGなのに func2 はOKなのはなぜでしょうか?

715 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 21:19:40.66 ID:wnXDwKhi.net]
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;
}

716 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 21:47:52.98 ID:uctWpHV6.net]
>>701
それは c / c++ の欠点の1つで、
T * は const T * に文句も言わず変換してくれるが
T ** は const T ** に変換してくれないという問題
T は const T と定数性以外 compatible だよね、という判断を 1 段階しかしてくれない。

キャストが必要

const_cast<const int**>(a) など

717 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 22:48:56.90 ID:bqnCmOTp.net]
>>702
皆が言っているのは質問の内容とはちょっと違うけど、
func の中で a[0] = 0; などを禁止するために内側のポインタ自体も const にして

const int * const * にした方がいいよということ

718 名前:704 mailto:sage [2018/04/27(金) 22:53:34.55 ID:bqnCmOTp.net]
いやごめん

func(int * const * )にすればコンパイル通るのか…
T * const * ==> const T * const * という変換は暗黙でokなのか
自分がバカでした

719 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 14:10:11.64 ID:uFYPLUkV.net]
>>703
欠点なの?
T ** を const T ** に勝手に変換されると困るんだが。

720 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 15:26:18.04 ID:AQKaesvC.net]
T * を const T * には勝手に変換するけどな



721 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 15:27:57.34 ID:AQKaesvC.net]
T * を volatile T * にも

722 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 16:08:44.48 ID:p2Z/45DS.net]
>>706
ちょっと興味があるので困るコードを教えて

723 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 16:11:13.28 ID:p2Z/45DS.net]
>>705
慌ててたのかこのレス書き間違ってた

func(const int * const * )にすればコンパイル通る、
T ** ==> const T * const * という変換は暗黙でok、
と書きたかった(全然違うな)

724 名前:デフォルトの名無しさん [2018/04/29(日) 18:37:23.21 ID:uFYPLUkV.net]
>>709
int** ipp;
const int ci=0;
const int ** cipp;
cipp = ipp;
*cipp= &ci;
**ipp = 3;

725 名前:711 mailto:sage [2018/04/29(日) 18:50:17.15 ID:uFYPLUkV.net]
おっと ipp の初期化忘れた
int** ipp;
const int ci=0;
const int ** cipp;
int *ip;
ipp = &ip;
cipp = ipp;
*cipp= &ci;
**ipp = 3;

726 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 18:55:31.07 ID:tn8JNm3m.net]
ロベールの本に、

ios::out | ios::trunc

が意味がないと書いてあります。

既存のファイルを破棄してから書き込むということだとすると意味があるように思います。

ios::in | ios::out | ios::trunc とした場合のみ意味があると書いてあります。

どういう意味なのでしょうか?

727 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 23:14:14.46 ID:hAJLRgtx.net]
truncate は、ファイルサイズを切り詰め・縮小する。
これは、読み書き両用時に使える機能

ファイルを読み込んで、ファイルサイズを縮小して書き込む

ファイルの書き込みでは、使えない。
書き込みでは、ファイルサイズ0で開くから、前のファイルが消える

728 名前:デフォルトの名無しさん mailto:sage [2018/04/30(月) 03:21:44.30 ID:/NJkj9K4.net]
>>712
なるほどね。
T ** => cont T ** は許すとcont T を操作できてしまうから禁止されていて、

T * => const T *
T ** => const T * const *
...(以下略)
にはその問題が無いから許可されているわけか

729 名前:デフォルトの名無しさん [2018/05/05(土) 10:57:39.35 ID:dx2uIifv.net]
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)


730 名前:デフォルトの名無しさん [2018/05/05(土) 11:15:19.94 .net]
>>716
https://cpprefjp.github.io/reference/istream/basic_istream/read.html



731 名前:デフォルトの名無しさん mailto:sage [2018/05/05(土) 11:22:41.78 ID:dx2uIifv.net]
>>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());

としていないのでしょうか?

732 名前:デフォルトの名無しさん [2018/05/05(土) 11:28:13.02 ID:4WOSF73M.net]
【マイトLーヤとUFO】 『月面にはウサギやウルフが棲息』   『宇宙人グレイは溶けてゼリーに』
rosie.5ch.net/test/read.cgi/liveplus/1525483483/l50

733 名前:片山博文MZ mailto:sage [2018/05/05(土) 11:56:29.00 ID:y1NIMmWz.net]
>>718
char *はconst char *に互換だから。constは書き換えないという意味で、constなしはconstありに対して互換性がある。

734 名前:デフォルトの名無しさん [2018/05/05(土) 11:58:03.35 ID:dx2uIifv.net]
すみません。もう一つ質問です。
またロベールの本なんですが、以下のコードが書いてあります。
ファイルから入力中にエラーが起きたときの対処法です。

if(src.fail()) {

ではなく、

if(src.fail() && ! src.eof()) {

と書いてあります。その理由として、

「読み込みの場合はファイルの終端に到達した際も fail メンバ関数が
真となるため、 eof メンバ関数が真になる場合は除外しておきます。」

と書いてあります。

そこで質問です。

ファイルの終端の直前の部分を読み込む最後の読み込みの際に何等かのエラーが起こった場合、
src.fail() == true かつ src.eof() == true となります。
そのため、
src.fail() && ! src.eof() == false となってしまいます。

この場合、読み込みエラーが起こったにもかかわらず、その対処ができないことになりはしないでしょうか?

それともロベールさんのコードはOKなコードなんでしょうか?

735 名前:デフォルトの名無しさん [2018/05/05(土) 11:58:46.39 ID:dx2uIifv.net]
fstream src;



char buf[BUF_SIZE];
src.read(buf, sizeof buf);
if(src.fail() && ! src.eof()) {
error = true;
break;
}

736 名前:デフォルトの名無しさん mailto:sage [2018/05/05(土) 12:03:26.22 ID:dx2uIifv.net]
>>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*) とキャストすることも
ないかなという感じですかね?

737 名前:デフォルトの名無しさん mailto:sage [2018/05/05(土) 12:05:14.84 ID:dx2uIifv.net]
ロベールさんの本は色々細かいことが書いてあって有用なのですが、なぜこういうコードなんだろう?という
疑問を持って読んでいくと次から次へと疑問が生まれてきて読み進むのが大変です。

738 名前:デフォルトの名無しさん [2018/05/05(土) 12:18:38.57 .net]
>>721
>>717 再読のこと

739 名前:片山博文MZ mailto:sage [2018/05/05(土) 12:19:01.91 ID:y1NIMmWz.net]
Cスタイルのキャストは強力すぎて、効果が分かりにくいので、モダンでは、そのキャストは、reinterpret_cast<const char *>(&n)って書いた方がいい。

740 名前:デフォルトの名無しさん mailto:sage [2018/05/05(土) 12:23:53.42 ID:LkKePK4y.net]
winsowsにはC#コンパイラが標準付属してますが、C++コンパイラは標準付属してないんですか?



741 名前:片山博文MZ mailto:sage [2018/05/05(土) 12:24:24.44 ID:y1NIMmWz.net]
つまり、その本は古い。温故知新とは言うが、Cスタイルのキャストの使用はモダンではない。

742 名前:片山博文MZ mailto:sage [2018/05/05(土) 12:35:42.78 ID:y1NIMmWz.net]
>>726
訂正。
× reinterpret_cast<const char *>(&n)
○ reinterpret_cast<char *>(&n)

そのCスタイルのキャストは
const_cast<const char *>(reinterpret_cast<char *>(&n))と同じ。
下手なキャストはバグのもと。キャストは最小限に。

743 名前:片山博文MZ mailto:sage [2018/05/05(土) 12:43:36.49 ID:y1NIMmWz.net]
コンパイラによっては、reinterpret_castとconst_castをCスタイルのキャストで一度にしようとすると、警告やエラーになるものもある。

744 名前:片山博文MZ mailto:sage [2018/05/05(土) 12:53:07.14 ID:y1NIMmWz.net]
file.write((const char*)&n, sizeof n);
ここでconstをわざわざ付けるのは、型で書き換えないことを確認するためだが、
このCスタイルのキャストは強力すぎて、行儀が悪い。reinterpret_castとconst_castに分けるべきだと考える。

745 名前:はちみつ餃子 mailto:sage [2018/05/05(土) 23:49:27.10 ID:/wbyRxeL.net]
元の趣旨がキャストについての質問だけどそれは置くとして、
そういうことするなら fstream じゃなくて basic_fstream<int> を使った方がよくなくなくない?

746 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 00:07:10.95 ID:RbjPx358.net]
そんなもんがいいと思ってる人に何言っても無駄だし
他人に強要しなけりゃそれ使ってもいいんじゃないの

747 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 00:56:59.17 ID:G6stHO5N.net]
>>732
初心者が入門書で学習している段階で、途中の過程をすっ飛ばしてこっちの方がいいからこれ使えなんて進めるのはかえって理解を妨げるんでないの?

748 名前:はちみつ餃子 mailto:sage [2018/05/06(日) 02:31:33.69 ID:ATh7OHAm.net]
繰返すが趣旨と外れてることはわかってるので、元質問は忘れて。
こっちの手段もアリだよね? っていう別の質問。

749 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 14:30:37.57 ID:YgEwOBRT.net]
競技プログラミングってやった方がいいんですか?

750 名前: mailto:sage [2018/05/09(水) 16:44:52.51 ID:dHqNIKDN.net]
>>736
競技プログラミングが流行る前には、宿題請負スレが隆盛を誇り、私もそれに便乗していろいろやっていましたが、
競プロをやりたいとは思わないなあ…



751 名前:デフォルトの名無しさん [2018/05/09(水) 17:28:08.89 ID:bhGLBTeZ.net]
ロベールの本に以下のコードがあります。
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;
}

752 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 17:38:59.81 ID:J0gm0Ysv.net]
スタックポインタをずらす量が変わるだけ
これによる時間はゼロと思って良い

753 名前:デフォルトの名無しさん [2018/05/09(水) 17:44:16.81 ID:bhGLBTeZ.net]
>>739

そういうのを分かるようんなるにはどうすればいいのでしょうか?
C++の本だけ読んでいても分からないような気がします。

754 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 17:45:58.33 ID:J0gm0Ysv.net]
もしパフォーマンスが問題になるなら
printfをなんとかすべき

755 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 17:52:37.44 ID:J0gm0Ysv.net]
>>740
コードを書いたときに具体的にどんな処理が行われるか
を地道に学んで行くしかない

アセンブラを見てもいいし本で学んでも良いし
時間を測っても良い

C言語の方が簡単なのでC言語にある機能から

756 名前:デフォルトの名無しさん [2018/05/09(水) 18:27:14.15 ID:bhGLBTeZ.net]
>>742
ありがとうございました。

757 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 19:10:47.36 ID:WcTkBSWX.net]
>>738
毎ループその buf が作られるかという質問について言えば
関数に入るときに確保された領域が毎ループ使い回されるだけ

758 名前:デフォルトの名無しさん [2018/05/09(水) 19:12:26.96 ID:bhGLBTeZ.net]
>>744
ありがとうございます。
newした場合にはもちろん毎回別の領域が確保されるわけですよね。
文法だけからでは分からないことだと思うので、そのような部分を解説した本が
あればよいのですが。。。

759 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 19:21:16.91 ID:sQgpoJ7Q.net]
コンストラクターを起こすようなクラスならアレだけど
基本型はループの

760 名前:外においやらている可能性が高い

まぁ使ってるコンパイラの最適化次第というのはある

文法/規格だけで解決しない自由な部分は
実際に使ってるコンパイラの吐き出すコードをみるなり
実測して違いが出るか確認いてみたり……

初心の「それ無駄だろうという直感」は最適化で瑣末ごとになることが多い?かな?
[]
[ここ壊れてます]



761 名前:デフォルトの名無しさん [2018/05/09(水) 20:03:17.36 ID:bhGLBTeZ.net]
>>746

ありがとうございました。

762 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 20:03:43.32 ID:tbbSaefy.net]
>>745
C++ スタック ヒープで検索すると解説しているページは山ほどヒットするけどいい本ってあるのかな。
CPUとメモリの動作とか簡単に学んでおくといい気がする。

スタックに収まらないような大きな領域をスタックに取ってはいけないとか
実践的に必要な知識でもあるんだよね。

763 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 00:46:37.51 ID:hNESkqkP.net]
>>748
個人的には、はじめて読むシリーズがコンパクトで良かった。
はじめて読む8086
はじめて読むPentium
はじめて読むMASM
はじめて読む486
486は結構ボリュームがある

764 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 12:36:43.93 ID:dXwOta4y.net]
クラスの練習に文字列クラスっぽいものを作ったんですが
Mystr Mystr::operator=(Mystr &obj){
//左辺に右辺を代入
return *this
}
こうすると代入のたびに戻り値を返すためにコピーコンストラクタとデストラクタがわざわざ呼ばれてるみたいなんですが
関数の戻り値をvoidにする以外でなくす方法はありませんか?
一応コード全文 https://ideone.com/A1iQ3Y

765 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 12:55:29.56 ID:vDlJ/Ca2.net]
>>750
>Mystr Mystr::operator=(Mystr &obj){

一般的にはこうする
Mystr & Mystr::operator=(Mystr &obj){

766 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 13:00:33.59 ID:TqAsciuR.net]
Mystr & Mystr::operator=(const Mystr &obj);

767 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 13:59:44.86 ID:dXwOta4y.net]
ありがとうございました
戻り値にも参照が使えることを知りませんでした

768 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 14:05:03.21 ID:vDlJ/Ca2.net]
>>753
おそらくわかっていると思うけど、ローカル変数や
テンポラリーオブジェクトの参照は返しちゃダメなので注意

ダメな例
T& f() { T a; .....; return a;}
string& g() { string a, b; .....; return a+b;}

769 名前: mailto:sage [2018/05/10(木) 17:59:19.87 ID:XVn0zvPu.net]
>>749
はじめて読む 486 は良書だけれでも、今、これを実際のマシンで試してみることはできなくなりましたね…

770 名前:はちみつ餃子 mailto:sage [2018/05/10(木) 18:38:04.46 ID:RiSXhiCD.net]
アセンブラって「低水準言語」なはずだけども、今となっては機械語すらもかなり高水準だもんな……。
機械語の並びをコンパイルして最適化された μop にするみたいなことが CPU の中で起こってて、
機械の気持ちを理解するには機械語はまだまだ外側の方って感じ。

>>755
動かすための情報を集約しようとしてはしてるよ。
ある程度は動く。
https://github.com/tkmc/486



771 名前: mailto:sage [2018/05/10(木) 19:41:56.87 ID:XVn0zvPu.net]
>>756
これなんかも、動くかもしれません
takeda-toshiya.my.coocan.jp

772 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 20:45:54.69 ID:CLWEept/.net]
アドレスでアクセスできるメモリってものがあってデータやコードが書かれてるのかー
スタックなる仕組みでローカルな記憶域をほぼコストゼロで確保してんのかー

と言うことがわかれば十分な気がする

773 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 00:09:23.84 ID:cA/jbwin.net]
>>758
>>749
これの上の3冊は薄くてすぐ読めるから、もやもやとした状態でいるよりはいい気がする。
ただ、486以外は古本でしか手に入らなそうだけど。

774 名前:デフォルトの名無しさん [2018/05/11(金) 07:04:43.76 .net]
薄い本ならコミケで売れや

775 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 13:11:04.97 ID:Mluu9Rs0.net]
アセンブラの前に

まずは変数がどこにどのように確保されるかとか
どのように初期化されるかとか
そっちの方が先だろ

スタティック、スタック、ヒープ
をまず理解する
C++であればvirtual関数が呼ばれる仕組みとかも
知ってた方が良い
例外の仕組みは機種依存が大きいのでもうちょっと先で

776 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 14:03:43.45 ID:lM6VzEPt.net]
>>760
zob.club/zob/2018/04/16/同人誌-advanced-assembler-386-上ノ巻/

777 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 15:32:04.47 ID:L7FGnh/N.net]
>>761
そう。
でもスタックを理解するにはメモリという概念モデルの理解が必要
だけど皆が勧めてるようなx86の解説書はやめたほうが良いと思う

セグメントレジスタとか原理を学ぶには邪魔なノイズが多過ぎる

778 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 16:43:05.52 ID:ArEHxDOw.net]
Z80からはじめよう。

779 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 17:23:03.14 ID:fUD4+ayW.net]
実用レベルのCで関数ローカル変数がどう実現されてるか、となると
ベースポインタというほぼ専用のレジスタが出てくるからなぁ。

そういえば昔、Cが全然分からない頃にMASMの本を読んだら、
Z80や6502のアセンブラではついぞ出てこないディレクティブが色々あって
まったく意味が分からなかったのを思い出した。
高級言語のコンパイラを作ったり、ライブラリとして呼べるマシン語の
サブルーチンを作るための機能なんだと後になって腑に落ちたけど。

780 名前:はちみつ餃子 mailto:sage [2018/05/11(金) 17:39:10.37 ID:e+Ei11A7.net]
C の言語としての理屈が現代のコンピュータの仕組みと乖離しててもはや低級言語とは言えないということを
「C は PDP-11 エミュレータ」なんて揶揄してるのをどこかで見たことがあるな。



781 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 17:48:59.53 ID:S57n19k4.net]
Cに引きずられて仕様のできたMIPSはCの理解にとてもいいよ

782 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 19:45:01.89 ID:CPfY1M+a.net]
龍芯3号か

783 名前: mailto:sage [2018/05/11(金) 20:48:44.74 ID:/s88DeTW.net]
マシン語をやるのなら、実際に石を触れる感じのする環境がいいなあ、あくまで「感じ」だけれども
仮想マシンの中間コードを触るのは疑問

784 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 20:52:01.78 ID:Mluu9Rs0.net]
PCはPCで面白いし、
8bitは8bitで面白い

785 名前:はちみつ餃子 mailto:sage [2018/05/11(金) 20:54:19.03 ID:e+Ei11A7.net]
AKI-80 の時代の人なのでラズパイで電子工作とかやってるのを見ると隔世の感がある。

786 名前:デフォルトの名無しさん [2018/05/11(金) 20:56:49.04 ID:2EGPeEG9.net]
Donald Knuth の MMIX っていう言語は勉強するとためになりますか?

787 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 01:53:53.98 ID:Cq1QtQw6.net]
>>761
理解すると言っても何を勉強して理解するのか?
という話だと思ったんだけど。
アセンブリやCPU関連の本以外で具体的に分かるものがあるというのがよく分からないな。

788 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 04:35:38.94 ID:F7LxnV/h.net]
wikipedia の「コールスタック」の項に意外にしっかりした説明あるな
コールスタックって何?スタックフレームってなに?
って人は読んでおくといいと思う。

789 名前:デフォルトの名無しさん [2018/05/12(土) 14:17:18.55 ID:CbmhA0Cx.net]
メモリとかスタックとかヒープとかって、C/C++ 言語仕様とは直接の関係がないけど、使う上では結構重要な情報だよねー。
Cを学習する上で避けられない割に、C視点側からの詳しい学習書って無いよなー。

環境依存部分だから、言語学習書に適さないってのもわかるんだが…何とかできないものかと常々思ってる。
(思ってる「だけ」で実行には移さないのだけれどもw

790 名前:デフォルトの名無しさん [2018/05/12(土) 14:20:15.63 ID:CbmhA0Cx.net]
>>772
ならないと思う。
クヌース先生の本を読む上での決まり事を、先生が定義しただけに過ぎない、と理解してる。



791 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 15:41:16.04 ID:9vavBtpK.net]
RISC-Vの方がまだ有用な可能性が

792 名前:デフォルトの名無しさん [2018/05/23(水) 19:24:44.84 ID:Au5e7VGg.net]
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

AA6VB

793 名前:デフォルトの名無しさん mailto:sage [2018/05/24(木) 10:45:43.84 ID:cPlRxlDn.net]
AA6VB

794 名前: mailto:sage [2018/05/24(木) 20:42:22.15 ID:dCOL2CYR.net]
>>775
たしかに、そこをつく本を書けば売れるかもしれない
そんな本に書くべきことは、他に何があるだろうか?
・qsort() の説明
・アセンブリ言語とのリンク
・PEフォーマット
…etc

795 名前:はちみつ餃子 mailto:sage [2018/05/24(木) 21:49:22.52 ID:jqqWnK8Z.net]
>>775,780
江添氏が C++ の入門書で、言語以外の周辺事情もある程度カバーしたものを書こうとしてるみたいだぞ。
今は二の補数を説明すべきかどうかとか TWITTER でグダグダ言ってるから、
当たり前みたいで、しかし説明を省略されがちなことも含まれると思う。

796 名前:デフォルトの名無しさん mailto:sage [2018/05/24(木) 22:04:43.75 ID:hqF4m+Xg.net]
シフトを使って多倍長計算とか、ZDDとか(クヌースの4巻だけど日本発)

797 名前:デフォルトの名無しさん mailto:sage [2018/05/24(木) 23:04:39.55 ID:agu/wXZc.net]
浮動小数点の誤差がらみとか、バッファオーバーフローでなんで脆弱になるのかとか、キリがなくなるぞ

798 名前:デフォルトの名無しさん mailto:sage [2018/05/25(金) 06:31:49.05 ID:ZdzP9wu5.net]
コンパイルとリンクとロードの話とか。

ソースファイルからオブジェクトファイルに変換したときに
どんな情報が残ってどんな情報が消えるか。
オブジェクトファイル群をリンクした段階でまだ確定せずに
実行時のロードで配置されるアドレスのこと、あたり。

799 名前:デフォルトの名無しさん [2018/05/31(木) 19:40:53.15 ID:xDJZQ821.net]
ちょっとCと関係ないですが、コンピュータサイエンティストの人がよくMacを使っているのはなぜですか?

800 名前:デフォルトの名無しさん mailto:sage [2018/05/31(木) 19:48:19.66 ID:DFMmAXw3.net]
しねばいいのに



801 名前: mailto:sage [2018/05/31(木) 20:29:52.32 ID:4k9lsrlf.net]
>>781
二の補数はあたりまえに書いてもいいとおもうけれども、二の補数以外のものがあることを陽に記述する必要はないんじゃないかな…

802 名前: mailto:sage [2018/05/31(木) 20:30:39.27 ID:4k9lsrlf.net]
>>785
Mac はお高いからな…






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<287KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef