Перейти к содержанию
    

IAR добавляет мусор в конце строки (?)

On 11/24/2022 at 2:07 PM, Сергей Борщ said:

Вы принципиально не читаете ответы? В вашем массиве должно быть зарезервировано место под признак окончания строки, байт с кодом 0. strcpy() не следит, что ваш массив уже закончился и тупо пишет все, что ей дали на вход. Вы испортили следующую за массивом переменную. Счастливой отладки!

исходная строка src имеет нал терминатор. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 minutes ago, jenya7 said:

исходная строка src имеет нал терминатор

Имеет. А места в вашем body под него не предусмотрено. Заменой strncpy на strcpy вы добавили \0 к body в смежной ячейке за пределами массива (ну, и еще кому-то досталось).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/24/2022 at 2:31 PM, aaarrr said:

Имеет. А места в вашем body под него не предусмотрено. Заменой strncpy на strcpy вы добавили \0 к body в смежной ячейке за пределами массива (ну, и еще кому-то досталось).

 

вот тут бы IAR и сгенерировал out of index exception. с массивом он таки генерит в compile time.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 минут назад, jenya7 сказал:

исходная строка

image.png.984174db05e8bfc36243bd63f3386472.png

Вы, случайно, не компилятор написать собираетесь? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/24/2022 at 2:35 PM, tgruzd said:

image.png.984174db05e8bfc36243bd63f3386472.png

Вы, случайно, не компилятор написать собираетесь? 

ну так. небольшой парсер скрипта. очень простенький. собственно он уже есть, добавляю фичеры.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

посмотрите в сторону AST - abstract syntax tree.  Наверняка, на гитхабе можно найти подходящие вам реализации. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/24/2022 at 2:41 PM, tgruzd said:

посмотрите в сторону AST - abstract syntax tree.  Наверняка, на гитхабе можно найти подходящие вам реализации. 

что то похожее я реализовал сам того не подозревая.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

31 минуту назад, jenya7 сказал:

исходная строка src имеет нал терминатор. 

 

1 час назад, Shamil сказал:

strlen() возвращает длину строки без завершающего нуля.

1 час назад, aaarrr сказал:
Цитата

The strlen() function calculates the length of the string pointed to by s, excluding the terminating null byte ('\0').

1 час назад, AndyBig сказал:

У Вас есть строка "abcdef". Вы берете через strlen() ее длину, получаете 6. После этого создаете массив длиной 6 байт, обнуляете его через memset() и копируете в него эту строку длиной 6 байт. Получаете массив длиной 6 байт, занятый шестью символами из скопированной строки. Все, седбмой байт, который должен быть нулем для завершения строки, остается за пределами массива, он не обнуляется в memset() и не копируется из оригинальной строки.

Бесполезно. Я пас.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, jenya7 said:

вот тут бы IAR и сгенерировал out of index exception

И как же он сможет оценить последствия работы strcpy с неизвестным источником, а?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/24/2022 at 2:48 PM, aaarrr said:

И как же он сможет оценить последствия работы strcpy с неизвестным источником, а?

упс...а слона то я и не заметил 🙂

On 11/24/2022 at 2:48 PM, tgruzd said:

Пока не верится, почему-то)

не что то похожее получилось. с испугу наверное.

вот мне чел прислал последнее художество

Spoiler
//1 - STOP, 2- FWD, 3- REV

//command stop
IF COM0==1 THEN MOT0=1 MOT2=1 MOT4=1;

//all critical conditions
IF DIR0>1 OR DIR1>1 AND VAR2>POSDIF0 THEN MOT0=1 MOT1=1 LED3=1;
IF DIR0==2 AND FLSW0==0 THEN MOT0=1;
//IF DIR1==2 AND FLSW1==0 THEN MOT1=1;

IF CUR0>IMAX0 THEN FLG5+=1;
IF CUR1>IMAX1 THEN FLG9+=1;
IF CUR2>IMAX2 THEN FLG10+=1;
IF CUR4>IMAX4 THEN FLG11+=1;

IF FLG5>OVC0 THEN MOT0=1 AND MOT1=1 FLG5=0 MSG2=0;
IF FLG9>OVC1 THEN MOT1=1 AND MOT0=1 FLG9=0 MSG2=0;
IF FLG10>OVC2 THEN MOT2=1 FLG10=0 MSG2=0;
IF FLG11>OVC4 THEN MOT4=1 FLG11=0 MSG2=0;

IF DIR2>1 OR DIR3>1 AND VAR3>POSDIF1 THEN FLG9+=1;
//IF FLG9>2 THEN MOT2=1 LED4=1 FLG9=0;

IF DIR4>1 OR DIR5>1 AND VAR10>POSDIF1 THEN FLG11+=1;

IF DIR2==2 AND POS2>=FMPOS2 THEN MOT2=1;
IF DIR2==3 AND RLSW2==0 THEN MOT2=1;

//first pair top position - tv motor may go
//IF FLSW0==0 AND FLSW1==0 THEN FLG0=1 ELSE FLG0=0;
IF FLSW0==0 THEN FLG0=1 ELSE FLG0=0;
//TV top position - rotation motor may go
IF FLSW2==0 THEN FLG13=1 ELSE FLG13=0;
//rotation motor home position - tv motor may go
IF RLSW4==0 THEN FLG14=1 ELSE FLG14=0;
//tv bottom position - first pair may go
IF RLSW2==0 THEN FLG1=1 ELSE FLG1=0;

//first pair not moving
IF DIR0<2 AND DIR1<2 THEN FLG6=1 ELSE FLG6=0;
//tv motor not moving
IF DIR2<2 AND DIR3<2 THEN FLG7=1 ELSE FLG7=0;
//roration motor not moving
IF DIR4<2 AND DIR5<2 THEN FLG15=1 ELSE FLG15=0;

IF FLG6==1 THEN VAR8=(VAR8+1) ELSE VAR8=0;
IF FLG7==1 THEN VAR9=(VAR9+1) ELSE VAR9=0;
IF FLG15==1 THEN VAR10=(VAR10+1) ELSE VAR10=0;

/////////////////////////////////////   FIRST PAIR /////////////////////////////////////////

//check position difference and hold it as a variable
IF POS0>=POS1 THEN VAR2=(POS0-POS1) FLG2=1;
IF POS1>=POS0 THEN VAR2=(POS1-POS0) FLG2=2;

IF FLG1==1 AND VAR2<POSDIF0 AND FLG7==1
{
IF FLG2>0 THEN VAR4=(VAR2*PWMDEL0);

IF FLG4==5 AND VAR9>100 THEN MOT0=3 MOT1=3 FLG4=0;

//command forward and not a forward limit or position difference - start motor forward
IF COM0==2 THEN FLG4=2;
IF COM0==2 AND FLSW0==1 THEN MOT0=2;
IF COM0==2 AND FLSW1==1 THEN MOT1=2;

//command reverse and not a reverse limit or position difference - start motor reverse
IF COM0==3 THEN FLG4=3;
IF COM0==3 AND RLSW0==1 THEN MOT0=3;
IF COM0==3 AND RLSW1==1 THEN MOT1=3;
}

//position correction
IF FLG1==1 AND VAR2>POSDEL0
{
//direction forward - motor 0 moves faster
IF DIR0==2 OR DIR1==2 AND FLG2==1 THEN VAR0-=VAR4 VAR1+=VAR4;
//direction forward - motor 1 moves faster
IF DIR0==2 OR DIR1==2 AND FLG2==2 THEN VAR0+=VAR4 VAR1-=VAR4;

//direction reverse - motor 1 moves faster
IF DIR0==3 OR DIR1==3 AND FLG2==1 THEN VAR0+=VAR4 VAR1-=VAR4;
//direction reverse - motor 0 moves faster
IF DIR0==3 OR DIR1==3 AND FLG2==2 THEN VAR0-=VAR4 VAR1+=VAR4;

//check limits
IF VAR0>PWMMAX0 THEN VAR0=PWMMAX0;
IF VAR0<PWMMIN0 THEN VAR0=PWMMIN0;
IF VAR1>PWMMAX0 THEN VAR1=PWMMAX0;
IF VAR1<PWMMIN0 THEN VAR1=PWMMIN0;

//finally - pass values to the motors if the motors moving
IF DIR0>1 THEN PWM0=VAR0;
IF DIR1>1 THEN PWM1=VAR1;
}

/////////////////////////////////////   TV MOTOR /////////////////////////////////////////

//check position difference and hold it as a variable
IF POS2>=POS3 THEN VAR3=(POS2-POS3) FLG3=1;
IF POS3>=POS2 THEN VAR3=(POS3-POS2) FLG3=2;

//state after reset
IF POS2==0 AND RLSW2==1 THEN FLG8=1 ELSE FLG8=0;

IF FLG0==1 AND VAR3<POSDIF1 AND FLG6==1
{
IF FLG3>0 THEN VAR5=(VAR3*PWMDEL1);

IF FLG4==2 THEN MOT2=2 FLG4=0;

//command forward and not a forward limit or position difference - start motor forward
IF COM0==2 THEN FLG4=4;
IF COM0==2 AND POS2<FMPOS2 AND VAR8>100 AND FLG8==0 THEN MOT2=2;

//command reverse and not a reverse limit or position difference - start motor reverse
IF COM0==3 THEN FLG4=5;
IF COM0==3 AND RLSW2==1 THEN MOT2=3;
}

//position correction
IF FLG0==1 AND VAR3>POSDEL1
{
//direction forward - motor 2 moves faster
IF DIR2==2 OR DIR3==2 AND FLG3==1 THEN VAR6-=VAR5 VAR7+=VAR5;
//direction forward - motor 3 moves faster
IF DIR2==2 OR DIR3==2 AND FLG3==2 THEN VAR6+=VAR5 VAR7-=VAR5;

//direction reverse - motor 2 moves faster
IF DIR2==3 OR DIR3==3 AND FLG3==1 THEN VAR6+=VAR5 VAR7-=VAR5;
//direction reverse - motor 3 moves faster
IF DIR2==3 OR DIR3==3 AND FLG3==2 THEN VAR6-=VAR5 VAR7+=VAR5;

//check limits
IF VAR6>PWMMAX1 THEN VAR6=PWMMAX1;
IF VAR6<PWMMIN1 THEN VAR6=PWMMIN1;
IF VAR7>PWMMAX1 THEN VAR7=PWMMAX1;
IF VAR7<PWMMIN1 THEN VAR7=PWMMIN1;

//finally - pass values to the motors if the motors moving
IF DIR2>1 THEN PWM2=VAR6;
IF DIR3>1 THEN PWM3=VAR7;
}

/////////////////////////////////////   ROTATION MOTOR //////////////////////////////////////

//check position difference and hold it as a variable
IF POS4>=POS5 THEN VAR10=(POS4-POS5) FLG17=1;
IF POS5>=POS4 THEN VAR10=(POS5-POS4) FLG17=2;

//state after reset
IF POS4==0 AND RLSW4==1 THEN FLG16=1 ELSE FLG16=0;

IF FLG13==1 AND VAR10<POSDIF1 AND FLG15==1
{
IF FLG17>0 THEN VAR13=(VAR10*PWMDEL1);

IF FLG4==2 THEN MOT4=2 FLG4=0;

//command forward and not a forward limit or position difference - start motor forward
IF COM0==2 THEN FLG4=6;
IF COM0==2 AND POS2<FMPOS2 AND VAR8>100 AND FLG16==0 THEN MOT4=2;

//command reverse and not a reverse limit or position difference - start motor reverse
IF COM0==3 THEN FLG4=7;
IF COM0==3 AND RLSW4==1 THEN MOT4=3;
}

//position correction
IF FLG13==1 AND VAR10>POSDEL1
{
//direction forward - motor 4 moves faster
IF DIR2==2 OR DIR3==2 AND FLG17==1 THEN VAR11-=VAR13 VAR12+=VAR13;
//direction forward - motor 5 moves faster
IF DIR2==2 OR DIR3==2 AND FLG17==2 THEN VAR11+=VAR13 VAR12-=VAR13;

//direction reverse - motor 4 moves faster
IF DIR2==3 OR DIR3==3 AND FLG17==1 THEN VAR11+=VAR13 VAR12-=VAR13;
//direction reverse - motor 5 moves faster
IF DIR2==3 OR DIR3==3 AND FLG17==2 THEN VAR11-=VAR13 VAR12+=VAR13;

//check limits
IF VAR11>PWMMAX2 THEN VAR11=PWMMAX2;
IF VAR11<PWMMIN2 THEN VAR11=PWMMIN2;
IF VAR12>PWMMAX2 THEN VAR12=PWMMAX2;
IF VAR12<PWMMIN2 THEN VAR12=PWMMIN2;

//finally - pass values to the motors if the motors moving
IF DIR4>1 THEN PWM4=VAR11;
IF DIR5>1 THEN PWM5=VAR12;
}

 

скрипт управляет 5 осями с коррекцией позиции. очень шустро и гладко. (сам в шоке).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...