• ベストアンサー

初めてCを触って、困っています

こんばんわ。研究のために初めてCを触ってやっています もともとはVBAで動かしていたのですが、ファイル操作がどうしても上手くいかない+自由度が少ないためにCを始めました 使っているのはVC++2005Express Edittionです。予想していた値と全く違う値がでて困っています。どこか間違っているのでしょうか… ------------------------------------------------------------------- #include <stdio.h> #include <conio.h> #include <math.h> int num,num_2,num_3; double xx[100],xy[100],xz[100],yx[100],yy[100],yz[100],zx[100],zy[100],zz[100]; char mol_name[100]; double delta(char,double,double,double,double,double,double,double,double,double,int,int); double kekka; int arg1,arg2; main(){ mol_name[0]='c'; xx[0]=-61.1835; xy[0]=-19.3027; xz[0]=0.0062; yx[0]=-21.1311; yy[0]=25.2157; yz[0]=0.0037; zx[0]=0.0018; zy[0]=0.0009; zz[0]=77.9485; num_2=0; printf_s("一番目の角度を入力してください\n"); scanf_s("%d",&arg1); printf_s("二番目の角度を入力してください\n"); scanf_s("%d",&arg2); printf_s("1番目は%d,2番目は%d\n",arg1,arg2); kekka=delta(mol_name[0],xx[0],xy[0],xz[0],yx[0],yy[0],yz[0],zx[0],zy[0],zz[0],arg1,arg2); printf_s("arg1=%d ,arg2=%d\n",arg1,arg2); printf_s("%fが結果です",kekka); getch(); } double delta(atom_name,xx,xy,xz,yx,yy,yz,zx,zy,zz,atai1,atai2){ static double pi=3; double r31,r32,r33,angle1,angle2,gamma,deta; printf_s("π=%fです\n",pi); printf_s("atai1=%d ,atai2=%d",atai1,atai2); angle1=pi*atai1/180; angle2=pi*atai2/180; printf_s("Φ=%d ,θ=%d",angle1,angle2); printf_s("atom_nameは%cです\n",atom_name); if (atom_name=='c') gamma=0.673; else gamma=0.673; printf_s("%f\n",gamma); r31=sin(angle1)*sin(angle2); r32=sin(angle1); r33=cos(angle1); printf_s("%f ,%f ,%f\n",r31,r32,r33); deta=11.7*gamma*(r31*r31*xx+r31*r32*xy+r31*r33*xz+r32*r31*yx+r32*r32*yy+r32*r33*yz+r33*r31*zx+r33*r32*zy+r33*r33*zz)/(20*pi); return deta; } ----------------------------------------------------------------- 例えばarg1=10 arg2=20とすると、mainの方はちゃんとarg1=10 arg2=20と出てきます ただし、関数delta内ではatai1=10 atai2=20となるはずが、atai1=1077491512,atai2=1608035756となってしまいます。その後の値もこれのせいで無茶苦茶です 宜しくお願いいたします

質問者が選んだベストアンサー

  • ベストアンサー
  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.2

atai1,atai2は参照渡しだからポインタで渡さないと内容が変わらないのでは?VBでいうvar付きの変数ですね。

kumatyon
質問者

お礼

ありがとうございます どうやらそのようですね。ポインタで渡すというのをすっかり忘れていました…でもポインタは未だに使うことが出来ないので、とりあえずarg_1=arg1として、変数に置きなおした上でそれを引数として使うことにしました あと何箇所か直すことによって動くようになりました。ありがとうございました!

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

え~と.... この場合, delta の各引数の型はどうなるんだろ? 全部 int だと思われてたりしないかなぁ. とりあえず, delta の定義でも横着せずに全ての引数に型を書いておくべきだと思う.

kumatyon
質問者

お礼

ありがとうございます deltaの引数の型は一番上で double delta(char,double,double,double,double,double,double,double,double,double,int,int); と宣言しているので、引数は前から自動的にchar,double,double・・・と定義され、それが関数内での型になると思っていたのですが、勘違いでしょうか…?