1

重複
の可能性: sizeof (配列を指すポインター) を見つける方法

配列のサイズを見つけるためにこれを知っています=sizeof(arr)/sizeof(arr[0])

しかし、私は以下を実装する必要があります (これは単なるデモです):

デモ.h

#ifndef __DEMO_H
#define __DEMO_H
void heap_sort(int *);
#endif

デモ.c

void heap_sort(int *ptrA)
{
//implementing heap sort 
But here it requires length of array 
}

main.c

#include "demo.h"
int main(void)
{
 int A[10];
 heap_sort(A)
 return 0;
}

参考までに..これは単なるデモです..しかし、ここでは、「ヘッダーファイルで何も変更しないでください」という制限がある他のシナリオで実装する必要があります。これは、関数の署名を変更できないことを意味します。次に、配列の長さを取得する方法demo.cchar の助けを借りて簡単に取得できます、型strlen()の長さを取得するのに似たものはありませんかintfloat double

4

4 に答える 4

4

私が見る唯一の選択肢は次のとおりです。

  • ターミネータとして特別な値を使用します (strlenそうです)。
  • パスカルのトリックを使用して、配列の長さを最初の要素に配置します。
  • 配列サイズをグローバル外部変数に格納します。
  • 別の関数を使用します。

例えば:

int arraySize(int newSize)
{
    static int arraySize = 0;
    int oldSize;
    oldSize = arraySize;
    if (newSize)
        arraySize = newSize;
    return oldSize;
}

main.c:

    arraySize(10);

demo.c:

    arraylen = arraySize(0);
于 2012-11-12T09:30:06.093 に答える
2

関数のシグネチャを変更できない場合は、最初の要素で配列のサイズを渡すことができます。

A[0] = 10;
heap_sort(A);

または、配列の最後を特別な値でマークしますが、長さを見つけるために配列全体を反復する必要があり、この値が配列で使用されていないことを確認する必要があるため、これは好きではありません。

A[LENGTH-1] = END//some value;

void array_length(A) {
    while (*A++ != END) {
          length++;
    }
}

これは、あなたが課した制限の単なる解決策です.私が通常行うことは、配列のサイズを2番目の引数として渡すか、配列に astructを使用することです:

struct array_t {
    int *data; //allocate this
    int size;
};

注: 他の恐ろしい解決策には、グローバル変数が含まれます。

于 2012-11-12T09:28:22.190 に答える
1

を考えることがstrlen()正しい方向に進んでいます。

文字列は、'\0'最後の要素として as 配列終端を持つ文字配列です。

他のタイプの配列についても同じアプローチを取ることができます。

配列の最後の要素を示す値として 1 つの値を定義するだけです。この値を検索すると、配列のサイズを見つけるのに役立ちます。


アップデート:

配列の最初の要素を使用するというmuxのアイデアが気に入っています。

とにかく、それを使用してそこに要素の数を格納すると、配列の要素に格納できるものよりも配列内の要素の数が多い場合に問題が発生する可能性があります (charたとえば、配列は 255 要素に制限されます)。 )。

一方、私のアプローチには、配列へのターミネータとして使用される値がarra自体の実際の値として使用できないという欠点があります。

前者と後者のアプローチを組み合わせて、配列の最初の要素を使用して、配列のターミネータとして使用される値を格納することを提案します。

于 2012-11-12T09:31:52.967 に答える
0

制約は少し奇妙に思えますが、何でも構いません。

サイズを格納するためにグローバル変数を使用しないのはなぜですか。

于 2012-11-12T09:39:12.267 に答える