【初心者歓迎】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/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がどうやって出来たかも知らんとは
じゃあ逆にうまく動かない具体例を知ってる?
たいてい内部はただの整数演算だぞ
2017/09/27(水) 21:51:01.70ID:yRzprl02
>>716
いいえ。 たとえば GCC は __builtin_offsetof を持っていて、 offsetof マクロはこれに展開されます。
2017/09/27(水) 22:05:03.95ID:7dA/9JOQ
だからoffsetofはコンパイラメーカーが用意したもので
自分たちが自分たちの製品用に用意したんだから動くのは当たり前だろ?
offsetofは動くが(そりゃコンパイラメーカーが用意したんだから当たり前)
だから何なんだ?

nullptrが好きみたいだから
https://cpplover.blogspot.jp/2015/12/blog-post_21.html
↑を読んでみると良い
それもじっくり読んだほうが良い
こういった不慮の事故があるから未定義動作は避けるべきというのは当たり前では?
↑のプログラムが未定義動作で最適化でコンパイラで削除されるのに
offsetofは最適化されずに残るってのは非常に興味深い微妙な部分なんだよ
やってることはヌルポインターの参照で同じことなんだがな
こんなのさじ加減なんで、何が起こるか分からない
2017/09/27(水) 22:44:20.00ID:Ep3hxvTm
>>717
具体例は?
2017/09/27(水) 23:48:58.08ID:/q7ePKPV
具体例が無いと>>702-704,718の懸念は認められない。
などと思っているならこいつはとんだアホウだ
2017/09/28(木) 06:23:37.76ID:kmv+HSxh
具体例が出ないことは>>701の証拠となる
2017/09/28(木) 06:28:56.63ID:kmv+HSxh
つまり>>700の否定だ
2017/09/28(木) 06:46:37.21ID:0QfR7+Yk
そもそも>>717は具体的な例だし>>719の考える具体例ってなに?
2017/09/28(木) 07:37:45.60ID:kmv+HSxh
元は>>652だな
それに続く>>658の1部だけを抜き出して>>664の書き込み
目的がこの時点でそれて、これ以降アドレスの減算の話になる

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

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

ていうか、順番が逆だ

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

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

>>701の根拠のひとつ

いずれにしろ、
反例がひとつも出て来ないようじゃそんな根拠もいらないね
2017/09/28(木) 12:45:47.97ID:mxHsq9Is
>>700はトンチンカンで、
>>703も説得力ゼロ

ってことで
2017/09/28(木) 14:59:31.87ID:RoqMj8TI
ぬるぽ使った自作offsetofがすべての処理系で正常動作するとは限らない
って話じゃないのけ?
2017/09/28(木) 16:36:34.69ID:P9MlpSyZ
ぬるぬるぽっぽっぽ
2017/09/28(木) 18:14:43.67ID:Ktm1uHRp
>>726
offsetofはコンパイラベンダーが用意したのだから動くのは当たり前では
俺らからしたら、未定義動作、処理系依存、実装依存、であっても
コンパイラベンダーからしたら、仕様なのでは?
特にコンパイラベンダーは究極的にはコンパイラの仕様を変更することも
出来る立場なので
2017/09/28(木) 18:44:25.04ID:kmv+HSxh
>>733
ほとんどの環境でうまくいく
だから良く使われている

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

っていう話
2017/09/28(木) 18:45:14.20ID:kmv+HSxh
>>735
壊れたレコードプレーヤーか?
2017/09/28(木) 18:47:54.52ID:Ktm1uHRp
壊れたレコードでも何でもいいけど
説明求む
2017/09/28(木) 18:52:01.14ID:kmv+HSxh
日本語が通じない人に説明は不可能
おれは>>726じゃないし
2017/09/28(木) 18:52:29.72ID:pSALrJPI
なんでそんなに仕様に違反したいんだ?
仕様に違反すべきではないってことにそんなに根拠が必要か?
2017/09/28(木) 18:52:32.31ID:kmv+HSxh
とりあえず落ち着いてスレを読み返しな
2017/09/28(木) 18:54:33.80ID:kmv+HSxh
>>740
違反したいなんて思ってるのは>>700くらい

メリットがあれば違反することもある
簡単な代替手段があれば違反しない
2017/09/28(木) 18:57:08.19ID:kmv+HSxh
そもそも、どの環境でも正しく動く保証がある意味のあるコードなんてないから
どのコードもある程度環境を前提としてる
2017/09/28(木) 19:09:22.17ID:Ktm1uHRp
そんな唐突な、そもそも論は、要らないだろ
程度問題だろ
C/C++の仕様的にはNGでも、コンパイラの仕様書にOKって書いてあればOKなんじゃね?
例えば int は 32bit 整数ですって書いてあれば、そういう製品仕様として納得するし
ただ、offsetofをもってしてOKと言えるのかどうか
2017/09/28(木) 19:14:42.61ID:kmv+HSxh
だからダメな例を出せって
>>699に対して反論したいなら
2017/09/28(木) 19:16:02.07ID:kmv+HSxh
コンパイラの仕様書に書いてないよ普通
ポインタのビット数が書いてあるだけで
2017/09/28(木) 19:19:48.44ID:Ktm1uHRp
>だからダメな例を出せって
そしたら逆にコンパイラの仕様書でOKって書いてある例を出せ
って話になるでしょ
無ければグレーゾーンになるわけだ
まさに未定義
2017/09/28(木) 19:30:52.46ID:kmv+HSxh
日本語が通じない人が多いなあ

とおもったら同じ人か
2017/09/28(木) 19:38:01.58ID:DuCN1h4Q
>>745
だから>>717で反例でてるだろ
C++で&演算子を定義されたら簡単に破綻する
https://stackoverflow.com/questions/400116/what-is-the-purpose-and-return-type-of-the-builtin-offsetof-operator/406941#406941
2017/09/28(木) 19:41:37.10ID:kmv+HSxh
またトンチンカンな例を
話の流れくらい理解してから書け
2017/09/28(木) 19:50:55.33ID:Ktm1uHRp
そりゃ誰もお前の中だけの勝手な話の流れなど知ったことではないだろ
2017/09/28(木) 20:20:35.35ID:N5fP/7zq
>>750
トンチンカンとしか言えないなら黙ってろよw
2017/09/28(木) 21:45:26.80ID:kaEtfd73
単純な話、ベンダー提供のマクロで言語仕様上保証されないような使い方がされていたとして、
そのマクロ自体の動作はベンダーが保証しても同じコードがそのマクロ外で保証されるわけじゃないよね。
実際には動くかもしらんけど。
2017/09/28(木) 22:24:40.88ID:1QGPZBPb
最近また片山老人が暴れてんの?
2017/09/28(木) 23:35:41.44ID:Msp1dHAD
昔は学生運動が一大イベントだった。鉄砲の音が聞こえたら、学生たちが一斉に走り回る。それは軍隊のように団結力のある集団だった。
2017/09/29(金) 00:24:14.89ID:BT8GgIQb
って昔話でもさせるのか?
2017/09/29(金) 00:55:18.83ID:qoI7k83w
>>753
「こんな最適化するのか!」って思うようなピンポイントな最適化は有るから、
逆にピンポイントな例外だってありそうよね。
2017/09/29(金) 06:49:45.56ID:hLpF+zSQ
>>753
マクロとそれを展開したソースで動きが異なるってこと?
さすがにそれは考えにくいと思うけど
2017/09/29(金) 10:16:34.25ID:xgACZlxS
>>736
すべての環境で動作する保証が無い=環境依存
2017/09/29(金) 11:32:53.08ID:7lA4sLJU
お前らが何を話しているのかわからん
相手に何を伝えたいのか
お前らは何を訴えたいのか
何も見えてこない
俺がないならもうやめろ
2017/09/29(金) 12:45:07.45ID:tIQyCYwJ
俺の主張は>699
2017/09/29(金) 12:46:04.43ID:tIQyCYwJ
主張内容に興味無いけど
2017/09/29(金) 21:46:50.94ID:1R/L2hD7
>>761
またおバカループかよ w
2017/09/29(金) 22:31:02.23ID:+VZzhu5A
>>761>>671の『C/C++的』の意味が共有できているといつから思っていた
2017/09/30(土) 01:55:47.47ID:+yH9ha/d
ちょっと不可解な部分があったから質問させてくれ

string型のデータをサーバに送信したくてOSSの関数に渡しているんだが、
データが一部壊れてしまう
問題のコードは、

string str = "{id:abc, ... , }"
void* payload = (void*) str.c_str();
send(payload, str.length());

これをやると、先頭の5バイトがうまく入らない
いくら考えても全然理由がわからず、意味のないことだと思いつつも以下のコードを書いてみたら何故かうまくいった

string str = "{id:abc, ... , }"
char* tmp = (char*)malloc(str.length() * sizeof(char) + 1);
strcpy(tmp, str.c_str());
payload = (void*)tmp;
send(payload, str.length());

下のコードを使えばうまく動いてるから問題ないんだけど、上のコードがダメな理由がわからずすごく気持ち悪い。
何か上の例だとまずい部分があるのかな?

送信関数は以下
send(void* payload, size_t length);

環境はVC++ 2012
Windows 7 64bit

ちなみに、同じコードを別環境(gcc 4.4.7 Cent OS 32bit)で動かすと、両方うまくいった
2017/09/30(土) 02:12:16.55ID:/jgYbdHq
>>765
c_str()ってどんな関数?
2017/09/30(土) 02:45:21.56ID:mQbjCOfm
非同期やbufferedの関数を正しく使えてないんだろ
たしか以前にboost.asioかなんかの同じような質問をきいたことがあったような
2017/09/30(土) 06:20:03.02ID:BNa/frNM
ASIOといえば
Audio Stream input output
2017/09/30(土) 07:12:02.93ID:7qICbiUO
そのインターフェースで非同期なのに 内部で実体のコピーをとってない場合とかだと
実際に送信完了するまで 渡した引数の実体が生きてる必要があるね
2017/09/30(土) 09:19:09.47ID:fdjE74yE
void *型を使う意図について
771765
垢版 |
2017/09/30(土) 10:38:13.12ID:+yH9ha/d
みんな回答ありがとう。

>>766
string型のメソッドで、文字列をconst char*にするやつ

>>767,769
非同期送信にはなってるんだけど、sendの後に送信結果を受け取る関数を呼んでる。
そのあとでpayloadは解放されるようになってるから、送信完了までは実体は生きてると思う

>>770
OSSの関数がそう定義されてるから変換したんだ


{id:abc. ... , }
のうち先頭5文字の{id:aがおかしくなってるんだよね・・
Wiresharkでみると、バイトコード88ってなってたけどなんでそうなったのかが全然わかんない
2017/09/30(土) 10:53:58.34ID:V/gsXwon
>sendの後に送信結果を受け取る関数を呼んでる。
>そのあとでpayloadは解放されるようになってる

ならそのsendのバグか他でのメモリ破壊だろ
そのコード自体には問題はない
2017/09/30(土) 11:13:57.36ID:8c7P82E8
>>771
まず
> send(payload, str.length());
を実行する時にpayloadの指す先が正しいか切り分けしなよ
2017/09/30(土) 11:28:17.88ID:tI4TVI1o
問題点の切り分けは大事だな
元のソースを問題が再現する最小限のところまで切り詰めてみるとか
その過程で問題が起きなくなったら関係ないと思って切り詰めたところが原因だろうし
2017/09/30(土) 13:47:25.00ID:jk0Saihc
どうおかしくなってるのか分からない
"{id:abc, ・・・"が"XXXXXbc, ・・・"となる(ascii 88 = 'X')ってことなのか
2017/09/30(土) 23:34:44.40ID:WG2DMprw
すいません
メモ帳ソフトのTextTreeみたいに
タブを並べられて、そのタブごとに個別のツリーを格納するには
どうしたらいいんでしょうか?
ttp://www.vector.co.jp/magazine/softnews/080129/images/n08012931b.gif

なんでここで聞くかというと
TextTreeの開発者のコメントに
「wxWidgets」をいじっていたので、これを使って作ってみようと思った、というのがあって
そのwxWidgetsのHPに
wxWidgets is a C++ library〜
と表記されていたからです。

普通のメモやテキストエディタは
ツリー>タブ>メモという構成ですが
Texttreeのような
タブ>ツリー>メモという構成が希望ということです。

またTextTreeは、リッチテキストが扱えるものの
文字が65535バイト以上入力できず、それ以上は入力しても消えてしまうバグを抱えていて
どうしてそのような不具合になるのかも知りたいのですが…
2017/09/30(土) 23:53:50.61ID:xUuIbR05
>>771
> そのあとでpayloadは解放されるようになってるから、送信完了までは実体は生きてると思う

str.c_str() 渡した場合は str の寿命や変更で解放されることになる。
他のどこかで解放されるようになってるとしたら、そんなところに渡してはいけないと思う。

どこかで free されることになってるなら、 malloc したポインタを渡さないと
正しく動かないということで >>765 の結果で当然に思う。

「OSSの関数」というなら具体的な関数を明示すればもっと状況がわかるのに。
■ このスレッドは過去ログ倉庫に格納されています