• 締切済み

Java 3Dで二次関数のグラフを描く

Java3Dを使ってサーフボードを作ってみようと思っているのですが、初歩中の初歩からつまずいています。public BranchGroup createSceneGraph()の中に以下のようなコードを書いたのですが、load test can't be instantiatedと出ます(testはアプレットの名前です)。そもそもこのエラーがどのような物なのかも分からないのですが、以下のコードのどこがおかしいのか教えてください。お願いします。 //createSceneGraph()の一部 Point3d[] vertices = new Point3d[400]; double step = (1 - (-1)) / 400; int i = 0; for(double x= -1; x < 1; x += step){   // x座標が x と x+step の間を計算して線分で結   vertices[i] = new Point3d(x, f(x), 0.0);   vertices[1+1] = new Point3d(x + step, f(x+step), 0.0);   i += 2; } double f(double x){   return a*x*x + b*x + c; }

  • Java
  • 回答数1
  • ありがとう数1

みんなの回答

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.1

load test can't be instantiated(testをインスタンス化できない)と出ているので、このコード内にエラーメッセージの原因があるとは思えないのですが、とりあえず、お書きになられたコードで修正すべき点を上げておきます。 double step = (1 - (-1)) / 400; ↓整数型と浮動小数点型はしっかり区別。 double step = (1.0 - (-1.0)) / 400.0; 変数iとの兼ね合いもあるため、ループカウンタに浮動小数点型はお勧めできません。 修正例) double x = -1.0; int i = 0; while (i < 400) {   vertices[i] = new Point3d(x, f(x), 0.0);   i++;   x += step;   vertices[i] = new Point3d(x, f(x), 0.0);   i++; } ↑元のコードをそのまま修正したものです。(ループカウンタをxからiにしました) ↓でもループの中はこっちのほうが正しいような気がします。 while (i < 400) {   vertices[i] = new Point3d(x, f(x), 0.0);   i++;   x += step; }

northcurlcurl
質問者

補足

UKYのおっしゃるとおり、エラーの原因はこのロープの部分ではなく、コンストラクターにpublicを付け忘れてたせいでした。エラーはなくなったのですが、何も表示されないんです。どのような原因が考えられるのでしょうか?

関連するQ&A

  • Java3D 座標の値を入力し点を表示させるには

    Java3D 座標の値を入力することにより点を表示させたいです。そのために下記のように主な部分のソースコードを作成しました。どこをどうすればよいでしょう教えてください! public class Test extends Applet{ boolean isStandalone=false; Canvas3D canvas=null; SimpleUniverse universe=new SimpleUniverse(canvas); BranchGroup scene=createSceneGraph(); BranchGroup root3=new BranchGroup(); TransformGroup trans3=new TransformGroup(); float x; float y; float z; Vector3f pointposition = new Vector3f(0.0f, 0.0f, 0.0f); TuplePanel bgpanel=new TuplePanel(pointposition) public Test(){ this(false); } public Test(final boolean isStandalone){ this.isStandalone = isStandalone; this.setLayout(new BorderLayout()); Panel panel=new Panel(); this.add(panel,BorderLayout.NORTH); bgpanel.addTupleEventListener(new TupleEventListener(){   public void tupleStateChanged(TupleEvent e){ pointposition=e.getVector3f(); Transform3D t3d = new Transform3D(); t3d.setTranslation(pointposition); trans3=new TransformGroup(t3d); Point3f[] po3=new Point3f[1]; po3[0]=new Point3f(pointposition); PointArray ge3=new PointArray(po3.length, GeometryArray.COORDINATES | GeometryArray.COLOR_3); ge3.setCoordinate(0,po3[0]); Appearance appp3=new Appearance(); Shape3D gggrid3=new Shape3D(ge3,appp3); gggrid3.setGeometry(ge3); trans3.addChild(gggrid3); } }); panel.add(bgpanel); Button addbutton = new Button("Add"); addbutton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e) { universe.getLocale().removeBranchGraph(scene); scene.addChild(trans3); universe.addBranchGraph(scene); } }); panel.add(addbutton); } @Override public void init() { GraphicsConfiguration config=SimpleUniverse.getPreferredConfiguration(); ・・・ BranchGroup scene=createSceneGraph(); universe.addBranchGraph(scene); } private BranchGroup createSceneGraph(){ root3.setCapability(BranchGroup.ALLOW_DETACH); root3.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE); trans3.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); trans3.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); BoundingSphere bounds3 = new BoundingSphere(new Point3d(),100.0); ・・・ double[] vertices3= {0.65,0.00,0.05,//X軸 ・・・ }; float[] colorP3={0.0f,0.0f,0.0f               ・・・}; LineArray eom3=new LineArray(vertices3.length, GeometryArray.COORDINATES|GeometryArray.COLOR_3); eom3.setCoordinates(0,vertices3); eom3.setColors(0,colorP3); LineAttributes attr3=new LineAttributes(); attr3.setLineWidth(3.0f); Appearance p3=new Appearance(); p3.setLineAttributes(attr3); Shape3D rid3=new Shape3D(eom3,p3); rid3.setCapability(Shape3D.ALLOW_GEOMETRY_READ); trans3.addChild(rid3); Point3f[] po3=new Point3f[1]; po3[0]=new Point3f(x,y,z); float[] colorPo3={1.0f,0.0f,0.0f}; final PointArray ge3=new PointArray(po3.length, GeometryArray.COORDINATES | GeometryArray.COLOR_3); ge3.setCoordinate(0,po3[0]); ge3.setColors(0,colorPo3); Appearance appp3=new Appearance(); appp3.setCapability(Appearance.ALLOW_POINT_ATTRIBUTES_READ); appp3.setCapability(Appearance.ALLOW_POINT_ATTRIBUTES_WRITE); PointAttributes ppo3=new PointAttributes(); ppo3.setPointSize(25.0f);      appp3.setPointAttributes(ppo3); Shape3D gggrid3=new Shape3D(ge3,appp3); gggrid3.setCapability(Shape3D.ALLOW_GEOMETRY_READ); gggrid3.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE); trans3.addChild(gggrid3); return root3; }

  • Java3Dで三角形を回転させたい

    Java3D初心者です。 三角形を表示しy軸回転をさせて円すいのような形を作りたいのですが、なかなか進みません。 とりあえず三角形をを表示させるプログラムを作り、 それをRotationInterpolatorクラスに従って回転させるプログラムを作りたいのですが、エラーが出てしまいます。 ご指摘お願いします。 三角形プログラム↓ import java.applet.Applet; import java.awt.BorderLayout; import java.awt.event.*; import java.awt.GraphicsConfiguration; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.universe.*; import javax.media.j3d.*; import javax.vecmath.*; public class Sample3D3 extends Applet {  public BranchGroup createSceneGraph() { BranchGroup objRoot = new BranchGroup();     TransformGroup objTrans = new TransformGroup(); objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); objRoot.addChild(objTrans);     Point3d[] vertices = new Point3d[3]; vertices[0] = new Point3d(-0.9, 0.5, 0.0); vertices[1] = new Point3d(-0.9, -0.9, 0.0); vertices[2] = new Point3d(0.0, -0.9,0.0); TriangleArray geometry = new TriangleArray(vertices.length,GeometryArray.COORDINATES);     geometry.setCoordinates(0, vertices);     Shape3D shape = new Shape3D(geometry);     objRoot.addChild(shape);     objRoot.compile();     return objRoot;} public Material material3; public TransformGroup transformGroup4; public Transform3D transform3D4; public Sample3D3() { setLayout(new BorderLayout()); GraphicsConfiguration config =            SimpleUniverse.getPreferredConfiguration();     Canvas3D c = new Canvas3D(config); add("Center", c);     BranchGroup scene = createSceneGraph(); SimpleUniverse u = new SimpleUniverse(c);  u.getViewingPlatform().setNominalViewingTransform();     u.addBranchGraph(scene);} public static void main(String[] args) { new MainFrame(new Sample3D3(), 400, 400); } } 回転プログラム↓ import java.applet.*; import java.awt.*; import javax.media.j3d.*; import javax.vecmath.*; import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.applet.MainFrame; public class Jikken extends Applet { public Jikken() { Canvas3D canvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration()); BorderLayout borderLayout = new BorderLayout();  this.setLayout( borderLayout);  this.add( canvas3D, BorderLayout.CENTER); SimpleUniverse simpleUniverse = new SimpleUniverse(canvas3D);  simpleUniverse.getViewingPlatform().setNominalViewingTransform(); BranchGroup objRoot = new BranchGroup(); DirectionalLight directionalLight = new DirectionalLight(); TransformGroup transformGroup = new TransformGroup(); Sample3D3 sample3D3 = new Sample3D3(); BoundingSphere boundingSphere = new BoundingSphere(); transformGroup.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE); Alpha alpha = new Alpha(); RotationInterpolator rotationInterpolator = new RotationInterpolator(alpha,transformGroup); rotationInterpolator.setSchedulingBounds(boundingSphere); directionalLight.setInfluencingBounds(boundingSphere); transformGroup.addChild(rotationInterpolator); transformGroup.addChild(sample3D3); objRoot.addChild(transformGroup); objRoot.addChild(directionalLight); simpleUniverse.addBranchGraph(objRoot); } public static void main(String[] argV){ Jikken jikken = new Jikken(); MainFrame mainFrame = new MainFrame(jikken,500,500); } } これで回転プログラムを実行すると、 型 Group のメソッド addChild(Node) は引数 (Sample3D3) に適用できません。という内容のエラーが表示されます。 読みにくくてすみませんがよろしくお願いします。

    • ベストアンサー
    • Java
  • java3D ボタンクリックにより点を動かすには

    java3D ボタンクリックにより点を動かすために下記のようにソースコードを作成しましたが、全く変化なしです。どこをどうすればよいでしょうか? import java.applet.*; import java.awt.*; import java.awt.event.*; import javax.media.j3d.*; import javax.vecmath.*; import javax.swing.*; import javax.swing.JApplet.*; import javax.swing.JFrame.*; import javax.media.j3d.*; import com.sun.j3d.utils.applet.*; import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.geometry.*; import com.sun.j3d.utils.picking.*; import com.sun.j3d.utils.picking.behaviors.*; public class J3D82 extends JApplet { JButton b1; GraphicsConfiguration config=SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas=new Canvas3D(config); SimpleUniverse universe=new SimpleUniverse(canvas); BranchGroup root=new BranchGroup(); TransformGroup trans1=new TransformGroup(); Transform3D tr=new Transform3D(); Shape3D gggrid1=null; public J3D82() { setLayout(new BorderLayout()); add(canvas,BorderLayout.CENTER); JPanel panel=new JPanel(); GridLayout g1=new GridLayout(1,1); add(panel,BorderLayout.NORTH); JButton b1=new JButton("移動"); panel.setLayout(g1); panel.add(b1); root.setCapability(BranchGroup.ALLOW_DETACH); root.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE); trans1.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); trans1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); root.addChild(trans1); double x=0.2; double y=0.2; double z=0.2; Point3d[] po1=new Point3d[2]; po1[0]=new Point3d(x,y,z); po1[1]=new Point3d(x,-y,-z); float[] colorPo1={1.0f,0.0f,0.0f, 1.0f,0.0f,0.0f}; PointArray ge1=new PointArray(po1.length, GeometryArray.COORDINATES | GeometryArray.COLOR_3); ge1.setCoordinates(0,po1); ge1.setColors(0,colorPo1); Appearance appp1=new Appearance(); appp1.setCapability(Appearance.ALLOW_POINT_ATTRIBUTES_READ); appp1.setCapability(Appearance.ALLOW_POINT_ATTRIBUTES_WRITE); PointAttributes ppo1=new PointAttributes(); ppo1.setPointSize(25.0f); ppo1.setPointAntialiasingEnable(true); appp1.setPointAttributes(ppo1); Shape3D gggrid1=new Shape3D(ge1,appp1); gggrid1.setCapability(Shape3D.ALLOW_GEOMETRY_READ); gggrid1.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE); trans1.addChild(gggrid1); universe.getViewingPlatform().setNominalViewingTransform(); universe.addBranchGraph(root); b1.addActionListener(new Listener1()); } public class Listener1 implements ActionListener { public void actionPerformed(ActionEvent e) { if(e.getSource()==b1){ Transform3D tr=new Transform3D(); Vector3d vector=new Vector3d(0.2,0.1,0.0); trans1.getTransform(tr); tr.setTranslation(vector); trans1.setTransform(tr); trans1.addChild(gggrid1); } } } public static void main(String[] args) { JFrame f= new JFrame(); J3D82 frame=new J3D82(); frame.init(); f.getContentPane().add(frame,BorderLayout.CENTER); f.setSize(500,500); f.setTitle("Kuukan:点移動ボタン"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }

    • ベストアンサー
    • Java
  • 頂点座標の操作

    Point3d[] vertices = new Point3d[10]; vertices[0] = new Point3d( 0.0, 0.0, 0.0); vertices[1] = new Point3d( 0.1, 0.0, 0.0); ・ ・ ・ という感じで頂点座標を指定して、IndexedTriangleArrayクラスで三角形のポリゴンの集まりを作ったんですが、この頂点座標の、例えばx成分の値だけを後から操作することは可能でしょうか? 本やWebで調べたときによく見かけた「Transform3D」の説明文を読んだ限りでは頂点ごとの移動、という風に解釈したのですが…

  • Java3D テキストフィールドより値を入力(代入)し点を動かしたい

    Java3D テキストフィールドより値を入力(代入)し、点を動かしたいのですが、下記のようにソースコードを作成しましたが、入力した値が代入されていないようです。どこをどうしたらいいか教えてください! import java.applet.*; import java.awt.*; import java.awt.event.*; import javax.media.j3d.*; import javax.vecmath.*; import javax.swing.*; import javax.swing.JApplet.*; import javax.swing.JFrame.*; import javax.media.j3d.*; import com.sun.j3d.utils.applet.*; import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.geometry.*; public class J3A7 extends JApplet { JTextField text1=new JTextField("x=",10); JTextField text2=new JTextField("y=",10); JTextField text3=new JTextField("z=",10); double a,b,c; String str1,str2,str3; GraphicsConfiguration config=SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas=new Canvas3D(config); SimpleUniverse universe=new SimpleUniverse(canvas); BranchGroup root=new BranchGroup(); TransformGroup trans1=new TransformGroup(); public J3A7() { setLayout(new BorderLayout()); add(canvas,BorderLayout.CENTER); JPanel panel=new JPanel(); GridLayout g1=new GridLayout(1,3); add(panel,BorderLayout.NORTH); panel.setLayout(g1); panel.add(text1); panel.add(text2); panel.add(text3); trans1.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); trans1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); double x=0.0; double y=0.0; double z=0.0; Point3d[] po1=new Point3d[1]; po1[0]=new Point3d(x,y,z); float[] colorPo1={1.0f,0.0f,0.0f}; PointArray ge1=new PointArray(po1.length, GeometryArray.COORDINATES | GeometryArray.COLOR_3); ge1.setCoordinates(0,po1); ge1.setColors(0,colorPo1); Appearance appp1=new Appearance(); appp1.setCapability(Appearance.ALLOW_POINT_ATTRIBUTES_READ); appp1.setCapability(Appearance.ALLOW_POINT_ATTRIBUTES_WRITE); PointAttributes ppo1=new PointAttributes(); ppo1.setPointSize(25.0f); ppo1.setPointAntialiasingEnable(true); appp1.setPointAttributes(ppo1); Shape3D gggrid1=new Shape3D(ge1,appp1); gggrid1.setCapability(Shape3D.ALLOW_GEOMETRY_READ); gggrid1.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE); Transform3D tr=new Transform3D(); Vector3d vector=new Vector3d(a,b,c); tr.setTranslation(vector); trans1.setTransform(tr); trans1.addChild(gggrid1); root.addChild(trans1); universe.getViewingPlatform().setNominalViewingTransform(); universe.addBranchGraph(root); text1.addActionListener(new Listener1()); text2.addActionListener(new Listener2()); text3.addActionListener(new Listener3()); } public class Listener1 implements ActionListener { public void actionPerformed(ActionEvent e) { if(e.getSource()==text1){ try{ String str1=text1.getText().trim(); a=Double.valueOf(text1.getText()).doubleValue(); }catch(NumberFormatException ex){} } } } public class Listener2 implements ActionListener { public void actionPerformed(ActionEvent e) { if(e.getSource()==text2){ try{ String str2=text2.getText().trim(); b=Double.valueOf(text2.getText()).doubleValue(); }catch(NumberFormatException ex){} } } } public class Listener3 implements ActionListener { public void actionPerformed(ActionEvent e) { if(e.getSource()==text3){ try{ String str3=text3.getText().trim(); c=Double.valueOf(text3.getText()).doubleValue(); }catch(NumberFormatException ex){} } } } public static void main(String[] args) { JFrame f= new JFrame(); J3A7 frame=new J3A7(); frame.init(); f.getContentPane().add(frame,BorderLayout.CENTER); f.setSize(500,500); f.setTitle("Kuukan: ボタン"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }

  • はじめまして。今回、大学でのjavaの課題の最後の方がわからなくって、

    はじめまして。今回、大学でのjavaの課題の最後の方がわからなくって、皆さんにアドバイスをいただきたいと思い質問させていただきます。問題の文章が「2つの端点が(1,1) (8,8)であるLineSegment を1 つ作成し、順次、linearTransfer した線分を10 個作成し、10 個の線分の形状を画面表示するプログラムを作成しなさい。10 個の線分は、後に利用することを考慮し、配列に格納しなさい。」というもので、ソースが、 /*キーボード入力がありますが、すでに与えられており、字数の関係上省略させていただきます*/ class Point{ double x;//double xを定義 double y;//double xを定義 Point(){ this.x = 0;//xを0にする this.y = 0;//yを0にする } Point(double x, double y){//ポイント内のx,y を定義 this.x = x; this.y = y; } Point linearTransfer(){ double x = 6 * this.x + 4 * this.y; double y = -2 * this.x + 1 * this.y; Point p = new Point(x , y); return p; } } class LineSegment{ public static void main(String[] args){ Input in = new Input(); double x = in.inputDouble("Input Point :"); double y = in.inputDouble("Input Point :"); double x1 = in.inputDouble("Input Point :"); double y1 = in.inputDouble("Input Point :"); Point p = new Point(x, y); p = p.linearTransfer(); Point q = new Point(x1, y1); q = q.linearTransfer(); ここまでできたのですが、ここからができなくって困っております。皆さんアドバイス宜しくお願いいたします。

  • Direct3Dエラーが出てしまいます

    つい先週PCの本体が壊れかけていたので新しい本体に変えました。前の本体の時は普通にオンラインゲーム等ができていたのですが変えてからどのオンラインゲームで試しても必ずエラーが出てしまいます。 僕なりに(素人)が調べた結果Direct3Dに問題があると思われます。 テストをしてみた結果 Direct3D 7 テスト結果:エラー-ステップ8(3Dデバイス作中):HRESULT=0x80004005(一般エラー) Direct3D 8 テスト結果:エラー-ステップ8(3Dデバイス作成中):HRESULT=0x8876086c(エラーコード) Direct3D 9 テスト結果:エラー-ステップ8(3Dデバイス作成中):HRESULT=0x8876086c(エラーコード) と出ます  ちなみにちょっとだけ追随をすると↓ システム製造源:VIA システムモデル:K7VM3 BIOS:Default System BIOS プロセッサ:AMD Athlon(tm) XP 2600+, MMX, 3DNow,~2.1GHZ メモリ:512MB RAM DirectXバージョン:DirectX 9.0c(4.09.0000.0904) です 後DirectDrawアクセラレータのテストは成功しています Direct3Dのエラーはどうすれば直すことが出来ますか?

  • java3Dについておききします

    javaのバージョンは1.6.0_27です 困ってる内容は現在javaSDをEclipse3.5で使おうとjavaSDをインストールしてネットで調べながらやってますがうまくいいかないです いまどうなってるか画像をみて欲しいです 上手く言ってない理由はこのようなエラーが返ってなかなかすすみません 説明 リソース パス ロケーション 型 アクセス制限: 型 BranchGroup は必須ライブラリー C:\Program Files\Java\jdk1.6.0_27\jre\lib\ext\j3dcore.jar で制限されているためアクセスできません Java3D_first_test.java /01-01/src 行 31 Java 問題 説明 リソース パス ロケーション 型 アクセス制限: 型 SimpleUniverse は必須ライブラリー C:\Program Files\Java\jdk1.6.0_27\jre\lib\ext\j3dutils.jar で制限されているためアクセスできません Java3D_first_test.java /01-01/src 行 28 Java 問題 説明 リソース パス ロケーション 型 アクセス制限: 型 Transform3D は必須ライブラリー C:\Program Files\Java\jdk1.6.0_27\jre\lib\ext\j3dcore.jar で制限されているためアクセスできません Java3D_first_test.java /01-01/src 行 37 Java 問題 説明 リソース パス ロケーション 型 アクセス制限: 型 TransformGroup は必須ライブラリー C:\Program Files\Java\jdk1.6.0_27\jre\lib\ext\j3dcore.jar で制限されているためアクセスできません Java3D_first_test.java /01-01/src 行 34 Java 問題 //****************************************************************************** //Java3D とりあえず動作確認するプログラム //カラーキューブ回転 //****************************************************************************** //============================================================================== //インポート・ファイル import javax.media.j3d.*; import javax.vecmath.*; import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.geometry.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import java.util.*; import java.util.Timer; public class Java3D_first_test { //============================================================================= //クラスのフィールド //仮想空間全体 SimpleUniverse universe; //オブジェクトのためのグループ BranchGroup group1; //オブジェクトの座標変換のためのグループ TransformGroup transform_group1; //オブジェクトの座標変換のためのクラス Transform3D transform1; //回転角を管理 float rot_value; //============================================================================= //メイン・メソッド public static void main(String[] args) { Java3D_first_test test = new Java3D_first_test(); } } javaSDのライブラリはインポート文はエラー返ってないですが・・・ お優しくお願いします。なにが原因かわからずじまいな状態です

    • ベストアンサー
    • Java
  • 関数の出力引数をクラスにするには?

    既出、または基礎の質問でしたらすみません。 ここでも他の検索エンジンでも見つけられなかったので。。。 C++です。 クラスを出力する関数を作りたいのですが、うまくできません。 ソースは以下のとおりです。問題は、プログラム下方のf1(),f2(),main()です。 長くて、そして見づらくてすみません・・・ //////////// #include<stdio.h> class test{ private: int num; float *vec; public: test(int n=1); //ctor ~test(); //dtor int getnum(){return num;} float* getvec(); void set(int,float*); void show(); }; test::test(int n){ num = n; vec = new float[n]; for(int i=0; i<n; i++) vec[i] = (float)i; } test::~test() {delete[] vec;} float* test::getvec(){ float *v; v = new float[num]; for(int i=0; i<num; i++) v[i] = vec[i]; return v; } void test::set(int n, float *v){ num = n; vec = new float[n]; for(int i=0; i<n; i++) vec[i] = v[i]; } void test::show(){ for(int i=0; i<num; i++) printf("%d: %g\n",i,vec[i]); } void f1(test &x, test &y){ int n; float *v; n = x.getnum(); v = x.getvec(); for(int i=0; i<n-1; i++) v[i] = 2.0*v[i]; y.set(n-1,v); } test f2(test x){ test y; //* int n; float *v; n = x.getnum(); v = x.getvec(); for(int i=0; i<n-1; i++) v[i] = 2.0*v[i]; y.set(n-1,v); return y; //** } void main(){ test x,y; int n = 4; float v[4] = {1.0,2.0,3.0,4.0}; printf("x:\n"); x.set(n,v); x.show(); printf("f1:\n"); f1(x,y); y.show(); printf("f2:\n"); y=f2(x); y.show(); } //////////// これを実行すると x: 0: 1 1: 2 2: 3 3: 4 f1: 0: 2 1: 4 2: 6 f2: 0: 7.38979e-38 1: 7.38979e-38 2: 6 となります。 関数f2がうまく動かない理由がわかりません。。。 出力引数にクラスはとれないのでしょうか?? よろしくお願いします。

  • 関数の掛け算を返す関数

    いま関数の積分を行おうとしています. この積分を行う関数が double integral(double (*func)(double), double a, double b ) {    double ans;    .....    return ans; } となっていて,aからbまでfuncが指す関数を積分して結果を返します. 積分をさせる関数は double f1(double x) { return 3.0*x; } double f2(double x) { return x*x; } となっていて,同じようにg1, g2も用意します.(本当は関数が3つ4つあります.) 例えばf1を積分したいとき, int main() {    double ans = integral(f1, a, b);    printf("%f\n", ans); } ですよね. 自分で積分する関数を選ぶときは,ここに配列で場合分けをして double (*func_f[])(double)={f1, f2}; scanf("%d", &flag); /* flagに0~1を代入 */ ans = integral(func_f[flag], a, b); でいいと思います. さて,そこで本題なのですが, double (*func_f[])(double)={f1, f2}; double (*func_g[])(double)={g1, g2}; としておいて, scanf("%d", flag1); scanf("%d", flag2); func_f[flag1], func_g[flag2]; として関数を入力側から決定して, (例えばflag1=1, flag2=1,であったとして *func_f[1]=x*x *func_g[1]=5.0*x ならば) h(x)=(x*x)*(5.0*x)=5.0*x*x*x という関数を作って, h(x)を指すポインタを double (*h_ptr)(double) とすれば ans = integral(h_ptr, a, b); としたいのです. (f1*g2)を一つの関数としてh(x)=(f1*g2)(x)というように扱うことができればいいと思うのですが. integralの引数で,関数のポインタを2個にすると,汎用性が失われてしまうと思うので,できればそこは変えたくないです. どのようにすればよいのでしょうか? また,「考え方を変えればよい」などの意見も頂きたいです. 皆様,どうぞよろしくお願いします.

専門家に質問してみよう