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


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

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



1 名前:デフォルトの名無しさん mailto:sage [2016/11/06(日) 22:58:02.60 ID:dU5z27As.net]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。

【アップローダー】(質問が長い時はココ使うと便利)
codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)

前スレ
【初心者歓迎】C/C++室 Ver.99【環境依存OK】
echo.2ch.net/test/read.cgi/tech/1469177649/

856 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:02:36.26 ID:olJiM2Cb.net]
コストは置いておいたとしても寿命はどうするんだよ

平たく言うと
「マニュアル車の1速は、オートマ車のDと同じ意味ですか?」
って質問だぞ
それに対して
「オートマ車はDで発進するからマニュアル車なら1速と同等ととらえるのが筋
 速度が出た後のことなんかどうでもええ」
ってのはなんか違うだろ

メモリ管理に関してはC++はマニュアルでC#はオートなんだから
こういうたとえになるんだよ

857 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:10:09.31 ID:VgVQ93XC.net]
>>837
おまいさん資格持ちじゃないよな?な?な?

858 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:15:08.21 ID:olJiM2Cb.net]
あと、C#はJavaと違って構造体が使えてこれは値型になれるから
スタックに確保できる
なんで、C++の A a; はどちらかというと、そちらに該当するんだよ

で、C#のA a = new A(); はというと
delete が必要という一点を除けば C++ の A *a = new A();に相当するんだよ
こんなこと当たり前だろ

859 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:23:27.06 ID:9HpxJyun.net]
>>845
実装と目的を一緒にすんなよタコ
単に「Aのインスタンス生成するコード書いてみ」
といわれたら>>823になるだろjk
意味が同じってのはそういうこった

860 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:33:11.25 ID:AVhuZxl1.net]
>>842
えっ???
そんな馬鹿な

861 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:38:27.02 ID:olJiM2Cb.net]
>単に「Aのインスタンス生成するコード書いてみ」

ってのはお前が勝手に言ってることだろ

元は
>このc++の「A a;」は、c#の「A a = new A();」と同じ意味ということでいいんですか?


862 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:38:59.24 ID:AKPIjSm8.net]
超えられないかはともかく、newに限って言えばGC言語の方が低コストでもおかしくない。

863 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:39:54.18 ID:kiqPrlXB.net]
厳密にどうかじゃないんだよ
初心者がこれから言語を勉強していくのに
より得になる方はどっちだってことよ

GCだからー、ヒープだからーって
そんな答えおよびじゃないっつーの

864 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:40:16.44 ID:AVhuZxl1.net]
実際に試してから言えよ



865 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:40:38.87 ID:AVhuZxl1.net]
>>842
>>849

866 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:43:53.74 ID:olJiM2Cb.net]
どの程度の初心者かわからないだろ
C#と比べてるってことは既にC#をそこそこマスターしているかもしれないだろ
その状態でC++に手を出そうとしていたとしたら、どうだ?
C#とC++の違いなどを書いたほうが良いだろ

867 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:46:31.14 ID:tvZqc0j8.net]
>>850
初心者だからこそ、上っ面の文法の違いだけで捉えて、こうすればだいたい同じとか説明する前に、
前提としてメモリ管理の考え方が違うことを理解してもらうのは重要だろう。

868 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:47:41.62 ID:AVhuZxl1.net]
違うものは違う

869 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:48:12.47 ID:VwPftttd.net]
もういいよ、まとめると

C++ではインスタンス生成(アドレスの決定)は二種類のやり方がある
A a;
A* pa = new A();
前者はスタックのアドレスが割り当てられ、後者は通常はヒープのアドレスが割り当てられる。
前者はスコープが寿命で、後者はdelete pa;されるまでが寿命。

C#ではインスタンス生成の方法は値型、参照型でそれぞれ一種類ずつしかなく、
A a; //struct A
B b = new B(); //class B
前者はスタックのアドレスが割り当てられ、後者はヒープのアドレスが割り当てられる。
前者はスコープが寿命で、後者はdelete pa;されるまでが寿命。

どれとどれを同じと思うかは人それぞれ。
終了

870 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:50:58.52 ID:TrkY+sIz.net]
C# の後者の寿命は? delete pa は C++ だよね

871 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:53:27.36 ID:VwPftttd.net]
>>856
おっと、間違えた
C#の後者の寿命はGCに回収されるまででした

872 名前:デフォルトの名無しさん mailto:sage [2017/07/05(水) 00:46:01.47 ID:EyHtcvE8.net]
>>856
ご苦労さん

何故この話題がここまで伸びたんだろ

873 名前:デフォルトの名無しさん mailto:sage [2017/07/05(水) 22:56:44.72 ID:UhWlQCq1.net]
異なる考えの言語同士であるため対応が自明でないという事実を無視して
自分の考える「同じ意味」の解釈を押し付けるからに相違ない

>C#ではインスタンス生成の方法は値型、参照型でそれぞれ一種類ずつしかなく、
>A a; //struct A
なるほどこうやって言語仕様を確認せず想像をたれ流すので世の中が嘘だらけになるのだな

874 名前:デフォルトの名無しさん mailto:sage [2017/07/05(水) 23:29:36.43 ID:0KIeSgEp.net]
>>860
ん、C#のほうはそれであってるだろ
StringとかDateTimeみたいな一部の例外を除けば



875 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 01:22:17.04 ID:AOJFjP+S.net]
>異なる考えの言語同士であるため対応が自明でないという事実を無視して
>自分の考える「同じ意味」の解釈を押し付けるからに相違ない

ん?だからそれに基づいてほとんどの人は
「違う意味だよ〜」って言ってたんじゃなかったの?
一部の人が「同じような意味だよ〜」って言ってただけで
それに反論する流れだったでしょ
だから「同じ意味」の解釈の押し付け合いはしてなくて
同じ意味だよ vs 違う意味だよ
だったと思うけど

876 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 05:15:51.23 ID:5a/RGiY/.net]
わざわざ堅苦しい言葉選んで俺偉いアピール

877 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 05:29:37.28 ID:T7F4pxe5.net]
同じ様な意味と同じ意味は違う
さらっと言葉をすり替えるなよ
まったく卑怯な奴よの
(つーか同じ様な意味とも言っていない)

878 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 08:09:44.50 ID:TSgBvSRK.net]
>>862
>だから「同じ意味」の解釈の押し付け合いはしてなく
「同じ意味」の基準について合意していないのに「ここが違うから別」とだけ言うのは「同じ意味」の解釈の押し付けに他ならないと思うのだが、
もう少し日本語の字面でなく意味を理解した方がよいのではないか

>「違う意味だよ〜」って言ってたんじゃなかったの?
 →Yes
>同じ意味だよ vs 違う意味だよだった
 →Yes

879 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 08:11:58.37 ID:rcg+ZZ7N.net]
違うものは違う

880 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 08:12:32.60 ID:TSgBvSRK.net]
>>861
合っているかと訊かれれば合っていないので、言語仕様を読むか当該のスレッドで訊くのが良いのでは
あとStringやDateTimeの例外というのが何なのかよくわからなかった

881 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 08:18:45.02 ID:QfwLuwwY.net]
>>867
合ってるから消えろ
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/new-operator

882 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 14:54:52.15 ID:m/Ia1fy1.net]
まだやってんのかよ
おまいらのこだわりはスゲェな

883 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 22:06:42.25 ID:TSgBvSRK.net]
リンク先を見て思ったのだが
こだわりじゃなくて罵られることに喜びを覚えるマゾなのではないかと言う気がした

884 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 22:08:34.16 ID:JPWXM8i2.net]
>>870
正しく指摘できないのならレスしないほうがいい
あなたの思ういちばんすこいC#の仕様の世界で生き続けてくだはい
アーメン



885 名前:デフォルトの名無しさん mailto:sage [2017/07/07(金) 11:58:06.67 ID:C1hAccX9.net]
俺は、プログラミングなんて存在しない世界で生きたい

886 名前:デフォルトの名無しさん mailto:sage [2017/07/07(金) 12:21:24.92 ID:2bQkb9bH.net]
生まれてくるのが100年くらい遅かったようだな

887 名前:デフォルトの名無しさん [2017/07/07(金) 12:21:27.14 ID:xvg52mfm.net]
プログラマ辞めれば良いだけやん。

888 名前:デフォルトの名無しさん [2017/07/07(金) 13:29:12.14 ID:1UwaMcEr.net]
c++
英語を読める
btcをトレードしたことがある

仮想通貨の開発に参加してみたい方
レスをお願いします

889 名前:デフォルトの名無しさん mailto:sage [2017/07/07(金) 15:01:32.91 ID:u5D8E4qs.net]
>>875

んで?どうすりゃええの

890 名前:デフォルトの名無しさん [2017/07/07(金) 16:03:32.34 ID:1UwaMcEr.net]
>>876
お返事ありがとうございます

通貨名
raiblocks

simple
instant
fees 0(送金手数料がかからない)

web
https://raiblockscommunity.net/

slack
https://raiblocks.slack.com

slackに参加
#developmentにて、開発に興味がある旨の書き込みをしてください(英語で)

891 名前:デフォルトの名無しさん mailto:sage [2017/07/08(土) 21:39:10.74 ID:dFvfrYOE.net]
プログラミングなんて底辺ドカタの仕事
そのうちAIがやれるようになる

892 名前:デフォルトの名無しさん [2017/07/08(土) 22:33:35.86 ID:lbAgDi9M.net]
アドバイスさんくす

893 名前:デフォルトの名無しさん [2017/07/09(日) 16:06:32.28 ID:EeQkMvgZ.net]
ポインタそのものにオブジェクトってできるんでしょうか?
例えば、配列arrayのアドレスをポインタpで、ポインタpのアドレスをポインタpのポインタppで調べたんですが、
int array[3];
int *p = array;
int **pp = &p;
for(i = 0; i < 3; i++)
{
printf("&array[%d] : %d : %d\n", i, &array[i]);
}
&array[0] : 2293472
&array[1] : 2293476
&array[2] : 2293480
&p[0] : 2293472
&p[1] : 2293476
&p[2] : 2293480
&pp[0] : 2293468
&pp[1] : 2293472
&pp[2] : 2293476
ppが参照しているpのオブジェクトの位置が、arrayのオブジェクトのアドレスと全く同じ位置にあります。
1つのアドレスが2つのオブジェクトをもてるのか、ポインタ自体にオブジェクトは生成されないのか
他の要素でそうなってるのかわかりません。どなたか回答宜しくお願いいたします。

894 名前: ◆QZaw55cn4c mailto:sage [2017/07/09(日) 16:13:17.36 ID:VF1qtZ3L.net]
>>880
その出力を一挙に得られるプログラムを示せ,アドレスはプログラムの実行ごとに変わる可能性がある



895 名前:デフォルトの名無しさん mailto:sage [2017/07/09(日) 16:20:52.70 ID:v/7piv3Y.net]
>>880
pとarrayは異なるオブジェクトだから確認方法が間違ってる

896 名前:デフォルトの名無しさん mailto:sage [2017/07/09(日) 16:25:25.83 ID:3Luqddjj.net]
一つのポンタを複数のオブジェなんて当たり前
int z;
int * p = &z;
int * p2 = p;
int * p3 = p2;

897 名前:デフォルトの名無しさん [2017/07/09(日) 16:43:15.93 ID:EeQkMvgZ.net]
>>881 これでいいでしょうか?
int i;
int array[5];
int *p = array;
int **pp = &p;
printf("array : %d\n", array);
for(i = 0; i < 5; i++) {
printf("&array[%d] : %d\n", i, &array[i]);
}
printf("p : %d\n", p);
for(i = 0; i < 5; i++) {
printf("&p[%d] : %d\n", i, &p[i]);
}
printf("pp : %d\n", pp);
for(i = 0; i < 5; i++) {
printf("&pp[%d] : %d\n", i, &pp[i]);
}
>>882
&ppでpのオブジェクトのアドレスを取得できると思ってたんですが違ったんですか?
>>883
すいませんまだそれを理解するのは難しいです。

898 名前:デフォルトの名無しさん mailto:sage [2017/07/09(日) 16:44:50.47 ID:3Luqddjj.net]
何がわからんのや。ようわかるやんけ

アドレス : オブジェクト : 値 : オブジェクトの型
2293464 : pp : 2293468 : int**型
2293468 : p : 2293472 : int*型
2293472 : array[0] : ? : int型
2293476 : array[1] : ? : int型
2293480 : array[2] : ? : int型

899 名前:デフォルトの名無しさん [2017/07/09(日) 16:51:56.41 ID:EeQkMvgZ.net]
>>885
つまりポインタpは配列を参照してもp自体は配列型ではなくて単体(?)のオブジェクトだということでしょうか?

900 名前:デフォルトの名無しさん mailto:sage [2017/07/09(日) 16:56:52.17 ID:3Luqddjj.net]
>>886
もちろんや。
pはarrayとは別のアドレス2293468にある
int*型の独立したオブジェやで

901 名前:デフォルトの名無しさん [2017/07/09(日) 17:01:52.64 ID:EeQkMvgZ.net]
>>887
ありがとうございます!5時間以上つまってたのが一気にクリアになりました!

902 名前:デフォルトの名無しさん mailto:sage [2017/07/09(日) 17:16:44.02 ID:Uu/MlKNR.net]
>>880
> &pp[0] : 2293468
これはpのアドレス
> &pp[1] : 2293472
> &pp[2] : 2293476
pp[1], pp[2]は存在しないからアクセスしちゃダメ
たぶん
2293464: pp
2293468: p
2293472: array[0]
2293476: array[1]
2293480: array[2]
みたいなメモリ割り当てになってるんだろうな

903 名前:デフォルトの名無しさん mailto:sage [2017/07/09(日) 22:31:05.00 ID:WeAgIUgc.net]
>>889
意味のある値が取れないだけで
別にアクセスしても問題ねーだろ

904 名前:デフォルトの名無しさん mailto:sage [2017/07/09(日) 23:28:17.80 ID:1po+7Ikw.net]
>>890
正しく割り当てられたオブジェクトのアドレス以外を指しているのなら、アクセスしてはいけないだろう。
889の例ではたまたまpp[1]が表す位置がスタック上の有効なアドレスでアラインメントも問題無いだろうけど、
例えばppがスタックやヒープの末端のオブジェクトを指していたら、pp[1]にアクセスしたらNGということもある。



905 名前:デフォルトの名無しさん mailto:sage [2017/07/10(月) 06:50:03.40 ID:ZgtWUD/x.net]
中身にアクセスしてなくてただのアドレス計算だぞ

C/C++言語的にはNGだけど、それで例外が発生するとはなかなか考えにくい
もしかしたらビルド時に警告を出してくれるかも

906 名前:デフォルトの名無しさん mailto:sage [2017/07/10(月) 06:54:34.99 ID:t9ouoliu.net]
アドレス計算自体はOKだと思うよ。

907 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/07/10(月) 07:04:04.53 ID:Ols/UzwR.net]
配列ならば確保した数+1までのアドレス計算はやっても大丈夫&整合がとれる位置に配置されている

908 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/07/10(月) 07:05:58.47 ID:ZgtWUD/x.net]
無効エリアのアドレス計算
値不定か動作不定かどっちだか忘れた

これらをOKと呼ぶならOKなんでしょう

909 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/07/10(月) 07:13:12.05 ID:ZgtWUD/x.net]
>>894
-1も有効だとうれしい事があるけど、-1はダメなんだよね

910 名前:デフォルトの名無しさん mailto:sage [2017/07/10(月) 22:27:20.57 ID:WIOZS2V0.net]
>>894
つまり式「&pp[1]」は大丈夫でないと?

911 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 13:12:04.11 ID:eWIFW1BW.net]
ppは配列じゃないだろ

912 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 18:17:43.80 ID:L5b0rMHK.net]
これがアスペいうやつだな
 配列でないオブジェクトも要素数1の配列として考える仕様→よくご存知で
 pは配列じゃないからな→わかる
 ppは配列じゃないからな→頭悪いな
 ppは配列じゃないだろ→アスペ

913 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 20:17:20.41 ID:gS+YojZ9.net]
ん?まったくよくわからんのだが、だれか解説して

>配列でないオブジェクトも要素数1の配列として考える仕様
↑まずこれがよくわからない
配列じゃないオブジェクトといえば、例えばint i;などは配列としては扱えないよね

で、下二行の意味も分からない

914 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 22:08:22.53 ID:qjau/h5c.net]
配列かどうかは関係なく、オブジェクトの後ろのアドレスは計算も出来るし比較も出来る



915 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 22:10:11.51 ID:qjau/h5c.net]
>>894は配列じゃない場合に関しては何も言ってないから間違いではないが
わざわざ配列と書いてるので配列以外は違うと思ったかわからなかったか
だろう

916 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 22:14:58.67 ID:qjau/h5c.net]
>>897
「つまり」が意味不明
>>894は配列じゃない場合には何も言ってない
「大丈夫でない」は正しい

>>898
配列じゃないから何?

>>899
実際には配列ではない

917 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 22:28:18.47 ID:gS+YojZ9.net]
いや、それは俺も思ったんだが
ppが配列じゃないのは当たり前なんだが(てかポインタだし)
おそらくはそんなことは問うてないって言いたいんだと思う

つまり、ppが指している先が何であるかが問題であるから
配列か配列じゃないかを問うべきはppではなくppの指している先である「p」であろうと
同じことをもう一度言うけど
pp[1]としたとき問題になるのはppの指してる先がどうなっているかで
今回の場合はそれは「p」であるから
正しくは、「ppの指してる先のpは配列じゃないだろ」って言うべきっていう主張かと

918 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 23:00:18.82 ID:634mVLA8.net]
>>901
なら&pp[1]も大丈夫なんじゃね?

919 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 07:01:19.46 ID:Mf+sZV2C.net]
pp[1]の時点で動作不定

正しく動かない環境はもしかしたら存在しないかもしれないけど

920 名前: ◆QZaw55cn4c mailto:sage [2017/07/12(水) 07:26:19.94 ID:9q9UgJkW.net]
>>880
ん、最初にもどってメッセージを書くとすれば、こうなるかな

>ポインタそのものにオブジェクトってできるんでしょうか?
私が意味を取り違えているかもしれないが、「できない」
ポインタを取得したからといって、オブジェクトが生えてくることはない
あくまで、先にオブジェクトを確保した上で、それに対してポインタを設定する手順をとる

>例えば、配列arrayのアドレスをポインタpで、ポインタpのアドレスをポインタpのポインタppで調べたんですが、
array を確保しているので、p は array 確保分(p 〜 p + 3)だけプログラムとして意味がある。
pp は p 一個分だけ意味がある。すなわち *pp = p、でも pp[1]= *(pp + 1) は確保していない領域を指すのでこの表現は使ってはいけない

&pp[1] と書くとなにがしかのアドレスを生成するが、それは使えない
アドレスを生成できるからといって、その領域が意味のあるものとは限らない

>>881 では意味のないことを求めてしまいごめんなさい

921 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 08:20:30.93 ID:SNfdy8To.net]
>>906
>pp[1]の時点で動作不定
ちなみにそれを規定する規格の記述はどこ?
Cでは明確に禁止されているようだがC++では見つけられなかった

922 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 09:01:11.94 ID:6a7v2dDL.net]
https://www.google.com/search?q=%22behaves+the+same+as+a+pointer+to+the+first+element+of+an+array+of+length+one%22

923 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 09:10:12.68 ID:6a7v2dDL.net]
https://www.google.com/search?q=%22If+both+the+pointer+operand+and+the+result+point+to+elements+of+the+same+array+object%2C+or+one+past+the+last+element+of+the+array+object%22+%22otherwise%2C+the+behavior+is+undefined%22

924 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 13:20:57.39 ID:ahqaJGrL.net]
>>907
まとめとしてはそれでいいし否定するわけじゃないけど、若干気になるのは
1.ポインタ自身もポインタというオブジェクトじゃないのか?
2.末尾+1のアドレス(を指すポインタ)はデリファレンスできないけど、大小比較には使えるのでは



925 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 13:41:52.51 ID:uqOuLEsE.net]
そんで俺はちょっと思ったんだけど
Cはポインタを配列のように扱えるのが便利だなぁと
逆に配列名を参照したらポインタ値になるし
あと他、関数ポインタを普通の関数のように扱えたり
逆に関数名を参照したらポインタ値になったり
意味の上で別解釈しようがないからそれでいいだろ、的な
二つに共通しているのは
(1)参照しても意味のある値が得られなそうなシンボルは自動的にポインタ値に成り下がってもらおう
(2)その上でポインタに対していろいろな演算 ()[] が出来るようにしておこう
というもので、これでシームレスになるしタイプも減るから便利だろう、と
でもそういう方針なんだったら何故我々は「.」と「->」を
使い分けなきゃならないんだ?と思わんこともない
意味の上で別解釈できたり不明瞭だったりは無いのに
ただ、Cの構造体は(1)を満たしていない
もし(1)を満たすようにしてしまうと、構造体を参照するとポインタ相当に成り下がってしまうので
代入演算子で代入したり、関数に値渡ししたりが出来なくなる
ただし、C言語がそのような仕様になっていた可能性は十分にあると思う
というのも配列がまさにそうであって、代入でコピーできないし、関数に値渡し出来ないから
アセンブリレベルでは配列も構造体もレジスタに入りきらないという意味では同じで
先頭アドレスからのオフセットでアクセスするのは同じであるから
そういう着想に基づけば、構造体も配列と同じようにポインタに成り下がる仕様に
なっていた可能性はあると思う
構造体は代入できないからmemcpyしろ、がCの常識だった可能性はある
そんで、「.」演算子は構造体のポインタに対して有効、となって、「->」は無くなる
で、そうはしなかった代わりに「->」演算子が有る、とも取れる

926 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 13:42:12.78 ID:uqOuLEsE.net]
気まぐれか、意図的か、歴史的事情か、生い立ちに由来するものか、知らんが、そうなっている
だが実際これが大当たりで、もしそうじゃなかったらC++が全く成り立ってこない
C++のクラスはCの構造体を拡張したものだが、オブジェクトが勝手にポインタに成り下がる仕様だと
代入したり、関数のreturnで値として返したりができない
となれば独自のクラスを定義して、まるで基本型のように振舞わせたり、メソッドチェーンをしたりが出来ない
もしやるとしたらnewして返すしかないので、GCが無いとどうにもならなかっただろう
(実際C++とCの配列は相性が悪く、std::vectorかstd::arrayを使わないと上手くいかない場合も多い
 ポインタ相当に勝手に成り下がってしまうので代入ができない)
ただ、このことが本当に良かった事なのかどうなのかは分からない
GCは有ったほうが良かったかもしれないし、C++の代入やコピーコンストラクタに関する話題は後を絶たない
他の言語のほとんどがオブジェクトを参照で扱うのを見てると
Cの配列のように勝手にポインタに成り下がって代入できない考え方のほうがスタンダードなのかもしれない
C++のクラスは、状況に合わせて、これを選べ

927 名前:驕Aという立場になってるが
もしCの構造体が配列のような仕様だったなら、どうなっていたか分からなかった事を考えると感慨深い
[]
[ここ壊れてます]

928 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 13:43:43.81 ID:uqOuLEsE.net]
よくよく考えてみればなかなかに奇妙
まず常人が普通に考えたら、配列や関数名を参照したらポインタ値が得られることにしようっていう発想がない
プログラマは基本的に几帳面で、整合性を気にする生き物だから
ポインタ値は「&」を付けたら得られることにしよう、と決めたのだから
&arrayとか&funcとか書かせたくなるのが普通だろう
そして(*array_ptr)[1]とか(*func_ptr)()とか書かせたくなるものだろう
ところがCは、レジスタに乗らないもの、演算できないもの、を
勝手にポインタと同等に格下げするというルールを設けたうえで
そのポインタに対して各種演算子を定義することで整合性を保ちつつタイプ数を減らすという
ウルトラCをやってのけた
ここまででも俺ではちょっと思いつかないなーと感心するわけだが
逆にこんなすごいことを思いついたんなら、全部このルールで行きたくなってくるのが凡人
その方が整合性がありそうな気がするから
なのに構造体はそうなっていなくて、代わりにアロー演算子が定義してある
だから配列と違って構造体は代入ができるし関数に値渡ししたり、値で返したりが出来る
それはそれで奇妙なことだと思ったりもするが、とにもかくにも
この辺がC++の基本方針や特色にものすごく影響が出てる
GCが無いのもそうだし、最近でも右辺値参照が追加されたりとか、結構尾を引いていて
C++特有のややこしさの一端でもあり、他には代えがたいメリットでもある
ある意味で、Cの配列の考え方のが、他言語のオブジェクトの考え方に近いというのが何とも
そして構造体をベースとするC++とCの配列は相性が悪いという
C言語の功罪は凄い

929 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 13:48:37.49 ID:vq82ZnF5.net]
3行で(´・ω・`)

930 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 17:58:12.38 ID:SNfdy8To.net]
駄レスの関係無いリンク先をまじまじと読んでしまった
日本語でレスが書かれていない時点で読む価値が無いと判断すべきだった

931 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 18:07:40.57 ID:SNfdy8To.net]
>>915
「初期のK&Rが至高と考えるボクは
構造体がコピーできる仕様にハンタイです」

932 名前:デフォルトの名無しさん [2017/07/12(水) 18:19:22.64 ID:Oma/x2r0.net]
ユーザーヘッダーファイルを作って
#include<stdio.h>
#include<math.h>
#define PI 3.14
double r;
void nyuuryoku(void) {
printf("半径を入力してください。\n");
scanf("%fl", &r);
printf("%f\n", r);
return;
}
double keisan(void) {
printf("%f\n", r);
return PI*pow(r, 2);
}
と書いてprintfでrを観察してみたんですがscanfでrに数値を入力しているはずなのにrに何も反映されていないことがわかりました。
rはグローバル変数として扱われていると思うのですがなんでrの値が変わらないんでしょうか?

933 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 18:34:20.99 ID:+I30gFZ0.net]
void nyuuryoku(void) {
char buf[256];
printf("半径を入力してください。\n");
if(NULL==fgets(buf,sizeof(buf),stdin)){
  printf("ちゃんと入力しろやボケ\n");
  return;
}
sscanf(buf,"%fl", &r);
printf("%f\n", r);
return;
}

934 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 18:44:41.01 ID:FRCEttse.net]
>>918
× scanf("%fl", &r);
○ scanf("%lf", &r);



935 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 18:45:48.34 ID:+I30gFZ0.net]
%lfちゃうか?

936 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 18:46:07.89 ID:+I30gFZ0.net]
失礼しますた

937 名前:デフォルトの名無しさん [2017/07/12(水) 18:49:05.30 ID:Oma/x2r0.net]
oh....
コンパイラも見逃してくれてたからそんなミスとは思いませんでした(´エ`;)
ありがとうございました

938 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 19:24:59.74 ID:iSKiMIM1.net]
-Wallつけるか、clang使え

939 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 21:38:59.46 ID:Q4X+sAyq.net]
>>912-914
なんか色々勘違いしてるしどうでもいいから続きはチラウラで頼むわ

940 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 23:05:57.46 ID:2e79StFo.net]
最近のチラシは両面印刷で困る

941 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 00:31:49.82 ID:/oMuxl/G.net]
>>907
>pp[1]= *(pp + 1) は確保していない領域を指すのでこの表現は使ってはいけない
Cの規格をよく読み直したらそうでもなかった

942 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 01:06:35.55 ID:+2MHjXyv.net]
>>912-914は基礎的なところで間違った理解をしていると
そのうえに乗っかるすべてのものについて間違った理解をすることしかできなくなるという見本のようだ

943 名前: ◆QZaw55cn4c mailto:sage [2017/07/13(木) 06:27:44.49 ID:NDMOLt7F.net]
>>927

>>880
int **pp = &p;
でpp[1] は書いちゃだめだろう?

944 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 07:12:43.09 ID:/oMuxl/G.net]
>929
その書いちゃダメを規定する6.5.6p8には「that is evaluated」という条件がある
evaluateはメモリアクセスの有無と関係無く基本的に全て行われるはずだが
6.5.3.2p3の例外既定により該当しないばかりか「&*」が省かれるとある



945 名前: ◆QZaw55cn4c mailto:sage [2017/07/13(木) 08:39:26.58 ID:045lcfaT.net]
>>930
シンタックスではなくセマンティクスというわけですか‥ありがとう

946 名前:デフォルトの名無しさん [2017/07/13(木) 18:16:27.80 ID:PDgj9Ebq.net]
#include<stdio.h>
#include<string.h>
#define NUM 10
int main(void) {
int length;
char name[NUM * 2 + 1];
char family_name[NUM + 1];
char first_name[NUM + 1];
printf("姓を入力してください\n");
scanf("%s", family_name);
printf("名を入力してください\n");
scanf("%s", first_name);
strcat(name, family_name);
strcat(name, first_name);
length = strlen(name);
printf("名前:%s\n", name);
printf("長さ:%d\n", length);
return 0;
}
このプログラムで入力まではちゃんとできてるみたいなんですがstrcatのところでおかしくなって
結合結果がフフフフフフフってなります。どうしてでしょうか?

947 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 18:29:33.51 ID:lX8cJUTX.net]
笑われてんじゃね?

948 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 18:30:25.16 ID:lX8cJUTX.net]
マヂレスすると、nameが不定

949 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 18:34:34.28 ID:a0isPZOF.net]
>>932
char name[NUM * 2 + 1] = {0};

950 名前:デフォルトの名無しさん [2017/07/13(木) 18:37:48.37 ID:PDgj9Ebq.net]
ありがとうございました

951 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 19:34:29.65 ID:b1PvI/zl.net]
どうでもいいけど、
char name[NUM * 2 + 1] = "";

普通こうじゃね?

char name[NUM * 2 + 1] = {'0'};

これでも良い

コンパイル結果はたぶん全部同じだけど

952 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 20:27:20.55 ID:bV5zFMan.net]
>>932
俺のところで試してみたらフフフノフフフになった

953 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 20:43:44.17 ID:lX8cJUTX.net]
Visual Studio のデバッグビルドだと、不定メモリをCCで埋める
だからこれに対応する'フ'が表示される
なぜ途中が'ノ'になるかはわからん

strcatではCCの後の0を探してその後に文字列をコピーするから、0の位置によっては例外が発生したり動作がおかしくなったりするかも

954 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 21:06:57.04 ID:a0isPZOF.net]
>>937
= {'\0'};のタイプミスだよね?



955 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 21:23:18.88 ID:lX8cJUTX.net]
>>940
タイプミスじゃなくて文字化けした
スマホから見ると、? が◆の中に書かれた文字になってる

956 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 23:03:34.21 ID:xdHlDIka.net]
プログラム終了にexit 0とreturn 0がどう違いますか?

957 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2017/07/13(木) 23:59:30.53 ID:anRp6w5D.net]
>>942
違わない。
main 内の return は exit と同じ。

958 名前:デフォルトの名無しさん mailto:sage [2017/07/14(金) 19:19:48.00 ID:TW7O0pB9.net]
というタワゴトで他人を陥れるのであった

959 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 19:26:30.76 ID:RoIBY40S.net]
exitは死のトラクターが働かない

960 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 19:32:27.26 ID:RoIBY40S.net]
異常終了以外でexitを使うヤツは素人

961 名前:デフォルトの名無しさん mailto:sage [2017/07/14(金) 20:20:31.05 ID:8ghhANnS.net]
えっ
mainのreturnでint値返すのはexitをその返り値で呼ぶのと全く等価でしょ?
少なくとも現行のC,C++規格では等価と書いてあるけど現実の実装ではそうなってないってこと?

962 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 20:52:35.05 ID:RoIBY40S.net]
#include <iostream>
#include <cstdlib>
struct A {
~A() {
std::cout << "OK" << std::endl;
}
};
int main(void) {
A a;
std::exit(-1);
}

963 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 20:55:56.83 ID:RoIBY40S.net]
>>947
どこに書いてあったか? 苦情入れるぞ。

964 名前:デフォルトの名無しさん mailto:sage [2017/07/14(金) 21:04:08.43 ID:TW7O0pB9.net]
今日の>>945は健常者
後始末される例外ケースについて触れていたら完璧だった



965 名前:デフォルトの名無しさん mailto:sage [2017/07/14(金) 21:06:50.82 ID:VdC9hBdZ.net]
atexit で後始末回収機構走らないの?

966 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 21:39:46.62 ID:RoIBY40S.net]
>>947
どこに書いてあった?

967 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 21:46:17.67 ID:RoIBY40S.net]
atexitはマニュアルに書いてある通りだから、ここでいちいち説明する必要はない。

968 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 21:53:53.48 ID:RoIBY40S.net]
マニュアルこそが聖書。マニュアルを読まない奴等はノンプレイヤー。

969 名前:デフォルトの名無しさん mailto:sage [2017/07/14(金) 22:54:13.51 ID:RlDfzlps.net]
つまりexit()はバカ発見器ってこと?

970 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 23:01:28.54 ID:RoIBY40S.net]
C++でexit使うぐらいなら、代わりにC++例外を使った方がいいよ。デバッグしやすいし。

971 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 05:41:00.21 ID:81gh4ly6.net]
>>947
exit() 関数に入ってしまってはデストラクタが働かないのに,それでも return 文と一緒といいはるの?
それ規格がまちがってるから,そのうち修正がはいるはず

972 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 13:25:52.33 ID:d+yGYUAe.net]
ポインタの作法に慣れないです
読めるけどかけないです

973 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 16:38:44.94 ID:sZ4h7fLQ.net]
ポインタは2段までしか使わないなあ
関数ポインタはstd::functionに入れる癖がついたし

974 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 17:20:33.71 ID:d+yGYUAe.net]
#include<stdio.h>
int unko(int x);
int aho(int *y);
int main(void) {
int a[5] = { 1,2,3,4,5 };
unko(a);
aho(&a);
printf("%x\n%x\n", a, &a);
return 0;
}
int unko(int x) {
printf("%x\n", x);
return;
}
int aho(int*y) {
printf("%d\n%d\n",*(y+1), y[2]);
return;
}

このとき関数unkoで配列aの中身にアクセスする方法ってありませんか?
アドレスがわかっているからできそうな気もするんですがよく解りません。



975 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 17:27:13.54 ID:xLcEZRbh.net]
aがint a[5]であるとき、aはint配列の先頭アドレスだ。unkoの引数をポインターにしろ。

976 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 17:56:11.02 ID:d+yGYUAe.net]
はい

977 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 20:48:00.24 ID:iuayY/9E.net]
そもそもこのソースコンパイルエラーになるんじゃね?

978 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 21:29:06.16 ID:d+yGYUAe.net]
>>963
VSだとコンパイラ通るんですが他のだと通りませんか?
あと関数unkoをいろいろ弄ってたんですが

#include<stdio.h>
void unko(int x);
void aho(int *y);
int main(void) {
int a[5] = { 1,2,3,4,5 };
unko(a);
aho(a);
printf("%x\n%x\n", a, &a);
printf("%d\n",a[4]);
return 0;
}
void unko(int x) {
printf("%x\n", x);
int *p = x;
printf("%d\n%d\n", p[1],*(p+2));
p[4] = 10;
return;
}
void aho(int*y) {
printf("%d\n%d\n",*(y+1), y[2]);
return;
}

こんな記述にすれば少なくともVSでは引数をポインタにしなくても配列aの要素を覗いたり操作したりできることがわかりました。

979 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 21:31:54.33 ID:18nkvKxh.net]
型がめちゃくちゃだあああ!!!
型が形無し!

980 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 21:36:49.71 ID:18nkvKxh.net]
できることとやってもいいことは違うんだよ。

981 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 21:39:23.41 ID:18nkvKxh.net]
コンパイル時に出て来る度重なる警告を無視したらダメだよ。

982 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 21:44:11.03 ID:d+yGYUAe.net]
すみません

983 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 21:46:08.79 ID:18nkvKxh.net]
お使いの32ビット環境ではintとint*が同じサイズだから、キャストされれば代入できる。sizeof(int) == sizeof(int*)。
しかし、64ビット環境では動かなくなるかもしれない。ポインター型を無視した良くない書き方だ。

984 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 21:54:52.27 ID:18nkvKxh.net]
おそらく、君の環境では、
sizeof(int) == 4,
sizeof(int*) == 4
のはずだ。
64bit環境では、多分
sizeof(int) == 4,
sizeof(int*) == 8
になる。確認してみたまえ。



985 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 21:57:34.94 ID:18nkvKxh.net]
int*のサイズがintのサイズより大きいと、ポインター(アドレス)の値が正しく代入できない。これが64bitで失敗する理由だ。

986 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 22:08:26.63 ID:qXQ9KlTo.net]
こまけーことをゴチャゴチャと
Cなんて大なり小なり環境依存な場面しか使わん
貴様はintに32767以下しか入れんのか?

987 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 22:10:20.05 ID:d+yGYUAe.net]
確かめてみたら確かに自分の環境では両方4バイトでした
64bitのプログラムにしたらダメになるんですね・・・
勉強になります。ありがとうございます。

988 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 22:23:44.38 ID:vkKq60sj.net]
2レスで失礼します
VC++9Eでruby-opencvのビルドを試みているのですが構文エラーが多発してビルドできません
>C:\dev\ruby-opencv>nmake
>〜
>cl -I. -I. -IC:/dev/ruby-1.8.7-p374/win32/bin/lib/ruby/1.8/i386-mswin32_90 -IC:/dev/ruby-opencv-master/ext/opencv -MD -O2b2xty- /EHsc -IC:/dev/ruby-opencv-master/ext/opencv/ext/opencv
/EHsc -DHAVE_OPENCV2_CORE_CORE_C_H -DHAVE_OPENCV2_CORE_CORE_HPP -DHAVE_OPENCV2_IMGPROC_IMGPROC_C_H -DHAVE_OPENCV2_IMGPROC_IMGPROC_HPP -DHAVE_OPENCV2_VIDEO_TRACKING_HPP
-DHAVE_OPENCV2_FEATURES2D_FEATURES2D_HPP -DHAVE_OPENCV2_FLANN_FLANN_HPP -DHAVE_OPENCV2_CALIB3D_CALIB3D_HPP -DHAVE_OPENCV2_OBJDETECT_OBJDETECT_HPP
-DHAVE_OPENCV2_LEGACY_COMPAT_HPP -DHAVE_OPENCV2_LEGACY_LEGACY_HPP-DHAVE_OPENCV2_HIGHGUI_HIGHGUI_C_H -DHAVE_OPENCV2_HIGHGUI_HIGHGUI_HPP -DHAVE_OPENCV2_PHOTO_PHOTO_HPP
-DHAVE_OPENCV2_NONFREE_NONFREE_HPP -DHAVE_STDARG_H -I/usr/include -IC:\dev\OpenCV2.4\install\include -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -c
-TpC:/dev/ruby-opencv-master/ext/opencv/algorithm.cpp
>〜
>algorithm.cpp
>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\INCLUDE\istream(699) : warning C4003: マクロ 'read' に指定された実引数の数が少なすぎます。
>C:\〜\istream(699) : error C2059: 構文エラー : ')'
>C:\〜\istream(846) : コンパイルされたクラスの テンプレート のインスタンス化 'std::basic_istream<_Elem,_Traits>' の参照を確認してください
>C:\〜\istream(700) : error C2143: 構文エラー : ')' が '{' の前にありません。
>〜
>C:\〜\xxbind1(320) : warning C4003: マクロ 'bind' に指定された実引数の数が少なすぎます。
>C:\〜\xxbind1(320) : error C2988: 認識できないテンプレートの宣言または定義です。
>C:\〜\xxbind1(320) : error C2059: 構文エラー : ','

989 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 22:24:14.08 ID:vkKq60sj.net]
何らかのファイルが足りないとかならまだ判るのですがこのファイルはVCに付属の物ですし構文エラーなどと言われても理解できません
algorithm.cppは一番最初のファイルで全く進まない状態です
ちなみにRubyとOpenCVのビルドは一応通っています(本当に問題ないかは未確認)
C/C++は不慣れでVSの使用経験もあまりないため原因の見当も付かず手詰まり状態です。もし何か判る方がいたら教えてもらえると助かります

990 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 22:27:42.35 ID:18nkvKxh.net]
readというマクロが悪さをしているようだ。#include順を変えるか#undefしろ。

991 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 22:35:18.82 ID:Z+b63Gri.net]
>>958
使わずに済むのなら無理して使う必要は無いだろ?
正しく動けばそれでいい

992 名前:974 mailto:sage [2017/07/16(日) 12:18:52.82 ID:wcmK4agw.net]
>>976
すみません。その場所の特定ってどのようにすればいいのでしょうか
比較的規模の大きいライブラリですし、インクルードしているファイルだけでもかなりの数になりそうです
ファイルの検索とテキストエディタだけでは追えそうにありません
追跡を支援してくれるツールとかないんでしょうかね・・・

993 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/16(日) 12:28:40.60 ID:flrpsNzv.net]
>>978
IDEのフォルダ内検索か、
grepツール

994 名前:デフォルトの名無しさん mailto:sage [2017/07/16(日) 15:16:03.75 ID:1O/pViqJ.net]
マクロ展開したソース吐くオプションあったよな

VCならd.hatena.ne.jp/nurs/20100516/1274020395

1.ソリューションエクスプローラ上で展開後の結果を見たいcppファイルを右クリック⇒
 プロパティ⇒プリプロセッサ⇒前処理済みファイルの生成⇒行番号つきか行番号なしを選択
2.再びソリューションエクスプローラ上で展開後の結果を見たいcppファイルを右クリック⇒コンパイル
 これで、cpp が置かれているのと同じファイル階層に、cppと同じ名前だけど拡張子が.iになってる
 ファイルができてるからそれがそうだよ

gccなら -E



995 名前:デフォルトの名無しさん [2017/07/16(日) 17:55:59.24 ID:i1aK64sE.net]
class Kitty {
public:
char *str;
Kitty() { str = "Kitty on your lap\n"; }
Kitty(const Kitty &obj) { str = "Di Gi Gharat\n"; }
} g_obj ;

int main() {
Kitty obj = g_obj;
cout << g_obj.str;
cout << obj.str;
return 0;
}

Kittyクラス終わりのセミコロンの間に変数g_objがあるんですがこれはどういう意味なんですか?

996 名前:デフォルトの名無しさん mailto:sage [2017/07/16(日) 18:11:45.98 ID:0XlWr73/.net]
「int i; のセミコロンの前に変数g_objがあるんですがどういう意味ですか」
と訊いているに等しい

997 名前:デフォルトの名無しさん mailto:sage [2017/07/16(日) 18:13:11.34 ID:0XlWr73/.net]
訂正
 誤 変数 g_obj
 正 変数 i

998 名前:デフォルトの名無しさん mailto:sage [2017/07/16(日) 18:25:45.80 ID:dVrh8pbL.net]
g_objはKittyのインスタンスだが
あまりこういう書き方はしないかもね

999 名前:デフォルトの名無しさん mailto:sage [2017/07/16(日) 18:31:52.76 ID:ZbG5GhXO.net]
>>981
Kitty と言うクラス定義とその型を持つ g_obj と言うグローバル変数を同時に定義している
要するに
class Kitty {
...
};
Kitty g_obj;
を一つにまとめてるだけ

1000 名前:デフォルトの名無しさん [2017/07/16(日) 18:48:37.09 ID:i1aK64sE.net]
>>982 >>984
レスありがとうございます
>>985
わかりやすい解説ありがとうございました

1001 名前:デフォルトの名無しさん mailto:sage [2017/07/16(日) 22:25:00.23 ID:Z5uaiz2p.net]
>>986
それはさておき
>str = "Kitty on your lap\n"
このウンコード、何かおかしいとは思わないのかね

1002 名前:デフォルトの名無しさん mailto:sage [2017/07/17(月) 00:15:32.26 ID:+UBTk6HR.net]
>>987
ウンコードは食べるとニガいからな

1003 名前:デフォルトの名無しさん mailto:sage [2017/07/18(火) 05:08:40.08 ID:gGqeofJB.net]


1004 名前:デフォルトの名無しさん mailto:sage [2017/07/18(火) 07:08:39.06 ID:vzMDiUgd.net]
次スレ立てたにゅ

【初心者歓迎】C/C++室 Ver.101【環境依存OK】
mevius.2ch.net/test/read.cgi/tech/1500329247/



1005 名前:デフォルトの名無しさん mailto:sage [2017/07/18(火) 19:37:15.43 ID:bPzCLpNs.net]
おつ

1006 名前:デフォルトの名無しさん mailto:sage [2017/07/18(火) 22:55:46.66 ID:KX2fhuwb.net]
ひょっとして2ちゃんのこのスレ
他のC/C++相談所よりハイレベル!?

1007 名前:デフォルトの名無しさん mailto:sage [2017/07/19(水) 07:02:25.97 ID:Jp1Fyagp.net]
うめてんてー

1008 名前:デフォルトの名無しさん mailto:sage [2017/07/19(水) 07:03:18.13 ID:Cx7F+3jm.net]


1009 名前:デフォルトの名無しさん mailto:sage [2017/07/19(水) 10:27:43.90 ID:MRnyPI+k.net]
他のC/C++相談所ってどこ?

1010 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2017/07/19(水) 16:13:01.49 ID:AV+hYp2C.net]
SNS の C++ コミュニティとかじゃね?

1011 名前:デフォルトの名無しさん mailto:sage [2017/07/19(水) 17:00:45.76 ID:Si/VL0fD.net]
それトリ割れしてるよ
#o%K%H:+O

1012 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2017/07/19(水) 17:08:00.13 ID:AV+hYp2C.net]
>>997
知ってるけど成りすましは一度しか出てきてないのでまあいいかなって。

1013 名前:デフォルトの名無しさん mailto:sage [2017/07/19(水) 17:33:56.27 ID:bGQD/KSW.net]
このスレにはQさんがいるからな
Qさんがいれば安心だ

1014 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2017/07/19(水) 17:43:36.36 ID:AV+hYp2C.net]
>>1000 を取れたら長門は俺の嫁



1015 名前:1001 [Over 1000 Thread.net]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 254日 18時間 45分 34秒

1016 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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