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

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

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

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

前スレ
【初心者歓迎】C/C++室 Ver.100【環境依存OK】
http://mevius.2ch.net/test/read.cgi/tech/1478440682/
2017/09/06(水) 00:18:48.47ID:6Ek+YiOk
>>613
char[] = "samurai";

はどうなるんだよ。欠陥だらけの言語だな。
2017/09/06(水) 06:42:27.45ID:lz1Lh31S
それのどの辺が欠陥?
2017/09/06(水) 09:50:26.00ID:3N8FGDgc
char hoge[] = "samurai";
const char hage[] = "harakiri";
無問題
2017/09/07(木) 22:47:37.15ID:jsOYkjhe
↑どうしようもないバカ
2017/09/08(金) 00:52:21.25ID:vi4Hog1L
これから勉強しようと調べたら、C#やってたのに、見慣れない文法が俺的に意味不明過ぎて草
取り敢えず書かないとわかんねーなw
2017/09/08(金) 00:55:11.66ID:z9zmzhsM
https://ideone.com/y8mZJo
初心者です
クラスのメンバ変数に別のクラスを持つ場合、
実体かポインタのどちらで持った方が良いのでしょうか?

Data1(別のクラス)、Class1(実体で持つ)、Class2(ポインタで持つ)がその部分です
Class2の方がサイズが小さかったのでこちらの方が良いのですか?
それとも、使う側がメモリ使用量を削減したければ、
使う側がmain関数の変数dやeのような使い方をしてくれるだろう、
ということを期待して、余計なことはせずにClass1のようにするべきですか?

また、ポインタで持つ場合、Data2とClass3のような極端な場合
(実体で持った場合とポインタで持った場合の違いが4バイトしかない)
でもポインタで持つべきですか?
2017/09/08(金) 01:42:32.16ID:T0c8eZQl
この場合は実体で持ったほうがいいと思う

ポインタのほうがサイズが小さいって言ってるけど、あくまでも型のサイズであって使ってるメモリはポインタのほうが多くなってるよ

データがデータを持つクラスと同時に生成され同時に消えるものなら実体のほうが楽だし
2017/09/08(金) 01:54:33.88ID:3vC4jpKo
既に回答があるけど
実体で持つべきかポインタで持つべきかはもっと複雑な要因で決まる

C++は他の言語と違ってクラスのインスタンスを実体で持てる変わった言語で
それはそれで便利だから基本的には実体で持って構わない
理由はトラブルが無いから

ポインタで持つ場合は、他所から与えられたり、動的に差し変わったり、他所と共有したり
ややこしいことがしたい場合はポインタで持つ
一応「ややこしいこと」の中に君が求めている「サイズを減らしたい」も含まれる
例えば巨大な画像データなどを複数のクラスで共有してメモリ使用量を削減したい場合など
そのようなつもりがないのであれば、実体で持って構わない
2017/09/08(金) 04:08:54.89ID:lqryTDOd
まあ、まずは意味的な妥当性を考えるべきかな。
よほど大量にオブジェクトを作るのでなければ
少々のメモリ使用量の差なんてどうってことない。
そのクラスで定義したい概念に一致してるかが重要だろう。
625デフォルトの名無しさん
垢版 |
2017/09/08(金) 22:03:27.48ID:TiXktDhC
>>621
ケースバイケース

実体で持つ利点:
開放漏れやコピーし損ないがない

ポインタで持つ利点:
他の言語と同じ感覚で使える
大きなプロジェクトで再コンパイルの無駄な時間を減らせる
2017/09/09(土) 00:41:38.80ID:hNauHrr/
みなさんありがとうございます
これからは状況に合わせてどれが適切かどうか考えて実装します
今回(621のコードではない)は、621のコードのようにサイズも小さく、
他のクラスと共有するようなデータを持っているクラスでもなく、
そのメンバを所有しているような概念だったので、
メンバ変数は実体で持つことにしました
2017/09/09(土) 04:29:22.24ID:gq9mYezw
ポインタで持つと、プログラミングが難しい

ただし、後でインスタンスが作られる場合は、ポインタで持つ。
外側・内側のインスタンスの、寿命が異なる場合
2017/09/09(土) 04:30:46.35ID:iRgkNuJM
アドレスの演算しないなら参照でいいじゃん。
2017/09/09(土) 08:33:28.36ID:DK1wXlQ9
生き死にのタイミングが別・ちょっとずれて欲しい
そういう場合はポインタしかやりよがない?かな?
2017/09/09(土) 09:57:17.57ID:IRAdfO5M
寿命のタイミングが違うときポインタで持たせるって、
ポインタをnullで初期化してsetterつけるってこと?
そんな糞クラス絶対使わないわ…
2017/09/09(土) 11:41:44.39ID:bRNSjth4
↑バカ
>ポインタをnullで初期化してsetterつけるってこと?
2017/09/09(土) 11:43:16.35ID:3oRTPGwk
寝起きで意味不明ですた
2017/09/09(土) 11:43:45.11ID:3oRTPGwk
誤爆
2017/09/09(土) 12:06:21.98ID:arXtWn5o
ボインター使わなくてもC++が組めるのに安堵した
2017/09/09(土) 12:15:47.61ID:OV/mK/gQ
C/C++の場合、初心者の方がポインタが好きで、多用する傾向があるよね
2017/09/09(土) 12:36:18.85ID:arXtWn5o
書店やネットで調べたらポインタの話題が必ず出るし、メモリリークになるから、ポインタ使わないと言語が使えません的な雰囲気があった
2017/09/09(土) 12:57:49.50ID:X7OoIJoK
そこでメモリポインタですよ
2017/09/09(土) 12:58:17.28ID:D8z5xRC+
低レベルな処理はポインタ必須
上しか書かないなら生で使わないことも可能
2017/09/09(土) 13:07:28.29ID:4g0rauvm
>>638
いつも考えるんですけれども低レイヤーでもポインタを使わないことは可能なんでしょうか?ポインタを使わないけれども低レイヤまで対応している言語はなんでしょうか
2017/09/09(土) 13:34:55.85ID:ayit12uD
いつも思うのだがポインタ恐怖症って何なのか?
2017/09/09(土) 13:55:13.28ID:xEPuJyU1
低レベルな処理でポインタが便利と言われるのはなぜか
言葉で語るのは大変なのでコードで語ろう
hoge *p = (hoge)nanika_no_memory_block;
p->piyo = 100;
これが出来る言語は、あまりない
2017/09/09(土) 14:50:04.88ID:4g0rauvm
>>641
うわさの rust ではどうでしょうか?
2017/09/09(土) 15:46:41.32ID:yY9TM3ez
低水準に寄り過ぎると「アドレスを表す整数」だったりして、
(ポインタ相当の操作は可能なものの、)
言語としてのサポートが全然なかったりするので、
ポインタってのは妥当な落としどころだよなー
2017/09/09(土) 18:56:49.96ID:SQs0JGyk
>>641
Ada もできたはず
2017/09/09(土) 19:48:57.56ID:xEPuJyU1
>>641はちょっとコードをミスってしまった
訂正するほどでもないと思うが一応直しておく

hoge *p = (hoge *)nanika_no_memory_block;
p->piyo = 100;

C形式のAPIとの互換性のためにアドレス値が扱える言語は多いが
>>643の言う通り、アドレスを表す整数、ってだけの場合も多い
他の高級言語はオブジェクトに色々な機能を持たせるために
複雑なメモリレイアウトをしているものなので
適当なメモリブロックのアドレスを適当にキャストして
まるで、ネイディブオブジェクトであるかのように扱う、ということが出来にくい
(C++ですら仮想関数テーブルを持っているとアウト)
なので、素のメモリブロックを扱う場合はC/C++のポインタが便利
C言語はナカナカにツボを押さえた設計になっている
2017/09/10(日) 03:56:34.58ID:gLmtVUjO
int main(void) {
int a, b, c;
char x[100] = { NULL };
while (1) {
〜処理〜
printf("終了します。何かボタンを押してください\n");
scanf("%s", x);
if (x != NULL)
break;
else if("\n")
break;
}
return 0;
}

ループを抜ける処理でこんな感じで書いてるんですが
これだと何らかの文字列+エンターキーを押さないと抜けれないんですよね・・・
printf("終了します。何かボタンを押してください\n");
のあとエンターキーを押すだけでもループ終了して終わる方法はないですか?
2017/09/10(日) 04:09:14.61ID:w2UiNhNS
getchar();
2017/09/10(日) 13:06:33.76ID:3KJHgwTr
fgetsで1行読んで、余分な入力ごと読み捨て。
2017/09/10(日) 13:24:31.62ID:tCo7CGq4
> char x[100] = { NULL };

> if (x != NULL)

Qの炎上学習法か何か?
2017/09/10(日) 13:50:18.25ID:rGvjr77j
Q は C++ メインでやってるよ
http://mevius.2ch.net/test/read.cgi/tech/1434079972/
2017/09/10(日) 14:16:47.62ID:tCo7CGq4
>Q は C++ メインでやってるよ
自分のことQっていうの、キモいぞ
652デフォルトの名無しさん
垢版 |
2017/09/14(木) 18:48:11.80ID:aF7eMqZx
c言語で書かれた稼働しているプログラムの中のある変数のアドレスを取得したいです
プログラムを一切変更しないでこれを実現させることはできるのでしょうか?
2017/09/14(木) 18:49:32.29ID:qDyTdV0Q
>>652
Windowsなら「プロセスメモリー」で検索。
2017/09/14(木) 18:51:23.24ID:QiPMm0Hr
最適化でレジスタに割りあたっちゃった変数はアドレスとれない
655デフォルトの名無しさん
垢版 |
2017/09/14(木) 18:59:38.50ID:aF7eMqZx
>>653
すみません
環境はlinux2.6です
2017/09/14(木) 19:24:54.84ID:N62cmPAo
アドレスを取る理由は?
ほんとはなにしたいの?
2017/09/14(木) 19:27:33.65ID:T7H5P+6p
そもそも自動変数なら>>654の話もあるし複数回呼ばれる関数なら呼ばれる度に異なるかもしれない
更に再帰とかマルチスレッドなら同時に複数存在してるかもしれない
658デフォルトの名無しさん
垢版 |
2017/09/14(木) 20:49:36.03ID:aF7eMqZx
ある関数ポインタに任意の関数を代入して実行させたいのですが
プログラム内の変数同士の相対的なアドレスを調べるというのも難しいのでしょうか?
2017/09/14(木) 20:52:51.63ID:qDyTdV0Q
>>658
ソースもデバッグ情報もなければ、逆コンパイラを使ってアドレスを調べるくらいしか思い付かない。
660デフォルトの名無しさん
垢版 |
2017/09/14(木) 21:10:46.05ID:aF7eMqZx
自己解決しました
お騒がせしてすみません
2017/09/14(木) 22:09:02.75ID:eKK5ja5H
関数内にあるクラス定義の型だけ違う関数ってどう作れば良いんですか?

void Command::add()
{
Command cm;->これをCommand2 cm;にしたい
以降処理を記載

}
初歩的な質問ですいません。
同じ関数を何個も作る必要があり手間です><
ロベールとかを見ても仮想関数とかアップキャストとか継承とかオーバーライドとかひと通り見ましたがわかりません。
2017/09/14(木) 22:17:41.81ID:vjSz//mI
関数テンプレート
マクロ
defineして#include
2017/09/14(木) 23:51:59.63ID:eKK5ja5H
問題解決しました。
ありがとうございます。
664デフォルトの名無しさん
垢版 |
2017/09/15(金) 02:25:25.95ID:z+aMp6by
>変数同士の相対的なアドレス
引き算してはならない。ただし、同一の配列の要素どうしなら、引き算は、意味ある
2017/09/15(金) 02:39:59.15ID:NePdqYQx
何かをハッキングしようとしてますね。
2017/09/15(金) 05:27:31.76ID:qOhstmGW
staticなメンバしかないクラスがあるんですけど
これもうnamespaceでいいですよね?
2017/09/15(金) 09:53:35.90ID:Rd6409Qg
いいよ
2017/09/15(金) 12:08:47.50ID:LbVH6Dx6
ADLとかとの兼ね合い
2017/09/15(金) 17:45:57.17ID:s+L1DjZB
>>667
>>668
なるほど参考になりました。
2017/09/16(土) 23:02:46.17ID:JcByp9p4
>>664
>>変数同士の相対的なアドレス
>引き算してはならない
んなこたーない
2017/09/16(土) 23:11:51.68ID:F2zb0zkw
C/C++的にはダメ
2017/09/17(日) 01:58:27.90ID:jnHDU3kL
まあ動いちゃうときも多いと思うけど、やっちゃ駄目だよー
2017/09/17(日) 02:12:21.90ID:2kxiy1Rb
ダメな例出して
2017/09/17(日) 05:58:54.94ID:lvKagVu8
>>673
int a;
int b;
auto c = &b - &a;
2017/09/17(日) 06:01:41.65ID:2kxiy1Rb
auto使いはやっぱり馬鹿だった。
2017/09/17(日) 06:19:33.65ID:lvKagVu8
バカとしか書けないのかよ w
2017/09/17(日) 12:32:24.59ID:/dX18QMc
>>671
だめなこんきょ出して
2017/09/17(日) 12:49:17.96ID:lvKagVu8
>>677
規格嫁
2017/09/17(日) 12:51:42.31ID:/dX18QMc
出せねーんだろププ
auto使いはやっぱり馬鹿
2017/09/17(日) 13:02:11.76ID:ZH0tEj4R
自分だけはバカじゃないという前提
2017/09/17(日) 13:31:56.70ID:/dX18QMc
お、自分のばかを自覚したんだね
はいよくできました
2017/09/17(日) 14:23:53.26ID:dpOLvFr5
性格超悪そう
2017/09/17(日) 18:01:33.39ID:dpEZdIyz
ここで問題です。
 struct A { int x1, x2; } a;
 auto d = &a.x1 - &a.x2;
これは規格違反でしょうか
2017/09/17(日) 19:10:18.83ID:iyMogwhx
#include <stddef.h>
offsetof(type, member-designator);
2017/09/17(日) 20:31:22.48ID:e7NF75Gx
変数内のレイアウトと 異なる変数のギャップと同じに取り扱っていいものなのかな
2017/09/17(日) 20:47:23.92ID:7AbJQaK5
現行規格の5.7/p6では未定義動作となっていて
他に許可する記述は見つけられなかった
2017/09/17(日) 22:50:49.91ID:lvKagVu8
規格も読めないアホにつける薬はないってことかな w
2017/09/18(月) 04:40:38.13ID:v1M3pcaa
こういうアホな話になるのはauto使いはscript kiddie脳だから。
処理系に対する理解が皆無。
2017/09/18(月) 05:41:38.61ID:eqWC6Q8G
具体的な指摘もできないアホ乙
2017/09/18(月) 22:38:10.49ID:NO4WPNQ6
>>675
ちなみに聞くけど
cが何型なのか知ってるよな?
2017/09/19(火) 01:28:21.18ID:31UnpjJ8
な? auto使いは馬鹿だろ。
2017/09/26(火) 01:34:34.23ID:piJXswiP
>>671 >>686
で終了なのに
なにか文句を付けなきゃ気がすまない人がいるみたい
2017/09/26(火) 07:25:15.69ID:mhsU1MGa
> ダメな例出して
って啖呵きったらさくっと出されて発狂中
2017/09/27(水) 06:34:18.36ID:OnyIuiaa
頭が悪すぎて相手にされないauto使いかわいそう。
2017/09/27(水) 09:28:21.53ID:asC30w7v
>>692
アドレスの話をしていたのにポインターの例にすり替えられた
と言われる恐れがあるので5/p4も加えておかないと
但し符号有り整数で減算した場合には未定義動作にならない
2017/09/27(水) 09:29:48.92ID:asC30w7v
○ 符号無し
× 符号有り
2017/09/27(水) 11:48:00.61ID:OnyIuiaa
どうやらauto使いというのはCにおける未定義の意味を勘違いしてるようだ。
まだほとんどコードを書いたことがない初心者なのだろう。
2017/09/27(水) 11:53:50.86ID:OnyIuiaa
> 他に許可する記述は見つけられなかった

面白い発想だな。Cを高級言語だと思ってんだろうな。これは笑える。
2017/09/27(水) 12:00:13.05ID:hAn/VwKR
>>671 >>686 で終了
納得できない人がいるみたいだけど

実質問題無いのはその通り
問題がある事例を私は知らない

ただ言語の規格上は未定義
2017/09/27(水) 12:36:06.37ID:OnyIuiaa
メモリがリニアでないバンク方式やセグメント方式の処理系を知らないとは無知だな。
far、near知らないとか最近勉強し始めたのだろう。

Cは低級言語。処理系依存を書く言語。
コンパイラが勝手に処理系に依存した定義をしろってこと。
2017/09/27(水) 14:25:01.86ID:hAn/VwKR
nearだろうがfarもセグメント方式だろうが
a-b+b=a+b-b=aになるけど
ほとんどの環境で

なんてことは知らないか
2017/09/27(水) 14:29:11.52ID:hAn/VwKR
> 処理系依存を書く言語。
わざわざ依存した書き方をしなくていい
依存しないでデメリットなくかけるなら依存しない方法をとるのが普通

ていうか、
言語的に保証されてないアドレスの減算の処理などコンパイラの説明書に普通書いてないが、
誰が責任を取るつもり?
2017/09/27(水) 16:20:12.02ID:yRzprl02
強力な最適化コンパイラはプログラマが未定義を踏んでいないことをあてにした最適化をすることがある。
「ほとんどの環境で大丈夫」なんていうのは現代では思い込みだよ。 全然大丈夫じゃない。
2017/09/27(水) 17:12:16.04ID:7dA/9JOQ
未定義の動作だからその文丸ごと消しちゃっても構わないよね
って最適化がかかってバグった話は、どこかで読んだな
2017/09/27(水) 18:35:30.13ID:Ep3hxvTm
>>703
offsetofとかいうマクロの中身を見てみようか
2017/09/27(水) 18:37:06.64ID:Ep3hxvTm
いずれにしろ、
言語上未定義なコードをわざわざ書くのはアホ
>>700とか
2017/09/27(水) 20:20:25.41ID:yRzprl02
>>705
何を言いたいんだ?
offsetof の中身が何を意味してるって?
2017/09/27(水) 20:32:56.04ID:r7aVrRwL
バカにマジレスみっともない
2017/09/27(水) 21:11:03.19ID:hAn/VwKR
>>707
中身見た?
2017/09/27(水) 21:14:39.99ID:7dA/9JOQ
offsetofはコンパイラメーカーが用意するものだから
意味合いが違ってくるのでは?
2017/09/27(水) 21:15:50.58ID:hAn/VwKR
なにも考えずに互換性を減らすコードを書くのはアホ

使う環境が限られているのに、互換性を理由に明確なメリットがあるコードを避けるのもアホ
2017/09/27(水) 21:17:57.15ID:m77m4D83
また未定義、未規定、処理系定義の違いもわかってない>>700が暴れてるのか
autoに粘着してるところを見ると新しいものについていけなくなった老害なんだろうな w
2017/09/27(水) 21:18:58.16ID:7dA/9JOQ
それとoffsetofに何の関係が?
offsetofはコンパイラメーカーが用意したんだろうから
少なくともそのコンパイラでは動くようになってる
だからといってどうこうという話は一切ない
2017/09/27(水) 21:22:31.36ID:hAn/VwKR
offsetofは>>703への反論
715デフォルトの名無しさん
垢版 |
2017/09/27(水) 21:26:08.14ID:7dA/9JOQ
>>714
>>703とoffsetofに何の関係が?
offsetofはコンパイラメーカーが用意したんだから
少なくともそのコンパイラで動くようになってる
これをもってして、どうこうという話はない
2017/09/27(水) 21:38:58.24ID:hAn/VwKR
offsetofがどうやって出来たかも知らんとは
じゃあ逆にうまく動かない具体例を知ってる?
たいてい内部はただの整数演算だぞ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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