2

配列を定義できること例:

int a[] = {1,2,3};

は非常に便利ですが、配列aはr値であるため、後でaの値を変更することはできません。

a[] = {4,5,6};

これを実行したいコンテキストは、関数に配列をフィードして出力をテストする一連の単体テストを作成することです。異なる入力を使用して同じ関数でテストを実行しており、入力配列に一意の名前を付ける必要がないようにしたいと考えています。たとえば、次のようにする必要があります。

int test1_a[] = {1,2,3};
/* calls to functions */

int test2_a[] = {4,5,6};
/* calls to functions */

また、配列へのポインタを関数に渡したい場合は、最初に次のようにキャストする必要があります。

int a[] = {1,2,3};
int *b = a;

my_func(&b);

このようにr値へのポインタを渡すことは機能しません:

my_func(&a);

私の質問は、これらの制限に悩まされることなく、値の配列を簡単に初期化する他の方法があるかどうかです。(特に、各テストに一意の配列名のセットがなくても、多くの同様の単体テストを簡単に記述できるようにするため)

4

3 に答える 3

1

1つのオプションがあります:

#include <stdio.h>
#include <stdarg.h>

void ReinitArray(int* p, size_t cnt, ...)
{
  va_list ap;

  va_start(ap, cnt);

  while (cnt--)
  {
    *p++ = va_arg(ap, int);
  }

  va_end(ap);
}

int array[5] = { 1, 2, 3, 4, 5 };

int main(void)
{
  size_t i;

  printf("array[5]=");
  for (i = 0; i < 5; i++) printf("%d ", array[i]);
  printf("\n");

  ReinitArray(array, 5, 11, 22, 33, 44, 55);

  printf("array[5]=");
  for (i = 0; i < 5; i++) printf("%d ", array[i]);
  printf("\n");

  return 0;
}

出力:

array[5]=1 2 3 4 5
array[5]=11 22 33 44 55

そして、配列名はmy_func(a);どこにあるかを簡単に書くことができます。aこれは&a[0]、最初の配列要素のアドレスであるを渡すことと同じです。Cでは、配列全体を関数パラメーターとして直接渡すことはできません。

于 2011-12-13T13:51:05.260 に答える
1

私があなたの質問を正しく理解していれば、次のことがあなたの問題を解決するはずだと思います。

memcpy(a, (int[]){3, 2, 1}, sizeof a);

cコンパイラが複合リテラル(c99以降)をサポートしている場合のみ。

標準を指定するには、gccを「gcc-std =c99-Wall-pedantic」として呼び出すことができます。

于 2011-12-13T13:51:42.923 に答える
1

関数に渡したい値がすでにある場合は、多次元配列を使用してみませんか?

int a[][] = {
    { 1, 2, 3 },
    { 4, 5, 6 }
}

for (int i = 0; i < 2; i++)
{
    /* Call functions with 'a[i]' as argument */
}

また、呼び出す関数が配列を予期していて、たとえばint a[] = {...}; int *b = a;、がある場合は、を使用してそれらを呼び出さないでください&b。を使用すると、ポインタが指すアドレスではなく、ポインタ&bのアドレスが渡されます。

于 2011-12-13T13:52:28.750 に答える