jenya7 0 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба On 11/24/2022 at 2:07 PM, Сергей Борщ said: Вы принципиально не читаете ответы? В вашем массиве должно быть зарезервировано место под признак окончания строки, байт с кодом 0. strcpy() не следит, что ваш массив уже закончился и тупо пишет все, что ей дали на вход. Вы испортили следующую за массивом переменную. Счастливой отладки! исходная строка src имеет нал терминатор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба char body[src_len+1]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба 12 minutes ago, jenya7 said: исходная строка src имеет нал терминатор Имеет. А места в вашем body под него не предусмотрено. Заменой strncpy на strcpy вы добавили \0 к body в смежной ячейке за пределами массива (ну, и еще кому-то досталось). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 24 ноября, 2022 Опубликовано 24 ноября, 2022 (изменено) · Жалоба On 11/24/2022 at 2:31 PM, aaarrr said: Имеет. А места в вашем body под него не предусмотрено. Заменой strncpy на strcpy вы добавили \0 к body в смежной ячейке за пределами массива (ну, и еще кому-то досталось). вот тут бы IAR и сгенерировал out of index exception. с массивом он таки генерит в compile time. Изменено 24 ноября, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tgruzd 11 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба 19 минут назад, jenya7 сказал: исходная строка Вы, случайно, не компилятор написать собираетесь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 24 ноября, 2022 Опубликовано 24 ноября, 2022 (изменено) · Жалоба On 11/24/2022 at 2:35 PM, tgruzd said: Вы, случайно, не компилятор написать собираетесь? ну так. небольшой парсер скрипта. очень простенький. собственно он уже есть, добавляю фичеры. Изменено 24 ноября, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tgruzd 11 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба посмотрите в сторону AST - abstract syntax tree. Наверняка, на гитхабе можно найти подходящие вам реализации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба On 11/24/2022 at 2:41 PM, tgruzd said: посмотрите в сторону AST - abstract syntax tree. Наверняка, на гитхабе можно найти подходящие вам реализации. что то похожее я реализовал сам того не подозревая. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба 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() и не копируется из оригинальной строки. Бесполезно. Я пас. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба 10 minutes ago, jenya7 said: вот тут бы IAR и сгенерировал out of index exception И как же он сможет оценить последствия работы strcpy с неизвестным источником, а? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tgruzd 11 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба 3 минуты назад, jenya7 сказал: то похожее я реализовал Пока не верится, почему-то) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба 1 minute ago, Сергей Борщ said: Бесполезно. Увы, да. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба 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 осями с коррекцией позиции. очень шустро и гладко. (сам в шоке). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться