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/
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
なんでそんなに仕様に違反したいんだ?
仕様に違反すべきではないってことにそんなに根拠が必要か?
0742デフォルトの名無しさん
垢版 |
2017/09/28(木) 18:54:33.80ID:kmv+HSxh
>>740
違反したいなんて思ってるのは>>700くらい

メリットがあれば違反することもある
簡単な代替手段があれば違反しない
0743デフォルトの名無しさん
垢版 |
2017/09/28(木) 18:57:08.19ID:kmv+HSxh
そもそも、どの環境でも正しく動く保証がある意味のあるコードなんてないから
どのコードもある程度環境を前提としてる
0744デフォルトの名無しさん
垢版 |
2017/09/28(木) 19:09:22.17ID:Ktm1uHRp
そんな唐突な、そもそも論は、要らないだろ
程度問題だろ
C/C++の仕様的にはNGでも、コンパイラの仕様書にOKって書いてあればOKなんじゃね?
例えば int は 32bit 整数ですって書いてあれば、そういう製品仕様として納得するし
ただ、offsetofをもってしてOKと言えるのかどうか
0746デフォルトの名無しさん
垢版 |
2017/09/28(木) 19:16:02.07ID:kmv+HSxh
コンパイラの仕様書に書いてないよ普通
ポインタのビット数が書いてあるだけで
0747デフォルトの名無しさん
垢版 |
2017/09/28(木) 19:19:48.44ID:Ktm1uHRp
>だからダメな例を出せって
そしたら逆にコンパイラの仕様書でOKって書いてある例を出せ
って話になるでしょ
無ければグレーゾーンになるわけだ
まさに未定義
0753デフォルトの名無しさん
垢版 |
2017/09/28(木) 21:45:26.80ID:kaEtfd73
単純な話、ベンダー提供のマクロで言語仕様上保証されないような使い方がされていたとして、
そのマクロ自体の動作はベンダーが保証しても同じコードがそのマクロ外で保証されるわけじゃないよね。
実際には動くかもしらんけど。
0755片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/09/28(木) 23:35:41.44ID:Msp1dHAD
昔は学生運動が一大イベントだった。鉄砲の音が聞こえたら、学生たちが一斉に走り回る。それは軍隊のように団結力のある集団だった。
0757はちみつ餃子 ◆8X2XSCHEME
垢版 |
2017/09/29(金) 00:55:18.83ID:qoI7k83w
>>753
「こんな最適化するのか!」って思うようなピンポイントな最適化は有るから、
逆にピンポイントな例外だってありそうよね。
0758デフォルトの名無しさん
垢版 |
2017/09/29(金) 06:49:45.56ID:hLpF+zSQ
>>753
マクロとそれを展開したソースで動きが異なるってこと?
さすがにそれは考えにくいと思うけど
0760デフォルトの名無しさん
垢版 |
2017/09/29(金) 11:32:53.08ID:7lA4sLJU
お前らが何を話しているのかわからん
相手に何を伝えたいのか
お前らは何を訴えたいのか
何も見えてこない
俺がないならもうやめろ
0765デフォルトの名無しさん
垢版 |
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)で動かすと、両方うまくいった
0767デフォルトの名無しさん
垢版 |
2017/09/30(土) 02:45:21.56ID:mQbjCOfm
非同期やbufferedの関数を正しく使えてないんだろ
たしか以前にboost.asioかなんかの同じような質問をきいたことがあったような
0769デフォルトの名無しさん
垢版 |
2017/09/30(土) 07:12:02.93ID:7qICbiUO
そのインターフェースで非同期なのに 内部で実体のコピーをとってない場合とかだと
実際に送信完了するまで 渡した引数の実体が生きてる必要があるね
0771765
垢版 |
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ってなってたけどなんでそうなったのかが全然わかんない
0772デフォルトの名無しさん
垢版 |
2017/09/30(土) 10:53:58.34ID:V/gsXwon
>sendの後に送信結果を受け取る関数を呼んでる。
>そのあとでpayloadは解放されるようになってる

ならそのsendのバグか他でのメモリ破壊だろ
そのコード自体には問題はない
0774デフォルトの名無しさん
垢版 |
2017/09/30(土) 11:28:17.88ID:tI4TVI1o
問題点の切り分けは大事だな
元のソースを問題が再現する最小限のところまで切り詰めてみるとか
その過程で問題が起きなくなったら関係ないと思って切り詰めたところが原因だろうし
0775デフォルトの名無しさん
垢版 |
2017/09/30(土) 13:47:25.00ID:jk0Saihc
どうおかしくなってるのか分からない
"{id:abc, ・・・"が"XXXXXbc, ・・・"となる(ascii 88 = 'X')ってことなのか
0776デフォルトの名無しさん
垢版 |
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バイト以上入力できず、それ以上は入力しても消えてしまうバグを抱えていて
どうしてそのような不具合になるのかも知りたいのですが…
0777デフォルトの名無しさん
垢版 |
2017/09/30(土) 23:53:50.61ID:xUuIbR05
>>771
> そのあとでpayloadは解放されるようになってるから、送信完了までは実体は生きてると思う

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

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

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

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

あとWin32APIスレの方がいいよ
0784デフォルトの名無しさん
垢版 |
2017/10/01(日) 10:26:50.12ID:7TdPvZgo
>>780
>>771
>> 非同期送信にはなってるんだけど、sendの後に送信結果を受け取る関数を呼んでる。
>> そのあとでpayloadは解放されるようになってるから、送信完了までは実体は生きてると思う
ってあるからその可能性は低いと思う
0785デフォルトの名無しさん
垢版 |
2017/10/01(日) 10:32:30.15ID:qINK5MH4
vc2012だとC++11への準拠はどうなんだろ
c++11以降はc_strも実体を指す保証があるようだけど、
以前は関数内のstatic変数みたいな実装してた気がする・・
0786デフォルトの名無しさん
垢版 |
2017/10/01(日) 11:40:53.20ID:Q5nZisR/
>>784
初心者歓迎スレだし可能性は少なくない
GC言語で育ったならポインタをスマポのような何かと勘違いしてるかもしれない
さらにその文章から思い込みだけで検証していないのは明らかだし
0790デフォルトの名無しさん
垢版 |
2017/10/03(火) 19:50:33.30ID:VzAuCmWc
shared_ptrを戻すメンバ関数があるんですが
引数の条件に一致する物が無い場合、空というのが分かるshared_ptrを返したいんです。
どう書けばいいですか?
0794デフォルトの名無しさん
垢版 |
2017/10/04(水) 15:03:07.29ID:B6Js2yoS
>>788
いちいち古いVC入れ直すのめんどいから覚えてるんなら書いてほしいんだが

あと>>765が解決したのかどうかも知りたい
0795デフォルトの名無しさん
垢版 |
2017/10/04(水) 21:20:20.65ID:eGyO5ooe
初心者的質問で申し訳ないですが、libファイルの検索仕方を教えて下さい。
includeファイルはgrepかければ見つかりますが、リンクするとき、静的ライブラリ、libファイルの検索はどうすればいいか分かりません。
とりあえず、怪しい奴を片っ端からリンクしますが、それもどうかと思います。
マニュアルに書いてある訳でもないので皆さまどうされてるのか気になります。
0797775
垢版 |
2017/10/05(木) 07:26:13.70ID:/WMFst6h
ありがとうございます。
ネットで調べるのがメインなので、つい、本はケチってしまいました
bgrepは入れられないので-aでなんとかしてみます
0799デフォルトの名無しさん
垢版 |
2017/10/05(木) 21:31:37.51ID:Px1fI0/v
いちいちけなさんと会話も出来んのかゴミクズが
へー、じゃあ寿命は保証されてるわけか、そんなことはなかったはずだが
>>765の問題は寿命の問題だと思うが、ケチつけるなら正確に書いてくれる?
混乱を招くだけのイチャモンとか何の役にも立たんわ
0801デフォルトの名無しさん
垢版 |
2017/10/06(金) 00:14:51.51ID:M5Ph95zK
03以前は変更された後にc_str()を使うのも、そもそも内部で連続してる保証も無かったはず
今調べたけどdata(), c_str()の呼び出しでも変更される可能性があるらしい(11は大丈夫
0804デフォルトの名無しさん
垢版 |
2017/10/07(土) 15:35:22.92ID:cqowZFEs
それポインタじゃなくて整数でよくない
0805デフォルトの名無しさん
垢版 |
2017/10/07(土) 16:29:02.76ID:jvf7kHO4
ポインタと整数じゃ概念が違う
整数をアドレスを指し示す用途で使いますよってのがポインタだし
0808デフォルトの名無しさん
垢版 |
2017/10/07(土) 19:03:08.66ID:AU7JWIym
みなさんありがとうございます
規模の大きいデータで使うみたいですね
後は他の関数を飛び越えてアクセスしたい時とか
0810デフォルトの名無しさん
垢版 |
2017/10/10(火) 15:59:13.06ID:3nxFazlM
p==p_rgh + rho*gh;
とあるのですが意味がわかりません。
p=p_rgh+rho*gh;であるべきと思うのですが、==と=が使い分けされているので
タイプミスではなさそうです。どなたかよろしくお願いします。
0811片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/10/10(火) 16:10:57.64ID:RmsAElXw
>>810
「p==p_rgh」は、pとp_rghが等しいとき1 (true)になり、等しくないときゼロ (false)になる。
0812片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/10/10(火) 16:14:41.98ID:RmsAElXw
>>810
演算子「==」より演算子「+」の方が結合が強いんだった。
「p==p_rgh + rho*gh」は、pとp_rgh + rho*ghが等しいときtrueになる。
0813デフォルトの名無しさん
垢版 |
2017/10/10(火) 19:02:14.11ID:z98emhq8
>>810
問題のその式が、if文のカッコの中ではなく、普通に式文としてセミコロンで終わる1行として書かれているなら、ただの誤記の可能性が高いと思うよ。
0814デフォルトの名無しさん
垢版 |
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;

と独立しているのでどんな処理をしているのか・・・
0816片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/10/10(火) 19:12:17.54ID:RmsAElXw
>>814
そのように独立していれば何もしない。何もしない文をわざわざ複雑に書くことは意味がないので、代入を間違って書かれたと考えられる。
■ このスレッドは過去ログ倉庫に格納されています

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