情報処理のポインタ渡しによる関数作成方法

このQ&Aのポイント
  • 3次元ベクトルの外積計算をするプログラムを作成中です。
  • 3次元ベクトルは3成分の配列として扱い、ポインタ渡しを使用して外積計算を行う関数を作成します。
  • main関数内で2つの3次元ベクトルを設定し、作成した関数を呼び出して入力ベクトルとその外積を表示します。
回答を見る
  • ベストアンサー

情報処理 ポインタ渡しによる関数作成について

現在、3次元ベクトルの外積計算をするプログラムを作成を行っています。 プログラムの仕様で (1)3次元ベクトルは、3成分をもつ配列として扱うこと (2)外積計算をする関数を作成すること。ただし、この関数は 2つの入力ベクトルと1つの出力ベクトル(=外積)を扱うものとする。(ポインタ渡し) (3)main関数内で、入力である2つの3次元ベクトルを設定し、外積計算の関数を呼ぶ。 (4)2つの入力ベクトル、およびその外積を表示すること。 を条件に作成しているのですが、どうもうまく作れません。 どのようにプログラムを作成すればよいのか 参考に教えて頂けるとありがたいです。 よろしくお願いします。

noname#147907
noname#147907

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

  • ベストアンサー
回答No.2

少しは学習努力を提示すべきです。 http://yosshy.sansu.org/gaiseki.htm #include <stdio.h> struct vector { float x; float y; float z; }; //使用関数のプロトタイプ宣言 void cross_product(struct vector *a, struct vector *b, struct vector *c); int main(void) { //入力である2つの3次元ベクトル(実数値)を設定 struct vector a={1.0, 2.0, 1.0}; struct vector b={-2.0, 0.5, 1.0}; struct vector c; //入力ベクトルを表示 printf("vector a(%f, %f, %f)\n", a.x, a.y, a.z); printf("vector b(%f, %f, %f)\n", b.x, b.y, b.z); //外積計算の関数をコール cross_product(&a, &b, &c); //外積を表示 printf("cross product c(%f, %f, %f)\n", c.x, c.y, c.z); return 0; } //何も値を返さない void型関数 void cross_product(struct vector *a, struct vector *b, struct vector *c) { c->x = a->y * b->z - b->y * a->z; c->y = a->z * b->x - b->z * a->x; c->z = a->x * b->y - b->x * a->y; }

その他の回答 (1)

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

「どうもうまく作れない」ってことは, 「それっぽいものを作っているつもりなんだけど正しい動作をしない」ってこと? もしそうなら, そのプログラムを出して突っ込まれた方が勉強になるんじゃないかなぁ.

関連するQ&A

  • ポインタ渡しについて

    関数の引数をint型のポインタで出力し、その関数を呼び出し側で値を取得するにはどうしたらいいのでしょうか? 一応ソースを作成しました(下記参照)が、ほしい値が出てきません。 よろしくお願い致します。 ----------------------------------------------- #include <stdio.h> int check(int *num){ int n=10; num = &n; return 0; } int main() { int m_num; check(&m_num); printf("%d\n",m_num); return 0; } ----------------------------------------- m_numに、10が格納されません。 check()でアドレス渡しをしたのですが・・・。 どうすれば、main関数で、数値を扱うことが出来ますか? よろしくお願い致します。

  • fortran初心者です。

    fortran初心者です。 2つの3次元ベクトルa=(a1, a2, a3)、b=(b1, b2, b3)の各成分を入力したときに外積を求めるプログラムを配列、doループを使用して作成することは可能でしょうか?

  • ポインタと二次元配列

    ポインタを習ったんですが、二次元配列を指定する場合はどのようにすればいいのでしょうか? また、別関数でそのポインタを呼びたいのですが。 (例) main関数 char retsu[2][2] = {{2,4},{6,8}}; char *ptr; next関数 上記でいくと「main関数内のchar retsuの二次元配列を*ptrで指定」、「next関数でmain関数で指定した*ptr(retsu[2][2])を参照したい」 という事をしたいのですが、教えて下さい。

  • 続ポインタによる関数への配列渡し

    連続での質問すみません。 林晴比古さんの「新C言語入門」で勉強している初心者です。 ポインタを勉強中で、色々な例文をポインタで書けるかどうか 試しております。 上書P199に「安全な数値入力を行うプログラム」が出ています。 これは入力時問題点を抱えるscanfに入力させるのでなくchar型に入力させ、 それをint型に変換して出力するという内容で、案内メッセージも関数内で表示することになっています。 以下そのプログラムを引用します。 #include <stdio.h> #include <stdlib.h> int getint(char msg[]); int main(void) { int n; n = getint("数値を入力してください:"); printf("入力した数値=%d\n",n); return 0; } int getint(char msg[]) { char ss[80]; printf("%s",msg); gets(ss); return atoi(ss); } (以上林晴比古氏「新C言語入門」P199より引用) これをポインタによって書き換えようとしているのですがうまくいきません。 「本引数として主文でint型のnを設定し、それを関数側のchar型のssをポインタにして 仮引数として受け取れば、最後にreturnで返さなくても、参照できるのでないか」 と思い色々試してみましたがうまくいきません。 どうもコンパイルのエラーを確認すると型が違うので駄目なようです。 なるほどそれはそうでした… それ以外の方法も色々試してみましたが、結局うまくいきませんでした。 どのようにすればポインタでは上の文章を表現できるのでしょうか。 (あるいは表現出来ないのでしょうか) お分かりの方、よろしくお願いします。

  • ポインタによる関数への配列渡し

    林晴比古さんの「新C言語入門」でC言語を勉強している初心者です。 現在ポインタの勉強をしています。色々教科書の文例等をポインタで書くとどうなるか試しております。 上書P200練習問題2に「配列の最大値を返す(その際配列の長さを渡す)」プログラムがあり、それをポインタで渡すプログラムに直してみました。 仮引数に「maxdata」を設定し、そのアドレスを関数側に渡し、関数側ではポインタとして受け取る(そうすれば関数側からはreturnで値を返す必要がない)、と考え、下記のように書いてみました。 #include <stdio.h> void max_of_array(int n[], int len, int *ans); int main(void) { int dt[6] = {50,20,80,30,10,40}; int maxdata; max_of_array(dt,6,&maxdata); printf("最大値=%d\n", maxdata); return 0; } void max_of_array(int n[], int len, int *ans) { int i; ans = &n[0]; for (i=1; i<len; i++){ if (*ans < n[i]) *ans = n[i]; } } しかしコンパイルすると、何故か「最大値=1」となってしまいます。(正しくは80です) 他にも色々試してみましたがうまくいかず、かなり考えてみたのですがどうしても分かりません。お分かりの方、どうすれば正しくなるのが教えてください、よろしくお願いします。

  • mainの外に変数 vs ポインタ渡し

    C++についての質問です。プログラミング初心者ですが、よろしくお願いします。 最近、関数の外側でも変数を宣言できることを知りました。関数の外側で変数を宣言すると、全ての関数でその変数にアクセスすることができ大変便利なように思います。 「わざわざポインタ渡しなどする必要はないのでは?」と思ってしまいました。 これは何か問題があるのでしょうか? 初心者の言葉で説明しても理解しにくいかと思いますので、例として「足し算するプログラム」を以下に記載します。 ポインタ渡しで書くと、以下のような感じになるかと思います。 //●ポインタ渡し #include "stdafx.h" #include <iostream> void func(int x,int y,int *pans){ *pans = x+y; } void main(){ int a=10, b=20, ans; func(a,b,&ans); std::cout << ans << std::endl; } しかし、mainの外に変数を宣言すれば //●mainの外に変数 #include "stdafx.h" #include <iostream> int a,b,ans; void func(int x,int y){ ans = x+y; } void main(){ a=10; b=20; func(a,b); std::cout << ans << std::endl; } ansをポインタ渡しする必要なく、funcの計算結果をansに代入できました。 「●mainの外に変数」のプログラムはどのような問題や危険性を孕んでいるのでしょうか? 以上になります。長文お読みいただきありがとうございました。 よろしくお願いいたします。

  • ポインタのポインタの関数受け渡しについて

    現在ポインタのポインタを利用したプログラムを作成しています。 main関数で int **dt; と宣言したとして、配列のセットにはset関数を、 表示に関する処理をpt関数で行いたいと思っています。 void set(int ??); void pt(int ???); int main(void){ int **dt; set(??); pt(???); } void set(int ??){ dt = (int**)malloc(sizeof(int*) * k); for(i = 0; i < k; i++){ dt[i] = (int*)malloc(sizeof(int*) * k); } のように配列サイズの動的確保が目的 } void pt(int ???){ 二重forループ{ printf(dt[i][j]); } } ??、???には何を入れるべきかが理解できません。 ご教示のほどよろしくお願いいたします。

  • 多次元配列のポインタ渡し

    C++を使用しています。 多次元配列を関数の引数として渡したいとき、関数側では void A::Func(int a[10][20][30])~ 呼びだし側では Finc(a); とやればいいのはわかります。 お聞きしたいのは、仮引数として呼び出された配列(上でいうa)をクラスのメンバ変数として保持したい場合の方法です。 aは先頭アドレスなのでそこを差すポインタを受ければいい、っていうことはわかりますが、 この方法ですと、受けたメンバ変数が配列みたいに[]を使ってアクセスできません。 (メンバ変数のポインタは配列じゃないから当然ですよね) これを通常の配列みたいに扱えるようにするにはどうしたらいいでしょうか。

  • 参照渡し と ポインタ渡し

    参照渡し と ポインタ渡し はどういう時に使い分けるんですか? VOID型の自作関数内でメインのブール値を書き替えたいんだけど #include <iostream.h> void ref( int &b ) { b = false; } void ptr( int *b ){ ( *b ) = true; } main(){  bool b = true;  ref( b );  cout << b;  ptr( &b );  cout << b; } だとコンパイルエラーでした。 うまくいくソースを教えてください。

  • 多次元配列とポインタ渡しについて

    多次元配列のポインタ渡しについて,自分で検索したのですがあまりにも様々で具体的な記述が無く質問させていただきました. 検索力不足もあるのでソースの提示だけでも結構ですので,ご回答お願いいたします. OS:Windows XP ソフト:VisualStudio.net2003(C++) C++プログラミング暦2ヶ月弱です. データを変換して多次元配列にデータを入れる自作の関数をつくりたいと考えています. 具体的には,a1からa2,b1からb2を10区間に分けてたデータを配列にしたいといったものです. 自分で記述した関数は以下の通りです. void Convert(float a1,float a2,float b1,float b2,unsigned short *Data){ int k; float a; float b; for(k=0;k<11;k++){ a = a1 + (a2 - a1) / 10; b = b1 + (b2 - b1) / 10; Data[k][1] = ( powf(2.0,16) * (a + 10.0) / 20; Data[k][1] = ( powf(2.0,16) * (b + 10.0) / 20; } } void main(){ float a = 10; float b = 20; unsigned short Data[11][2]; Convert(a1,a2,b1,b2,Data); ... } としています. ここでコンパイルすると, "5番目の引数をunsigned shortからunsigned short *に変換できません" となってしまいます. 配列の名前のみの部分はその配列の先頭アドレスを示すポインタであることから,自分では間違いがないと思っているのですが….

専門家に質問してみよう