2

可変数の「char[2]」、つまり 2 文字の静的配列を保持する構造を作成する必要があります。

私の質問は、x 個の char[2] にメモリを割り当てる方法です。

私はこれを試しました(int xが定義されていると仮定します):

char** m = NULL;
m = new char[x][2];
...
delete [] m;

(うまくいきませんでした)

std::vector<char[2]> をコンテナーとして使用できることはわかっていますが、生のポインターでどのように行われるかについて興味があります。

私は C++ が初めてで、学習しようとしています。

4

4 に答える 4

4

コードでは、「m」のタイプが「new」呼び出しと一致しません。あなたが欲しいものは:

char (*m)[2] = NULL;
m = new char[x][2];
...
delete [] m;

mは2文字の配列へのポインターであり、newを呼び出して、2文字のx配列の配列を取得し、最初の配列をmにポイントします。

于 2009-09-11T04:18:20.453 に答える
4

次のコードは次のコードよりも読みやすいと思いますchar[n][2]

typedef char wchar[2];   // array of two chars
const size_t n = 100;    // some const
wchar* x = new wchar[n]; // array of wchars, where wchar is array of two chars

// here is still a problem that you could write the following
x[5][5] = 0;             // not what you expected?

delete[] x;              // clean up

wcharの内部構造を知っている場合、次のように宣言すると、コードが読みやすくなります。

// using struct is just gives names to chars in wchar, without performance drop
struct wchar {
  char h;
  char l;
};

...

const size_t n = 100;    // some const
wchar* x = new wchar[n]; // array of wchars

x[0].h = 0;
x[0].l = 0;

delete[] x;              // clean up

そして最後に、C ++を使用しているため、C配列を使用する必要はありません。

const size_t n = 100;    // some const   
typedef std::tr1::array<wchar, n> my_arr;
my_arr* x = new my_arr;

(*x)[0].h = 0;
(*x)[0].l = 0;

delete x;

コンパイル時の範囲をチェックするもう1つの非常に安全なオプション:

template<int n_max>
struct array_n {
    char v[2*n_max];

    template<size_t n, size_t s> 
    char& get() {
        BOOST_STATIC_ASSERT( s < 2 );
        BOOST_STATIC_ASSERT( n < n_max );
        return v[n*2+s];
    };  
};

int main( int argc, char**argv)
{
    const size_t n = 100;    // some const   
    typedef array_n<100> my_arr;
    my_arr* x = new my_arr;

    x->get<10, 1>() = 0;   // ok
    x->get<50, 0>() = 0;   // ok
    x->get<10, 2>() = 0;   // compile time error
    x->get<500, 0>() = 0;  // compile time error

    delete x;
}
于 2009-09-11T04:32:24.010 に答える
0

最終的に配列のサイズを決定し、次にnewを使用して、それを2次元配列として扱います。

ただし、これに関する適切な議論については、 http ://www.velocityreviews.com/forums/t283481-dynamic-multidimension-arrays.htmlを参照してください。

于 2009-09-11T03:50:03.773 に答える
0
unsigned x=10;
typedef char A2[2];
A2 *m=new A2[x];
m[0][1]='a';
m[9][0]='b';
delete[] m;

C 多次元配列 (最初の次元以外はすべて定数) は連続して配置されます。

1d 配列の 1d 配列である (ギザギザになる可能性がある) 多次元配列が必要な場合は、ループする必要があります。

  char **m=new char *[x];
  for (unsigned i=0;i<x;++i) m[i]=new char[2];
  ...
  for (unsigned i=0;i<x;++i) delete[] m[i];
  delete[] m;
于 2009-09-11T03:48:06.987 に答える