X



【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
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/
0643はちみつ餃子 ◆8X2XSCHEME
垢版 |
2017/09/09(土) 15:46:41.32ID:yY9TM3ez
低水準に寄り過ぎると「アドレスを表す整数」だったりして、
(ポインタ相当の操作は可能なものの、)
言語としてのサポートが全然なかったりするので、
ポインタってのは妥当な落としどころだよなー
0645デフォルトの名無しさん
垢版 |
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言語はナカナカにツボを押さえた設計になっている
0646デフォルトの名無しさん
垢版 |
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");
のあとエンターキーを押すだけでもループ終了して終わる方法はないですか?
0652デフォルトの名無しさん
垢版 |
2017/09/14(木) 18:48:11.80ID:aF7eMqZx
c言語で書かれた稼働しているプログラムの中のある変数のアドレスを取得したいです
プログラムを一切変更しないでこれを実現させることはできるのでしょうか?
0655デフォルトの名無しさん
垢版 |
2017/09/14(木) 18:59:38.50ID:aF7eMqZx
>>653
すみません
環境はlinux2.6です
0657デフォルトの名無しさん
垢版 |
2017/09/14(木) 19:27:33.65ID:T7H5P+6p
そもそも自動変数なら>>654の話もあるし複数回呼ばれる関数なら呼ばれる度に異なるかもしれない
更に再帰とかマルチスレッドなら同時に複数存在してるかもしれない
0658デフォルトの名無しさん
垢版 |
2017/09/14(木) 20:49:36.03ID:aF7eMqZx
ある関数ポインタに任意の関数を代入して実行させたいのですが
プログラム内の変数同士の相対的なアドレスを調べるというのも難しいのでしょうか?
0659片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/09/14(木) 20:52:51.63ID:qDyTdV0Q
>>658
ソースもデバッグ情報もなければ、逆コンパイラを使ってアドレスを調べるくらいしか思い付かない。
0660デフォルトの名無しさん
垢版 |
2017/09/14(木) 21:10:46.05ID:aF7eMqZx
自己解決しました
お騒がせしてすみません
0661デフォルトの名無しさん
垢版 |
2017/09/14(木) 22:09:02.75ID:eKK5ja5H
関数内にあるクラス定義の型だけ違う関数ってどう作れば良いんですか?

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

}
初歩的な質問ですいません。
同じ関数を何個も作る必要があり手間です><
ロベールとかを見ても仮想関数とかアップキャストとか継承とかオーバーライドとかひと通り見ましたがわかりません。
0664デフォルトの名無しさん
垢版 |
2017/09/15(金) 02:25:25.95ID:z+aMp6by
>変数同士の相対的なアドレス
引き算してはならない。ただし、同一の配列の要素どうしなら、引き算は、意味ある
0666デフォルトの名無しさん
垢版 |
2017/09/15(金) 05:27:31.76ID:qOhstmGW
staticなメンバしかないクラスがあるんですけど
これもうnamespaceでいいですよね?
0683デフォルトの名無しさん
垢版 |
2017/09/17(日) 18:01:33.39ID:dpEZdIyz
ここで問題です。
 struct A { int x1, x2; } a;
 auto d = &a.x1 - &a.x2;
これは規格違反でしょうか
0685デフォルトの名無しさん
垢版 |
2017/09/17(日) 20:31:22.48ID:e7NF75Gx
変数内のレイアウトと 異なる変数のギャップと同じに取り扱っていいものなのかな
0686デフォルトの名無しさん
垢版 |
2017/09/17(日) 20:47:23.92ID:7AbJQaK5
現行規格の5.7/p6では未定義動作となっていて
他に許可する記述は見つけられなかった
0688デフォルトの名無しさん
垢版 |
2017/09/18(月) 04:40:38.13ID:v1M3pcaa
こういうアホな話になるのはauto使いはscript kiddie脳だから。
処理系に対する理解が皆無。
0695デフォルトの名無しさん
垢版 |
2017/09/27(水) 09:28:21.53ID:asC30w7v
>>692
アドレスの話をしていたのにポインターの例にすり替えられた
と言われる恐れがあるので5/p4も加えておかないと
但し符号有り整数で減算した場合には未定義動作にならない
0697デフォルトの名無しさん
垢版 |
2017/09/27(水) 11:48:00.61ID:OnyIuiaa
どうやらauto使いというのはCにおける未定義の意味を勘違いしてるようだ。
まだほとんどコードを書いたことがない初心者なのだろう。
0698デフォルトの名無しさん
垢版 |
2017/09/27(水) 11:53:50.86ID:OnyIuiaa
> 他に許可する記述は見つけられなかった

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

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

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

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

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

ていうか、
言語的に保証されてないアドレスの減算の処理などコンパイラの説明書に普通書いてないが、
誰が責任を取るつもり?
0703はちみつ餃子 ◆8X2XSCHEME
垢版 |
2017/09/27(水) 16:20:12.02ID:yRzprl02
強力な最適化コンパイラはプログラマが未定義を踏んでいないことをあてにした最適化をすることがある。
「ほとんどの環境で大丈夫」なんていうのは現代では思い込みだよ。 全然大丈夫じゃない。
0704デフォルトの名無しさん
垢版 |
2017/09/27(水) 17:12:16.04ID:7dA/9JOQ
未定義の動作だからその文丸ごと消しちゃっても構わないよね
って最適化がかかってバグった話は、どこかで読んだな
0710デフォルトの名無しさん
垢版 |
2017/09/27(水) 21:14:39.99ID:7dA/9JOQ
offsetofはコンパイラメーカーが用意するものだから
意味合いが違ってくるのでは?
0711デフォルトの名無しさん
垢版 |
2017/09/27(水) 21:15:50.58ID:hAn/VwKR
なにも考えずに互換性を減らすコードを書くのはアホ

使う環境が限られているのに、互換性を理由に明確なメリットがあるコードを避けるのもアホ
0712デフォルトの名無しさん
垢版 |
2017/09/27(水) 21:17:57.15ID:m77m4D83
また未定義、未規定、処理系定義の違いもわかってない>>700が暴れてるのか
autoに粘着してるところを見ると新しいものについていけなくなった老害なんだろうな w
0713デフォルトの名無しさん
垢版 |
2017/09/27(水) 21:18:58.16ID:7dA/9JOQ
それとoffsetofに何の関係が?
offsetofはコンパイラメーカーが用意したんだろうから
少なくともそのコンパイラでは動くようになってる
だからといってどうこうという話は一切ない
0715デフォルトの名無しさん
垢版 |
2017/09/27(水) 21:26:08.14ID:7dA/9JOQ
>>714
>>703とoffsetofに何の関係が?
offsetofはコンパイラメーカーが用意したんだから
少なくともそのコンパイラで動くようになってる
これをもってして、どうこうという話はない
0716デフォルトの名無しさん
垢版 |
2017/09/27(水) 21:38:58.24ID:hAn/VwKR
offsetofがどうやって出来たかも知らんとは
じゃあ逆にうまく動かない具体例を知ってる?
たいてい内部はただの整数演算だぞ
0717はちみつ餃子 ◆8X2XSCHEME
垢版 |
2017/09/27(水) 21:51:01.70ID:yRzprl02
>>716
いいえ。 たとえば GCC は __builtin_offsetof を持っていて、 offsetof マクロはこれに展開されます。
0718デフォルトの名無しさん
垢版 |
2017/09/27(水) 22:05:03.95ID:7dA/9JOQ
だからoffsetofはコンパイラメーカーが用意したもので
自分たちが自分たちの製品用に用意したんだから動くのは当たり前だろ?
offsetofは動くが(そりゃコンパイラメーカーが用意したんだから当たり前)
だから何なんだ?

nullptrが好きみたいだから
https://cpplover.blogspot.jp/2015/12/blog-post_21.html
↑を読んでみると良い
それもじっくり読んだほうが良い
こういった不慮の事故があるから未定義動作は避けるべきというのは当たり前では?
↑のプログラムが未定義動作で最適化でコンパイラで削除されるのに
offsetofは最適化されずに残るってのは非常に興味深い微妙な部分なんだよ
やってることはヌルポインターの参照で同じことなんだがな
こんなのさじ加減なんで、何が起こるか分からない
0724デフォルトの名無しさん
垢版 |
2017/09/28(木) 07:37:45.60ID:kmv+HSxh
元は>>652だな
それに続く>>658の1部だけを抜き出して>>664の書き込み
目的がこの時点でそれて、これ以降アドレスの減算の話になる

ダメな例ってのはアドレスの減算を行って実際にうまく動かない例
オフセット分を戻すことで有効アドレスで使うことになるので、>>701で実際に元に戻らない環境を多く示せばいい

言語規格上保証されてないことは>>670>>677以外は知っている
0726デフォルトの名無しさん
垢版 |
2017/09/28(木) 11:32:16.87ID:Q/eIhlb2
offsetofは未定義とされるコードが処理系のライブラリ内で使用されていた例。
「具体例」は単に実際に問題となる例を出せと言っているだけ。
両者は無関係だが>>705>>715を理解する知能が無かったのが残念。
0727デフォルトの名無しさん
垢版 |
2017/09/28(木) 11:35:32.70ID:mxHsq9Is
offsetofと同様の自作マクロがたくさん使われてる
ということを知らないとは

ていうか、順番が逆だ

色々な所で使われてるから標準化された
0729デフォルトの名無しさん
垢版 |
2017/09/28(木) 11:46:41.60ID:cnz4JX/W
きっと>728の使ってるコンパイラでのoffsetofの定義には我々の想像も付かない何かが書いてあるんだよ。
他の人の使ってるコンパイラでも同じことが書いてあるはずだと思ってる理由はわかんないんだけど。
>728はその「offsetofの中身」を明示して話すといいんじゃないかな。知らんけど。
0730デフォルトの名無しさん
垢版 |
2017/09/28(木) 12:01:16.61ID:Q/eIhlb2
>>727
>色々な所で使われてるから標準化された
お前のパソコンに保存されてる自作マクロには興味ないけど、
offsetofは機能性を規格化しただけで実装は規格化されてないぞ
0731デフォルトの名無しさん
垢版 |
2017/09/28(木) 12:44:17.37ID:mxHsq9Is
0番地を構造体のアドレスにキャストして、メンバのアドレスに変換して、それをそのまま整数にキャストする

ってマクロ、昔は一般的に使われてたんだけど
知らないか

>>701の根拠のひとつ

いずれにしろ、
反例がひとつも出て来ないようじゃそんな根拠もいらないね
0733デフォルトの名無しさん
垢版 |
2017/09/28(木) 14:59:31.87ID:RoqMj8TI
ぬるぽ使った自作offsetofがすべての処理系で正常動作するとは限らない
って話じゃないのけ?
0735デフォルトの名無しさん
垢版 |
2017/09/28(木) 18:14:43.67ID:Ktm1uHRp
>>726
offsetofはコンパイラベンダーが用意したのだから動くのは当たり前では
俺らからしたら、未定義動作、処理系依存、実装依存、であっても
コンパイラベンダーからしたら、仕様なのでは?
特にコンパイラベンダーは究極的にはコンパイラの仕様を変更することも
出来る立場なので
0736デフォルトの名無しさん
垢版 |
2017/09/28(木) 18:44:25.04ID:kmv+HSxh
>>733
ほとんどの環境でうまくいく
だから良く使われている

そうじゃないっていうなら
うまくいかない例を出して

っていう話
0740はちみつ餃子 ◆8X2XSCHEME
垢版 |
2017/09/28(木) 18:52:29.72ID:pSALrJPI
なんでそんなに仕様に違反したいんだ?
仕様に違反すべきではないってことにそんなに根拠が必要か?
■ このスレッドは過去ログ倉庫に格納されています

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