アプリ版:「スタンプのみでお礼する」機能のリリースについて

要素数・要素の値が未定の配列の宣言について(C言語)

タイトルの通りプログラムの内容上、要素の数とその数値がプログラムの途中で算出されるため
最初の宣言の段階では両方ともその数が未定です。

こういった場合、配列の宣言はどのようにすればよろしいのでしょうか?
どなたか教えていただけるととても助かります。よろしくお願いします。

A 回答 (5件)

わかった。


>CV_32FC1
ではなく
CV_64FC1
ではなかろうか。

CV_32FC1はfloat用。
    • good
    • 0
この回答へのお礼

うまくいきました!
お手数かけて申し訳ありませんでした。
2日間ほど悩んでいたことがbluecampusさんのお陰でやっとスッキリしました。
本当にどうもありがとうございました!

お礼日時:2010/07/30 14:31

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チャンネル
    • good
    • 0
この回答へのお礼

素早い回答と助言をありがとうございます。
とても勉強になりました!

お礼日時:2010/07/30 14:34

どうも内部的には単なるポインタをアクセスするだけのような作りっぽいので、


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つ目)に
書いてあるプログラムの末尾を見ると同じようなことをしているように見えるのですが、
どこがいけないのかよくわかりませんでした。

もう少し調べて検討してみます。わざわざ時間を割いてもらって申し訳ありませんでした。
本当にありがとうございます。

補足日時:2010/07/30 11:59
    • good
    • 0

とりあえず、


>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がちゃんと機能していないのでしょうか?

またまた質問でお返しする形になって申し訳ないです。

補足日時:2010/07/30 10:13
    • good
    • 0

コンパイラによっては配列作れますよ


お使いのコンパイラは何でしょう?
一般的には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 };

これには何か解決法があるのでしょうか?質問ばかりですみません。

補足日時:2010/07/30 08:08
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!