添加更多变量时为什么sscanf会崩溃?

时间:2015-04-11 23:51:32

标签: pascal lazarus freepascal scanf

我有一个字符串,在开头有一个单词(我想忽略),然后是一些我希望存储在数组中的数字。不是全部,只是一些。

我使用像这样的sscanf

var
    x: integer;
    y: array[0..19] of integer;
    s: pchar;
begin
    ...
    sscanf(dataline, "%s %d %d %d %d %d %d %d %d %d %d %d",
            [s, @x, @y[0], @y[1], @y[2], @y[3], @y[4],
                    @y[5], @y[6], @y[7], @y[8], @y[9]]);
    ...
end;

没关系。但如果我想再阅读一次

var
    x: integer;
    y: array[0..19] of integer;
    s: pchar;
begin
    ...
    sscanf(dataline, "%s %d %d %d %d %d %d %d %d %d %d %d %d",
            [s, @x, @y[0], @y[1], @y[2], @y[3], @y[4],
                    @y[5], @y[6], @y[7], @y[8], @y[9], @y[10]]);
    ...
end;

然后我收到一个运行时错误:“项目myproject在地址82E37E1处抛出了类外部:SIGSEGV'的异常。”

任何可能出错的想法?非常感谢你。

我在Linux Mint 17.1 32bits中使用lazarus 1.2.4和fpc 2.6.4。

编辑:正如Abelisto建议的那样,问题是关于s,我将它从PChar改为String并用一些空格初始化它,一切正常。代码读取TMemo中的行以获取数据,然后创建一个表(在TListView中)添加值,然后添加最小值,平均值和最大值。请注意,1023是可能的最大值。

procedure TfMain.bGetDataClick(Sender: TObject);
const
    dataPoints = 20;
var
    it: TListItem;
    n, i, x, avg, min, max: integer;
    y: array[0 .. dataPoints - 1] of integer;
    dataLine: string;
    s: string = '                ';
begin
    datalist.BeginUpdate;
    datalist.Clear;
    n := -1;
    while n < cSerIn.Lines.Count do
        begin
        Inc(n);
        dataLine := cSerIn.Lines[n];
        sscanf(dataLine, '%s %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d',
               [@s, @x, @y[0], @y[1], @y[2], @y[3], @y[4],
                        @y[5], @y[6], @y[7], @y[8], @y[9],
                        @y[10], @y[11], @y[12], @y[13], @y[14],
                        @y[15], @y[16], @y[17], @y[18], @y[19]]);

        it := dataList.Items.Add;
        it.Caption := IntToStr(x);
        avg := 0;
        min := 1023;
        max := 0;
        for i := 0 to dataPoints-1 do
            begin
            it.SubItems.Add(IntToStr(y[i]));
            avg += y[i];
            if y[i] < min then min := y[i];
            if y[i] > max then max := y[i];
            end;
        avg := avg div dataPoints;
        it.SubItems.Insert(0, IntToStr(max));
        it.SubItems.Insert(0, IntToStr(avg));
        it.SubItems.Insert(0, IntToStr(min));
        end;
    datalist.EndUpdate;
end;

另外我意识到我的fpc版本是2.6.4,而不是2.6.0。谢谢大家的帮助!

1 个答案:

答案 0 :(得分:0)

program project1;

uses
    sysutils;
const
    CArrCnt = 19;
var
    x: integer;
    y: array[0..CArrCnt] of integer;
    s: string; // changes here
    dataline: string;
    i: Integer;

begin
    dataline := 'aaa 123 0 1 2 3 4 5 6 7 8 9 10 11';
    s := '          '; // changes here
    sscanf(dataline, '%s %d %d %d %d %d %d %d %d %d %d %d %d %d',
        [@s, @x, @y[0], @y[1], @y[2], @y[3], @y[4], @y[5], 
                 @y[6], @y[7], @y[8], @y[9], @y[10], @y[11]]);
    WriteLn(s);
    Writeln(x);
    for i := 0 to CArrCnt do
        WriteLn(y[i]);
    ReadLn;
end.

工作正常。

您必须显示更多程序代码。例如,我们不知道是否分配了s: pchar;的内存。

BTW:Win7,FPC 3.1.1 32位。