2016-10-16 4 views
0

私は基本的に2倍の配列を持っています。この配列を短いintとして扱う関数(ProcessData)に渡したいと思います。短いポインタを作成してそれを配列に指し示してから、このポインタを関数ok(コード1)に渡しますか?あるタイプの配列を別のタイプに変換する

これは短い配列を作成し、各要素を反復し、double配列の各要素をshortに変換してから短い配列ポインタ(コード2)を渡すのと同じですか?様々な意見が述べたように感謝

//code 1 
//..... 
short* shortPtr = (short*)doubleArr; 
ProcessData(shortPtr); 

..

//code 2 
//... 
short shortArr [ARRSIZE]; 
int i; 
for (i = 0; i < ARRSIZE; i++) 
{ 
    shortArr[i] = (short)doubleArr[i]; 
} 
ProcessData(shortArr); 
+3

いいえ、それはいいです。それは同じことではありません。 –

+2

「ここでは2倍のシーケンスがありますが、代わりに短いintのシーケンスであるとふりをしてください。 – juanchopanza

+1

'double'が8バイト、' short'が2バイトの場合、それぞれの 'double'を4つの無関係な部分にスライスします。 –

答えて

2

んが、あなたはそれを行うことはできません。ここで、なぜ少なくとも一つの理由は次のとおり

アレイはそう

[----][----][----] 

ような指標の方法によってアクセスいくつかのメモリの割り当ての連続した配列は、角括弧内の4つのダッシュに注意されます。これは、C/C++のほとんどの状況で、intで、長さが4バイトの長さがであることを示しています。最初のセル(m)のメモリアドレスを知っていれば、各セルの大きさ(c)を知ることができます。この場合、4バイトで簡単にメモリを見つけることができますあなたは配列にアクセスしているとき、あなたは基本的にはとにかくポインタ演算を行っているので、ポインタは、C/C++での配列のように扱うことができる理由m + index * c

[----][----][----] 
^ array[0] 


[----][----][----] 
---- ----^array[2] 

を実行して、任意のインデックスの場所は基本的に、これはあります。 C/C++でのほとんどのケースで

、ショートはそうあなたがshortポインタを作成する場合と同じ方法で

[--][--][--] 

それを表し、としてそれを使用しようとするために、2バイトの長さ配列の場合は、上記のように配置されたものを指すことが期待されます。あなたは、インデックスにそれをしようとすると、問題を持っているとしている:あなたはショートパンツの配列を扱った場合

[--][--][--] 
-- --^array[2] (note moving along four bytes) 

しかし、我々以来、以下のように、配列の位置は、[2]、m + 2 * indexと同じです以下は++ptrが実際にDEFIによってsizeof (char)が1であることとptr = (char*)ptr + sizeof *ptrのようなものを(ないので、ノー

3

は、あなただけの、キャストすることはできません。しかし、あなたはイテレータを使用する場合は、多かれ少なかれ、同じ効果を得ることができます。

void do_something_with_short(short i) { 
    /* whatever */ 
} 

template <class Iter> 
void do_something(Iter first, Iter last) { 
    while (first != last) 
     do_something_with_short(*first++); 
} 

をあなたは実際には任意の算術型(、shortかに暗黙的に変換だ任意の型の配列にイテレータとそのテンプレート関数を呼び出すことができ、 )あなたは、キャストを必要とするタイプで、do_something_with_shortへの呼び出しの時点でキャストを追加した場合:

double data[10]; // needs to be initialized, of course 
do_something(std::begin(data), std::end(data)); 
0

、明らかに間違っている

[----][----][----] 
----^array[2] (again moving along four bytes) 

が起こるか、整数の配列を扱う現実にあり)。したがって、doubleポインタをインクリメントすると、通常は8バイトだけ移動し、shortポインタをインクリメントすると2バイトだけ移動します。

0

あなたの子供がピアノを勉強し、20世紀に生まれた(自分のような)先生によって与えられたsheet musicのスタックをスキャンするように頼まれたとします。それらのシートをあなたのオフィスに持ってきて、コピー機に送ります。あなたの子供がタッチスクリーンを備えたピアノで使用できるまともなデジタルスキャンを作成します。子供があなたに珍しい珍しいセットvinyl recordsを連れて来るまで、すべてうまくいく。彼女は楽譜形式でそれらのメロディーを見つけることが必死ですが、少なくともレコードをコピーするように頼んでいます。あなたのオフィスにそれらのディスクを取って、スキャナのautomatic document feederにそれらをロードして、あなたが深く...愚かな中で壊れているビニールディスクの音を聞くときにだけ気をつけて機械。写真複写機にADFが装備されていなくても、すべての原稿を手動でガラス平台に置かなければならない場合は、娘にスキャンを送信したときに賞賛を受けることはほとんどありません。

スキャナは、内部に収まる限り、あなたが置いたものを気にしません。それは最善を尽くしますが、結果は期待通りではありません。しかし、最初にビニールレコードを経験豊富なミュージシャンに持ってきて、それらを楽譜として書き留めておけば、それらのシートをスキャンするとあなたの子供が本当に喜ぶでしょう。

C++では、印刷された用紙がCDと異なる程度に異なる種類があります。 shortの配列を受け取ることを期待するC++関数は、バイト/ビットの任意のシーケンスをshortの配列として処理します。スキャナがADF上のスタックの内容を気にしないのと同じように、メモリ領域が実際には異なるタイプの値で満たされていても、まったく異なる表現をしていることは気にしません。関数が配列の各要素を内部でdoubleからshortに変換すると仮定すると、複写機にはレコードレコードとビニール録音をシート形式に自動的に転記するミュージシャンが含まれていると考えることと同じです。後者は現実の複写機のための可能な設計であり、他のいくつかのプログラミング言語はそのように機能することに注意してください。しかし、既存の実装ではない C++。理論的には


、C/C++の標準に準拠した実装ではなく、最高のパフォーマンスを支持するよりも、あなたの質問に反対の回答を支持する言語でUBのすべての条項を解釈することも可能です。しかし、それはC/C++のような言語にとってはほとんど意味をなさないでしょう。

関連する問題