0

皆さん私の質問は非常に単純ですが、その背後にある理論について混乱しています。誰かが明確にできるといいですね。

特定のタイプの変数の動的配列を渡し、そのタイプの変数を別のタイプに変換する関数を使用して、新しい変数の変数配列の形式で返す前に、さらに作業を行いたいと思います。

これが私が何をしていたかを示すためのあまり機能的ではないコードです

#include <stdio.h>

//takes in unsigned char array, and returns unsigned short array

unsigned short foo( unsigned char *array, int size) 
{
    int i;
    unsigned short *LeArray = NULL;
    LeArray = (unsigned short*) malloc(size*sizeof(unsigned short));
    for ( i = 0; i < size; ++i ) &LeArray[i] = (unsigned char)&array[i];
    //do more stuff to that array here before returning it
    return *LeArray;

}
int main()
{

    int i, ArraySize;
    unsigned char *before = NULL;
    unsigned short *after = NULL;
    ArraySize = 9;
    before = (unsigned char*) malloc(ArraySize*sizeof(unsigned char));
    for(i = 0; i<ArraySize; i++) before[i] = i+5; //to get some values in
    for (i = 0 ; i<ArraySize; i++) printf("\npre:%d\n",before[i]);
    after = foo( before, ArraySize ); 
    for (i = 0 ; i<ArraySize; i++) printf("\npost:%d\n",after[i]);
    return 0;

}

ヘルプのヒントのヒントや説明は私にとって大きな助けになるでしょう!本当にありがとう!!

4

3 に答える 3

3

これは、期待どおりに動作するようにすべての奇妙な場所を修正した関数です。

unsigned short* foo( unsigned char *array, int size) 
// notice the return type - it's a pointer
{
    int i;
    unsigned short *LeArray = NULL;
    LeArray = (unsigned short*) malloc(size*sizeof(unsigned short));
    for ( i = 0; i < size; ++i ) LeArray[i] = (unsigned short)(array[i]);
    //do more stuff to that array here before returning it
    return LeArray; // notice NO DEREFERENCING here
}

基本的に、あなたが抱えていた問題は次のとおりです。

  • 関数の戻り値の型がポインターではありませんでした (配列ではありませんでした)
  • あなたが行っていた奇妙なポインタアクロバットがありました(コンパイラが文句を言うのをやめるまでコードを変更していたと思います)
  • 戻り時にポインターを逆参照し、基本的に配列の最初の要素の値を返します (意図した配列全体ではありません)。

もちろん、それだけではありません。すなわち:

  • 「in」配列が変更されていないように見えます-関数のシグネチャでそれを次のように表現することは非常に良い習慣ですconst unsigned char* array
  • 関数のインターフェイスをさらに変更して、結果の配列の入力引数を取得できます

その場合、次のようにします。

void foo(const unsigned char *array, unsigned short* LeArray, int size) 
{
    int i;
    // no malloc as the LeArray is passed-in
    for ( i = 0; i < size; ++i ) LeArray[i] = (unsigned short)(array[i]);
    //do more stuff to that array here before returning it
    return; // void return
}

もちろん、呼び出し元の関数で配列が事前に作成されていることを前提としています

于 2012-07-28T22:22:17.010 に答える
1

あなたはほとんどそこにいます。

ただし、*LeArray (最初の要素) ではなく、LeArray 自体 (メモリ内のアドレス) を返す必要があります。

于 2012-07-28T22:21:40.257 に答える
1

after = foo( before, ArraySize );- ここで、関数を呼び出してfoo型の戻り値を期待していますunsigned short *が、関数foounsigned short値を返しています。その後、関数内のunsigned short変数へのポインターにアクセスしているため、クラッシュ (予期しない動作) が発生する可能性があります。aftermain

したがって、関数プロトタイプを次のように変更してunsigned short* foo( unsigned char *array, int size)実行しますreturn LeArray;

于 2012-07-29T06:37:34.990 に答える