C言語なら俺に聞け 149

■ このスレッドは過去ログ倉庫に格納されています
2018/10/28(日) 22:01:44.38ID:D9Gt7gmT0
!extend:checked:vvvvv:1000:512

次スレを作る時は上記1行をコピーして2行に増やして必ず1行目に入るようにしてください。

C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/

※前スレ
C言語なら俺に聞け 148
https://mevius.5ch.net/test/read.cgi/tech/1537347410/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2018/11/10(土) 11:37:20.64ID:lMF42kZL0
>>45
わりとerrnoを返してくる人多いけどね
2018/11/10(土) 11:58:28.71ID:4Oh2WWEl0
errno返してもらっても困る
2018/11/10(土) 17:42:25.30ID:16GnFLu/0
#defineマクロ定数はプリプロセッサで単純置換されるだけだからな
49デフォルトの名無しさん (アウアウウー Sa05-ahuQ)
垢版 |
2018/11/10(土) 18:12:43.61ID:JVjCprWqa
>>46
多いか?
別にそう作っちゃいけないということはないが、できれば exit() では <sysexits.h> の方を使って欲しいな。
単なる個人的な希望だが。
2018/11/10(土) 18:13:54.94ID:lBOHSSIo0
>>45
>>46
ありがとう。
ユーティリティ自体の終了ステータスはPOSIXの範囲では0もしくは非0,
BSD拡張で<sysexits.h>で定められている値を使えば まあユーザーの助けにはなるって認識でいいかな。
51デフォルトの名無しさん (アウアウウー Sa05-ahuQ)
垢版 |
2018/11/10(土) 18:26:46.25ID:JVjCprWqa
そう。
52デフォルトの名無しさん (ワッチョイ 937f-nWRh)
垢版 |
2018/11/11(日) 12:27:27.91ID:2PA7tL2j0
struct S {
size_t len;
type-X buf[0];
};
という状況下で、

size_t const len = 500;
struct S* const p = (struct S*)malloc(sizeof(struct S) + sizeof(type-X)*len);

p->len = len;
p->buf = (type-X*)((size_t)p + sizeof(struct S));

という処理を偶に見かけますが、これだと末尾パディングの影響でbuf[1]のアドレスがtype-Xのアライメントに沿っていない可能性があるので、不正な気がします
具体的には

struct S {
size_t len;
type-X* buf;
};
として、

size_t const len = 500;
size_t const padding_for_align_x = alignof(type-X)*(sizeof(struct S)%alignof(type-X) == 0 ? 0 : 1);
struct S* const p = (struct S*)malloc(sizeof(struct S) + padding_for_align_x + sizeof(type-X)*len);

p->len = len;
p->buf = (type-X*)((size_t)p + sizeof(struct S) + padding_for_align_x);

...などとしないとアライメント違反になりそうな気がするのですが、この認識は正しいでしょうか
2018/11/11(日) 12:57:16.34ID:2PA7tL2j0
すいませんよく考えたら自己解決しました
>>52の質問は取り下げます

お騒がせしました
2018/11/11(日) 14:07:31.98ID:PRctJ18Z0
>>4
へー。musl-libc知らなかったけど組込Linuxとかの界隈では有名っぽいね。
ソース見たけどすごく短かいのが多くて逆に不安になったw
2018/11/11(日) 15:17:31.04ID:0RasjQan0
sysexits.h って初めて知った

>>49
Linuxとかだと ls unko で 2 が返るとか割と普通
2018/11/11(日) 16:17:47.42ID:PRctJ18Z0
>>55
まあBSDでプログラミングしたことないと あんまり知りえないと思うわ。
だいたいPOSIXで定められてる訳じゃないから 知っておくべきなのはBSDプログラマくらい。

ただLinuxプログラムのエラーコード周りはなぜか非統一的なんだよね。
GNUコーディング規約で事細かに決められてそうなものだけどねw
apt(1)なんて権限エラーに100返すんだぜ?
2018/11/11(日) 16:41:45.09ID:PCIE9alw0
>>52
『MSDNこそC++である』という格言があるように、構造体の末尾の配列は不定長に出来ます

構造体内の可変長配列
ttps://msdn.microsoft.com/ja-jp/library/b6fae073(v=vs.120).aspx
2018/11/11(日) 18:01:07.65ID:EYHizhRi0
VLAとは違うんだよな
そのページのサンプルに限っては不完全型配列の直前にサイズ情報があって確かに可変長だが
配列そのものがサイズ情報を含むのではないので、不定長とでもいうべきものだ
2018/11/11(日) 18:07:53.58ID:PRctJ18Z0
どうでもいいけど そのURLの書式はなんだ?
URLパラメータってそんな位置に置けたっけ。
2018/11/11(日) 18:21:19.83ID:1ROtIrLE0
先頭さえ確定できれば後ろなんてどうでも良い
さすがのC言語さん
2018/11/11(日) 21:36:09.88ID:1MIvJQ9R0
>>57
その格言は初めて聞きましたw

その方法だとアライメント違反になるかならないかが気になっていたのですが、
* 末尾のbuffer[0]でその型のアライメント以上のアライメントを構造体に強いることができる(拡張)
* 末尾のbuffer[1]の場合は当然構造体にそのアライメント以上のアライメントを強いることができる(c89)
* 末尾のbuffer[]でも同様(c99での仕様)
となり、全パターンでbuffer[i]へのアクセス時にアライメント違反にならないので、
ポインタメンバにしてアライメント気にしてmallocする必要ないのかー、これでいいのかーと解決した次第です

>>58
英語だとflexible arrayでした
2018/11/11(日) 22:09:10.99ID:3Du2sMqla
>>59
v=vs.120のとこ?
クエリストリングちゃうやろ
63デフォルトの名無しさん (ワッチョイ db9f-ki2E)
垢版 |
2018/11/11(日) 22:26:25.11ID:0F8Q4Ddx0
>>55
ま、確かにコマンドごとにバラバラだな。
errno とも無関係だったりする。
2018/11/12(月) 13:20:45.59ID:JkRQG90v0
もうちょっと皆がリターンコードについて考えてくれたらいいね。
2018/11/12(月) 13:26:58.93ID:yW6s8Lj00
コマンドの戻り値って、皆さんどの様に活用されてますか?
成功か失敗か、それが分かれば十分な気はしますけど
2018/11/12(月) 13:50:25.07ID:JkRQG90v0
>>65
例えば同じ「失敗」でも何が原因なのか分かったほうが問題に対処しやすくない?
ファイルが存在しないのか はたまたファイルが現状の権限では読みとれないのか。
もちろんエラーメッセージを見てもいいけど。

あと,終了ステータスを見ないと成功失敗が分からない場合がある。
例えばdiff(1)ユーティリティーなんかは「1」という(一見失敗してるような)終了ステータスに
「(コマンド自体は成功してるが)不一致が発見された」という意味を割り当ててる。
fsck(1)ユーティリティーはもっと複雑。

まあ知ってるに越したことはないし<sysexit.h>はPOSIX標準ではないにせよ,
Unixプログラミングをする場合は積極的に利用してもいいかも。
2018/11/12(月) 14:11:20.80ID:yW6s8Lj00
イヤ、使い方の可能性としてそう言うものがあるくらいは知っている
実際に使っている人がいたら、どういう使い方をしているかを聞きたいんだ
2018/11/12(月) 16:42:56.85ID:JkRQG90v0
勘違いしてましたわ
俺の知ってる限りじゃシェルスクリプトでは多用されてるがCではどうだろうね。あまり見掛けない。
2018/11/12(月) 17:16:29.53ID:7RdsKszja
diffでちょっと迷うくらいだよな。
2018/11/18(日) 22:01:33.04ID:Fz4U8sel0
#define elif(e) else if (e)
みたいにして
if (...) {
...
} elif (...) {
...
} else {
...
}
↑こういう感じにするのってやっちゃマズいのかな。
個人的にelifキーワードがある言語に慣れてるんでこうやってて
現状特にエラーに遭遇したことはないんだけど
OSSのソースコードとか個人が公開してるソースコード見ても
こういうことやってないんだよね。
2018/11/18(日) 22:14:05.51ID:Eond7dK60
>>70
やめとけ

メリットが1ミリもないから誰もやらない。
善し悪しはさておき、C言語での判断基準はほぼ「実行性能」であって、
else if と書けばいいだけの所をいちいちマクロにする馬鹿なんて世界中に誰もいないだけ。
というか、そのレベルで慣れられないのなら、elif言語だけ使っておけ。
2018/11/18(日) 22:24:21.65ID:KTJRdzRs0
#define { begin

みたいなことを本気でやる奴がいたとはw
2018/11/18(日) 22:26:08.72ID:KTJRdzRs0
#define begin {
逆だったわw
2018/11/18(日) 22:35:31.43ID:ZI/kDlHTd
ソースコードを静的解析する関係で、文法を強引に変えるような変態な前処理は良くないらしい。
2018/11/18(日) 22:39:49.79ID:HA6us6PZ0
世の中の静的解析ツールは当然プリプロセッサ適用後の状態で解析するわけで
2018/11/18(日) 22:42:50.43ID:gSv28L1Ba
typedefも避けるという流儀はあるからね
まあ気持ちはわかる
むしろGNU拡張のtypeofはアリ
2018/11/18(日) 22:45:11.55ID:Eond7dK60
>>73
endは普通に変数名に使われてるから無理だな。
それはさておき、セミコロン嫌いも拗らせておかしくなってるよな。
2018/11/18(日) 22:47:48.36ID:Eond7dK60
>>76
> typedefも避けるという流儀はあるからね
それはC++ではないか?Cでは使われまくりだったような。
2018/11/18(日) 23:14:59.59ID:ZI/kDlHTd
国際会議で誰も知らない方言を話して良い訳ない。オープンなソースコードは世界中の人が見るんだから。
2018/11/18(日) 23:19:46.27ID:we8vMVw10
>>78
多分linuxカーネルの流儀じゃないかな

struct/enum/unionとかの省略を目的としたtypedefは行わない
opaque-type/関数ポインタとかの必然性が無い限り対象は明示するっていう戦略
2018/11/18(日) 23:37:43.07ID:Eond7dK60
>>80
> struct/enum/unionとかの省略を目的としたtypedefは行わない
こんなのは当たり前だ。(linuxカーネルに限らず)

そもそも「タイプ数をケチるだけの為に何かする」という文化は最近のWeb系馬鹿言語だけであって、Cにはない。
当然、else if を elif にしたがる奴もいない。
「腕のいい奴のコードは短い」を勘違いしてる馬鹿共がやたら「タイプ数」にこだわってるだけだ。
だいたい、structをタイプしたくなければC++コンパイラ使えば済むし。
82デフォルトの名無しさん (ワッチョイ ad98-nUmj)
垢版 |
2018/11/19(月) 00:20:04.42ID:DaKcZAfU0
ここで聞いていい内容なのかわからないのですが
gccを4.8.1から8.1.0に変えたらwinAPIを使用して図形を表示するプログラムで
図形が表示されずウィンドウだけ表示されるようになってしまった
これは、c言語,gcc,winAPIどれを疑えばいいのでしょうか?
MingW-W64-buildsというところから8.1.0のgccはダウンロードした
2018/11/19(月) 00:24:07.93ID:4H6R9aF+d
図形の描画ルーチンを貼れ。
2018/11/19(月) 00:25:09.76ID:+eaeK27e0
>>81
なぜ唐突にweb系云々に話が飛ぶのか理解できないのだが、
typedef struct {...} S;
typedef enum {...} E;
void f(S* s, E e);
上のような書き方、結構(昔から)見かける気がするけど
2018/11/19(月) 00:28:01.74ID:1op4u+BL0
>>82
お前の頭、だな

gcc4.8.1で行けるのならそれでやればいい話。
それを8.1.0に変えただけで問題が発生するのなら、当然そこに問題がある。
そしてそもそも詳しいことはそのソースを作った奴に聞け。
2018/11/19(月) 00:30:44.00ID:+eaeK27e0
というかこれ以外だとtypedefを使うべき所にしか使わないはずなので、
cだろうがc++だろうがtypedefの使用量に差が出るとは思えない

ああ、実は>>78ってc++ならusing使うべきとかそういう話?
2018/11/19(月) 00:46:59.49ID:1op4u+BL0
>>84
> 上のような書き方、結構(昔から)見かける気がするけど
個人的には疑問があるが、おそらく実際はそちらの方が正しいのだろう。
C++で対策された=C言語のそこがウザイと禿が判定した、ということだから。

> なぜ唐突にweb系云々に話が飛ぶのか理解できないのだが、
ググレば分かるが、その辺の言語では「こちらの方が短いから良い」といっているページは結構見かける。
C言語でこれを言っている奴は皆無だ。


>>86
> ああ、実は>>78ってc++ならusing使うべきとかそういう話?
いや、そうじゃない。そちらの取り方で問題ないし、君の typedef の使い方は正しいと思う。

typedefって結局「型に別名を与える」為の物で、
型が自由に定義出来るようになったC++ではほぼ要らないはず、って話。
88デフォルトの名無しさん (ワッチョイ ad98-nUmj)
垢版 |
2018/11/19(月) 01:03:17.87ID:DaKcZAfU0
>>85
そうか...仕様変更、バグ、なにか他にも入れるものがあるとか分かるなら聞きたかったんだが
仕方ない。ありがとう
4.8.1だと古くなってるかなと思って思い切って8.1.0で試してみてるんだけど戻すか
2018/11/19(月) 01:03:24.61ID:CKJwSX5SM
Web系言語界隈は条件演算子をif文の簡略表記()だの省略形()だの言ってる池沼も多いからなぁw
2018/11/19(月) 01:16:02.93ID:1op4u+BL0
>>88
まじめにやる気があるのなら、少しずつ上げて切り分けるのは簡単だろ。自分でやれよ。
ここで聞くより早いと思うぜ。
2018/11/19(月) 01:26:41.23ID:on7lyeKV0
else if の省略形は確かに頂けない
あれはperlからだっけか?
2018/11/19(月) 01:28:26.32ID:4H6R9aF+d
#elifはあって、elifがないのは変だが、キーワードを節約するためだから。
2018/11/19(月) 01:30:10.27ID:1op4u+BL0
>>91
歴史的には多分sh
70は多分python
94デフォルトの名無しさん (ワッチョイ ad98-nUmj)
垢版 |
2018/11/19(月) 01:37:20.71ID:DaKcZAfU0
>>90
なるほど、きざんでやってみます
ありがとうございます
2018/11/19(月) 01:38:53.01ID:+eaeK27e0
>>87
あー...もしかして自分の
>struct/enum/unionとかの省略を目的としたtypedefは行わない
これが「型定義時に、キーワードとしてのstructやenum、unionの省略のためだけのtypedefは行わない」
つまりstruct S{...}という形で定義し、明示的にvoid f(struct S* s)などといった形式で取り扱う
...という意味ではなく、
「structやenum、unionといった型について、それら個々の名前(タグ名)を単に省略するためだけのtypedefは行わない」
つまりtypedef struct SS...SS Sというただの省略形式にするtypedefは行わない
と伝わったのかな

それなら書き方が悪かった、申し訳ない
2018/11/19(月) 12:18:16.63ID:hiATcnIp0
>>92
自分もここが引っ掛かったんだよね。
プリプロセッサ向けにはelifキーワードがあるのに
コンパイラ向けにはない。
もしもキーワード数を節約したり実行速度のみを重視する実装なら
プリプロセッサ向けにもelifキーワードはなかった筈。
なのにある,ということはなにかしらタイプ数の節約とか読み易さとかを考慮してるんだろうね。
だからコンパイラ向けにelifキーワード(の紛い物)を追加するというのは何らおかしくないと思うのだが。
2018/11/19(月) 13:17:22.86ID:X/ZWPPJsx
そもそもC言語にはelse ifって構文はないよ。
んで、プリプロセッサは#の後をスペースなしの1語にした結果だと思う。
98デフォルトの名無しさん (アウアウカー Sa85-ZFLo)
垢版 |
2018/11/19(月) 13:27:56.02ID:X6/A5UNDa
フリーフォーマットだからelse if(...)を自分なりに分かりやすくすれば良いだけ。
2018/11/19(月) 21:04:51.99ID:DK7kmuka0
>>74
賛成

静的解析はツールだけがすることではなく人力でもすることだ
人力「でも」と言ったが、目的意識を持って判断できるのは人間だけで
こちらが主役であることを、小者でアフォなやつほど忘れる
2018/11/20(火) 01:45:19.01ID:EatTFoyz0
>>99
でも>>75でも言われてるけど
プリプロセッサ命令を効かせてから解析するのが普通なんだから
あんま関係なくね?
2018/11/20(火) 09:35:42.58ID:im347JOd0
>>97
構文にはなくても書けるんだから一緒だろ
2018/11/20(火) 15:56:41.31ID:mQTI1hl+0
負の数を識別できません。

signed int DATA = -128 (0xFF80。int は16ビット)

if (DATA > 0)
{式1}
else
{式2}

なぜか式1 が実行されます。(DATA > 0) は偽ではないのでしょうか。
2018/11/20(火) 16:14:32.18ID:ls520OJz0
問題のコードから症状が出るままどんどん削ってって最小単位がそのコード?

https://ideone.com/xcDRkc

実は右辺がcharの変数で 中身が 0x80 なんだけど
符号拡張の過程で char を unsigned char として 0x0080 と拡張したり
(処理系依存だっけか?  リテラルだけだっけ?)
そういう話ではない?
2018/11/20(火) 16:16:24.86ID:hc2iBltta
16bitってどういう処理系なんじゃろうか
2018/11/20(火) 16:43:19.22ID:mQTI1hl+0
>>103,104

右辺の0は定数です。
変数DATA の値はPRINT文で16進表示したものです(0xFF80)。

引用先のページは、残念ながら理解できませんでした。

申し遅れましたが処理系は組み込み用16ビットマイコン用GCC です。
処理系に依って前述のような動作になることはありえますか?
2018/11/20(火) 16:49:33.90ID:ls520OJz0
右辺云々は 初期化の右辺の話だけども、そこが本質じゃなさそうね

sizeof(int) = 2 かつ printf("%x", DATA) が ff80 と表示される系で
if (DATA > 0) が成立しないとな

ごめんワカラン
2018/11/20(火) 16:59:34.34ID:7KgR8FwmM
最小の全ソースを見せて。
この手の場合、自分では正しいと思ってるとこに思わぬポカミスが入ってることがまれによくある。
2018/11/20(火) 17:07:55.90ID:mQTI1hl+0
>>106,107
すいません。ご察しのとおり、変数DATA に初期値を代入しているわけではありません。
このif 文が評価される直前のDATA 値が-128 という事で、初期値を代入したように書きました。

今日はこの件で非常に疲れたので、ソースの提示は少し時間を下さい。ありがとうございます。
2018/11/20(火) 17:18:12.25ID:ls520OJz0
>>107
元コードをそのまま横断的に眺めてるとわからないけど
症状が残るまま、余計な箇所をがんがん削っていって簡単化していくと見つかることがあるよね

a[i++] = i; のような副作用完了点内での複数回の参照とかはどうしようもないけどw
2018/11/20(火) 17:26:38.15ID:GGiSm8Yna
値自体は型情報を含んでないという点は押さえないとあかんが、そういう問題でもないか。
妙なtypedefしてたりしてね。
2018/11/20(火) 17:33:06.78ID:oWNEdszs0
アセンブリコード読んで見るとか
割り込みでレジスタ確認とかすれば
cで見てると気づかないことが見えてくるかも
2018/11/20(火) 19:23:37.02ID:2i13hG6Q0
printf("check : sizeof %d: DATA = %d\n",sizeof(DATA),DATA);
if((signed int)DATA > (signed int)0)
とかやって一つ一つ動作確認してみるとか。

よくわからん動作不良起こした時は配列変数がスタックサイズ超えてたとか
16Bit環境なら32kb/64kb超えたとかが原因だったことあるけど。
2018/11/20(火) 19:37:09.53ID:TCh3BaRvM
>>108
そもそもその環境で>>102のコードを実行したらどうなるのさ?
114デフォルトの名無しさん (アウアウウー Sa91-AAco)
垢版 |
2018/11/20(火) 20:38:14.44ID:xyhgdzIUa
>>102
本当に DATA の型は signed int か?
良く見たら unsigned int ってことはないか?
2018/11/20(火) 21:11:07.99ID:d/DSkvWpM
>>102
16進リテラルが16bitで収まらないからunsigned intで解釈された。(c99)
そんでintに暗黙キャストされたときに最上位bitが落ちたと思われ
2018/11/20(火) 22:03:30.03ID:HgsWcywV0
>>108
> 今日はこの件で非常に疲れたので、ソースの提示は少し時間を下さい。ありがとうございます。
正しい。疲れたら休め。結果的にその方が早い。

君も分かっていると思うが、まともなコンパイラ(実績のあるコンパイラ)なら、そんなところにバグはない。
ほぼ間違いなく君の勘違いだ。
それは根詰めて見てても気づかないが、一旦忘れて見直したらあっさり見つかる、ということもよくある。
残業してグダグダやるよりも、早く帰って早く寝て、次の日に早めに出社した方が捗る。

おそらくあっさり解決すると思うぜ。
2018/11/20(火) 22:51:04.92ID:0YIMqUF30
リテラルの大小によって、型が変わるとか、滅茶苦茶な文法だろ

コンパイルエラーにしろよ。
気づかねえ
2018/11/20(火) 23:08:18.58ID:w1zNIHuF0
ソースの見栄えで桁あわせにゼロパディングしたら 8進数になっててうぁぁぁ
2018/11/20(火) 23:08:44.13ID:jZchQuqWa
マジックナンバーあかんとか言ってもさあ、マクロで隠したせいで生じたバグも経験的にはかなり多いんだよね。
値のリテラル即悪みたいなのもどうかと思うね。
2018/11/20(火) 23:22:23.29ID:HgsWcywV0
>>117
型は変わらないし、普通は警告が出るはず。
いずれにしても、C言語はお前みたいな馬鹿向けには出来てない。

>>115
unsigned int から int へのキャストは普通はそのままで、飽和処理なんてしないだろ。
仕様なのか処理系依存なのかは知らんが。
2018/11/20(火) 23:35:21.40ID:HgsWcywV0
>>119
何をリテラルにして良いか判断出来ないのは君(または周り)の問題だろ。
独り言ではなく、問題提起〜議論起動する気があるのなら、「俺なりの基準」でも言えよ。
2018/11/21(水) 00:29:46.48ID:Z1qX2lWM0
>>120
>型は変わらないし
つ6.4.4.1

>普通はそのまま
intの最大値を超えているのにどうやって表現する気だ
2018/11/21(水) 00:32:45.26ID:UO6rINaw0
>>122
> intの最大値を超えているのにどうやって表現する気だ
ならお前はdoubleの最大値を超えている場合はどうするんだ?
お前みたいな馬鹿が使うようには出来てないんだよ。
2018/11/21(水) 00:45:36.29ID:w42YOu3l0
釣り針が大きすぎて、咥えられないw
2018/11/21(水) 06:57:26.41ID:sFoC6dALM
>>118
あるあるすぎる…
2018/11/21(水) 09:11:45.73ID:xS7mIekg0
>>118
止めてくれ
その術はオレに効く
127デフォルトの名無しさん (アウアウウー Sa91-AAco)
垢版 |
2018/11/21(水) 09:22:03.70ID:RC0TEAoba
30年ぐらい前にZ80のマイコンボード用に作ったプログラムでそれにハマった覚えがある。
2018/11/21(水) 09:54:03.00ID:PloQSCN7a
すぐ16進で書きたがるのもどうかと思うわ。
intに-1でなくて0xffffffff入れてるのとか意図が掴みかねる。
そもそもunsignedがあるのが良くないんだな。javaは正しかった。
2018/11/21(水) 10:14:15.23ID:nY2eM3rc0
70年代初期に何が良いか何が悪いか何が正解かが分かるの?
それに磁気コアメモリが4096ビットの時代だよ
2018/11/21(水) 10:55:13.30ID:Gzh6p2MJ0
>>125-127
リテラル中に 8 や 9 が入ってれば文法エラーで止まるので判明するけど
入ってないとそのまま通っちゃうし、特に警告の対象になるようなもんでもないしでやっかいよね
2018/11/21(水) 12:33:01.52ID:sFoC6dALM
>>130
今時8進表記なんて使うことはほぼないと思うから使ってたら警告してもいいくらい
2018/11/21(水) 13:31:24.92ID:VldA7vNv0
>>109-116

皆さんご助言ありがとうございます。おかげさまで一応不具合は解消できました。
以下問題の箇所です。

signed int MAX, WIDTH, TMP, SHIFT;
float COEF;

COEF = MAX / WIDTH; //浮動小数点演算になると思っていた
// 1 = 128 / 128

TMP = SHIFT * COEF;
// -128 = -128 * 1

if (TMP > 0)
{式1} //TMP= -128 なのに、式1が実行される。
else
{式2}

だったのを
COEF = ((float)MAX / WIDTH);
に修正すると、式2 も実行されるようになりました。他に変更したところはありません。
今まで何故(-128 > 0)が真だったのかは不明です...
133デフォルトの名無しさん (アウアウウー Sa91-AAco)
垢版 |
2018/11/21(水) 13:55:29.32ID:89fYavxUa
>>132
本当に if の直前で TMP がマイナスだったのかが怪しい。
それと気になるのはやはり型が本当にその通りなのかだな。
2018/11/21(水) 14:13:56.46ID:Gzh6p2MJ0
本当に変数の型は signed なのか?
実際に 式2 に通って欲しいのに 式1 へ流れた MAX, WIDTH, SHIFT の値 をメモって
再現する最小セットのコード作って何が起きてるのか把握しとかないと、また同じことやらかすかもよ

signed int TMP;
signed int MAX = <リテラル>;
signed int WIDTH = <リテラル>;
signed int SHIFT = <リテラル>;
float COEF;

COEF = MAX / WIDTH;
TMP = SHIFT * COEF;
printf("1:%d\n", TMP);
if (TMP > 0) { printf("1:式1\n"); } else { printf("1:式2\n"); }

COEF = ((float)MAX / WIDTH);
TMP = SHIFT * COEF;
printf("2:%d\n", TMP);
if (TMP > 0) { printf("2:式1\n"); } else { printf("2:式2\n"); }
2018/11/21(水) 14:20:55.45ID:HZsG+Ur+a
COEFが0なんじゃ?
まあわかんないね
2018/11/21(水) 22:53:01.43ID:UO6rINaw0
>>132
皆が指摘しているように、それだけでは無いと思うがな。
おそらく君が出してきたソースにも色々間違いがあるんだろうけど。

ソース見る限りズブの初心者のようだが、問題点を理解しているか?

まず用語がおかしいので先にこれを修正しておくが、普通は
float scale = width / max; だ。shiftは足すもの、scaleが掛けるもの。coeffは係数=無次元数だろ。
読んだときに違和感がないようにしろというのはアプリケーションハンガリアンの思想だが、
これを採用するかはともかくとして、思想自体は当たってる。
そして通常は max で割る。(ただしこれについては、意図的に逆数にすることもあるが)
あと変数を全部大文字にするのはマジで止めろ。そんなことしてる奴は居ないだろ。

それで、君の「キャスト忘れ」についてはscaleが0に張り付くなり、整数の階段状になるので、
「動作を見た瞬間にどこがバグっているか分かる」タイプのバグになる。
追跡するにも苦労しないし、そもそも追跡の必要すらない。
当然、疲れもしない。マジで10分で修正して、てへぺろ、だ。

だからそのバグを取るのに手こずること自体がおかしい。
そしてその遠因になっているのはその意味不明なネーミングだ。
まずはそこからだと思うぜ。

(-128 > 0)が真になることはないので、確実に君が何か勘違いしている。
先生/先輩/上司その他、見てもらえる人がいるのなら、
君のソースのその酷さも含めて見てもらった方がいい。
そういう人がいなくて君が一人でマイコンを動かそうとしてるのなら、今の君では無理だと思うぜ。

Python馬鹿なら、最近はPythonが動くマイコンもあると聞くので、環境を変えた方がいい。
マイコン環境のCは、色々と貧弱な分、PC環境のCより難しい。
今の君ではPC環境のCでも無理がある。
状況聞く限り、俺は>>135の予想が正しいと思う。
2018/11/21(水) 23:10:25.75ID:iZ9rHJSw0
ズブの素人が来てよかったね
嬉しそう
生きがいみたいなもんだな
2018/11/21(水) 23:20:56.85ID:ILAAUKO60
歳を取ると説教したくなる
2018/11/21(水) 23:26:10.43ID:0tXjM5tc0
何が起きていたのか本人は追求する気はないみたいなんで
話はこれ以上進まないだろう

>>137
で、それがお前の生きがいなわけだ
なんだかな
140デフォルトの名無しさん (ワッチョイ 9580-CYUw)
垢版 |
2018/11/21(水) 23:48:20.51ID:QmHGv3o90
低学歴知恵遅れが
低学歴知恵遅れ丸だしなレスして
イキイキしてる
2018/11/21(水) 23:57:18.63ID:UO6rINaw0
>>137,138
まあお前らは上達しないと思うぜ。
最近お前らみたいな奴も増えたが。

上達出来るかは結局、自分で深みに突っ込んで行けるかにかかってる。

俺の指摘が間違っている、というのならともかく、
気に入らない指摘は無視すればいい、というスタンスなお前らはプログラマは無理だ。
諦めて他の職を探せ。

132は努力しているようだが、方向を間違っている。
それはお前らにも見えてることだろ。放置するのもまた悪だと思うぜ。
巻き込まれるのが怖くて見て見ぬふりをして、結果、
陰湿ないじめが横行してたゆとりなんてその程度だと思うが。

勿論132も追求した方がいいとは思うが、正直、そのレベルじゃない。
PC環境のCでGUIのIDEを使ってまずCを覚えるか、
既にプログラミング出来るのならその言語、調べたところRubyが動くのもあるようだから、そっちから行った方がいい。
Cも初めて+マイコンも初めて、では、確実にはまる。
142デフォルトの名無しさん (ワッチョイ c380-1YVs)
垢版 |
2018/11/22(木) 00:13:37.04ID:8rnkEr570
こんな低学歴知恵遅れ丸出しな長文レスばっかりで埋め尽くされると
まともなヤツは近づかなくなるわ
やはり自覚がない
2018/11/22(木) 07:53:35.42ID:pCbzIdwz0
>なんだこれ?引数 void って初めて見たぞ。文法的にありなのかこれ?

まーたこのゴミが登場したのか
もう出てけよ
余りにもゴミだからこのスレにはいらねーよ
2018/11/22(木) 13:02:07.52ID:RP03a4vB0
この議論に参加してくださった皆さん

>>136 さんの指摘は初心者の私には大変有難いものでした。
ただ、いくつか反論したい部分もあります。私はハード屋で、ハードウェア言語で使われる変数(フリップ・フロップ)の動作遷移を意識した変数名にした方が私には分かり易いのです。

変数を全て大文字にしているのは単純に昔からの癖です。命令文 = 小文字、引数,変数 = 大文字 と決めています。

「キャスト忘れ」についてですが、異常動作に即気付けるか否かはint 変数をキャストしないと
0,1,2・・・などの整数にしかならないことを知らなければなかなか気付けない事ではないでしょうか。
Cの参考書は持っていますが、浮動小数点演算に関連する情報が離散していて、この事象が起こりうるという説明を見出すことが出来ませんでした。

>>134 さんが提示されたテスト・プログラムは余裕が出来た時に実行してみるつもりです。現在このプロジェクトはほぼ完成しており、細かな調整を残すのみです。ありがとうございます。
2018/11/22(木) 13:18:43.76ID:mBJlqzKNx
>>144
まずは問題解決とプロジェクト完了おめでとうございます。

分かってると思いますが、ここは教えたがりな人、説教したい人、煽りたい人がマウントとり合うだけのスレなので、あまり細かいことは気にせず自分に有用な情報だけ吸収してくださいな。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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