X



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

■ このスレッドは過去ログ倉庫に格納されています
0313はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/09/01(土) 01:29:32.00ID:0H62RJv3
>>312
アセンブラの色々を自動化したみたいな立場からのスタートだから、
歴史的には具象から抽象へという形で成立しているが、
あくまで C を学び始めた人のスタート地点として、
「ビット表現、あるいは範囲が決まった値のどちらがなじみやすいか」という話。

普通の人が日常的に数値を扱うことはあるし、
その中には上限・下限が決まっているということもある。
でも、 0 と 1 の集合で表現するという考え方を日常的にしている人はかなり少数派だよ。
馴染みやすい方から入って行って最終的に「なるほど内部ではこう表現されるのか」
に至るのってそんなに不自然な道筋かな?
0314デフォルトの名無しさん
垢版 |
2018/09/01(土) 11:33:31.89ID:8bxP8UXu
>>313
だから具体的に動作させられる環境がないと勉強出来ない。
小学校で1+1を学んで中学でx+yのように抽象化してきたでしょ。
0315はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/09/01(土) 13:35:02.88ID:0H62RJv3
>>314
数値型変換の規則とかも数値として決まってる。
動作させるのにビット表現で考える必要は無いだろ。

なんらかのビット表現を割り当てて動作はするけど、
そりゃコンパイラの考えることで、
人が最初からどうしても把握しておかなきゃならないもんではない。
0316デフォルトの名無しさん
垢版 |
2018/09/01(土) 14:58:35.23ID:lb2h//8s
>>315
ビット表現を最初から考えておく必要も把握しておく必要もないけど、具体的な実体を知っていた方がイメージしやすく理解しやすいと思う。
そこまで忌避する理由が分からない。
0318デフォルトの名無しさん
垢版 |
2018/09/01(土) 16:37:00.14ID:/wwW4VSs
頭悪いからビット演算できないと自白してる
0319はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/09/01(土) 16:46:00.86ID:0H62RJv3
>>316
繰返すが、数値のビット表現は世間一般の感性からすると全く異質だ。
だから「(いきなり最初には) イメージしやすくない」と言ってるの。
無理してでも最初に身につけられたら後が楽ってことはあるかもしれんが、
イメージしやすいってことは無い。

ビット表現は C に慣れた人にとってあまりにも当然の大前提すぎて、
それをわからん奴にはだいぶんイラつくが、
すんなりとは納得できない方が普通だよ。
0320デフォルトの名無しさん
垢版 |
2018/09/01(土) 16:47:02.21ID:/wwW4VSs
はいはい
頭悪いからビット演算できないと
だからどうした
0321はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/09/01(土) 16:50:28.48ID:0H62RJv3
>>318
入門者の大多数が (十分に) 頭が良いと想定するのはそれこそ馬鹿げた判断だ。
とんでもない方向の思い違いが勢ぞろいなのが普通。
0322デフォルトの名無しさん
垢版 |
2018/09/01(土) 16:56:01.26ID:/wwW4VSs
健常者に届かないぐらい頭悪いから
オレはビット演算はあきらめた
と自白されても困るワケ
0323デフォルトの名無しさん
垢版 |
2018/09/01(土) 17:10:11.60ID:3YNLHjk8
外野から見ると自分は頭が良いと思い込んでそうなID:/wwW4VSsよりはちみつの方が賢そう
0324デフォルトの名無しさん
垢版 |
2018/09/01(土) 17:11:33.86ID:/wwW4VSs
オレは頭いいとか
ひとことも書いてないからな

キミラが健常者に程遠いほど
頭悪いわけ

それがわからない?
0325デフォルトの名無しさん
垢版 |
2018/09/01(土) 17:12:36.29ID:/wwW4VSs
まず途方もないほど頭悪いという自覚がない
それが致命的

バカを自覚できないからバカが治らない
0326デフォルトの名無しさん
垢版 |
2018/09/01(土) 17:14:33.25ID:np0z0HoI
はちみつさんの主張「初心者にビット表現から教える必要はない」を
当人がビット演算できない僻み、とか捉えるのは明らかに間違いだろ。
対立が昂じて厳しい言葉を使いそうになった場を茶化すのは俺も好きだけど。
(余計に険悪になったところで「お呼びでない…」と立ち去る流れまで込み)

実際のところ「初心者に2進数での数値表現を理解させることが困難か?」
については、今なら「コンピューターの中ではゼロイチで情報が記憶される」
くらいの基本知識は持ってるだろうから、昔よりは敷居が低いんじゃないかな。

…とは言え自分もマシン語ハンドアセンブル相対ジャンプ暗算から
入ったクチだから、経験に基づいたバイアスが強いかも知れん。
ビット表現を使わず初心者に説明する良い資料があるなら読んでみたい。
たぶん得るところは大きい。
0328デフォルトの名無しさん
垢版 |
2018/09/01(土) 20:41:28.08ID:V3Jbt1LZ
>>326
必ず半角カナを使ってレスしてるいつもの人は、常に持論は正しく相手は低能というスタンスで一方的に断定しかしないから、深く考えても仕方ないよ。
半角君のいってることはまともなこともあれば的はずれなこともあるけど、常に共通するのは周りの指摘や疑問には耳を貸さず、議論の流れも無視して自分の主張を繰り返すだけということ。
だから、斜め読みして受け流すだけでいいと思うよ。
0329デフォルトの名無しさん
垢版 |
2018/09/01(土) 20:56:42.17ID:/wwW4VSs
なるほど
知恵遅れは議論したつもりになってんのか
知恵遅れの場合議論できるレベルに到達してない

まずそこの自覚がない
0330デフォルトの名無しさん
垢版 |
2018/09/01(土) 21:11:37.01ID:DoChZsV8
C形式の二次元配列は先頭から一次元配列みたいな顔して普通にアクセスできると思うんですが
C++11以降でネストしたstd::arrayでもポインタを使って一次元配列のようにアクセスしても規格上セーフですか?

↓のコードのようにforループ一つで上下左右方向の繰り返しを済ませたいです
https://ideone.com/HbRfZu
0331デフォルトの名無しさん
垢版 |
2018/09/01(土) 22:08:01.79ID:/wwW4VSs
1次元の可変の列を行とみなして
そのそれぞれの行に可変の1次元の列がある状態になってる

つまり、行毎にバラバラにそれぞの行のヒープができる作りになる
そもそもC++の規格とか関係ない

低学歴であれば低学歴であるほど
言語の規格なんかぜんぜん分かってないくせに
自分を大きくみせるために言語の規格がどうこういってるのだけは
よおく分かったわ
0332330
垢版 |
2018/09/01(土) 23:53:24.94ID:DoChZsV8
>1次元の可変の列を行とみなして
>そのそれぞれの行に可変の1次元の列がある状態になってる
>つまり、行毎にバラバラにそれぞの行のヒープができる作りになる
というのはどういうことでしょうか
行ごとにバラバラなので行をまたいでのアクセスはできないという意味でしょうか

C形式の多次元配列もネストされたstd::arrayも、各要素は連続したメモリ領域に置かれていますよね
というかC形式の(少なくとも)二次元配列は一次元配列として全要素にアクセスできると思っていたのですが
間違っていますか?
0333デフォルトの名無しさん
垢版 |
2018/09/02(日) 00:08:35.47ID:Tb3tt8fk
array 1個作ったら1個ヒープできるのはわかる?
0334はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/09/02(日) 00:20:34.44ID:vK23Frpo
>>326
昔から C を使っている人ってまさにそういう感じの低レイヤや
それに付随するあれこれの知識と一緒に習得してきた人が多いと思う。
だけど、 Teratail とか StackOverflow とかでの質問を見てると、
俺らがあまりにも当然の前提と思ってそこにあることにすら気づいてなかったものが
今の入門者にとってはハードル高いのかもしれないと感じることが結構あって、
教え方も昔の通りにはいかないんじゃないかねと思えてるの。
0335デフォルトの名無しさん
垢版 |
2018/09/02(日) 00:23:28.95ID:PYGLVvbR
>>330
Cでも未定義動作だよ。
JIS C (JIS X 3010:2003) 6.5.6 加減演算子
>  整数型をもつ式をポインタに加算又はポインタから減算する場合,結果は,ポインタオペランドの型を
> もつ。(中略)ポインタオペランド及びその結
> 果の両方が同じ配列オブジェクトの要素,又は配列オブジェクトの最後の要素を一つ越えたところを指し
> ている場合,演算によって,オーバフローを生じてはならない。それ以外の場合,動作は未定義とする。
0337デフォルトの名無しさん
垢版 |
2018/09/02(日) 00:26:27.09ID:Tb3tt8fk
バカは自分で引用してる文章の意味がわかってない
ホントなかわいぞうなぐらい頭悪い
0338デフォルトの名無しさん
垢版 |
2018/09/02(日) 00:27:46.09ID:Tb3tt8fk
バカはなんでとてつもなく自分がバカであるか
分かることは永遠にない
0341デフォルトの名無しさん
垢版 |
2018/09/02(日) 00:42:46.41ID:eH7Ohm4T
>>333
ヒープというのは動的に確保されたメモリのことでしょうか
ネストしたstd::arrayというのは、std::array<std::array<int, 2>, 3>というような意味で使っていました(リンク先のコードにある通り)
その場合メモリは動的確保されないと思いますが…

>>335
Cのその「配列オブジェクト」というのは多次元配列を一つのオブジェクトとして見るのではないということですか
ポインタと要素数を引数にとる関数に多次元配列を渡すコードをこれまで少なからず見てきた(教えられた)から勘違いしてたかも
0342デフォルトの名無しさん
垢版 |
2018/09/02(日) 00:50:28.37ID:Tb3tt8fk
ヒープといのはオレがウソ書いてた
そのまま書いたら固定で配列がスタックにできる

アホが引用してるのは
あきらかに全然関係ない頭悪いのを引用してる
0343デフォルトの名無しさん
垢版 |
2018/09/02(日) 00:54:46.07ID:Tb3tt8fk
array
┣array
┃┣ int
┃┗ int
┣array
┃┣ int
┃┗ int
┗array
 ┣ int
 ┗ int

こうなる
0344デフォルトの名無しさん
垢版 |
2018/09/02(日) 01:03:53.61ID:Tb3tt8fk
アホが引用してる部分は

たとえばこんなソースがあった場合、

int* ai_aho[3] = {1, 2, 3}
int* pi_aho = ai_aho;

for (int i = 0; i < 3; ++i, ++pi_aho) {
 *pi_aho = 1;
}

pi_ahoはループを抜けたあと
pi_ahoはソース上適切でないアドレスをさしてるが
こいつを参照しなければ問題ないということが書いてある
0345デフォルトの名無しさん
垢版 |
2018/09/02(日) 01:18:27.35ID:PYGLVvbR
>>341
int a[N][M] に対して a + i するときの「配列オブジェクト」は要素型 int [M] で要素数 N の配列のこと。
N を超えて加算すると未定義動作になる。
a[0] + i するときの「配列オブジェクト」は要素型 int で要素数 M の配列のこと。
同じく M を超えて加算すると未定義動作になる。

ポインタを受け取る関数に a[0] あるいは &a[0][0] を渡した場合も M を超えて加算した場合は同じ理由で未定義動作になる。
期待した動作をすることも多いだろうけど、信頼性や移植性は損なわれる。
0347デフォルトの名無しさん
垢版 |
2018/09/02(日) 01:20:32.56ID:Tb3tt8fk
(正)int ai_aho[3] = {1, 2, 3};
(誤)ai_aho[3] = {1, 2, 3}

目視で確認した
コレでいける
0348デフォルトの名無しさん
垢版 |
2018/09/02(日) 01:23:43.36ID:Tb3tt8fk
な、低学歴知恵遅れはなにも分かってない
まずなにも分かってないのに規格読んで分かったふりしてるのがよく分かる
0349デフォルトの名無しさん
垢版 |
2018/09/02(日) 01:25:42.40ID:Tb3tt8fk
低学歴知恵遅れが規格読んでも
規格なんか分かるわけがないからな

そもそも基本的にポインタがどう加算されるかすら分かってないのに
0350デフォルトの名無しさん
垢版 |
2018/09/02(日) 01:43:11.24ID:Tb3tt8fk
uint32_t aho[4];
uint32_t* p_aho32 = aho;
uint8_t* p_aho_8 = (uint8_t*)aho;
p_aho32++;
p_aho_8+=4;

どっちのアドレスも同じになる

配列の場合どうなるか
考え方はまったく同じだな
あとはもう分かるハズだ
0351デフォルトの名無しさん
垢版 |
2018/09/02(日) 04:27:28.97ID:xXZGLywM
ロベール05-09の関数内に引きこもりって章のサンプルコードが長すぎて読めません(3ページ使用)
<algorithm>ってファイルを始めてincludeしてるにも関わらず其れに関して何ら説明ないし…
この章に関しては静的変数はグローバル変数と同じように使えてプログラムが終わるまでずっと同じメモリを参照している
と覚えられれば必要十分ですか?
何か簡単なコードを書いて教えてくれると助かります

よろしくお願いたします。
0353デフォルトの名無しさん
垢版 |
2018/09/02(日) 06:49:15.39ID:p4iMlD/t
例によってロベール著を読んでないし、下のコードはCだけど、
関数内static変数の説明なら、CもC++も変わらんだろう。
(行数節約のため詰め込み・省略してるので良いスタイルじゃない)

#include <stdio.h>

static void in_static(void) {
 static int cnt = 0; /* staticな変数 */
 cnt++;
 printf(" static %d 回目!\n", cnt);
}

static void not_static(void) {
 int cnt = 0; /* staticじゃない変数 */
 cnt++;
 printf("not_static %d 回目?\n", cnt);
}

int main(void) {
 in_static(); not_static();
 in_static(); not_static();
 in_static(); not_static();
 return 0;
}

こんな感じかな。
このコードには盛り込んでないけど、グローバル変数と違って
「関数内static変数には、基本的には関数の外からはアクセスできない」
という性質もある。
0354デフォルトの名無しさん
垢版 |
2018/09/02(日) 07:47:30.33ID:xXZGLywM
>>353
違う言語にも関わらず書いていただきありがとうございます
実際に実行してみてかなりスッキリしました
自動変数と静的変数の違い、しかと理解できました
関数についてるstaticも気になるところですが読み進めたいと思います
0355デフォルトの名無しさん
垢版 |
2018/09/04(火) 08:18:27.05ID:bj+tb6HS
char str[]={"aaaaaa","iiiiiiiii","uuuuuuu"};
は出来ないのに
char* str[]={"aaaaaaa",iiiiiii","uuuuuuu"};
が出来るのはなぜですか?
ポインタと配列は密接な関係にあるんじゃないんですか

よろしくお願い致します
0356デフォルトの名無しさん
垢版 |
2018/09/04(火) 11:38:18.11ID:ClV8CEAe
"aaaaaa" とか "iiiiiiiii" とか "uuuuuuu" がchar*型だから
char型の配列に入れようとしても無理な話
0358デフォルトの名無しさん
垢版 |
2018/09/04(火) 12:51:15.55ID:bz6n3SY3
char str[]={"aaaaaa"};はできる
char str[]={"aaaaaa","iiiiiiiii","uuuuuuu"};はできない
char *str[] = {"aaaaaa","iiiiiiiii","uuuuuuu"};はできる
char str[][9] = {"aaaaaa","iiiiiiiii","uuuuuuu"};ならできる

一番目は長さを指定しない配列変数の宣言で初期化により長さが指定されている。
二番目は{"aaaaaa","iiiiiiiii","uuuuuuu"}は文字列の配列なので変数の型と一致しないためエラーになる
三番目はポインタの配列なので配列の各要素を対応する文字列で初期化できる
四番目は配列の配列なので文字列の配列で初期化できる(ただし要素数の指定は必要)
0359デフォルトの名無しさん
垢版 |
2018/09/04(火) 14:22:07.00ID:JAXadswE
>>355
前者の[]は、文字の「列」を表すから
後者の[]は、文字列ポインタの「配列」を表すから

charはcharacterの略称、characterは文字、それが複数個集まった列が文字列
列となっているものが根本的に違う
0360デフォルトの名無しさん
垢版 |
2018/09/04(火) 17:31:45.30ID:bj+tb6HS
>>357
なんかこの違いを仕様で片付けて覚えるのはあまりよろしくないみたいなこと本に書いてあったので
違いが知りたかったです
>>356,358,359
ありがとうございます
文字列リテラルはポインタ型だったんですね
それなら代入出来ない理由も納得出来ます。スッキリしました
0361はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/09/04(火) 17:48:16.60ID:f5HJ/2BD
>>360
厳密にいえば文字列リテラルの型は配列だよ。 具体的に言えば const char[] ね。
暗黙の型変換で const char* として解釈される場合も多いってだけ。
0362デフォルトの名無しさん
垢版 |
2018/09/04(火) 18:01:39.16ID:gZnu4stV
そのリテラル文字列はNULでターミネートされる
配列の長さが+1される

べつにNULターミネートしなくても
文字列は扱える

つまり長さが保存されないかわりに
NULでターミネートされてる
それをcでは文字列と呼称している
0363デフォルトの名無しさん
垢版 |
2018/09/04(火) 18:04:32.71ID:gZnu4stV
そして、charの配列要素が
1つの文字を表してるとは当然限らない

MBCのように連続する複数の配列の要素が
1つの文字を表すことが多い

で、strlen()で文字の数が返却されないのは当然
0368デフォルトの名無しさん
垢版 |
2018/09/04(火) 20:43:24.10ID:gZnu4stV
ユリウス日に変換してから計算するから
問題ない
0371デフォルトの名無しさん
垢版 |
2018/09/06(木) 23:16:14.27ID:xdo6cDUj
 int wday=5;
 char week[] = "SunMonTueWedThuFriSat";
 printf("%.3s",&week[wday*3]);

これでどうだw
0372デフォルトの名無しさん
垢版 |
2018/09/07(金) 06:40:53.97ID:Pk3Mmzkj
悪い例 (キャストの悪用、データサイズの勝手な仮定)
int wday = 5;
printf("%.4s\n", &((int*)"Sun.Mon.Tue.Wed.Thu.Fri.Sat.")[wday]);

軽いジョークのつもりで書いてみたけど、セグメンテーション・フォールトが出て
動くまでに予想外に手間取ってしもうた。
原因はアドレス演算子 & の付け忘れだった。
0374デフォルトの名無しさん
垢版 |
2018/09/07(金) 07:46:30.50ID:Pk3Mmzkj
表示幅の指定で .3 なら >>371 と同じになるよ。
英単語の省略形にピリオドをつけたいのは好みの問題なの。

今は曜日も月名もピリオドを付けないのが一般的なのかな。
<time.h> の asctime() も3文字3文字だね。
0375372
垢版 |
2018/09/07(金) 17:37:51.74ID:Pk3Mmzkj
たびたび失礼、そしてまるっきり実用の役に立たない話ですまぬ。

&((int*)"Sun.Mon.Tue.Wed.Thu.Fri.Sat.")[wday]
「いったん[]で配列形式でアクセスしてから要素のアドレスを得る」
なんて回り道をしないでも
(int*)"Sun.Mon.Tue.Wed.Thu.Fri.Sat." + wday
と素直にポインタの足し算だけでいけたね。


…難解Cプログラムに凝る人の気持ちがちょっと分かった気がする。
0376デフォルトの名無しさん
垢版 |
2018/09/07(金) 22:40:13.74ID:B/yxkRYZ
intのサイズがcharのサイズの4倍でないと動かない
難解ではなくただの知恵遅れのコード
0377デフォルトの名無しさん
垢版 |
2018/09/08(土) 01:17:02.50ID:ejo+9snz
sizeofがイマイチ分からないです
型や変数のサイズを出す演算子ってのは分かったんですが
例えばこの例↓どういう風に化けてるんですか?
https://ideone.com/szVAAP
sizeof studentで要素数3だから3に化けると思うんですが、右の*studentは何に化けてるんですか?
0378はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/09/08(土) 01:27:45.49ID:VmsJpbI+
sizeof が返すサイズってのはバイト数だというのがよくわかってないのかな。
もう C++ では type_traits の std::extent を使って欲しい気持ち。
0380デフォルトの名無しさん
垢版 |
2018/09/08(土) 01:56:15.85ID:ejo+9snz
>>378
分かってないです
ロベールの入門書読んでるんですが説明が少なすぎてこの27行目の式が分かりません。
構造型のバイト数も分かりませんし…int3個とchar一個だから13バイト?
>>379
すいません、分かりません
sizeof(student) / sizeof(Student);が何に化けてるのか検討も付きません

ありがとうございます。
0381デフォルトの名無しさん
垢版 |
2018/09/08(土) 02:11:10.26ID:j/6nk0eH
https://ideone.com/aPMXLA
コレでなにが分からないか自分で説明できないなら
すべてを諦めたほうがいい
0382はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/09/08(土) 02:24:06.10ID:VmsJpbI+
>>380
int のサイズは処理系依存なので、具体的に何バイトとは言えない。
でもまあ現代的なパソコンなら 4 バイトのことがほとんどだろうね。
さらに言えば仕様上は構造体の要素の間にスキマがあいててもかまわない。

> int3個とchar一個だから13バイト?

この構造体中の char は MAX_NAME+1 個じゃん。

まあそれはそれとして、
sizeof student というのは、 student という配列の大きさを「バイト数で」返してきて、
sizeof *student というのは student 配列の要素ひとつの大きさをバイト数で返してくる。
つまり、配列全体の大きさを配列の要素の大きさで割ったら配列に含まれる要素の個数になる。
この場合は 3 ってこと。

sizeof *student が配列の要素ひとつを表現しているっていうのがちょっと分かり難いかなぁ。
0383デフォルトの名無しさん
垢版 |
2018/09/08(土) 02:52:28.11ID:OyJ8jP1h
>>377, >>380
前にも質問してた人だな
まず、sizeofはメモリ上に確保された対象のバイト単位のサイズを返す(charは1バイト、intは4バイト)
sizeof studentは、配列全体(要素数 x Student型のサイズ)のバイト単位のサイズを返す、配列の要素数は返さない
sizeof *studentは、Student型のバイト単位のサイズを返す
それらの割り算をしてるのだから、結果は要素数になる
0384デフォルトの名無しさん
垢版 |
2018/09/08(土) 02:56:57.12ID:OyJ8jP1h
>>382
>sizeof *student が配列の要素ひとつを表現しているっていうのがちょっと分かり難いかなぁ。

個人的にそういう表記は嫌だわw
変数のサイズを求めるなら、その型名でって思う
0385はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/09/08(土) 03:03:57.30ID:VmsJpbI+
>>384
へー、私は逆に型名よりも変数名で書きたい派。
これは変数 student について調べたいのであって、
型 Student について調べたいわけでは無いので。
0386デフォルトの名無しさん
垢版 |
2018/09/08(土) 03:07:29.94ID:ejo+9snz
>>382
すいません、おかげさまでどういう計算してるのか理解できました
確かにポインタにすると何で要素一つのサイズなのか理屈づけて説明できません…sizeof student/sizeof student[0]とかだと分かりやすいです
ありがとうございます。意味が理解できたので応用して使えそうです
0387はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/09/08(土) 03:08:42.91ID:VmsJpbI+
>>384-385
私が sizeof *student が分かり難いと述べたのは
配列名に * を付けたものが配列の先頭要素になるルールの背景にある暗黙の型変換が分かり難いって話。
C/C++ を使ってると空気みたいにやっちゃうんだけど、これ実際のところだいぶんアレなルールですよ。
0388デフォルトの名無しさん
垢版 |
2018/09/08(土) 03:13:32.57ID:OyJ8jP1h
>>385
型が表すサイズの定数だから、変数から取得するってのが気持ち悪いよ
sizeofなんて何か細かいことワチャワチャしたい時に型のサイズ欲しいよねーって感じの演算子だものw
0390はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/09/08(土) 03:22:37.80ID:VmsJpbI+
>>388
この場合くらいの小さなサンプルだとあまり気にならないけど、
その変数が何の型であるか知っていなければならないっていうのが、
読むときの負荷が高いと感じてしまう。

自分を信用してないというか、自分がアホだということを信用しているので、
色々忘れて読んでも良いように書きたいと思ってる。
0393はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/09/08(土) 03:48:16.76ID:VmsJpbI+
そもそも

for (int i = 0; i < size; ++i) {
Show(student[i]);
}

のところはモダンな C++ では (つまり C++11 以降では)

for (auto& e: student) Show(e);

と書けるので配列の要素数を事前に計算する必要なかったわ。
0394 ◆QZaw55cn4c
垢版 |
2018/09/08(土) 03:53:09.60ID:t7GfMYxV
>>380

>>382
>sizeof *student が配列の要素ひとつを表現しているっていうのがちょっと分かり難いかなぁ。

私は、これはかなり紛らわしいとおもっているので、こういうときには必ず
struct FOO { int n; ..... } array[N];
int n = sizeof(array) / sizeof(array[0]);
としています、こっちの方が好きです

構造体の配列の第一番目を指すポインタ
struct FOO *p;
p = &array[0];
のときに *p は array[0] に入っている「構造体の一つの要素全体」を表します、すなわち *p イコール array[0]

しかし、この表現はすぐに直感的にイメージとして頭に入ってくるわけではなく、何度となく書いたり読んだりしてゆっくり染みこんでくるものだ、と私は経験しています
同様に p->n とか、これと等価な (*p).n とかの表現など
書き続ければ、あるいは読み続ければ、そういうのは、だんだんわかってくるのではないかな、と。
0395はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/09/08(土) 03:59:06.82ID:VmsJpbI+
C を使ってるときは感覚的に理解してて全く不都合なかったけど、
C++ のテンプレートやなんやかやを利用するようになると、
やっぱりちゃんとルールを把握せないかんなと思った。
0398デフォルトの名無しさん
垢版 |
2018/09/08(土) 10:37:06.40ID:ZUEeKRTR
>>388
何かの都合でその変数の型を変えた時に変更し忘れたらバグになる元
型で書く奴はアホだと言い切ってもいいレベル
0400デフォルトの名無しさん
垢版 |
2018/09/10(月) 18:57:43.66ID:70yMIW0+
c#から使うクラスライブラリをc++/cliで作っています。
クラス変数をoutで渡してメソッド内で値を入れたいのですが、c++側はどんな風に書けばよいでしょうか?
0403デフォルトの名無しさん
垢版 |
2018/09/17(月) 21:49:35.29ID:t753Z4pL
ロベール入門の内部リンケージ外部リンケージ云々の下りがちょっとよくわからないんですが
externを付けると別のcppの変数を弄れるってことであってますか?
0404デフォルトの名無しさん
垢版 |
2018/09/17(月) 22:34:28.19ID:t753Z4pL
externをつけると別のファイルのグローバル変数、関数を使えてローカル変数は使えないんですか?
0405さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2018/09/17(月) 22:40:39.04ID:yTXbMS5S
>>403
はい、そうです。
>>404
staticではないローカル変数は外側から参照できない。static付きの変数は静的に確保されるので、アドレスを使えば参照できる。externを付けるのはグローバル変数の宣言。
0407デフォルトの名無しさん
垢版 |
2018/09/17(月) 23:32:43.22ID:t753Z4pL
>>405
分かりました。
ありがとうございます
staticを付けると内部リンケージになって別のcppから使えない云々書いてありますが
アドレスを使えば弄れるんですか。よく分かりませんね(@@;
0409デフォルトの名無しさん
垢版 |
2018/09/18(火) 01:22:31.81ID:OdQP9+YI
>>407
リンクってのはシンボル(名前)とアドレスを付き合わせるってこと
プログラマが意識してアドレスを使うなら何でもあり
0410デフォルトの名無しさん
垢版 |
2018/09/18(火) 01:45:06.12ID:XTp+U7qP
そして次のページにて
ヘッダファイルに#ifndef#define#endifを定義すると2重定義防止ができると説明があるのですが
これを使えばexternとか関数プロトタイプを使わないで住むということでしょうか。
だとするんであればexternとかプロトタイプ宣言とはどう使い分ければいいんでしょうか;
0412デフォルトの名無しさん
垢版 |
2018/09/23(日) 16:56:38.50ID:dZPE20Nd
現在利用出来る無償のメモリリーク解析ツールってありますか?プログラム初心者でメモリリークの対策がよくわからないのでどういうところに対策する必要があるのかを知るのに利用したいです
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況