C言語なら俺に聞け 149
レス数が950を超えています。1000を超えると書き込みができなくなります。
//続き
//C:テーブルその1
const int table[2][3] = {{1,2,3},{2,3,1},};
const char *stbl[2][3] = {{"hoge1","hoge2","hoge3"},{"hoge2","hoge3","hoge1"}};
i = flag ? 0: 1;
func(PARAM1, PARAM2, table[i][0], stbl[i][0],table[i][1], stbl[i][1],table[i][2], stbl[i][2]);
//D:テーブルその2 順番が違うだけの場合だったらこれでもいける
const int table[3] = {1,2,3};
const char *stbl[3] = {"hoge1","hoge2","hoge3"};
int order[2][3] = {{0,1,2},{1,2,0}};
i = flag ? 0: 1;
func(PARAM1, PARAM2, table[order[i][0]], stbl[order[i][0]],table[order[i][1]], stbl[order[i][1]],table[order[i][2]], stbl[order[i][2]]);
//E:三項演算子 これは無駄に比較が多くなるから無しかも
func(PARAM1, PARAM2, flag?1:2, flag?"hoge1":"hoge2",flag?2:3, flag?"hoge2":"hoge3",flag?3:1, flag?"hoge3":"hoge1"); 個人的にはAが好きだけど
こういうの馬鹿にする人いそうなのが困る この範囲だけで言えば A が見通しが良くて分かりやすいんじゃないかな。
1, 2, 3 の並び方が(順列で)6通り存在するとか、
1 と "hoge1"... だけでなく、1 と "hoge2" の組み合わせも発生しうるとか、
func()の呼び出しパターンがもっと複雑だったら、
「flagの値に応じて適切な引数でfunc()を呼び出す関数」を作ると思う。
call_func(int flag, [func()に渡す引数]); みたいな感じ。
[func()に渡す引数] の部分を、カンマで区切った引数群にするか、
構造体にまとめるかは、別の要素が絡むので、強く主張できない。 俺なら次のようにする。
void *a[]={1,&"hoge1",2,&"hoge2",3,&"hoge3",2,&"hoge2",3,&"hoge3",1,&"hoge1"};
func(flag?a:a+6); >>875
その flag が 0 か 0 以外の値にしかならず 1 や 2 で違う動作になる事は未来永劫ない場合と、将来的になる可能性がある場合とでやり方は変えるかも知れない。
でも最初のやり方で良いんじゃないかな。あまり捻ると分かりづらくなるし。
flagの値によって何十通りもの違う呼び出しになるとかいうなら色々考えた方が後々良いのかも知れないが。 flagに1も2もあるかよ
Win32のGetMessageみたいなアホなケースはあるが 突然のステマ(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でかなり最近に開発されたおかげか挙動が素直 Username for Subversion luatex repository
とか入力を求められるけど、何やら登録が必要? >>889
ユーザー名: anonsvn
パスワード: anonsvn ていうかごめん。普通に匿名SVNであることを書き忘れてたわw こちらも Subversion の公開レポジトリでは anonsvn が一般的と知らなかった。
案内ページも表示されないんで完全会員制の秘密クラブの扉でも
ウッカリ開いてしまったのかと、少々慌ててしまった部分もある。 確かにAPIはスッキリしてるけど機能が少なすぎるね>>887
Poppler使うわ。 >>897
この板をPCのクロームで見てみて
レス数が903なのに、メイトでは897なんよね >>898
なんかNGしてるワッチョイでもあるんでは? あ,なんかしょーもないレスの仕様だけ書き込むのもアレだから
ちょっとしたことだけど……
C99の仕様だとfor文の条件の中で新しい変数が宣言できるけど
(新規のプロジェクトでは)積極的に使っていいと思う?
for (int8_t __cnt_foo; __cnt_foo < 42; __cnt_foo++) {
...
}
↑こういうの。 >>898
2cH.scか2ch.Netみてるんでしょ LINEの入社試験でC選んだけど
forの中などで宣言できる仕様になってた
cppやjavaでも使えるし使っていってええんじゃ
それにi,j,kってどうでもええ変数やから頭でも書く必要もないような 反復文のブロック外で使わない変数を、反復文の外で宣言しなければならない今までの仕様がむしろおかしい。
あと中で宣言すれば変数名ijklmn,,,なんて自体も避けれる。多重ループでなければ。 for での変数宣言は // の単一行コメントと同じ程度には使うかな。
むしろ変数名が __cnt_foo なのが気になる。2つの下線で始まってる部分。
__cnt_foo を宣言だけして、初期化してないのも怖いなぁ。
でも、今お手元のgccで試したところ、エラーも警告も出ないんだね。
あと、これは投稿番号904になるつもりだが、実際どうかな? >>904
ブラウザで見てるが,レス番号は904だ。
あと初期化は単に書き忘れただけw
「2つの下線で始まる函数や変数は局所使用」
って結構いろんなプロジェクトで(OSSでもたまに)
みかけるんだけど,変かしら。 >>905
処理系で予約されてるんじゃなかったかな >>905
_で始まる変数やマクロは原則予約語で使う表記になるから控えた方が良いって話だったような >>905
うん、変だ
下線2つで始めるのは衝突を最高レベルに警戒する場合の不自然なスタイルで
たいていはスコープが効かないマクロやビルトインで何かするときだ
何の変哲もない局所変数でそんなことするのはひねくれ者だ 素直にこう書けばいいんだよ
for (int i = 0; i < 42; i++) { 衝突を避けている識別子たちを、わざわざ追いかけていく、当たり屋みたいな奇行はよせ >>905
それはコンパイラやライブラリのソースコードだったか目が霞んでたんじゃないか?
アンダースコア2つはどんな場所でも予約されている わたしがスペシャル変数と呼んでる一連のアンダーバー付きの変数はプログラミング業界で取り返しのつかないほど広まってる 世界統一変数名が必要なんだよね。でもあそこと、あそそこが悪さする。 スーパーグローバル変数「___________________GET!!!!!」 じゃぁ、変数名が I 〜 N で始まる場合は自動的に整数変数と見て、
宣言せずに使えるようにしよう。 >>919
昔そんな言語なかったっけ?言語と言うよりはそういう特殊仕様が実装された実行環境かな。なんとなくBASICとかであったような気がするんだが。
(もしかすると40年ぐらい前のマイコン用に作られた言語かも知れない。こういうのはバイト数減らすのに都合が良いから) 由緒正しきBASICはそもそも変数宣言なんていらん。 BasicだとDEFINTなんてあったな
宣言無しで型が決まるのはもう少し古い言語だな >>921
Fortran だね
Cが教育課程に採用される前の言語 I、J、Kをループ変数に使うというのは
その辺りからの伝統というかしきたりだったね ここの住民が言語作ったら良い言語できそうだな
あ、グローバル変数とvarとletは無しでお願いしますね >>925>>927
あ、そうか。そういやそうだったね。すっかり忘れてた。 >>932
スタックも広義の変数なような?
llvmでは一度代入した変数は書き換えない(全て準定数)って聞いたけど、ループ変数なんか値書き換えないとやってられないような? >>935
>>929は変数使わない言語って言ってるんで。
forthに変数が無いとは言ってないよ。
でもちょっとしたことなら全部スタックで済ましちゃうでしょ?そういう言語だし。 llvmにも書き換え可能なメモリを確保する命令はある。
それでループ変数を作っておいて、書き換え不可変数への置き換えは最適化におまかせする感じ。 最近
「私たちのアポロ計画」
という映画みたら、黒人のBBAがFortran使っててドヤ顔してたわw
Fortranごとき中高生でもできるのにね。 >>920 (== 942) こういうネタを投稿するときは
どのくらいボカすか、ってさじ加減が難しいんだよ。
あからさま過ぎれば、知識の豊富な人には物足りないし、
おとなし過ぎると、何の話かサッパリ分からんって人が多くなる。
今回は間口を広げる方針、分かりやすさ優先だったと解釈してくれ。 >>940
じゃあCは中高生には使えんとでも言いたいのか? おめでたいやつだな #include <stdio.h>
#include <stdlib.h>
FILE *fp;
int c;
void main() {
fp=fopen("HOGE.LOG", "w");
fputs("このプログラムは何かまずい?まずいとしたらどうなる?",fp);
exit(c);} 速報 ワイ どこに釣り針が仕掛けられているのか分からず 釣り針にかかってみる。
main引数のvoidを省略するのは非標準なのでダメって話じゃないのん? >>948
cが初期化されてないんでしょ(鼻ホジ) それはmain函数の戻り値の処理を省いても0が返る,みたいな危うさがない?
……知らんけど 気になる点
mainの引数指定がない
fopenが成功したかチェックしていない
fcloseしていない >>949
♪授業中あくびしてたら口がでっかくなっちまった〜 大域変数は、仕様上、0で初期化される事が保証されてる。
mainが実質的にintを返しているのと同じ状態、void指定からexit()によって値を返す形式も許容範囲内。
exit()は閉じてないストリームを閉じる処理も含んでいる。
mainの引数指定していないのは、GCCでも警告すら出ないで通った。
void指定したのと同一のコード吐き出すけど、これ本当に何かまずいの? >>955
mainの引数なしはギリギリセーフ
戻り値なしはギリギリチョップ >>953
> fopenが成功したかチェックしていない
fputsもな ううむ
セーフとか言う意味じゃ無く、
気持ち的に落ち着かないと
言った方が良いかな 個人的には
int main()
は許容範囲です、でも
void main(int argc, char **argv)
は許容できません
理由は、main() が接続(リンク)するスタートアップは、main() の内容がどんなものであれ変わらないから
スタートアップ(呼び出し側)が固定であるのならば、呼び出され側のシグネチャーも固定であるべきと考えます
スタートアップが仮定する引数と返り値を、main() が変えていい、とか考えられない暴挙だと思うのです
私がコンパイラを書くことが万が一あったとしたら、void main() はコンパイルエラーにします… >>959
前者はC99ぐらいから廃止予定だったけど後者は規格にちゃんとあるんじゃなかっただろうか? >>945
まずくないけど変な感じはする。
それと本当なら出力の最後に改行が必要なのではないか?
fclose()がないが、exit()するならその中でやられている筈。しかし自分でやった方が良いとは思う。 exit on free や exit on (f)close の臭いがする >>960
引数の指定なし、は今でもありえるでしょうね、廃止予定とはきいていません
void main() は、ISO/IEC 9899/1999 5.1.2.2.1 にて陽に記述はありません
(ただし、or in some other implementation-defined manner. という注記はありますけれども) AVRやPICといったマイコンでの話。
符号付整数型を文字列に変換しようと思ってるんだけど
定番のsprintfはこれら8bitマイコンにはややメモリを食いすぎて実装するのは厳しい。
代わりにメモリの消費量が少ないitoaという関数を使おうかと思ってるんだけど
itoaよりさらにメモリを節約できる方法ってあったりする? >>964
7行printf があったので、それを改造して使ってたな
自分だけが使う分には便利だった >>964
3桁くらいなら、わり算と余りが使えるかも。 >>959
その論法では()と(int, char**)が共存しえないな >>945 は「行儀が(とても)悪いけど、明確な規格違反も含んでいない」っていう
引っ掛け問題なんじゃないか?
いくつか気になる点があって調べたけど、どれも規格違反とまでは言えなかった。
>>964
実際に不都合が発生するまではライブラリの関数を使うべし、
ってのがプログラミングの定石だけど、それは置いといて。
itoa() は標準関数じゃないみたいだから、独自ライブラリなら
関数のソースも付属してるんじゃないかな。
自分が使う数値の範囲が限定されるなら、付属ソースを参考に
専用の「数値→文字列」の変換関数を作るのも簡単かと。
(コードの著作権とかの方面は考慮してないので御注意) >>965
>>966
>>968
ありがとう、itoa関数よりもっとコンパクトな関数の自作に挑戦してみる(`・ω・´) 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; 割り算や剰余は8ビットマイコンでは重いのでBCD変換後4ビット毎に文字列化する方法もある。
高速なBCD変換はググれば出てくる。 >>964
桁数固定で良いなら自分で下の桁から10で割った余りに'0'足して10で割るってのを桁数分だけ繰り返せば良いのでは? うう。リロードしたら答えが全て書いてあるではないか。orz 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 レス数が950を超えています。1000を超えると書き込みができなくなります。