Written on: 12. 05. 2021 [04:24]
|
psn8402
Сергей Петрушкин
Topic creator
registered since: 12.05.2021
Posts: 3
|
В процессе конфигурирования свойств страницы я ошибся, и установил конфигурацию "Из стиля" свойству backImg. Соответствующая запись была автоматически добавлена в таблицу *_stl, и значения всех полей V_? выставлены пустыми строками. После перезапуска проекта Опенскада падала при попытке запуска рантайма и при попытке открытия вкладки "Стили" в QtCfg. Выяснил следующее:
src/moduls/ui/VCAEngine/project.cpp строка 217:
for(int fldCnt = 0; SYS->db().at().dataSeek(fullDB()+"_stl",nodePath()+tbl()+"_stl",fldCnt++,cStl,false,true); ) {
vlst.clear();
for(int iS = 0; iS < 10; iS++) {
svl = cStl.cfg(TSYS::strMess("V_%d",iS)).getS();
if(svl.empty()) break;
vlst.push_back(svl);
}
mStProp[cStl.cfg("ID").getS()] = vlst;
}
Если встречается пустая строка - значение не добавляется в список. В результате соответствующий элемент mStProp остаётся пустым списком.
src/moduls/ui/VCAEngine/project.cpp строка 804:
if(n_vl) n_vl->childAdd("el")->setText(iStPrp->second[stlCurent()]);
Здесь возвращается нулевая ссылка при попытке получения элемента пустого списка iStPrp->second. Это приводит к сегфолту внутри метода setText.
Написал такой патч. Решение неидеальное, при желании всё ещё можно вызвать сегфолт. Например, стерев названия стилей и попытавшись добавить новый стиль в QtCfg. Но это уже специально нужно стараться.
Index: src/moduls/ui/VCAEngine/project.cpp
===================================================================
--- src/moduls/ui/VCAEngine/project.cpp (revision 2747)
+++ src/moduls/ui/VCAEngine/project.cpp (working copy)
@@ -214,11 +214,22 @@
TConfig cStl(&mod->elPrjStl());
string svl;
vector<string> vlst;
+ int stlCnt = 0;
for(int fldCnt = 0; SYS->db().at().dataSeek(fullDB()+"_stl",nodePath()+tbl()+"_stl",fldCnt++,cStl,false,true); ) {
+ if (cStl.cfg("ID").getS() == "<Styles>") {
+ int i;
+ for(i = 0; i < 10; i++) {
+ svl = cStl.cfg(TSYS::strMess("V_%d",i)).getS();
+ if(svl.empty()) break;
+ }
+ stlCnt = i;
+ break;
+ }
+ }
+ for(int fldCnt = 0; SYS->db().at().dataSeek(fullDB()+"_stl",nodePath()+tbl()+"_stl",fldCnt++,cStl,false,true); ) {
vlst.clear();
- for(int iS = 0; iS < 10; iS++) {
+ for(int iS = 0; iS < stlCnt; iS++) {
svl = cStl.cfg(TSYS::strMess("V_%d",iS)).getS();
- if(svl.empty()) break;
vlst.push_back(svl);
}
mStProp[cStl.cfg("ID").getS()] = vlst;
|
Written on: 12. 05. 2021 [07:09]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
Исправлено!
Learn, learn and learn better than work, work and work.
|