Вход

Просмотр полной версии : Проблема с макросом



Newcomer
05.05.2025, 17:36
Добрый день

Написал макрос, но оператор CASE не хочет работать. Я его упростил, но не помогло. В результате работы переменная I1 должна принять значение 5, но она почему-то 0.


int MacroEntry()
{
static unsigned short I1 = 0;
unsigned short I2 = 0;
unsigned short K;
unsigned short N1 = 1;
unsigned short _P1[3] = {1,2,76};
float _P2[3] = {3.1, 10.6, 70.4};
unsigned int _P10[3][8] = {
{82, 101, 99, 105, 112, 101, 32, 49},
{82, 101, 99, 105, 112, 101, 32, 50},
{82, 101, 99, 105, 112, 101, 32, 51}
};
bool Up_c;
bool Down_c;

J = J + 1;
N = N1;
_I1 = I1;

Up_c = Up;
Down_c = Down;

switch (I1){

case 0:
//if (Up_c == true) {I1 = 10;}
I1 = 5;
break;

case 5:
;
break;

case 10:
if (N1 >= 3) {N1 = 1;} else {N1 = N1 + 1;}
I1 = 20;

case 20:
if (Up_c == false) {I1 = 0;}
}

for (K = 0; K < 8; K++) {P10[K] = _P10[N1-1][K];}
for (K = 0; K < 2; K++) {P1[K] = _P1[K];}
for (K = 0; K < 2; K++) {P2[K] = _P2[K];}


return 0;
}


Убрал из макроса все лишнее и оператор CASE начал работать верно.

int MacroEntry()
{
static unsigned short I1 = 0;


switch (I1){

case 0:

I1 = 5;
break;

case 5:
;
break;

case 10:
if (N1 >= 3) {N1 = 1;} else {N1 = N1 + 1;}
I1 = 20;

case 20:
if (Up_c == false) {I1 = 0;}
}

return 0;
}

В чем может быть причина ?

МихаилГл
05.05.2025, 17:50
Ничего в этом си непонимаю... А не то ли, что в первом примере ошибка какаято возникает раньше, чем присваиваете переменной 5, а во втором случае она позже... И не все переменные вроде определены...

Newcomer
05.05.2025, 18:09
Ничего в этом си непонимаю... А не то ли, что в первом примере ошибка какаято возникает раньше, чем присваиваете переменной 5, а во втором случае она позже... И не все переменные вроде определены...

Часть переменных задана в конфигураторе панели. Оба кода компилируется без ошибок. У меня такое чувство что конфигуратор косячный.

Валенок
05.05.2025, 18:59
брэка в шаге 10 нету - это задумка такая?

Newcomer
05.05.2025, 20:41
брэка в шаге 10 нету - это задумка такая?

Он не обязателен. Второй код же правильно работает.

1exan
06.05.2025, 04:23
А в
P10[K] = _P10[N1-1][K];

P10 - это что?

МихаилГл
06.05.2025, 04:55
А в
P10[K] = _P10[N1-1][K];

P10 - это что?

Похоже на массив, но другой размерности... А вот это и ошибка походу, из-за которой макрос просто не работает...

PS Хотя без описания переменных неясно (о чем я сначала и спрашивал). Может там в бул реал пытаются записать.

Newcomer
06.05.2025, 07:17
А в
P10[K] = _P10[N1-1][K];

P10 - это что?

Это массив.

1exan
06.05.2025, 08:03
Это массив.

Если объявить этот массив внутри кода макроса - тоже неправильно работает?

Newcomer
06.05.2025, 08:38
Если объявить этот массив внутри кода макроса - тоже неправильно работает?

Этот массив нужен для связи с визуальным элементом. Объявлять его внутри кода макроса бессмысленно.

МихаилГл
06.05.2025, 09:23
А точно не надо адреса смещать для массива, не 302 на float, а уже 304...

Newcomer
06.05.2025, 10:31
А точно не надо адреса смещать для массива, не 302 на float, а уже 304...

P1 - это целый тип. Но проблема с переменной I1. Почему-то она все время в нуле.

МихаилГл
06.05.2025, 10:43
P1 - это целый тип. Но проблема с переменной I1. Почему-то она все время в нуле.

Вы не поняли. Р1 это целый тип, но это массив из 3х переменных, а у вас под массив Р1 зарерервирован 301 адрес, а следом 302 float. Или так и надо?
Может ваш макрос тупо упирается при присвоении в исключение и ничего не делает, а с вырезанными формулами этого просто не происходит, так как ошибки как таковой не происходит. Я об этом, и в 1ом моем посте про это.