質問者
関数生成に関する質問

質問
-
初めまして。
現在、以下のような配列を作るプログラムを作ろうとしているのですが、いくつかわからない点がありますので質問します
1.配列TTw[x1][x2][x3]のサイズを決定する(a,b,cの値を決める)
2.配列生成用の関数TTwmakingを呼び出し、上記の[x1][x2][x3]のサイズの配列を作り、その配列の値を決める(TTw[x1][x2][x3]=x1*x2*x3)
3.生成した配列とその値を表示する(main文で)
注:main文に結果を表示させる内容を書くことににこだわるのは、最終的には設定した値を使ってmain文で計算するため。
TTwmakingの中身は以下の通りです(不完全です)
double TTwmaking()
{
double **TTw[L];
for(int i1=0; i1<L; ++i1)
{
TTw[i1]=new double *[M];
for(int j1=0; j1<M; ++j1)
{
TTw[i1][j1]=new double[ N ];
for(int k1=0; k1<N; ++k1)
{
T[i1][j1][k1]=i1*j1*k1;
}
}
}
}メイン関数の中身は以下の通りです(疑問点があるために不完全です)
#include "stdafx.h"
#include <stdio.h>int main()
{
int x1,x2,x3;x1=1;
x2=2;
x3=3;
system("PAUSE");
return 0;
}疑問点は以下の通りです
1.メイン関数のx1,x2,x3をTTwmakingのL,M,Nにしたいがその設定方法がわからない
2.配列生成を行う関数を組んだことがないので、メイン文でどのように設定すべきか解らない(その関数をmain文の中でどのように書いたらいいのか解らない&表示させるためにはTTwを宣言する必要があるが、どのように書いたらいいのかわからない)
3.配列そのものとそれに設定した値(TTwmakingの"TTw[i1][j1][k1]=i1*j1*k1"の左辺と右辺両方)を返したいが、どのように取り扱えばいいかわからない(例えばprintf(TTw[%d][%d][%d]=%lf",0,0,0,TTw[0][0][0];と書いたらちゃんとTTw[0][0][0]の値が表示されるようにしたい)
開発はVisual stadio2003 /Win32コンソールプロジェクトです
後、関係ないですが絵文字を出さないようにする方法わかりますでしょうか?鉤括弧内に英字を入れると変な文字に化けるんですけど
すべての返信
-
諸農です。
OROCHI-TUNGUS さんからの引用 1.メイン関数のx,y,zをTTwmakingのL,M,Nにしたいがその設定方法がわからない
質問の内容が良く判らなかったのですが、
単純に引数にすると拙いと言うことでしょうか。OROCHI-TUNGUS さんからの引用 後、関係ないですが絵文字を出さないようにする方法わかりますでしょうか?鉤括弧内に英字を入れると変な文字に化けるんですけど
こちらの投稿が参考になると思います。
特殊タグの一覧について
http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=227143&SiteID=7Not able to see the C# or VB.NET code snippet link in Editor
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=180523&SiteID=1 -
とりあえず、色々調べて以下のようなコードを組んでみました
#include "stdafx.h"
#include <stdio.h>double TTwmaking(int x1,int x2,int x3);
int main()
{
int a,b,c;
a=1;
b=2;
c=3;
TTwmaking(a,b,c);
printf("%d",TTwmaking);
system("PAUSE");
return 0;
}double TTwmaking(int x1,int x2,int x3)
{
const int L=x1;
int M=x2;
int N=x3;double ** TTw[ L ];
for(int i=0; i<L; ++i)
{
TTw[ i ]=new double *[ M ];
for(int j=0; j<M; ++j)
{
TTw[ i ][ j ]=new double[ N ];
for(int k=0; k<N; ++k)
{
TTw[ i ][ j ][ k ]=i*j*k;
}
}
}
}ところがこの方法では
c:\Documents and Settings\orochi\My Documents\Visual Studio Projects\vftest19\vftest19.cpp(16) : warning C4313: 'printf' : 書式文字列内の '%d' が '<不明>' 型の引数 1893216308 と競合しています。
c:\Documents and Settings\orochi\My Documents\Visual Studio Projects\vftest19\vftest19.cpp(28) : error C2057: 定数式が必要です。
c:\Documents and Settings\orochi\My Documents\Visual Studio Projects\vftest19\vftest19.cpp(28) : error C2466: サイズが 0 の配列を割当てまたは宣言しようとしました。
c:\Documents and Settings\orochi\My Documents\Visual Studio Projects\vftest19\vftest19.cpp(28) : error C2133: 'TTw' : サイズが不明です。というエラーが出ます。下の3つ(C2057,C2466,C2133)はmain文で決定した値が関数TTwmakingへ行っていないと考えられるのですが、原因がわかる方お願いします
また、一番上のエラーは皆目見当がつきません。こちらもわかる方お願いします
-
OROCHI-TUNGUS さんからの引用 TTwmaking(a,b,c);
printf("%d",TTwmaking);ではなく
printf("%d",TTwmaking(a,b,c));
または
double result;
// 省略
result = TTwmaking(a,b,c);
printf( "%d", result );なのでは?(ムチャクチャC言語の基本ですよ)
しかも、double型の場合 %d ではなく、 %lf とすべきですけど。
OROCHI-TUNGUS さんからの引用 double ** TTw[ L ]; ここもnewして領域確保してください。char s[ L ]; としてダメなのと同じです。
というか、この関数戻り値ないですよね?(return ~;がない)
-
ようわからんが、
double TTwmaking(int x1,int x2,int x3)
を
double** TTwmaking(int x1,int x2,int x3)
にして、戻り値として TTw を返してから、mainのほうで同じようにアクセスすればいいのでは?
double** result = TTwmaking(a,b,c);
for ( int i = 0; i < a; i++ )
{
for ( int j = 0; j < b; j++ )
{
for ( int k = 0; k < c; k++ )
{
printf( "%lf ", result[ i ][ j ][ k ] );
}
}
}
一気に出力する方法はありませんので。
-
返信ありがとうございます。
出力方法はなるほどそうしてよかったのですね
ですが、関数側で領域確保のためにnewを打つとC2146(セミコロンなし)がでます(予めグローバル変数としてTTwを定義しても同じ)。
内容は以下の通りなのですが、これの原因は何なんでしょうか…?
また、関数TTwmakingから何らかの値を返そうとした場合はどのように記述したらよいでしょうか?(return (返す値)の部分が不明。適当な値を定義してそれを返そうとしてもエラーが出ます)
1次元ポインタの場合はreturn &(返す値)ですむのですが&&(返す値)ではないようですし
#include "stdafx.h"
#include <stdio.h>double** TTwmaking(int x1,int x2,int x3);
double **TTw[];int main()
{
int a,b,c;
a=1;
b=2;
c=3;
double** TTw=TTwmaking(a,b,c);
for(int i=0; i<a; i++)
{
for(int j=0; j<b; j++)
{
for(int k=0; k<c; k++)
{
printf("TTw[%d][%d][%d]:%lf",i,j,k,TTw);
}
}
}
system("PAUSE");
return 0;
}double** TTwmaking(int x1,int x2,int x3)
{
const int L=x1;
int M=x2;
int N=x3;
new double **TTw[ L ];
for(int i=0; i<L; ++i)
{
TTw[ i ]=new double *[ M ];
for(int j=0; j<M; ++j)
{
TTw[ i ][ j ]=new double[ N ];
for(int k=0; k<N; ++k)
{
TTw[ i ][ j ][ k ]=i*j*k;
}
}
}}
-
3次元の doubleを返したいのであれば 関数宣言をdouble*** としたほうがいいでしょう
ローカル変数/グローバル変数/引数などを同一のものにすると(自分が)混同してしまう場合があります
慣れるまでは 別名で定義してみましょうたとえば グローバルにはgなどを頭につけるなどの工夫をしてみましょう
double *** gTTw = NULL; double *** TTwmaking(int x1,int x2,int x3)
{
int i, j, k;
// これを返り値にする
double*** retTTw = NULL;
retTTw = new double **[x1];
for(i = 0; i < x1; i++ ) {
retTTw[ i] = new double * [x2];
for(j=0; j < x2; j++ ) {
retTTw[ i][j] = new double [x3];
for(k=0; k < x3; k++ ) {
retTTw[ i][j][k] = i + j + k;
}
}
}
return retTTw;
}
// グローバル変数を使うなら
void Twmaking2(int x1,int x2,int x3)
{
int i, j, k;
gTTw = new double **[x1];
for(i = 0; i < x1; i++ ) {
gTTw[ i] = new double * [x2];
for(j=0; j < x2; j++ ) {
gTTw[ i][j] = new double [x3];
for(k=0; k < x3; k++ ) {
gTTw[ i][j][k] = i + j + k;
}
}
}
}
といった具合でしょう
コードなどを投稿する場合は bbcode 囲んだほうがよさそうですよ
下記のページなどを参照してみてください
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=227143&SiteID=7