[過去ログ] C言語なら俺に聞け 163 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
627
(4): (ワッチョイ 6a56-WFrT) 02/10(月)16:46 ID:xKid5uSQ0(1) AAS
よく分からないがこうなる理由が分からないという意味の質問かな?
まあそうだとして、C言語では異なるオブジェクトへのポインタを比較出来ないってルールがある
それが行われているので、未定義の動作といってこのプログラムではコンパイラがどんな事をしてもいいことになってる
そのどんな事の中にはnot equalを表示するという動作も含まれているので、たまたまそうなったんでしょう
初心者がよくやるFAQレベルのミスなので、ポインタとオブジェクトを理解する意味でその辺も読んでみればもっと上達するでしょう
他にもヘンな部分があるので色々他の人のコードとかも読むといいね
628
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ ff32-DO7v) 02/10(月)17:14 ID:cWC6BpGk0(2/3) AAS
>>627
ポインタにはアドレスが入ってるだけという話題が出てたからそんなことはないという注意喚起。
629: はちみつ餃子◆8X2XSCHEME (ワッチョイ ff32-DO7v) 02/10(月)17:18 ID:cWC6BpGk0(3/3) AAS
>>623
文意がよくわからんが初期化されてないから不定値になってるんじゃない?
630: 02/10(月)17:44 ID:1DQgWNxh0(1) AAS
>>627
> よく分からないがこうなる理由が分からないという意味の質問かな?
このスレは初めてか?
はちみつさんがそんな質問するわけないだろ
631
(1): 警備員[Lv.5][新芽] (ワッチョイ 8713-tGgj) 02/11(火)00:58 ID:nkHTE6y60(1/2) AAS
これはどういうことなんだ?
foo、barの順にスタックに積まれる
bazにはfooの次の(intの境界の)番地(barと同じ)が入り、quzにはbarの番地が入る
bazとquzには同じ番地(値)が入っている
までは分かる
bazもquzもint型を指している
が、bazとquzの内容を比較するとことなる
省2
632
(1): 警備員[Lv.5][新芽] (ワッチョイ 8713-tGgj) 02/11(火)01:04 ID:nkHTE6y60(2/2) AAS
>>627がいうことがそれなのか
未定義だと
アセンブラ脳だと同じとみなしてくれてよさそうだけど、難しいね…
633: (ササクッテロラ Spa3-Z3xl) 02/11(火)08:30 ID:YWsMUNTvp(1) AAS
型変換すればOK
634
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ ff32-DO7v) 02/11(火)11:05 ID:0+q77CUl0(1/2) AAS
>>632
強調しておくけど未定義は何が起こってもよい。
この場合は一応は式が式として評価されたかのように動作してるので比較的マシな部類で、未定義を踏んでいる箇所とは遠く離れた箇所で意味不明の動作が起こることもある。(起こってもよい。)
低レイヤから入った人は未定義をナメてることが結構あるとは思う。
どのような機械語にコンパイルされるか想像できる (と本人は思っている) 故の弊害だなぁ。
635: (ササクッテロラ Spa3-Z3xl) 02/11(火)11:22 ID:kmJe274sp(1) AAS
Cなんてポインターは全部void*だろ
636: (ワッチョイ 1e63-euVe) 02/11(火)11:37 ID:7Jzkf7ZG0(1/2) AAS
ご無体な
637: 警備員[Lv.6][新芽] (ワッチョイ 46ac-tGgj) 02/11(火)12:35 ID:m4FoXgHJ0(1/2) AAS
>>626 は僕のgccのパージョンだと
-O2 ありだと "not equal"
最適化なしだと "equal"

-S つけて .s をみると、-O2 ありのときポインタの比較すらせず単純に
puts("not equal");
とするコードを出力していた
"equal" のリテラルすらコードにはない
省1
638: (ワッチョイ 4606-6Hi7) 02/11(火)13:33 ID:jMpjlVqA0(1/4) AAS
strict aliasingのルールがなぜあるか理解してたらある程度予想つくだろ
639
(2): (ワッチョイ de76-/Fy3) 02/11(火)14:32 ID:VhWouMxY0(1/2) AAS
そもそも 8Byteや4Byte変数のポインタが例えば奇数の数値が許されるのかとか
640
(1): (ワッチョイ 1e63-euVe) 02/11(火)14:40 ID:7Jzkf7ZG0(2/2) AAS
文字列を指すポインタなら、一文字ずつインクリメント出来ないと困るよね
641: (ササクッテロラ Spa3-Z3xl) 02/11(火)14:52 ID:+ybAiMfGp(1) AAS
>>639
CPUによる
642: (ワッチョイ 4606-6Hi7) 02/11(火)15:43 ID:jMpjlVqA0(2/4) AAS
>>639
それどこへのレス?
643: (ラクッペペ MMc6-2Ktg) 02/11(火)16:44 ID:ZUCQJ4rmM(1) AAS
>>640
いつ困るんだ?
644
(1): 警備員[Lv.3][新芽] (ワッチョイ 1ac9-tGgj) 02/11(火)16:59 ID:MJELNENN0(1) AAS
>>627
最適化されると出力されるコードを推測することは無理だ、ということね
645: (ワッチョイ 4606-6Hi7) 02/11(火)17:19 ID:jMpjlVqA0(3/4) AAS
無理はいいすぎ
やったことないやつがしったかすんな
646: (ササクッテロラ Spa3-Z3xl) 02/11(火)17:20 ID:0gFNLz1yp(1) AAS
ARM系はほんと無理
647: (ワッチョイ 5302-aFRq) 02/11(火)18:37 ID:2gjYX+K80(1) AAS
貴方みたいな人はほんと無理
とか言われたら傷ついちゃう
648
(4): (ワッチョイ 7f1b-hc6T) 02/11(火)21:27 ID:JzAdQ4dR0(1) AAS
とりあえず読むべし
旧石器時代のポインタをご利用の皆様へ 〜provenance入門〜
外部リンク:qiita.com
649: 警備員[Lv.5][新芽] (ワッチョイ 465f-tGgj) 02/11(火)21:52 ID:m4FoXgHJ0(2/2) AAS
>>648
thx!
650
(1): (ワッチョイ de76-/Fy3) 02/11(火)21:58 ID:VhWouMxY0(2/2) AAS
こんなの分割コンパイルしたら分からないし ライブラリならなおさら
実行時にどのオブジェクト由来なんて情報持っておけるのか?

int func(int *ip, int *iq)
{
if (ip == iq) {
} else {
}
省1
651: (ワッチョイ 46a9-6Hi7) 02/11(火)22:39 ID:jMpjlVqA0(4/4) AAS
コンパイル時に決まってんじゃん
652: (スップ Sd4a-26Jk) 02/11(火)23:02 ID:DgpMDse2d(1) AAS
このコテハンの人いつもこんなだよね
まともに出来るのが規格のコピペみたいな事だけで、それ以外だとすぐとんちんかんな事言い出して突っ込まれてる
653: はちみつ餃子◆8X2XSCHEME (ワッチョイ ff32-DO7v) 02/11(火)23:17 ID:0+q77CUl0(2/2) AAS
>>650
わかる範囲でやるってだけ。
わからないところは保守的なコードを生成する。
ただ、今は LTO があるのでわかる範囲がだいぶん広い。

わからないからこそプログラマは未定義なことをしないと仮定した最適化をする (未定義を踏んでたらむちゃくちゃになる) という場合もある。
654: (ワッチョイ d301-XAIF) 02/12(水)10:25 ID:WVzDbo940(1/2) AAS
>>648
ポインタpとqの値が同じにならないんだけど…
655: (ササクッテロラ Spa3-Z3xl) 02/12(水)10:28 ID:p1VJlK94p(1) AAS
Cに余計なもん付けたらいにしえのLinux由来のコードが通らなくなるだろ
656: (ワッチョイ 6a4d-WFrT) 02/12(水)11:20 ID:OojhOsKe0(1/3) AAS
未定義の動作がどういうことなのかよく分かっていない人がいるみたいなので補足しておく

>>628
未定義の動作を引き起こすプログラムを提示しても結果が分からないし毎回違う可能性もある点でこれだと何も示せてない
きつい言い方かもしれないが注意喚起になっていない
>>634の2行目を見るとコードの動き方に対しての認識として不定の動作と未定義の動作を混同して勘違いしてるかも知れないね
657: 627 (ワッチョイ 6a4d-WFrT) 02/12(水)11:21 ID:OojhOsKe0(2/3) AAS
>>631
未定義の動作なので2行目から7行目のような事が起きるかどうかは分からない
仮に未定義の動作がなかったとしても行目を自明のように仮定することは出来ない
アーキテクチャが色々ある中そういう処理系もあればそうでない処理系もあるしCでは何も規定してない
スタックの仕組みがないものもあればポインタをそもそも数値や番地で扱わないアーキテクチャもある
後段も同様
658
(2): 627 (ワッチョイ 6a4d-WFrT) 02/12(水)11:22 ID:OojhOsKe0(3/3) AAS
>>644
コンパイラの動作に対して必要条件が何も設定されない状態になるという話で最適化は全く関係ない

ちなみに今回の話はK&Rの頃からあるルールなので>>648とはちょっと違う
ただ内容は大体同じでポインタはオブジェクトを指してるもので、その内部形式や扱い方はユーザーが知る必要はない
659: はちみつ餃子◆8X2XSCHEME (ワッチョイ ff32-XAIF) 02/12(水)11:47 ID:cXwd7RB80(1/2) AAS
>>658
言語仕様上で未定義動作とされている状況が実際の機械の上でどう動作するか (その動作は想像できない) という文脈でヤバさを伝えるためになるべく想像外な結果を生む実例を出そうとしているので最適化は関係ある。
660: (ササクッテロラ Spa3-Z3xl) 02/12(水)11:50 ID:XyTZkBHop(1) AAS
最適化しないと無駄なコードや無意味なコードも忠実に出力されるからなぁ
661: (ワッチョイ 4618-6Hi7) 02/12(水)12:49 ID:J/UI6pYQ0(1) AAS
>>658
未定義だから不明を連呼されても大して参考にならんわけで
なぜ現実のgccではあのような結果になるのか理由を説明できないのか?
わかってないようだけど最適化は大いに関係してるぞ
662: (ワッチョイ de76-/Fy3) 02/12(水)13:26 ID:7GgOweZ60(1) AAS
えーと未定義や環境依存を使ったりとかは
Cおよびコンピュータの理解が不十分な
質の劣るプログラマが存在するからでしょうに

そういう人達に重要プログラムを書かせる責任問題でもある
663: (ワッチョイ 5302-aFRq) 02/12(水)15:09 ID:+Pz/j8Me0(1) AAS
相手に過大に説明を要求して、自分は分かろうとしない者は嫌われちゃうよ
664: (ワッチョイ 1e63-euVe) 02/12(水)15:17 ID:iId2MJ1V0(1) AAS
gccのフォーラムで質問出してみたら?
参考にできる回答が得られるかも知れないよ
665: (ワッチョイ d301-XAIF) 02/12(水)15:52 ID:WVzDbo940(2/2) AAS
>ポインタにはprovenanceという,どのオブジェクト由来かの情報が含まれています

↑まずこれがおかしい
666: (ササクッテロラ Spa3-Z3xl) 02/12(水)16:26 ID:I956D6cKp(1) AAS
ランタイムじゃなくてコンパイル時の静的なルールだろうね
667
(1): (ワッチョイ ea07-XAIF) 02/12(水)17:12 ID:1bCkYFVx0(1) AAS
投資家はRustを信頼するって言ってるんだから、Rustとおんなじようにすればいいだけ

俺はC/C++派なので、どんどんRustの実績をぶんどってくるべきって思ってる
668: はちみつ餃子◆8X2XSCHEME (ワッチョイ ff32-DO7v) 02/12(水)17:47 ID:cXwd7RB80(2/2) AAS
>>667
Rust のようにやるなら Rust のほうが巧くやれる。
当たり前だろ。
669: 警備員[Lv.1][新芽] (ワッチョイ aba3-tGgj) 02/13(木)00:32 ID:rym7RjTu0(1/2) AAS
移植性が求められることばかりでもないし、最適化などのオプションも頻繁に取ったりつけたりしないし、思い通りに動かなければアセンブルリストみたりするけど、コンパイラが出力するコードが予想通りかなんて観点はないし、実践的ではないけど、人を小馬鹿にしたりしなければ勉強になって面白い話なのに
670: 警備員[Lv.1][新芽] (ワッチョイ aba3-tGgj) 02/13(木)00:34 ID:rym7RjTu0(2/2) AAS
実践的でない、はちょっと違うか
671: (ワッチョイ 8655-u07z) 02/15(土)13:31 ID:vKfoke/00(1) AAS
Arduino (ESP32)で文字列変換をしたいです。
tの文字列をtm structに変換したいんですが,タイムゾーンのオフセット部分の+9:00の扱いが分かりません。
%Zはタイムゾーンのオフセットを分を指定する場合で、%zだとUTCなどタイムゾーン名を指定する場合に使うみたいでした。
どうやるんでしょうか?

外部リンク:pastebin.com
672
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ ff32-XAIF) 02/15(土)15:04 ID:ewglApEf0(1/3) AAS
strptime で %z や %Z でタイムゾーンを扱えるのは glibc の拡張 (他で真似している場合もあるかもしれんけど) なんだけど、 Arduino の C ライブラリは glibc ベースなの?
そうじゃないなら各ライブラリのドキュメント (またはソースコード) を読まないとわからないし、そもそもそんな機能はないのかもしれない。
673
(1): (ワッチョイ 5357-u07z) 02/15(土)16:19 ID:BNBq5D0N0(1) AAS
>>672
どうもありがとうございます
%zのようなのを使わず+の前後で分けてまず前だけでtm structに変換して後ろはエポック秒が何かに変換して使うのがベターでしょうか?
674: (ブーイモ MM3b-6Hi7) 02/15(土)16:25 ID:Q9F/iLI2M(1) AAS
やり方思いついたならやれ
675: はちみつ餃子◆8X2XSCHEME (ワッチョイ ff32-XAIF) 02/15(土)16:39 ID:ewglApEf0(2/3) AAS
>>673
どうやら Arduino は newlib ベースの模様。
newlib の strptime はタイムゾーンをサポートしてない。

どうにかしてタイムゾーンを扱いたい場合にどうやって実装するかは個々の事情によると思うのでなんとも言えない。
実績のある実装をどこかから持ってきたほうが良いんじゃないかと個人的には思う。
外部リンク:www.google.com
パースするだけならたいして複雑なものではないので自分で書いてみてもいいかな。
省7
676: はちみつ餃子◆8X2XSCHEME (ワッチョイ ff32-DO7v) 02/15(土)21:12 ID:ewglApEf0(3/3) AAS
基本的なことを書き忘れてた。
strptime は C の言語仕様には無い関数で、 POSIX (UNIX 系 OS の統一仕様) にある。
POSIX は最低限の共通部分だけをまとめたもので実装には雑多な拡張を入れる前提なので各実装によってサポート内容が違う。
POSIX 準拠ではない環境で部分的に POSIX を真似てるだけ (POSIX の最低限の要求も満たしてない) ということもある。
677: (アウアウエー Sa13-9cJ9) 02/16(日)12:03 ID:rAQQ2/+ca(1) AAS
最初からtmstructをUTCで取得した方が楽ジャマイカ
678: (ワッチョイ 232c-1nj7) 02/17(月)01:18 ID:mzGEyEzq0(1) AAS
有効な同型ポインタの比較において、同一オブジェクト/配列由来でない場合、
== の結果は 0
(未定義動作ではない)

C99(N1256) Annex J.2 Undefined behavior

— Pointers that do not point to the same aggregate or union (nor just beyond the same
array object) are compared using relational operators (6.5.8).

ここに Equality operators の記述がない。
省8
679: はちみつ餃子◆8X2XSCHEME (ワッチョイ ed32-7Htj) 02/17(月)10:52 ID:tIRsmIw80(1) AAS
C99 をあらためて読み返してみたら確かにそうだ……。

・ ふたつのポインタが等しいと判断される条件が書いてあって「その場合に限り」等しいとする
・ 各演算子は指定された関係が真の場合は1を,偽の場合は0を返す
・ 未定義と書いてある (またはそれと等価な言い回し) か動作の明示的な定義がない場合は全て未定義

等しい条件を満たさないなら 0 が返されることを保証していることになるので未定義ではないことになる。

でもまあ現実的に考えたらおかしいし、欠陥報告が出てたりしない?
680
(1): (ワッチョイ 1501-7Htj) 02/17(月)19:30 ID:iQTBmgHC0(1) AAS
>>648のサンプルプログラムで同じことが起きることってある?
681: (ワッチョイ 23ad-MHHu) 02/22(土)07:05 ID:nEyoRU5r0(1/2) AAS
>>680
WSL2 の Ubuntu 22.04.5 にインストールされている gcc 11.4.0 で gcc -O でコンパイルしたら起きた。
-O なしだと起きない。
682: (ワッチョイ fde8-ItHp) 02/22(土)12:11 ID:DWcN/KDk0(1) AAS
余計なことを
683
(1): (ワッチョイ 23ad-MHHu) 02/22(土)14:47 ID:nEyoRU5r0(2/2) AAS
最適化オプションの有無で違いが出る状態はできれば止めて欲しかったな。やるとしても別オプションでやって欲しかった。
684
(1): (ワッチョイ 1bab-2o2c) 02/22(土)16:41 ID:Z2hFLtuL0(1) AAS
その壁越えられないやつ多いよね
仕事でも最適化すると動かなくなるからってオフでリリースしてた雑魚エンジニアいたわ
685: (ワッチョイ cba1-Nstt) 02/22(土)17:57 ID:HOxFgRC/0(1) AAS
コンパイラのバグって事じゃないのか?
686: はちみつ餃子◆8X2XSCHEME (ワッチョイ b132-FOV+) 02/23(日)20:21 ID:5K9CwmG10(1) AAS
>>683
-0 はいくつかの具体的な最適化オプションを束ねたものだよ。
外部リンク[html]:gcc.gnu.org
このうちのどれが効いてるのかは知らんけど。
687
(1): (ワッチョイ b691-M1fQ) 02/23(日)21:01 ID:VuC2otmU0(1) AAS
>>684
最適化オフでのリリースは一つの有力な選択だと思います。
688: (ワッチョイ 094f-/70v) 02/23(日)21:45 ID:K8mfivgh0(1) AAS
最適化に副作用あるのは常識
689: (ブーイモ MM99-A0+M) 02/23(日)21:54 ID:FQnOu1obM(1) AAS
>>687
まザコならしょうがないわな
組み込みならハードのコスト一段下げられるけど諦めるしかない
そんなザコ会社だから低収入もしかたない
690: (ワッチョイ 0d01-Ah42) 02/24(月)01:00 ID:IorN2uWP0(1) AAS
自己紹介かな
691: (ワッチョイ aeb7-/OIl) 02/24(月)17:12 ID:qLUUxQg70(1/2) AAS
gccなら-O0でも実施される最適化はあるので本気で最適化オフにしたいなら-O0で有効になる項目を-fno-に個別に指定する必要がありそこそこ面倒
692: (ワッチョイ aebd-A0+M) 02/24(月)17:18 ID:SlW5Uo1a0(1) AAS
最適化オフとか言ってる人は、UBを踏んでしまってるから最適化で動作が変わるってことわかってんのか?
693: (ワッチョイ aeb7-/OIl) 02/24(月)17:22 ID:qLUUxQg70(2/2) AAS
まあコンパイラの最適化バグである可能性もないわけではないがな
694
(1): (ワッチョイ b691-M1fQ) 02/24(月)20:28 ID:V/nislFh0(1) AAS
組み込み分野だと最適化によりデバッグがしづらくなることが多い。
695
(1): 警備員[Lv.1][新芽] (ワッチョイ d5f7-a+6O) 02/24(月)21:56 ID:JeKlmQzN0(1) AAS
gccで -O2 なし -Wall ありでコンパイルすると strict aliasing の警告がでないけど、
-O2 -Wall ありだと strict aliasing の警告が出るケースに当たったのだけど、
strict aliasing って安全に最適化するためのアレなのですかね(最適化しないときは strict aliasing には無頓着)
696: (ワッチョイ d5a2-eBms) 02/24(月)22:52 ID:ifUFLigf0(1) AAS
この人たちホントgccが大好きだよね
697: (ワッチョイ 76a1-x4eQ) 02/24(月)23:27 ID:LsxokMxo0(1) AAS
gccはいろんな環境で動かせるので便利ではある
698
(1): (ワッチョイ ae76-A0+M) 02/25(火)01:13 ID:t+eQGWY+0(1/2) AAS
>>694
それ組み込み関係ないから
699
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ b132-FOV+) 02/25(火)08:31 ID:6jOr+W/20(1/4) AAS
>>695
警告を出すためには警告の条件に引っ掛かっていることがわからないといけないという単純な前提がある。
結果を使いもしないのに警告のためだけにエイリアス解析を頑張るのは合理的か?
700: (ワッチョイ b6e5-M1fQ) 02/25(火)09:04 ID:ODzMt1Nm0(1) AAS
>>698
そうだった
701
(2): 警備員[Lv.1][新芽] (ワッチョイ d56d-a+6O) 02/25(火)23:42 ID:MFbkYyJ10(1) AAS
>>699
最適化しないときは strict aliasing が不要なものなんですかね(最適化のための strict aliasing なんですかね)というつもりで書いたのだけど、分かりにくくてすまんね
702
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ b132-Ah42) 02/26(水)10:14 ID:6jOr+W/20(2/4) AAS
>>701
少なくとも GCC や Clang では strict aliasing rules は最適化のためのものという認識で正しいよ。
-fstrict-aliasing (やこれらを含む -O2 以上の最適化) が有効になっているときに限りエイリアスベースの最適化をするし、そのときだけ strict aliasing rules が守られていることを要求する。
703
(1): (ワッチョイ 317b-/OIl) 02/26(水)11:04 ID:x+jOZkKw0(1/2) AAS
strict aliasing rulesを守らないと未定義動作となるのはC言語の決まりなので特定の処理系で問題ないから守らなくて良いという考えは馬鹿のすること
704: (ワッチョイ ae51-A0+M) 02/26(水)11:20 ID:t+eQGWY+0(2/2) AAS
というかstrict aliasing rulesをわかってるやつがあえて守らないって考えにくいでしょ
このスレを見てわかる通りわかってないやつらが大半
705
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ b132-Ah42) 02/26(水)11:38 ID:6jOr+W/20(3/4) AAS
ビットパターンを別の型で読み替える可能性があるなら最初から union で書いておいたほうが人にとっても読みやすいしな。
(C++ では union でも common initial sequence の読み替えしか許しておらず、 C より制約が厳しいので注意。)
706: はちみつ餃子◆8X2XSCHEME (ワッチョイ b132-FOV+) 02/26(水)15:23 ID:6jOr+W/20(4/4) AAS
>>703
未定義は「規格としては何も要求しない」なので処理系が何らかの追加保証をすることを禁じてない。
707
(1): (ワッチョイ 317b-/OIl) 02/26(水)15:45 ID:x+jOZkKw0(2/2) AAS
特定の処理系と心中するつもりでstrict aliasing rulesを守らない奴がいたらすごい馬鹿
1-
あと 295 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.027s