C言語なら俺に聞け! Part 〈56〉

このエントリーをはてなブックマークに追加
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限Googleで検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo!
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

コンパイラを探しているなら >>2-13 を。

上記を逸した場合の結果は激しく未定義だゴルァ!!

C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
だから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
>>1
スレタテモティカレ
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);

何ヤってんの?
>>9
はいはい、Java子ちゃん、はじっこへ。
>>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 - ファイルから数字を読み込み、絶対値を返す。
>>22
fopenの戻り値は無視か?
> 関連ずけ
> 関連ずけ
> 関連ずけ
> 関連ずけ
> 関連ずけ


は、いいとして、
> 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だろ
>>30
fpがヌルの場合はどうするんだ。
>>30
素直にVBやっとけ
>>31
>openの場合はファイルディスクリプタじゃないか?
確かに…
当方DOS->Winなもので
>>34
DOSだとファイルハンドルと言うのか。
スマソ UNIXだと決めつけていた
36デフォルトの名無しさん:03/05/10 14:46
ハンドルでもポインタでもなんでもいいよ
そうそう。要は読み書きできればいいの。
>>2-13 にコンパイラのリンクが無いのは仕様ですか
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/

【ライセンスや機能などに問題あり】
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
ハンドルは0以上の数字であり。ファイルポインタは機械固有の
値だな。
>>40
突込みどころ満載だな、釣りか ?
>> http://pc2.2ch.net/test/read.cgi/tech/1051528386/954
標準Cでは無いですが。予め実行フォルダにbitmap.bmpを作っておく必要あり。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=61
パスワードをがあっているかどうかの判断の時ですが(因みにパスワードは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のように補足しておくのは悪いことじゃねーだろ。
5043,45:03/05/10 20:04
当方の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にすると動きませんでした。
ご指摘宜しくお願いします。
5143,45:03/05/10 20:11
ちなみに4から8まではうまく動きました。

>46さん
まだC++は触った事がないです(笑)
>47さん
参考書の例題のようなモノですので大丈夫です。
fgetsも初耳ですが使って見ようと思います。
>>51
> ちなみに4から8まではうまく動きました。

これは、たまたま。

というか、なぜ memcmp() なんか使うんだ ?
素直に strcmp() 使うべき。
できれば平文はやめた方がいいよ。。。
5443,45:03/05/10 20:40
fgets苦戦中(--;

>52さん
なるほどたまたまですか。
確かにこの場合はstrcmpのが用途に合ってますね。
どうもありがとうございます。

>53さん
平文の意味も知りませんでした^^;
勉強になりました。

fgets苦戦中(--;
strcmpは文字列の終りを認識してそれ以降の比較はしないけど
memcmpはcountであたえたサイズを無条件で比較するため。
結果はpw1、pw2の未初期化部分に何が入っていたかに依存してしまう。

fgetsは単にgetsと置き換えるだけで動作しない?
5643,45:03/05/10 20:55
#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を書かないやつは非国民
>>59
んなこたーない
6143,45:03/05/10 21:19
>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;
}

取り除かないで付け加えましたが(;´Д`)
ありがとうございました。
6257:03/05/10 21:21
>>61
>>58 せっかく書いたのに(T_T)
6343,45:03/05/10 21:30
>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にしといたらいいんでない
>>69
で、それはどう言う意味があるんだ ?
71デフォルトの名無しさん:03/05/11 01:09
>>67
そのハァ?はどの書き込みへのレスなんだ?
こんなソフトはいやだ。
・パスワードが平文で実行ファイルに格納されている
>70
よく見てなかったこのばやい5?
74デフォルトの名無しさん:03/05/11 01:15
>>72
それ、CGIスクリプトに多いね・・・・
75デフォルトの名無しさん:03/05/11 01:26
ページを見ただけで、何日か後にハードディスクが消去されるようなスクリプトってあるんでしょうか?
あるページをみたら警告文で書いてあったのでおしえてください。
CGIスクリプトの場合、例え平文でもパスワードが見れないわけだから問題ないよ。
>>76
iswebみたいなところだと(ry
>>75
セキリュティホールをうまくつけば可能かもしれませんね
Index of /cgi-bin
.
..
checkpasswd
chuumon_form.cgi
kanri_form.cgi
kokyaku_data.dat
1+1=2

ハァ? 1+1には代入できないだろ。  と思うようになってしまった。
crypt〜
82Prolog:03/05/11 01:47
>>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!*/

>>86
コンパイル通らないよ
>>86
なんですかこの読みにくいソースは・・・
>>85
理解しました。ありがとうございます。
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

つーか、普通に考えりゃわかるだろうに。
>>99
やってみないとわからんのか。
101デフォルトの名無しさん:03/05/11 15:38
漏れは見なくてもわかる
俺はこのスレ読む前から解ってた。
>>100
プッ、やることもできないんだろ。
まあ、見るだけでわかるんなら >>92-94 に反論の一つでもしてると思うけどな。

俺は、あんなソースは見たくもないから。
104ヘルバ ◆THYOQYTAXA :03/05/11 15:48
fgetsよりfgetcの方が好き。
fgetsとfgetcはほんと間違いやすいから気をつけよう。
ややこしいよね。
>>104
激しくぜんぜん。
>>104
うんうん、君には難しいんだろうね。
よくわかったから、満足したらもう来ないでね。
引数も違うのに間違えるんかい
>の方が好き
好みの問題なんだろうか
もれはfgetcよりもfputcの方が好きだな
111110:03/05/11 17:46
スマン 間違える間違えないの問題じゃなかった。
>>105-106
別に叩くところではないと思うが。
煽り目的か、お前。
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行目に;が必要ってどういうことだよ。
114113:03/05/11 19:07
なんか勘違いしていた・・・スマソ irのすぐ後にってことか。
Part56って凄いね。うんうん。すごいすごい。
すごすぎだよあんた。
五万六千レス。
初心者板には5000を越えたスレがあるらしいぜ
それだけバカとバカに教えるバカが豊富、と
おそろしくへたくそなソースだが、レイトレのつもりか?
新しいトイレ?
120118:03/05/11 20:53
いつからここは7行スレに?
>>112
自分の好みを披露するスレでもないからな。
124デフォルトの名無しさん:03/05/11 22:34
C初心者です。
今後C++を覚えたいのですが、なんかC#という新しい言語もあるそうなんですが
C#ってなんでしょうか?C++を飛び越してC#を学んだ方が得策なのでしょうか?
教えてください。
>>124
お好きなように。
>>124
> C#ってなんでしょうか?

http://www.asia.microsoft.com/japan/msdn/vstudio/techinfo/articles/upgrade/Csharpintro.asp

> C++を飛び越してC#を学んだ方が得策なのでしょうか?

今のところ誰にもわからない。
5年ぐらいしたら結果が出ているかもしれない。

それ以前に、その全然C言語に関係ない質問がこのスレにふさわしいかよく考えた方がいい。
色々悪口を言われるプリプロセッサだけど、俺は大好き。
俺は大嫌い。
俺は性格は好き。
130デフォルトの名無しさん:03/05/12 02:11
NULLとナル文字の違いを教えてください。
NULLはポインタ ナル文字は文字であり整数型
132デフォルトの名無しさん:03/05/12 02:25
ナル文字と0の違いは?'\0'でじゃなく0でいいのでは?
ナコルルとリムルルの違いを教えてください。
>>132
読みやすくするため
135134:03/05/12 02:27
あと"aaa\0bbbb"とかやったりな 
136134:03/05/12 02:28
やらないか
>>130
ヌルポインタ
あるオブジェクトの位置を示す、どの正常なポインタとも
等しくならない事が保証されているポインタ。
ソース上では 0 というリテラルで得る事ができるが、
NULL というマクロを使った方が読みやすい。
しかし、実際は 0 以外に ((void*)0) と定義されていてもよいとされている
(C++ では 0 と定義される)。

ヌルキャラクタ
あらゆる文字とも等しくならないことが保証されている文字。
文字列を操作する標準関数において文字列の終端を表す。
ソース上では '\0' というリテラルで得る事ができる。
リテラル文字列(" " で囲んで得られる文字列)の終端には
ヌルキャラクタが自動的に付け加えられる。


ヌルポインタはポインタであり、ヌルキャラクタは文字である。
ヌルポインタは文字ではなく、ヌルキャラクタはポインタではない。

以上。
138デフォルトの名無しさん:03/05/12 02:31
要するに0
139 :03/05/12 03:23
>>138
だけど、ヌルポインタはデータとして 0 であるという保証は無い。
ソース上は 0 だけどね。
140デフォルトの名無しさん:03/05/12 03:41
オブジェクト指向ってなんですか?
>>140
スレ違い。
というか、オブジェクト指向で検索汁。
>>140
実はオレも知らないんだ。
検索してもよくわからなかった。

>>141の言うように検索してバカなオレにわかりやすく教えてくれ。
>>136
いや、やったことがある。こっそりバイナリにメッセージ仕込んだりしてた(w
>>139
*(NULL)が0である保障がないことは
なんの関係もないぞ?
何が言いたいんだ?
145139:03/05/12 05:42
>>144
void *p = NULL;
printf("%d\n", (int)p);
で 0 が表示される保証が無い、ということ。
本気で言ってる?
釣り?
147 139:03/05/12 05:59
もっと現実的な状況で言うなら、

int **p; /* int* 型の動的確保配列 */
p = (int**)calloc(size, sizeof (int*));

という方法では NULL で初期化されない、
という環境があって構わないということだ。
malloc の後に for を使って NULL で初期化しなくてはならない。

しかも厳密に言うなら、
NULL を実現するための現実の値が
char* と int* などで異なっていても構わない。
そのため、この初期化処理を関数化するには型ごとに関数を作るしかない。
int** を void** で受けようとしてもエラーか警告を受けるであろう。

C++ ではこのような状況は当たり前のように存在していて、
多重継承をしているクラスではそもそもポインタのサイズが異なるために
int* と iostream* とでは NULL の値は異なる、
という実装になっている処理系が殆どである。
>>144
ガッ
>>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ビットだろうがよぅ!
153139:03/05/12 07:20
まぁ、とりあえずここを読めってこった。
http://www.catnet.ne.jp/kouno/c_faq/c5.html
>>149
共用体のvoid*に書き込んだ値をintで読んだりしたら結果は処理系依存。
もっとも期待通りに動作しない処理系なんて聞いたことないが…
>>152
そういう言い方をするとちょっと違うような。
>>154
MS-DOS時代のMS-Cにはfarポインタと言うものがありましてな、
16bitのセグメントと16bitのオフセットと言う構造になってたので
intとの共用体を作ることもできなければセグメントの値が
0になることもなかったものなのですよ。
#温故知新。
>>156
なにが言いたいの
>>156
共用体自体は作れたと思うし、(void far *)0はセグメントも0だったのでは。
159149:03/05/12 13:04
>>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に書いてあるよ。
162:03/05/12 14:46
逝ってよし
163デフォルトの名無しさん:03/05/12 15:07
プログラム内でよく参照する文字列のリストをグローバル変数の配列にしているんですがもっと良い方法はあるのでしょうか。
♯defineとかを使うという話を聞いたような気もするのですが、[]内が式になると上手くいかないようなきがしますが…。
>>163
enumかな?
>>163
その文字列がキーワードの類なら
static char const *const sKeyWords[] = {"foo", "bar", "baz",};
が無難ではないかと。
マクロにするなら、
#define KEY_WORD(x) ((x) == 0 ? "foo" : (x) == 1 ? "bar" : "baz")
などとできなくもないが煩わしい。

もしその文字列がエラーメッセージのようなものなら、
テキストファイルやリソースの形で実装することをお勧めする。
一番目のconstはcharの前に書けよ気持ち悪い
>>163
どういう目的でそういう方法をとっているのですか?

例えばコンパイラの中には、ソース中に同じ文字列が出てきた場合、
一つにしてくれる機能を持つものもあります。
メモリの節約をしたいというのであれば、この機能を使えばよいですが、
文字列の内容に変更が入るかもしれないので共有しているのであれば、
この機能を使うのはよくないです。
>>167
文字列リテラルを書き換えてはいけないよ
読み出し専用(のはず)だからこそ、そういう機能を適用するわけだし。
169167:03/05/12 16:36
>>168
動的に書き換えるという話ではなく、
ソースの一箇所直せば事足りるようにするというような
静的なものを言ったつもりでした。
もうちょっとプログラミング用語を勉強したほうがいいぞ
コミュニケーションがうまくできていない
>>170
誰が?
>>170
もうちょっと日本語を勉強したほうがいいぞ、
コミュニケイションが(略
日本語難しい
>>167の言いたいことがわからん。
俺も>>170の言う通りか?
どっちかというと作文能力の問題だな
176163:03/05/12 18:29
>>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でも参照できる方法はないでしょうか。
183182:03/05/12 20:51
グローバル変数は使わない方向でおながいします
int **pを渡すのが間違っている。
int **pにint **型のfunc_aの戻り値を代入する。

どうしても渡したいのなら、func_aの引数をint ***にして、func_a(&p)として呼ぶ。
185182:03/05/12 21:31
>>184
ありがd
解決しました。
186184:03/05/12 21:33
(´-`).。oO(よくこんな説明で分かったな・・・)
187182:03/05/12 21:37
>>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()系以外めったに使わない可変長引数のためだけに後ろから
畑中葉子
194190:03/05/12 22:45
あ、すみません。初期化というのはint (*p)(int,double)=func;みたいな形のことです。
この場合、コンパイラがfuncという名前を知らないとエラーになりますよね?
で、宣言するか上で定義しないと分からないから・・・
>>194
だからそういう場合は
int func();
196190:03/05/12 22:59
>>195
あ、当時のコンパイラならエラーにならなかったんですか。
foo()
{
extern int func(); /* funcって名前の関数がどこかにあるよ */
int (*p)(int,double)=func; /* 関数ポインタに代入 */
}
>>196
今だってならんわ。
>>197
> extern int func(); /* funcって名前の関数がどこかにあるよ */

それはプロトタイプ宣言では。
200190:03/05/12 23:09
>>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 もこういってるのに。
202190:03/05/12 23:59
>>201
だから宣言しないで・・・
203190:03/05/13 00:01
もしかして私がプロトタイプ宣言というものを勘違いしている?^^;
>>203
つーかそんなことを知る必要があるのか? そんなこと知っても無意味だろ。
変数の名前(ラベル名?)を表示することはできますか?
具体的には
 int Right;
 int Left;
 printf("Variable1 Name:%? \n",Right);
 printf("Variable2 Name:%? \n",Left);
上記を実行すると標準出力に
 Right
 Left
と表示される。見たいなことをやりたいです。
>>205
無理
 int Right;
 int Left;
 printf("Variable1 Name:Right \n");
 printf("Variable2 Name:Left \n");
208206:03/05/13 00:09
そういうことができるとして、どういうことに利用したいの?
他の方法で実現できるかも。
コンパイルした後も変数の名前って残るの?

例えば int a; より int ab;ってやったほうがexeが大きくなるとか
>>209
リンク時に必要な名前以外は消える・・・・と思う。
>>203
もう一回勉強し直してきな。
>>209
デバッグ情報には。
213205:03/05/13 00:19
>>206
そうでしたか、できないものは仕方ないですね。

特に目的は無く、
 きっと変数名を表示することはできるだろう。
 → 調べたけどどこにも載っていない。
 → あぁ気になって眠れない。
という流れで質問させていただきました。
とりあえず俺が>>205に言いたいことは
printf("Variable1 Name:%s \n","Right");
じゃ
Right
とは出力されないってことだな
マクロ使えばいいじゃん#とか
(゚Д゚)ハァ?
文字列連結演算子 ##

#define P(x) printf(#x)
http://www.cmagazine.jp/src/kinjite/c/volume.html
> いわゆる「入れ子」が2重3重になるというケースがあります。

2重が駄目なら入れ子自体が駄目ということになるが。
>>219
入れ子が関数が長くなる原因になるといっているだけで、
駄目とは言ってないような。

そんなことよりも、
>フローシートなどを用いて処理の再検討をする必要があります。
これはやめてくれ。
221あふぉ:03/05/13 01:49
解の公式のプログラムでできるだけ桁落ちしないようにするにはどうしたらいいんですか?
>>219
一通り読んだけど、こいつ駄目だわ。
「こういう考え方の奴もいる」程度に読むように。
>>221
ケースバイケース。
場合によっては、公式をそのままプログラムに移すのではなく、
予め桁落ちしないように変形するなどの工夫をするといい。
特に、収束の悪い級数展開には要注意。
>>219
メンバーにmをつけるという命名規則が分からない・・・
mついていなくてもa.bとかa->bってかけばbはメンバーだってわかるし、メンバーを裸で書くことはできないはずだし・・・
225224:03/05/13 02:12
C++の場合かな? メンバ関数内での使用とか。
それより自動変数につけるtheとか「引数は参照のみは「in」」ってのが・・・
参照のみならconstつけろよ。Cの標準関数もそうしている。
違います
>>220
つーかフローシートって何だ。
風呂敷?
229222=220:03/05/13 11:46
>>228
私に聞くな。
フローチャートの間違いだと思うのだが、そうだとしても阿呆だと思うがね。
>>229
結論に禿撞。
231デフォルトの名無しさん:03/05/13 15:56
free()とかfclose()しないでexec()したらマズイですか?
>>231
呼び出したプログラムが終了して戻ってきて、
mainから抜ける時まで確保されっぱなしだけど、気にしないなら問題はないよ。
>http://www.cmagazine.jp/src/kinjite/cpp/scale.html#index2
メンバ関数が多いと使いたいメンバを探すのに苦労する
→ 継承クラスを作って分割させる
と読める。どんなもんだろう。
>>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のサイズ));
↑でできるでしょうか??
ご指導おねがいしまふ。
その前にエラーでは・・・・
239238:03/05/13 18:26
エラーにならねー(T_T)
struct aa; はエラーにならないのか。
>>237
struct aa と struct bb のペアに意味があるなら、
別の構造体としてまとめるべし。
あとは構造体の代入でいける。

ちなみに、上の memcpy での代入はできない。
何とかする方法はあるが、
余計な事を教えるとやりそうで恐いので教えない。
241238:03/05/13 18:38
なるほど・・・struct aaとstruct bbはないものと判断されるのか。
じゃあccを除いてコピーってのは・・・
242237:03/05/13 18:44
正確には
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;

と二行に書くのがいやなわけ?
244237:03/05/13 18:47
>>240サソ
ありがとうございます
hoge = piyo;
だとchar ccも入ってしまいますよね、、、

で、どうするか。。。
ホカに構造体を用意して、そのエリアに
いれちゃうって感じですか?
245デフォルトの名無しさん:03/05/13 18:48
出力結果が
一つ目==>○ーーーーーーscanf()で
二つ目==>□ーーーーーーscanf()で
○+□=△ーーーーーーーー△は2進数で表示
を作りたいのですがサッパリです。
#include <stdio.h>
int main()
{
246237:03/05/13 18:48
>>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 進数で表示するプログラムを作ってみ。
250245:03/05/13 19:03
#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チェックしている・・・自分で考えたのなら偉い。
252245:03/05/13 19:07
0でやったらエラーでるので出なくしました。
>>250
あとは2進数を表示する関数を作れば終わりやね。
まぁ、初心者なら一旦表示する文字列を作ってから
それを後から表示すればいいね。

再帰関数を使う方法もあるけどね。
254デフォルトの名無しさん:03/05/13 19:11
http://www.catnet.ne.jp/kouno/c_faq/c14.htmlの「適切に選んだepsilon」というのは
float.hで定義されているDBL_EPSILONやFLT_EPSILONのことですか?
255bloom:03/05/13 19:13
256245:03/05/13 19:14
d=nisinsuu(a,b);

int nisinsuu(int x,int y)
{
.
.
.
}
って感じでですか?
>>256
int型の引数はひとつでいい。
>>254
自分で適当に決める。
この値が精度に相当する。

>>256
nisinsuu(a + b);
とかいう風に、計算部分までは関数には持ち込まない。
>>258
じゃあDBL_EPSILON使います。
ありがとうございました。
260256:03/05/13 19:33
スマソ。ギブアップ
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
--------●○●別れさせ屋●復讐代行業務●○●----------

●騙された・裏切られた・弄ばれた・逃げられた・捨てられた・
相手に誠意が無い・異性問題・家庭内暴力・不倫疑惑解明・人間関係・金銭トラブル★

●  http://www.blacklist.jp/i

別離工作・情報収集・トラブル対策・ボディガ―ド・等々!
●真剣にお悩みの方、安心してご相談下さい。解決へ導きます★
□■各種データ・電話番号調査・住民票・戸籍謄本など調査■□

●  http://www.blacklist.jp/i  ●別れさせ屋・特殊工作・調査全般
●  http://www.blacklist.jp/   ●復讐代行・人生相談・駆け込み寺
--------------------------
リンク⇒ http://315.teacup.com/asocokit/bbs 凄い・必見!!!
>>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 { ... }
272261:03/05/13 20:23
>>264サソ
ご指摘ありがとうございます。

ほんと厨なもんで何が危険なのか
何が奇妙なのかもわかりません、、、

ご教授おんがいします、、、
>267
xが1〜40 → xが1以上 かつ xが40以下 → 1<= x && x <= 40
×良いほうが思いつかないもので
○何一つ思いつかないので
275デフォルトの名無しさん:03/05/13 20:27
専門ではまだ演算子なんてものやってますが高校時代に関数、配列と文字列、シフト演算をかじる
ぐらいまでやってます。忘れかけてますが、、、、
>>272
その前に何がしたくてそういうことをしているのかが分からない。
大方、代替案を出して終わる事になりそうだが、
何がしたいのか分からないので代替案が出せない。
277267:03/05/13 20:31

>271
なるほど 2)の考え方でいいんですね
ありがとうございます
>>275
関数も配列もやってないのにこういう問題が出たの?

>>266 では 1 桁ずつ直接表示してたけど、
その値を配列に保存しておいて、
それをちゃんとした順序で表示すれば
逆から読ませないで済む。
279261:03/05/13 20:37
>>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
まずは渡されるデータ構造を知ることが先決。
構造さえ知ってれば構造体メンバへの値の代入で終り。
283261:03/05/13 20:59
>>282サソ
ありがとんございます。

可変長のデータなので
構造体って感じじゃないみたいなのです、、、
>>283
何かよー分からんが、memcpy なんか使わんでも

typedef short int int16;
void foo(char* p, int16 hoge)
{
 *(int16*)&p[3] = hoge;
}

でええがな。
285261:03/05/13 21:10
>>284サソ
アリガトンゴザイマスーーーー

これはキャストして代入って感じですか??
286山崎渉:03/05/13 21:12
287動画直リン:03/05/13 21:13
>>285
p[3] のポインタ &p[3](型は char*)を得て、
それを int16(16 ビットの整数型)へのポインタ型にキャストして、
そのポインタの参照するところに代入。

あまり使いたくない技だけど。
>284
扇るつもりはないが、まだmemcpyの方がましだ・・・
290261:03/05/13 21:29
>>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;
}
でできるようにはなったのですが
292構造体:03/05/13 21:35
struct tbl{
int n;

}

void main89
{
struct tbl dt;
void inp_int(int *)

inp_int(&dt.n);
}

構造体のメンバを副関数に渡すには引数はどうなるの?

>>292
お前は何もかも意味不明
>>292
int *型
>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;
}
296構造体:03/05/13 21:49
>>294
void inp_int(int *p.n)
でいいの?
煽るつもりはないけど、ちょっとレベル低すぎないか?
ある程度分かった人間の疑問は
>1のリンクで片付いちまうからなぁ・・
回答者のレベルは・・・運任せのところがあるなぁ・・
299291:03/05/13 22:04
>>297
スマソ。進んで勉強する気があると言う事で許してはくれまいか、、、
>>299
参考書を読めばわかるレベルだと、そのうち釣りだと言われて、相手にされなくなるよ。
301デフォルトの名無しさん:03/05/13 22:17
とほほ。ここ返事が早いのでいいのですが、、、
スマソ。過去に言われた経験あり
302構造体:03/05/13 22:19
おい、私の答えはどうなったの?
>>302
ごく普通のint*を受ける関数でいいんだよ・・・
プログラミングのレポートで「考察を書け」といわれたんですが、
実際何を書けばいいんでしょうか?
一つ一つ関数について書くべき?
306構造体:03/05/13 22:23
もう、いいよ。ばかたれども(ぷんすかぷんぷん
>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
自分でプログラミングに関することで、また、最近習ったことで
興味のあることなどについてずらずら書く。
>>311
なるほど。どうもでした
>>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-1000
>>1を見ろという指摘は結構です
321デフォルトの名無しさん:03/05/14 02:25
このスレだけ読んどけばC言語マスターできますか?
間違った知識を身につけられます。
>>321
基本はマスター出来ます。
しかも>>1だけで。
324319:03/05/14 02:30
激しく申し訳ない。別のスレに逝ってきます。
325319:03/05/14 02:31
一言いい忘れ

>>320
指摘ありがd
DECIMAL?
static const FProc routineForSelector [] =
{
  /* formatSelectorReadPrepare */  DoReadPrepare,
  /* formatSelectorReadStart */    DoReadStart,
  /* formatSelectorReadContinue */  DoReadContinue,
  /* formatSelectorReadFinish */    DoReadFinish
};
勉強で人のソースを読んでたら、このような文が出てきました。
この配列内にあるDo〜というのは静的なグローバル関数として
宣言済みなんですが、この文は何でしょうか??
328327:03/05/14 05:27
ひらめきました。お騒がせしました。
>>327
悪しきコメントの典型的な例だな。
>>327
> 静的なグローバル関数として
Cには動的な関数というものはないし、staticならグローバルではない。
331デフォルトの名無しさん:03/05/14 11:24
文字を数値にする関数としてatoi,atol,atofがありますが、
long double型にする関数はないのでしょうか。
自前でやるしかない?
>>330
はぁ? ポインタ経由の呼び出しは、動的な関数だろ。
それは動的な呼び出し。関数自体を動的に作ることはできない。
JITみたいなのは別として。
>>331
doubleならscanfで変換できるよ。
335ヽ(´ー`)ノ:03/05/14 12:04
c99 なら long double strtold(const char*, char** endptr) が。
>>331
文字列からだと sscanf だな。
337331:03/05/14 12:56
>>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
ていうか知らなかっただけ
344339:03/05/14 15:36
なるほど・・・HFILE_ERRORが0xffffということだったんですか・・・
ありがとうごじゃーます。
345デフォルトの名無しさん:03/05/14 15:41
>>330
> staticならグローバルではない。

どういうこと?
>>345
static を付けるとファイルスコープになる。
付けないとグローバルになる。

動的な関数ってのは、
関数型言語でよく使われるラムダ式とかそういうやつ。
>>346
なんだそういうことか。
特定の関数からしか呼べない関数という意味だと思った>グローバルでない関数

ファイルスコープ・・・・
「ファイルスコープ」に違和感を覚える人間がなんでC言語スレに居るんだろー
ブロック外で定義したstaticをつけた変数はなんと呼ぶの?
350349:03/05/14 16:14
ねーなんと呼ぶのよー
>>346の考え方で考えるとグローバルでないということになるけど。
関数の話をしているんだがな
352349:03/05/14 16:25
そもそもCの関数にはグローバルもローカルも静的も動的もないと思うんだけど。
よかったね
ファイルスコープ変数
355349:03/05/14 16:33
ファイルスコープ変数ですか。
覚えておきます。ありがとうございました。
スコープとリンケージがごっちゃになっていないか?

static int x; /* 内部リンケージ */
int y; /* 外部リンケージ */

っていうんじゃないの?
357馬鹿:03/05/14 17:01
馬鹿な漏れに教えてくれ!
漏れは次のソースをコンパイルして実行した

void main(){
}

上手くコンパイルできた
出来たexeファイルを起動しても当然何も実行されない
しかし、出来たexeファイルを見ると47,104バイトの容量がある
なぜこんなに容量を食うんだろうか?
グローバル関数で検索しても出てくるのは特定のクラスに属さない関数という説明ばかり。
スタートアップルーチンとか
VCならmainCRTStartupとかsetargvとかがデカイ
>>357
× void main
○ int main

実行ファイルに必要な情報と
main 関数を呼ぶルーチンが入ってる筈。
確か。
361馬鹿:03/05/14 17:28
>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)));
 }
}
こんな感じかな?
式はもう少し簡単になりそうだけど

379374:03/05/15 00:29
ありがとう。安心した。
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
388消防並:03/05/15 02:16
#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だの言われたときは、
指摘された行の直前の行を見るとよいことが多い。
390消防並:03/05/15 02:20
>>389
ありがとうございます。


つーか、漏れ馬鹿すぎ。。。

>一般に構文エラーだのsyntax errorだの言われたときは、
>指摘された行の直前の行を見るとよいことが多い。

これは非常にためになる豆知識をありがとうございます。
エディタのオートインデントやキーワードのハイライト機能で
バグに気づくこともあるね。
あとは、全角空白も見えるようにしておくとか。
>388
豆知識その2
エラーが出たら最初の1つだけみて直して再コンパイル。
で、カナーリエラーの数が減る。
豆知識その3

ソースを書かなければバグは発生しない。
仕事してる奴ほどバグを出す。
エラーが出過ぎて見れません。どうすればいいのでしょうか?
395370:03/05/15 03:14
>>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   /;'|___ゝ'/   }   __,.へ)     猛省…!
       <、   ./     /   /;' | '´イ ` ー─‐'-‐'''´  
>>395
そういう問題か?
豆知識その4

フローチャートは不要。
ごちゃごちゃになった処理の流れを整理するのに使ったりするけど。
つまりアルゴリズムが頭に入ってなかったって事でファイナルアンサー?
400真紀俊男:03/05/15 05:01
ハァ?フローチャート?
フローシートだろ。
ハローワーク
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];


404デファルト七資産:03/05/15 05:41
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;}
};
405デファルト七資産:03/05/15 05:41
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]);
406デフォルト七資産:03/05/15 05:42
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よろしくお願いいたします。
>>406
stdinにfflushを使うなよ
すみません・・・
for文のブロックの後(}の後)にはセミコロンはいらない。
ご、ごめんなさい(笑)
array1[2,4,5][N]を朝の八時から夜の八時にしたいの?
>>414
はい、朝の8時にお店が開店して、夜の八時にしまる、、見たいな感じです。
一番左の列というのはarray1[0]のこと?
一番左の縦の列は、1番目の客、2番目の客、、、、、、
という風になってます。
なんつーか、酷いね
すみません、まだまだ初心者なもので。。。。
左の列というのがプログラム上でどれを指すのか分からないんだけど・・・
421デフォルト七資産:03/05/15 06:26
array1[TATE][0]だと思います。すみません。
もしかして、ランダムに生成される時間を朝の8時から夜の8時にしたいってこと?
>>407 こうかな?
0:番号
1:客が入る時間 ○:○○
2:客が接客を受ける時間 ○分
3:この時間に入ってくれば前の客とかぶらなかったのにという時間 ○:○○
4:客が出る時間 ○:○○
5:(自分)客が店にいる時の、前の客の接客時間 ○分
6:客が入ってから出るまでにかかった時間 ○分
424デフォルト七資産:03/05/15 06:39
そうです、そのとおりです。よろしくお願いいたします。
すみません。わかりにくくて・・・。
>>424
朝の8時は8、夜の8時は20でいいのかな?
はい、20時です。よろしくお願いいたします。
>>427
8から20までの乱数を得たいのなら、rand()%13+8ってのはどう?
429428:03/05/15 06:47
もっと素直に、期待する範囲の値を得られるまでループしてもいいけど。
>>407 たぶん
array[][]/60+8:array[][]%60
431428:03/05/15 06:48
ああ、時間じゃなくて分なのか。じゃあ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
ありがとうございます。とてもたすかりました。
436K&R三世:03/05/15 14:57
>>402
最初の for ループで、totalTime が判定文に使われているが
この時点では値は不定だぞ。tate と間違えていないか?
437_:03/05/15 15:04
438デフォルトの名無しさん:03/05/15 17:35
>【ライセンスや機能などに問題あり】
>Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/

>>39の問題ありってどういう事ですか?
教えて偉い人!
>>438
最適化ができないらしい
>>439
そうなんですか。わかりました。どうもありがとう!
正直、最適化できないんじゃ要らないわけだが。
442デフォルトの名無しさん:03/05/15 18:28
過労死させられても反抗すらできない民族、それが日本人。
どうすりゃいいの?
       ∪ / ノ
  | ||   ミ    /            |           ヽ       / / /
  ヽ_)_)     ∧/∧         |        ∧ヽ∧  彡  しl_ノ
        ( / ⌒ヽ        |        ( / ⌒ヽ
         | |   |  ミ   ∧ |∧  彡    | |   |
         ∪ / ノ     ( / ⌒ヽ        ∪ / ノ
          | ||        | |   |         / / /
          ヽ_)_)      ∪ / ノ        しl_ノ
                   | ||
                   ∪∪
日本ロジテム(みずほの融資先)の子会社せいも素(みずほの融資先)で
サービス残業させすぎによる過労で自殺者が出た。
http://www.samos.co.jp
http://society.2ch.net/test/read.cgi/traf/1046749189/l50
http://tmp.2ch.net/test/read.cgi/company/1046775680/l50
443山崎渉:03/05/15 18:56
(^^)    
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);
}
445質問厨 ◆Kwu0p51cCg :03/05/15 22:43
☆の部分でatanが定義されてないというエラーが出るんですが
どのように定義すればい良いのでしょうか?
検索エンジンで調べても全く分からず…。
どなたか…愛の手を。。。
>>445
もしかして「undefined reference to atan」ってやつか?
もしそうならコンパイル(リンク)時に-lm
447質問厨 ◆Kwu0p51cCg :03/05/15 22:51
わざわざすいません。
大学のウルトラCというソフトではエラー無かったんですが
さっきダウソしたCマシーンというフリーソフトでは
「atanが未定義です」と出るんです。
>undefined reference to atan
の意味も正直わからない初心者です。
初心者なんて嫌われるのわかってるんですが。。。
>>447
C Machineは無条件に捨てた方がいいかも。
標準関数は一部しか使えない。
449質問厨 ◆Kwu0p51cCg :03/05/15 22:56
あ。そうなんですか!!
ありがとうございます。
>C Machineは無条件に捨てた方がいいかも。
そのお言葉聞けただけで安心しました。
大学のソフトではエラー無しだったんでOKです。
脳内解決させて頂きました。
ホント質問厨に付き合ってくれてありがとうございました。
>>449
>>39にもっとましなコンパイラをダウンロードできるサイトへのリンクがあるから見てみては。
>449
>39
>451
かぶった。鬱だ。。。
453質問厨 ◆Kwu0p51cCg :03/05/15 23:05
>450-452
ここまでしてくれるとは思っていませんでした。(失礼。。。)
ダウソしてます。頑張ります。
どうもありがとうございます。
久しぶりのシャバだぜ。
ムショにいた3年間、毎日C言語を勉強してきた。
C言語のことなら俺に聞け。
(・∀・)ムショムショ
456消防並:03/05/16 00:09
教えてください。
多次元配列 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]);
 }
}
というかインデクス使わなきゃ配列のメリットがないだろ
460消防並:03/05/16 00:34
>>457
ありがとうございます。

>>458
わざわざ、丁寧にソースまでありがとうございます。

教えてもらったら、すごい簡単なんだけど、まったく、わからなかった。。。

すごい基本的なことだけど、
今、手元にあるCの本、3冊にはのってませんでした。
C言語辞書みたいなのを買うべきかな。。。
>>460
見落としてるだけじゃないの?
じゃなかったらよっぽどDQNな本を買ったか
どんな本だよ。二次元配列のループ処理も載ってないの?
463消防並:03/05/16 00:40
『C言語入門』 アスキー出版
『はじめて読むC言語』 アスキー出版
『よくわかるアルゴリズムの基本と仕組み』 杉浦賢

最後のやつはアルゴリズム中心でCのソースは
おまけ程度なので仕方ないかも。

上の二冊は、今、はじめて気がついたけど
どっちもアスキー出版だ。。。
入門書は一冊でいいから、3000円以上する本を買いなさい。
465消防並:03/05/16 00:52
>>464
わかりました。
厚めのいろいろ載ってそうなやつ買おうと思います。

比較的、小さくて、薄めの本を買ってしまった。。。
registerとかvolatileとかのキーワードって
どの位効果があるの?
普通の(ライブラリとかでない)プログラムでは考慮しなくても良い?
>>466
register はコンパイラが最適化するのでいらないかも。あっても害はないけど
volatile は割り込みとか使うときには注意したほうがいいかも
volatileは、割りこみ、スレッド、プロセス間共有メモリ、デバイスドライバなどを
書くときには必要になることがある。
例えば入力ポートはconstでvolatileだったりする。
>>466
setjmp()/longjmp()を使うときにはvolatileが必要になる。
registerヒントはいまどきのコンパイラだとほぼ完璧に無視するから
組み込みでもやらない限りは忘れていいよ
471466:03/05/16 01:27
ありがとうございました。>>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使いのことですか?
コボラーに限らず、まともなプログラマはまともなコードを書くよね。
483K&R三世:03/05/16 08:53
>>480
趣味でコボルやつは居ないからな。
大企業や官公庁の厳格な管理体制の下で鍛えられたから
安定した性能を誇るんでは?
484480:03/05/16 09:06
マジレス希望です。
何処で聞いたんだ>480
486480:03/05/16 09:39
プログラマ板です。
コボラーが書いたのが性能いいというと、思い当たる節がひとつだけある。
やつら、関数のパラメータを使わずグローバル変数で受け渡しするって話だから、
関数を呼ぶときパラメータをスタックに積むとかそういう操作しなくて済む分
性能がよくなるんじゃないのか? これくらいしかわからんけど、他になにかあるかな?
コボラーが使う いわゆる計算機はCPU時間いくらの世界だったので、その点にシビアというだけなのでしょう。
>>486=480
「 コボラーみたいに良いコードを書くコツ」も、マ板で聞け
>>487
退避の分遅くならんか?
プログラムの種類によっては、データ依存型の言語の方が性能がいいプログラムを書きやすいよ。
つーか、ごみみたいなコードを書くコボラーもいるし、
素晴らしいコードを書く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)
という動作をしたいんですよー。知ってたら教えてください??
>>487
それって言語仕様なんだからさ
>>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
>良いコード

まず、おまえの言う「良いコード」ってどんなコードよ?
http://ck.jp.ap.valuecommerce.com/servlet/referral?sid=36418&pid=870202359

買ってください。おながいします。おながいします。
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
>>511
C の文法の勉強やり直せ
514動画直リン:03/05/16 21:11
515512:03/05/16 21:42
しったかぶってごめん。
>>515
え? 合ってるだろ?
合ってるよ
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
配列の範囲を超えて書き込んだりしているんじゃないの?
524522:03/05/17 00:20
もしかしてスレ違いでしたか?
>>524
超せっかち?
'次'というのはどれのことですか?
527522:03/05/17 00:23
どのスレがいいのか分からないんで一応、書いちゃいます。

#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において、仮引数と実引数の型が違うぞ。
本当にエラーも警告も出なかった?
529528:03/05/17 00:26
その前にプロトタイプ宣言と定義がことなるんだ。
これはエラーになるはずだけど・・・
530522:03/05/17 00:27
>>528
largest2で使う変数などの型は統一しないといけないのですか?
コンパイラはvisual C++なんですけど、コンパイル時にはエラーなしで
警告は一つでました。
531522:03/05/17 00:28
>>529
mainのほうは自分で書いて、largest2の定義はコピペですので。。
>>530
double *とdoubleじゃ明らかに違うだろう。

double largest2(double, int);

double largest2(double *, int);
にして、
largest2(x[k], N)

largest2(x, N)
にする。
533522:03/05/17 00:31
>>532
ありがとうございます。やってみます。
>>520
libmのソースを読んでみれば?
漏れには理解できなかったけど・・・
http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/msun/src/e_exp.c?rev=1.8&content-type=text/x-cvsweb-markup
535522:03/05/17 00:41
>>532
無事に実行できました。
>>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ってやるよね。
541537:03/05/17 02:32
>(double)(end-start)/CLOCKS_PER_SEC
これも試してみたけどgccだとうまく動かない。
コンパイルする時になにかオプションでもいるの?
それともcygwin上だとうまくいかないのかな。
cygwin上のgccを使って試した。
>>537 はElapsed time = 0.000000になったけど、
>>540 にしたら、大丈夫だった。
543デフォルトの名無しさん:03/05/17 08:49
>>537
お前はデバッグの仕方も解らないのか?
>>543
誰がお前じゃ。もう一度言うてみろ糞餓鬼
>>543
言うことは、いっちょ前やね。
具体的にやりかた書いてみそ。
>>544
誰が糞餓鬼じゃ。もう一度言うてみろお前
>>545
お前もデバッグの仕方すら解らないのか?
デバッグの方法を教えてください。
printf
550デフォルトの名無しさん:03/05/17 13:02
0x15aa は二進では 1010110101010と書いてあったんですが、
じゃあ0x15aaは何進数なんですか?
それともプログラム専用の書き方みたいなもんですか?

>>550
氏ね
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
壮絶なアホを発見。
556 名前:デフォルトの名無しさん * sage 本日のレス 投稿日:03/05/17 13:25
コンピュータの基礎やっても意味ないよ。無関係だから。
>>550
こういう入門書の一冊も読まずに質問するやつは無視してほしい。
そこまで責めなくても・・・
>>561

>>560は幼いが言ってることは一理ある。死んでくれ。
>>547
プッ、やっぱり書けないだ。

それとも >>549 が答えなのか ?
>>563は幼いが言ってることはもっと幼い。死んでくれ。

ガキじゃねえんだから......
563 名前:デフォルトの名無しさん 本日のレス 投稿日:03/05/17 14:34
>>547
プッ、やっぱり書けないだ
ああ、今日は学校が休みなんだな
>>564-566
あんたの知ってるデバッグ方法とやらを書けばいいだけなのにねぇ...。
568566:03/05/17 15:21
>566
漏れはデバッグ方法なんかしらねえ
勝手に人違いするな
569566:03/05/17 15:22
>567だった
鬱だ詩嚢
>>567
標準出力が使える場合: printf
エラー出力なら使える場合: frpintf(stderr, ...)
どちらも使えない: fp=fopen(...);fprintf(fp, ...)
漏れの場合、おまいらと違ってバグを出さないから
デバックは不要なんだよな・・・
ま、せいぜいガンガってくれ。
バグを出さないプルグラマはただのプルグラマだ
ちょっとずつ書きながら確認してるからデバッグなんかしないし。
>>573
ワラタ
あ?とりあえずは>>573的な方法でやってるが。
あとはデバッガーでトレースするとか。
それでも駄目なら、>>570か。

というか、そもそも
548 :デフォルトの名無しさん :03/05/17 09:38
デバッグの方法を教えてください。

ネタだろ?がっつくなよ。
576デフォルトの名無しさん:03/05/17 17:32
構造体のビットフィールドがよく分かりません。
どのHPも扱ってなかったので2chに頼るしかなくなりました。
どうか教えて下さい。
あまり使わないもんだが、普通入門書でも説明されてるだろう。
>>576
環境依存するので使用は控えましょう
おまいら教えてやれよw
580576:03/05/17 17:37
おまえらとっととおしえろよ
「構造体のビットフィールド」で検索すればいろいろでてくるが、
>>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
587576:03/05/17 17:45
>>577-581
ありがとうございます。おかげで分かりました。
使うのは避けたほうがいいんですね。1つ勉強になりました。
ありがとうございます。
for文も通らないだろ
>>582
そのループは1度も(ry
>>582
凄いコードだなw
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になると思うけど
592582:03/05/17 17:56
for文がおかしい気もしますが
一回ループします
i=1は一回ループしたあと、設定されているようです。

i<=1,i<1,i<=2などいくつか試したんで
間違いないと思います。


> 2を代入して二乗、それをもう一回二乗
16

すいません、そうです。
二回2乗させて16です。

593582:03/05/17 17:58
>>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文を説明しているページをよく読め。 
596582:03/05/17 18:00
>>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
買う人が限られているからかな?医療系はさらに高いらしいね。
sprintf/sscanfに関しては キーワード:書式指定子 で検索しれ。

strtokやqsortは、MSDNで
http://www.microsoft.com/japan/msdn/library/ja/vclib/html/_CRT_qsort.asp?frame=true
http://www.microsoft.com/japan/msdn/library/ja/vclib/html/_crt_strtok.2c_.wcstok.2c_._mbstok.asp?frame=true

シミュレータ系のプログラム組んでるけど、
sprintf/sscanf以外、どれもこれも使った記憶ないよ(笑

大切なのは「必要なときに必要な情報を検索できること」れす。
がんがれ。

*そういえば友人が作ったプログラムで、高速化のためにフラグを全部
ビットフィールド風に扱っているのがあったなぁー
604デフォルトの名無しさん:03/05/17 21:06
C言語で構造体を使う方法を教えてください。
>C言語で構造体を使う方法を教えてください。
使わなくてよし
>>604
char s[200];int a,b;
&s[0] = a;
&s[sizeof(int)] = b;
>>606
いい太古とはわかるが、違うだろ。
>>568-569
ああ悪い、「唐突にわけわからんこと書くなヴォケ。」だったな。

>>570
>>563>>549 で既出のことを今頃のこのこ書いてて恥ずかしくないの ?
>>606
3,4行目は正しいの?
>>608
ニチャニチャ
>>607
全然わからない。>>606は何を言いたいの?
>>611
ボケてるんだよ。わかってやれよ
>>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
>>630=犬厨(プ
>>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で文法ごとに色分けしてくれる設定ってないですかね?
知ってる人教えてください。お願いします。
(;´Д`)で結局、どうやって閉じないようにするんでしょうか、、、
>>637
辞書でも引け
>>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
残念ながらそれじゃかわらんな
なんで皆して環境依存の話してるんだよぅ
>>644
win98以前でないとDOSのエスケープシーケンスコードは使えんかった気がする。
俺のマシン、XPだから確認不可能なんだけどね。
ってかそれ以前に「l」は16進数でないだろ
winとかdosしか知らん連中が多いのぅ...その上みーんな自分と同じ環境と思うておるんかのぅ....
Windows のシェアからしてしょうがない。
定期的にこの話題と会話がでてくるよなぁ
シェアが大きいと、そうなるんかの? なんだかしょっぱいオツムだのぅ...。
win、dos、mac、nuix、後他に何がありましたっけ?
>>653
お前はしゃべらんでええよ。
>>654 ごめん・・・
>>655
元気出せ。
657620:03/05/18 15:27
一応環境っと
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() みたいな奴はないのか ?
663620:03/05/18 16:34
>>662
あ、cygwin上のgccでした。説明省いてスマソ。とりあえずそこ見てみます。
>>659
それは厳密には、「Linux」を使ってる奴ら、な。
奴らと一緒にしないでくれよ。
>>663
Unix 板の Cygwin スレにでも行くと吉。
定数はマグロにするといいと聞いたのですが、どういう意味なんでしょうか?
マグロ関数とかと何か関係があると想像してるんですが・・・
もっとひねれ
>>663
だから環境はきちんと書けとあれほど...
久しぶりに C でプログラムを書いてみたのだけど、 Java に慣れきってしまったせいで、
エラーだしまくり ^^;

昔はすらすら書けたのになぁ、、、
夢・独り言
http://life.2ch.net/yume/
>>643
基本情報の勉強だけではC言語なんて身に付かないと思うけど。
あれはあくまでも用語の勉強。
673632:03/05/18 19:25
嘘だよ
674デフォルトの名無しさん:03/05/18 19:36
ベクターワークスを使っていて、ある操作(編集→すべてを選択、加工→合成)で必ず、Microsoft VisualC++ Runtime Library     RuntimeError!
abnormalprogramtermination と表示されOKするとそのアプリが強制終了になってしまします。
そのときは OK しかクリックできません。スレ違いかもしれませんけど、たどり着いたのがここでした!
675658:03/05/18 19:36
_mbscspn()を使うと簡単に出来てしまいました。662さんありがとうございます。
ですがこのまま判らないままにするのもアレなのでちょっと2バイト文字について
勉強してみようと思います。せめてこの部分が自力で実装できるぐらいにー。
660,661さん参考にさせていただきます。


とりあえずShift-JISが何たるかから・・・。
>>674
帰れ
>>675
それ以前に、VC++ とか使ってるんだろうから、質問する時はそっちのスレにした方がいいよ。

★初心者にVisual C++を教えるスレ★ Part6
http://pc2.2ch.net/test/read.cgi/tech/1052931903/
nCrの計算てどんな風に書けばいいんでしょうか?
再帰関数で>>678
680デフォルトの名無しさん:03/05/18 20:57
float.h を眺めていると、LDBL_DIG が 15 で、DECIMAL_DIG が 17 と
定義されていたのですが、どうして DECIMAL_DIG の方が大きいのでしょう?
自分の理解ではこの2つは同じでないといけないと思うのですが。
>>679
再帰使う必要あるか?
よく調べたら定義上違って当然だった(汗
同じになるのは基数が10の整数乗の場合です、はい…
684680:03/05/18 22:01
683 = 680 です、すいません。
685デフォルトの名無しさん:03/05/18 22:36
処理系ってコンパイラのことっすか?
686デフォルトの名無しさん:03/05/18 23:36
volatileって使い道あるんですか?
>>685
コンパイラとかインタプリタとか。
>>686
ある。

マルチスレッドとか、デバイス制御とかやってると必須。
要するに自分以外が変数を勝手に書き換えちゃったりする時に使う。
>>688
よくイメージがわかない・・
constと違うんですか?
コンパイラが最適化するのを防ぐのもある
>>690
そのためにあるんじゃ・・・・
autoと単項+演算子以外は意味がある。
volatileの説明に
その変数の値が、明示的に定義されていない方法で変更され得ることをコンパイラに
知らせることになる。
と書いてありました。「明示的」?
694デフォルトの名無しさん:03/05/19 00:08
>>689
const は、そのシンボルを通じて書き込みが出来ないと言う指定。
volatile は、現在動いているプログラムとは違う要因で書き換えられる事がある、と言う指定。
695689:03/05/19 00:11
>>694
例えばどのようなことでしょう?
while(a);
一見aの値が変わらないように見えるから無限ループだけど、もしも他の要因でaが書き換えられることがあったら・・・
でもそんなことコンパイラは分からないから、volatileつけないと条件式すらなくして完全な無限ループにしてしまうかも。
697デフォルトの名無しさん:03/05/19 00:14
>>695
他のスレッドやハード的な要因で書き変わることが有り得る、と言うこと。
698696:03/05/19 00:15
あ、aの初期値が0以外の場合ね
699たすけて〜:03/05/19 00:17
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
>>689
標準 C じゃねぇだろ!
カエレ!
>>696
なんとなく分かったような気がしました。
でも他の要因って??馬鹿ですいません
>>697
プログラムと関係のないところで変数が変わるんですか?
703701:03/05/19 00:19
>>701
× >>689
>>699

鬱だ…
便乗ですが、構造体やクラスのメンバの場合でも volatile の指定が必要に
なる(メンバがそのような最適化の対象になる)ことはあるでしょうか。
>>704
一部のメンバーをってのは無理だろ?
構造体変数全体を。
メンバにvolatile付いてるのは何か間違ってる可能性が高いと思われ。
>>702
一番試しやすいのはシグナルによって呼び出される関数かな。
>>707
すいません。まったくわかりません。
まだまだ初心者ですね>俺
Cはじめて1ヶ月なのでまだまだ勉強しないと。
出なおしてきます。答えてくださったみなさんありがと。
プロでも分野によっては全然使わないと思う。
>>702
対象のオブジェクトが、ハード的に変化するようなレジスタとかな。
711704:03/05/19 00:32
>>705-706
なるほど、機械語レベルの話はよく分からないのですが、メンバが
最適化される可能性はないと考えていいのですよね。
712706:03/05/19 00:34
>>711
そんなことは言ってない。
すいません。消えたはずの>>708です
ぐぐってみたのですが、英語ばっかだったので無理でした。
英語力も重要ですね。
>>709
そうですか。使わない分野に進みたいです。
>>710
すいません。PC内部?的なことはさっぱりです
>>711
メンバーには型しか指定できず、記憶域などは指定できないんじゃないかということ。
715714:03/05/19 00:40
ちなみに、C++のクラスは知らない。C++しらないから・・・
716711:03/05/19 00:41
>>711,>>714
volatile を根本的に誤解していました。宣言時ではなく定義時に
どこに取るかということなんですね。
717706:03/05/19 00:41
>>714
volatileは記憶域の指定じゃない。
718714:03/05/19 00:42
>>717
記憶域"など"だってば。
>>705
今し方、VC でテストプログラムを組んだ所、
問題なくコンパイル出来ますた…。(;´Д`)
>>719
まじだ(;´Д`)
gccで-ansi -pedanticつけても通る(;´Д`)

意味上ではどうなるんだろ。
staticはだめか。
記憶域指定だけがだめなのかな。
722719:03/05/19 00:51
>>721
VC では通ったぞ?(;´Д`)
>>722
gccではパースエラーになったよ。

struct testkozotai{
int n;
static int c;
};
>>722
c++でコンパイルしてるんじゃない?
725706:03/05/19 00:57
volatile修辞された変数へのアクセスは省略されず、
シーケンスポイントをまたいで順序変更されないことが保証される。

構造体メンバを修辞しても意味は同じ。

ってことでよろしいか?
726719:03/05/19 00:57
>>723
そう言う意味か…。
static に volatile 宣言だと(ry
728デフォルトの名無しさん:03/05/19 02:06
分岐命令で次の命令の先頭アドレスを基準に分岐先を
指定しているアドレス指定方式はなんて呼ぶんだ?
相対アドレス指定か?
すれ違いだ
730728:03/05/19 02:27
>>729
どこで聞けばいいか分かんなかったから
とりあえず分かる人がいそうなここに書いちまったスマソ


気が向いたらこっちも教えてくれ
出力ポート・入力ポートのアドレスを指定しているアドレス指定方式は?
情報処理の勉強したほうが早いぞ
732728:03/05/19 02:35
>>731
情報処理の勉強中なわけなんだが_| ̄|○
>>732
プログラマ板にスレがあるぞ
>>730
「相対」とくれば、「絶対」だろうに。
ちがうよ
いいえ、その通りです
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[]);
> と宣言しても構わない。

宣言も置き換え可能なのですか。
知りませんでした。

ありがとうございます。
>>738
アーグシー、アーグブイ
>>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が何指してるかは置いといて。
>>747
全然ダメ。
memcpyも >>747 もOKと思うんだが。
比較と間違えてない? >>744
750747:03/05/19 20:13
あ、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
正直、環境も聞かずにそう答えるのもどうかと思われ。
>>762
exeと言ったら(ry
>>763
OSの察しはつくかもしれんが、コンパイラが(ry
>>764
コンパイラが何?
>>765
WIN32API等がつかえるコンパイラかどうか判断できない、ということでわ
地球のみんな、オラに少しだけC言語の知識を分けてくれ。
  ○

  火
769こうだろ:03/05/20 08:57
  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
>>775
スレ違い
778デフォルトの名無しさん:03/05/20 12:57
>>776
すごいですね。Win32APIを使えばサイズを変えられるのは知っていたの
ですが、画面に収まり切らないような気もするけど。
>>777
C言語のコードを書いて実行するとDOS窓がでるので、ココでいいのかなと。
すみません。
>>775
PC/AT互換機のテキストモードは
25x80
43x80
50x80
が使えるが、日本語は表示できない(当然)。
多分おまいはテキストモードを使ってない。
DOS「窓」なら機種依存ではなくOS依存だ。
>>778
スクロールバー・・・
多分、横が80で、縦が1000なんだよ。
781775:03/05/20 13:11
>>779
教えてくれてありがとう。調べないで質問したので、サイズにパターンが
ある、テキストモードのことを知りませんでした。調べてきます。
>>780
なるほど。そうですよね。
つーか、どこが言語の質問だよ。
今日の流れはホノボノなのか殺伐なのか・・・
784775:03/05/20 16:20
>>782
ほんと勘違いしてました。すみません。
>>783
ああっ、僕のせいです。すみません。
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という素数定理
を用いて考えたいです。

お願いします
800げっと

>>799
primeで検索
素数 "列挙" アルゴリズムを極めるスレ
http://pc2.2ch.net/test/read.cgi/tech/1018657457/
>>799
↓のスレに同じ問題と思われる書き込みがあるから、そっちにいってくれ。

C/C++の宿題やらせてください。6代目。
http://pc2.2ch.net/test/read.cgi/tech/1053045530/l50
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の実装を真似てみてもいいかも。
821808:03/05/20 22:25
>>817
ありがとうございましった
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系の関数とか詳細に載ってるとこあれば教えて欲しいです
Linuxだが、http://www.linux.or.jp/JM/

UNIXならmanで調べられると思うんだけど。
830r:03/05/20 23:26
>>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
すばらしい解釈だ
>>835
> iを3で割ったときの剰余が0の時
> iを出力すると言うプログラムではないのですか?

違います。剰余が0でない時にiを出力するプログラムです。
838デフォルトの名無しさん:03/05/21 01:52
>>835
continue は「以下続ける」じゃ無くて、
「次のループ制御まで処理をすっ飛ばす」って意味なんで、逆です。
839835:03/05/21 01:56
早速のご回答ありがとうございました。
逆に捉えていたとはまだまだ理解度不足のようなので
また1から勉強しなおします。
int i;
for(i = 2; i < 15; i++){
if((i % 3) == 0){ printf("%d\n", i); }
}
>>830
man -k 使えば?
マンコ
ついでに言うと 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を使ってみます
852851:03/05/21 22:09
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;
}
854853:03/05/21 22:27
pow: DOMAIN error
と出てきます
どこがおかしいか教えて下さい
855超初心者:03/05/21 22:46
質問させて頂きます。
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乗は未定義やがな。
858超初心者:03/05/21 22:54
>>856
助かりました。ありがとうございます。
859853:03/05/21 23:24
>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を騙すために明示する必要がある。
古き悪しき(とまでは言い過ぎか)習慣だ。
869867:03/05/22 01:46
>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で警告が出るか出ないかにどれほどの意味があるってんだ?
警告出ようが出まいが元のソース書いたやつが書いちまったんだからしょうがないだろ。
871山崎渉:03/05/22 04:25
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
>>870
なぜおこっているのですか?
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
>>875
誘導が間違ってる。
こっちだろ。
http://pc2.2ch.net/test/read.cgi/tech/1047949606/
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>>880:03/05/22 13:27
やってしまいました…
どうか無視してください。
でも、どこに行けば…
>>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 以下としか。
>>888
スタック壊してない?
2 バイト固定で使いたければ、
typedef でもしてそれ使って、
環境によって定義を切り替えれば良し。
>>893, >>895

ありがとうございます。
てことは、移植性を考慮すると、ハードコーディングしないで、

#if sizeof(short) == ......(略)

とした方が無難ということですね。
上下左右のASCIIコード教えてください。
文字配列の初期化で

char str1[20] = "abc"; /*うまく動くかもしれないがお薦めできない*/
char str2[] = "abc";   /*OK*/

と言う人がいました。
これってC言語の定義ではどうなってるんですか?
899888:03/05/22 21:17
皆様ありがとうございます。

環境はSUN Soralis SPARAC3
です。

メモリを破壊しているということは

ほかの部分、例えばmemcpyなどで
スタックをおこしていて
printfに影響を及ぼしている可能性も
ありますか?

再度の質問ですみませんが
ご教授お願い致します。
>>899
基本的に自動変数はスタックに並んで入るから、
例えばnumの前にある変数の領域をオーバーしてmemcpyすれば当然スタックは
破壊されてnumの値が書き換わる。
901899:03/05/22 21:29
>>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 で長さのチェックをしてからコピーするのが安全である。
906888:03/05/23 00:35
>>902サソ

まじありがとうございます!!

0x20がスペースってことはしってましたが・・・
まさかこんなことになっているとは
思いもよりませんでした。。。

少し新しい道が開けました!!

ありがとうございます!!
>>888
つまり、スペースが暴走してスタック上の変数領域を侵食してしまったわけやね。
908デフォルトの名無しさん:03/05/23 03:03
WizOnline開発中!プログラマ緊急募集(C,Java)
http://219.96.231.242/wizonline/
2chスレ
http://game3.2ch.net/mmominor/dat/1053536167.dat
909デフォルトの名無しさん:03/05/23 03:52
>>827
本当にそんなことが言えるの?
根拠を示してから書き込むように。
おまぃ、最近落ち着きがないようだが、せめてCくらい勉強してから人にアドバイスしようね。
昔よくsourcerとか使ってたけどwindowsでは無理かな?
mochaはよくお世話になったからあると便利なのは確かだね。
実力つけたいなら、 自力で構築しなおすのがいいと思う。
少し悩んでます。どうかご教授お願いします。
あるデータ群から、任意のデータを抜き出して配列なりなんなりの
テーブル等に格納したいのですが、データ数が分らない場合、

"一度データ数をカウントしてテーブルを制作、その後に格納"

これしか思いつきません。
これだと二度データ群を走査するやり方しか自分は出来ません。

なにか定番のやり方、
一度のデータ走査でデータ格納領域を確保しながら格納ってやり方なんてあるのでしょうか?
少し頭をよぎったのは、データヒット毎にリアロケートなんですが
さすがに却下しました。
大き目にmallocしてrealloc。
配列ならreallocとか
配列以外ならリンクリストとか
じゃあダメってこと?
913デフォルトの名無しさん:03/05/23 05:27
>>879
本を「牽引」して何の意味が?
914デフォルトの名無しさん:03/05/23 06:14
>>910
テーブルと同サイズのメモリを用意し、格納していく。
格納した数はカウントしておいて、最後にreallocで小さくする。
データヒットごとじゃなくて一定サイズ確保であふれたらreallocとか
reallocじゃなくて新たに確保してリンクさせるとか?

元テーブルのサイズによるね
小さければ>914でいいし大きかったら動的に何かするしかないかと
916915:03/05/23 09:19
でも結局全件ヒットしたらそれだけいるんだ(´・ω・`)
>>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で関数名を辿るのはやったことあるけど面倒だった。
同じ手法でグローバル変数も可能なのは確認済み。

でも、一般的には不可能って答えるしか。
どっちにしろないんだから自分で簡易インタプリタでも書け。
>>902
サンクス
while文に使われる !=EOF は、使わなくてもちゃんとプログラムは動くのですが、いろんなサイトとかでは使ってるのがほとんどです。
!=EOF を使うのと使わないのとでは何が違うのでしょうか?
>>925 意味の通る文章を書いてください。
>>925
動いたソース見してくれ
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 の入力の仕方、に直接関係があるのかね?
>>934
確かにintにするべきだね。
>>935
大蟻。
ファイルからリダイレクトしたときに、ファイルの最後はどうやって検出すると思う?
>>937
ここでいっているのは、コマンドラインでCtrl-Z,Ctrl-Dで入力するEOFでは?
>>936
コンパイラが馬鹿でないかぎり大丈夫だろ。
>>938
Ctrl-Z はねぇだろ・・・
大丈夫とかいう問題なの?
>>940
MS-DOS,WindowsだとCtrl-Z
VAX(VMS)もCtrl-Z
>>Ctrl-Z
まじで!? プロセスも続行でつか??
945デフォルトの名無しさん:03/05/23 19:44
>>944
馬鹿
946944:03/05/23 19:49
続行っていうかその後も入出力可能なん???
Winのコンソールはバグがあったような記憶が < Ctrl-Z
MXや2000はどうなのだろう。
MX?
>>946
UNIXのSuspendとごっちゃになってるんでねーの?
nyはどうなの?
>>948
XP(汗
割れ厨発見( ・∀)人(∀・ )通報しますた!
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
>>954
1.ネタニマジレスカコワルイ
>>955
不可逆だが、逆コンパイラがないわけではない。
ttp://www.itee.uq.edu.au/~cristina/dcc.html
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コンパイラ作るならいいんじゃない?
962958:03/05/23 22:49
>>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のところで、「移植性のないポインタ」と警告が出ます
どうすれば上手くいくか教えて下さい!
>>966
fgetsの戻り値が何か調べてみ
>>964
unix(Sun-OS)の話だけれど。
nmコマンドで変数のマッピングされているアドレスが得られる。
そこを巧く実アドレス(実際には仮想アドレス名訳だが)に変換すれば、
変数領域が得られる。

同じ理屈を使って関数アドレスを得、その関数をコールするのは実装した。
969デフォルトの名無しさん:03/05/23 23:25
>967
有難うございます、上手く出来ました
>>968
それを処理系依存という。Cでもなんでもねーだろ
>>968
思いっきり実装依存と言うことは、理解してるよね ?
972971:03/05/23 23:55
かぶった...。
>>964
> >  良いコンパイラであればエラーを出してくれるかもしれないが、
>
> エラーはないやろ。正しい文なんだから。
> 警告ぐらいはあるかも知れんが。

長い時は正しいけど、
短い時はエラー出ることが多いでしょ。

>>962
システムのプロパティの詳細設定内にある
環境変数ってボタンを押すべし。
あとは Windows 2000 とほぼ同じ。だった筈。
>>970-971
処理系依存でもやりたいことができればいいだけだろ。
>>919 が無理じゃなくて >>918 がやれる処理系はある。
>>974
その精神は立派なのだが、スレ違いだから言ってんの。
>>1読もうね。
『GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo!』
次スレヨ炉↓
>>974
> 処理系依存でもやりたいことができればいいだけだろ。

はぁ ? >>918 が Unix 使ってなかったら意味ないだろ。
あと >>918 はグローバル変数だけ扱えればいいなんて書いてないだろ。

まあ、こう言うことができるって言いたかったんだよな。
>>918
Python.h 使えばできそうな気もするけど、
詳しくないのでどこまでできるのか分からん。
>>918
C言語では eval は無理。

変数を動的に参照したいだけなら、ポインターを使えばよい。
プログラマーが使いたいだけなら、無理なので諦めるか別の言語にする。
ユーザーの入力を解釈実行したいのなら、インタプリターをリンクすればよい。


>>970 >>971

921 は 918 に答えて Unix でやったことがある。でも、一般的には不可能と書いている。
これに対して、 964 はやり方を書いて欲しいとレス
その回答が 968

スレの流れから処理系依存の話になっただけで、968 が非難されるいわれはない。
>>979
キティニマジレスカコワルイ
982964:03/05/24 10:25
>>979
> これに対して、 964 はやり方を書いて欲しいとレス

>>964 の最後の行見てる ?
基本的に処理系依存の話題は避けるのはここの常識と思う。(嫌と言うほど言われてる。)
まあ、>>968 を責めると言うよりも、処理系依存のことを書いた >>920-921 の時点で責められるべきもんだと思うよ。
しかも、実現内容は不完全だし、>>974 で逆切れしてるし。

普通の Unix プログラマなら >>968 ぐらいの内容は思いつくし、他の環境でも map ファイルとかから同じようなことはできる。
デバッグ情報にアクセスできれば、ローカル変数だって可能のはず。(デバッガはやってるからね。)

>>968 が責められるは、処理系依存云々もあるけど、そんなあたりまえの事を得意げに書いてると言うところにあるんじゃないの ?
>>982も当たり前のことを得意げに書いているように見える。
「はいはい、分かったから次スレで同じ話題で議論すんなよ」ということでファイナルアンサー?
985979:03/05/24 11:12
>>981
タシカニカコワルカタ
>>920は認識不足。
>>921はそれに対するフォロー。一般的に無理と答を出している。
>>964は得意げな煽り。
>>968は調子に乗りすぎ。
>>974>>968でもないのに突っ込む阿呆。
>>979が折角丸く収めようとしているのに更に得意げに書く>>982
>>986の分析をお願いします。
>>986は分析厨
最近、1000獲り合戦もなく、寂しい終わり方が多いですね・・・。
991デフォルトの名無しさん:03/05/24 11:57
記念カキコ
992.ある被害者:03/05/24 12:25
脳の「物理的」拘束から催される体感的自殺衝動に耐え、
常に歯をくいしばっていなければならず、シャワーを浴び
る事さえ困難で日常生活を送ることができません。一年と
三か月続いています。
脳の「物理的」拘束においては、脳を機能停止にすること
など簡単で、何百回と機能を停止され、殺害されかけまし
た。こんなことが許されてもよいのでしょうか?




























ここからはVBの質問を受け付けます。
でも、スレの残りが少ないから答えられないな。
おお、VB、VB。あなたはどうしてVBなの?よりによってM$家の方だなんて。
VBは元々Borland社が開発・販売を行っていたんだけど、今ではM$に乗っ取られてM$から発売されるようになったの。
997964:03/05/24 18:14
997
お(=^o^=) や(=^O^=) す(=^。^=) みぃ(=^-^)/~~
999
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。