46 :
デフォルトの名無しさん:05/02/15 04:12:21
出来るだけポータブルに書こうとすると避けて通れないわけで。
case文でbreakを忘れて酷い目にあった。
>>47 祈りなさい。
じゃなかった。
case/defaultの':'を書いたらすぐにbreak;を書く癖をつけてみるとか。
thruしたいロジックなんてめったに無いだろうからそれで充分。
switch () {...}の最後にbreak;がくるのが気に入らないならご愁傷様で。
break書かないときにwarningくらい出してほしいもんだな。
つ[lint]
>>49 switch (foo) {
case 0: /* こことか */
case 1:
return; /* こことか */
default:
...; /* ここで */
} /* いちいち警告出たら鬱陶しい。 */
goto使うようにすれば解決。
static void *code[] = {&&L1,&&L2, &&L3, ... &&Ln};
void**pc = code;
goto *pc++;
L1:
goto *pc++;
L2:
goto *pc++;
L3:
goto *pc++;
Ln:
goto *pc++;
VCで使えるようになればなあ・・
53 :
デフォルトの名無しさん:05/03/19 17:31:20
番兵法ってなんですか?
>>53 配列もしくはそれに準じるデータ構造において、末尾要素に値域外の値を格納しておき、
反復処理時に終了判定を簡潔にする方法
>>52 今の時代goto使ってる輩なんてアホ丸出し
>>55 時代に無関係にgoto使う人間は使うのだよ
57 :
デフォルトの名無しさん:2005/03/21(月) 12:54:47
C言語のヒープメモリの管理どうしてる?
おれはこういうの作ってるけど。
f() { //適当な関数
mem_t mem = memalloc(); //適当に確保したメモリ
handle_t handle = protect_attach(mem, memfree); // メモリを保護対象にする
//この区間でエラーが起きてもOK
mem = protect_detach(handle); // メモリ保護を解除する
memfree(mem); //メモリを開放
}
error_recv() { //エラー復帰処理
protect_rewind(); // ここでメモリを全て開放する
}
handle = protect_block(); // ブロックを保護対象にする
protect_attach(memalloc(), memfree);
protect_attach(memalloc(), memfree);
:
protect_rewind_block(handle);
でブロック単位で一気に開放したり。
時代がどうとかで判断する
>>55 が阿呆なのは
異論がないところだろうが、それはそれとしても
>>52 の
使い方は上を行く阿呆。
>>58 VMの実装とかではおなじみな手法だけど。
>>47 どこかで見かけたマクロ。
#define Case break; case
#define Default break; default
俺は真似したくないが…
>>61 ダメすぎマクロの典型だなぁ。
そのマクロを使うことで、その技術者はどんどんダメになっていくという…
#define CASE_EXEC(caseVal, func)case(caseVal):{func; break;}
みたいなのを作って、
switch(caseVal) {
CASE_EXEC(1, func1());
CASE_EXEC(2, func2());
}
こんなのはどうだろう。
>>64 どうだろうって、ダメダメに決まってるじゃないか。
>>64 Windowsのメッセージクラッカがそんなことをやっている。
WindowsX.hのHANDLE_MSGマクロがそう。
メッセージごとに関数の引数を変えられるよう、さらにHANDLE_WM_〜ってマクロを呼ぶようになっているが。
>>66 windowsx.h のマクロは SelectBitmap とか結構使ってるけど
メッセージクラッカは使ってないな。
どうもしっくりこなくて。
逆に俺はSelectBitmapの類いを使ったことは全然無いな。
マクロは便利だけど、マクロ使いすぎるとソース引き継ぎにくくなるな。
お前が会社と心中するつもりならそもそも引き継ぐなんて事態は発生しないから
大丈夫!
71 :
デフォルトの名無しさん:2005/12/17(土) 06:10:29
ここかな。
おまえら、観測不能なバグはバグじゃない。
これがプログラミングの正義だ。そうだな?
これまでにもハッカーは幾度となくprintfを改良し続け
ついにgccはコンパイル時にフォーマット引数を解析するまでに至った。
20世紀も末の事だ。
その日からだ。俺らは、街中で「lisp makes love'n'piece!」と叫んでも
なんら恥ずかしくは無くなった。
この成長は何によるものか?
愛があったからだ。
決してベラルーシの放射能混じりの、質の悪い "ベヴンズ・ブルー" のおかげでは /無い/。
# 新橋のイラン人め、妙なモノを売りつけやがって!告訴してやる!
そしたら、分かるだろ?
もうバッファがあふれるとかあふれないとか、そういう問題じゃない。な?
ゼロ除算は萌え。な?
バグは見えるもんじゃない。「魅せる」もんだって事だ。
愛だのなんだの、そんなこと言っても所詮は人間、
金が絡むと責任問題に発展するわ仕舞いにゃ人死にも出る
そのプログラム上でどれだけの金が動くか、
バグ1つにどれだけ金の重みが加わるか、
所詮それだけよ
segmentation とかの実行時エラー出されると、マジで嫌になる。
どっかでバッファオーバーフローしてるのを探すのは非常に大変。
入力するデータによってはバッファオーバーフローしてても正常な
出力が得られる場合もあって、これで見逃したりして非常に嫌だ。
漏れはこのせいで一日中デバッグにあたったことがある。
たかだか、一日中でそんなこというな。
プログラム作業は99%のバグ取りと、1%のアルゴリズム考案で出来ている
その手のバグを半年くらい様々に手をつくして対処したことがあったなあ。
ユーザーにもアミとか出して迷惑かけた。
/\___/ヽ
/ ::::::::::::::::\
. | ,,-‐‐ ‐ -、 .:::|
| 、_(・)_,: _(・)_, :::|
. | ::< .::|
\ / − ヽ ::/
/`ー‐--‐‐―´\
つい最近やっちまったこと。
とある関数内で、変数の名前を変えることにした。なお、その関数は10行もない。
だが、1箇所変数の名前を変え忘れていた。実は元の変数名はとあるグローバル変数にも使われていた。
そのためエラーにならずコンパイルできてしまい……。
書いてから思った、Cでなくても同じことやらかすことはできるなと。
以上チラシの裏。
まぁ、名前のぶつかりやすい一文字変数を避けようってこった。
まして、グローバル変数には意図的に長い名前をつけるくらいで丁度いい。
chk
test
test
test2
>1
>11
>>111
test1
何でスレが取得できないのでしょうか?
88 :
デフォルトの名無しさん:2006/10/13(金) 09:39:02
落ちそうなスレだけど、質問させて 下のコード、コンパイル出来るけど、
実行出来ません。誰かどうしてか教えて
#include<stdio.h>
#include<stdlib.h>
void initialize(int i,int j,int L,int grid[][L]); //initializes all the grids to zero.
main()
{
int L,p;
int i,j;
int grid[L][L];
printf("linear size of the square lattice L:->");
scanf("%d",&L);
printf("occupation probability p:->");
scanf("%f",&p);
initialize(i,j,L,grid);
}
void initialize(int i,int j,int L,int grid[][L]){
for(i=0;i<L;i++){
for(j=0;j<L;j++){
grid[i][j]=0;
}
}
return;
}
vc++EEでビルドしてみろ
>>88 >コンパイル出来るけど
またまたご冗談を (AA略
91 :
デフォルトの名無しさん:2006/10/13(金) 20:20:23
リンクするの忘れてるんじゃね?
スッゴイ簡単なプログラムなんで申し訳ないのだが教えてください。以下のプログラムを実行すると
http://i-bbs.sijex.net/imageDisp.jsp?id=test&file=1160750139347o.jpg この画像の黒い画面の一番右下のように表示されてしまいます
整数A:0
整数B:1
整数C:2
で0を出力させたいんだがわけのわかんない数字(ここでいうと整数Aは0の前の2、Bは1の前の2280676など)
が出てしまいます。しかもコノ場合0ではなく1が出力されてしまいます。
原因不明なのでどうか教えていただけないでしょうか?
#include <stdio.h>
int main (void){
int x,y,z;
int min; /*minは最小値*/
printf("3つの整数を入力してください。");
printf("整数A:%d");scanf("%d",&x);
printf("整数B:%d");scanf("%d",&y);
printf("整数C:%d");scanf("%d",&z);
min = z;
if (x < z) min = x;
if (y < z) min = y;
printf("最小値は%dです。\n",min);
return(0);
}
printfの使い方が間違ってる。
最小値の求め方も間違ってる。
あと
>>1読め。
#include <stdio.h>
int main (void){
int x,y,z;
int min; /*minは最小値*/
printf("3つの整数を入力してください。");
printf("整数A");scanf("%d",&x);
printf("整数B");scanf("%d",&y);
printf("整数C");scanf("%d",&z);
min = z;
if (x < min) min = x;
if (y < min) min = y;
printf("最小値は%dです。\n",min);
return(0);
}
>>93 スレ違いごめんなさい。あとすぐ教えてくれて有難う御座います!
いつもprintfの使い方が違ったからバグってたのか・・・。
使い方もちょっとおかしかったですねorz
これからは注意深くいきていきます
まじ感謝です!
>91
リンク以前に(狭義の)コンパイルができない