エスケープシーケンスや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
340335
2018/09/02(日) 00:36:08.13ID:PYGLVvbR341デフォルトの名無しさん
2018/09/02(日) 00:42:46.41ID:eH7Ohm4T342デフォルトの名無しさん
2018/09/02(日) 00:50:28.37ID:Tb3tt8fk ヒープといのはオレがウソ書いてた
そのまま書いたら固定で配列がスタックにできる
アホが引用してるのは
あきらかに全然関係ない頭悪いのを引用してる
そのまま書いたら固定で配列がスタックにできる
アホが引用してるのは
あきらかに全然関係ない頭悪いのを引用してる
343デフォルトの名無しさん
2018/09/02(日) 00:54:46.07ID:Tb3tt8fk array
┣array
┃┣ int
┃┗ int
┣array
┃┣ int
┃┗ int
┗array
┣ int
┗ int
こうなる
┣array
┃┣ int
┃┗ int
┣array
┃┣ int
┃┗ int
┗array
┣ int
┗ int
こうなる
344デフォルトの名無しさん
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はソース上適切でないアドレスをさしてるが
こいつを参照しなければ問題ないということが書いてある
たとえばこんなソースがあった場合、
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はソース上適切でないアドレスをさしてるが
こいつを参照しなければ問題ないということが書いてある
345デフォルトの名無しさん
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 を超えて加算した場合は同じ理由で未定義動作になる。
期待した動作をすることも多いだろうけど、信頼性や移植性は損なわれる。
int a[N][M] に対して a + i するときの「配列オブジェクト」は要素型 int [M] で要素数 N の配列のこと。
N を超えて加算すると未定義動作になる。
a[0] + i するときの「配列オブジェクト」は要素型 int で要素数 M の配列のこと。
同じく M を超えて加算すると未定義動作になる。
ポインタを受け取る関数に a[0] あるいは &a[0][0] を渡した場合も M を超えて加算した場合は同じ理由で未定義動作になる。
期待した動作をすることも多いだろうけど、信頼性や移植性は損なわれる。
346デフォルトの名無しさん
2018/09/02(日) 01:18:43.68ID:7WdK6EV6 おまえのたとえばは前科があるから信用できん
コピペしろコピペ
コピペしろコピペ
347デフォルトの名無しさん
2018/09/02(日) 01:20:32.56ID:Tb3tt8fk (正)int ai_aho[3] = {1, 2, 3};
(誤)ai_aho[3] = {1, 2, 3}
目視で確認した
コレでいける
(誤)ai_aho[3] = {1, 2, 3}
目視で確認した
コレでいける
348デフォルトの名無しさん
2018/09/02(日) 01:23:43.36ID:Tb3tt8fk な、低学歴知恵遅れはなにも分かってない
まずなにも分かってないのに規格読んで分かったふりしてるのがよく分かる
まずなにも分かってないのに規格読んで分かったふりしてるのがよく分かる
349デフォルトの名無しさん
2018/09/02(日) 01:25:42.40ID:Tb3tt8fk 低学歴知恵遅れが規格読んでも
規格なんか分かるわけがないからな
そもそも基本的にポインタがどう加算されるかすら分かってないのに
規格なんか分かるわけがないからな
そもそも基本的にポインタがどう加算されるかすら分かってないのに
350デフォルトの名無しさん
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;
どっちのアドレスも同じになる
配列の場合どうなるか
考え方はまったく同じだな
あとはもう分かるハズだ
uint32_t* p_aho32 = aho;
uint8_t* p_aho_8 = (uint8_t*)aho;
p_aho32++;
p_aho_8+=4;
どっちのアドレスも同じになる
配列の場合どうなるか
考え方はまったく同じだな
あとはもう分かるハズだ
351デフォルトの名無しさん
2018/09/02(日) 04:27:28.97ID:xXZGLywM ロベール05-09の関数内に引きこもりって章のサンプルコードが長すぎて読めません(3ページ使用)
<algorithm>ってファイルを始めてincludeしてるにも関わらず其れに関して何ら説明ないし…
この章に関しては静的変数はグローバル変数と同じように使えてプログラムが終わるまでずっと同じメモリを参照している
と覚えられれば必要十分ですか?
何か簡単なコードを書いて教えてくれると助かります
よろしくお願いたします。
<algorithm>ってファイルを始めてincludeしてるにも関わらず其れに関して何ら説明ないし…
この章に関しては静的変数はグローバル変数と同じように使えてプログラムが終わるまでずっと同じメモリを参照している
と覚えられれば必要十分ですか?
何か簡単なコードを書いて教えてくれると助かります
よろしくお願いたします。
352デフォルトの名無しさん
2018/09/02(日) 06:48:14.86ID:UYvvvhTW あってるしコードは気にしなくていい
353デフォルトの名無しさん
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変数には、基本的には関数の外からはアクセスできない」
という性質もある。
関数内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変数には、基本的には関数の外からはアクセスできない」
という性質もある。
354デフォルトの名無しさん
2018/09/02(日) 07:47:30.33ID:xXZGLywM >>353
違う言語にも関わらず書いていただきありがとうございます
実際に実行してみてかなりスッキリしました
自動変数と静的変数の違い、しかと理解できました
関数についてるstaticも気になるところですが読み進めたいと思います
違う言語にも関わらず書いていただきありがとうございます
実際に実行してみてかなりスッキリしました
自動変数と静的変数の違い、しかと理解できました
関数についてるstaticも気になるところですが読み進めたいと思います
355デフォルトの名無しさん
2018/09/04(火) 08:18:27.05ID:bj+tb6HS char str[]={"aaaaaa","iiiiiiiii","uuuuuuu"};
は出来ないのに
char* str[]={"aaaaaaa",iiiiiii","uuuuuuu"};
が出来るのはなぜですか?
ポインタと配列は密接な関係にあるんじゃないんですか
よろしくお願い致します
は出来ないのに
char* str[]={"aaaaaaa",iiiiiii","uuuuuuu"};
が出来るのはなぜですか?
ポインタと配列は密接な関係にあるんじゃないんですか
よろしくお願い致します
356デフォルトの名無しさん
2018/09/04(火) 11:38:18.11ID:ClV8CEAe "aaaaaa" とか "iiiiiiiii" とか "uuuuuuu" がchar*型だから
char型の配列に入れようとしても無理な話
char型の配列に入れようとしても無理な話
357はちみつ餃子 ◆8X2XSCHEME
2018/09/04(火) 12:36:40.35ID:f5HJ/2BD 仮に出来たとしてどういう結果になって欲しいのだろう?
358デフォルトの名無しさん
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"}は文字列の配列なので変数の型と一致しないためエラーになる
三番目はポインタの配列なので配列の各要素を対応する文字列で初期化できる
四番目は配列の配列なので文字列の配列で初期化できる(ただし要素数の指定は必要)
char str[]={"aaaaaa","iiiiiiiii","uuuuuuu"};はできない
char *str[] = {"aaaaaa","iiiiiiiii","uuuuuuu"};はできる
char str[][9] = {"aaaaaa","iiiiiiiii","uuuuuuu"};ならできる
一番目は長さを指定しない配列変数の宣言で初期化により長さが指定されている。
二番目は{"aaaaaa","iiiiiiiii","uuuuuuu"}は文字列の配列なので変数の型と一致しないためエラーになる
三番目はポインタの配列なので配列の各要素を対応する文字列で初期化できる
四番目は配列の配列なので文字列の配列で初期化できる(ただし要素数の指定は必要)
359デフォルトの名無しさん
2018/09/04(火) 14:22:07.00ID:JAXadswE >>355
前者の[]は、文字の「列」を表すから
後者の[]は、文字列ポインタの「配列」を表すから
charはcharacterの略称、characterは文字、それが複数個集まった列が文字列
列となっているものが根本的に違う
前者の[]は、文字の「列」を表すから
後者の[]は、文字列ポインタの「配列」を表すから
charはcharacterの略称、characterは文字、それが複数個集まった列が文字列
列となっているものが根本的に違う
360デフォルトの名無しさん
2018/09/04(火) 17:31:45.30ID:bj+tb6HS361はちみつ餃子 ◆8X2XSCHEME
2018/09/04(火) 17:48:16.60ID:f5HJ/2BD362デフォルトの名無しさん
2018/09/04(火) 18:01:39.16ID:gZnu4stV そのリテラル文字列はNULでターミネートされる
配列の長さが+1される
べつにNULターミネートしなくても
文字列は扱える
つまり長さが保存されないかわりに
NULでターミネートされてる
それをcでは文字列と呼称している
配列の長さが+1される
べつにNULターミネートしなくても
文字列は扱える
つまり長さが保存されないかわりに
NULでターミネートされてる
それをcでは文字列と呼称している
363デフォルトの名無しさん
2018/09/04(火) 18:04:32.71ID:gZnu4stV そして、charの配列要素が
1つの文字を表してるとは当然限らない
MBCのように連続する複数の配列の要素が
1つの文字を表すことが多い
で、strlen()で文字の数が返却されないのは当然
1つの文字を表してるとは当然限らない
MBCのように連続する複数の配列の要素が
1つの文字を表すことが多い
で、strlen()で文字の数が返却されないのは当然
364デフォルトの名無しさん
2018/09/04(火) 18:52:35.55ID:UJ5UaD/4365デフォルトの名無しさん
2018/09/04(火) 19:07:47.99ID:bz6n3SY3 >>364
それだと土曜日と日曜日の区別がつかないw
それだと土曜日と日曜日の区別がつかないw
366デフォルトの名無しさん
2018/09/04(火) 20:21:12.61ID:i0TPcXrC 月月火水木金金なので問題ないです
367デフォルトの名無しさん
2018/09/04(火) 20:25:08.61ID:bz6n3SY3 >>366
それより毎日が日曜日の方が良いなあw
それより毎日が日曜日の方が良いなあw
368デフォルトの名無しさん
2018/09/04(火) 20:43:24.10ID:gZnu4stV ユリウス日に変換してから計算するから
問題ない
問題ない
369デフォルトの名無しさん
2018/09/05(水) 08:41:31.77ID:w5sEnOXo >>365
火木「」
火木「」
370デフォルトの名無しさん
2018/09/05(水) 10:25:09.13ID:ZjqSDQmE そいつをlongのポインタにする知恵があれば誉めてあげるんだが
371デフォルトの名無しさん
2018/09/06(木) 23:16:14.27ID:xdo6cDUj int wday=5;
char week[] = "SunMonTueWedThuFriSat";
printf("%.3s",&week[wday*3]);
これでどうだw
char week[] = "SunMonTueWedThuFriSat";
printf("%.3s",&week[wday*3]);
これでどうだw
372デフォルトの名無しさん
2018/09/07(金) 06:40:53.97ID:Pk3Mmzkj 悪い例 (キャストの悪用、データサイズの勝手な仮定)
int wday = 5;
printf("%.4s\n", &((int*)"Sun.Mon.Tue.Wed.Thu.Fri.Sat.")[wday]);
軽いジョークのつもりで書いてみたけど、セグメンテーション・フォールトが出て
動くまでに予想外に手間取ってしもうた。
原因はアドレス演算子 & の付け忘れだった。
int wday = 5;
printf("%.4s\n", &((int*)"Sun.Mon.Tue.Wed.Thu.Fri.Sat.")[wday]);
軽いジョークのつもりで書いてみたけど、セグメンテーション・フォールトが出て
動くまでに予想外に手間取ってしもうた。
原因はアドレス演算子 & の付け忘れだった。
373デフォルトの名無しさん
2018/09/07(金) 06:59:23.46ID:itoB4vJx それを.3sで表示すれば371と同じ結果にならなかね?
374デフォルトの名無しさん
2018/09/07(金) 07:46:30.50ID:Pk3Mmzkj 表示幅の指定で .3 なら >>371 と同じになるよ。
英単語の省略形にピリオドをつけたいのは好みの問題なの。
今は曜日も月名もピリオドを付けないのが一般的なのかな。
<time.h> の asctime() も3文字3文字だね。
英単語の省略形にピリオドをつけたいのは好みの問題なの。
今は曜日も月名もピリオドを付けないのが一般的なのかな。
<time.h> の asctime() も3文字3文字だね。
375372
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プログラムに凝る人の気持ちがちょっと分かった気がする。
&((int*)"Sun.Mon.Tue.Wed.Thu.Fri.Sat.")[wday]
「いったん[]で配列形式でアクセスしてから要素のアドレスを得る」
なんて回り道をしないでも
(int*)"Sun.Mon.Tue.Wed.Thu.Fri.Sat." + wday
と素直にポインタの足し算だけでいけたね。
…難解Cプログラムに凝る人の気持ちがちょっと分かった気がする。
376デフォルトの名無しさん
2018/09/07(金) 22:40:13.74ID:B/yxkRYZ intのサイズがcharのサイズの4倍でないと動かない
難解ではなくただの知恵遅れのコード
難解ではなくただの知恵遅れのコード
377デフォルトの名無しさん
2018/09/08(土) 01:17:02.50ID:ejo+9snz sizeofがイマイチ分からないです
型や変数のサイズを出す演算子ってのは分かったんですが
例えばこの例↓どういう風に化けてるんですか?
https://ideone.com/szVAAP
sizeof studentで要素数3だから3に化けると思うんですが、右の*studentは何に化けてるんですか?
型や変数のサイズを出す演算子ってのは分かったんですが
例えばこの例↓どういう風に化けてるんですか?
https://ideone.com/szVAAP
sizeof studentで要素数3だから3に化けると思うんですが、右の*studentは何に化けてるんですか?
378はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 01:27:45.49ID:VmsJpbI+ sizeof が返すサイズってのはバイト数だというのがよくわかってないのかな。
もう C++ では type_traits の std::extent を使って欲しい気持ち。
もう C++ では type_traits の std::extent を使って欲しい気持ち。
379デフォルトの名無しさん
2018/09/08(土) 01:39:35.14ID:j/6nk0eH380デフォルトの名無しさん
2018/09/08(土) 01:56:15.85ID:ejo+9snz381デフォルトの名無しさん
2018/09/08(土) 02:11:10.26ID:j/6nk0eH382はちみつ餃子 ◆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 が配列の要素ひとつを表現しているっていうのがちょっと分かり難いかなぁ。
int のサイズは処理系依存なので、具体的に何バイトとは言えない。
でもまあ現代的なパソコンなら 4 バイトのことがほとんどだろうね。
さらに言えば仕様上は構造体の要素の間にスキマがあいててもかまわない。
> int3個とchar一個だから13バイト?
この構造体中の char は MAX_NAME+1 個じゃん。
まあそれはそれとして、
sizeof student というのは、 student という配列の大きさを「バイト数で」返してきて、
sizeof *student というのは student 配列の要素ひとつの大きさをバイト数で返してくる。
つまり、配列全体の大きさを配列の要素の大きさで割ったら配列に含まれる要素の個数になる。
この場合は 3 ってこと。
sizeof *student が配列の要素ひとつを表現しているっていうのがちょっと分かり難いかなぁ。
383デフォルトの名無しさん
2018/09/08(土) 02:52:28.11ID:OyJ8jP1h384デフォルトの名無しさん
2018/09/08(土) 02:56:57.12ID:OyJ8jP1h385はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 03:03:57.30ID:VmsJpbI+386デフォルトの名無しさん
2018/09/08(土) 03:07:29.94ID:ejo+9snz >>382
すいません、おかげさまでどういう計算してるのか理解できました
確かにポインタにすると何で要素一つのサイズなのか理屈づけて説明できません…sizeof student/sizeof student[0]とかだと分かりやすいです
ありがとうございます。意味が理解できたので応用して使えそうです
すいません、おかげさまでどういう計算してるのか理解できました
確かにポインタにすると何で要素一つのサイズなのか理屈づけて説明できません…sizeof student/sizeof student[0]とかだと分かりやすいです
ありがとうございます。意味が理解できたので応用して使えそうです
387はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 03:08:42.91ID:VmsJpbI+ >>384-385
私が sizeof *student が分かり難いと述べたのは
配列名に * を付けたものが配列の先頭要素になるルールの背景にある暗黙の型変換が分かり難いって話。
C/C++ を使ってると空気みたいにやっちゃうんだけど、これ実際のところだいぶんアレなルールですよ。
私が sizeof *student が分かり難いと述べたのは
配列名に * を付けたものが配列の先頭要素になるルールの背景にある暗黙の型変換が分かり難いって話。
C/C++ を使ってると空気みたいにやっちゃうんだけど、これ実際のところだいぶんアレなルールですよ。
388デフォルトの名無しさん
2018/09/08(土) 03:13:32.57ID:OyJ8jP1h389デフォルトの名無しさん
2018/09/08(土) 03:17:21.63ID:OyJ8jP1h >>387
それも含めてね
それも含めてね
390はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 03:22:37.80ID:VmsJpbI+ >>388
この場合くらいの小さなサンプルだとあまり気にならないけど、
その変数が何の型であるか知っていなければならないっていうのが、
読むときの負荷が高いと感じてしまう。
自分を信用してないというか、自分がアホだということを信用しているので、
色々忘れて読んでも良いように書きたいと思ってる。
この場合くらいの小さなサンプルだとあまり気にならないけど、
その変数が何の型であるか知っていなければならないっていうのが、
読むときの負荷が高いと感じてしまう。
自分を信用してないというか、自分がアホだということを信用しているので、
色々忘れて読んでも良いように書きたいと思ってる。
391はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 03:26:28.66ID:VmsJpbI+ C++ ではもうそんな古代のイディオムなんて忘れて std::extent を使いたい
392はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 03:28:24.66ID:VmsJpbI+ もう C++17 の時代なんだから std::size の方がいいな
393はちみつ餃子 ◆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);
と書けるので配列の要素数を事前に計算する必要なかったわ。
for (int i = 0; i < size; ++i) {
Show(student[i]);
}
のところはモダンな C++ では (つまり C++11 以降では)
for (auto& e: student) Show(e);
と書けるので配列の要素数を事前に計算する必要なかったわ。
>>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 とかの表現など
書き続ければ、あるいは読み続ければ、そういうのは、だんだんわかってくるのではないかな、と。
>>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 とかの表現など
書き続ければ、あるいは読み続ければ、そういうのは、だんだんわかってくるのではないかな、と。
395はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 03:59:06.82ID:VmsJpbI+ C を使ってるときは感覚的に理解してて全く不都合なかったけど、
C++ のテンプレートやなんやかやを利用するようになると、
やっぱりちゃんとルールを把握せないかんなと思った。
C++ のテンプレートやなんやかやを利用するようになると、
やっぱりちゃんとルールを把握せないかんなと思った。
396デフォルトの名無しさん
2018/09/08(土) 08:56:41.97ID:RilhlE4U _countof()
環境考えなくていい(趣味etc)ならこれもある
環境考えなくていい(趣味etc)ならこれもある
397デフォルトの名無しさん
2018/09/08(土) 09:31:57.86ID:obhERXW7 初心者に古い文法を辞めろってよろしくないな
398デフォルトの名無しさん
2018/09/08(土) 10:37:06.40ID:ZUEeKRTR399デフォルトの名無しさん
2018/09/08(土) 11:59:22.19ID:OyJ8jP1h >>398
言われると思った
言われると思った
400デフォルトの名無しさん
2018/09/10(月) 18:57:43.66ID:70yMIW0+ c#から使うクラスライブラリをc++/cliで作っています。
クラス変数をoutで渡してメソッド内で値を入れたいのですが、c++側はどんな風に書けばよいでしょうか?
クラス変数をoutで渡してメソッド内で値を入れたいのですが、c++側はどんな風に書けばよいでしょうか?
401デフォルトの名無しさん
2018/09/10(月) 22:20:18.13ID:7zqNUn7X402デフォルトの名無しさん
2018/09/11(火) 11:36:04.20ID:EScF+7wZ403デフォルトの名無しさん
2018/09/17(月) 21:49:35.29ID:t753Z4pL ロベール入門の内部リンケージ外部リンケージ云々の下りがちょっとよくわからないんですが
externを付けると別のcppの変数を弄れるってことであってますか?
externを付けると別のcppの変数を弄れるってことであってますか?
404デフォルトの名無しさん
2018/09/17(月) 22:34:28.19ID:t753Z4pL externをつけると別のファイルのグローバル変数、関数を使えてローカル変数は使えないんですか?
405さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/09/17(月) 22:40:39.04ID:yTXbMS5S406さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/09/17(月) 22:43:11.40ID:yTXbMS5S 関数プロトタイプにexternを付けるのは無意味。
407デフォルトの名無しさん
2018/09/17(月) 23:32:43.22ID:t753Z4pL408さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/09/17(月) 23:41:37.07ID:yTXbMS5S static int a = 0;
...
f(&a);
もしくは、
int& g(void)
{
static int a = 3;
return a;
}
みたいな感じで。
...
f(&a);
もしくは、
int& g(void)
{
static int a = 3;
return a;
}
みたいな感じで。
409デフォルトの名無しさん
2018/09/18(火) 01:22:31.81ID:OdQP9+YI410デフォルトの名無しさん
2018/09/18(火) 01:45:06.12ID:XTp+U7qP そして次のページにて
ヘッダファイルに#ifndef#define#endifを定義すると2重定義防止ができると説明があるのですが
これを使えばexternとか関数プロトタイプを使わないで住むということでしょうか。
だとするんであればexternとかプロトタイプ宣言とはどう使い分ければいいんでしょうか;
ヘッダファイルに#ifndef#define#endifを定義すると2重定義防止ができると説明があるのですが
これを使えばexternとか関数プロトタイプを使わないで住むということでしょうか。
だとするんであればexternとかプロトタイプ宣言とはどう使い分ければいいんでしょうか;
411デフォルトの名無しさん
2018/09/18(火) 07:22:02.89ID:XTp+U7qP すいません自己解決しました…多分;;
412デフォルトの名無しさん
2018/09/23(日) 16:56:38.50ID:dZPE20Nd 現在利用出来る無償のメモリリーク解析ツールってありますか?プログラム初心者でメモリリークの対策がよくわからないのでどういうところに対策する必要があるのかを知るのに利用したいです
413デフォルトの名無しさん
2018/09/23(日) 17:17:02.47ID:oc2N8BDI >>412
スマートポインタ使えばいいと思うよ
スマートポインタ使えばいいと思うよ
414デフォルトの名無しさん
2018/09/23(日) 18:38:22.45ID:cRG95Xcq vs使えばexpressエディションでも標準装備されてる
415デフォルトの名無しさん
2018/09/23(日) 23:53:10.56ID:nKMJRhW5416デフォルトの名無しさん
2018/09/24(月) 00:23:01.63ID:Kxio7RVg とりあえずこんな感じのコードで軽くお試しできる
デバッグモードで実行するとデバッグコンソールにリークしてるログが出力される
コメントはずしてfree()で解放するとリークしてるログがなくなる
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
void aho(void) {
void* p = malloc(100);
// free(p);
}
int main(void) {
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
aho();
return 0;
}
↓詳細はココみなさい
https://msdn.microsoft.com/ja-jp/library/x98tx3cf.aspx
あとはもうできるハズだ
デバッグモードで実行するとデバッグコンソールにリークしてるログが出力される
コメントはずしてfree()で解放するとリークしてるログがなくなる
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
void aho(void) {
void* p = malloc(100);
// free(p);
}
int main(void) {
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
aho();
return 0;
}
↓詳細はココみなさい
https://msdn.microsoft.com/ja-jp/library/x98tx3cf.aspx
あとはもうできるハズだ
417デフォルトの名無しさん
2018/09/24(月) 00:32:39.68ID:twbzBaDz https://github.com/KindDragon/vld/wiki/Using-Visual-Leak-Detector
visual leak detector
cで使えるかは試したことないけど、crtdebugより使い勝手はいい。
visual leak detector
cで使えるかは試したことないけど、crtdebugより使い勝手はいい。
418デフォルトの名無しさん
2018/09/24(月) 00:58:58.99ID:qTTELbCs >>417
全然ビジュアルじゃねーなw
全然ビジュアルじゃねーなw
419デフォルトの名無しさん
2018/09/24(月) 07:47:25.22ID:A22Aay1A 入門の+operator演算子で訳わからず詰んでしまったのですが
簡単に分かりやすく解説してるサイトないですか?
簡単に分かりやすく解説してるサイトないですか?
420はちみつ餃子 ◆8X2XSCHEME
2018/09/24(月) 09:09:54.16ID:tUW1+gfS421デフォルトの名無しさん
2018/09/24(月) 10:37:05.34ID:nAcFE6zY422デフォルトの名無しさん
2018/09/24(月) 18:28:47.09ID:A22Aay1A423デフォルトの名無しさん
2018/09/25(火) 00:10:59.63ID:TBXAVCzN424デフォルトの名無しさん
2018/09/27(木) 01:59:28.90ID:HwqzTUAF http://codepad.org/gwutTCie
AIUEOを何回も呼び出したいとき、引数のa, b, c, d, eの部分が共通なので
何回もa, b, c, d, eと書かなくても良いようにしようと色々試しましたが中々上手く行きません
別にコピペすればいいのでそんなに気にすることでもないと思うのですが、
こんなときはどのように書いたら良いのでしょうか?
AIUEOを何回も呼び出したいとき、引数のa, b, c, d, eの部分が共通なので
何回もa, b, c, d, eと書かなくても良いようにしようと色々試しましたが中々上手く行きません
別にコピペすればいいのでそんなに気にすることでもないと思うのですが、
こんなときはどのように書いたら良いのでしょうか?
425デフォルトの名無しさん
2018/09/27(木) 02:11:57.91ID:Oj9x/TA+ >>424
意図を把握できてるか自信はないが↓のbinded_AIUEOみたいなことでいいのん?
void MACRO(int a, int b, int c, int d, int e, int s, int t) {
auto binded_AIUEO = [=](int x, int y, int z){ AIUEO(a, b, c, d, e, x, y, z); };
if (s < 0) {
if (t < 0) binded_AIUEO(-1, -2, -3);
else binded_AIUEO(3, 0, 7);
}
else {
if (s < t) binded_AIUEO(4, 99, 8);
else binded_AIUEO(333, 33, 3);
}
}
意図を把握できてるか自信はないが↓のbinded_AIUEOみたいなことでいいのん?
void MACRO(int a, int b, int c, int d, int e, int s, int t) {
auto binded_AIUEO = [=](int x, int y, int z){ AIUEO(a, b, c, d, e, x, y, z); };
if (s < 0) {
if (t < 0) binded_AIUEO(-1, -2, -3);
else binded_AIUEO(3, 0, 7);
}
else {
if (s < t) binded_AIUEO(4, 99, 8);
else binded_AIUEO(333, 33, 3);
}
}
426はちみつ餃子 ◆8X2XSCHEME
2018/09/27(木) 02:36:54.70ID:nKTHsEzL std::bind を使う方法もあるな。
427デフォルトの名無しさん
2018/09/27(木) 02:41:01.72ID:/q4lnTfs >>424
struct Args { int a,b,c,d,e;};を引数に使う
struct Args { int a,b,c,d,e;};を引数に使う
428デフォルトの名無しさん
2018/09/27(木) 12:00:19.82ID:QfV3dtaO void foo(int argc, const char *argv[])
{
}
int main(int argc, char *argv[])
{
foo(argc, argv);
return 0;
}
VC++2008でコンパイルすると、
「error C2664: 'foo' : 2 番目の引数を 'char *[]' から 'const char *{}' に変換できません。」
ってなるんだけどなんで?
constから非constならわかるんだけど。
{
}
int main(int argc, char *argv[])
{
foo(argc, argv);
return 0;
}
VC++2008でコンパイルすると、
「error C2664: 'foo' : 2 番目の引数を 'char *[]' から 'const char *{}' に変換できません。」
ってなるんだけどなんで?
constから非constならわかるんだけど。
429デフォルトの名無しさん
2018/09/27(木) 12:27:29.59ID:3irDnMHM type ミスなのかコピペなのか判断に迷うとこだけど
'char *[]' から 'const char *{}' 後者が { } になってるあたりにヒントは無い?
'char *[]' から 'const char *{}' 後者が { } になってるあたりにヒントは無い?
430デフォルトの名無しさん
2018/09/27(木) 12:42:33.07ID:pmYsr/E+ >>428
[]のタイプミスだろうけど、下のページが参考に。
https://stackoverflow.com/questions/45011978/const-causing-incompatible-pointer-type-why-only-for-double-pointers
ようは、fooで argv[0]="abcd"; みたいなことができちゃうから。
でも、const char * const argv[] でもだめな理由は知らない。
[]のタイプミスだろうけど、下のページが参考に。
https://stackoverflow.com/questions/45011978/const-causing-incompatible-pointer-type-why-only-for-double-pointers
ようは、fooで argv[0]="abcd"; みたいなことができちゃうから。
でも、const char * const argv[] でもだめな理由は知らない。
431428
2018/09/27(木) 13:06:59.87ID:QfV3dtaO >>429,430
失礼。428の書き込みがタイプミスで、実際のソースコードは [] なのですが
コンパイルエラーになります。
>>430
なるほど・・・↓にも同じようなことが書いてありますね。
https://social.msdn.microsoft.com/Forums/ja-JP/24cd88de-2159-4e8b-aee7-3fa30d8647db/12509124521253112479123982144229031124343830625968123952819312?forum=vcgeneralja
ちなみにVC2003では通ってたらしいです。
失礼。428の書き込みがタイプミスで、実際のソースコードは [] なのですが
コンパイルエラーになります。
>>430
なるほど・・・↓にも同じようなことが書いてありますね。
https://social.msdn.microsoft.com/Forums/ja-JP/24cd88de-2159-4e8b-aee7-3fa30d8647db/12509124521253112479123982144229031124343830625968123952819312?forum=vcgeneralja
ちなみにVC2003では通ってたらしいです。
432デフォルトの名無しさん
2018/09/27(木) 14:04:18.04ID:rwW0e8CF433デフォルトの名無しさん
2018/09/27(木) 17:43:51.14ID:HwqzTUAF434はちみつ餃子 ◆8X2XSCHEME
2018/09/27(木) 18:37:57.80ID:nKTHsEzL >>433
こんな感じかな?
#define MACRO(a, b, c, d, e, s, t) {\
#define BINDED_AIUEO(x, y, z) AIUEO(a, b, c, d, e, x, y, z) \
if (s < 0) {\
if (t < 0) BINDED_AIUEO(-1, -2, -3) \
else BINDED_AIUEO(3, 0, 7) \
}\
else {\
if (s < t) BINDED_AIUEO(4, 99, 8) \
else BINDED_AIUEO(333, 33, 3) \
}\
#undef BINDED_AIUEO \
}
この事例ではどうしてもマクロじゃなければ駄目という理由はなさそうだけど、
実際の利用シーンでは何か意味があるのかな?
こんな感じかな?
#define MACRO(a, b, c, d, e, s, t) {\
#define BINDED_AIUEO(x, y, z) AIUEO(a, b, c, d, e, x, y, z) \
if (s < 0) {\
if (t < 0) BINDED_AIUEO(-1, -2, -3) \
else BINDED_AIUEO(3, 0, 7) \
}\
else {\
if (s < t) BINDED_AIUEO(4, 99, 8) \
else BINDED_AIUEO(333, 33, 3) \
}\
#undef BINDED_AIUEO \
}
この事例ではどうしてもマクロじゃなければ駄目という理由はなさそうだけど、
実際の利用シーンでは何か意味があるのかな?
435デフォルトの名無しさん
2018/09/27(木) 19:16:32.64ID:Oj9x/TA+ >>434
それできたっけ?と思って試してみたらエラーになった
マクロの中では#は識別子の文字列化になる
可変長マクロを悪用してこんな感じにはできるけれども……おすすめはできない
#define packed_MACRO(s, t, ...) {\
if (s < 0) {\
if (t < 0) AIUEO(__VA_ARGS__, -1, -2, -3) \
else AIUEO(__VA_ARGS__, 3, 0, 7) \
}\
else {\
if (s < t) AIUEO(__VA_ARGS__, 4, 99, 8) \
else AIUEO(__VA_ARGS__, 333, 33, 3) \
}\
}
#define MACRO(a, b, c, d, e, s, t) {\
packed_MACRO(s, t, a, b, c, d, e) \
}
それできたっけ?と思って試してみたらエラーになった
マクロの中では#は識別子の文字列化になる
可変長マクロを悪用してこんな感じにはできるけれども……おすすめはできない
#define packed_MACRO(s, t, ...) {\
if (s < 0) {\
if (t < 0) AIUEO(__VA_ARGS__, -1, -2, -3) \
else AIUEO(__VA_ARGS__, 3, 0, 7) \
}\
else {\
if (s < t) AIUEO(__VA_ARGS__, 4, 99, 8) \
else AIUEO(__VA_ARGS__, 333, 33, 3) \
}\
}
#define MACRO(a, b, c, d, e, s, t) {\
packed_MACRO(s, t, a, b, c, d, e) \
}
437はちみつ餃子 ◆8X2XSCHEME
2018/09/27(木) 19:59:57.14ID:nKTHsEzL いずれにしても、マクロでやるのはおすすめできないパターンには違いない。
関数でやってもインライン化されたら定数畳み込みとのコンボで実行コードはだいたい同じような感じになるだろうし。
関数でやってもインライン化されたら定数畳み込みとのコンボで実行コードはだいたい同じような感じになるだろうし。
438デフォルトの名無しさん
2018/09/27(木) 23:31:02.83ID:HwqzTUAF439デフォルトの名無しさん
2018/10/01(月) 09:57:17.34ID:a9wHa9+i MSVC2017+Windows10でレジストリを読み取ろうとしています。
RegEnumValueW(hKey, 0, name, &nameSize, 0, &type, value, &valueSize)
を実行してtypeがREG_SZのレジストリ入力を読み取ることには成功したのですが、
value先頭のvalueSizeバイトのユニコード文字列をstd::stringに変換する方法が
わからなくて困っています。
具体的にはwindowsのフォント名を読み取っていて、"arial.ttf"に対して
valueの中身を見ていくと、a\0r\0i\0…となっています。
LPBYTEからstringなのでとりあえずwchar_t*にしてからstringにすればよいのかと思ったのですが、
MultiByteToWideChar(CP_THREAD_ACP, 0, (LPCCH)value, (int)(valueSize), NULL, 0));
でサイズ取得してから
MultiByteToWideChar(CP_THREAD_ACP, 0, (LPCCH)value, valueSize, buff, size);
しても要素がchar→wchar_tに変わっただけで、\0も1文字になってしまいます。
できれば日本語にも対応したいので、下位ビットだけ読む、みたいな方法以外の対応を
探しています。ご存知の方いらっしゃらないでしょうか。
RegEnumValueW(hKey, 0, name, &nameSize, 0, &type, value, &valueSize)
を実行してtypeがREG_SZのレジストリ入力を読み取ることには成功したのですが、
value先頭のvalueSizeバイトのユニコード文字列をstd::stringに変換する方法が
わからなくて困っています。
具体的にはwindowsのフォント名を読み取っていて、"arial.ttf"に対して
valueの中身を見ていくと、a\0r\0i\0…となっています。
LPBYTEからstringなのでとりあえずwchar_t*にしてからstringにすればよいのかと思ったのですが、
MultiByteToWideChar(CP_THREAD_ACP, 0, (LPCCH)value, (int)(valueSize), NULL, 0));
でサイズ取得してから
MultiByteToWideChar(CP_THREAD_ACP, 0, (LPCCH)value, valueSize, buff, size);
しても要素がchar→wchar_tに変わっただけで、\0も1文字になってしまいます。
できれば日本語にも対応したいので、下位ビットだけ読む、みたいな方法以外の対応を
探しています。ご存知の方いらっしゃらないでしょうか。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【熊本】園児に強制性交か 保育所勤務の男を逮捕「性的な欲望が我慢できなかった」警察は余罪を調べる [七波羅探題★]
- 日銀「歴史的」利上げ迫る 35年ぶりの年間上げ幅、0.5%の壁を突破 [蚤の市★]
- 空自機レーダー照射、音声データ公開 中国 [蚤の市★]
- 堀江貴文、キャッシュレス非対応の店にモヤッ 『PayPay』立ち上げの人物にまさかの直談判「現金決済しかできないんだけど…」 [冬月記者★]
- 【サッカー】上田綺世の活躍は「一過性」 15戦18発も…オランダ英雄は懐疑的な姿勢「確信に至っていない」 [ゴアマガラ★]
- 【おこめ券】鈴木農相 米価維持の意図「一切ない」★3 [ぐれ★]
- 【悲惨】中国軍が自衛隊に「事前通告」し自衛隊も返答した音声が公開されてしまうwwwこれは高市チェックアウトゕ [597533159]
- 中国の日本向けレアアースの輸出止まる、高市のせいで日本終了のお知らせ [931948549]
- 現役JKのお茶会スレ( ¨̮ )︎︎𖠚ᐝ180
- 🏡
- 韓国政府、高市早苗の「竹島領土」発言にブチギレwwwwwwwwwwwwwwww [834922174]
- 高市早苗「竹島は日本領土」 [834922174]
