だからCで画像うんぬんは無理があるのよ。 Javaにしなさい。パッケージawtのGraphicsクラスのメソッド g.drawImage(im,50,50);で一発で出るのよ。(imはImageで初期画済みね!gもGraphicsで) コード全部で10行いかないわよ。
4 :
デフォルトの名無しさん :03/05/10 14:03
5 :
デフォルトの名無しさん :03/05/10 14:04
6 :
デフォルトの名無しさん :03/05/10 14:11
>>979 あんたなに言ってのよ!
fgetsはファイルから1行読み込むのよ。
char *str;
int flag=0;
do{
if(flag==1)
printf("もう一度入力しろアホ");
gets(str);
if(10<(strlen(str)))
break;
flag=1;
}while(1);
まったくJava嫌いの人はどっかいっちゃったの?
>6
>fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。 >fgetsはファイルから1行読み込むのよ。
ファイルというかストリーム stdinもストリーム
> char *str; > gets(str); 何ヤってんの?
>>11 えっ!?
Javaなんか知らないけど(^_^;)
ま た J a v a 厨 か
15 :
デフォルトの名無しさん :03/05/10 14:18
あらやだ。 char str[10];じゃない getsは文字配列に格納よ(*^_^*)//
どうやったらfgets()がファイルからの読み込みって言う考えをもてるのやら。
17 :
デフォルトの名無しさん :03/05/10 14:23
で、Windows2000で動くリンカーは?(^o^*)
ああ。fgetsのfってfileのfだったっけ?
19 :
デフォルトの名無しさん :03/05/10 14:25
ほかになにがある
20 :
デフォルトの名無しさん :03/05/10 14:25
float
>>15 10文字以上の場合どうなるんだ
阿呆か馬鹿か
22 :
デフォルトの名無しさん :03/05/10 14:27
>>16 なに言っての?fgetsはファイルポインタに関連ずけられたファイルから文字列を
読むのよ!
FILE *fp:
char str[10];
fopen("AHO.txt","r");
fgets(str,80,fp);
fclose(fp);
こうやって使うのよ!
fabs - ファイルから数字を読み込み、絶対値を返す。
> 関連ずけ > 関連ずけ > 関連ずけ > 関連ずけ > 関連ずけ は、いいとして、 > char str[10]; > fgets(str,80,fp); またか
ファイルストリーム、もしくはファイルハンドルと呼ぶと思うが ファイルポインタというと現在操作している位置の事だよな
>>26 俺はFILE *のことをファイルポインタと読んでいるけど、違うのか?
Perlだったらファイルハンドルというけど。
ANSI C言語辞典では走査位置をファイル位置指示子 FILE* をファイルポインタとして区別してたな。規格的にはどう 表現されているんだろう。
ファイルハンドルは非ANSIのopenのヤツなどとまぎらわしいので却下
30 :
デフォルトの名無しさん :03/05/10 14:35
あらまたやっちゃった。 fp=fopen("AHO.txt","r"); じゃないとfclose();の引数がダメね!
>>29 openの場合はファイルディスクリプタじゃないか?
>>30 その前にfgetsだろ
>>31 >openの場合はファイルディスクリプタじゃないか?
確かに…
当方DOS->Winなもので
>>34 DOSだとファイルハンドルと言うのか。
スマソ UNIXだと決めつけていた
36 :
デフォルトの名無しさん :03/05/10 14:46
ハンドルでもポインタでもなんでもいいよ
そうそう。要は読み書きできればいいの。
ハンドルは0以上の数字であり。ファイルポインタは機械固有の 値だな。
パスワードをがあっているかどうかの判断の時ですが(因みにパスワードはnekoです) char pw[80]; gets(pw); if(!strcmp("!neko",pw))printf("正解"); で出来るのですが、文字列の比較はstr系を使うしかないのでしょうか? 数字でしたら if(pw==30)とか出来ますが。
memcmpでもいいし文字コードがわかっているなら一バイトずつ比較してもいい。 でも "!neko"と比較してたらだめだろう。
あ、間違えました(--; char pw[80]; gets(pw); if(!strcmp("neko",pw))printf("正解"); ですね どうもありがとうございました。
>>43 ==で判定したいのならC++とかでやるしかない
マテマテマテ
>>45 読み込みにgets()を使うのはやめれ
しかもパスワードを読み込むような用途って・・。
fgets(pw,sizeof(pw),stdin)を強くお薦め
いいだろ別に、それをそのまま使うってわけでもねぇんだし、 例えとして出しただけだろ! おまいはここにコード書くときも いちいちエラーチェックまで入れたのを 書けってのかよ
>>48 逆切れすんな。
お前が書いたコードを見た奴が真似しちゃうかもしれないだろ?
そういう奴のためにも>47のように補足しておくのは悪いことじゃねーだろ。
当方のlvが低いため付いて言ってませんが、 とりあえずmemcmpなる物を使って同じのを作ってみました。 #include <stdio.h> #include <string.h> int main(void) { char pw1[80]; char pw2[]="neko"; printf("パスワード: "); gets(pw1); if(!memcmp(pw1, pw2,4)) printf("正解\n"); else printf("不正解\n"); return 0; } これで出来ましたが、memcmp内のcountの4を10にすると動きませんでした。 ご指摘宜しくお願いします。
ちなみに4から8まではうまく動きました。 >46さん まだC++は触った事がないです(笑) >47さん 参考書の例題のようなモノですので大丈夫です。 fgetsも初耳ですが使って見ようと思います。
>>51 > ちなみに4から8まではうまく動きました。
これは、たまたま。
というか、なぜ memcmp() なんか使うんだ ?
素直に strcmp() 使うべき。
できれば平文はやめた方がいいよ。。。
fgets苦戦中(--; >52さん なるほどたまたまですか。 確かにこの場合はstrcmpのが用途に合ってますね。 どうもありがとうございます。 >53さん 平文の意味も知りませんでした^^; 勉強になりました。 fgets苦戦中(--;
strcmpは文字列の終りを認識してそれ以降の比較はしないけど memcmpはcountであたえたサイズを無条件で比較するため。 結果はpw1、pw2の未初期化部分に何が入っていたかに依存してしまう。 fgetsは単にgetsと置き換えるだけで動作しない?
#include <stdio.h> #include <string.h> int main(void) { char pw[256]; printf("パスワード: "); fgets(pw,sizeof(pw),stdin); if(!strcmp(pw,"neko"))printf("正解\n"); else printf("不正解\n"); return 0; } ダメでした(;´Д`) とんでもない勘違いをしていたら恥ずかしい。
末尾の改行を取り除く処理はした? getsと違ってfgetsは改行も書き込むから。
void chomp(char *str) { if(!*str) return; str+=strlen(str)-1; if(*str=='\n') *str='\0'; }
voidだからって最後にreturnを書かないやつは非国民
>57さん できましたー! #include <stdio.h> #include <string.h> int main(void) { char pw[256]; printf("パスワード: "); fgets(pw,sizeof(pw),stdin); if(!strcmp(pw,"neko\n"))printf("正解\n"); else printf("不正解\n"); return 0; } 取り除かないで付け加えましたが(;´Д`) ありがとうございました。
>57さん すみません。 私にとっては意味不明なsrcだったので関係無いかと思いました^^; #include <stdio.h> #include <string.h> void chomp(char *str); int main(void) { char pw[256]; printf("パスワード: "); fgets(pw,sizeof(pw),stdin); chomp(pw); if(!strcmp(pw,"neko"))printf("正解\n"); else printf("不正解\n"); return 0; } void chomp(char *str) { if(!*str) return; str+=strlen(str)-1; if(*str=='\n') *str='\0'; } これでうまく動きましたー お手数おかけしました。 ありがとう(T-T
こうやって比べてみると >61のほうが(・∀・)イイ!
マジレスすると getsよりfgetsと同じように strcmpよりstrncmpなんだけどね
strncmp だと nekomimi でも正解じゃぁねぇか。
(゚Д゚)ハァ?
>>65 > strcmpよりstrncmpなんだけどね
何でや !?
とりあえず、n の値はどうするのか聞きたい。
この場合は257にしといたらいいんでない
71 :
デフォルトの名無しさん :03/05/11 01:09
>>67 そのハァ?はどの書き込みへのレスなんだ?
こんなソフトはいやだ。 ・パスワードが平文で実行ファイルに格納されている
>70 よく見てなかったこのばやい5?
74 :
デフォルトの名無しさん :03/05/11 01:15
75 :
デフォルトの名無しさん :03/05/11 01:26
ページを見ただけで、何日か後にハードディスクが消去されるようなスクリプトってあるんでしょうか? あるページをみたら警告文で書いてあったのでおしえてください。
CGIスクリプトの場合、例え平文でもパスワードが見れないわけだから問題ないよ。
>>75 セキリュティホールをうまくつけば可能かもしれませんね
Index of /cgi-bin . .. checkpasswd chuumon_form.cgi kanri_form.cgi kokyaku_data.dat
1+1=2 ハァ? 1+1には代入できないだろ。 と思うようになってしまった。
crypt〜
>>80 漏れは
1+1=2
ハァ? 1+1 =:= 2 だろ? と思うようになってしまった。
それよりabがa*bだってのに違和感を覚えるようになった。。。
「猫でもわかる〜」の24章、38章でサイコロの目を二つ乱数で出すところがあるんですが、 int main(void){ ..... srand((unsigned)time(NULL)); me1 = saikoro(); me2 = saikoro(); .... } int saikoro(void){ return (rand() % 6 + 1); } だと二つバラバラで出るんですが、 int main(void){ ..... me1 = saikoro(); me2 = saikoro(); .... } int saikoro(void){ srand((unsigned)time(NULL)); return (rand() % 6 + 1); } だとゾロ目になります。 どうしてこのような違いが出るのでしょうか?
>>84 srandの引数が同じなら、その後の乱数列は同じものが出るから。
単に乱数が欲しいだけなら、srandはプログラム起動時に1回だけ実行するように。
typedef struct{double x,y,z}vec;vec U,black,amb={.02,.02,.02};struct sphere{ vec cen,color;double rad,kd,ks,kt,kl,ir}*s,*best,sph[]={0.,6.,.5,1.,1.,1.,.9, .05,.2,.85,0.,1.7,-1.,8.,-.5,1.,.5,.2,1.,.7,.3,0.,.05,1.2,1.,8.,-.5,.1,.8,.8, 1.,.3,.7,0.,0.,1.2,3.,-6.,15.,1.,.8,1.,7.,0.,0.,0.,.6,1.5,-3.,-3.,12.,.8,1., 1.,5.,0.,0.,0.,.5,1.5,};yx;double u,b,tmin,sqrt(),tan();double vdot(A,B)vec A ,B;{return A.x*B.x+A.y*B.y+A.z*B.z;}vec vcomb(a,A,B)double a;vec A,B;{B.x+=a* A.x;B.y+=a*A.y;B.z+=a*A.z;return B;}vec vunit(A)vec A;{return vcomb(1./sqrt( vdot(A,A)),A,black);}struct sphere*intersect(P,D)vec P,D;{best=0;tmin=1e30;s= sph+5;while(s-->sph)b=vdot(D,U=vcomb(-1.,P,s->cen)),u=b*b-vdot(U,U)+s->rad*s ->rad,u=u>0?sqrt(u):1e31,u=b-u>1e-7?b-u:b+u,tmin=u>=1e-7&&u<tmin?best=s,u: tmin;return best;}vec trace(level,P,D)vec P,D;{double d,eta,e;vec N,color; struct sphere*s,*l;if(!level--)return black;if(s=intersect(P,D));else return amb;color=amb;eta=s->ir;d= -vdot(D,N=vunit(vcomb(-1.,P=vcomb(tmin,D,P),s->cen )));if(d<0)N=vcomb(-1.,N,black),eta=1/eta,d= -d;l=sph+5;while(l-->sph)if((e=l ->kl*vdot(N,U=vunit(vcomb(-1.,P,l->cen))))>0&&intersect(P,U)==l)color=vcomb(e ,l->color,color);U=s->color;color.x*=U.x;color.y*=U.y;color.z*=U.z;e=1-eta* eta*(1-d*d);return vcomb(s->kt,e>0?trace(level,P,vcomb(eta,D,vcomb(eta*d-sqrt (e),N,black))):black,vcomb(s->ks,trace(level,P,vcomb(2*d,N,D)),vcomb(s->kd, color,vcomb(s->kl,U,black))));}main(){printf("%d %d\n",32,32);while(yx<32*32) U.x=yx%32-32/2,U.z=32/2-yx++/32,U.y=32/2/tan(25/114.5915590261),U=vcomb(255., trace(3,black,vunit(U)),black),printf("%.0f %.0f %.0f\n",U);}/*minray!*/
90 :
デフォルトの名無しさん :03/05/11 11:22
>>87 Linux+gccで通ったぞ。多少警告はでたが。
そのままじゃ通らないだろ 2行めirの後に;、コンパイル時に-lm。 しかし問題はこれが何なのかなのだが・・・
irの後にセミコロンってネタですか?
おいおい
91 名前:デフォルトの名無しさん :03/05/11 11:36
2行めirの後に;、コンパイル時に-lm。
91 名前:デフォルトの名無しさん :03/05/11 11:36
2行めirの後に;、コンパイル時に-lm。
91 名前:デフォルトの名無しさん :03/05/11 11:36
2行めirの後に;、コンパイル時に-lm。
91 名前:デフォルトの名無しさん :03/05/11 11:36
2行めirの後に;、コンパイル時に-lm。
>>91 = 犬厨 = 知ったか君
うわっ、このスレ犬臭え
なんでそこで犬(linux?)が出てくるのかわからん。
linux厨のことを犬厨って言うのか?
漏れも犬厨は嫌いなんだけど、 みんなは犬厨のどんなところが嫌い?
技術もないくせに偉そうなところ
>>92-94 自分でやってみもしないアフォばっかりか...
test.c:1: warning: no semicolon at end of struct or union
test.c:2: warning: no semicolon at end of struct or union
test.c:2: warning: missing braces around initializer
test.c:2: warning: (near initialization for `sph[0]')
test.c:5: warning: type defaults to `int' in declaration of `yx'
test.c:5: warning: data definition has no type or storage class
test.c: In function `trace':
test.c:12: warning: suggest parentheses around assignment used as truth value
test.c: At top level:
test.c:19: warning: return-type defaults to `int'
test.c: In function `main':
test.c:19: warning: implicit declaration of function `printf'
test.c:21: warning: double format, vec arg (arg 2)
test.c:21: warning: too few arguments for format
test.c:21: warning: control reaches end of non-void function
cc -lm -o t test.o
つーか、普通に考えりゃわかるだろうに。
101 :
デフォルトの名無しさん :03/05/11 15:38
漏れは見なくてもわかる
俺はこのスレ読む前から解ってた。
>>100 プッ、やることもできないんだろ。
まあ、見るだけでわかるんなら
>>92-94 に反論の一つでもしてると思うけどな。
俺は、あんなソースは見たくもないから。
fgetsよりfgetcの方が好き。 fgetsとfgetcはほんと間違いやすいから気をつけよう。 ややこしいよね。
>>104 うんうん、君には難しいんだろうね。
よくわかったから、満足したらもう来ないでね。
引数も違うのに間違えるんかい
>の方が好き 好みの問題なんだろうか
もれはfgetcよりもfputcの方が好きだな
スマン 間違える間違えないの問題じゃなかった。
113 :
デフォルトの名無しさん :03/05/11 19:03
>>99 警告しか出ていないように見えるのは俺だけか?
gcc2.95.3だと-ansi -pedanticつけないとエラーはでないな。つけると5行目でエラー
> ANSI C forbids data definition with no type or storage class
しかし、2行目に;が必要ってどういうことだよ。
なんか勘違いしていた・・・スマソ irのすぐ後にってことか。
Part56って凄いね。うんうん。すごいすごい。 すごすぎだよあんた。 五万六千レス。
初心者板には5000を越えたスレがあるらしいぜ
それだけバカとバカに教えるバカが豊富、と
おそろしくへたくそなソースだが、レイトレのつもりか?
新しいトイレ?
いつからここは7行スレに?
>>112 自分の好みを披露するスレでもないからな。
124 :
デフォルトの名無しさん :03/05/11 22:34
C初心者です。 今後C++を覚えたいのですが、なんかC#という新しい言語もあるそうなんですが C#ってなんでしょうか?C++を飛び越してC#を学んだ方が得策なのでしょうか? 教えてください。
色々悪口を言われるプリプロセッサだけど、俺は大好き。
俺は大嫌い。
俺は性格は好き。
130 :
デフォルトの名無しさん :03/05/12 02:11
NULLとナル文字の違いを教えてください。
NULLはポインタ ナル文字は文字であり整数型
132 :
デフォルトの名無しさん :03/05/12 02:25
ナル文字と0の違いは?'\0'でじゃなく0でいいのでは?
ナコルルとリムルルの違いを教えてください。
あと"aaa\0bbbb"とかやったりな
やらないか
>>130 ヌルポインタ
あるオブジェクトの位置を示す、どの正常なポインタとも
等しくならない事が保証されているポインタ。
ソース上では 0 というリテラルで得る事ができるが、
NULL というマクロを使った方が読みやすい。
しかし、実際は 0 以外に ((void*)0) と定義されていてもよいとされている
(C++ では 0 と定義される)。
ヌルキャラクタ
あらゆる文字とも等しくならないことが保証されている文字。
文字列を操作する標準関数において文字列の終端を表す。
ソース上では '\0' というリテラルで得る事ができる。
リテラル文字列(" " で囲んで得られる文字列)の終端には
ヌルキャラクタが自動的に付け加えられる。
ヌルポインタはポインタであり、ヌルキャラクタは文字である。
ヌルポインタは文字ではなく、ヌルキャラクタはポインタではない。
以上。
138 :
デフォルトの名無しさん :03/05/12 02:31
要するに0
>>138 だけど、ヌルポインタはデータとして 0 であるという保証は無い。
ソース上は 0 だけどね。
140 :
デフォルトの名無しさん :03/05/12 03:41
オブジェクト指向ってなんですか?
>>140 スレ違い。
というか、オブジェクト指向で検索汁。
>>140 実はオレも知らないんだ。
検索してもよくわからなかった。
>>141 の言うように検索してバカなオレにわかりやすく教えてくれ。
>>136 いや、やったことがある。こっそりバイナリにメッセージ仕込んだりしてた(w
>>139 *(NULL)が0である保障がないことは
なんの関係もないぞ?
何が言いたいんだ?
>>144 void *p = NULL;
printf("%d\n", (int)p);
で 0 が表示される保証が無い、ということ。
本気で言ってる? 釣り?
もっと現実的な状況で言うなら、 int **p; /* int* 型の動的確保配列 */ p = (int**)calloc(size, sizeof (int*)); という方法では NULL で初期化されない、 という環境があって構わないということだ。 malloc の後に for を使って NULL で初期化しなくてはならない。 しかも厳密に言うなら、 NULL を実現するための現実の値が char* と int* などで異なっていても構わない。 そのため、この初期化処理を関数化するには型ごとに関数を作るしかない。 int** を void** で受けようとしてもエラーか警告を受けるであろう。 C++ ではこのような状況は当たり前のように存在していて、 多重継承をしているクラスではそもそもポインタのサイズが異なるために int* と iostream* とでは NULL の値は異なる、 という実装になっている処理系が殆どである。
>>146 139の言うことか? 釣りでもなんでもなく正しいよ。
Cの規格では、0が出てきたときそれがポインタを表す文脈の時は
NULLポインタに読み替えられることが保障されているだけで、
NULLポインタがバイナリ0である保障は全くないよ。つまりえーと、
union {
void *p;
int i; /* sizeof(int) == sizeof(void *)を仮定 */
} hoge;
hoge.p = 0;
printf("%d", hoge.i);
とやったときに「0」という出力がえられることは規格では保障されてない。
もっとも殆どのコンパイラの実装ではバイナリ0だろうけど、
それは規格には関係ない。
フフッ、漏れは騙されないよ。
もっとも規格ではNULLポインタがバイナリ0である保障はないけど、 現実のコンパイラの実装ではバイナリ0だから 実際のプログラムには関係ない。
ASCIIコードが8ビット(1バイト)とか言ってるヤシよ! アスキーコードは7ビットだろうがよぅ!
>>149 共用体のvoid*に書き込んだ値をintで読んだりしたら結果は処理系依存。
もっとも期待通りに動作しない処理系なんて聞いたことないが…
>>152 そういう言い方をするとちょっと違うような。
>>154 MS-DOS時代のMS-Cにはfarポインタと言うものがありましてな、
16bitのセグメントと16bitのオフセットと言う構造になってたので
intとの共用体を作ることもできなければセグメントの値が
0になることもなかったものなのですよ。
#温故知新。
>>156 共用体自体は作れたと思うし、(void far *)0はセグメントも0だったのでは。
>>154 もちろんわかっててやってる。
つうかコンパイラの実装(NULLポインタのバイナリ表現)を見る
ことが目的なので処理系依存でかまわない(w
とはいえあの例で0と出ない例をおれは知らぬ。
DOSだって
>>156 が言うとおりfarポインタのNULLは0:0(バイナリゼロ)だし。
# 共用体はlongでとってね。
誰か0以外のが出る実装を教えてくれんか(w
Cの規格にある制限の理由には大きく2種類あって
・現実の機械にそういう物があるから(例: 名前は6文字以下であること…C89の有名無実な制限)
・実装者に選択の余地を与えること(例: intのサイズ)
んで、NULLがバイナリ0でないというのはどっちの理由なんだろうな。
そういう機械があったという伝説は残っている。
>>159 > 誰か0以外のが出る実装を教えてくれんか(w
CFAQの5.17に書いてあるよ。
逝ってよし
163 :
デフォルトの名無しさん :03/05/12 15:07
プログラム内でよく参照する文字列のリストをグローバル変数の配列にしているんですがもっと良い方法はあるのでしょうか。 ♯defineとかを使うという話を聞いたような気もするのですが、[]内が式になると上手くいかないようなきがしますが…。
>>163 その文字列がキーワードの類なら
static char const *const sKeyWords[] = {"foo", "bar", "baz",};
が無難ではないかと。
マクロにするなら、
#define KEY_WORD(x) ((x) == 0 ? "foo" : (x) == 1 ? "bar" : "baz")
などとできなくもないが煩わしい。
もしその文字列がエラーメッセージのようなものなら、
テキストファイルやリソースの形で実装することをお勧めする。
一番目のconstはcharの前に書けよ気持ち悪い
>>163 どういう目的でそういう方法をとっているのですか?
例えばコンパイラの中には、ソース中に同じ文字列が出てきた場合、
一つにしてくれる機能を持つものもあります。
メモリの節約をしたいというのであれば、この機能を使えばよいですが、
文字列の内容に変更が入るかもしれないので共有しているのであれば、
この機能を使うのはよくないです。
>>167 文字列リテラルを書き換えてはいけないよ
読み出し専用(のはず)だからこそ、そういう機能を適用するわけだし。
>>168 動的に書き換えるという話ではなく、
ソースの一箇所直せば事足りるようにするというような
静的なものを言ったつもりでした。
もうちょっとプログラミング用語を勉強したほうがいいぞ コミュニケーションがうまくできていない
>>170 もうちょっと日本語を勉強したほうがいいぞ、
コミュニケイションが(略
日本語難しい
どっちかというと作文能力の問題だな
>>164-168 の皆様、お答えありがとうございました。
例えば{"読売ジャイアンツ","阪神タイガース",…,"福岡ダイエーホークス"}のような
今後拡張する必要の無い単語リストを格納するつもりでした。
ただ、多くの関数で参照する都合上、まとめた方が便利だったもので。
とりあえずstatic〜の方法でやってみようと思います。
多くの関数で・・・ならstaticをつけちゃまずいのでは。 多くの関数ってのがひとつのファイルに入っているのならかまわないけど。
>>176 static の方法を使うと、そのヘッダファイルを
インクルードしているソースファイル全てで
その変数が定義されてしまうので、不効率。
ただの一定数なら最適化でなんとかなることが殆どだと思うけど、
配列とかポインタとかはどうにもならんと思う。
添字が定数ならなんとかなるかもしれないけどね。
ところで、配列の場合は初期化を考慮した EXTERN マクロの技巧
#ifdef 何か
#define EXTERN_INIT(var, init) var = init;
#else
#define EXTERN_INIT(var, init) extern var;
#endif
が上手く使えないけど、みんなどうしてる?
>>178 >EXTERN マクロの技巧
そんなもん使うな。ソースが激しく見づらくなる。
#目視という意味だけでなく、解析ツールが使えなくなる。
外部変数を幾つも宣言したいならせめて構造体にまとめろ。
論理的に関連性のない変数を無理に構造体に纏める方が激しく読みづらくなりますが何か? マクロが読みづらいならプリプロセッサだけを通したソースでも読めや。
>>178 値を変更するたびにインクルードするソース全部コンパイルし直すことになっ
て、分離するメリットを損なうので、しない。
182 :
デフォルトの名無しさん :03/05/12 20:49
mainのなかでint **型のポインタのポインタ(可変長の多次元配列を取るため)pを宣言して それをfunc_aという関数に渡してmallocで多次元配列を確保して さらにpをfunc_bに渡してその中で処理をしてpに値を入れました。 それでこれをmainで参照しようと思ったのですが、うまくいきません。 func_a、func_b内でなら参照できたのですが。 mainでも参照できる方法はないでしょうか。
グローバル変数は使わない方向でおながいします
int **pを渡すのが間違っている。 int **pにint **型のfunc_aの戻り値を代入する。 どうしても渡したいのなら、func_aの引数をint ***にして、func_a(&p)として呼ぶ。
(´-`).。oO(よくこんな説明で分かったな・・・)
>>186 (´-`).。oO(多分あと一押しの部分を押してくれたんだと思う・・・)
なんだ自作自演か
そして破滅へ
190 :
デフォルトの名無しさん :03/05/12 22:02
Cにプロトタイプ宣言が導入される前はどうやって関数ポインタを初期化していたんですか? 初期化よりも上で関数を定義ですか? でもそうすると他のファイルで定義したものは使えませんよね?
どんな関数ポインタでも (*pfunc)(arg1, arg2, arg3) してもいいし (*pfunc)(arg1, arg2) してもいいし (*pfunc)() してもよかった。 関数ポインタの指す先が int func(arg1) /*一個だけよ*/ だった場合は、余計な引数は無視され、 足りない引数にはゴミが渡された。 スタック渡しなんで、言われた順に単に 後ろからスタックにつんでただけ。
戻り値の型も、後方参照できなければ暗黙的にint形を返すことになっている。 だから double atof(char *)みたいなのをプロトタイプ宣言せずに呼ぶと 戻り値をうまく受け取れなかったりした。 というわけで、プロトタイプされていない関数はすべて、 「intを返す、引数の数不明な関数」 であり、 「int (*pfunc)()」 のような関数ポインタで扱うことができた。
printf()系以外めったに使わない可変長引数のためだけに後ろから 畑中葉子
あ、すみません。初期化というのはint (*p)(int,double)=func;みたいな形のことです。 この場合、コンパイラがfuncという名前を知らないとエラーになりますよね? で、宣言するか上で定義しないと分からないから・・・
>>194 だからそういう場合は
int func();
>>195 あ、当時のコンパイラならエラーにならなかったんですか。
foo() { extern int func(); /* funcって名前の関数がどこかにあるよ */ int (*p)(int,double)=func; /* 関数ポインタに代入 */ }
>>197 > extern int func(); /* funcって名前の関数がどこかにあるよ */
それはプロトタイプ宣言では。
>>198 int main()
{
int (*p)(int)=func;
return 0;
}
gcc test.c
test.c: In function `main':
test.c:3: `func' undeclared (first use in this function)
test.c:3: (Each undeclared identifier is reported only once
test.c:3: for each function it appears in.)
エラーになりましたよ?
わざと読み飛ばしてるのか?
int main()
{
int func();
int (*pXint) = func;
}
>>195 も
>>197 もこういってるのに。
もしかして私がプロトタイプ宣言というものを勘違いしている?^^;
>>203 つーかそんなことを知る必要があるのか? そんなこと知っても無意味だろ。
変数の名前(ラベル名?)を表示することはできますか? 具体的には int Right; int Left; printf("Variable1 Name:%? \n",Right); printf("Variable2 Name:%? \n",Left); 上記を実行すると標準出力に Right Left と表示される。見たいなことをやりたいです。
int Right; int Left; printf("Variable1 Name:Right \n"); printf("Variable2 Name:Left \n");
そういうことができるとして、どういうことに利用したいの? 他の方法で実現できるかも。
コンパイルした後も変数の名前って残るの? 例えば int a; より int ab;ってやったほうがexeが大きくなるとか
>>209 リンク時に必要な名前以外は消える・・・・と思う。
>>206 そうでしたか、できないものは仕方ないですね。
特に目的は無く、
きっと変数名を表示することはできるだろう。
→ 調べたけどどこにも載っていない。
→ あぁ気になって眠れない。
という流れで質問させていただきました。
とりあえず俺が
>>205 に言いたいことは
printf("Variable1 Name:%s \n","Right");
じゃ
Right
とは出力されないってことだな
マクロ使えばいいじゃん#とか
(゚Д゚)ハァ?
文字列連結演算子 ##
#define P(x) printf(#x)
>>219 入れ子が関数が長くなる原因になるといっているだけで、
駄目とは言ってないような。
そんなことよりも、
>フローシートなどを用いて処理の再検討をする必要があります。
これはやめてくれ。
解の公式のプログラムでできるだけ桁落ちしないようにするにはどうしたらいいんですか?
>>219 一通り読んだけど、こいつ駄目だわ。
「こういう考え方の奴もいる」程度に読むように。
>>221 ケースバイケース。
場合によっては、公式をそのままプログラムに移すのではなく、
予め桁落ちしないように変形するなどの工夫をするといい。
特に、収束の悪い級数展開には要注意。
>>219 メンバーにmをつけるという命名規則が分からない・・・
mついていなくてもa.bとかa->bってかけばbはメンバーだってわかるし、メンバーを裸で書くことはできないはずだし・・・
C++の場合かな? メンバ関数内での使用とか。
それより自動変数につけるtheとか「引数は参照のみは「in」」ってのが・・・ 参照のみならconstつけろよ。Cの標準関数もそうしている。
違います
>>220 つーかフローシートって何だ。
風呂敷?
>>228 私に聞くな。
フローチャートの間違いだと思うのだが、そうだとしても阿呆だと思うがね。
231 :
デフォルトの名無しさん :03/05/13 15:56
free()とかfclose()しないでexec()したらマズイですか?
>>231 呼び出したプログラムが終了して戻ってきて、
mainから抜ける時まで確保されっぱなしだけど、気にしないなら問題はないよ。
>>234 単純に「クラスを分割する」でいいよな。
なんで継承なんだろ。
>231 free()については、無問題 fclose()については、書き込まれていないバッファの内容がうしなわれるし、ファイルがひらきっぱなしになる。
237 :
デフォルトの名無しさん :03/05/13 18:21
struct a{ struct aa; struct bb; char cc; }hoge; struct b{ struct aa; struct bb; char cc; }piyo; 上記2つの構造体の中身を"char cc"を除いて丸ごとコピーしたいのですが memcpy(piyo, hoge, (aa + bbのサイズ)); ↑でできるでしょうか?? ご指導おねがいしまふ。
その前にエラーでは・・・・
エラーにならねー(T_T) struct aa; はエラーにならないのか。
>>237 struct aa と struct bb のペアに意味があるなら、
別の構造体としてまとめるべし。
あとは構造体の代入でいける。
ちなみに、上の memcpy での代入はできない。
何とかする方法はあるが、
余計な事を教えるとやりそうで恐いので教えない。
なるほど・・・struct aaとstruct bbはないものと判断されるのか。 じゃあccを除いてコピーってのは・・・
正確には struct a{ struct aa a; struct bb b; char cc; }hoge; struct b{ struct aa ba; struct bb bb; char cc; }piyo; って感じです。 すんません。
>>242 hoge.a=piyo.ba;
hoge.b=piyo.bb;
と二行に書くのがいやなわけ?
>>240 サソ
ありがとうございます
hoge = piyo;
だとchar ccも入ってしまいますよね、、、
で、どうするか。。。
ホカに構造体を用意して、そのエリアに
いれちゃうって感じですか?
245 :
デフォルトの名無しさん :03/05/13 18:48
出力結果が 一つ目==>○ーーーーーーscanf()で 二つ目==>□ーーーーーーscanf()で ○+□=△ーーーーーーーー△は2進数で表示 を作りたいのですがサッパリです。 #include <stdio.h> int main() {
>>243 サソ
それでできるんすかーーーーー!!???
まじっすかーーーーー
革新的ダァーーーーー!!!!
だから、その2つの構造体を まとめて扱う事に大きな意味があるのなら、 struct ab { struct aa a; struct bb b; }; という構造体を作って struct a { struct ab a; char cc; } hoge; struct b { struct ab b; char cc; } piyo; piyo.b = hoge.a; とするか、1つずつ代入する関数でも作る。 そうでないなら、1つずつ代入する。 構造体の一部を memcpy でコピーするのは禁じ手。 memcpy するコードを書いたのを忘れると、 あとから構造体に要素を追加した時に アドレスがずれてバグになる可能性がある。
型の違うもの同士をmemcpyしたくないなぁ。 例えメンバーが同じでも。
>>245 先ずは 10 進数で表示するプログラムを作ってみ。
#include <stdio.h> int main(void) { int a,b; printf("1つ目\n"); scanf("%d",&a); printf("2つ目\n"); scanf("%d",&b); printf("\n\t\t演算結果\n"); printf("\t\t%d + %d=%d\n",a,b,a+b); printf("\t\t%d - %d=%d\n",a,b,a-b); printf("\t\t%d * %d=%d\n",a,b,a*b); if( b==0 ){ printf("\t\t%d / %d0では割れません。\n\t\t%d %% %d0では割れません\n",a,b,a,b); } else{ printf("\t\t%d / %d=%d\n",a,b,a/b); printf("\t\t%d %% %d=%d\n",a,b,a%b); } return 0; }
きちんと0チェックしている・・・自分で考えたのなら偉い。
0でやったらエラーでるので出なくしました。
>>250 あとは2進数を表示する関数を作れば終わりやね。
まぁ、初心者なら一旦表示する文字列を作ってから
それを後から表示すればいいね。
再帰関数を使う方法もあるけどね。
254 :
デフォルトの名無しさん :03/05/13 19:11
255 :
bloom :03/05/13 19:13
d=nisinsuu(a,b); int nisinsuu(int x,int y) { . . . } って感じでですか?
>>254 自分で適当に決める。
この値が精度に相当する。
>>256 nisinsuu(a + b);
とかいう風に、計算部分までは関数には持ち込まない。
>>258 じゃあDBL_EPSILON使います。
ありがとうございました。
スマソ。ギブアップ
261 :
デフォルトの名無しさん :03/05/13 19:43
データの先頭アドレスを指すポインタ*pがあります。 このデータの先頭から3〜4バイト目に値を入れたいです。 値はint hoge = 42;など こういった際には p +=3; memcpy(p, hoge, 2); って感じなのでしょうか? memcpyはcharはダメ・・・? どうすりゃいいんでしょうか? 厨房ですみません、ご教授願います。
>>260 第 n ビットだけ 1 になった値は
どうやって得ればいいかな?
(ただし、一番下のビットは第 0 ビットとする)
263 :
デフォルトの名無しさん :03/05/13 19:44
>>261 何をしたいの?
という質問がよくあるが、これは
やってることが危険、
奇妙なコードで意図が汲めない、または
一応動くがバグの温床になるという指摘である。
char c[4]; c[0] = 0; c[1] = c[2] = c[3] = 1; int i = (int) c[0]; としても i = 0; ですよね。
266 :
デフォルトの名無しさん :03/05/13 20:11
#include <stdio.h> int main(void) { int a,b,c,d,n; printf("===============================================================================\n"); printf(" いまから四則演算をする数値2つ入れなさい\n"); printf("===============================================================================\n"); printf("1つ目の数値を入力してください\n"); scanf("%d",&a); printf("2つ目の数値を入力してください\n"); scanf("%d",&b); printf("\n\t\t実行結果の表示です\n"); n=0; for(c=a+b;c>0;c/=2){ d=c%2; printf("%d",d); } printf("\n左から読んでくれ"); return 0; } 分かりません。これが限界です
267 :
デフォルトの名無しさん :03/05/13 20:14
ある乱数を発生させてそれぞれに条件式をつけるにはどうすればいいですか? 例 乱数で1から100までの数字を発生させて 1〜40ならA 41〜50ならB 50〜99ならC 100ならD といったような具合に場合分けしたいときって どうすればいいんですかね? 1<X<40 こういった条件式をプログラム上で行いたいんだけど 良いほうが思いつかないもので 初心者的な質問ですんません C言語限定ってわけではないけどアルゴリズムが知りたいので書きました 良かったら 教えてください
>>265 はい。
c[0] は 0 なので、i は 0 です。
int i = *(int*)&c[0];
とすると変わってきます。
結果は CPU のバイトオーダに依存します。
>>266 どこまで習ったの?
1. 関数
2. 配列、文字列
3. ビット演算
4. 再帰関数
>>267 アルゴリズムつーか、ifでやるのはいかんの?
今は何の時期だ???ひどいもんだ
>>267 1)
int x = rand() % 100;
enum ABCD abcd =
(x < 40) ? A :
(x < 50) ? B :
(x < 99) ? C : D;
2)
int x = rand() % 100;
if(x < 40) { ... }
else if(x < 50) { ... }
else if(x < 99) { ... }
else { ... }
>>264 サソ
ご指摘ありがとうございます。
ほんと厨なもんで何が危険なのか
何が奇妙なのかもわかりません、、、
ご教授おんがいします、、、
>267 xが1〜40 → xが1以上 かつ xが40以下 → 1<= x && x <= 40
×良いほうが思いつかないもので ○何一つ思いつかないので
275 :
デフォルトの名無しさん :03/05/13 20:27
専門ではまだ演算子なんてものやってますが高校時代に関数、配列と文字列、シフト演算をかじる ぐらいまでやってます。忘れかけてますが、、、、
>>272 その前に何がしたくてそういうことをしているのかが分からない。
大方、代替案を出して終わる事になりそうだが、
何がしたいのか分からないので代替案が出せない。
>271 なるほど 2)の考え方でいいんですね ありがとうございます
>>275 関数も配列もやってないのにこういう問題が出たの?
>>266 では 1 桁ずつ直接表示してたけど、
その値を配列に保存しておいて、
それをちゃんとした順序で表示すれば
逆から読ませないで済む。
>>276 サソ
関数の引数でわたされるものが
データのカタマリの先頭アドレスなんです。
そしてそのデータの3〜4バイト目を
書き換えたいのです。
厨で上手く説明できずすみません、、、
280 :
デフォルトの名無しさん :03/05/13 20:39
>>266 早く10進数で表示させれた人は暇だろうからチャレンジしてみろと言われた。
クラスで2,3人できた奴がいたのでビックリ。自信なくなる鬱。H○L生です
>>280 なるほど。そういうことか。
他にもいろいろやる方法はある。
上の桁からとるように工夫するとか。
とりあえず、表示部分は関数にして分離しておくと、
a + b, a - b, a * b, a / b, a % b で
同じ処理を簡単に使い回せるし、
プログラムも読みやすくなる。
>261 まずは渡されるデータ構造を知ることが先決。 構造さえ知ってれば構造体メンバへの値の代入で終り。
>>282 サソ
ありがとんございます。
可変長のデータなので
構造体って感じじゃないみたいなのです、、、
>>283 何かよー分からんが、memcpy なんか使わんでも
typedef short int int16;
void foo(char* p, int16 hoge)
{
*(int16*)&p[3] = hoge;
}
でええがな。
>>284 サソ
アリガトンゴザイマスーーーー
これはキャストして代入って感じですか??
287 :
動画直リン :03/05/13 21:13
>>285 p[3] のポインタ &p[3](型は char*)を得て、
それを int16(16 ビットの整数型)へのポインタ型にキャストして、
そのポインタの参照するところに代入。
あまり使いたくない技だけど。
>284 扇るつもりはないが、まだmemcpyの方がましだ・・・
>>288 サソ
ほんとありがdございます!
勉強になります。
ところでついでにもうひとつ質問を、、、
int16ってのはなんですか??
初めて見ました。
とりあえずぐぐってみます。
291 :
デフォルトの名無しさん :03/05/13 21:32
表示部分は関数にしてというのがわからないのですが #include <stdio.h> int main(void) { int a,b,wa,d[100],n; printf("===============================================================================\n"); printf(" いまから四則演算をする数値2つ入れなさい\n"); printf("===============================================================================\n"); printf("1つ目の数値を入力してください\n"); scanf("%d",&a); printf("2つ目の数値を入力してください\n"); scanf("%d",&b); printf("\n\t\t実行結果の表示です\n"); n=0; wa=a+b; for(;wa>0;wa/=2){ d[n]=wa%2; n++; } d[n]='\0'; printf("\t\t%d + %d=",a,b); for(n=n-1;n>0;n--){ printf("%d",d[n]); } return 0; } でできるようにはなったのですが
struct tbl{ int n; } void main89 { struct tbl dt; void inp_int(int *) inp_int(&dt.n); } 構造体のメンバを副関数に渡すには引数はどうなるの?
>291 つまりこういうこと。 #include <stdio.h> int printbin(int num) { int i,j; for(i = 1,j = 1;num >> j;i = i << 1,j++); for(;i;i = i >> 1)(num & i)?fputc('1',stdout):fputc('0',stdout); return 0; } int main(void) { int a,b; .. printbin(a+b); return 0; }
>>294 void inp_int(int *p.n)
でいいの?
煽るつもりはないけど、ちょっとレベル低すぎないか?
ある程度分かった人間の疑問は >1のリンクで片付いちまうからなぁ・・ 回答者のレベルは・・・運任せのところがあるなぁ・・
>>297 スマソ。進んで勉強する気があると言う事で許してはくれまいか、、、
>>299 参考書を読めばわかるレベルだと、そのうち釣りだと言われて、相手にされなくなるよ。
301 :
デフォルトの名無しさん :03/05/13 22:17
とほほ。ここ返事が早いのでいいのですが、、、 スマソ。過去に言われた経験あり
おい、私の答えはどうなったの?
>>302 ごく普通のint*を受ける関数でいいんだよ・・・
プログラミングのレポートで「考察を書け」といわれたんですが、 実際何を書けばいいんでしょうか? 一つ一つ関数について書くべき?
もう、いいよ。ばかたれども(ぷんすかぷんぷん
>292 入門書レベルの質問だろが・・ <呼ばれる側>:<呼ぶ側> int inp_int(int):inp_int(dt.n) int inp_int(int *);inp_int(&dt.n) int inp_int(struct tbl *):inp_int(&dt) のどれかだろ
どうも仮引数の書き方がわからないらしい。 inp_int(int *p) <- 名前は何でもいい
もう疲れた。
>>295 > for(;i;i = i >> 1)(num & i)?fputc('1',stdout):fputc('0',stdout);
もう少し三項演算子の使いどころを…
>>305 自分でプログラミングに関することで、また、最近習ったことで
興味のあることなどについてずらずら書く。
>>295 そんな奇妙な三項演算子の使い方する前に、
forをきちんとブロックで書く習慣つけろよ。
小手先のワザを覚えて使いたがる餓鬼みたいだぞ。
もし、forは敢えてブロックを使わないほど習熟している積もりなら
何故
>>310 や私が指摘しているのかすぐ判るだろ?
> for(;i;i = i >> 1)(num & i)?fputc('1',stdout):fputc('0',stdout); fputc((num&i)?'1':'0', stdout); のがいいな。
Cで、あるテキストファイルから文字列を読み込むときに 半角スペースで区切られたいくつかの値を それぞれ違う変数に代入したい場合は どうやったらいいんでしょうか? ちなみにdouble型です。
void fprintb(FILE* file, unsigned int num) { if(num == 0) { return; } fprintb(file, num >> 1); fputc('0' + (num & 1), file); } void printb(int num) { fprintb(stdout, num); }
scanf("%f ",data);
>>315 fgets()で1行取りこんで、sscanf()
319 :
デフォルトの名無しさん :03/05/14 02:13
OracleのSQL埋め込みC(Proc)に関する質問です。 OracleでNUMBER(18,3)型で定義された項目をCで使いたいです。 当然、DBからデータを持ってくるためのホスト変数を定義します。 NUMBER(18,3)というのは、精度18桁ということです。 Cだとdoubleが精度15桁、long doubleが精度19桁なのですが、 Procでlong double型ホスト変数は定義できません (double型ならあるのですが精度が足りません)。 char型の変数に文字としておとしてきてからlong doubleの数値に変換、という 方法はあるにはあるのですが、できれば直接数値として取得したいのです。 どうしたらよいのでしょう。同じ問題に直面した事のある方いませんか。
321 :
デフォルトの名無しさん :03/05/14 02:25
このスレだけ読んどけばC言語マスターできますか?
間違った知識を身につけられます。
激しく申し訳ない。別のスレに逝ってきます。
DECIMAL?
static const FProc routineForSelector [] = { /* formatSelectorReadPrepare */ DoReadPrepare, /* formatSelectorReadStart */ DoReadStart, /* formatSelectorReadContinue */ DoReadContinue, /* formatSelectorReadFinish */ DoReadFinish }; 勉強で人のソースを読んでたら、このような文が出てきました。 この配列内にあるDo〜というのは静的なグローバル関数として 宣言済みなんですが、この文は何でしょうか??
ひらめきました。お騒がせしました。
>>327 > 静的なグローバル関数として
Cには動的な関数というものはないし、staticならグローバルではない。
331 :
デフォルトの名無しさん :03/05/14 11:24
文字を数値にする関数としてatoi,atol,atofがありますが、 long double型にする関数はないのでしょうか。 自前でやるしかない?
>>330 はぁ? ポインタ経由の呼び出しは、動的な関数だろ。
それは動的な呼び出し。関数自体を動的に作ることはできない。 JITみたいなのは別として。
>>331 doubleならscanfで変換できるよ。
c99 なら long double strtold(const char*, char** endptr) が。
>>334-336 レスどうもです。
sscanfを使おうと思ったのですが、また疑問が。
そもそもlong doubleの書式指定って何ですか?
long double hoge = 1;
printf("%lf",hoge);
とやっても、結果は
-21745549…と出てしまいます。
L
339 :
デフォルトの名無しさん :03/05/14 13:32
if ((*count = _lread(fp, buf, bytes))==0xffff) return readErr; というのを見たんですが、(式)==0xffffという部分がよくわかりません。 助けてください。
>>339 _lread()の仕様がよくわかりません。
助けてください。
_lreadの帰り値は UINT 本来は 0xffff ではなく HFILE_ERROR を使うべき所を includeしなければちょっとコンパイルが速くなるからと、けちったものと思われる。
>>341 本当にそのつもりだったとしたら安物買いの銭失いって感じだな(w
ていうか知らなかっただけ
なるほど・・・HFILE_ERRORが0xffffということだったんですか・・・ ありがとうごじゃーます。
345 :
デフォルトの名無しさん :03/05/14 15:41
>>330 > staticならグローバルではない。
どういうこと?
>>345 static を付けるとファイルスコープになる。
付けないとグローバルになる。
動的な関数ってのは、
関数型言語でよく使われるラムダ式とかそういうやつ。
>>346 なんだそういうことか。
特定の関数からしか呼べない関数という意味だと思った>グローバルでない関数
ファイルスコープ・・・・
「ファイルスコープ」に違和感を覚える人間がなんでC言語スレに居るんだろー
ブロック外で定義したstaticをつけた変数はなんと呼ぶの?
ねーなんと呼ぶのよー
>>346 の考え方で考えるとグローバルでないということになるけど。
関数の話をしているんだがな
そもそもCの関数にはグローバルもローカルも静的も動的もないと思うんだけど。
よかったね
ファイルスコープ変数
ファイルスコープ変数ですか。 覚えておきます。ありがとうございました。
スコープとリンケージがごっちゃになっていないか? static int x; /* 内部リンケージ */ int y; /* 外部リンケージ */ っていうんじゃないの?
馬鹿な漏れに教えてくれ! 漏れは次のソースをコンパイルして実行した void main(){ } 上手くコンパイルできた 出来たexeファイルを起動しても当然何も実行されない しかし、出来たexeファイルを見ると47,104バイトの容量がある なぜこんなに容量を食うんだろうか?
グローバル関数で検索しても出てくるのは特定のクラスに属さない関数という説明ばかり。
スタートアップルーチンとか VCならmainCRTStartupとかsetargvとかがデカイ
>>357 × void main
○ int main
実行ファイルに必要な情報と
main 関数を呼ぶルーチンが入ってる筈。
確か。
>360 ありがとう
あとはデバッグ情報がついてるとか。
最初に実行した瞬間にウィルスに感染したとか。
リンカがすでに感染してるとか。
365 :
デフォルトの名無しさん :03/05/14 21:14
stdin を fseek はできますか? したときの動作は規格で保障されてますか? fseek(stdin, 0L, SEEK_SET)
どちらもNO
367 :
デフォルトの名無しさん :03/05/14 21:25
fgets で検出した EOF が stdin に残ってしまっています。 この EOF を消したいのですがどうしたらよいでしょうか? 検索すると fseek, fflush, rewind などを用いたプログラムを 見かけるのですが、どれも動作が保障されていないようです。 char str[10]; fgets(str, 10, stdin); <= EOF を入力すると fgets(str, 10, stdin); <= この行のfgetsが実行されない
>>367 すまん、fflush()と間違えた。fseek(stdin)は問題ない。
fseek(stdin)じゃプロトタイプと合わないだろ。と言ってみる。
質問です。 高さH、幅Wの三角波をプロットしたいのですが、正弦波sin()のように 三角波も標準的な関数として用意されているのでしょうか? こういう関数なんですが y ↑ |/\/\/\/\/\/\/\ …  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄x
>>370 生成式あるっしょ。それをプロットすればよし。
>>371 5時間くらい考えて何度自分で作っても変な関数になってへこんでたんです。
で、もしかしたら用意されてるのかと思って聞いてみたんですが、式があるんですか…
持ってる本はC言語の入門書だけで、どうやら載ってないようです。
Web上を探してもどうもキーワードが悪いようで、みつかりません。
よろしければヒントを教えていただけませんか?
>>370 Wの解釈が違うかもしれんけど…
double f(double x, double H, double W) {
double t = x - floor(x / W);
if (t < W / 2) {
t = H / (W / 2) * t;
} else {
t = -H / (W / 2) * t + H * 2;
}
return t;
}
strchr()の第2引数に'\0'を与えた時の動作は 仕様で規定されていますか? bcbのヘルプによると、strchrに与える文字列は末尾の'\0'も含まれるので 返り値は末尾の'\0'の位置ということですが。
>>373 ご丁寧に関数の提示までしていただき、ありがとうございます。
さっそくこれを参考に作業にとりかかろうと思います。
お手数をかけて申し訳ありませんでした。
×お手数をかけて ○お手数をかけさせて
>>374 それはCの仕様できまっている。
それを知らずに使って起きたバグに小一時間悩まされたことが・・・ manを注意深く見てようやくわかった(^_^;)
378 :
デフォルトの名無しさん :03/05/15 00:28
>>370 #define H
#define W
でなんか定義されてるものとして
double sankaku(double x)
{
double xx = x % W;
if (xx < W / 2) {
return (H * (xx / (W / 2)));
} else {
return (-H * ((xx - W) / (W / 2)));
}
}
こんな感じかな?
式はもう少し簡単になりそうだけど
ありがとう。安心した。
BorlandのCコンパイラでgraphics.hみたいなのってあるの?
#include <string.h> size_t strlen(const char *s) { return strchr(s,'\0')-s; }
382 :
デフォルトの名無しさん :03/05/15 00:58
C++に関してですが、 クラスのオブジェクトへの参照(リファレンスではないです)を返す関数の戻り値の型は、 リファレンスあるいはポインタのどちらがいいんでしょうか? 各々にメリット・デメリットがあれば教えてください。
ここは++のつかない古代のCスレ(´д`;)
384 :
デフォルトの名無しさん :03/05/15 01:02
>383 すみませんでした。。。 C++のスレはあるんでしょうか?
386 :
デフォルトの名無しさん :03/05/15 01:03
ありました。 失礼。。。
387 :
デフォルトの名無しさん :03/05/15 01:02
#include<stdio.h> main() { int i,sum,x; x=1; sum=0 for(i=1;i<=100;i++) { sum+=x; x+=1; } printf("合計=%d\n",sum); } すんません。教えてください。 ↑のやつをBuilder5.5でコンパイルすると 7行目に構文エラーで(for)())(;)というのが出ます。 一体、何が間違ってるのか、まったくわかりません。 教えてください。
>>388 sum=0;
一般に構文エラーだのsyntax errorだの言われたときは、
指摘された行の直前の行を見るとよいことが多い。
>>389 ありがとうございます。
つーか、漏れ馬鹿すぎ。。。
>一般に構文エラーだのsyntax errorだの言われたときは、
>指摘された行の直前の行を見るとよいことが多い。
これは非常にためになる豆知識をありがとうございます。
エディタのオートインデントやキーワードのハイライト機能で バグに気づくこともあるね。 あとは、全角空白も見えるようにしておくとか。
>388 豆知識その2 エラーが出たら最初の1つだけみて直して再コンパイル。 で、カナーリエラーの数が減る。
豆知識その3 ソースを書かなければバグは発生しない。 仕事してる奴ほどバグを出す。
エラーが出過ぎて見れません。どうすればいいのでしょうか?
>>370 です。フローチャート書いたら10数分でできました。
8時間もかけて、アホですね…
_ ニ / l l
/´´,ィ〕 / 気が付けば……
ニ / l l ,_ / 'ーっ /ニ7
/ /777/ / ./ ̄ / 省略っ…!
/ニ7 { し'7/ ゙̄7/ ,. ''´ ̄`ヽr:z :
/ ヽ. ノ { /〈/ / _,、 ゝ _ f'h、
: |ー-| X ,.へ ! r'7/,ゞ7レリ (.くノ ' 'ヽ フローチャート
,rf'? ! !// V \_l y/__ヽ, .〉 ノ 省略っ…!
〈 レフ .!  ̄/ ̄ ̄/ / ,.イ | r':: 、 / /´
ヽ く `‐! !-l__/ /イ / / ̄`<:: _ ヽヽ. /ー-v' やって
. V⌒ヽ_, l l-‐ヽ / ´ l/ レ' ,ゝ、  ̄7 i‐-' / } } しまったっ……!
ヽ ! ! ∨ / / \/l. ! ./ ノノ
\__,,.ゝヽ''7 ./ ニ / l l 、 /ソ ,'─‐' r‐ 、 さすがのカイジも
/ / / ,イ ヽ./ / /、_ __/ ´ヾ、 フローチャート省略は
. / ノ /ニ7 /;'|___ゝ'/ } __,.へ) 猛省…!
<、 ./ / /;' | '´イ ` ー─‐'-‐'''´
豆知識その4 フローチャートは不要。
ごちゃごちゃになった処理の流れを整理するのに使ったりするけど。
つまりアルゴリズムが頭に入ってなかったって事でファイナルアンサー?
ハァ?フローチャート? フローシートだろ。
ハローワーク
402 :
デフォルト名無しさん :03/05/15 05:38
アイディアを貸してください。 #define TATE 480 #define YOKO 7 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int array1[TATE][YOKO]; int tate; int custNum; int in; int totalTime; int pause; int help; int out; int previous; int current; int value1, value2, value3; srand(time(NULL)); custNum=1; totalTime = 0;
for(tate=0; totalTime<=TATE; tate++) { in = rand()%5+4; if(in + totalTime <= TATE) {array1[tate][0] = custNum; custNum = custNum+1; array1[tate][1] = in + totalTime; help = rand()%3+4; array1[tate][2] = help;} totalTime = in + totalTime; } array1[0][3] = array1[0][1]; array1[0][4] = array1[0][1] + array1[0][2];
for(tate=1; tate<custNum-1; tate++) { previous = tate-1; out = array1[previous][4]; current = array1[tate][1]; value1 = array1[tate][2] + array1[tate][1]; value2 = array1[previous][4]; value3 = value2 + array1[tate][2]; if (current<=out) {array1[tate][3] = value2; array1[tate][4] = value3;} else {array1[tate][3] = array1[tate][1]; array1[tate][4] = value1;} };
for(tate=0; tate<custNum-1; tate++) { array1[tate][5] = array1[tate][3] - array1[tate][1]; array1[tate][6] = array1[tate][4] - array1[tate][1]; }; for (tate=0; tate<custNum-1; tate++) { printf("\n%d \t%d \t%d \t%d \t%d \t%d \t%d", array1[tate][0], array1[tate][1], array1[tate][2], array1[tate][3], array1[tate][4], array1[tate][5], array1[tate][6]);
pause = tate+1; if(pause%20==0) {fflush(stdin); getchar();} }; fflush(stdin); getchar(); return 0; }
上のプログラムの縦の列の2,4,5番目を8時から夜の8時までの時間で 表したいのですがうまくいきません。 少しアイディアを分けていただけないでしょうか? よろしくお願いいたします。
>>402-407 >>407 の意味も分からないし、もともと何のプログラムかも分からないです。
よく見れば分かるかもしれないけど、コメントを書く、説明するなりして
くだちいー。
すみません、説明不足でしたね。 一番左の列以外はすべて単位は分です。 そして、2番目が客の入ってくる時間、4番目が客が接客を受けた時間 5番目が客が出て行った時間です。 分で表すものだから60分を超えると70、とか80になってしまって 見難くなってしまって。。。 このプログラムは簡単なお店のシュミレーションです。 時間はランダムを使って決定されています。 分かりにくいかもしれませんgよろしくお願いいたします。
すみません・・・
for文のブロックの後(}の後)にはセミコロンはいらない。
ご、ごめんなさい(笑)
array1[2,4,5][N]を朝の八時から夜の八時にしたいの?
>>414 はい、朝の8時にお店が開店して、夜の八時にしまる、、見たいな感じです。
一番左の列というのはarray1[0]のこと?
一番左の縦の列は、1番目の客、2番目の客、、、、、、 という風になってます。
なんつーか、酷いね
すみません、まだまだ初心者なもので。。。。
左の列というのがプログラム上でどれを指すのか分からないんだけど・・・
array1[TATE][0]だと思います。すみません。
もしかして、ランダムに生成される時間を朝の8時から夜の8時にしたいってこと?
>>407 こうかな?
0:番号
1:客が入る時間 ○:○○
2:客が接客を受ける時間 ○分
3:この時間に入ってくれば前の客とかぶらなかったのにという時間 ○:○○
4:客が出る時間 ○:○○
5:(自分)客が店にいる時の、前の客の接客時間 ○分
6:客が入ってから出るまでにかかった時間 ○分
そうです、そのとおりです。よろしくお願いいたします。
すみません。わかりにくくて・・・。
>>424 朝の8時は8、夜の8時は20でいいのかな?
はい、20時です。よろしくお願いいたします。
>>427 8から20までの乱数を得たいのなら、rand()%13+8ってのはどう?
もっと素直に、期待する範囲の値を得られるまでループしてもいいけど。
>>407 たぶん
array[][]/60+8:array[][]%60
ああ、時間じゃなくて分なのか。じゃあ13とか8を適当に変えて。
>>407 内容は店のシュミレーションと言ってたけど、一定時間内に何人接客できる
かって事?それとももっと深い意味があるの?
一応、客の接客に何分かかるか、何分待たせたか、平均時間、などを だそうと思っています。
>>433 それは乱数で求めているから、結果はその乱数の幅の近似値になって
しまうと思うけど。時間帯によって、人口密度によって、待ち時間によって
マイナスになるもの、売上、接客係を増やすとどうなるか、等あると面白いかも。
あと、表示の仕方を直すのは多分こう。
printf("\n%d \t%d:%d \t%d \t%d:%d \t%d:%d \t%d \t%d"
, array1[tate][0]
, array1[tate][1]/60+8,array1[tate][1]%60
,array1[tate][2]
, array1[tate][3]/60+8,array1[tate][3]%60
, array1[tate][4]/60+8,array1[tate][4]%60
, array1[tate][5], array1[tate][6]);
>434 ありがとうございます。とてもたすかりました。
436 :
K&R三世 :03/05/15 14:57
>>402 最初の for ループで、totalTime が判定文に使われているが
この時点では値は不定だぞ。tate と間違えていないか?
438 :
デフォルトの名無しさん :03/05/15 17:35
>>439 そうなんですか。わかりました。どうもありがとう!
正直、最適化できないんじゃ要らないわけだが。
442 :
デフォルトの名無しさん :03/05/15 18:28
(^^)
444 :
質問厨 ◆Kwu0p51cCg :03/05/15 22:42
申し訳ないのですが質問です…。 大学のレポートなんですが。。。 #include <math.h> #include <stdio.h> int main(void) { float hankei; float hankei_2, hankei_3, ensyutyou, menseki, h_menseki, taiseki, pi, radius, r_2, r_3; printf("1つの実数(半径…単位:km)="); scanf("%f", &hankei ); ☆ pi=4.0*atan(1.0); ensyutyou=2*pi*hankei; hankei_2=pow( hankei, 2 ); menseki=pi*hankei_2; h_menseki=4*pi*hankei_2; hankei_3=pow( hankei, 3 ); taiseki=4*pi*hankei_3/3; printf("円の円周長=%5.1f\n\n", ensyutyou ); printf("円の面積=%5.1f\n\n", menseki ); printf("円の表面積=%5.1f\n\n", h_menseki ); printf("円の体積=%5.1f\n\n", taiseki ); return (0); }
☆の部分でatanが定義されてないというエラーが出るんですが どのように定義すればい良いのでしょうか? 検索エンジンで調べても全く分からず…。 どなたか…愛の手を。。。
>>445 もしかして「undefined reference to atan」ってやつか?
もしそうならコンパイル(リンク)時に-lm
わざわざすいません。 大学のウルトラCというソフトではエラー無かったんですが さっきダウソしたCマシーンというフリーソフトでは 「atanが未定義です」と出るんです。 >undefined reference to atan の意味も正直わからない初心者です。 初心者なんて嫌われるのわかってるんですが。。。
>>447 C Machineは無条件に捨てた方がいいかも。
標準関数は一部しか使えない。
あ。そうなんですか!! ありがとうございます。 >C Machineは無条件に捨てた方がいいかも。 そのお言葉聞けただけで安心しました。 大学のソフトではエラー無しだったんでOKです。 脳内解決させて頂きました。 ホント質問厨に付き合ってくれてありがとうございました。
>>449 >>39 にもっとましなコンパイラをダウンロードできるサイトへのリンクがあるから見てみては。
>449 >39
>451 かぶった。鬱だ。。。
>450-452 ここまでしてくれるとは思っていませんでした。(失礼。。。) ダウソしてます。頑張ります。 どうもありがとうございます。
久しぶりのシャバだぜ。 ムショにいた3年間、毎日C言語を勉強してきた。 C言語のことなら俺に聞け。
(・∀・)ムショムショ
教えてください。
多次元配列 A={{2,3,4}
{2,3,3}
{3,3,3}}
という感じで表示したいんですが、
これは、printf()で要素一つ一つを%d%d%d…A[1][1]A[1][2]A[1][3]…
という風にして表示するしかないんでしょうか?
何か配列を一気に表示する方法ってありますか?
本にも、ググってもで無かったから無いかな。。。
>>391-393 本には載っていないような豆知識は非常にためになります。
ありがとうございます。
i,jでループを回す。
458 :
デフォルトの名無しさん :03/05/16 00:15
>>456 for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
printf("%d", a[i][j]);
}
}
というかインデクス使わなきゃ配列のメリットがないだろ
>>457 ありがとうございます。
>>458 わざわざ、丁寧にソースまでありがとうございます。
教えてもらったら、すごい簡単なんだけど、まったく、わからなかった。。。
すごい基本的なことだけど、
今、手元にあるCの本、3冊にはのってませんでした。
C言語辞書みたいなのを買うべきかな。。。
>>460 見落としてるだけじゃないの?
じゃなかったらよっぽどDQNな本を買ったか
どんな本だよ。二次元配列のループ処理も載ってないの?
『C言語入門』 アスキー出版 『はじめて読むC言語』 アスキー出版 『よくわかるアルゴリズムの基本と仕組み』 杉浦賢 最後のやつはアルゴリズム中心でCのソースは おまけ程度なので仕方ないかも。 上の二冊は、今、はじめて気がついたけど どっちもアスキー出版だ。。。
入門書は一冊でいいから、3000円以上する本を買いなさい。
>>464 わかりました。
厚めのいろいろ載ってそうなやつ買おうと思います。
比較的、小さくて、薄めの本を買ってしまった。。。
registerとかvolatileとかのキーワードって どの位効果があるの? 普通の(ライブラリとかでない)プログラムでは考慮しなくても良い?
>>466 register はコンパイラが最適化するのでいらないかも。あっても害はないけど
volatile は割り込みとか使うときには注意したほうがいいかも
volatileは、割りこみ、スレッド、プロセス間共有メモリ、デバイスドライバなどを 書くときには必要になることがある。 例えば入力ポートはconstでvolatileだったりする。
>>466 setjmp()/longjmp()を使うときにはvolatileが必要になる。
registerヒントはいまどきのコンパイラだとほぼ完璧に無視するから 組み込みでもやらない限りは忘れていいよ
ありがとうございました。
>>467-470 K&Rに書いてある「最適化に関係のある特別な性質」って漠然としすぎw>volatile
472 :
デフォルトの名無しさん :03/05/16 01:38
>>471 それよか、コンパイラの初期設定に、「最適化を無視する」みたいなのを
やっとけばいいのではないの?
それじゃ全部無視されちゃうだろ。
>>470 殆ど揚げ足取りに近いんだが、
どんな場合でもregisterキーワードをコンパイラが無視しない場合がひとつだけある。
それはregister修飾された変数のアドレスを取れないということだ。
>>474 ?だからコンパイラがregister指定を無視するんじゃないの?
あったとしても アドレスが参照されたためregister指定を無視しました って旨のメッセージが出るだけだが。 エラーになるコンパイラがあるなら教えて。
reg.c ---------------- #include<stdio.h> int main(void) { register int i; printf("%p\n", &i); return 0; } ---------------------- $uname -a CYGWIN_ME-4.90 xxx 1.3.4(0.47/3/2) 2001-11-07 13:36 i586 unknown $gcc reg.c reg.c: In function `main': reg.c:4: warning: address of register variable `i' requested $ むぅ、警告されるだけですた。ANSI的にはどうなんだろう。
エラーにしろと言っているかどうかはしらないけど、アドレスは取れないことになっている。
致命的なエラー(回復できないエラー)じゃないからエラーにしないのかもね。
480 :
デフォルトの名無しさん :03/05/16 07:46
コボラーの書いたCのコードは性能が良いと聞いたのですが、 コボラーみたいに良いコードを書くコツを教えてください。
イスラム教のシーア派というのはC使いのことですか?
コボラーに限らず、まともなプログラマはまともなコードを書くよね。
483 :
K&R三世 :03/05/16 08:53
>>480 趣味でコボルやつは居ないからな。
大企業や官公庁の厳格な管理体制の下で鍛えられたから
安定した性能を誇るんでは?
マジレス希望です。
何処で聞いたんだ>480
プログラマ板です。
コボラーが書いたのが性能いいというと、思い当たる節がひとつだけある。 やつら、関数のパラメータを使わずグローバル変数で受け渡しするって話だから、 関数を呼ぶときパラメータをスタックに積むとかそういう操作しなくて済む分 性能がよくなるんじゃないのか? これくらいしかわからんけど、他になにかあるかな?
コボラーが使う いわゆる計算機はCPU時間いくらの世界だったので、その点にシビアというだけなのでしょう。
>>486 =480
「 コボラーみたいに良いコードを書くコツ」も、マ板で聞け
プログラムの種類によっては、データ依存型の言語の方が性能がいいプログラムを書きやすいよ。 つーか、ごみみたいなコードを書くコボラーもいるし、 素晴らしいコードを書くCプログラマーもいるけどね。
素晴らしいコードを書くCプログラマは元コボラー
493 :
デフォルトの名無しさん :03/05/16 11:37
質問なんですけど,普通のC(C++)で fgets(str,sizeof(str),stdin) などで取得したstdinのバッファを開放するにはどうすればいいですか。 MSじゃないのでfflushとかはout系のものしかサポートしていないんですけど・・・・。
>>493 何で開放したいんだ?
他のプロセスにか?
あ、解放か。
>>492 俺、元コボラーじゃないよ。
495 :
デフォルトの名無しさん :03/05/16 11:41
C++でいう fflush(stdin) もしくは rewind(stdin) という動作をしたいんですよー。知ってたら教えてください??
>>494 それはつまり、「俺は素晴らしいコードを書くCプログラマ」だと言いたいのですね?
fseek(stdin,0,SEEK_END);
499 :
デフォルトの名無しさん :03/05/16 14:21
socketでAF_SECURITYの使い道おしえてください。
socketは標準Cの範疇にないのでスレ違い。 ついでに言えば、ぐぐればヒントが得られるんじゃないか?
501 :
デフォルトの名無しさん :03/05/16 15:41
>>480 >良いコード
まず、おまえの言う「良いコード」ってどんなコードよ?
503 :
デフォルトの名無しさん :03/05/16 17:20
>>205 #include <stdio.h>
#define DBG_PRINT( str ) printf( "Variable " #str "\n" )
int main( void )
{
int test;
DBG_PRINT( test );
return 0;
}
こんな感じか?
きちんと設計してから書け。 Cプログラマが負けるとすれば多分そのあたりだ。 あいつらは仕様書に書いてないものは決して作らないからな。
仕様書の行間も読まないしな。
Cobolはデータ設計しないと書けないよねぇ。 Cだってきちんと設計すればいいものができると思うのだけど やっつけ仕事ができちゃうからね。 #特にVC++なんかはもう・・・
>>507 それは言語の問題ではない。
ツールに踊らされてる馬鹿の問題。
509 :
デフォルトの名無しさん :03/05/16 19:02
sageていいですか?
いくらでもsageたまえ
511 :
デフォルトの名無しさん :03/05/16 21:01
int char x[12][6][7] = { 0 }; これの{ 0 }の部分はどういうことですか?
要素を全て0で初期化したいんじゃネーノ?
513 :
デフォルトの名無しさん :03/05/16 21:11
514 :
動画直リン :03/05/16 21:11
しったかぶってごめん。
合ってるよ
memset(x,0sizeof x);
配列や構造体で1つでも初期化するデータを指定した場合、 初期化するデータを指定しなかったところは全て0で初期化される。 これ、仕様。
520 :
デフォルトの名無しさん :03/05/17 00:13
おせーてください Cででてくる関数exp(x)はどうやって作られてるんですか? xが自然数なら簡単ですけど、実数で定義されてますよね? まさか、テイラー展開?
<math.h>
522 :
デフォルトの名無しさん :03/05/17 00:19
最近C言語を学び始めた者ですが、例題で分からないプログラムがあります。 コンパイルまではエラーなしなのですが、実行しようとするとエラーが出て 実行できないんですよ。どこが間違っているのか教えてもらえないでしょうか? 例題のプログラムは次の通りです。
>>522 配列の範囲を超えて書き込んだりしているんじゃないの?
もしかしてスレ違いでしたか?
'次'というのはどれのことですか?
どのスレがいいのか分からないんで一応、書いちゃいます。 #include <stdio.h> #define N 20 double largest2(double, int); main() { int k; double x[N]; printf("入力された実数の中で最大のものを出力します\n"); for(k = 0; k < N; k++) scanf("%lf", &x[k]); printf("最大のものは%lf\n", largest2(x[k], N)); } double largest2(double x[], int n) { double max; int k; max = x[0]; for(k =1 ; k < n; k++) if(max < x[k]) max = x[k]; return max; }
>>527 largest2において、仮引数と実引数の型が違うぞ。
本当にエラーも警告も出なかった?
その前にプロトタイプ宣言と定義がことなるんだ。 これはエラーになるはずだけど・・・
>>528 largest2で使う変数などの型は統一しないといけないのですか?
コンパイラはvisual C++なんですけど、コンパイル時にはエラーなしで
警告は一つでました。
>>529 mainのほうは自分で書いて、largest2の定義はコピペですので。。
>>530 double *とdoubleじゃ明らかに違うだろう。
double largest2(double, int);
を
double largest2(double *, int);
にして、
largest2(x[k], N)
を
largest2(x, N)
にする。
>>534 自分で FreeBSD 使っているのに、忘れていました
exp意外と単純ですね
ありがとうごぜーますた
#include <time.h> #include <stdio.h> main() { clock_t start,end; char c; start = clock(); printf("Press a key followed by ENTER: "); scanf("%c",&c); end = clock(); printf("Elapsed time = %f\n",(end-start)/CLK_TCK); } bccでコンパイルするとうまく動くんだけど、gccでコンパイルするとうまく動かない。 実行結果 bcc: Press a key followed by ENTER: Elapsed time = 1.772000 gcc: Press a key followed by ENTER: Elapsed time = 0.000000 なんで?
CLK_TCKって何?
clock_t って整数じゃないの?
普通、秒数なら(double)(end-start)/CLOCKS_PER_SECってやるよね。
>(double)(end-start)/CLOCKS_PER_SEC これも試してみたけどgccだとうまく動かない。 コンパイルする時になにかオプションでもいるの? それともcygwin上だとうまくいかないのかな。
cygwin上のgccを使って試した。
>>537 はElapsed time = 0.000000になったけど、
>>540 にしたら、大丈夫だった。
543 :
デフォルトの名無しさん :03/05/17 08:49
>>543 誰がお前じゃ。もう一度言うてみろ糞餓鬼
>>543 言うことは、いっちょ前やね。
具体的にやりかた書いてみそ。
>>544 誰が糞餓鬼じゃ。もう一度言うてみろお前
>>545 お前もデバッグの仕方すら解らないのか?
デバッグの方法を教えてください。
printf
550 :
デフォルトの名無しさん :03/05/17 13:02
0x15aa は二進では 1010110101010と書いてあったんですが、 じゃあ0x15aaは何進数なんですか? それともプログラム専用の書き方みたいなもんですか?
552 :
デフォルトの名無しさん :03/05/17 13:10
xまであるところを見ると36進数より上だとは思うのですが?
>>550 4桁の2進数 16進数
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 a
1011 b
1100 c
1101 d
1110 e
1111 f
554 :
動画直リン :03/05/17 13:11
>>553 あんたは偉いな
>>550 プログラミング以前に勉強することがあるようだな
とりあえずコンピュータの基礎から始めろ
コンピュータの基礎やっても意味ないよ。無関係だから。
>>550 >0x15aaは何進数
C言語の場合、数字の前に0x書くと、その数値は16進数表記していることを意味する。
なお、数字の前に0を書いた場合は8進数。
#include <stdio.h>
int main(){
int a = 010;
int b = 10;
int c = 0x10;
printf(" 8進数 : %o %o %o \n",a,b,c);
printf("10進数 : %d %d %d \n",a,b,c);
printf("16進数 : %x %x %x \n",a,b,c);
return 0;
}
556 名前:デフォルトの名無しさん * sage 本日のレス 投稿日:03/05/17 13:25 コンピュータの基礎やっても意味ないよ。無関係だから。
>>550 こういう入門書の一冊も読まずに質問するやつは無視してほしい。
そこまで責めなくても・・・
>>563 は幼いが言ってることはもっと幼い。死んでくれ。
ガキじゃねえんだから......
563 名前:デフォルトの名無しさん 本日のレス 投稿日:03/05/17 14:34
>>547 プッ、やっぱり書けないだ
ああ、今日は学校が休みなんだな
>566 漏れはデバッグ方法なんかしらねえ 勝手に人違いするな
>567だった 鬱だ詩嚢
>>567 標準出力が使える場合: printf
エラー出力なら使える場合: frpintf(stderr, ...)
どちらも使えない: fp=fopen(...);fprintf(fp, ...)
漏れの場合、おまいらと違ってバグを出さないから デバックは不要なんだよな・・・ ま、せいぜいガンガってくれ。
バグを出さないプルグラマはただのプルグラマだ
ちょっとずつ書きながら確認してるからデバッグなんかしないし。
あ?とりあえずは
>>573 的な方法でやってるが。
あとはデバッガーでトレースするとか。
それでも駄目なら、
>>570 か。
というか、そもそも
548 :デフォルトの名無しさん :03/05/17 09:38
デバッグの方法を教えてください。
ネタだろ?がっつくなよ。
576 :
デフォルトの名無しさん :03/05/17 17:32
構造体のビットフィールドがよく分かりません。 どのHPも扱ってなかったので2chに頼るしかなくなりました。 どうか教えて下さい。
あまり使わないもんだが、普通入門書でも説明されてるだろう。
おまいら教えてやれよw
おまえらとっととおしえろよ
「構造体のビットフィールド」で検索すればいろいろでてくるが、
>>578 のいうとおり。
582 :
デフォルトの名無しさん :03/05/17 17:41
#include<stdio.h> main() { int i,x=2; for(i=1;i<1;i++){ x=x*x; } printf("%d"); } 実行結果は「2」となります。 変数xに2を代入して二乗、それをもう一回二乗させて4という 答えを出したいんですが。できません。。。 何が間違っているかもわかりません。 教えてください。
583 :
デフォルトの名無しさん :03/05/17 17:41
まあどこがわからないのか書いた方が答える方も答えやすいわな
printfの行をよく見ろ。
>>582 for文の中にprintf("hello!\n");
とでも入れてみろ
画面には何がでる?
> 2を代入して二乗、それをもう一回二乗 16
>>577-581 ありがとうございます。おかげで分かりました。
使うのは避けたほうがいいんですね。1つ勉強になりました。
ありがとうございます。
for文も通らないだろ
591 :
デフォルトの名無しさん :03/05/17 17:55
>582 printf("%d"); > printf("%d",x); for(i=1;i<1;i++) > for(i=1;i<2;i++) これで4になると思うけど
for文がおかしい気もしますが 一回ループします i=1は一回ループしたあと、設定されているようです。 i<=1,i<1,i<=2などいくつか試したんで 間違いないと思います。 > 2を代入して二乗、それをもう一回二乗 16 ↑ すいません、そうです。 二回2乗させて16です。
>>591 ありがとうございます。
printf("%d"); > printf("%d",x);
↑
これに気がつきませんでした。
for(i=1;i<1;i++) > for(i=1;i<2;i++)
↑
これは、僕もそう思います。
ただ、何故かいろいろ実行して試してみると。。。
とにかく、ありがとうございました。
いろいろやってみます。
594 :
デフォルトの名無しさん :03/05/17 17:59
>>592 もう一度for文を説明しているページをよく読め。
>>591 >for(i=1;i<1;i++) > for(i=1;i<2;i++)
今、やってみたけど、
やっぱり、これであってました。
僕がミスってました。
すんません。。。
そして、ありがとう。
まともに解説してある入門書があったら教えて欲しい項目。 ・ビットフィールド ・sprintf()系、sscanf()系のフォーマット ・strtoken()の使いこなし ・qsort()/bsearch()の使いこなし ・暗黙の型変換
598 :
デフォルトの名無しさん :03/05/17 18:13
>>597 そういうのは入門書を読むようなレベルの人はまだ覚えなくてもいいです
>>597 >・ビットフィールド
使わなくてよし
>・sprintf()系、sscanf()系のフォーマット
MSDNで十分
>・strtoken()の使いこなし
使わなくてよし
>・qsort()/bsearch()の使いこなし
使わなくてよし
>・暗黙の型変換
MSDNで十分
いつも思うけど、プログラム系の参考書って高いよな。
>>597 > ・ビットフィールド
>>578 ,
>>581 > ・sprintf()系、sscanf()系のフォーマット
オンラインマニュアル
> ・strtoken()の使いこなし
これは漏れも知りません。
strtok()のことなら使いにくいので無理して覚える必要なし。
> ・qsort()/bsearch()の使いこなし
> ・暗黙の型変換
>>598
>>599 その使わなくてよし(ビットフィールド以外)というのは
>>598 の理由で?
>>600 買う人が限られているからかな?医療系はさらに高いらしいね。
604 :
デフォルトの名無しさん :03/05/17 21:06
C言語で構造体を使う方法を教えてください。
>C言語で構造体を使う方法を教えてください。 使わなくてよし
>>604 char s[200];int a,b;
&s[0] = a;
&s[sizeof(int)] = b;
>>612 ねたを書くならわかるけど、ホントにボケててどうするよ。
*(int *)&s[0] = a;
*(int *)&s[sizeof(int)] = b;
って書かなきゃ。
>>613 それをマクロで定義しとけば構造体( ゚听)イラネ
615 :
デフォルトの名無しさん :03/05/17 23:20
>>597 とりあえず、「ANSI C言語辞典」でも買っておけ。
616 :
デフォルトの名無しさん :03/05/17 23:24
>>603 >*そういえば友人が作ったプログラムで、高速化のためにフラグを全部
>ビットフィールド風に扱っているのがあったなぁー
ビットフィールドの方が参照に時間かかりそうだけど…。
ちょっと興味あるから詳細キボヌ。
>597 僕が比較的妥当な内容だと思う本なので、あなたにとってベストか分かりませんが... 「C言語 関数の使い方+作り方」(技術評論社刊)、辞典と言う形態ですが「ANSI C言語辞典」(同) の2冊があれば標準関数の理解には充分かと思います。 標準関数の中には、たとえ使わなくても、理解する価値があるものが多いです。str、scanf系は特にそう思います。 これらを読んでも分からない事は、他の本やnetの情報を拾い読みすると良いと思います。 がんばって下さい。
618 :
デフォルトの名無しさん :03/05/18 05:19
scanfは標準出力のバッファをフラッシュするの?
619 :
デフォルトの名無しさん :03/05/18 06:03
( ´_ゝ`)プッ
文字に色つけたいんだけど無理?
621 :
デフォルトの名無しさん :03/05/18 08:59
コンパイルして実行するとなにかキー押すまでDOS画面が閉じませんが exeファイルから実行するとキー押す前に消えてしまうのですが 消えなくする方法ありませんか?
getchar();
>>621 プロパティで
「プログラム終了時にウィンドウを閉じる」
のチェックをはずせばよいよいよい。
>>620 このスレ的な答えは「標準Cではできない」だが、
OSなどの環境くらい書こうよ。
>>620 マジックで塗れ。
と言う冗談はさておき、環境依存だからあんたの環境にマッチしたスレへ Go!!
ネタは結構(^_^;) マジレス希望
627 :
デフォルトの名無しさん :03/05/18 09:53
>>623 exeファイルのプロパティですか?
見当たらないのですが(;´Д`)
>620 SetTextColor();
>>627 プロパティがないのか項目がないのか。
そもそもOSは何だ?
>>629 そのOS is Windowsみたいな発言止めてくれんか?恥ずかしい。
>>630 DOS画面とかexeとか言っているあたり、Windowsしか考えられないが。
家のパソコンは常時DOS画面なんだよw
>>629 (;´Д`)項目が見つかりません
OSはXPです
OSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPです OSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPです OSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPです OSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPです OSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPです OSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPです OSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPです OSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPです OSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPです OSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPです OSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPです OSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPです OSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPです OSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPです OSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPです OSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPですOSはXPです 火に油をどぷどぷと・・・
漏れはいまだに95使ってるってのに、 XPなんて贅沢だ!
独学で勉強しているのですが、MSDNの読み方がよくわかりません。 例えば、 scanf("%d" ,&num); は scanf("変換仕様", &変数) というように学んだのですが、MSDNの説明で int scanf( const char *format [,argument]... ); の場合、意味がわかりません。 MSDNの読み方を説明しているサイトってありますか?
Vine Linux2.5上のemacsでC言語を書いてるんですが、 emacsで文法ごとに色分けしてくれる設定ってないですかね? 知ってる人教えてください。お願いします。
(;´Д`)で結局、どうやって閉じないようにするんでしょうか、、、
>>639 だからスレ違いなんだってばさ。
>>638 文法ごとって?
特定のキーワードに色をつけるコードはあったと思うけど。
>>637 その、const char*formatが君の習った変換仕様の型だ。
MSDNの読み方以前にCの文法の勉強をした方がいいんじゃないのか?
>>639 だからgetch();かgetchar();を最後に入れろと。
>>637 返り値がintで関数名がscanfで
引数の一個目の型がconst char*で、場合によっては追加の引数があるということ
643 :
デフォルトの名無しさん :03/05/18 12:44
>>637 誰かに教えてもらわないと無理よ。いくら高級言語でも独学では非常に
厳しいわよ!昔の私がそうだったように!ある程度教わったら基本情報の
試験受けなさい。(私のころは第2種)たとえ落ちても、第2種の試験勉強
してればわかるようになるわ!
644 :
デフォルトの名無しさん :03/05/18 12:51
>>620 そうそう書き忘れたけどprinf("\xlb[色番号 m");
でも色が変わるわよ!
なんで皆して環境依存の話してるんだよぅ
>>644 win98以前でないとDOSのエスケープシーケンスコードは使えんかった気がする。
俺のマシン、XPだから確認不可能なんだけどね。
ってかそれ以前に「l」は16進数でないだろ
winとかdosしか知らん連中が多いのぅ...その上みーんな自分と同じ環境と思うておるんかのぅ....
Windows のシェアからしてしょうがない。
定期的にこの話題と会話がでてくるよなぁ
シェアが大きいと、そうなるんかの? なんだかしょっぱいオツムだのぅ...。
win、dos、mac、nuix、後他に何がありましたっけ?
一応環境っと OS windows 2000 コンパイラ gcc 環境に依存するスレってどこだろ?Σ(゚Д゚;≡;゚д゚)ドコ?
658 :
デフォルトの名無しさん :03/05/18 15:45
strcspnを使って文字列から特定の文字列を切り出そうとしているのですけれど 2バイト文字の1部が一致するためそこで勝手に区切られてしまうのです。 charset"[]"を使って切り出そうとしたんですけど2バイト文字"ー"が81 5Bで "["は5Bなので"["でないのにそこまでの文字数しか返してくれないのです。 2バイト文字の存在を考慮した場合どういう考え方で処理を書かないといけないでしょうか?
なんかUNIXとか知ってる奴って偉そうで嫌味っぽいな。
char[]から1文字(=1byte/2byte)を取得する関数を作ればいい。 使用する文字コードにもよるが、 読み込んだ文字が1byte文字の範囲ならばそのまま返し、 2byte文字ならば更に次の文字を読み込んで結合して返せばよろしいかと。
>>658 S-JISなら1byteずつ読んで8x,9x,Exの時は次のbyteを飛ばす
>>657 Windows2000 で gcc か...。
Cygwin とかは入れてないってことだな。
とりあえず、
Win32API 質問箱 Build11
http://pc2.2ch.net/test/read.cgi/tech/1052651750/ が一番近いかと。
ただ Win2K + gcc の組み合わせで使ってる人ってあまりいないから、自分で色々調べることができないと辛いと思うよ。
>>659 まあ、ここは「C言語」のスレだから Windows 前提で来られても困る。
嫌味と言うのは、個人に属することなのでコメントはしないけど。
>>658 strcspn() は2バイト対応じゃないからしょうがない。
環境はよくわからんけど、_mbscspn() みたいな奴はないのか ?
>>662 あ、cygwin上のgccでした。説明省いてスマソ。とりあえずそこ見てみます。
>>659 それは厳密には、「Linux」を使ってる奴ら、な。
奴らと一緒にしないでくれよ。
>>663 Unix 板の Cygwin スレにでも行くと吉。
定数はマグロにするといいと聞いたのですが、どういう意味なんでしょうか? マグロ関数とかと何か関係があると想像してるんですが・・・
もっとひねれ
>>663 だから環境はきちんと書けとあれほど...
久しぶりに C でプログラムを書いてみたのだけど、 Java に慣れきってしまったせいで、 エラーだしまくり ^^; 昔はすらすら書けたのになぁ、、、
>>643 基本情報の勉強だけではC言語なんて身に付かないと思うけど。
あれはあくまでも用語の勉強。
嘘だよ
674 :
デフォルトの名無しさん :03/05/18 19:36
ベクターワークスを使っていて、ある操作(編集→すべてを選択、加工→合成)で必ず、Microsoft VisualC++ Runtime Library RuntimeError! abnormalprogramtermination と表示されOKするとそのアプリが強制終了になってしまします。 そのときは OK しかクリックできません。スレ違いかもしれませんけど、たどり着いたのがここでした!
_mbscspn()を使うと簡単に出来てしまいました。662さんありがとうございます。 ですがこのまま判らないままにするのもアレなのでちょっと2バイト文字について 勉強してみようと思います。せめてこの部分が自力で実装できるぐらいにー。 660,661さん参考にさせていただきます。 とりあえずShift-JISが何たるかから・・・。
nCrの計算てどんな風に書けばいいんでしょうか?
680 :
デフォルトの名無しさん :03/05/18 20:57
float.h を眺めていると、LDBL_DIG が 15 で、DECIMAL_DIG が 17 と 定義されていたのですが、どうして DECIMAL_DIG の方が大きいのでしょう? 自分の理解ではこの2つは同じでないといけないと思うのですが。
よく調べたら定義上違って当然だった(汗 同じになるのは基数が10の整数乗の場合です、はい…
683 = 680 です、すいません。
685 :
デフォルトの名無しさん :03/05/18 22:36
処理系ってコンパイラのことっすか?
686 :
デフォルトの名無しさん :03/05/18 23:36
volatileって使い道あるんですか?
>>686 ある。
マルチスレッドとか、デバイス制御とかやってると必須。
要するに自分以外が変数を勝手に書き換えちゃったりする時に使う。
>>688 よくイメージがわかない・・
constと違うんですか?
コンパイラが最適化するのを防ぐのもある
autoと単項+演算子以外は意味がある。
volatileの説明に その変数の値が、明示的に定義されていない方法で変更され得ることをコンパイラに 知らせることになる。 と書いてありました。「明示的」?
694 :
デフォルトの名無しさん :03/05/19 00:08
>>689 const は、そのシンボルを通じて書き込みが出来ないと言う指定。
volatile は、現在動いているプログラムとは違う要因で書き換えられる事がある、と言う指定。
while(a); 一見aの値が変わらないように見えるから無限ループだけど、もしも他の要因でaが書き換えられることがあったら・・・ でもそんなことコンパイラは分からないから、volatileつけないと条件式すらなくして完全な無限ループにしてしまうかも。
697 :
デフォルトの名無しさん :03/05/19 00:14
>>695 他のスレッドやハード的な要因で書き変わることが有り得る、と言うこと。
あ、aの初期値が0以外の場合ね
DirectInput8.1 なんですけど、 一度だけ、キー判定したいのだが、 これだと何故か、連続判定してしまいます。 ああ、アクションゲームが作れないよ〜。 だれか、教えてください。 BOOL GetKeyOnce( BYTE bKey ) { static bool bb_Flag = true; // キーボードの更新 lpDevKeyboard->GetDeviceState( 256, KeyboardData ); // キーが押されているか if ( KeyboardData[bKey] & 0x80 && bb_Flag == true ) { bb_Flag = false; return TRUE; } // キーが押されていない else { bb_Flag = true; return FALSE; } return FALSE; }
volatileつけると、勝手にレジスタに配置したりしなくなるんだっけ?
701 :
デフォルトの名無しさん :03/05/19 00:19
>>696 なんとなく分かったような気がしました。
でも他の要因って??馬鹿ですいません
>>697 プログラムと関係のないところで変数が変わるんですか?
便乗ですが、構造体やクラスのメンバの場合でも volatile の指定が必要に なる(メンバがそのような最適化の対象になる)ことはあるでしょうか。
>>704 一部のメンバーをってのは無理だろ?
構造体変数全体を。
メンバにvolatile付いてるのは何か間違ってる可能性が高いと思われ。
>>702 一番試しやすいのはシグナルによって呼び出される関数かな。
>>707 すいません。まったくわかりません。
まだまだ初心者ですね>俺
Cはじめて1ヶ月なのでまだまだ勉強しないと。
出なおしてきます。答えてくださったみなさんありがと。
プロでも分野によっては全然使わないと思う。
>>702 対象のオブジェクトが、ハード的に変化するようなレジスタとかな。
>>705-706 なるほど、機械語レベルの話はよく分からないのですが、メンバが
最適化される可能性はないと考えていいのですよね。
すいません。消えたはずの
>>708 です
ぐぐってみたのですが、英語ばっかだったので無理でした。
英語力も重要ですね。
>>709 そうですか。使わない分野に進みたいです。
>>710 すいません。PC内部?的なことはさっぱりです
>>711 メンバーには型しか指定できず、記憶域などは指定できないんじゃないかということ。
ちなみに、C++のクラスは知らない。C++しらないから・・・
>>711 ,
>>714 volatile を根本的に誤解していました。宣言時ではなく定義時に
どこに取るかということなんですね。
>>714 volatileは記憶域の指定じゃない。
>>705 今し方、VC でテストプログラムを組んだ所、
問題なくコンパイル出来ますた…。(;´Д`)
>>719 まじだ(;´Д`)
gccで-ansi -pedanticつけても通る(;´Д`)
意味上ではどうなるんだろ。
staticはだめか。 記憶域指定だけがだめなのかな。
>>722 gccではパースエラーになったよ。
struct testkozotai{
int n;
static int c;
};
volatile修辞された変数へのアクセスは省略されず、 シーケンスポイントをまたいで順序変更されないことが保証される。 構造体メンバを修辞しても意味は同じ。 ってことでよろしいか?
>>723 そう言う意味か…。
static に volatile 宣言だと(ry
728 :
デフォルトの名無しさん :03/05/19 02:06
分岐命令で次の命令の先頭アドレスを基準に分岐先を 指定しているアドレス指定方式はなんて呼ぶんだ?
相対アドレス指定か? すれ違いだ
>>729 どこで聞けばいいか分かんなかったから
とりあえず分かる人がいそうなここに書いちまったスマソ
気が向いたらこっちも教えてくれ
出力ポート・入力ポートのアドレスを指定しているアドレス指定方式は?
情報処理の勉強したほうが早いぞ
>>731 情報処理の勉強中なわけなんだが_| ̄|○
ちがうよ
いいえ、その通りです
main 関数で、 main(int argc, char **argv) と main(int argc, char *argv[]) の2つがありますが、好きなほうをつかっていいのですか?
738 :
デフォルトの名無しさん :03/05/19 14:22
main(int argc, char *argv[])で argc argvはなんて読めば良いのですか?
>>737 相互に置き換え可能。
同様に、
char *strfunc(char *s);
と言う関数宣言があったとすると、
char *strfunc(char s[]);
と宣言しても構わない。
まぁ、混ぜると読みにくいから適当に統一しとこうや。
>>738 ぐぐればいろいろ出てくると思うぞ。
私は「アーグシー、アーグヴイ」と読んでるが。
>>739 > 同様に、
> char *strfunc(char *s);
> と言う関数宣言があったとすると、
> char *strfunc(char s[]);
> と宣言しても構わない。
宣言も置き換え可能なのですか。
知りませんでした。
ありがとうございます。
>>740 念のために付け加えるけど、宣言で置き換え可能なのは
関数のパラメータの場合だけだからな。
関数の戻り型は置き換えできない
char *strfunc(char *s); → char strfunc(char *s)[];(できない)
し、大域変数も置き換えできない
char *str; → char str[]; (できない)
>>742 補足しとこう。
> 関数の戻り型は置き換えできない
> char *strfunc(char *s); → char strfunc(char *s)[];(できない)
これは宣言自体ができない(syntax error)。
> し、大域変数も置き換えできない
> char *str; → char str[]; (できない)
この二つは意味が異なる。
struct aho{ struct x xx; struct y yy; }*baka; struct hoge{ struct x xx; struct y yy; }piyo; 上記のような構造体があり bakaをpiyoにコピーしたいんですが memcpyはキケンと耳にしました。 ホカに方法があるのでしょうか? ごきょうじゅおねがいいたします。
>>744 piyo.xx = baka -> xx;
piyo.yy = baka -> yy;
bakaをpiyoにはコピーできないと思うが。 #彼方ポインタ、此方実体。 また、全く同じ構造の違った名前の構造体を設計するのを止めた方がいい。
piyo = *baka; じゃだめなの? bakaが何指してるかは置いといて。
あ、typedefしといてキャストすればいいのか! ついうっかり。
>>749 一応memcpyでも大丈夫ではあるけど、
いくらメンバが同じでも違う構造体をメモリコピーするのはあまりよろしくない
過去ログにあったと思うが、メンバの変更とかが容易に出来なくなるから
質問スレでそういう無作法を堂々と教えないように。
そもそも何で同じ構造の二つの構造体があるのかと 聞くほうが大切ではないかね?
そりゃそうだ。
自分自身のexeのパスを取得するにはどうしたらいいですか?
>>755 そういうのはWin32API質問箱スレのがいいんじゃないかな。。
一応GetModuleFileNameとかで取得できたと思うけど
>>756 Win32API使わないと無理でしたか・・・。
ありがとうございました。
フルパスで起動してくれればargv[0]を参照することで調べられるんだけどな(^_^;)
>>374 デフォルトコンストラクタは呼ばれるけど、
int とかだと「何もしない」んで値は未定。
ただ、変数が静的だと 0 で初期化される。
これは C と同じ。
あと、1 つでも初期化したら後ろは全部 0 で初期化される。
だから、
int vec[100] = { 0 };
ってやったら全部 0 で初期化される。
これも C と同じ。
int new したときは fill_n でも使って初期化汁。
C++スレからの誤爆か?
犬の糞みたいな名前のOSが死滅するって本当ですか?
>>756 正直、環境も聞かずにそう答えるのもどうかと思われ。
>>763 OSの察しはつくかもしれんが、コンパイラが(ry
>>765 WIN32API等がつかえるコンパイラかどうか判断できない、ということでわ
地球のみんな、オラに少しだけC言語の知識を分けてくれ。
○ 火
C 火
c 火
%lu は 符号なしの long 型ということでOKですか? 変換指定子が2つ続くのははじめてみたので。
%ldってのもあるし。
%ld hoge.o -o hoge %./hoge
リンカ〜かよ
775 :
デフォルトの名無しさん :03/05/20 12:42
DOS窓のサイズは機種依存ですか?僕のは25X80ですが。
>>775 25桁しかないとは窮屈だな。
うちのは80*1000あるぞ。
777 :
デフォルトの名無しさん :03/05/20 12:45
778 :
デフォルトの名無しさん :03/05/20 12:57
>>776 すごいですね。Win32APIを使えばサイズを変えられるのは知っていたの
ですが、画面に収まり切らないような気もするけど。
>>777 C言語のコードを書いて実行するとDOS窓がでるので、ココでいいのかなと。
すみません。
>>775 PC/AT互換機のテキストモードは
25x80
43x80
50x80
が使えるが、日本語は表示できない(当然)。
多分おまいはテキストモードを使ってない。
DOS「窓」なら機種依存ではなくOS依存だ。
>>778 スクロールバー・・・
多分、横が80で、縦が1000なんだよ。
>>779 教えてくれてありがとう。調べないで質問したので、サイズにパターンが
ある、テキストモードのことを知りませんでした。調べてきます。
>>780 なるほど。そうですよね。
つーか、どこが言語の質問だよ。
今日の流れはホノボノなのか殺伐なのか・・・
785 :
デフォルトの名無しさん :03/05/20 16:55
enum LENGTH{ LONG, MIDDLE, SHORT }; enum SIZE{ LARGE, MIDDLE, SMALL }; "MIDDLE"はかち合ってしまいますか?
>>785 かちあってしまいます。MIDDLE単体で使用するから。そうなるとenumの
名前はプログラム的には別に必要ないような気が。識別するための物かな。
787 :
デフォルトの名無しさん :03/05/20 17:01
プログラムで再帰的関数を使うと なぜ処理が遅くなってしまうんですか? 論理を教えてくださいまし
>>785 Cのenumは使い勝手が悪い。
enum LENGTH{
LENGTH_LONG, LENGTH_MIDDLE, LENGTH_SHORT
};
とでもしれ。
しかし、それくらい試してから聞けよ。
>>787 関数を呼ぶのに(スタック)時間がかかるから。
790 :
動画直リン :03/05/20 17:11
791 :
デフォルトの名無しさん :03/05/20 17:11
その関数を呼ぶのにスタックがかかってしまうのは再帰的関数だからですか? 再帰的関数の中では何が起こってしまうのでしょうか。 おせーてくださいまし
後再帰とかは、逐次的(いわゆるループ)に書き直せる。 この場合、逐次的に処理した方が処理が速い。 で、なんでかというとだね、関数呼び出しを 「パラメータと結果の返信先を手紙に書いて相手に渡す」 ようなもんだと考えるとわかりやすい。 結局自分で処理をするのに、いちいち自分宛の手紙を書いて自分で受け取る。 手紙の指示に従って処理をして次の手紙を書いて、自分で受け取る。 手間がかかるだろ? でも、パラメータを一覧表(ループ)にして、順に処理していくだけなら 手紙を書く手間が省けるってもんだ。
793 :
デフォルトの名無しさん :03/05/20 17:22
神よありがとうございますたー。 助かります。
手紙を書く、と書いたのを実際の内部処理に置き換えてみると 1.パラメータをスタックっていう、メモリにコピーする 2.処理が終わった後の戻り先を、スタックっていうメモリにコピーする になる。 ついでに手紙を受け取る先では、今まで処理してた内容を忘れないように スタックっていうメモリに作業用のメモ書き(変数)をおいておいて、 2度目に再帰的に呼ばれた場合でも前の作業内容が消えないように 保存する必要がある。 再帰せずに一つのループで処理するように書くと、 スタックの利用が最小限で済むし、スタックへのコピーも最小限で済むし、 作業領域もメモにいちいち書かず頭の中(レジスタ)だけで処理できる場合がある から、結果的に速くなるんだ。
795 :
デフォルトの名無しさん :03/05/20 17:47
bessel関数を計算する方法を教えて下さい 無限和を足していく方法が上手くいかなかったんです
796 :
デフォルトの名無しさん :03/05/20 18:04
enum EN1{ XX=0 }; enum EN2{ XX=1 }; int main() { enum EN1 hoge; enum EN2 ho; hoge = XX; ho = XX; printf("%d%d", hoge, ho); return 0; } これなら問題ないでしゃうか?
>>796 >>788 > しかし、それくらい試してから聞けよ。
実際に試してみて、期待した動作になればそれでいいだろ。
>>794 遅くなる根本原因はスタック退避ではなくて呼び出し手続きのほうにあると思うのだが。
#パイプラインは壊れるし、デバッグオプションをつけていればスタックの監視も入るしね。
799 :
デフォルトの名無しさん :03/05/20 19:37
質問です。 forまたはwhileの繰り返しを使って(たとえ配列を知っててもつかわずに)、ある指定した数以下の 素数を全て出力するプログラムを作成しなさい。 また、作成したプログラムで指定した数をnとしたとき、プログラムでどのくらい繰り返しが 行われるを考察する ということです。 具体的には前半部分では2〜100の素数を出力したいです。 後半部分では、適当な仮定をおいて、繰り返し回数をnの関数で与える 事(nが十分大きいとき、n以下の素数π(n)⇒n/lognという素数定理 を用いて考えたいです。 お願いします
803 :
デフォルトの名無しさん :03/05/20 21:42
C言語で文字列をコピーする方法を教えてくださいませ。
strcpy
>>802 もれ、プログラム組んで教えてあげたんだけど... 鬱だ...
マルチポストかよ...
>>805 そして見たら、プログラム間違えてて更に欝だ...
807 :
デフォルトの名無しさん :03/05/20 22:01
fopenでファイルを開いたあとはどうすればいいんでしょうか。
再帰関数を利用してのパスカルの三角形を作りたいんですが、 三角形の形までは作れましたが、nCrの計算の部分がわかりません。 どなたか軽い見本でも見せてくれればうれしいです
>>807 何かする必要性を感じないないなら、
何もしなければいいんじゃない?
中学数学も忘れちまった・・・ コンビネーションはn!/r!だっけ?
>>807 正常に開けたのなら、fcloseで閉じる
>>810 コンビネーションは n!/(n-r)!r!
とおもったらここは数学スレじゃねえな。
malloc(0); 場合は、何が返るんでしょうか? freeしても安全ですか?
>>813 何が返るって、戻り値を調べればよいのでは?
C FAQ嫁
いつもNULLが返ってくるという保証はありますか?
>再帰関数を利用してのパスカルの三角形を作りたいんですが、 >三角形の形までは作れましたが、nCrの計算の部分がわかりません。 >どなたか軽い見本でも見せてくれればうれしいです coco. www.geocities.co.jp/SiliconValley-Oakland/1680/memo0012.html
心配なら0を渡すことがあるようなコードを書くなYO
>>818 0というケースがあるんです。
あんまり例外を作りたくないので。
malloc(sz ? sz : 1) くらいの知恵は使おう。 MFCのソースあるならCStringの実装を真似てみてもいいかも。
822 :
デフォルトの名無しさん :03/05/20 22:31
ファイル名の変更はどうやるの?
rename
>>823 悲しいな。
一番上がPerlの話題だ。
826 :
デフォルトの名無しさん :03/05/20 23:01
Cでマルチタスクにする方法ってあるでしょうか?
>>826 環境依存じゃなかったかな
_beginthreadとかforkとか
828 :
デフォルトの名無しさん :03/05/20 23:20
すいません UNIX-Cの標準関数が載ってるサイト知りませんか? 今までANCI-Cしか使った事なくて。 system系の関数とか詳細に載ってるとこあれば教えて欲しいです
>>829 manだと目的から探すのが無理っぽいと思われ。
目的から探すなら本を買えよ・・・・ なんでも只で済まそうとするな
>>820 ありがとうございました。
無駄が増えますが、簡単で確実な方法はそれしかなさそうです。
833 :
デフォルトの名無しさん :03/05/20 23:55
webだと検索が楽な場合もあるんだよね
infoのlibcなら目的から探せそう
835 :
デフォルトの名無しさん :03/05/21 01:46
C言語を始めて三日目の厨房なんですが 早くも躓きました。 #include <stdio.h> int main() { int i=2; while(++i<15){ if(i%3==0){continue;} printf("%3d",i); } return(0); } のプログラムはiが15以下の時で iを3で割ったときの剰余が0の時 iを出力すると言うプログラムではないのですか? 実行すると 4 5 7 8 10 11 13 14 となり、どれも3で割った時の剰余が0ではなくて 理解できません。どなたかご教授お願いします。
>>835 > iを3で割ったときの剰余が0の時
> iを出力すると言うプログラムではないのですか?
違います。剰余が0でない時にiを出力するプログラムです。
838 :
デフォルトの名無しさん :03/05/21 01:52
>>835 continue は「以下続ける」じゃ無くて、
「次のループ制御まで処理をすっ飛ばす」って意味なんで、逆です。
早速のご回答ありがとうございました。 逆に捉えていたとはまだまだ理解度不足のようなので また1から勉強しなおします。
int i; for(i = 2; i < 15; i++){ if((i % 3) == 0){ printf("%d\n", i); } }
マンコ
ついでに言うと i<15 は 15未満 ~~~~~
15ミマンコ
845 :
デフォルトの名無しさん :03/05/21 18:40
a=((1-2*(r%2))*pow((r/2),2r)*cos((n+2r)*s))/(kai(r)*kai(n+r)); ※int kai(int n)はあらかじめ定義された関数 この表現って間違ってるでしょうか? 次のようなエラーが出てくるんですが、どこがおかしいのかわかりません 関数呼び出しに ) がない(関数 main )
2r → 2*r
2rが変
848 :
デフォルトの名無しさん :03/05/21 18:54
>846-847 上手くいきました、有難うございます
849 :
デフォルトの名無しさん :03/05/21 20:55
初心者てかこれから初心者になろうと思ってるものですが C言語でプログラムを作ったり走らせたりするにはどんなツールが必要ですが 教えてください。 初めに何を用意すればいいのかまったくわからなくて^^;ホントくだらない事 聞いてすみません、どなたか教えてください
>>849 Windows なら LSI-C 試食版 と Windows 付属のメモ帳があれば
とりあえずプログラムできる。
Borland C++ Compiler 5.5 でもいい。
こっちの方が本格的(というか、本格)。
UNIX なら cc か GCC が入ってるのが普通。
Linux なら GCC が入ってる。
これ使えば問題ない。
Mac OS X でも入ってるけど、
インストールパッケージになってるのでインストールが必要。
アプリケーション/Installers/Developer Tools/Developer.mpkg がそれで、
これ実行すればいい。
Project Builder って開発環境も一緒に入ってるよ。
Mac のクラシック環境なら...ごめん。知らない。
851 :
デフォルトの名無しさん :03/05/21 21:48
>>850 ありがとうございます
Windowsを使ってるのでBorland C++Compiler5.5を使ってみます
Borland C++Compiler5.5ってフリーソフトなんですよね? 同意文章に返金とかなんたらかんたらって書いてあってちょっと不安になったもので・・・
int kai(int n){ int k,res=1; for(k=1;k<=n;k++){ res=res*k; } return res;} int main(){ double s,a; int n,r; int sum=0; int m=100,k=0; s=(M_PI/m)*k; for(r=0;-0.001<a&&a<0.001;r++){ a=((1-2*(r%2))*pow((r/2),2*r)*cos((n+2*r)*s))/(kai(r)*kai(n+r)); sum=sum+a; } printf("%1f",sum); return 0; }
pow: DOMAIN error と出てきます どこがおかしいか教えて下さい
質問させて頂きます。 Visual C++で #include <stdio.h> main() {printf("abc");}と入力してみたら (error C2006: #include ディレクティブに指定されている 'newline' はファイル名ではありません。)と表示されました。 どういう意味でしょうか?教えてください。よろしくお願いします。
>>853 #include <math.h>
して、ビルド時に-lmオプションつけれ
>>854 #includeや#defineなどのcpp処理部分は改行区切りなので
#include と <stdio.h>は同じ行じゃないと駄目
>>852 ダウンロードした本人がコンパイラを使う分には何も問題ないですよ。
作った実行ファイルの配布にも特に制限はないです。
ただ、Borland C++ Compiler 内のファイルの再配布については
いろいろ制限があるので注意して下さい。
>>854 そらあぁた、0の0乗は未定義やがな。
>857 有難うございます
#define ぬるぽ ((void *)0) がエラーにならない処理系はありますか?
Perlとか w
862 :
デフォルトの名無しさん :03/05/22 01:07
メンバーがたったひとつの構造体にはどんな意味があるんですか?
「将来の拡張」ができる。
教えて下さい。 ポインタ配列の例題で以下のプログラムがありました。 #include <stdio.h> void main(void) { char *w[] = { "SUN", "MON","TUE","WED","THU","FRI","SAT",}; int k; for( k = 0; k < sizeof w /sizeof w[0]; k++) (void)printf( " %d:%s", k,w[k]); printf("\n"); } 質問 (void)printf( " %d:%s", k,w[k]); の(void)とは何故つけるのですか? お願いします。
>>864 printf()の戻り値を使用しないことを明示するためのキャスト。
>>863 なるほど・・・・
>>864 voidにキャストして戻り値を明示的に破棄しないと、lintという文法チェックプログラムが文句を言うと聞いたことがあるよ。
867 :
デフォルトの名無しさん :03/05/22 01:20
>865,866 ありがとう。 でも、何で明示するの? 確かに、printfはint型を返すよう定義されているけど、、。 普通、 int a = 5; printf("a = %d\n",a); というように使いますよね。 どう違うのですか?
>>866 も言っているように、lintを騙すために明示する必要がある。
古き悪しき(とまでは言い過ぎか)習慣だ。
>868 ありがとう。 そういうことですか、、、。 しかし、私の環境 win2000+cygwin(恐らく最新 バージョンはどうやってみる?) で同じくlint(Slint 3.1.1)を使ってみましたが、そのような 警告はでませんでした。 lint list3_16.c(>864で(void)をコメントアウト)) Splint 3.1.1 --- 02 May 2003 list3_16.c:5:6: Function main declared to return void, should return int The function main does not match the expected type. (Use -maintype to inhibit warning) list3_16.c: (in function main) list3_16.c:10:15: Operands of < have incompatible types (int, arbitrary unsigned integral type): k < sizeof(w) / sizeof(w[0]) To allow arbitrary integral types to match any integral type, use +matchanyintegral. Finished checking --- 2 code warnings 警告が出ないよう、修正されているのですか?
>>869 おまいのlintで警告が出るか出ないかにどれほどの意味があるってんだ?
警告出ようが出まいが元のソース書いたやつが書いちまったんだからしょうがないだろ。
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
FAQを執拗に聞くからじゃない?
874 :
デフォルトの名無しさん :03/05/22 12:07
先生 CTypedPtrListを2重に格納したいのですが 以下のソースではpListを格納しようとするとエラーになります 誰か助けて typedef CTypedPtrList <CPtrList, CPoint*> CPointList; typedef CTypedPtrList <CPtrList, CPointList*> CPointListList; CPointListList pointlistlist; CPointList* pList = new CPointList; pList->AddTail(new CPoint(100,100)); pointlistlist.AddTail(pList);
875 :
デフォルトの名無しさん :03/05/22 12:08
877 :
デフォルトの名無しさん :03/05/22 12:45
#include<stdio.h>main() { double x=1; int i; for(i=1;i<10;i++){ x=2+1/x; printf("%f\n",x); } } このソースのx=2+1/xの部分を(2+1/x)の平方根を求める プログラムにしたいんですが、 どのようにすればよいでしょうか? 本見ても、それらしいのが乗ってません。教えて下さい。
>>877 1行目、分割しないとエラーになる。
で、#include <math.h>を追加。
6行目、x = sqrt(2 + 1 / x);に変更。
879 :
デフォルトの名無しさん :03/05/22 12:53
>>878 ありがとうございます。
sqrtで漏れの本を牽引したけど、やっぱり載ってない(´Д`)
本を買いなおさないと。。。
ここでGUIの質問をしてよろしいでしょうか。
駄目駄目駄目駄目人間
やってしまいました… どうか無視してください。 でも、どこに行けば…
>>882 GUIつってもいろいろあるだろーが。
windowsなのかaquaなのかGTKなのかQtなのかその他なのか。
んでCの話題ではないのでここはふさわしくない。合ったスレを探しなさい。
884 :
デフォルトの名無しさん :03/05/22 14:10
スレ立てるまでもない質問スレで、 「どこのスレが相応しいですか?」って聞けばいいんでないの?
スレ立てるまでもない〜で直接質問すれば?
昔見た状態遷移のコードがどうしても思い出せません。 どなたか補間してもらえないでしょうか? 以下記憶から引っ張り出したものです。 typedef struct __func_t { struct __func_t (*f)(); } func_t; func_t stat1(void) { func_t next = {NULL}; return next; } func_t stat0(void) { func_t next = {&stat1}; return next; } int main(void) { func_t s = {&stat0}; do s = (*s.f)(); while (NULL != s.f); }
>>886 状態遷移だったら普通、状態(state)と事象(event)があるんじゃないの?
こんな感じでやるけど。
typedef struct {
enum{eventa, eventb} e;
/* いろいろ */
} event_t;
typedef enum {
state0, state1, state_end,
} state_t;
extern event_t getevent(void);
state_t func0a(event_t e) {/* なんか */}
state_t func0b(event_t e) {/* なんか */}
state_t func1a(event_t e) {/* なんか */}
state_t func1b(event_t e) {/* なんか */}
int main(int argc, char * argv[])
{
state_t state = state0;
event_t event;
static state_t (*func[][state_end])(event_t) = {
{func0a, func1a}, {func0b, func1b},
};
do {
event = getevent();
state = (*func[event.e][state])(event);
} while (state != state_end);
return 0;
}
すいません質問させてください。 int num; この変数をwhileループの中で 加算させつつ printfしているのですが 4000あたりまでは順調に表示してくれるのですが 突然 num = 538976288 と、表示されてしまいますた・・・ 原因がよーわからんですし 538976288という桁数ってintで表現できる 数を超えているような気がするのですが・・・ こういった現象がどのようにして 起こるのか教えていただきたいです。 お願い致します。
intは32bitだから4000でオーバーフローするわけはないし・・・ コードを貼り付けてくれ
環境が良くわかんないけど、一般的な環境だとintは±21億くらいまでなら表現できるよ。 有効桁数10桁までと覚えとくといいかも。 途中でかけ算とかしてるなら、桁あふれの可能性有り。 そうじゃなきゃ、メモリを壊してるんじゃないかな。
>>888 初期化してなくて、そういう値になることはあるけど、加算させてて
いきなりは見たことが無いです。
sizeof(short)は処理系に依存するのでしょうか? それとも、ANSI規格で2バイトに定められているのでしょうか?
short は int 以下としか。
2 バイト固定で使いたければ、 typedef でもしてそれ使って、 環境によって定義を切り替えれば良し。
>>893 ,
>>895 ありがとうございます。
てことは、移植性を考慮すると、ハードコーディングしないで、
#if sizeof(short) == ......(略)
とした方が無難ということですね。
上下左右のASCIIコード教えてください。
文字配列の初期化で char str1[20] = "abc"; /*うまく動くかもしれないがお薦めできない*/ char str2[] = "abc"; /*OK*/ と言う人がいました。 これってC言語の定義ではどうなってるんですか?
皆様ありがとうございます。 環境はSUN Soralis SPARAC3 です。 メモリを破壊しているということは ほかの部分、例えばmemcpyなどで スタックをおこしていて printfに影響を及ぼしている可能性も ありますか? 再度の質問ですみませんが ご教授お願い致します。
>>899 基本的に自動変数はスタックに並んで入るから、
例えばnumの前にある変数の領域をオーバーしてmemcpyすれば当然スタックは
破壊されてnumの値が書き換わる。
>>900 サソ
ありがとうございます!
あやしいmemcpy()のオンパレードなので
そいつが原因かもしれません。
ヒントになります。
どうもありがとーございました。
>>888 ていうか、
> 538976288という桁数ってintで表現できる
> 数を超えているような気がするのですが・・・
気がするだけでデバッグしていたらいつまでたっても終わらないよ。
きちんと確認しなきゃ。
538976288 = 0x20202020
これだけでも大きなヒントだと思うぞ。
>>897 上下左右は ASCII コートでは表現できない。
JIS/EUC/S-JIS とかにしろ。
>>898 別に両方とも間違っていないと思うけど...。
ただ、char a[4] = "ABCD"; なんて書くアフォがたまにいるので、文字列を格納する配列なら、文字数はコンパイラに数えさせた方が間違いがないというだけのことだと思う。
0x20202020ってことはスペースだな
ASCII コート (・∀・)イイ!!!
>>898 > char str1[20] = "abc";
str1 という char 型要素数 20 の配列が
"abc" という文字列で初期化される。
> char str2[] = "abc";
"abc" という文字列を入れられる
最低限の要素数を持った char 型の配列が
"abc" という文字列で初期化される。
1. 前者は初期化する文字列の数を数えて、
そこから配列のサイズを決めなければならないため、
人為的なミスが起こる危険性を孕んでいる。
良いコンパイラであればエラーを出してくれるかもしれないが、
そのことを期待する事はやめた方が良い。
その点後者はそのようなミスとは無縁である。
2. ミスを防ぐためにと前者で大きめにサイズを指定しても、
無駄にメモリを消費してしまう。
3. もし文字列(の長さ)を変更する予定があり、
"abc" があくまで初期値でしかないのであれば、
取り得る文字列の最大長を指定しておく必要がある。
この目的のために前者を使う事は可能である。
しかし、初期値がその最大長を超えない事をチェックする必要があるため、
一応初期化をするのは置いておいて、
assert で長さのチェックをしてからコピーするのが安全である。
>>902 サソ
まじありがとうございます!!
0x20がスペースってことはしってましたが・・・
まさかこんなことになっているとは
思いもよりませんでした。。。
少し新しい道が開けました!!
ありがとうございます!!
>>888 つまり、スペースが暴走してスタック上の変数領域を侵食してしまったわけやね。
908 :
デフォルトの名無しさん :03/05/23 03:03
909 :
デフォルトの名無しさん :03/05/23 03:52
>>827 本当にそんなことが言えるの?
根拠を示してから書き込むように。
おまぃ、最近落ち着きがないようだが、せめてCくらい勉強してから人にアドバイスしようね。
昔よくsourcerとか使ってたけどwindowsでは無理かな?
mochaはよくお世話になったからあると便利なのは確かだね。
実力つけたいなら、 自力で構築しなおすのがいいと思う。
少し悩んでます。どうかご教授お願いします。 あるデータ群から、任意のデータを抜き出して配列なりなんなりの テーブル等に格納したいのですが、データ数が分らない場合、 "一度データ数をカウントしてテーブルを制作、その後に格納" これしか思いつきません。 これだと二度データ群を走査するやり方しか自分は出来ません。 なにか定番のやり方、 一度のデータ走査でデータ格納領域を確保しながら格納ってやり方なんてあるのでしょうか? 少し頭をよぎったのは、データヒット毎にリアロケートなんですが さすがに却下しました。
大き目にmallocしてrealloc。
配列ならreallocとか 配列以外ならリンクリストとか じゃあダメってこと?
913 :
デフォルトの名無しさん :03/05/23 05:27
914 :
デフォルトの名無しさん :03/05/23 06:14
>>910 テーブルと同サイズのメモリを用意し、格納していく。
格納した数はカウントしておいて、最後にreallocで小さくする。
データヒットごとじゃなくて一定サイズ確保であふれたらreallocとか reallocじゃなくて新たに確保してリンクさせるとか? 元テーブルのサイズによるね 小さければ>914でいいし大きかったら動的に何かするしかないかと
でも結局全件ヒットしたらそれだけいるんだ(´・ω・`)
>>896 #ifでsizeofは参照できないよ。
定義済マクロから適当なのを使って判断するしかない。
918 :
デフォルトの名無しさん :03/05/23 13:29
CでPerlのeval関数のようなことをしたいのですが、 何かいい方法はないでしょうか? int hoge = 1; char buf[] = "hoge"; int foo = eval(buf); とやると、fooに1が代入されるような感じです。
コンパイル後に変数名からたどるのは無理だと思うけどな。
グローバル変数なら可能でしょ
Unixで関数名を辿るのはやったことあるけど面倒だった。 同じ手法でグローバル変数も可能なのは確認済み。 でも、一般的には不可能って答えるしか。
どっちにしろないんだから自分で簡易インタプリタでも書け。
while文に使われる !=EOF は、使わなくてもちゃんとプログラムは動くのですが、いろんなサイトとかでは使ってるのがほとんどです。 !=EOF を使うのと使わないのとでは何が違うのでしょうか?
EOFはstdio.hで-1に定義されてたりする。 その場合、「値」と「値!=EOF」は意味が違う。 使っても使わなくても動くと言うことは、エラー処理などをきちんとしてないのだろう。
#include <stdio.h> #include <ctype.h> main() { char c; while ( ( c = getchar() ) !=EOF ) if(islower(c)) putchar( toupper(c) ); else putchar(c); } です
>>929 それで!=EOF抜いたら止まらなくなるだろが。ヴォケ。
>>929 EOFとの比較を行わないと、正しく終了しない。
EOFの入力の仕方がわからないというオチだと見た。
リダイレクトも知らないってか。
char c; whie ((c = getchar()) != EOF) 戻り値の上位ビットが捨てられた結果がintに拡張されてから、EOFと 比較されるんだっけか。charが符号なしだとまずいような。
>>933 リダイレクトと、 EOF の入力の仕方、に直接関係があるのかね?
>>935 大蟻。
ファイルからリダイレクトしたときに、ファイルの最後はどうやって検出すると思う?
>>937 ここでいっているのは、コマンドラインでCtrl-Z,Ctrl-Dで入力するEOFでは?
>>936 コンパイラが馬鹿でないかぎり大丈夫だろ。
大丈夫とかいう問題なの?
>>940 MS-DOS,WindowsだとCtrl-Z
VAX(VMS)もCtrl-Z
>>Ctrl-Z まじで!? プロセスも続行でつか??
945 :
デフォルトの名無しさん :03/05/23 19:44
続行っていうかその後も入出力可能なん???
Winのコンソールはバグがあったような記憶が < Ctrl-Z MXや2000はどうなのだろう。
MX?
>>946 UNIXのSuspendとごっちゃになってるんでねーの?
nyはどうなの?
割れ厨発見( ・∀)人(∀・ )通報しますた!
953 :
逆コンパイラ :03/05/23 20:14
EXEのファイルをCに戻る逆コンパイラソフトがあるかなぁ、おしえてもらえませんか。
954 :
デフォルトの名無しさん :03/05/23 20:21
おまえら2chのCのFAQ作れよ。馬鹿ですか?
955 :
カーニハン三世 :03/05/23 20:49
>>953 「Cソースコード」⇔「実行形式ファイル」 の関係は、不可逆です。
956 :
デフォルトの名無しさん :03/05/23 21:02
958 :
デフォルトの名無しさん :03/05/23 22:18
C言語勉強し始めたばかりのものですが #include<stdio.h> int main() { printf("ABC\n"); } というプログラムをBorlandのC++ Compilerでコンパイルしようとしたのですが bcc32 ファイル名(拡張子はc)っと打ったら bcc32は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません と出るのですがどうしたらコンパイルできるのですか? なにぶん初心者なのでこんな事も解らず困ってますどなたか教えてください。
2chの人員で、可逆Cコンパイラ作るというのはどうだろうか。
>>959 が主導して、2chの人員で、可逆Cコンパイラ作るならいいんじゃない?
>>961 むむ??
どれが自分の症状か解りません・・・
どれを設定すればいいのですが?
ちなみにOSはxpです
>>962 IDE環境買え。もしくは専用スレに逝け。
>>905 > 良いコンパイラであればエラーを出してくれるかもしれないが、
エラーはないやろ。正しい文なんだから。
警告ぐらいはあるかも知れんが。
> しかし、初期値がその最大長を超えない事をチェックする必要があるため、
VC++ は、char a[4] = "abcd"; でエラーになるな。
でも、gcc 2.59.4 は、char a[4] = "abcde"; は警告出すのに、char a[4] = "abcd" だと何も言わない。
バグか ?
>>909 何わけわかのこと書いてんだ ?
マルチタスクと逆アセンブラ/デコンパイラってどうやったら混同できるのか知りたいもんだ。
>>916 ヒットしなかったらいらないでしょ ?
一旦確保したら (プログラムが終了しないと) OS にメモリーを返却しない処理系もあるし。
>>920-921 ハァ ? って感じなんだが...。
ホントにできるのか ?
ちょっとやり方書いてみてくれ。
それとも処理系依存のことを言ってるのか ?
965 :
デフォルトの名無しさん :03/05/23 23:08
>>960 ,962
Windowsには95系とNT系があって、
95系・・・95,98,Me
NT系・・・NT,2000,XP
と分類される。つまり、XPはNT系。
だから、XPの説明がなければ、NTか2000の説明を読め。
966 :
デフォルトの名無しさん :03/05/23 23:17
main(){ FILE *fp;char *file;char *str; file=(char *)malloc(BUFSIZ*sizeof(char)); puts("File name?"); gets(file); fp=fopen(file,"r"); if(fp==NULL){ puts("No such a file!"); } else { str=(char *)malloc(BUFSIZ*sizeof(char)); while(fgets(str,BUFSIZ,fp)!=EOF){puts(str);} } } fgetsのところで、「移植性のないポインタ」と警告が出ます どうすれば上手くいくか教えて下さい!
>>964 unix(Sun-OS)の話だけれど。
nmコマンドで変数のマッピングされているアドレスが得られる。
そこを巧く実アドレス(実際には仮想アドレス名訳だが)に変換すれば、
変数領域が得られる。
同じ理屈を使って関数アドレスを得、その関数をコールするのは実装した。
969 :
デフォルトの名無しさん :03/05/23 23:25
>967 有難うございます、上手く出来ました
>>968 それを処理系依存という。Cでもなんでもねーだろ
>>968 思いっきり実装依存と言うことは、理解してるよね ?
かぶった...。
>>964 > > 良いコンパイラであればエラーを出してくれるかもしれないが、
>
> エラーはないやろ。正しい文なんだから。
> 警告ぐらいはあるかも知れんが。
長い時は正しいけど、
短い時はエラー出ることが多いでしょ。
>>962 システムのプロパティの詳細設定内にある
環境変数ってボタンを押すべし。
あとは Windows 2000 とほぼ同じ。だった筈。
>>974 その精神は立派なのだが、スレ違いだから言ってんの。
>>1 読もうね。
『GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo!』
次スレヨ炉↓
>>974 > 処理系依存でもやりたいことができればいいだけだろ。
はぁ ?
>>918 が Unix 使ってなかったら意味ないだろ。
あと
>>918 はグローバル変数だけ扱えればいいなんて書いてないだろ。
まあ、こう言うことができるって言いたかったんだよな。
>>918 Python.h 使えばできそうな気もするけど、
詳しくないのでどこまでできるのか分からん。
>>918 C言語では eval は無理。
変数を動的に参照したいだけなら、ポインターを使えばよい。
プログラマーが使いたいだけなら、無理なので諦めるか別の言語にする。
ユーザーの入力を解釈実行したいのなら、インタプリターをリンクすればよい。
>>970 >>971 921 は 918 に答えて Unix でやったことがある。でも、一般的には不可能と書いている。
これに対して、 964 はやり方を書いて欲しいとレス
その回答が 968
スレの流れから処理系依存の話になっただけで、968 が非難されるいわれはない。
>>979 > これに対して、 964 はやり方を書いて欲しいとレス
>>964 の最後の行見てる ?
基本的に処理系依存の話題は避けるのはここの常識と思う。(嫌と言うほど言われてる。)
まあ、
>>968 を責めると言うよりも、処理系依存のことを書いた
>>920-921 の時点で責められるべきもんだと思うよ。
しかも、実現内容は不完全だし、
>>974 で逆切れしてるし。
普通の Unix プログラマなら
>>968 ぐらいの内容は思いつくし、他の環境でも map ファイルとかから同じようなことはできる。
デバッグ情報にアクセスできれば、ローカル変数だって可能のはず。(デバッガはやってるからね。)
>>968 が責められるは、処理系依存云々もあるけど、そんなあたりまえの事を得意げに書いてると言うところにあるんじゃないの ?
>>982 も当たり前のことを得意げに書いているように見える。
「はいはい、分かったから次スレで同じ話題で議論すんなよ」ということでファイナルアンサー?
最近、1000獲り合戦もなく、寂しい終わり方が多いですね・・・。
991 :
デフォルトの名無しさん :03/05/24 11:57
記念カキコ
992 :
.ある被害者 :03/05/24 12:25
脳の「物理的」拘束から催される体感的自殺衝動に耐え、 常に歯をくいしばっていなければならず、シャワーを浴び る事さえ困難で日常生活を送ることができません。一年と 三か月続いています。 脳の「物理的」拘束においては、脳を機能停止にすること など簡単で、何百回と機能を停止され、殺害されかけまし た。こんなことが許されてもよいのでしょうか?
ここからはVBの質問を受け付けます。 でも、スレの残りが少ないから答えられないな。
おお、VB、VB。あなたはどうしてVBなの?よりによってM$家の方だなんて。
VBは元々Borland社が開発・販売を行っていたんだけど、今ではM$に乗っ取られてM$から発売されるようになったの。
997
お(=^o^=) や(=^O^=) す(=^。^=) みぃ(=^-^)/~~
999
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。