Я бы сделал это так. Он отлаживаем и не генерирует слишком много кода (memcpy будет оптимизирован из реального кода на любом уровне оптимизации) https://godbolt.org/z/lMShik
Кстати в этом случае небезопасная версия IMO так же безопасна, как и IMO, она нарушает строгие правила псевдонимов.
typedef enum
{
TYPE_A,
TYPE_B,
TYPE_C
}Types;
struct a
{
int a;
int b;
int c;
int d;
};
struct b
{
int a;
int b;
int c;
};
struct c
{
int a;
int b;
};
void inline __attribute__((always_inline)) Set_a(void *ptr, Types type, int value)
{
struct a a;
struct b b;
struct c c;
switch(type)
{
case TYPE_A:
memcpy(&a, ptr, sizeof(a));
a.a = value;
memcpy(ptr, &a, sizeof(a));
break;
case TYPE_B:
memcpy(&b, ptr, sizeof(b));
b.a = value;
memcpy(ptr, &b, sizeof(b));
break;
case TYPE_C:
memcpy(&c, ptr, sizeof(c));
c.a = value;
memcpy(ptr, &c, sizeof(c));
break;
}
}
void inline __attribute__((always_inline)) Set_a_unsafe(void *ptr, Types type, int value)
{
struct a a;
struct b b;
struct c c;
switch(type)
{
case TYPE_A:
((struct a *)ptr) -> a = value;
break;
case TYPE_B:
((struct b *)ptr) -> a = value;
break;
case TYPE_C:
((struct c *)ptr) -> a = value;
break;
}
}
struct a x,y;
int main()
{
Set_a(&x, TYPE_A, 45);
Set_a_unsafe(&y, TYPE_B, 100);
printf("%d\n", x.a);
printf("%d\n", y.a);
}
Jquery
Использования можно также использовать некоторых они слушатель события поля ввода как
$("yourid").on("change",function(){
//here do something
});
$("yourid").on("keypress",function(){
//here do something
});
$("yourid").on("keydown",function(){
//here do something
});
$("yourid").on("keyup",function(){
//here do something
});
Я не могу найти подходящего события для этого.
Да, нет ни одного.
Есть События мутации DOM , но они не не поддерживает кроссбраузерность и в любом случае не запускает значения формы, так как они не отражаются в атрибутах (кроме IE из-за ошибки).
Только в Mozilla, JavaScript watch ] можно установить в свойстве value, чтобы отслеживать изменения по сценарию. Только в IE можно настроить обработчик JScript onpropertychange для перехвата как сценариев, так и пользовательских изменений. В других браузерах вам придется использовать свой собственный интервальный опросчик для поиска изменений.
function watchProperty(obj, name, handler) {
if ('watch' in obj) {
obj.watch(name, handler);
} else if ('onpropertychange' in obj) {
name= name.toLowerCase();
obj.onpropertychange= function() {
if (window.event.propertyName.toLowerCase()===name)
handler.call(obj);
};
} else {
var o= obj[name];
setInterval(function() {
var n= obj[name];
if (o!==n) {
o= n;
handler.call(obj);
}
}, 200);
}
}
watchProperty(document.getElementById('myinput'), 'value', function() {
alert('changed!');
});
Это крайне неудовлетворительно. Он не будет реагировать на пользовательские изменения в Mozilla, он разрешает только одно отслеживаемое свойство для каждого объекта в IE,
Вы можете добавить обычный прослушиватель событий для вашего поля ввода, например. (с использованием jQuery)
$(myTextControl).change(function() {
...
/* do appropriate event handling here */
...
});
Хорошо, учитывая, что javascript, который изменяет входное значение, не контролируется вами, это становится трудным. У вас остается два варианта:
1.) Совместимость с кроссбраузером: Реализуйте опрос входного значения с помощью функции, которая постоянно проверяет, изменилось ли значение. (Что-то в этом роде.)
//at beginning before other scripts changes the value create a global variable
var oldValue = myTextControl.value;
function checkIfValueChanged() {
if(myTextControl.value != oldValue) {
$(myTextControl).trigger("change");
clearInterval(checker);
}
}
//every 500ms check if value changed
var checker = setInterval('checkIfValueChanged()', 500);
Примечание : Если ваш скрипт или пользователь также могут изменять значение, вы должны реализовать что-то, чтобы уловить это, чтобы не запускать событие изменения несколько раз.
Если значение может изменяться несколько раз с помощью внешнего сценария, просто позвольте функции интервала запускаться вместо ее отмены и просто обновите oldValue;
2.) AFAIK Еще не поддерживается всеми браузерами (? протестируйте его на тех, которые вам нужно поддерживать )
Вы можете выполнить привязку к специальному событию DOM Level 3Event: DOMAttrModified
(в Firefox, может быть, и в других, я думаю, что в Opera это тоже есть, Safari ??,
var oldVal = $('#myTextControl').val();
//Your script that changes the value
if(oldVal != $('#myTextControl').val())
{
//Your content has changed, do something
}
Вам нужно будет прослушивать события клавиатуры, когда наблюдаемый вами элемент находится в фокусе.