0

と があるunsigned int* valとしunsigned char mat[24][8]ます。これvalで、変数の場所が格納されますmat。の場所を使用して mat 変数のビットを変更することは可能valですか?

例:

val = 0x00000001valのメモリ内の場所は0x20004000 、 の最初の要素matです0x00000001

matここで、たとえば 10,4の値を変更したいと思います。C++を使用してこれを行うことは可能ですか?

4

4 に答える 4

2

はい、配列メンバーまたはポインター ターゲットのいずれかが でない限り、可能ですconst

例えば:

int array[3][2] = { { 0, 1 }, { 2, 3 }, { 4, 5 } };
int *p = &array[1][1];
*p = 42;

// array is now: { { 0, 1 }, { 2, 42 }, { 4, 5 } };
于 2013-05-08T12:15:28.497 に答える
0

unsigned char mat[24][8]24 * 8 * sizeof(char)バイトのメモリチャンクが得られるため、もちろんビットを変更できます。(ここから unsigned char は 1 バイト (=8 ビット)、unsigned int は 4 バイト (=32 ビット) であると仮定しますが、これはシステムに依存する可能性があります。

ただし、4 バイト幅の要素へのポインタを使用して 1 バイト幅のメモリ要素にアクセスするのは難しく、簡単にエラーが発生する可能性があります。

たとえば、int 配列の要素 0 を 1 に設定すると、

#define ROWS 24
#define COLS 8

unsigned char mat[ROWS][COLS];
unsigned int * val = (unsigned int*)&mat;

val[0] = 1;

mat[0][0] が 0、mat[0][1] が 0、mat[0][2] が 0、mat[0][3] が 1 であることがわかります。

このような「タイプミス」ポインターを介してメモリ内のオフセットを使用して、 mat の要素を直接編集することはできないことに注意してください。val[10*8+4]たとえば、アクセスすると、192 バイトしかないメモリ チャンクの先頭からバイト 336 にアクセスします。

インデックスを正しく計算する必要があります。

size_t byte_index = (10*COLS+4)*sizeof(unsigned char); // will be 84
size_t int_index = byte_index / sizeof(unsigned int); // will be 21
size_t sub_byte = byte_index%sizeof(unsigned int); // will be 0

したがって、参照する unsigned int 値のバイト数である要素 mat[10][4] のデータを含む 4 バイトにアクセスval[int_index]またはアクセスできます。val[21]sub_byte

同じタイプの場合、正しいオフセットを計算する必要があることを除けば問題はありません。

#define ROWS 24
#define COLS 8

unsigned char mat[ROWS][COLS];
unsigned char * val = &mat;

val[10*8+4] = 12; // set mat[10][4] to 12
*(val+10*8+5) = 13; // set mat[10][5] to 13
于 2013-05-08T12:16:56.250 に答える
0

できますが、valをunsigned char *として作成します

val = &mat;

ビットの変更を簡単に行うことができます

于 2013-05-08T12:17:09.547 に答える
0

はい、アドレス(場所と呼ばれるもの)を使用してマトリックスの値を変更できますが、最初から正しいオフセットを計算する必要があります。オフセットの計算は次のようになります。

(matrix_x_len * Y + X) * sizeof(unsigned int) + offset to the beggining of the matrix

次に、オフセットがある場合、次のようにマットを変更できます*(val + offset) = new_value

于 2013-05-08T12:14:46.470 に答える