memset для структуры и массива в js-ctypes

Это касается вопроса memset не имеет DLL, поэтому как его ввести в сочетании с Есть идеи, что делает fillchar?

Я узнал, что memset можно использовать с типами array и structure. Однако нет функции sizeof, поэтому мы должны сделать .length для массива и .size() для структуры нет?

Я просто немного смущен тем, как memset может работать со структурой и массивом, пожалуйста.


person Community    schedule 30.06.2014    source источник


Ответы (1)


Итак, ctypes memset, которые я предоставил, можно использовать с массивами. Но структуры можно преобразовать в массивы.

Обычно вы не будете использовать memset в структуре, за исключением случаев, когда вы хотите инициализировать ее нулем. Но опять же, обычно вам не нужно инициализировать его до 0, если вы создаете экземпляр структуры самостоятельно с помощью ctypes, так как ctypes позаботится об этом (поэтому вам нужно будет только инициализировать его, когда он выделяется внешним кодом для любой причине).

Обычно вы просто устанавливаете члены структуры:

var tbb = new struct_TBButton();

tbb.iBitmap = 1;
tbb.idCommand = 2;

В действительно необычном случае вам нужно memset его, а затем преобразовать в (байтовый) массив, который вы затем можете memset.

// Cast to a byte array (uint8_t == byte)
var a = ctypes.cast(b, ctypes.uint8_t.array(struct_TBButton.size));

// memset to something.
// memset function from other question.
function memset(array, val, size) {
 for (var i = 0; i < size; ++i) {
   array[i] = val;
 }
} 
memset(a, 0x10, a.length);

// verify by checking iBitmap, which is an int(32), so 4 bytes,
// so should be 10101010.
console.log(tbb.iBitmap, tbb.iBitmap.toString(16), b.iBitmap == 0x10101010);
//  269488144 "10101010" true
person nmaier    schedule 30.06.2014
comment
Большое спасибо, memset был фундаментальной вещью, которую я не понимал, это мне очень помогает. - person Noitidart; 30.06.2014