【初心者歓迎】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/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の関数」というなら具体的な関数を明示すればもっと状況がわかるのに。
2017/10/01(日) 00:34:39.70ID:QEgiuasJ
>>776
wxWidgets固有のことは知らないけど
タブごとにツリーを用意して各タブに対応する子ウィンドウに配置するだけでしょ
もしくはツリーを一つだけ用意してタブ切り替えのたびに中身を書き換えればいいんじゃない
2017/10/01(日) 02:46:34.57ID:CsBQRyQX
>str.c_str() 渡した場合は str の寿命や変更で解放されることになる。

いやだから、payload==str は送信結果を受けてから
開放してるって本人は言ってるのでは?
2017/10/01(日) 08:09:58.98ID:a+6SxdIf
明示的に解放しないstringの方はそこを意識してなかった可能性もあるんじゃね?
非同期ってことは>>765でsendした関数からは一旦抜けてるでしょ?
2017/10/01(日) 09:03:15.51ID:XhBoqkon
>>776
1つの方法としては
タブが切り替えられる毎にイベント発生するから
タブAが押されたらダイアログAを表示してそれまでに表示されてたダイアログは非表示にする
ダイアログ毎にツリーとリッチエディットを用意したらいい

あとWin32APIスレの方がいいよ
2017/10/01(日) 09:35:07.78ID:JA+cHEn5
>string str = "{id:abc, ... , }"
>void* payload = (void*) str.c_str();

>>780はpayloadを明示的に解放すんのかよ
2017/10/01(日) 09:52:09.27ID:a+6SxdIf
してない可能性を挙げたのに「すんのかよ」って俺に言われてもなw
2017/10/01(日) 10:26:50.12ID:7TdPvZgo
>>780
>>771
>> 非同期送信にはなってるんだけど、sendの後に送信結果を受け取る関数を呼んでる。
>> そのあとでpayloadは解放されるようになってるから、送信完了までは実体は生きてると思う
ってあるからその可能性は低いと思う
2017/10/01(日) 10:32:30.15ID:qINK5MH4
vc2012だとC++11への準拠はどうなんだろ
c++11以降はc_strも実体を指す保証があるようだけど、
以前は関数内のstatic変数みたいな実装してた気がする・・
2017/10/01(日) 11:40:53.20ID:Q5nZisR/
>>784
初心者歓迎スレだし可能性は少なくない
GC言語で育ったならポインタをスマポのような何かと勘違いしてるかもしれない
さらにその文章から思い込みだけで検証していないのは明らかだし
2017/10/01(日) 11:49:29.48ID:o4fxg+Ov
可能性を言い出したらなんでもあり
不毛なレスは止めようよ
2017/10/03(火) 17:35:19.79ID:ZgS0QfuG
>>785
>関数内のstatic変数みたいな実装してた気が
んなわきゃない
2017/10/03(火) 18:51:26.51ID:kBDRpd1G
>>788
どういう実装だった?
2017/10/03(火) 19:50:33.30ID:VzAuCmWc
shared_ptrを戻すメンバ関数があるんですが
引数の条件に一致する物が無い場合、空というのが分かるshared_ptrを返したいんです。
どう書けばいいですか?
2017/10/03(火) 19:52:37.35ID:TFSQFt7Y
ヌルポインター返してgetメソッドで確認。
2017/10/03(火) 19:59:11.57ID:VzAuCmWc
ありがとうございました!
2017/10/03(火) 22:45:38.84ID:7OuP8h6T
std::optional を使った方がよくない?
2017/10/04(水) 15:03:07.29ID:B6Js2yoS
>>788
いちいち古いVC入れ直すのめんどいから覚えてるんなら書いてほしいんだが

あと>>765が解決したのかどうかも知りたい
2017/10/04(水) 21:20:20.65ID:eGyO5ooe
初心者的質問で申し訳ないですが、libファイルの検索仕方を教えて下さい。
includeファイルはgrepかければ見つかりますが、リンクするとき、静的ライブラリ、libファイルの検索はどうすればいいか分かりません。
とりあえず、怪しい奴を片っ端からリンクしますが、それもどうかと思います。
マニュアルに書いてある訳でもないので皆さまどうされてるのか気になります。
2017/10/04(水) 21:27:51.47ID:HMkkIXOi
>>795
bgrep使え。リンク方法が書かれているマニュアルを買え。
797775
垢版 |
2017/10/05(木) 07:26:13.70ID:/WMFst6h
ありがとうございます。
ネットで調べるのがメインなので、つい、本はケチってしまいました
bgrepは入れられないので-aでなんとかしてみます
2017/10/05(木) 21:03:39.22ID:MEVeuXK3
>>794
string s1, s2;のc_str()が共用なわけあるかドアホ
VC++6の時からインスタンスのメモリ返すわ
2017/10/05(木) 21:31:37.51ID:Px1fI0/v
いちいちけなさんと会話も出来んのかゴミクズが
へー、じゃあ寿命は保証されてるわけか、そんなことはなかったはずだが
>>765の問題は寿命の問題だと思うが、ケチつけるなら正確に書いてくれる?
混乱を招くだけのイチャモンとか何の役にも立たんわ
2017/10/05(木) 23:47:16.81ID:7Cw6eX8p
c_strは実態をさすけど変更するなって書いてなかったっけ?
2017/10/06(金) 00:14:51.51ID:M5Ph95zK
03以前は変更された後にc_str()を使うのも、そもそも内部で連続してる保証も無かったはず
今調べたけどdata(), c_str()の呼び出しでも変更される可能性があるらしい(11は大丈夫
2017/10/07(土) 00:46:39.10ID:AU7JWIym
ポインターを覚えたけど、使いどころが思い付かない
誰か教えて……
2017/10/07(土) 02:11:18.12ID:El+Xr4aF
>>802
一個のサイズが10KBほどある構造体のソートにでも使えよ
804デフォルトの名無しさん
垢版 |
2017/10/07(土) 15:35:22.92ID:cqowZFEs
それポインタじゃなくて整数でよくない
2017/10/07(土) 16:29:02.76ID:jvf7kHO4
ポインタと整数じゃ概念が違う
整数をアドレスを指し示す用途で使いますよってのがポインタだし
2017/10/07(土) 17:29:30.12ID:jg4p8iD7
変数とポインターでメモリをずっと使うか取り除くかの違い?
2017/10/07(土) 17:49:35.28ID:vj+NLXIf
>>802
mallocの戻り値とかsprintfの引数とかで使えばええねん
2017/10/07(土) 19:03:08.66ID:AU7JWIym
みなさんありがとうございます
規模の大きいデータで使うみたいですね
後は他の関数を飛び越えてアクセスしたい時とか
2017/10/08(日) 11:15:35.68ID:2tobGFFt
>>805
配列のソートだったらアドレスよりインデックスの方が概念的に適切だろ?
2017/10/10(火) 15:59:13.06ID:3nxFazlM
p==p_rgh + rho*gh;
とあるのですが意味がわかりません。
p=p_rgh+rho*gh;であるべきと思うのですが、==と=が使い分けされているので
タイプミスではなさそうです。どなたかよろしくお願いします。
2017/10/10(火) 16:10:57.64ID:RmsAElXw
>>810
「p==p_rgh」は、pとp_rghが等しいとき1 (true)になり、等しくないときゼロ (false)になる。
2017/10/10(火) 16:14:41.98ID:RmsAElXw
>>810
演算子「==」より演算子「+」の方が結合が強いんだった。
「p==p_rgh + rho*gh」は、pとp_rgh + rho*ghが等しいときtrueになる。
2017/10/10(火) 19:02:14.11ID:z98emhq8
>>810
問題のその式が、if文のカッコの中ではなく、普通に式文としてセミコロンで終わる1行として書かれているなら、ただの誤記の可能性が高いと思うよ。
2017/10/10(火) 19:04:42.99ID:3nxFazlM
>>812
ご回答ありがとうございます。が、やはりわかりません。
たとえば、
if (p==p_rgh + rho*gh)
{

}
や、q=p==p_rgh + rho*gh;とかならわかるのですが、


p==p_rgh + rho*gh;

と独立しているのでどんな処理をしているのか・・・
2017/10/10(火) 19:11:07.30ID:+PpsJNG1
>>814
その本をさらせ、話はそれからだ
2017/10/10(火) 19:12:17.54ID:RmsAElXw
>>814
そのように独立していれば何もしない。何もしない文をわざわざ複雑に書くことは意味がないので、代入を間違って書かれたと考えられる。
2017/10/10(火) 20:29:28.41ID:ISsQMV5w
operator== をオーバーロードしてたらなんかすることもあるのでは。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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