Я пишу код C
для функции типа регистрации данных. Получите значение переменной, выполните простую операцию и запишите данные в другую переменную.Регистрация для разных типов данных в C
Ключевым моментом здесь является использование большого количества различных типов данных и операций с данными. Я попытался использовать указатели void для всех переменных. Затем я вызываю одну и ту же функцию для каждого.
Взгляните на функцию. Вы увидите, что я переписываю код снова и снова для каждого типа данных.
/***********************************************************/
static void GenData(USHORT data_type,
USHORT operation,
void *var_p,
void *data_p)
/***********************************************************/
{
switch (data_type)
{
case (DATA_INT):
switch (operation) {
case (OP_ONE_SHOT):
*(int*)data_p = *(int*)var_p;
break;
case (OP_COUNTER):
*(int*)data_p += 1;
break;
case (OP_CURR_TIME):
*(int*)data_p = (int)sytime;
case (OP_ELAPSED_TIME):
*(int*)data_p += delta_tick_time;
break;
case (OP_MIN):
if (*(int*)data_p > *(int*)var_p) {
*(int*)data_p = *(int*)var_p;
}
break;
case (OP_MAX):
if (*(int*)data_p < *(int*)var_p) {
*(int*)data_p = *(int*)var_p;
}
break;
case (OP_ADD_ITSELF):
*(int*)data_p += *(int*)data_p;
break;
default:
break;
}
break;
case (DATA_BYTE):
switch (operation) {
case (OP_ONE_SHOT):
*(BYTE*)data_p = *(BYTE*)var_p;
break;
case (OP_COUNTER):
*(BYTE*)data_p += 1;
break;
...
...
case (DATA_SHORT):
...and so on...
}
Арифметика на пустой указатель в C
не является действительным. Я не уверен, что это означает, что я не могу улучшить эту функцию. Есть ли способ, которым я могу написать это, поэтому мне не нужно снова и снова переписывать детали «mathy»?
Как всегда, благодарю вас за ваше время и усилия, чтобы помочь.
Пожалуйста, сообщите точное сообщение об ошибке, скопируйте и вставьте ошибку компилятора. –
Возможно, связано: [Существует ли спецификатор преобразования для printf] (http://stackoverflow.com/questions/26728333/is-there-a-generic-conversion-specifier-for-printf/26728390#26728390) –
Вы можете используйте шаблоны для типов, которые в конечном итоге имеют один и тот же код, но, в конце концов, причина, по которой разные типы, заключается в том, что они разные, а ваш код будет другим. Планируете ли вы позволить удвоить ++? У вас будет тип для коэффициентов, не будет ли его код другим? В зависимости от того, какой компилятор вы используете, вы можете использовать «typeof» для передачи типа, в который вы делаете. Если случаи могут быть объединены, вы также можете комбинировать их в своих операторах switch. Однако вам нужны такие типы, чтобы операции переполнения/переполнения выполнялись в правильном месте. – LawfulEvil