【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
エスケープシーケンスや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/ 変数内のレイアウトと 異なる変数のギャップと同じに取り扱っていいものなのかな 現行規格の5.7/p6では未定義動作となっていて
他に許可する記述は見つけられなかった 規格も読めないアホにつける薬はないってことかな w こういうアホな話になるのはauto使いはscript kiddie脳だから。
処理系に対する理解が皆無。 >>675
ちなみに聞くけど
cが何型なのか知ってるよな? >>671 >>686
で終了なのに
なにか文句を付けなきゃ気がすまない人がいるみたい > ダメな例出して
って啖呵きったらさくっと出されて発狂中 頭が悪すぎて相手にされないauto使いかわいそう。 >>692
アドレスの話をしていたのにポインターの例にすり替えられた
と言われる恐れがあるので5/p4も加えておかないと
但し符号有り整数で減算した場合には未定義動作にならない どうやらauto使いというのはCにおける未定義の意味を勘違いしてるようだ。
まだほとんどコードを書いたことがない初心者なのだろう。 > 他に許可する記述は見つけられなかった
面白い発想だな。Cを高級言語だと思ってんだろうな。これは笑える。 >>671 >>686 で終了
納得できない人がいるみたいだけど
実質問題無いのはその通り
問題がある事例を私は知らない
ただ言語の規格上は未定義 メモリがリニアでないバンク方式やセグメント方式の処理系を知らないとは無知だな。
far、near知らないとか最近勉強し始めたのだろう。
Cは低級言語。処理系依存を書く言語。
コンパイラが勝手に処理系に依存した定義をしろってこと。 nearだろうがfarもセグメント方式だろうが
a-b+b=a+b-b=aになるけど
ほとんどの環境で
なんてことは知らないか > 処理系依存を書く言語。
わざわざ依存した書き方をしなくていい
依存しないでデメリットなくかけるなら依存しない方法をとるのが普通
ていうか、
言語的に保証されてないアドレスの減算の処理などコンパイラの説明書に普通書いてないが、
誰が責任を取るつもり? 強力な最適化コンパイラはプログラマが未定義を踏んでいないことをあてにした最適化をすることがある。
「ほとんどの環境で大丈夫」なんていうのは現代では思い込みだよ。 全然大丈夫じゃない。 未定義の動作だからその文丸ごと消しちゃっても構わないよね
って最適化がかかってバグった話は、どこかで読んだな >>703
offsetofとかいうマクロの中身を見てみようか いずれにしろ、
言語上未定義なコードをわざわざ書くのはアホ
>>700とか >>705
何を言いたいんだ?
offsetof の中身が何を意味してるって? offsetofはコンパイラメーカーが用意するものだから
意味合いが違ってくるのでは? なにも考えずに互換性を減らすコードを書くのはアホ
使う環境が限られているのに、互換性を理由に明確なメリットがあるコードを避けるのもアホ また未定義、未規定、処理系定義の違いもわかってない>>700が暴れてるのか
autoに粘着してるところを見ると新しいものについていけなくなった老害なんだろうな w それとoffsetofに何の関係が?
offsetofはコンパイラメーカーが用意したんだろうから
少なくともそのコンパイラでは動くようになってる
だからといってどうこうという話は一切ない >>714
>>703とoffsetofに何の関係が?
offsetofはコンパイラメーカーが用意したんだから
少なくともそのコンパイラで動くようになってる
これをもってして、どうこうという話はない offsetofがどうやって出来たかも知らんとは
じゃあ逆にうまく動かない具体例を知ってる?
たいてい内部はただの整数演算だぞ >>716
いいえ。 たとえば GCC は __builtin_offsetof を持っていて、 offsetof マクロはこれに展開されます。 だからoffsetofはコンパイラメーカーが用意したもので
自分たちが自分たちの製品用に用意したんだから動くのは当たり前だろ?
offsetofは動くが(そりゃコンパイラメーカーが用意したんだから当たり前)
だから何なんだ?
nullptrが好きみたいだから
https://cpplover.blogspot.jp/2015/12/blog-post_21.html
↑を読んでみると良い
それもじっくり読んだほうが良い
こういった不慮の事故があるから未定義動作は避けるべきというのは当たり前では?
↑のプログラムが未定義動作で最適化でコンパイラで削除されるのに
offsetofは最適化されずに残るってのは非常に興味深い微妙な部分なんだよ
やってることはヌルポインターの参照で同じことなんだがな
こんなのさじ加減なんで、何が起こるか分からない 具体例が無いと>>702-704,718の懸念は認められない。
などと思っているならこいつはとんだアホウだ そもそも>>717は具体的な例だし>>719の考える具体例ってなに? 元は>>652だな
それに続く>>658の1部だけを抜き出して>>664の書き込み
目的がこの時点でそれて、これ以降アドレスの減算の話になる
ダメな例ってのはアドレスの減算を行って実際にうまく動かない例
オフセット分を戻すことで有効アドレスで使うことになるので、>>701で実際に元に戻らない環境を多く示せばいい
言語規格上保証されてないことは>>670や>>677以外は知っている それとoffsetofが何の関係があるのか、と聞いているわけだが offsetofは未定義とされるコードが処理系のライブラリ内で使用されていた例。
「具体例」は単に実際に問題となる例を出せと言っているだけ。
両者は無関係だが>>705が>>715を理解する知能が無かったのが残念。 offsetofと同様の自作マクロがたくさん使われてる
ということを知らないとは
ていうか、順番が逆だ
色々な所で使われてるから標準化された >>725
offsetofの中身を見れば関連がわかる きっと>728の使ってるコンパイラでのoffsetofの定義には我々の想像も付かない何かが書いてあるんだよ。
他の人の使ってるコンパイラでも同じことが書いてあるはずだと思ってる理由はわかんないんだけど。
>728はその「offsetofの中身」を明示して話すといいんじゃないかな。知らんけど。 >>727
>色々な所で使われてるから標準化された
お前のパソコンに保存されてる自作マクロには興味ないけど、
offsetofは機能性を規格化しただけで実装は規格化されてないぞ 0番地を構造体のアドレスにキャストして、メンバのアドレスに変換して、それをそのまま整数にキャストする
ってマクロ、昔は一般的に使われてたんだけど
知らないか
>>701の根拠のひとつ
いずれにしろ、
反例がひとつも出て来ないようじゃそんな根拠もいらないね >>700はトンチンカンで、
>>703も説得力ゼロ
ってことで ぬるぽ使った自作offsetofがすべての処理系で正常動作するとは限らない
って話じゃないのけ? >>726
offsetofはコンパイラベンダーが用意したのだから動くのは当たり前では
俺らからしたら、未定義動作、処理系依存、実装依存、であっても
コンパイラベンダーからしたら、仕様なのでは?
特にコンパイラベンダーは究極的にはコンパイラの仕様を変更することも
出来る立場なので >>733
ほとんどの環境でうまくいく
だから良く使われている
そうじゃないっていうなら
うまくいかない例を出して
っていう話 日本語が通じない人に説明は不可能
おれは>>726じゃないし なんでそんなに仕様に違反したいんだ?
仕様に違反すべきではないってことにそんなに根拠が必要か? >>740
違反したいなんて思ってるのは>>700くらい
メリットがあれば違反することもある
簡単な代替手段があれば違反しない そもそも、どの環境でも正しく動く保証がある意味のあるコードなんてないから
どのコードもある程度環境を前提としてる そんな唐突な、そもそも論は、要らないだろ
程度問題だろ
C/C++の仕様的にはNGでも、コンパイラの仕様書にOKって書いてあればOKなんじゃね?
例えば int は 32bit 整数ですって書いてあれば、そういう製品仕様として納得するし
ただ、offsetofをもってしてOKと言えるのかどうか だからダメな例を出せって
>>699に対して反論したいなら コンパイラの仕様書に書いてないよ普通
ポインタのビット数が書いてあるだけで >だからダメな例を出せって
そしたら逆にコンパイラの仕様書でOKって書いてある例を出せ
って話になるでしょ
無ければグレーゾーンになるわけだ
まさに未定義 日本語が通じない人が多いなあ
とおもったら同じ人か またトンチンカンな例を
話の流れくらい理解してから書け そりゃ誰もお前の中だけの勝手な話の流れなど知ったことではないだろ >>750
トンチンカンとしか言えないなら黙ってろよw 単純な話、ベンダー提供のマクロで言語仕様上保証されないような使い方がされていたとして、
そのマクロ自体の動作はベンダーが保証しても同じコードがそのマクロ外で保証されるわけじゃないよね。
実際には動くかもしらんけど。 昔は学生運動が一大イベントだった。鉄砲の音が聞こえたら、学生たちが一斉に走り回る。それは軍隊のように団結力のある集団だった。 >>753
「こんな最適化するのか!」って思うようなピンポイントな最適化は有るから、
逆にピンポイントな例外だってありそうよね。 >>753
マクロとそれを展開したソースで動きが異なるってこと?
さすがにそれは考えにくいと思うけど >>736
すべての環境で動作する保証が無い=環境依存 お前らが何を話しているのかわからん
相手に何を伝えたいのか
お前らは何を訴えたいのか
何も見えてこない
俺がないならもうやめろ >>761は>>671の『C/C++的』の意味が共有できているといつから思っていた ちょっと不可解な部分があったから質問させてくれ
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)で動かすと、両方うまくいった 非同期やbufferedの関数を正しく使えてないんだろ
たしか以前にboost.asioかなんかの同じような質問をきいたことがあったような ASIOといえば
Audio Stream input output そのインターフェースで非同期なのに 内部で実体のコピーをとってない場合とかだと
実際に送信完了するまで 渡した引数の実体が生きてる必要があるね みんな回答ありがとう。
>>766
string型のメソッドで、文字列をconst char*にするやつ
>>767,769
非同期送信にはなってるんだけど、sendの後に送信結果を受け取る関数を呼んでる。
そのあとでpayloadは解放されるようになってるから、送信完了までは実体は生きてると思う
>>770
OSSの関数がそう定義されてるから変換したんだ
{id:abc. ... , }
のうち先頭5文字の{id:aがおかしくなってるんだよね・・
Wiresharkでみると、バイトコード88ってなってたけどなんでそうなったのかが全然わかんない >sendの後に送信結果を受け取る関数を呼んでる。
>そのあとでpayloadは解放されるようになってる
ならそのsendのバグか他でのメモリ破壊だろ
そのコード自体には問題はない >>771
まず
> send(payload, str.length());
を実行する時にpayloadの指す先が正しいか切り分けしなよ 問題点の切り分けは大事だな
元のソースを問題が再現する最小限のところまで切り詰めてみるとか
その過程で問題が起きなくなったら関係ないと思って切り詰めたところが原因だろうし どうおかしくなってるのか分からない
"{id:abc, ・・・"が"XXXXXbc, ・・・"となる(ascii 88 = 'X')ってことなのか すいません
メモ帳ソフトのTextTreeみたいに
タブを並べられて、そのタブごとに個別のツリーを格納するには
どうしたらいいんでしょうか?
ttp://www.vector.co.jp/magazine/softnews/080129/images/n08012931b.gif
なんでここで聞くかというと
TextTreeの開発者のコメントに
「wxWidgets」をいじっていたので、これを使って作ってみようと思った、というのがあって
そのwxWidgetsのHPに
wxWidgets is a C++ library〜
と表記されていたからです。
普通のメモやテキストエディタは
ツリー>タブ>メモという構成ですが
Texttreeのような
タブ>ツリー>メモという構成が希望ということです。
またTextTreeは、リッチテキストが扱えるものの
文字が65535バイト以上入力できず、それ以上は入力しても消えてしまうバグを抱えていて
どうしてそのような不具合になるのかも知りたいのですが… >>771
> そのあとでpayloadは解放されるようになってるから、送信完了までは実体は生きてると思う
str.c_str() 渡した場合は str の寿命や変更で解放されることになる。
他のどこかで解放されるようになってるとしたら、そんなところに渡してはいけないと思う。
どこかで free されることになってるなら、 malloc したポインタを渡さないと
正しく動かないということで >>765 の結果で当然に思う。
「OSSの関数」というなら具体的な関数を明示すればもっと状況がわかるのに。 >>776
wxWidgets固有のことは知らないけど
タブごとにツリーを用意して各タブに対応する子ウィンドウに配置するだけでしょ
もしくはツリーを一つだけ用意してタブ切り替えのたびに中身を書き換えればいいんじゃない >str.c_str() 渡した場合は str の寿命や変更で解放されることになる。
いやだから、payload==str は送信結果を受けてから
開放してるって本人は言ってるのでは? 明示的に解放しないstringの方はそこを意識してなかった可能性もあるんじゃね?
非同期ってことは>>765でsendした関数からは一旦抜けてるでしょ? >>776
1つの方法としては
タブが切り替えられる毎にイベント発生するから
タブAが押されたらダイアログAを表示してそれまでに表示されてたダイアログは非表示にする
ダイアログ毎にツリーとリッチエディットを用意したらいい
あとWin32APIスレの方がいいよ >string str = "{id:abc, ... , }"
>void* payload = (void*) str.c_str();
>>780はpayloadを明示的に解放すんのかよ してない可能性を挙げたのに「すんのかよ」って俺に言われてもなw >>780
>>771に
>> 非同期送信にはなってるんだけど、sendの後に送信結果を受け取る関数を呼んでる。
>> そのあとでpayloadは解放されるようになってるから、送信完了までは実体は生きてると思う
ってあるからその可能性は低いと思う vc2012だとC++11への準拠はどうなんだろ
c++11以降はc_strも実体を指す保証があるようだけど、
以前は関数内のstatic変数みたいな実装してた気がする・・ ■ このスレッドは過去ログ倉庫に格納されています