久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

WINCC腳本字符串處理總結(jié)

 紫殿 2013-02-01
組態(tài)注意事項(xiàng): 下面說明了關(guān)于在C腳本中處理字符串時(shí)最重要的問題,。必須考慮性能和穩(wěn)定性因素,。在不一致時(shí),,內(nèi)存區(qū)可能被覆寫,,從而使系統(tǒng)鎖死 ,。最壞的情況出現(xiàn)在字符指針。如果指針設(shè)計(jì)不當(dāng),,內(nèi)存區(qū)可能被覆寫,。下面是有關(guān)錯(cuò)誤和正確組態(tài)的四個(gè)樣例,。 

沒有預(yù)留內(nèi)存區(qū): char *a; a=GetTagChar("Tag name"); strcat(a,"xyz"); //有一個(gè)連接到文本的指針“a” //沒有預(yù)留內(nèi)存區(qū)

  • 正確: 通過查詢有效的指針將字符串正確復(fù)制到預(yù)定義的緩沖器中(來自描述WinCC信息系統(tǒng)的樣例):  
  •  char* pszValue = NULL; 
  •  char szValue[101]; 
  •  pszValue = GetTagChar("Varname"); //讀標(biāo)簽值并將其緩存到pszValue。/*如果返回一個(gè)有效值,,將該函數(shù)返回值存入局部字符串szValue中,。最多保存100個(gè)字符。*/
  •  if(pszValue !=NULL) //!=NULL是必須執(zhí)行的檢查 //以便保證沒有NULL指針提交 
  • strncpy(szValue,pszValue,100); … 
  • }
  •   else 
  • printf("Pointer invalid\r\n"); //使用了無效值
  • }
 
沒有預(yù)留足夠的內(nèi)存區(qū): 通常,由于預(yù)留的內(nèi)存區(qū)太小導(dǎo)致內(nèi)存被覆寫,。在這些情況下,通常在C中進(jìn)行字符串處理時(shí),文本結(jié)尾的一個(gè)附加字符必須始終被保留,。也就是說,,必須要比被處理的文本長度多預(yù)留出一個(gè)字符。

  • 錯(cuò)誤: char a[4]; strcpy(a,"1234"); //總是有4個(gè)字符被復(fù)制到一個(gè)4字符的數(shù)組中,; // 錯(cuò)誤:文本的結(jié)尾字符被遺漏  
  • 正確: char a[5]; //內(nèi)存區(qū)的大小必須 //總是比被復(fù)制的文本多一個(gè)字符 strcpy(a,"1234");

字符*作為項(xiàng)目函數(shù)的返回值無效: 如果在項(xiàng)目函數(shù)中返回“char*”,,必須用“SysMalloc”預(yù)留相應(yīng)的內(nèi)存區(qū),。如果內(nèi)存區(qū)是通過字符…[x]預(yù)留的,,像“錯(cuò)誤”例子中所描述那樣,那么當(dāng) 退出項(xiàng)目函數(shù)時(shí)內(nèi)存區(qū)將立刻被釋放,因此在進(jìn)行進(jìn)一步的動(dòng)作處理時(shí)將傳遞的是無效的值,。

  • 錯(cuò)誤:
  •  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;
  •  }

沒有Null指針檢索的無效字符串拷貝(導(dǎo)致日志文件 - WinCC_Sys_xx.LOG中的“ExecuteError in Action” ) 當(dāng)動(dòng)作在執(zhí)行并且圖像被取消選定(目標(biāo)未發(fā)現(xiàn))時(shí)此條目出現(xiàn)在WinCC_Sys.Log中

  • 錯(cuò)誤: 
  • 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);
  •  }

為了避免無意的復(fù)制太多的字符到“sign” (例如在后來作改動(dòng)時(shí)) ,,并為了避免當(dāng)取消選定圖像時(shí)由于“strcpy()”導(dǎo)致的異常,在“strncpy()”復(fù)制到Null-指針之前應(yīng)該使用和檢查“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() !\r\n");
  •  }

警告: 函數(shù)strcpy()將“Source”指針?biāo)赶虻陌┪沧址?\0’的字符串復(fù)制到“Target”指針指向的位置。字符串不能 重疊,,并且目標(biāo)必須足夠大 (源字符串長度 + 1,因?yàn)橛?\0’),。函數(shù)strncpy()除了僅復(fù)制起始的n個(gè)字節(jié)外其余與函數(shù)strcpy()相同,。如果起始的n個(gè)字節(jié)中沒有'\0’,,結(jié)果將不是以'\0’結(jié)束,。這將導(dǎo)致未定義的系統(tǒng)狀態(tài),。



用strcat函數(shù)來連接字符串,。
假設(shè)有四個(gè)變量tag1,,tag2,tag3,,tag4都是8位文本字符變量,。把tag1~tag3連接起來顯示在tag4中,。測試:先建立這四個(gè)變量,然后在wincc的畫面中建立四個(gè)輸入輸出域,,分別連接tag1~tag4,建立一個(gè)按鈕,,在按鈕的c動(dòng)作中:
char buffer[256]="";
strcat(buffer,GetTagChar("tag1"));
strcat(buffer,GetTagChar("tag2"));
strcat(buffer,GetTagChar("tag3"));
SetTagChar("tag4",buffer);

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多