组态注意事项:
下面说明了关于在C脚本中处理字符串时最重要的问题。必须考虑性能和稳定性因素。在不一致时,内存区可能被覆写,从而使系统锁死 。
最坏的情况出现在字符指针。如果指针设计不当,内存区可能被覆写。下面是有关错误和正确组态的四个样例。n
No. |
描述: |
1 |
没有预留内存区:
char *a; a=GetTagChar("Tag name");
strcat(a,"xyz"); //有一个连接到文本的指针“a” //没有预留内存区n
|
2 | 没有预留足够的内存区: 通常,由于预留的内存区太小导致内存被覆写。在这些情况下,通常在C中进行字符串处理时,文本结尾的一个附加字符必须始终被保留。也就是说,必须要比被处理的文本长度多预留出一个字符。 n
|
3 | 字符*作为项目函数的返回值无效: 如果在项目函数中返回“char*”,必须用“SysMalloc”预留相应的内存区。如果内存区是通过字符...[x]预留的,像“错误”例子中所描述那样,那么当 退出项目函数时内存区将立刻被释放,因此在进行进一步的动作处理时将传递的是无效的值。
- 错误:
char* new_function_1() { char myString[100];
sprintf(myString,"VarName%d", GetTagWord("processvariable")); return myString; }
- 正确:
char* new_function_1() { char* myString;
myString = SysMalloc(100); sprintf(myString,"VarName%d", GetTagWord("processvariable")); return myString; } |
4 | 没有Null指针检索的无效字符串拷贝(导致日志文件 - WinCC_Sys_xx.LOG中的“ExecuteError in Action” ) 当动作在执行并且图像被取消选定(目标未发现)时此条目出现在WinCC_Sys.Log中
- 错误:
char sign[5]; strcpy(sign,GetText(lpszPictureName,lpszObjectName)); if (0==strcmp(sign,"+")) { SetText(lpszPictureName,lpszObjectName,"-"); SetVisible(lpszPictureName,"B5",TRUE); } else { SetText(lpszPictureName,lpszObjectName,"+"); SetVisible(lpszPictureName,"B5",FALSE); }
为了避免无意的复制太多的字符到“sign” (例如在后来作改动时) ,并为了避免当取消选定图像时由于“strcpy()”导致的异常,在“strncpy()”复制到Null-指针之前应该使用和检查“strncpy()” 。
- 正确:
char sign[5], *myPointer; myPointer = GetText(lpszPictureName,lpszObjectName);
if(myPointer != NULL) { strncpy(sign, myPointer, 4); if (0==strcmp(sign,"+")) { SetText(lpszPictureName,lpszObjectName,"-"); SetVisible(lpszPictureName,"B5",TRUE); } else { SetText(lpszPictureName,lpszObjectName,"+"); SetVisible(lpszPictureName,"B5",FALSE); } } else { printf("Error in GetText() !rn"); } 警告: 函数strcpy()将“Source”指针所指向的包含末尾字符‘0’的字符串复制到“Target”指针指向的位置。字符串不能 重叠,并且目标必须足够大 (源字符串长度 + 1,因为有‘0’)。 函数strncpy()除了仅复制起始的n个字节外其余与函数strcpy()相同。如果起始的n个字节中没有‘0’,结果将不是以‘0’结束。这将导致未定义的系统状态。 |
关键字
程序设计注意事项,普遍用户错误
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc330230.html