ECL IDE提交程序至ECL Watch时触发3000系统错误求助
解决ECL提交时的assert(required <= maxAvailable())失败错误
错误信息
系统错误:3000: assert(required <= maxAvailable()) 失败 - 文件:rtlcommon.hpp,行:137(在磁盘读取G1 E2中)(0, 0), 3000
问题分析与修复方案
1. 语法错误修正
原代码TRANSFORM块中YType的赋值语句多了一个多余逗号,会引发语法解析异常,间接触发数据读取错误:
// 错误写法 SELF.YType := IF(STD.STR.Find(LEFT.filename,'dog')<> 0,1,0),; // 修正后 SELF.YType := IF(STD.STR.Find(LEFT.filename,'dog')<> 0,1,0);
2. 数据越界问题处理
错误核心是部分记录的image字段长度不足51字节,却执行了LEFT.IMAGE[51..]的截取操作,触发磁盘读取越界的断言检查。需先判断数据长度,避免越界:
// 修正前 SELF.Image := LEFT.IMAGE[51..]; // 修正后:仅当数据长度足够时截取,否则返回空数据 SELF.Image := IF(LENGTH(LEFT.IMAGE) >= 51, LEFT.IMAGE[51..], DATA(''));
3. 字段赋值顺序修正
原代码最后执行SELF := LEFT会覆盖之前对RecID、YType、Image的赋值,必须调整顺序,先复制基础字段,再覆盖自定义字段。
完整修正代码
IMPORT STD; EXPORT File_Image := MODULE EXPORT imageRecord := RECORD STRING filename; DATA image; //First 4 bytes contain the length of the image data UNSIGNED8 RecPos{virtual(fileposition)}; END; EXPORT imageData := DATASET('~online::nt::skina', imageRecord, FLAT); //Add RecID and Dependent Data EXPORT imageRecordPlus := RECORD UNSIGNED1 RecID; UNSIGNED1 YType; imageRecord; END; EXPORT imageDataPlus := PROJECT(imageData, TRANSFORM(imageRecordPlus, SELF := LEFT, SELF.RecID := COUNTER, SELF.YType := IF(STD.STR.Find(LEFT.filename,'dog')<> 0,1,0), SELF.Image := IF(LENGTH(LEFT.IMAGE) >= 51, LEFT.IMAGE[51..], DATA('')) )); END;
内容的提问来源于stack exchange,提问作者Nishat Tasnim
相关产品推荐
相关产品推荐

