★ ANSI Cでいこうよ ★
■ このスレッドは過去ログ倉庫に格納されています
0001標準なおんなのこ
NGNG_/ ヽ _
/ , , ヽ ヽX 7ヽ、
i' / // / / | ヽヾ. 、 ヽ ヽX X ゝ
/| | | | |_⊥」| || | |.|」⊥_ | iミミ、X /
V| | || i|_⊥、W./ヽ|,|⊥_||ヽ|≡= x/
ヽNヽ| ,|し.j _|し.jl|` |T Τ7 / ̄ ̄ ̄ ̄ ̄ ̄ ̄
| |.{  ̄ .'_,  ̄ || | | ||+ヽ < あははー、ANSI Cでプログラムしませんか?
| | i\ .1 | | | || +| \_______
| | | i : エ エ :´ : | | | | ||++|
| _ | | |´  ̄只 ̄ ヽ| | |_| ||++|
/ || | ノ || ヾ | | | ヽ| |++|
| || |- ´ i | | i `ー| | | | ||++|
| | | | | .| | | | | | || ̄
標準規格限定です。
標準ライブラリ、STLなどなど
MFC,VCLなどは禁止です
0002デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNG葉鍵板に逝け。
それから、数式プログラムを組むときはだいたいCのみで書くよ
0004デフォルトの名無しさん
NGNGむしろ葉鍵版からきたと思うが・・。
0005デフォルトの名無しさん
NGNGこれって何のキャラ?
0006デフォルトの名無しさん
NGNG「Plain C」限定でプログラムしま(?
0007デフォルトの名無しさん
NGNG0008デフォルトの名無しさん
NGNGシステムコールは使ってもヨィですか?
0009デフォルトの名無しさん
NGNGインラインアセンブラもつかっていいの?
0010デフォルトの名無しさん
NGNG0011デフォルトの名無しさん
NGNG0012デフォルトの名無しさん
NGNG0013デフォルトの名無しさん
NGNGCでそれをやると、なんぼ処理をしても
(その処理自体もロクなのが書けないだろうが)
その情報を入出力する手段が
いっさい無いことになるぞ。
君のディスプレイは真っ黒なままだ。
見た目、なにも動いていないのと等価だ。
それをプログラムと呼ぶのは完全に自己満足。
なにせ誰にも動いていることが「わからない」のだから。
0014デフォルトの名無しさん
NGNG0015デフォルトの名無しさん
NGNG{
printf( "はろーわーく\n" );
}
0016デフォルトの名無しさん
NGNGplain Cで次のはできるんだろ?
int (*sys)() = (int *)0x00hogehoge;
0017しつもんしつもーん!
NGNG0018デフォルトの名無しさん
NGNGJISハンドブックを読め。
無理してANSIの規格書を読んでも無意味。JIS X3010は2nd Edition(C99)には対応
してないけど、それ以外なら日本語で読める。それに日本ではJISこそが標準であって、
ANSIなどどうでもよい。
0019デフォルトの名無しさん
NGNG無知(>>13)は相手にするな。
入出力などplain Cですべて書ける。一番厄介なのは、ブート時のスタック
ポインタの設定とか、割り込みベクタの記述とかだろ。
これを処理系に依存しない規格合致プログラムとして書くことはまず不可能。
0020デフォルトの名無しさん
NGNGそれって、入出力はライブラリを使わなくても、環境依存しないで
かけるってこと?
0021デフォルトの名無しさん
NGNGどっかでやってた話だな・・・結論から言うと、
環境に依存するものならライブラリ使わなくても書ける。
0022デフォルトの名無しさん
NGNGじゃ、19は無知ってことで。
002317>18
NGNG0024デフォルトの名無しさん
NGNGいや、そんなことはないよ。
環境に依存するもの=移植性の低いもの
ならライブラリを使わなくてもプレーンで書ける
って感じ(大爆笑)
0025デフォルトの名無しさん
NGNGISO Cって言え
002617
NGNG0027デフォルトの名無しさん
NGNG0028デフォルトの名無しさん
NGNG0029デフォルトの名無しさん
NGNG0030デフォルトの名無しさん
NGNG誰も「ISO C」とか「JIS C」なんて言わないよね。
0031デフォルトの名無しさん
NGNG0032デフォルトの名無しさん
NGNG入出力に割り込み命令使わなきゃいけない環境とかはどうするの?
0033デフォルトの名無しさん
NGNGなんとでもなるだろ
003432
NGNGインラインアセンブラ使わずに、しかもライブラリなしでだよ?
0035デフォルトの名無しさん
NGNGインラインアセンブラはいるかもね。
なくてもいけそうな気はするけど。
ライブラリはなくてもいいだろ。
0036デフォルトの名無しさん
NGNG0037>36
NGNG0038デフォルトの名無しさん
NGNG神・・・そう、神の領域
0039ワラ
NGNG0040デフォルトの名無しさん
NGNG0041デフォルトの名無しさん
NGNGunsigned char foo[] = {
0x80, 0x3f, 0x00, /* foo: cmp byte ptr [bx],0 */
0x74,0x06, /* jz done */
0x80,0x07,0x20, /* add byte ptr [bx],32 */
0x43, /* inc bx */
....
}
int (*sys)() = (int *)foo;
ってな感じでやればインラインアセンブラいらんぞ。
機種依存だがANSIは満たしているだろ?
割り込みベクタの設定も、割り込みルーチンも
この中で設定すればよろしい。
0042デフォルトの名無しさん
NGNG0043デフォルトの名無しさん
NGNGアホみたいな疑問ですまないんだけど、どこが満たしてない?
単なるバッファを関数とみなして呼び出しているから?
それって違反事項なんだっけ?
いけない という記述が見当たらないので。
004442じゃないが、
NGNGANSIを満たしているといえるのだろうか?
0045デフォルトの名無しさん
NGNGというかANSIはそんなことを規定しない
*(*int)0 = 0
だってもちろん合法
0046デフォルトの名無しさん
NGNG>int (*sys)() = (int *)foo;
もちっと関数へのポインタを勉強したほうがいい。
0047デフォルトの名無しさん
NGNG>>45の
*(*int)0 = 0
が全くわかりません。教えてください。
004845じゃないけど
NGNG多分こうしたかったんだろう>47
int *p = 0;
*p = 0;
と同じ事
0050デフォルトの名無しさん
NGNG判断するための関数は、Selectでよいのでしようか?
また、UNIXソケットのselectと、WinSockのSelectの使い方
は同じでよいのでしようか?
0051デフォルトの名無しさん
NGNGどちらもselectで良い。
使い方は両方ともほぼ同じ。
windowsの場合、非ブロッキングI/Oを使ったより効率の良い
方法があるけど、ロジックが面倒になるので知るのは後回しで良い。
後はsocket selectで検索。
0052デフォルトの名無しさん
NGNGhttp://piza.2ch.net/test/read.cgi?bbs=tech&key=970344582&ls=100
0053標準なおんなのこ
NGNGいまMFCでプログラム作っても2・3年後位にゴミになりそうで欝なんですっっ(涙
長く使える技術を習得しよう!
0054デフォルトの名無しさん
NGNG0055デフォルトの名無しさん
NGNG0056デフォルトの名無しさん
NGNG0057デフォルトの名無しさん
NGNG0059デフォルトの名無しさん
NGNGあとSTLの勉強もしたい
0060デフォルトの名無しさん
NGNG0061デフォルトの名無しさん
NGNGもしかしてassertのこと?
Visual C++のASSERTなら論外。
0062デフォルトの名無しさん
NGNGただ吠えたかったのか 藁
0063いまいちassertの使い方がわからない名無し
NGNGなんで?
ドキュンなんでassertとASSERTの違いを知りません。教えてください。
0064デフォルトの名無しさん
NGNGでも大切なことに気付かせてくれた上に
その疑問も後の応答で解決したので
こういうボケも2chでは大切なのかも。
006561
NGNGまず、ASSERTはassertと違って標準Cの規格外だということ(Microsoftの独自拡張)。
実用面では、assertは評価式が出力されるけど、ASSERTはファイル名と行番号しか出力
されない。
ASSERTについてしか触れていない本は、大抵MFCを対象としたものばかりで、その段階で
良書は少なくなる。
006644
NGNGANSI準拠のコードは可搬性があるとは言えないという結論でよいのか?
0067デフォルトの名無しさん
NGNGあたりまえだけど、
ANSI準拠でも処理系に依存したコードを書くと移植性はなくなります。
0068デフォルトの名無しさん
NGNG0069デフォルトの名無しさん
NGNGかなりあるよ。
知っている範囲で最も紛らわしいのは、tmpnamと_tempnam関数。
名前も仕様も非常に紛らわしい。
POSIX規格とMicrosoftの独自拡張の間はさらに紛らわしい。
あと、C++ならISO規格のexportとMicrosoftの__exportとか。名前は似て
いるけど、用途は全く異なる。(現在は__declspecを使うから少しましかな)
007169
NGNGそれに、最も紛らわしいのはswprintf関数だった。
ISO規格: int swprintf(wchar_t*, size_t, const wchar_t*, ...);
Microsoft: int swprintf(wchar_t*, const wchar_t*, ...);
0072デフォルトの名無しさん
NGNGwarningは出てもstrict-ansiでコンパイルできるぞ?
0073デフォルトの名無しさん
NGNGこれはMicrosoftの方が自然だと思う
snprintfがある処理系って結構あるし
0074デフォルトの名無しさん
NGNGオブジェクト型のポインタと関数型のポインタにはそもそも互換性が全く
ない。
どんな処理系を使ったのか知らないが、規格合致処理系であれば、確実に
エラーになる。
どうしてもオブジェクト型のポインタから関数型のポインタにキャストし
たいのなら、
int (*sys)() = (int(*)())(int)foo;
のような感じで、いったん整数型を介さないといけない。
007571
NGNG自然かどうかより、sprintfの問題点(バッファのサイズを指定できない)を
持ち越さないために、Amendment1で追加されたswprintfはsize_t型の引数を
渡すようにしたはず。
それをchar文字列版に適用したsnprintfがC99で追加された。
つまり、安全面からすれば、Microsoftの仕様はsprintfと同じ問題点を持って
いることになる。しかも非標準。
もっとも、Microsoftのwchar.hは、C++でしかコンパイルできないし、
__STDC_VERSION__マクロが定義されないことからしても、Amendment1に対応し
ていないと見るべきなのかもしれない。
0076デフォルトの名無しさん
NGNG0077デフォルトの名無しさん
NGNGANSI CとC++を勘違いしてないか?
007871
NGNGMicrosoftのライブラリには、swprintfも_snwprintfもあるよ
size_tを受け取るsnprintfが標準仕様に追加されたのなら、
swprintfがsize_tを受け取るのは明らかに変だと思うのだが
007971
NGNGMicrosoftの処理系を使っていると、wsprintfや_stprintfからの類推で
あたかもswprintfがsprintfと対応する関数のような錯覚を起こしがち。
実際に対応するのはswprintfとsnprintfであって、sprintfワイド文字列
版は存在しない。sprintfは前述のような問題点があるので、過去のコード
との互換性のためだけに今後は存続すると見た方がよいのでは。
それから、紛らわしいので、人の名前を勝手に名乗らないように。
0080デフォルトの名無しさん
NGNG結局ANSIもK&Rと同じ穴の狢だったか。
0081デフォルトの名無しさん
NGNGどうでも良いが、処理系依存のコードを書くのに、
ANSIに準拠したコードを書く意味はあるのか?
>>41
>インラインアセンブラいらんぞ。
アドレスの参照が、限りなく面倒。
mov ebx,dword ptr [_table] ;等々
それでも、それをやった場合、コンパイラを使う意味は何処にある?
よって、インラインアセンブラは必要。
0082デフォルトの名無しさん
NGNG>どうでも良いが、処理系依存のコードを書くのに、
>ANSIに準拠したコードを書く意味はあるのか?
禿げしく同意。
しかし、完全な合致プログラムは命がけ!
008378
NGNG別にそれを使う使わないの問題じゃなくて
標準仕様の方が変じゃない?って言ってるだけ
だって、類推すると、snwprintfになるわけでしょ?
確かにsprintf自体がgetsと似た問題をはらんでる
わけだし、それ自体を変えたいのかなとも思うけど。
だからと言って、wsprintf->snprintfのワイド版
ってのは誤解を招く結果になるだけじゃないかな?
スマソ…バンゴウマチガエタ…イッテキマス
0084デフォルトの名無しさん
NGNG_snwprintf()
wsprintf()
等はANSI以外のところで勝手に作られた関数。
話がややこしくなるので持ち出すのはやめよう。
0085関数名無しエラーさん
NGNGってことでいいのかな?>1は。
ところで、gccやmsvcやbccとか、
最近?の処理系って皆対応してると考えていいの?
まあ、細かい所は色々解釈の違いがあるのかな?
0086デフォルトの名無しさん
NGNGANSIって
解釈の違い=処理系に依存していること
どうコンパイルすべきか決められない事態=未定義の仕様
って感じのごまかし方だったような…
0087デフォルトの名無しさん
NGNG普通の言語っぽくしたところはANSIの功績だと思うけど、
K&R互換を残したのが結果としてユーザーの不利益になった
と思う。C++程度の型の強さをあの時点で導入していたら
(OOじゃなくてね)ずいぶん世の中見とおしがよかったと
思うんだけどな。
0088デフォルトの名無しさん
NGNGあんましsprintf使ってないからわからん。
0089デフォルトの名無しさん
NGNGwsprintfはWindowsでしか使えないのと、対象となる型がTCHAR配列。
sprintfはホスト環境規格合致処理系なら必ず使えて、対象となる型が
char配列。
細かなことを言えば、wsprintfはエラーが発生したときにGetLastError
で原因を調べられるとか、C99に処理系が対応した場合には、sprintfを
使わないとlong long型を扱えなくなるとか。
0090デフォルトの名無しさん
NGNG0091デフォルトの名無しさん
NGNG009289
NGNG一口に規格合致処理系といっても、フリースタンディング環境もあるから、明示的に
ホスト環境といっているだけ。要は、パソコンやワークステーションのようなフル
セットのOS上で実行させるような環境がホスト環境。組み込み機器のようにOSなしで
実行させるような環境がフリースタンディング環境。
フリースタンディング環境では、stddef.hやlimit.hなどいくつかのヘッダはあるも
のの、ライブラリ関数は標準では一切サポートされない。
0093デフォルトの名無しさん
NGNGしかし、合致プログラミングってやればやるほどキリがないよ。
例えば1バイトが8ビットじゃないかもしれないって規格書には書いてあるよ。
そんな、殆どありえないような環境まで面倒みきれないのが現実。
合致レベルを設けてどこまでやるかの線引きをするか、
カテゴリ分けをしてカテゴリ間の互換性に制限を付けるか
して欲しいよ。
0094デフォルトの名無しさん
NGNGACOS-6だと恐らく9ビット下手したら6ビットだよ。
ありえないなんてことなく現実にそれなりに使われているマシンで
そういうことがある。
だから「その処理系でもっとも効率の良い語をintにする」なんて
言語で互換性うんぬんするのがそもそも間違いではなのか?
0095デフォルトの名無しさん
NGNGこれだからJavaが流行るんだよな。
0096デフォルトの名無しさん
NGNG>ホスト環境規格合致=ANSI規格合致ってことっすね。
これは違う。ANSI規格合致処理系には、ホスト環境規格合致処理系と、
フリースタンディング環境規格合致処理系の2種類があるということ。
>>94
CHAR_BITは8以上と定められているので、1バイト=6ビットの処理系は
非標準。
最も効率の良い型をintにするのは、特に互換性の妨げにはならない。
最低限の範囲が-32767〜+32767と規定されているので、その範囲内で
使えばよいだけのこと。
どうしてもサイズに依存するときは、stdint.hで定義されるint32_t
とかを使えばよい。
0097デフォルトの名無しさん
NGNGその範囲内で使えというのは現実問題として無理だろ。
実質互換性がないことの反証にはならないぞ。
009896
NGNGそれは単なるスキル不足。
0099デフォルトの名無しさん
NGNG分かっていないな、個人のスキルに依存する方法で
互換性を保つという方法論そのものがだめだっていってるんだよ。
世の中に出まわっているソフトを>>96の言うような整数の範囲に
変更できるか?
010096
NGNG移植性のあるコードを書くのは、そもそも相応のスキルが要求されるはず。
元々スキルの低い人間の手によるものや、移植性を考慮していないもの、
非標準の処理系を用いて作成されたものを、後から変更することなどは、
対象にしていない。
どんなにスキルの低い人間がプログラムしても互換性を保てるような言語
は、所詮大したことはできないよ。
0101デフォルトの名無しさん
NGNGそもそもこれ自体現実的な制約ではないから、スキルがあれば
OKとはならないんだよ。整数をこの範囲に保ってコードを
書いてあるプログラムがどれだけあるのか。
非現実な範囲でしか移植性のない言語は言語仕様に問題がある。
■ このスレッドは過去ログ倉庫に格納されています