- ベストアンサー
要素数・要素の値が未定の配列の宣言について(C言語)
要素数・要素の値が未定の配列の宣言について(C言語) タイトルの通りプログラムの内容上、要素の数とその数値がプログラムの途中で算出されるため 最初の宣言の段階では両方ともその数が未定です。 こういった場合、配列の宣言はどのようにすればよろしいのでしょうか? どなたか教えていただけるととても助かります。よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
わかった。 >CV_32FC1 ではなく CV_64FC1 ではなかろうか。 CV_32FC1はfloat用。
その他の回答 (4)
- php504
- ベストアンサー率42% (926/2160)
type ? The type of the matrix elements in the form CV_, where S=signed, U=unsigned, F=float. For example, CV_8UC1 means the elements are 8-bit unsigned and the there is 1 channel, and CV_32SC2 means the elements are 32-bit signed and there are 2 channels. 数字はビット数なのでそうですね 32FC1 = 32ビット浮動少数1チャンネル
お礼
素早い回答と助言をありがとうございます。 とても勉強になりました!
- bluecampus
- ベストアンサー率66% (138/209)
どうも内部的には単なるポインタをアクセスするだけのような作りっぽいので、 std::vectorは向いていない気がしてきました。 (&data[0]がずっと固定とは限らないから) ちなみに int main(void){ int rows = 3; int cols = 4; int i; double num; CvMat Ma; double* data = new double[rows*cols]; for( i = 0; i < rows*cols; ++i ) { data[i] = (double)i; } cvInitMatHeader(&Ma, rows, cols, CV_32FC1, &data[0], CV_AUTOSTEP); num=cvmGet(&Ma,0,3); printf("%f\n",num); delete[] data; return 0; } だとどうなりますか?
補足
度々ありがとうございます。 上記のプログラムを実行してみても同じ1.875という結果になってしまいました。 http://d.hatena.ne.jp/aidiary/20100227/1267277731のページの中段(掲載されているうちの4つ目)に 書いてあるプログラムの末尾を見ると同じようなことをしているように見えるのですが、 どこがいけないのかよくわかりませんでした。 もう少し調べて検討してみます。わざわざ時間を割いてもらって申し訳ありませんでした。 本当にありがとうございます。
- bluecampus
- ベストアンサー率66% (138/209)
とりあえず、 >heap = (int *)malloc(sizeof(int) * 10); で >for (i = 0;i < 12;i++) { はサイズが違うのでまずいのでは? それと >CV_32FC1 はint型用のtypeではないのでは?CV_32SC1かな? C言語といわれていますが、CvMat というクラスを使われているのでC++ですので、 STLのvectorあたりを使ってみるとか。 #include <vector> int rows = 3; int cols = 4; std::vector<int> data; for (int i = 0; i < rows * cols; ++i) { data.push_back(i); } cvInitMatHeader(&Ma, rows, cols, CV_32SC1, &data[0], CV_AUTOSTEP);
補足
お返事ありがとうございます。 サイズとタイプについては試行錯誤してたので質問に載せる際に変な感じになっちゃっていましたが、 自分で試した時はサイズ・タイプともご指摘されたように設定し実行しています。すみません。 まだプログラミングを始めたばかりなのでSTLというものが利用出来ることを知りませんでした! ありがとうございます。そこで試しに以下のプログラムを動かしてみました。 int main(void){ int rows = 3; int cols = 4; int i; double num; CvMat Ma; std::vector<double> data; for( i = 0; i < rows*cols; ++i ) { data.push_back( i ); } cvInitMatHeader(&Ma, rows, cols, CV_32FC1, &data[0], CV_AUTOSTEP); num=cvmGet(&Ma,0,3); printf("%f\n",num); return 0; } ちゃんと行列Maに値が格納されているか確認しようとcvmGetを使用してみました。 上のプログラムですと本来4.0という値が出力されると思うのですが、結果は1.875となってしまいます。 別の要素で試してみても思うような値が返ってきません。 data[i]に関しては、ちゃんと0~11の値が入っていることは確認したので、cvmGetを使用する際に 何か注意すべき点があるのでしょうか?もしくはcvInitMatHeaderがちゃんと機能していないのでしょうか? またまた質問でお返しする形になって申し訳ないです。
- php504
- ベストアンサー率42% (926/2160)
コンパイラによっては配列作れますよ お使いのコンパイラは何でしょう? 一般的にはmallocで領域確保して配列のようにして使うですかね int* array = (int*)malloc(num * sizeof(int)); array[num - 1] = 100; . . . . free(array);
補足
早速の回答ありがとうございます。 現在Visual C++ 2008を使用しております。 php504さんの提案されている動的確保も検討してみたんですが、 今私がやろうとしている事が1次元配列をOpenCVの関数を用いて行列とする。ということでして、 これを実行するとなるとうまくいかなくて質問した次第です。説明不足ですみませんでした。 例として、以下のプログラムを記載します。 int *heap; CvMat Ma; heap = (int *)malloc(sizeof(int) * 10); if (heap == NULL) exit(0); for (i = 0;i < 12;i++) { heap[i] = i; } cvInitMatHeader( &Ma, 3, 4,CV_32FC1, heap ,CV_AUTOSTEP); これはあくまで例なのですが、この場合Maの要素を出力してみるとすべての要素が0となってしまいます。 heap[i]に当たる部分を以下のようにした場合はちゃんと行列に要素の値が格納されていたのでどうしたものかと困っていました。 int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; これには何か解決法があるのでしょうか?質問ばかりですみません。
お礼
うまくいきました! お手数かけて申し訳ありませんでした。 2日間ほど悩んでいたことがbluecampusさんのお陰でやっとスッキリしました。 本当にどうもありがとうございました!