class PValue{public: char type; int int_num; long long long_num; float float_num; double double_num; QString str; int arr_dim; int arr_sizes[MAX_DIMEN]; // 510 PValue() { type=0; int_num=0; long_num=0; float_num=0.0f; double_num=0.0d; arr_dim=0; }};
class PVariable{public: char name[33]; PValue value;};
struct PFunct{ char name[33]; int addr; char ret_type; int arg_count; char args[STACK_SIZE]; //510 int local_variables_count; PVariable *local_variables; //Вот тут используется класс, указанный выше PFunct(){addr=0; local_variables_count=0; local_variables=0;}};
f->local_variables=new PVariable[loc_count];
int PScript::load_from_file(const QString &filename){ if (filename.isEmpty()) return 1; // Поиск кодека QTextCodec *conv=QTextCodec::codecForName("UTF-8"); if (conv==0) return 2; // Открытие файла FILE* module=NULL;#ifdef WIN32 module=_wfopen(filename.toStdWString().c_str(), QString("rb").toStdWString().c_str());#else module = fopen(filename.toStdString().c_str(), "rb");#endif if (module==NULL) return 3; // Переменные QString str; int count=0; int len=0; char type=0; if (fread(&count,sizeof(int),1,module)==0) return 4; this->var_count=count; this->global_vars=new PVariable[count]; for (int i=0; i<count;++i) { // Имя if (fread(&len,sizeof(int),1,module)==0) return 5; if (len<1 || len>32) return 6; memset(this->global_vars[i].name,0,33); if (fread(this->global_vars[i].name,sizeof(char),len,module)==0) return 7; // Тип if (fread(&this->global_vars[i].value.type,sizeof(char),1,module)==0) return 8; // Размерности if (fread(&len,sizeof(int),1,module)==0) return 9; this->global_vars[i].value.arr_dim=len; if (len>0 && fread(&this->global_vars[i].value.arr_sizes,sizeof(int),len,module)==0) return 10; } // Функции if (fread(&count,sizeof(int),1,module)==0) return 11; this->func_count=count; this->functions=new PFunct[count]; PFunct *f=0; int addr=0; int loc_count=0; for (int i=0; i<count;++i) { f=&this->functions[i]; // Адрес if (fread(&f->addr,sizeof(int),1,module)==0) return 12; if (addr<0) return 13; // Имя if (fread(&len,sizeof(int),1,module)==0) return 14; if (len<1 || len>32) return 15; memset(f->name,0,33); if (fread(f->name,sizeof(char),len,module)==0) return 16; // Тип if (fread(&f->ret_type,sizeof(char),1,module)==0) return 17; // Количество аргументов if (fread(&f->arg_count,sizeof(int),1,module)==0) return 18; if (f->arg_count>0) { if (fread(f->args,sizeof(char),f->arg_count,module)==0) return 19; } // Локальные переменные if (fread(&loc_count,sizeof(int),1,module)==0) return 20; f->local_variables_count=loc_count; if (loc_count>0) { f->local_variables=new PVariable[loc_count]; } for (int l=0;l<loc_count;++l) { // Имя if (fread(&len,sizeof(int),1,module)==0) return 21; if (len<1 || len>32) return 22; memset(f->local_variables[i].name,0,33); if (fread(f->local_variables[i].name,sizeof(char),len,module)==0) return 23; // Тип if (fread(&f->local_variables[i].value.type,sizeof(char),1,module)==0) return 24; // Размерности if (fread(&len,sizeof(int),1,module)==0) return 25; f->local_variables[i].value.arr_dim=len; if (len>0 && fread(&f->local_variables[i].value.arr_sizes,sizeof(int),len,module)==0) return 26; } } // Чтение ID конца заголовка и проверка его if (fread(&count,sizeof(int),1,module)==0) return 27; if (count!=12345678) return 28;}
class PScript{public: int var_count; PVariable *global_vars; int func_count; PFunct *functions;public: PScript(); int load_from_file(const QString &filename);};
try {f->local_variables=new PVariable[loc_count];} catch(std::exception& e) { QMessageBox msg; msg.setText(QString(e.what())); msg.exec(); } catch(...) { QMessageBox msg; msg.setText(QString("HZ")); msg.exec(); }