该段函数功能为 将字符串viewstring 从第二个字符开始分成6一个组的子字符串。 但是不定时的出现问题:viewstring有数据,而子字符串Temper[i】为空!?
for i:=1 to 12 do
begin
try
Temper[i] := Copy(viewstring, i*6+2 , 6);
ff := strtofloat(Temper[i]);
except
ff:= 0;
Form1.StatusBar1.Panels[1].Text:= 'error';
end;
for i:=1 to 12 do
begin
try
Temper[i] := Copy(viewstring, i*6+2 , 6);
ff := strtofloat(Temper[i]);
except
ff:= 0;
Form1.StatusBar1.Panels[1].Text:= 'error';
end;
paragraph, tail, count: integer;
begin
paragraph:=(Length(viewstring)- 1) div 6; tail:= (Length(viewstring)- 1) mod 6;
for cout:= 0 to paragraph - 1 do
begin
temper[i]:= Copy(viewstring, i* 6+ 2, 6);
ff:= StrToFloat(Temper[i]);
end;
if tail <> 0 then
begin
temper[paragraph]:= Copy(viewstring, (paragraph- 1)* 6, tail);
ff:= StrToFloat(temper[paragraph]);
end;
end;
这样试一下。
应改为
temper[paragraph]:= Copy(viewstring, paragraph* 6, tail);
for i:=1 to 12 do
begin
......
Temper[i] := Copy(viewstring, i*6+2 , 6);
......
这里的 i*6+2 就不正确了, 应该写成 i*6-4
我需要取得数据1234.5。 平时都是正常工作的,但是有时候会出现Temper[i]为空的现象(是在程序报错后在程序里面查看到的)。To jadeluo:
呵呵 谢谢你的细心, 我程序里面有-1的, 为了简化明了,使我粗心改错了
即便是定值,最好还是事先测定一下长度。而且这样的代码也有更好的适应性和安全性,也可以不依赖于具体的字串长度。如果非常确定字串的格式,那么可以在分割前,进行截断,即,你的例中,去掉开头和结尾的两个字符,然后再判定,分割,循环。
另外,最好,将数组的下标用[0..N]虽然O.P.的下标可以很灵活的应用,但是,从0开始的下标往往会有很多便利和好处。虽然这是遵循C的规范。但如我举的代码中,
for cout:= 0 to paragraph - 1 do
begin
temper[i]:= Copy(viewstring, i* 6+ 2, 6);
ff:= StrToFloat(Temper[i]);
end;
如果temper的下标是从0开始的,那么之需要如上所示,而不需要变成 i* 6- 4 这样容易费解(毕竟这有点倒序的意思)的方式表述下标了。
加之Windows是多C/C++的实现,其中很多控件结构中的数组都是以0下标开始的,所以还是养成以0最为数组初始下标比较好。
因为没有更多的上下文,我也只能按一般的状况猜测。