C言語なら俺に聞け 149

レス数が950を超えています。1000を超えると書き込みができなくなります。
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
879デフォルトの名無しさん (ワッチョイ c101-DeFq)
垢版 |
2019/01/18(金) 00:39:40.92ID:2Bf08m/t0
個人的にはAが好きだけど
こういうの馬鹿にする人いそうなのが困る
2019/01/18(金) 01:55:40.31ID:b8LPMN8g0
引数でやりとりせず大域変数に渡したくなる
2019/01/18(金) 01:59:06.15ID:9Rl7pqwkM
配列に入れてnとstr丸ごと渡せよ
2019/01/18(金) 02:04:58.72ID:4oORRjeGM
構造体に入れてポインタ渡さない?
2019/01/18(金) 05:44:13.01ID:APqq2jRu0
この範囲だけで言えば A が見通しが良くて分かりやすいんじゃないかな。

1, 2, 3 の並び方が(順列で)6通り存在するとか、
1 と "hoge1"... だけでなく、1 と "hoge2" の組み合わせも発生しうるとか、
func()の呼び出しパターンがもっと複雑だったら、
「flagの値に応じて適切な引数でfunc()を呼び出す関数」を作ると思う。
call_func(int flag, [func()に渡す引数]); みたいな感じ。

[func()に渡す引数] の部分を、カンマで区切った引数群にするか、
構造体にまとめるかは、別の要素が絡むので、強く主張できない。
2019/01/18(金) 06:01:14.41ID:5rrYPQ5i0
俺なら次のようにする。
void *a[]={1,&"hoge1",2,&"hoge2",3,&"hoge3",2,&"hoge2",3,&"hoge3",1,&"hoge1"};
func(flag?a:a+6);
885デフォルトの名無しさん (アウアウウー Sa15-4KIe)
垢版 |
2019/01/18(金) 15:49:59.44ID:dETdnGdxa
>>875
その flag が 0 か 0 以外の値にしかならず 1 や 2 で違う動作になる事は未来永劫ない場合と、将来的になる可能性がある場合とでやり方は変えるかも知れない。

でも最初のやり方で良いんじゃないかな。あまり捻ると分かりづらくなるし。
flagの値によって何十通りもの違う呼び出しになるとかいうなら色々考えた方が後々良いのかも知れないが。
2019/01/18(金) 16:33:30.33ID:qQDJcXFa0
flagに1も2もあるかよ
Win32のGetMessageみたいなアホなケースはあるが
2019/01/22(火) 14:42:25.83ID:Um5Ij+zI0
突然のステマ(OSSについてだけど)
LuaTeXっていうTeXのLua拡張?(よく分からん)に付いてくる
pplibっていうPDFライブラリおすすめ。
ドキュメント↓
https://serveur-svn.lri.fr/svn/modhel/luatex/trunk/source/texk/web2c/luatexdir/luapplib/html/ppapi.html#c-api
C向けのAPIでかなり最近に開発されたおかげか挙動が素直
2019/01/22(火) 15:04:03.04ID:zFHfz07h0
>>887
みえない
2019/01/22(火) 15:24:29.26ID:rPWXpeN+0
Username for Subversion luatex repository

とか入力を求められるけど、何やら登録が必要?
2019/01/22(火) 15:34:39.22ID:Um5Ij+zI0
>>889
ユーザー名: anonsvn
パスワード: anonsvn
2019/01/22(火) 15:35:11.14ID:Um5Ij+zI0
ていうかごめん。普通に匿名SVNであることを書き忘れてたわw
2019/01/22(火) 15:47:59.14ID:rPWXpeN+0
こちらも Subversion の公開レポジトリでは anonsvn が一般的と知らなかった。

案内ページも表示されないんで完全会員制の秘密クラブの扉でも
ウッカリ開いてしまったのかと、少々慌ててしまった部分もある。
893デフォルトの名無しさん (アウアウウー Sa15-4KIe)
垢版 |
2019/01/22(火) 16:00:45.48ID:J1mDHp9Ya
バカには見えないプログラムでございます。
2019/01/24(木) 09:31:07.67ID:0uzJSPSp0
確かにAPIはスッキリしてるけど機能が少なすぎるね>>887
Poppler使うわ。
2019/01/27(日) 17:56:04.26ID:dmqtxJI00
てす
2019/01/30(水) 19:18:19.67ID:lQux7EEV0
この板ってPCの書き込みは見れない仕様なの?
897デフォルトの名無しさん (ワッチョイ 3152-FxQn)
垢版 |
2019/01/30(水) 20:09:31.10ID:5GzTmkIQ0
は?
2019/01/30(水) 21:15:29.41ID:lQux7EEV0
>>897
この板をPCのクロームで見てみて
レス数が903なのに、メイトでは897なんよね
2019/01/30(水) 21:22:29.10ID:yhwdEVRM0
>>898
なんかNGしてるワッチョイでもあるんでは?
2019/01/30(水) 21:25:54.58ID:yhwdEVRM0
あ,なんかしょーもないレスの仕様だけ書き込むのもアレだから
ちょっとしたことだけど……
C99の仕様だとfor文の条件の中で新しい変数が宣言できるけど
(新規のプロジェクトでは)積極的に使っていいと思う?
for (int8_t __cnt_foo; __cnt_foo < 42; __cnt_foo++) {
...
}
↑こういうの。
2019/01/30(水) 21:33:33.88ID:uDOSlsoAM
>>898
2cH.scか2ch.Netみてるんでしょ
2019/01/30(水) 21:35:32.25ID:lQux7EEV0
LINEの入社試験でC選んだけど
forの中などで宣言できる仕様になってた
cppやjavaでも使えるし使っていってええんじゃ

それにi,j,kってどうでもええ変数やから頭でも書く必要もないような
903デフォルトの名無しさん (ワッチョイ 3152-FxQn)
垢版 |
2019/01/30(水) 21:43:46.06ID:5GzTmkIQ0
反復文のブロック外で使わない変数を、反復文の外で宣言しなければならない今までの仕様がむしろおかしい。
あと中で宣言すれば変数名ijklmn,,,なんて自体も避けれる。多重ループでなければ。
2019/01/30(水) 21:53:53.32ID:fRt/VtGE0
for での変数宣言は // の単一行コメントと同じ程度には使うかな。

むしろ変数名が __cnt_foo なのが気になる。2つの下線で始まってる部分。

__cnt_foo を宣言だけして、初期化してないのも怖いなぁ。
でも、今お手元のgccで試したところ、エラーも警告も出ないんだね。


あと、これは投稿番号904になるつもりだが、実際どうかな?
2019/01/30(水) 22:37:01.37ID:yhwdEVRM0
>>904
ブラウザで見てるが,レス番号は904だ。
あと初期化は単に書き忘れただけw

「2つの下線で始まる函数や変数は局所使用」
って結構いろんなプロジェクトで(OSSでもたまに)
みかけるんだけど,変かしら。
2019/01/30(水) 22:48:12.86ID:HCwEhiL7a
>>905
処理系で予約されてるんじゃなかったかな
2019/01/30(水) 23:09:19.54ID:TJoXpOJw0
>>905
_で始まる変数やマクロは原則予約語で使う表記になるから控えた方が良いって話だったような
2019/01/31(木) 04:33:42.98ID:9oWu7LhB0
>>905
うん、変だ
下線2つで始めるのは衝突を最高レベルに警戒する場合の不自然なスタイルで
たいていはスコープが効かないマクロやビルトインで何かするときだ

何の変哲もない局所変数でそんなことするのはひねくれ者だ
2019/01/31(木) 04:59:33.42ID:aHTkbrhz0
素直にこう書けばいいんだよ

for (int i = 0; i < 42; i++) {
2019/01/31(木) 07:35:09.17ID:9oWu7LhB0
衝突を避けている識別子たちを、わざわざ追いかけていく、当たり屋みたいな奇行はよせ
2019/01/31(木) 08:34:51.69ID:ANKnOfTnM
>>905
それはコンパイラやライブラリのソースコードだったか目が霞んでたんじゃないか?
アンダースコア2つはどんな場所でも予約されている
2019/01/31(木) 10:01:39.25ID:2IY59Hh/0
わたしがスペシャル変数と呼んでる一連のアンダーバー付きの変数はプログラミング業界で取り返しのつかないほど広まってる
2019/01/31(木) 13:13:58.47ID:JEItRzDdM
Python「……」
2019/01/31(木) 16:20:12.34ID:2v9wwy3D0
世界統一変数名が必要なんだよね。でもあそこと、あそそこが悪さする。
2019/01/31(木) 16:52:59.91ID:hLsI8bIs0
スーパーグローバル変数「___________________GET!!!!!」
2019/01/31(木) 16:54:01.34ID:hLsI8bIs0
すまん$が抜けてた
2019/02/02(土) 19:10:56.37ID:6Psw+wcJ0
汎用大域ループカウンタを宣言しておけばええんや
2019/02/02(土) 22:15:48.72ID:5ka5WtNb0
CX
2019/02/03(日) 16:08:26.01ID:Z/smOlQY0
じゃぁ、変数名が I 〜 N で始まる場合は自動的に整数変数と見て、
宣言せずに使えるようにしよう。
2019/02/03(日) 17:48:04.65ID:JQdPtia00
もうちょっとボカしてくれれば面白いものを。
921デフォルトの名無しさん (ワッチョイ ff02-lvwX)
垢版 |
2019/02/03(日) 17:56:15.17ID:DVXBklBr0
>>919
昔そんな言語なかったっけ?言語と言うよりはそういう特殊仕様が実装された実行環境かな。なんとなくBASICとかであったような気がするんだが。
(もしかすると40年ぐらい前のマイコン用に作られた言語かも知れない。こういうのはバイト数減らすのに都合が良いから)
2019/02/03(日) 18:04:56.82ID:UmkqfD+A0
由緒正しきBASICはそもそも変数宣言なんていらん。
2019/02/03(日) 18:09:15.27ID:RfDSwLa60
BasicだとDEFINTなんてあったな
宣言無しで型が決まるのはもう少し古い言語だな
2019/02/03(日) 18:18:49.02ID:t4xt++QjH
>>922
DIM
2019/02/03(日) 18:42:43.82ID:v3/qMBNz0
>>921
Fortran だね
Cが教育課程に採用される前の言語
2019/02/03(日) 18:56:42.51ID:RfDSwLa60
I、J、Kをループ変数に使うというのは
その辺りからの伝統というかしきたりだったね
2019/02/03(日) 18:58:36.52ID:Q6V8DKqV0
>>921
FORTRANだろ
2019/02/03(日) 19:11:35.29ID:fibfEOKo0
ここの住民が言語作ったら良い言語できそうだな
あ、グローバル変数とvarとletは無しでお願いしますね
2019/02/03(日) 19:17:13.15ID:RfDSwLa60
変数使わない言語がいいな
930デフォルトの名無しさん (ワッチョイ ff02-lvwX)
垢版 |
2019/02/03(日) 19:22:06.40ID:DVXBklBr0
>>925>>927
あ、そうか。そういやそうだったね。すっかり忘れてた。
2019/02/03(日) 19:23:53.89ID:RfDSwLa60
「Fortran、再起動!」
「出撃!」
2019/02/03(日) 19:27:53.77ID:DdA3Wm74M
>>929
forthとか?
2019/02/03(日) 19:35:40.13ID:fibfEOKo0
>>929 じゃあ全部定数にしよう(暴論)
2019/02/03(日) 19:56:55.85ID:UmkqfD+A0
>>932
スタックも広義の変数なような?

llvmでは一度代入した変数は書き換えない(全て準定数)って聞いたけど、ループ変数なんか値書き換えないとやってられないような?
2019/02/03(日) 20:08:52.98ID:Q6V8DKqV0
>>932
流石にForthにも変数はあるよ
2019/02/03(日) 20:59:31.07ID:DdA3Wm74M
>>935
>>929は変数使わない言語って言ってるんで。
forthに変数が無いとは言ってないよ。
でもちょっとしたことなら全部スタックで済ましちゃうでしょ?そういう言語だし。
2019/02/03(日) 21:36:40.63ID:o+jOfHnE0
llvmにも書き換え可能なメモリを確保する命令はある。
それでループ変数を作っておいて、書き換え不可変数への置き換えは最適化におまかせする感じ。
2019/02/03(日) 22:05:11.19ID:Q6V8DKqV0
>>936
アスペ?
2019/02/03(日) 22:10:21.16ID:DdA3Wm74M
突然の自己紹介??
2019/02/04(月) 02:10:59.10ID:0dEMPpXZ0
最近
「私たちのアポロ計画」
という映画みたら、黒人のBBAがFortran使っててドヤ顔してたわw
Fortranごとき中高生でもできるのにね。
2019/02/04(月) 04:58:45.67ID:18M/gPzw0
>>939
ああ、単に煽りたいだけの人なのね
2019/02/04(月) 06:55:51.99ID:eH/He5cH0
もっとボカせばいいのに(しつこい)
2019/02/04(月) 08:07:42.85ID:01AVniBC0
>>920 (== 942) こういうネタを投稿するときは
どのくらいボカすか、ってさじ加減が難しいんだよ。

あからさま過ぎれば、知識の豊富な人には物足りないし、
おとなし過ぎると、何の話かサッパリ分からんって人が多くなる。
今回は間口を広げる方針、分かりやすさ優先だったと解釈してくれ。
2019/02/04(月) 10:30:19.38ID:BGg5R2c70
>>940
じゃあCは中高生には使えんとでも言いたいのか? おめでたいやつだな
2019/02/04(月) 10:51:20.21ID:958Z8DnZ0
#include <stdio.h>
#include <stdlib.h>
FILE *fp;
int c;
void main() {
fp=fopen("HOGE.LOG", "w");
fputs("このプログラムは何かまずい?まずいとしたらどうなる?",fp);
exit(c);}
2019/02/04(月) 11:05:37.79ID:BGg5R2c70
ばかでけえ釣り針だな
クジラでも狙ってるのか?
2019/02/04(月) 11:06:18.82ID:TOy5lCxb0
あーあ釣られちゃった
スレめんどくさくしないでね
2019/02/04(月) 12:51:43.30ID:i3TKqgTm0
速報 ワイ どこに釣り針が仕掛けられているのか分からず
2019/02/04(月) 13:17:46.57ID:7h07tci2x
釣り針にかかってみる。
main引数のvoidを省略するのは非標準なのでダメって話じゃないのん?
2019/02/04(月) 13:17:49.13ID:eH/He5cH0
>>948
cが初期化されてないんでしょ(鼻ホジ)
2019/02/04(月) 13:23:03.13ID:h1bt6e1C0
明示しなくても0に初期化されない?
2019/02/04(月) 13:44:12.81ID:eH/He5cH0
それはmain函数の戻り値の処理を省いても0が返る,みたいな危うさがない?
……知らんけど
2019/02/04(月) 13:46:18.98ID:h1bt6e1C0
気になる点
mainの引数指定がない
fopenが成功したかチェックしていない
fcloseしていない
2019/02/04(月) 16:13:18.04ID:BGg5R2c70
>>949
♪授業中あくびしてたら口がでっかくなっちまった〜
2019/02/04(月) 17:53:18.29ID:958Z8DnZ0
大域変数は、仕様上、0で初期化される事が保証されてる。
mainが実質的にintを返しているのと同じ状態、void指定からexit()によって値を返す形式も許容範囲内。
exit()は閉じてないストリームを閉じる処理も含んでいる。

mainの引数指定していないのは、GCCでも警告すら出ないで通った。
void指定したのと同一のコード吐き出すけど、これ本当に何かまずいの?
2019/02/04(月) 18:24:32.77ID:8k8r0y3l0
>>955
mainの引数なしはギリギリセーフ
戻り値なしはギリギリチョップ
2019/02/04(月) 18:49:29.84ID:jFZpHwREM
>>953
> fopenが成功したかチェックしていない
fputsもな
2019/02/04(月) 18:50:42.11ID:h1bt6e1C0
ううむ
セーフとか言う意味じゃ無く、
気持ち的に落ち着かないと
言った方が良いかな
2019/02/04(月) 19:00:36.55ID:CLpqTC7n0
個人的には
int main()
は許容範囲です、でも
void main(int argc, char **argv)
は許容できません

理由は、main() が接続(リンク)するスタートアップは、main() の内容がどんなものであれ変わらないから
スタートアップ(呼び出し側)が固定であるのならば、呼び出され側のシグネチャーも固定であるべきと考えます
スタートアップが仮定する引数と返り値を、main() が変えていい、とか考えられない暴挙だと思うのです

私がコンパイラを書くことが万が一あったとしたら、void main() はコンパイルエラーにします…
2019/02/04(月) 19:22:17.76ID:X0TXiuYZ0
>>959
前者はC99ぐらいから廃止予定だったけど後者は規格にちゃんとあるんじゃなかっただろうか?
961デフォルトの名無しさん (アウアウウー Saa3-d53M)
垢版 |
2019/02/04(月) 20:04:17.97ID:zvEiFsrUa
>>945
まずくないけど変な感じはする。
それと本当なら出力の最後に改行が必要なのではないか?
fclose()がないが、exit()するならその中でやられている筈。しかし自分でやった方が良いとは思う。
2019/02/04(月) 20:05:29.32ID:T5zgWCiB0
exit on free や exit on (f)close の臭いがする
2019/02/04(月) 20:28:02.23ID:CLpqTC7n0
>>960
引数の指定なし、は今でもありえるでしょうね、廃止予定とはきいていません
void main() は、ISO/IEC 9899/1999 5.1.2.2.1 にて陽に記述はありません
(ただし、or in some other implementation-defined manner. という注記はありますけれども)
2019/02/04(月) 20:29:04.76ID:jUExJMkq0
AVRやPICといったマイコンでの話。

符号付整数型を文字列に変換しようと思ってるんだけど
定番のsprintfはこれら8bitマイコンにはややメモリを食いすぎて実装するのは厳しい。

代わりにメモリの消費量が少ないitoaという関数を使おうかと思ってるんだけど
itoaよりさらにメモリを節約できる方法ってあったりする?
2019/02/04(月) 20:40:33.65ID:8k8r0y3l0
>>964
7行printf があったので、それを改造して使ってたな
自分だけが使う分には便利だった
2019/02/04(月) 20:50:44.05ID:MwdPLMKS0
>>964
3桁くらいなら、わり算と余りが使えるかも。
2019/02/04(月) 20:55:36.25ID:BGg5R2c70
>>959
その論法では()と(int, char**)が共存しえないな
2019/02/04(月) 20:58:12.71ID:01AVniBC0
>>945 は「行儀が(とても)悪いけど、明確な規格違反も含んでいない」っていう
引っ掛け問題なんじゃないか?
いくつか気になる点があって調べたけど、どれも規格違反とまでは言えなかった。

>>964
実際に不都合が発生するまではライブラリの関数を使うべし、
ってのがプログラミングの定石だけど、それは置いといて。
itoa() は標準関数じゃないみたいだから、独自ライブラリなら
関数のソースも付属してるんじゃないかな。
自分が使う数値の範囲が限定されるなら、付属ソースを参考に
専用の「数値→文字列」の変換関数を作るのも簡単かと。
(コードの著作権とかの方面は考慮してないので御注意)
2019/02/04(月) 22:30:53.53ID:jUExJMkq0
>>965
>>966
>>968
ありがとう、itoa関数よりもっとコンパクトな関数の自作に挑戦してみる(`・ω・´)
2019/02/04(月) 22:36:37.94ID:A8/6icsqd
int n = 123;
char a[4];
a[0] = '0' + (n / 100) % 10;
a[1] = '0' + (n / 10) % 10;
a[2] = '0' + (n / 1) % 10;
a[3] = 0;
2019/02/04(月) 22:42:47.31ID:jUExJMkq0
>>970
おお、なんか軽そう!
2019/02/04(月) 23:30:45.04ID:X0TXiuYZ0
割り算や剰余は8ビットマイコンでは重いのでBCD変換後4ビット毎に文字列化する方法もある。
高速なBCD変換はググれば出てくる。
973デフォルトの名無しさん (アウアウウー Saa3-d53M)
垢版 |
2019/02/05(火) 09:26:29.85ID:NCwCR2JIa
>>964
桁数固定で良いなら自分で下の桁から10で割った余りに'0'足して10で割るってのを桁数分だけ繰り返せば良いのでは?
974デフォルトの名無しさん (アウアウウー Saa3-d53M)
垢版 |
2019/02/05(火) 09:27:26.26ID:NCwCR2JIa
うう。リロードしたら答えが全て書いてあるではないか。orz
2019/02/05(火) 19:48:53.03ID:ksVxO8O00
https://mevius.5ch.net/test/read.cgi/gamedev/1028273462/

1 名前:名前は開発中のものです。[] 投稿日:02/08/02(金) 16:31 ID:GWrer4oY
C言語でゲームって作れるわけ?
あんなの文章表示させられるだけでしょ?


255 名前:名前は開発中のものです。[] 投稿日:2017/02/05(日) 09:12:26.60 ID:AoXQwlvR [1/2]
くっそ懐かしいスレまだあったのか建てたの高校生だった頃の俺やぞwww
ちな今銀行のATMのシステム開発技術者。なんてアホなスレ建ててたんだ俺は・・・



ちょっとジーンとしたw
2019/02/05(火) 20:36:40.97ID:4jJQIC2L0
2002年w
暇なのでログ読ませていただきますw
977デフォルトの名無しさん (ワッチョイ df01-zGAl)
垢版 |
2019/02/05(火) 21:10:30.19ID:or2LkC5v0
https://paiza.io/projects/ocopHn6TvkpJu4a--2xAig

初心者なんだが質問したい
もしスレチだったら無視してくれ

coding ground でやってたのだがコンパイルは通ったんだけど正常に実行されない。自分ではよくわからなかったので誰が暇な人いたら教えてほしい…
必要な情報あれば送る。
2019/02/05(火) 21:50:01.63ID:nQ1PAxEF0
>>977
文字列に改行文字がないのが原因では?
2019/02/05(火) 22:00:33.04ID:wHlrTA+U0
文字列は==では比較できない
#include <string.h>してstrcmp()を使いましょう
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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