ベストアンサー ※ ChatGPTを利用し、要約された質問です(原文:2次元配列のnew) C++で4x4行列のデータを読み込んでvector配列に保存する方法について 2011/06/12 18:33 このQ&Aのポイント C++で4x4行列のデータを読み込んでvector配列に保存する方法についてアドバイスを求めています。現在、float[4][4]の先頭ポインタの配列であるvector配列を使用していますが、エラーが発生しています。多次元配列のnew方法についてより良い解決策を求めています。 2次元配列のnew 4x4行列のデータがいくらか書いてあるファイルから、読み込んでvector配列へ保存するプログラムを考えています。 vector配列は、float[4][4]の先頭ポインタの配列です。 宣言はこんな感じで、コンパイルエラーは出ませんでした。 vector<float[4][4]> matrix; つぎに読み込み部分で、下のような感じです。 4x4行列が見つかるたびにこれが実行されます。 GetFloatToken()は、ファイルから要素をひとつ取り出す関数です。 float m[4][4] = new float[4][4]; for(int g=0; g<4; g++) for(int r=0; r<4; r++) m[g][r]=GetFloatToken(); matrix.push_back(m); newの行とpush_backしてる行でエラーが出ました。 自分が思うに、m[4][4]のとこの、newからの受け取りの仕方が悪い気がしました。 そこで、*m[4] や **m とかにして試してみましたがうまくいきませんでした。 どうすればいいんでしょうか。 もしかして、c++では多次元配列のnewは無理なんでしょうか。 わかる方がいましたら、どうか教えてください。 補足: あとで行列の計算をするのが楽なので、float[4][4]の形は変えたくないです。 もし、多次元配列のnewが無理ということなら別の策を考えます。 質問の原文を閉じる 質問の原文を表示する みんなの回答 (5) 専門家の回答 質問者が選んだベストアンサー ベストアンサー jacta ベストアンサー率26% (845/3158) 2011/06/12 20:41 回答No.2 > 配列型は代入可能ではないんですか。 たとえば、 float m1[4][4], m2[4][4]; とあった場合、 m1 = m2; とはできませんよね。 ちなみに、newで生成する場合は次のようにします。 float (*m)[4] = new float[4][4]; 質問者 お礼 2011/06/12 21:54 詳しい説明ありがとうございます。 勉強になりました。 要素が float m[4][4]; だけの構造体をつくるとこで、一応問題は解決しました。 ありがとうございました。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 その他の回答 (4) samtomsan ベストアンサー率55% (1060/1897) 2011/06/12 23:42 回答No.5 「C++ 二次元vertor」で検索してみましたら、下記の例が見つかりました。 いろいろな方法があるようですね。 http://okwave.jp/qa/q1748241.html 質問者 お礼 2011/06/15 17:50 回答ありがとうございます。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 hitomura ベストアンサー率48% (325/664) 2011/06/12 22:21 回答No.4 #3ですが、自分の書いたコードについて付記を。 個人的な事情により駆け足で書いたコードのため、投稿後気付いただけでも「行列の各要素にアクセスするメソッドが抜けている」「乗算に桁落ちに対する考慮が全くなされていない」「代入でないほうの乗算は少々非効率的」という問題がありますのでご注意ください。 質問者 お礼 2011/06/12 23:13 回答ありがとうございます。 長いコードを書いて下さりありがとうございます。 自分は、 struct MATRIX4x4{ float m[4][4]; }; vector<MATRIX4x4*> matrix; MATRIX4x4 *m = new MATRIX4x4; for(int g=0; g<4; g++) for(int r=0; r<4; r++) m->m[g][r]=GetFloatToken(); key->matrix.push_back(m); とすることで解決しました。 あとで計算するときには、 matrix[0]->m[][] みたいにしてやるだけなので、float[4][4]の形で使えます。 せっかく書いてくださったのですが、今回は書きなおしが楽なのでこちらを使うことにします。 >「行列の各要素にアクセスするメソッドが抜けている」 privateからpublicにimplを移して解決、でいいような気がします。 現在行列の計算はすべて関数で実装しているので、operatorは全然つかってないんです。 それなので、かなり書きなおさないと使えないんです。 operatorをつかったらもっと見やすいコードになると思いますが、今はやる気がびみょーなので またやる気があったら書き直すか検討してみたいと思います。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 hitomura ベストアンサー率48% (325/664) 2011/06/12 21:42 回答No.3 > あとで行列の計算をするのが楽なので、float[4][4]の形は変えたくないです というのなら、そういうクラスを作ってしまいましょう。 (ぐぐったら主にUNIX/Linux用のよさそうなライブラリがあったのは置いといて。GPLだから利用して問題がないか考慮する必要もあります) class Matrix4 { private: float impl[4][4]; public: Matrix4(); Matrix4(const Matrix4& src); Matrix4(float src[4][4]); Matrix4& operator=(const Matrix4& src); Matrix4& operator+=(const Matrix4& src); Matrix4& operator-=(const Matrix4& src); Matrix4& operator*=(const Matrix4& src); }; Matrix4& operator+(const Matrix4& lhs, const Matrix4& rhs); Matrix4& operator-(const Matrix4& lhs, const Matrix4& rhs); Matrix4& operator*(const Matrix4& lhs, const Matrix4& rhs); Matrix4::Matrix4() { for(int i = 0; i < 4; i++){ for(int j = 0; j < 4; j++){ impl[i][j] = 0.0F; } } } Matrix4::Matrix4(const Matrix4& src) { memcpy(impl, src.impl, sizeof(impl)); } Matrix4::Matrix4(float src[4][4]) { memcpy(impl, src, sizeof(impl)); } Matrix4& Matrix4::operator=(const Matrix4& src) { if (impl != src.impl) memcpy(impl, src.impl, sizeof(impl)); return *this; } Matrix4& Matrix4::operator+=(const Matrix4& src) { for(int i = 0; i < 4; i++){ for(int j = 0; j < 4; j++){ impl[i][j] += src.impl[i][j]; } } return *this; } Matrix4& Matrix4::operator-=(const Matrix4& src) { for(int i = 0; i < 4; i++){ for(int j = 0; j < 4; j++){ impl[i][j] -= src.impl[i][j]; } } return *this; } Matrix4& Matrix4::operator*=(const Matrix4& src) { float result[4][4]; for(int i = 0; i < 4; i++){ for(int j = 0; j < 4; j++){ result[i][j] = 0.0F; for(int k = 0; k < 4; k++){ result[i][j] += impl[i][k] * src.impl[k][j]; } } } memcpy(impl, result, sizeof(impl)); return *this; } Matrix4 operator+(const Matrix4& lhs, const Matrix4& rhs) { Matrix4 result(lhs); result += rhs; return result; } Matrix4& operator-(const Matrix4& lhs, const Matrix4& rhs) { Matrix4 result(lhs); result -= rhs; return result; } Matrix4& operator*(const Matrix4& lhs, const Matrix4& rhs) { Matrix4 result(lhs); result *= rhs; return result; } こんな感じだと思います。 まあ、だれかもっと効率的な実装を書くでしょうが。 参考URL: http://www.gnu.org/software/octave/ 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 jacta ベストアンサー率26% (845/3158) 2011/06/12 19:28 回答No.1 vectorの要素は代入可能でなければなりません。 配列型は代入可能ではありませんので、まともにコンパイルできないか、あるいはまともに動きません。 質問者 お礼 2011/06/12 20:12 回答ありがとうございます。 配列型は代入可能ではないんですか。知らなかったです。 関数の引数としては受け取れたので出来るかと思っていました; 代入可能ではないということは、newから受け取るのも難しいってことですよね。 それじゃあ今回は諦めて、別の方法を考えたいと思います。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発C・C++・C# 関連するQ&A n × n の二次元配列の各要素に vector を突っ込みたいと思っ n × n の二次元配列の各要素に vector を突っ込みたいと思っています。 ちょうど三次元グラフで n × n の地表に可変な高さの草が生えてるようなのを想像していただければやりたいことが分かっていただけるかと。 で、このようにしてまずは確保しました。 int i, n = 2; vector<int> ***vecMatrix; vecMatrix = new vector<int>**[ n ]; for (i = 0 ; i < n ; i++) vecMatrix[ i ] = new vector<int>*[ n ]; ここまでは問題ないのですが、次に vecMatrix[ i ][ j ] に対して要素を格納しようとして、 vecMatrix[ 0 ][ 0 ]->push_back( 1 ); とすると segmentation fault で落ちます。 ううーん、なぜでしょう。 二次元配列が、勝手に一次元配列になってしまう Excelのマクロで、二次元配列を格納したバリアント型を戻り値とする関数を作ったのですが、… 二次元型配列のひとつの要素数が1の時、受け取ったバリアント型変数は、一次元配列になっています。 列ベクトルなら、それもありかな~と思うのですが、なんで、行ベクトルまで、一次元配列にするんだよ~って、困っています。 シートから関数を呼んだ場合は、列ベクトルは列ベクトル、行ベクトルは行ベクトルとして、表示されるので、マクロの中で関数を呼び出した場合も、行列の情報を保持できる方法があるんじゃないかと思ったのですが。 どなたか、ご教示頂けるとありがたいです。 よろしくお願いします。 三次元配列の動的メモリの確保? const int SLICE=2; const int SIZE=256; signed short int *matrix=new signed short int[SLICE][SIZE][SIZE]; for(int i=0; i<SLICE; i++){ for(int j=0; j<SIZE; j++){ for(int k=0; k<SIZE; k++){ fin.read((char*) &matrix[SLICE][SIZE][SIZE],sizeof(signed short int)); } } } delete[] data; 三次元データを読み込むために、三次元配列を使って読み込もうとしたのですが、上手く読み込めません。 三行目の所で、error C2440: '初期化中' : 'short (*)[256][256]' から 'short *' に変換できません。 七行目の所で、error C2109: 配列または、ポインタでない変数に添字が使われました。 というエラーがでます。動的メモリの確保の仕方がまずいのでしょうか? どなたか教えて頂けますでしょうか?よろしくお願いします。 ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム 多次元配列について int[]a = {1,2,3} int[]a = new int[3];//は普通の配列 int[]a = {{1,2,3},{4,5,6}}; int[][]a = new int[3][3]は //2次元配列 int[]a = {{1,2,3}{4,5,6}{7,8,9}};int[][][] = new int[3][3][3]; //は3次元配列 int[][][][]a = new int[3][3][3][3]; //は4次元配列になると思いますがこっちの方はコンパイルエラーが出ないのに int[][][][]a = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; //はコンパイルエラーが出ます どうしてですか? C# 多次元配列 C#で書かれたコードをVB.NETに書き換えようとしています。簡単なのでしょうが、C#をよく理解していないので書き換え方が分かりません。 多次元配列の部分で、 float[][] Ar = new float[5][]; と宣言しているのに次のループで、 Ar[d] = new float[5]; とあります。 コード: float[][] Ar = new float[5][]; for (int d = 0; d < 5; d++) { Ar[d] = new float[5]; } float s = 100; ...... ...... Ar[i][j] = s; この部分をVB.NET に書き換えるならどう書いたららいいのでしょうか?よろしくお願いします。 引数になっている二次元配列の大きさを知る 行列の掛け算をする関数で Matrix(int a[2][2], int b[2][2], int result[2][2]) のようにすると[3][3]用、[4][4]用、・・・と似たようなプログラムをいっぱい作る羽目になる。 Matrix(int *a, int *b, int *result) のようにすると*aから配列の大きさがわかれば その大きさ/4の平方根をとってnとでればn×n行列とわかって解決と考えましたが、*aから配列の大きさをわかるにはどうしたらいいですか? 二次配列 3×2 行列の要素(float)をキーボードから入力し,画面表示するプログラムを作成したいのですが 配列名をmatrixとして #include <stdio.h> int main(void){ int i, j; float matrix[3][2]; for ( i = 0; i < 3; i++ ){ printf("列入力:"); scanf("%f",matrix[i]); } for ( j = 0; j < 2; j++ ){ printf("行入力:"); scanf("%f",matrix[i]); } for( i = 0; i < 3; i++ ){ for(j = 0; j < 2; j++ ){ printf("matrix[%d][%d] = %f\n",i+1,j+1,matrix[j][i]); } } getchar(); getchar(); return(0); } としたのですが・・・・・・一部が正しく表示されません。 さらにビジュアルスタジオ.net2003でコンパイルすると。実行結果の最後にエンターキーを押すとエラーが発生してしまうのですが・・・・。 どのようにすればいいのでしょうか? 多次元配列とfor文について javascriptの配列について質問です。 例えば: var arrXXX = new Array(); function samplefunc{ //3次元配列の種類の作成 for (m = 0; m < aaa.length ; m++) { //連想配列作成 arrXXX .push(aaa[m]); } for (j = 0; j < bbb.length; j++) { for (i = 0; i < ccc.length; i++) { arrXXX[aaa[j]] = new Array(ccc.length); arrXXX[aaa[j]][i] = new Array(ccc.length); for (k = 0; k < ddd.length; k++) { arrXXX[aaa[j]][i][k] = eee; ここでは配列を適切に使える・・・ } } } ここでarrXXXを使いたいが、3次元配列でなくなっている?! arrXXX[~][0][0]はnullまたはオブジェクトではありません・・・がでます。 } 結局、for文を完全にでてしまうと、せっかくつくった配列がダメになってしまいます。どうすればfor文外で配列を使用できるのか教えてください! 3次元配列の動的確保 2次元配列は、 // 動的確保 int **mat = new int*[row]; for(i = 0; i < row; i++) mat[i] = new int[col]; //解放 for(i = 0; i < row; i++) delete [] mat[i]; delete [] mat; で、生成と開放はできたのですが、3次元となると、途端にわからなくなります。 かれこれ1時間半は試行錯誤はしているのですが、たどり着きそうにありません。 どなたかご教授願います。 動的配列を宣言するためにnew演算子とdelete演算子を用いる方法が 動的配列を宣言するためにnew演算子とdelete演算子を用いる方法があります。 2次元配列は以下のように宣言して作れるのは分かったのですが、 (実際に使って動かしてみました。) int **pp; pp = new int*[ROW]; // 行を作る for(int i = 0; i < ROW; i++) // 列を作る pp[i] = new int[COL]; http://www.asahi-net.or.jp/~uc3k-ymd/Lesson/Section02/section02_07.html(引用) 3次元配列をどのように作ったらいいか分かりません。 教えてください。宜しくお願いします。 C++ vectorに配列をプッシュしたい C++のstd::vectorが格納する要素として配列を指定することはできますか vectorを使って2次元配列を表現したいときは,たとえば std::vecor<std::vector<int>> v; とすれば2次元配列が表現できますよね. 2次元配列の列方向の要素数が2で固定されていて,行方向の要素数が不確定のデータを扱いたいので,2次元配列を格納するvectorで扱えればなと思いました. (2個で1組のデータがたくさんあるということなので,vectorの2次元配列ではありません) std::vector<int[2]> v; int a[2]; a[1] = 1; a[0] = 2; v.push_back(a); という書き方ではコンパイルできなかったのですが,vectorに配列要素を格納させることはできないのでしょうか. あるいは,もし可能ならどのように書けばよいのでしょうか. 結局は1組のデータセットを構造体化してそれをvectorにプッシュするやり方に落ち着いたのですが,疑問に思ったままモヤモヤしているので質問させて頂きます. 「vector 配列」などのキーワードで検索してみましたが,vectorの動的配列としての紹介記事が多くヒットしてしまい,自分ではうまく情報を発見することはできませんでした. よろしくお願いします. 多次元配列の動的メモリ 1次の配列aの動的メモリは例えば 「double *a; int num = 3; //配列の数 a = new double [3];」 などとすれば確保できることは分かるのですが、 二次元配列など、多次元配列の動的メモリは どのようにすれば確保できるのですか? AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム ポインタと二次元配列 二次元配列a[ ][ ]の第1行の要素以後を0にするプログラムで動きます。 疑問なんですが、4行目のa[ ][4]は、なぜ[ ]のように空欄になっているんでしょうか。 また、8行目のpa=a[1];は、なぜpa=a[0];ではだめなんでしょうか。第1行は先頭行で0行目を意味しているのではないでしょうか。 #include <stdio.h> void main(void) /*ポインタと二次元配列*/ { static int a[ ][4]={{1,2,3,0}, {4,5,6,0}, {7,8,9,-999}}; int j,k,*pa; pa=a[1]; while(*pa!=-999){ *pa=0; pa++; } for(j=0;j<3;j++){ for(k=0;k<4;k++) printf("%5d",a[j][k]); printf("\n"); } } 多次元配列の行列 1番 キーボードから3×3の行列の要素を2次元配列に入力した後、その値を表示するプログラムをさくせいせよ 2番 キーボードから3×4の行列の要素を2次元配列に入力した後、転置行列を出力するプログラムをさくせいせよ 3番 2つの行列A(3×3行列)、B(3×3行列)の買う要素の値をキーボードから2つの配列に入力し、2つの行列、並びに、それらの和、差、積の行列を出力するプログラムを作成せよ(Bに単位行列を入れて検算せよ) 4番 2行3列の行列と3行2列の積を求めるプログラムを作成せよ どなたかわからないでしょうか?? 数が多くてすみません。 わかる方お願いします!! 多次元配列の new 多次元配列を new すると、どのような型のサイズの領域の配列が確保されるんでしょうか?たとえば、 int (*a)[2] = new int[3][2]; とすると、 1. 長さ2のintの配列へのポインタ型の長さ3の配列の領域が確保される のか、 2. int[3][2] すなわち、int が 6 つ分の領域が確保される のか。 今まで、「そりゃあ 2 の方だろう」と信じ込んであまり考えずにいたんですが、「コードの型形式からすると 1 の方の解釈でもいいよなぁ」と、ふと思ったものですから、質問させていただきました。 わたしの環境で調べてみると(配列用のハウスキーピング的な余分の領域とか、パディングなどは無視して)、確かに 1 の方なんですか、これで標準準拠なんでしょうかね?^^; XP Home Edition Ver.2002 SP2 cygwin v.1.0.2-1 GNU g++ v.4.1.1 ===== #include <iostream> #include <new> #include <cstdlib> struct A { char a; void *operator new(std::size_t s) { void *p = std::malloc(s); std::cout << "A::new(): " << p << '\t' << s << '\n'; return p; } void operator delete(void *p, std::size_t s) { std::cout << "A::delete(): " << p << '\t' << s << '\n'; if (p) std::free(p); } void *operator new[](std::size_t s) { void *p = std::malloc(s); std::cout << "A::new[](): " << p << '\t' << s << '\n'; return p; } void operator delete[](void *p, std::size_t s) { std::cout << "A::delete[](): " << p << '\t' << s << '\n'; if (p) std::free(p); } }; int main() { std::cout << sizeof(char) << '\t' << sizeof(A) << '\t' << sizeof(A(*)[8]) << '\n'; A *a = new A; std::cout << a << '\n'; A *aa = new A[8]; std::cout << aa << '\n'; A (*aaa)[8] = new A[8][8]; std::cout << aaa << '\n'; A (*aaaa)[8][8] = new A[8][8][8]; std::cout << aaaa << '\n'; delete[] aaaa; delete[] aaa; delete[] aa; delete a; } ===== % ./a.exe 1 1 4 A::new(): 0x870668 1 0x870668 A::new[](): 0x870678 12 0x87067c A::new[](): 0x870688 68 0x87068c A::new[](): 0x8706d0 516 0x8706d4 A::delete[](): 0x8706d0 516 A::delete[](): 0x870688 68 A::delete[](): 0x870678 12 A::delete(): 0x870668 1 多次元配列への数値の代入。 こんにちは。 今、多次元配列への数値の代入の仕方で、悩んでいます。 A[][] = new int[n][n]; B[][] = new int[n][n]; 上記のようなn行n列の配列を宣言し、nを入力します。 例えば、n=100と入力すると、100行100列の配列を定義したことになり、Aの配列には1~10000、Bの配列には10001~20000の数値を代入、200×200であれば1~40000、40001~80000…という感じにしたいのですが、いいアイディアが浮かびません。 また、1~nの間でランダムに数値を選び、その数値を代入というのも考えましたが、Javaで乱数を代入できるのかな?という疑問が出来てしまい、わからなくなってしまいました。 何かいい考えがありましたら、ぜひ教えてください。 よろしくお願いします。 二次元配列で"一列"取り出すには? すいませんC# を勉強中なのですが、 たとえば int[,] a = new int[2,2] { {1,2}, {3,4} } という2x2の二次元配列があったとき 縦の列、つまり1と3だけ抜き取って配列に格納したい、または2と4だけを抜き取って配列に格納するにはどうすればいいでしょうか? 実際には配列に抜き取った後に hairetsu.Max(); でその列の最大値を出したいと考えています。 たくさん量があるとき、どうすれば簡単に列の配列を抜きとれるのでしょうか、ご存じの方よろしくお願いします… 行列の表示 任意の数nを入力してn×nの正方行列を表示させるプログラムを二次元配列を使って作りたいのですが出来ません。配列の初期化は int matrix[][] = new int[n][n] のように行えばよいと思うのですが、最終的にどう表示させればよいのでしょうか? System.out.println(matrix[][]) を使うと改行されてしまいますし... アドバイスよろしくお願いします。 CSVファイルを二次元配列に格納するプログラム 前回のソースコードを改変してみました String Str = ""; int Count = 0; try { File inFile = new File("./res/test.csv"); FileReader fr = new FileReader(inFile); BufferedReader br = new BufferedReader(fr); while (br.ready()) { Str = br.readLine(); String[] temp = Str.split(","); int[] m = new int[temp.length]; for (int i = 0; i < temp.length; i++) { m[i] = Integer.parseInt(temp[i]); System.out.print(m[i] + ","); } System.out.println(); Count++; } br.close(); fr.close(); } catch (Exception e) { System.out.println("ファイル読み込みに関するエラー"); } 今一次元配列になっているのですが、これを二次元配列に代入したいのです Countで何回ループしたかによって二次元配列の縦の要素数としたかったのですが、 そうすると横の要素数になるループ中の一次元配列が使えないので困っています 二次元配列に関する質問です。 一次元配列はわかるのですが二次元配列になると、わからない時があります。 <ソース> #include<stdio.h> int main() { int dat[2][5]={1,2,3,4,5,6,7,8,9,10}; int i; int j; for(i=0;i<2;i++){ for(j=0;j<5;j++){ printf("dat[%d][%d] %d\n",i,j,dat[i][j]); } } return 0; } このプログラムでわからないのは、 int dat[2][5]={1,2,3,4,5,6,7,8,9,10};の部分です。 普段は、int dat[2][5]={{1,2,3,4,5}, {6,7,8,9,10}, }; という使い方をしているのですが・・・。 どうちがうのでしょうか? 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター プログラミング・開発 Microsoft ASPC・C++・C#CGIJavaJavaScriptPerlPHPVisual BasicHTMLXMLCSSFlashAJAXRubySwiftPythonパフォーマンス・チューニングオープンソース開発SEOスマートフォンアプリ開発その他(プログラミング・開発) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
詳しい説明ありがとうございます。 勉強になりました。 要素が float m[4][4]; だけの構造体をつくるとこで、一応問題は解決しました。 ありがとうございました。