2017-12-14 16 views
0

私はいくつかの機能的なUnix C++をWindows環境に適応しようとしています。元のコードでC++ float配列のサイズ

が、そこにある:

float *drowPtrs[_imageRows]; 

窓にこれを移動するには、私はそれを調整しています

float *drowPtrs = new float[_imageRows]; 

しかし、後の機能では、この行があります:

float &otherDistance = drowPtrs[y][x]; 

明らかに私はdrowPtrsを1次元配列として初期化しました。エラーです。

EDIT:これは、実際には、C++の構文に関する質問であり、UnixからWindowsへの問題ではありません。以下の答えがうまくいきます。

+3

C++は同じ言語であり、オペレーティングシステムによっても異なります(Windowsには何十年もPOSIXサブシステムがありました)。では、なぜこのコードを変更する必要があると思いますか?私はちょっと混乱している。なぜならこれは本当にUnixやWindowsとは関係がないからだ。明確にするためにあなたの質問を編集してください! –

+0

しかし、違いはありますか? Unix上で正常にコンパイルされたコードは、Windows(visual studio 2015)上で、例えば上記の最初の行にエラーを与えます。お返事をありがとうございます! – anti

+0

コンパイラに違いがあるかもしれませんが、それはオペレーティングシステムの問題ではありません。あなたはコンパイラの変更について言及していないので、私はあなたが同じコンパイラを使用していたと仮定していましたが、Unixのターゲットの代わりにウィンドウを使用していました。だから、時には私がvisualC++を嫌うこともあるが、2015年版ではかなりOKだ。以前に使っていたC++は何ですか? –

答えて

1

この行:_imageRowsはコンパイル時定数ではない場合

float *drowPtrs[_imageRows]; 

は...、標準C++で許可されていません。これはGCC Variable-Length Arrays extensionのためにコンパイルされる可能性があります。

これは、サイズ_imageRowsfloatへのポインタの配列を「宣言する」。

最善の解決策は、ベクトルに切り替えるには、次のようになります。

std::vector<float*> drowPtrs(_imageRows); 

それとも、より良いあなたがフロートの2D配列たい場合:

std::vector<std::vector<float>> drowPtrs(_imageRows); 

を代替ソリューションは、動的にこの配列を割り当てています:

float **drowPtrs = new float*[_imageRows]; 

...しかし、あなたは手動でメモリを管理することを避けるためにunique_ptrにこれを置く必要があります。

std::unique_ptr<float*[]> drowPtrs(new float*[_imageRows]); 

...またはあなたが本当にできない場合に、あなたはあなたがしている時に手動で削除する必要があります完了:

delete[] drowPtrs; 
関連する問題