【初心者歓迎】C/C++室 Ver.100【環境依存OK】 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2016/11/06(日) 22:58:02.60ID:dU5z27As
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。

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

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

前スレ
【初心者歓迎】C/C++室 Ver.99【環境依存OK】
http://echo.2ch.net/test/read.cgi/tech/1469177649/
793デフォルトの名無しさん
垢版 |
2017/07/02(日) 22:59:43.93ID:9wrwY3nx
そんなことはない
2017/07/02(日) 22:59:50.00ID:MoO3L/4V
お前は試験に受かってからプログラミング始めるのかw
2017/07/02(日) 23:03:16.06ID:UYpoTCPe
パソコンって、アドレスバスの、メモリ読み書きで、
デバイスを、直接操作するのか?
それとも、アドレスA0000に文字を書き込むのか?
その知識、30年くらい、遅くね?
2017/07/02(日) 23:32:00.58ID:1Me6IR2g
>>782
整数も除算に誤差があるから禁止
2017/07/02(日) 23:32:37.56ID:1Me6IR2g
>>783
整数でも1/3*3は1にならない
2017/07/02(日) 23:35:11.82ID:1Me6IR2g
>>785
コストも考えなさい

epsilonは>>786の通り
補足すると、
収束判定に限らず、普通はepsilonで判定しない
2017/07/02(日) 23:36:02.92ID:iWsKHD5Z
0になるし誤差はないな
2017/07/02(日) 23:36:20.12ID:1Me6IR2g
>>792
情報処理資格www
なんの役にもたたない
2017/07/02(日) 23:36:31.36ID:iWsKHD5Z
って触れちゃダメな奴だったかすまん
2017/07/02(日) 23:38:56.12ID:+3axEb/N
前回、共用体の非アクティブメンバーアクセスが許されるcommon initial sequenceの条件である「型の互換性」に目を付けたレスを見た時は
>>792がもう少し見所の有る奴だと思っていた(過去形)
2017/07/02(日) 23:51:33.15ID:p749GQFM
>>797
すまん、1/3は1.0/3とか書くべきところだったな。
2017/07/02(日) 23:53:35.08ID:1Me6IR2g
いやいやそこじゃなくて
2017/07/02(日) 23:55:20.40ID:1Me6IR2g
1.0/3.0*3.0 が 1.0にならないことがある
1/3*3 が 1にならない

小数演算特有ではない
2017/07/02(日) 23:59:40.73ID:1Me6IR2g
0.1を10回足しても1にならないことがあるって言うのも小数特有ではない

0.1は普通のfloatやdoubleでは表現できず、コンパイル時に近似値に変換する
この意味では以下と本質的には同じ

int a = 0.1;
int b = a * 10;
807デフォルトの名無しさん
垢版 |
2017/07/03(月) 00:01:24.04ID:UYk8Gv77
>>792
自作って高価なプラモデルだぞ。。。
夢見過ぎ。
直接ってもなぁ。。。
昔はx86限定で直接レジスタ弄れる命令あったんだが、その命令は今じゃ優先的にレジスタ使ってね☆って意味に変質してるもんなぁ。。。
今のCは思ってるより下級言語じゃ無いぞ。
普通の言語よりゃハードに近いけどさ。
2017/07/03(月) 00:02:29.57ID:Ds1QZZUB
doubleがintに比べて誤差が少ないため、誤差を気にせずに使ってしまいやすい

だから注意の意味を含めて誤差が大袈裟に語られる傾向がある

当然整数の方が(普通は)はるかに誤差が大きい
2017/07/03(月) 00:03:12.56ID:NRAuceWo
>>805
それは知ってるけど元の質問者がdoubleの演算誤差について聞いているのだから、整数の除算の件は話が外れていると思う。
この手のスレに良くあることだけど、元の質問から勝手に話が発散して何を目的に議論しているのかが分からなくなるね。
2017/07/03(月) 00:04:40.53ID:Ds1QZZUB
いやだから、

気を付けるべき点は >>769 の後半にまとめたつもりだけど
2017/07/03(月) 00:10:25.95ID:Ds1QZZUB
よくやりがちな例は、

for (double a = 0; a <= 1 ; a += 0.1)

みたいな比較と

double a = sqrt(3);
double b = a * a;
int c = b;

みたいな整数丸め
2017/07/03(月) 00:12:35.84ID:Ds1QZZUB
これは、
double に限らす10000桁精度の演算ライブラリでも全く同じ問題がほぼ同じ率で起こる
2017/07/03(月) 00:14:47.47ID:Ds1QZZUB
前者はループが10回か11回かはバクチで、
後者はcが2になるか3になるかはバクチ
814デフォルトの名無しさん
垢版 |
2017/07/03(月) 00:19:44.20ID:UYk8Gv77
なんかそんなの読んだことあるな。
計算結果は精度の範囲内だけど、計算途中で精度超えて結果に誤差が出る的な。
なんか対策あったぞ。
2017/07/03(月) 04:06:04.60ID:yzYakBEJ
>>798
普通は計算機epsilonで判定は
しない、これはわかりました
じゃあどんな値で判定するんですか?
2017/07/03(月) 04:57:07.32ID:BlNCaFmm
>>792
カーニハンもリッチーも受かっていないようだが?
2017/07/03(月) 08:32:52.95ID:rvaVDuHz
>>815
対象の値が含み得る誤差を用いる。
機械イプシロン(を指数によってスケールしたもの)は誤差の下限を示しているだけに過ぎない。
2017/07/03(月) 11:17:36.99ID:rWGDP/Vn
下限ではない
下限はその半分
819デフォルトの名無しさん
垢版 |
2017/07/03(月) 19:44:02.70ID:BsrmCust
VisualC++とそれ以外用とで別の関数を用意して、プリプロセッサを使用してコンパイル時に選択したいと思っています
この場合、関数全体を#ifdef _MSC_VER〜#endifで囲うことになるのですか?
もう少しきれいな書き方があれば教えてください
よろしくお願いします
2017/07/03(月) 20:12:56.57ID:oiFj/hKr
>>819
機種依存部分をライブラリ化してリンク時に差し替えるとか
2017/07/03(月) 20:21:04.11ID:tl3oQzgh
関数全体を切り替えたいなら関数全体を複数記述するしかあるまい

部分的に違うだけならその違う部分的だけ切り替えればいい

関数全体を複数記述する方法はいくつかある
2017/07/04(火) 00:10:04.57ID:2/r2iAfu
>>819
別にそれでいいじゃん。大量にあるならファイル分ければいいし
823デフォルトの名無しさん
垢版 |
2017/07/04(火) 09:38:28.01ID:GKwjzP9N
class A {}
int main{
A a; //c++
A a = new A(); //c#
}
このc++の「A a;」は、c#の「A a = new A();」と同じ意味ということでいいんですか?
2017/07/04(火) 10:10:55.61ID:A8K7ipT2
>>823
同じになるねぇ
あえて違う点を挙げるとすればAが作成される領域がスタックかヒープか
でも意識するほどのことじゃない
825デフォルトの名無しさん
垢版 |
2017/07/04(火) 10:53:00.81ID:GKwjzP9N
>>824
スッキリしました。ありがとうございます。
2017/07/04(火) 12:24:06.77ID:rriFyG5E
いやC++やるならスタックかヒープかは意識しなきゃだめだろ
deleteどうすんの
2017/07/04(火) 12:53:41.35ID:Tv7aUxog
>>824
> Aが作成される領域がスタックかヒープか
いや、それは意識しろよ
2017/07/04(火) 16:07:16.69ID:BdJEhj1W
ヒープはC#の方だろ、とりあえず意識しないでも
2017/07/04(火) 17:16:06.09ID:RU97axJ4
C#はdelete書かないんだからC++なら
deleteが不要な「A a;」を同等と捉えるのが筋
配置場所なんかどうでもええ
2017/07/04(火) 18:37:27.41ID:eP5xPbfu
newだとスコープ抜けても残るんじゃ?
2017/07/04(火) 18:44:00.48ID:xAcMjOR1
C#だとスマポみたいになるんかね
2017/07/04(火) 19:56:18.89ID:3bDdeHlE
c#はGC管理、classは参照型
2017/07/04(火) 20:17:33.06ID:olJiM2Cb
>>829
寿命が全然違うじゃないですかぁ
2017/07/04(火) 20:31:05.28ID:L7t36fm1
コストも
2017/07/04(火) 21:02:27.05ID:V6j6UQbw
で?
2017/07/04(火) 21:52:57.05ID:+pBAjacr
すげえ考え方の奴が出てきてワロッシュ
2017/07/04(火) 22:13:30.60ID:kiqPrlXB
寿命だのコストだの言うけど
そんな実相依存どうやって見積もるの?
無意味な揚げ足取りはやめたら?
2017/07/04(火) 22:14:59.82ID:VwPftttd
え?
2017/07/04(火) 22:17:16.01ID:TrkY+sIz
C++ 側は実装依存な部分あるっけ? C#側はよーわからんけど
2017/07/04(火) 22:19:25.34ID:dCdz+uzl
こっちはC++スレだぞ?C++でスタックとヒープのコストや寿命の違いを意識する必要がないってマジでいってるのかよ
2017/07/04(火) 22:29:39.22ID:kiqPrlXB
newの方はC#のって前置きがあるだろうが
よく読め
まあ元々の質問もあれだが
2017/07/04(火) 22:42:25.19ID:IS9gvNe4
コストは
c++のnew>>(超えられない壁)>>c#のnew>スタック
全然違うというほどでもないし
2017/07/04(火) 23:02:36.26ID:olJiM2Cb
コストは置いておいたとしても寿命はどうするんだよ

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

メモリ管理に関してはC++はマニュアルでC#はオートなんだから
こういうたとえになるんだよ
2017/07/04(火) 23:10:09.31ID:VgVQ93XC
>>837
おまいさん資格持ちじゃないよな?な?な?
2017/07/04(火) 23:15:08.21ID:olJiM2Cb
あと、C#はJavaと違って構造体が使えてこれは値型になれるから
スタックに確保できる
なんで、C++の A a; はどちらかというと、そちらに該当するんだよ

で、C#のA a = new A(); はというと
delete が必要という一点を除けば C++ の A *a = new A();に相当するんだよ
こんなこと当たり前だろ
2017/07/04(火) 23:23:27.06ID:9HpxJyun
>>845
実装と目的を一緒にすんなよタコ
単に「Aのインスタンス生成するコード書いてみ」
といわれたら>>823になるだろjk
意味が同じってのはそういうこった
2017/07/04(火) 23:33:11.25ID:AVhuZxl1
>>842
えっ???
そんな馬鹿な
2017/07/04(火) 23:38:27.02ID:olJiM2Cb
>単に「Aのインスタンス生成するコード書いてみ」

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

元は
>このc++の「A a;」は、c#の「A a = new A();」と同じ意味ということでいいんですか?
2017/07/04(火) 23:38:59.24ID:AKPIjSm8
超えられないかはともかく、newに限って言えばGC言語の方が低コストでもおかしくない。
2017/07/04(火) 23:39:54.18ID:kiqPrlXB
厳密にどうかじゃないんだよ
初心者がこれから言語を勉強していくのに
より得になる方はどっちだってことよ

GCだからー、ヒープだからーって
そんな答えおよびじゃないっつーの
2017/07/04(火) 23:40:16.44ID:AVhuZxl1
実際に試してから言えよ
2017/07/04(火) 23:40:38.87ID:AVhuZxl1
>>842
>>849
2017/07/04(火) 23:43:53.74ID:olJiM2Cb
どの程度の初心者かわからないだろ
C#と比べてるってことは既にC#をそこそこマスターしているかもしれないだろ
その状態でC++に手を出そうとしていたとしたら、どうだ?
C#とC++の違いなどを書いたほうが良いだろ
2017/07/04(火) 23:46:31.14ID:tvZqc0j8
>>850
初心者だからこそ、上っ面の文法の違いだけで捉えて、こうすればだいたい同じとか説明する前に、
前提としてメモリ管理の考え方が違うことを理解してもらうのは重要だろう。
2017/07/04(火) 23:47:41.62ID:AVhuZxl1
違うものは違う
2017/07/04(火) 23:48:12.47ID:VwPftttd
もういいよ、まとめると

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

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

どれとどれを同じと思うかは人それぞれ。
終了
2017/07/04(火) 23:50:58.52ID:TrkY+sIz
C# の後者の寿命は? delete pa は C++ だよね
2017/07/04(火) 23:53:27.36ID:VwPftttd
>>856
おっと、間違えた
C#の後者の寿命はGCに回収されるまででした
2017/07/05(水) 00:46:01.47ID:EyHtcvE8
>>856
ご苦労さん

何故この話題がここまで伸びたんだろ
2017/07/05(水) 22:56:44.72ID:UhWlQCq1
異なる考えの言語同士であるため対応が自明でないという事実を無視して
自分の考える「同じ意味」の解釈を押し付けるからに相違ない

>C#ではインスタンス生成の方法は値型、参照型でそれぞれ一種類ずつしかなく、
>A a; //struct A
なるほどこうやって言語仕様を確認せず想像をたれ流すので世の中が嘘だらけになるのだな
2017/07/05(水) 23:29:36.43ID:0KIeSgEp
>>860
ん、C#のほうはそれであってるだろ
StringとかDateTimeみたいな一部の例外を除けば
2017/07/06(木) 01:22:17.04ID:AOJFjP+S
>異なる考えの言語同士であるため対応が自明でないという事実を無視して
>自分の考える「同じ意味」の解釈を押し付けるからに相違ない

ん?だからそれに基づいてほとんどの人は
「違う意味だよ〜」って言ってたんじゃなかったの?
一部の人が「同じような意味だよ〜」って言ってただけで
それに反論する流れだったでしょ
だから「同じ意味」の解釈の押し付け合いはしてなくて
同じ意味だよ vs 違う意味だよ
だったと思うけど
2017/07/06(木) 05:15:51.23ID:5a/RGiY/
わざわざ堅苦しい言葉選んで俺偉いアピール
2017/07/06(木) 05:29:37.28ID:T7F4pxe5
同じ様な意味と同じ意味は違う
さらっと言葉をすり替えるなよ
まったく卑怯な奴よの
(つーか同じ様な意味とも言っていない)
2017/07/06(木) 08:09:44.50ID:TSgBvSRK
>>862
>だから「同じ意味」の解釈の押し付け合いはしてなく
「同じ意味」の基準について合意していないのに「ここが違うから別」とだけ言うのは「同じ意味」の解釈の押し付けに他ならないと思うのだが、
もう少し日本語の字面でなく意味を理解した方がよいのではないか

>「違う意味だよ〜」って言ってたんじゃなかったの?
 →Yes
>同じ意味だよ vs 違う意味だよだった
 →Yes
2017/07/06(木) 08:11:58.37ID:rcg+ZZ7N
違うものは違う
2017/07/06(木) 08:12:32.60ID:TSgBvSRK
>>861
合っているかと訊かれれば合っていないので、言語仕様を読むか当該のスレッドで訊くのが良いのでは
あとStringやDateTimeの例外というのが何なのかよくわからなかった
2017/07/06(木) 08:18:45.02ID:QfwLuwwY
>>867
合ってるから消えろ
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/new-operator
2017/07/06(木) 14:54:52.15ID:m/Ia1fy1
まだやってんのかよ
おまいらのこだわりはスゲェな
2017/07/06(木) 22:06:42.25ID:TSgBvSRK
リンク先を見て思ったのだが
こだわりじゃなくて罵られることに喜びを覚えるマゾなのではないかと言う気がした
2017/07/06(木) 22:08:34.16ID:JPWXM8i2
>>870
正しく指摘できないのならレスしないほうがいい
あなたの思ういちばんすこいC#の仕様の世界で生き続けてくだはい
アーメン
2017/07/07(金) 11:58:06.67ID:C1hAccX9
俺は、プログラミングなんて存在しない世界で生きたい
2017/07/07(金) 12:21:24.92ID:2bQkb9bH
生まれてくるのが100年くらい遅かったようだな
874デフォルトの名無しさん
垢版 |
2017/07/07(金) 12:21:27.14ID:xvg52mfm
プログラマ辞めれば良いだけやん。
875デフォルトの名無しさん
垢版 |
2017/07/07(金) 13:29:12.14ID:1UwaMcEr
c++
英語を読める
btcをトレードしたことがある

仮想通貨の開発に参加してみたい方
レスをお願いします
2017/07/07(金) 15:01:32.91ID:u5D8E4qs
>>875

んで?どうすりゃええの
877デフォルトの名無しさん
垢版 |
2017/07/07(金) 16:03:32.34ID:1UwaMcEr
>>876
お返事ありがとうございます

通貨名
raiblocks

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

web
https://raiblockscommunity.net/

slack
https://raiblocks.slack.com

slackに参加
#developmentにて、開発に興味がある旨の書き込みをしてください(英語で)
2017/07/08(土) 21:39:10.74ID:dFvfrYOE
プログラミングなんて底辺ドカタの仕事
そのうちAIがやれるようになる
879デフォルトの名無しさん
垢版 |
2017/07/08(土) 22:33:35.86ID:lbAgDi9M
アドバイスさんくす
880デフォルトの名無しさん
垢版 |
2017/07/09(日) 16:06:32.28ID:EeQkMvgZ
ポインタそのものにオブジェクトってできるんでしょうか?
例えば、配列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つのオブジェクトをもてるのか、ポインタ自体にオブジェクトは生成されないのか
他の要素でそうなってるのかわかりません。どなたか回答宜しくお願いいたします。
2017/07/09(日) 16:13:17.36ID:VF1qtZ3L
>>880
その出力を一挙に得られるプログラムを示せ,アドレスはプログラムの実行ごとに変わる可能性がある
2017/07/09(日) 16:20:52.70ID:v/7piv3Y
>>880
pとarrayは異なるオブジェクトだから確認方法が間違ってる
2017/07/09(日) 16:25:25.83ID:3Luqddjj
一つのポンタを複数のオブジェなんて当たり前
int z;
int * p = &z;
int * p2 = p;
int * p3 = p2;
884デフォルトの名無しさん
垢版 |
2017/07/09(日) 16:43:15.93ID:EeQkMvgZ
>>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
すいませんまだそれを理解するのは難しいです。
2017/07/09(日) 16:44:50.47ID:3Luqddjj
何がわからんのや。ようわかるやんけ

アドレス : オブジェクト : 値 : オブジェクトの型
2293464 : pp : 2293468 : int**型
2293468 : p : 2293472 : int*型
2293472 : array[0] : ? : int型
2293476 : array[1] : ? : int型
2293480 : array[2] : ? : int型
886デフォルトの名無しさん
垢版 |
2017/07/09(日) 16:51:56.41ID:EeQkMvgZ
>>885
つまりポインタpは配列を参照してもp自体は配列型ではなくて単体(?)のオブジェクトだということでしょうか?
2017/07/09(日) 16:56:52.17ID:3Luqddjj
>>886
もちろんや。
pはarrayとは別のアドレス2293468にある
int*型の独立したオブジェやで
888デフォルトの名無しさん
垢版 |
2017/07/09(日) 17:01:52.64ID:EeQkMvgZ
>>887
ありがとうございます!5時間以上つまってたのが一気にクリアになりました!
2017/07/09(日) 17:16:44.02ID:Uu/MlKNR
>>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]
みたいなメモリ割り当てになってるんだろうな
2017/07/09(日) 22:31:05.00ID:WeAgIUgc
>>889
意味のある値が取れないだけで
別にアクセスしても問題ねーだろ
2017/07/09(日) 23:28:17.80ID:1po+7Ikw
>>890
正しく割り当てられたオブジェクトのアドレス以外を指しているのなら、アクセスしてはいけないだろう。
889の例ではたまたまpp[1]が表す位置がスタック上の有効なアドレスでアラインメントも問題無いだろうけど、
例えばppがスタックやヒープの末端のオブジェクトを指していたら、pp[1]にアクセスしたらNGということもある。
2017/07/10(月) 06:50:03.40ID:ZgtWUD/x
中身にアクセスしてなくてただのアドレス計算だぞ

C/C++言語的にはNGだけど、それで例外が発生するとはなかなか考えにくい
もしかしたらビルド時に警告を出してくれるかも
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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