X



C言語なら俺に聞け 149
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ af9f-7TBo)垢版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
0007デフォルトの名無しさん (ブーイモ MMba-rFq1)垢版2018/11/03(土) 11:28:06.76ID:hj5IrB61M
>>6
msvcのstrtok_sは非標準だから、_MSC_VERとかが定義されてるかどうかで呼び分けるしかないね。
あんまり覚えてないけどmsvcバージョンのほうが先にあった気がするから、iso/iecが悪い気がする。(間違ってるかも)
まあmsが切り替えスイッチを用意してくれればよいのだけど。
0009デフォルトの名無しさん (アークセー Sxbb-0Z6C)垢版2018/11/07(水) 16:09:41.16ID:39tnP8GCx
ちょっとお知恵を拝借。

符号付き14ビットの整数があるとき(14ビットのMSBが符号ビット)、その値を符号付き16ビット値に拡張するうまいやり方はないでしょうか?
拡張後も符号や数値自体は変化なしです。
例えば2進で
10 1010 1010 1010
という符号付き14ビット値があった時、
1110 1010 1010 1010
のように変換したい。

14ビット値を16ビット符号付き変数に入れて左に2ビット論理シフトし、さらに右に2ビット算術シフトすれば実現できるのですが、何となく気持ち悪くて。
サクッとエレガントな方法はないでしょうか?
0012デフォルトの名無しさん (アウアウウー Sac7-AdN2)垢版2018/11/07(水) 18:16:05.56ID:bimd4khFa
もはや答えが出切ったと思うので斜め上からの回答でも書いておくか。

回答

int型が14ビットの整数型になっているCコンパイラを使う。
もちろんchar型は7ビット。
CPUは1バイトが7ビットである。
0014デフォルトの名無しさん (バッミングク MM86-0Z6C)垢版2018/11/07(水) 19:12:35.33ID:xr+D7aWAM
皆様回答ありがとうございます。
今回はビットシフト方式で行こうと思います。

>>12
使ってるCPUとコンパイラがマイナーな、ある意味純粋な16ビット環境で、sizeof(char)もsizeof(short)も1を返し、sizeof(long)は2を返すような特殊な環境なので7ビットマイコンではありません。
0018デフォルトの名無しさん (アメ MM7f-Ul28)垢版2018/11/07(水) 20:55:36.02ID:Lazgvcn1M
このように1バイトが何ビットかはアーキテクチャ依存のため、EUではハードディスクなどのパッケージにはGB単独表記は認められず、Go(ギガオクテット)を併記または単独で表記しなければならない。
1オクテットは必ず8バイト。
0022デフォルトの名無しさん (アウアウカー Sac3-U2lQ)垢版2018/11/07(水) 21:19:59.22ID:h4FWJh3Ka
大丈夫。
文脈から理解はしてる。
上げ足取りなだけだ。
0024デフォルトの名無しさん (ワッチョイ 5b80-Q1ft)垢版2018/11/07(水) 23:27:18.47ID:fWOqg0Pc0
バカってそういうもんだろ
0029 ◆QZaw55cn4c (ワッチョイ 5360-ZWep)垢版2018/11/08(木) 23:21:07.60ID:PviajTiD0
>>27
>C89止まりのものです、私のような者が C11などの新しい規格を学ぶのによい書籍はありますか?
私もC89止まりですが、それで困ることがあるのでしょうか?
0034デフォルトの名無しさん (アウアウカー Sa9d-Gc0T)垢版2018/11/09(金) 12:33:54.85ID:DHGOZxvaa
動き的にgets的な動きする。
表示したら即メモリ解放的な。
0037デフォルトの名無しさん (アウアウウー Sa05-ahuQ)垢版2018/11/09(金) 13:11:31.21ID:JsSTi+Gxa
ん?thread?
0040デフォルトの名無しさん (ワッチョイ 9164-30bX)垢版2018/11/09(金) 20:13:38.25ID:3ZHBVzZ50
POSIXの<errno.h>にある番号とBSDの<sysexits.h>で全然番号が違うのは理由があるのかな。
いままで<sysexits.h>に従って「許可がない」動作は77を返すものだと思ってたら
Linuxでは1を返すのでなぜだと思って調べたら<errno.h>では権限エラーは1。
嫌だなぁ。
0043デフォルトの名無しさん (ワッチョイ db9f-ki2E)垢版2018/11/10(土) 05:46:23.69ID:PYYpj2JU0
>>40
<errno.h> の方はC言語でシステムコールしてエラーになった時の errno 変数の値で、
<sysexits.h> はプログラムが exit() 等で終わる時に使う値なので全く用途が違う。
0045デフォルトの名無しさん (ワッチョイ db9f-9t8X)垢版2018/11/10(土) 06:43:06.70ID:PYYpj2JU0
>>44
見えないというか、ただの数値なのでどこにでも使えないわけではないが、errnoの値をexit()で返す事は想定して作られていない。
0049デフォルトの名無しさん (アウアウウー Sa05-ahuQ)垢版2018/11/10(土) 18:12:43.61ID:JVjCprWqa
>>46
多いか?
別にそう作っちゃいけないということはないが、できれば exit() では <sysexits.h> の方を使って欲しいな。
単なる個人的な希望だが。
0051デフォルトの名無しさん (アウアウウー Sa05-ahuQ)垢版2018/11/10(土) 18:26:46.25ID:JVjCprWqa
そう。
0052デフォルトの名無しさん (ワッチョイ 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);

...などとしないとアライメント違反になりそうな気がするのですが、この認識は正しいでしょうか
0056デフォルトの名無しさん (ワッチョイ 9164-30bX)垢版2018/11/11(日) 16:17:47.42ID:PRctJ18Z0
>>55
まあBSDでプログラミングしたことないと あんまり知りえないと思うわ。
だいたいPOSIXで定められてる訳じゃないから 知っておくべきなのはBSDプログラマくらい。

ただLinuxプログラムのエラーコード周りはなぜか非統一的なんだよね。
GNUコーディング規約で事細かに決められてそうなものだけどねw
apt(1)なんて権限エラーに100返すんだぜ?
0058デフォルトの名無しさん (ワッチョイ 497d-ki2E)垢版2018/11/11(日) 18:01:07.65ID:EYHizhRi0
VLAとは違うんだよな
そのページのサンプルに限っては不完全型配列の直前にサイズ情報があって確かに可変長だが
配列そのものがサイズ情報を含むのではないので、不定長とでもいうべきものだ
0061デフォルトの名無しさん (ワッチョイ 9321-A2K7)垢版2018/11/11(日) 21:36:09.88ID:1MIvJQ9R0
>>57
その格言は初めて聞きましたw

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

>>58
英語だとflexible arrayでした
0063デフォルトの名無しさん (ワッチョイ db9f-ki2E)垢版2018/11/11(日) 22:26:25.11ID:0F8Q4Ddx0
>>55
ま、確かにコマンドごとにバラバラだな。
errno とも無関係だったりする。
0066デフォルトの名無しさん (ワッチョイ 9164-TRt+)垢版2018/11/12(月) 13:50:25.07ID:JkRQG90v0
>>65
例えば同じ「失敗」でも何が原因なのか分かったほうが問題に対処しやすくない?
ファイルが存在しないのか はたまたファイルが現状の権限では読みとれないのか。
もちろんエラーメッセージを見てもいいけど。

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

まあ知ってるに越したことはないし<sysexit.h>はPOSIX標準ではないにせよ,
Unixプログラミングをする場合は積極的に利用してもいいかも。
0070デフォルトの名無しさん (ワッチョイ 56be-JwVn)垢版2018/11/18(日) 22:01:33.04ID:Fz4U8sel0
#define elif(e) else if (e)
みたいにして
if (...) {
...
} elif (...) {
...
} else {
...
}
↑こういう感じにするのってやっちゃマズいのかな。
個人的にelifキーワードがある言語に慣れてるんでこうやってて
現状特にエラーに遭遇したことはないんだけど
OSSのソースコードとか個人が公開してるソースコード見ても
こういうことやってないんだよね。
0071デフォルトの名無しさん (ワッチョイ 054f-CYUw)垢版2018/11/18(日) 22:14:05.51ID:Eond7dK60
>>70
やめとけ

メリットが1ミリもないから誰もやらない。
善し悪しはさておき、C言語での判断基準はほぼ「実行性能」であって、
else if と書けばいいだけの所をいちいちマクロにする馬鹿なんて世界中に誰もいないだけ。
というか、そのレベルで慣れられないのなら、elif言語だけ使っておけ。
0081デフォルトの名無しさん (ワッチョイ 054f-CYUw)垢版2018/11/18(日) 23:37:43.07ID:Eond7dK60
>>80
> struct/enum/unionとかの省略を目的としたtypedefは行わない
こんなのは当たり前だ。(linuxカーネルに限らず)

そもそも「タイプ数をケチるだけの為に何かする」という文化は最近のWeb系馬鹿言語だけであって、Cにはない。
当然、else if を elif にしたがる奴もいない。
「腕のいい奴のコードは短い」を勘違いしてる馬鹿共がやたら「タイプ数」にこだわってるだけだ。
だいたい、structをタイプしたくなければC++コンパイラ使えば済むし。
0082デフォルトの名無しさん (ワッチョイ 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はダウンロードした
0085デフォルトの名無しさん (ワッチョイ 054f-CYUw)垢版2018/11/19(月) 00:28:01.74ID:1op4u+BL0
>>82
お前の頭、だな

gcc4.8.1で行けるのならそれでやればいい話。
それを8.1.0に変えただけで問題が発生するのなら、当然そこに問題がある。
そしてそもそも詳しいことはそのソースを作った奴に聞け。
0086デフォルトの名無しさん (ワッチョイ 4a21-JwVn)垢版2018/11/19(月) 00:30:44.00ID:+eaeK27e0
というかこれ以外だとtypedefを使うべき所にしか使わないはずなので、
cだろうがc++だろうがtypedefの使用量に差が出るとは思えない

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

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


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

typedefって結局「型に別名を与える」為の物で、
型が自由に定義出来るようになったC++ではほぼ要らないはず、って話。
0088デフォルトの名無しさん (ワッチョイ ad98-nUmj)垢版2018/11/19(月) 01:03:17.87ID:DaKcZAfU0
>>85
そうか...仕様変更、バグ、なにか他にも入れるものがあるとか分かるなら聞きたかったんだが
仕方ない。ありがとう
4.8.1だと古くなってるかなと思って思い切って8.1.0で試してみてるんだけど戻すか
0094デフォルトの名無しさん (ワッチョイ ad98-nUmj)垢版2018/11/19(月) 01:37:20.71ID:DaKcZAfU0
>>90
なるほど、きざんでやってみます
ありがとうございます
0095デフォルトの名無しさん (ワッチョイ 4a21-JwVn)垢版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は行わない
と伝わったのかな

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

静的解析はツールだけがすることではなく人力でもすることだ
人力「でも」と言ったが、目的意識を持って判断できるのは人間だけで
こちらが主役であることを、小者でアフォなやつほど忘れる
■ このスレッドは過去ログ倉庫に格納されています

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