如何修复运行时错误201 [英] How to fix run-time error 201

查看:327
本文介绍了如何修复运行时错误201的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请帮帮我. 我不知道如何解决此错误.

help me, please. I don't know how to fix this error.

Program Polynomial;

type
    arrayOfInt = Array[1..21] of Integer;
    biggerArrayOfInt = Array[1..41] of Integer;

function isNumber(c : Char): Boolean;
var
    res : Boolean;
    code : Longint;
begin
    code := Ord(c);
    if ((code > 47) AND (code < 58)) then begin
        res := true
    end
    else
    begin
        res := false;
    end;
    isNumber := res;
end;

function parsePolynomial(polynomial : String): arrayOfInt;
var
    coeficients : Array[1..21] of Integer;
    number : Integer;
    coef : Integer;
    tmp : String;
    i, j : Integer;
    positive : Boolean;
    numberPosition, numberLength : Integer;
    expectX : Boolean;
begin
    i := 1;
    for j:=1 to Length(coeficients) do
    begin
        coeficients[j] := 0;
    end;
    while (true) do
    begin
        coef := 0;
        number := 0;
        positive := true;
        expectX := true;
        if(polynomial[i] = '-') then begin
            positive := false;
            i := i + 1;
        end;
        if(polynomial[i] = '+') then begin
            i := i + 1;
        end;
        if(isNumber(polynomial[i])) then begin
            numberPosition:= i;
            while (isNumber(polynomial[i])) do
            begin
                i := i + 1;
            end;
            tmp := Copy(polynomial, numberPosition, i - numberPosition);
            Val(tmp, number);
            if(not positive) then begin
                number := number * -1;
            end;

            if ((not(polynomial[i] = '*')) OR (i > length(polynomial))) then
                    begin
                expectX := false;
            end
            else
            begin
                i:= i + 1;
            end;
        end
        else
        begin
            if(positive) then begin
                number := 1;
            end
            else
            begin
                number := -1;
            end;
        end;

        if (expectX) then begin
            if(not(polynomial[i] = 'x')) then begin
                write('Bad input!');
                exit;
            end
            else
            begin
                i := i + 1;
                if (polynomial[i] = '^') then begin
                    i := i + 1;
                    if (not isNumber(polynomial[i])) then begin
                        write('Bad input!');
                        exit;
                    end;
                    numberPosition:= i;
                    while (isNumber(polynomial[i])) do
                    begin
                        i := i + 1;
                    end;
                    tmp := Copy(polynomial, numberPosition, i - numberPosition);
                    Val(tmp, coef);
                end
                else
                begin
                    coef := 1;
                end;
            end;
        end;

        coeficients[coef + 1] := number;

        if ((length(polynomial)) - 1 < i) then begin
            break;
        end;
    end;
   parsePolynomial := coeficients;
end;

function sumPolynomial(polynomial1, polynomial2 : array of Integer): arrayOfInt;
var
    coeficients : Array[1..21] of Integer;
    i : Integer;
begin
    for i := Length(polynomial1) downto 0 do
    begin
        coeficients[i+1] := polynomial1[i] + polynomial2[i];
    end;
    sumPolynomial := coeficients;
end;

function productOfPolynomial(polynomial1, polynomial2 : array of Integer): biggerArrayOfInt;
var
    coeficients : Array[1..41] of Integer;
    i, j : Integer;
begin
    for j:=1 to Length(coeficients) do
    begin
        coeficients[j] := 0;
    end;
    for i := Length(polynomial1) downto 0 do
    begin
        for j := Length(polynomial2) downto 0 do
        begin
                coeficients[i+j+1] := coeficients[i+j+1] + polynomial1[i] * polynomial2[j];
        end;
    end;
    productOfPolynomial := coeficients;
end;

function substractOfPolynomial(polynomial1, polynomial2 : array of Integer): arrayOfInt;
var
    coeficients : Array[1..21] of Integer;
    i : Integer;
begin

    for i := Length(polynomial1) downto 0 do
    begin
        coeficients[i+1] := polynomial1[i] - polynomial2[i];
    end;

   substractOfPolynomial := coeficients;
end;


procedure printPolynomial(polynomial: array of Integer);
var 
    i : Integer;
    isFirst : Boolean;
    isZero : Boolean;
begin
    isFirst := true;
    isZero := true;
    for i := length(polynomial) downto 0 do
    begin
        if polynomial[i] <> 0 then begin
            isZero := false;
            if((not isFirst) AND (polynomial[i] > 0)) then begin
                write('+');
            end;
            if((polynomial[i] = -1)) then begin
                write('-');
            end;
            if(((polynomial[i] > 1) OR (polynomial[i] < -1)) OR ((i = 0) AND not(polynomial[i] = 0))) then begin
                write(polynomial[i]);
                if((i > 0)) then begin
                    write('*');
                end;
            end;

            if(i > 0) then begin
                write('x');
                isFirst := false;
                if (i > 1) then begin
                    write('^', i);
                end;
            end;
            write()
        end;
    end;
    if (isZero) then begin
        write(0);
    end;

end;

var
    polynomial1, polynomial2, result: Array[1..21] of Integer;
    polynomialInput: String;

begin
    readln(polynomialInput);
    polynomial1 := parsePolynomial(polynomialInput);

    readln(polynomialInput);
    polynomial2 := parsePolynomial(polynomialInput);

    printPolynomial(sumPolynomial(polynomial1, polynomial2));
    writeln('');
    printPolynomial(substractOfPolynomial(polynomial1, polynomial2));
    writeln('');
    printPolynomial(productOfPolynomial(polynomial1, polynomial2));
end.

推荐答案

运行时错误201表示范围检查错误.快速浏览源代码会使我怀疑某个操作在某处返回的值不适合整数范围(默认情况下,在FreePascal中为-32786..32767).最简单的解决方案是使用较大的数据类型,例如longint(大约在-2 * 10 ^ 9..2 * 10 ^ 9之间)或int64(〜9 * 10 ^ 18..9 * 10 ^ 18)之间.

Runtime error 201 means range check error. Quick glance over the source code makes me suspect that somewhere some operation returns a value that doens't fit in integer range (-32786..32767 in FreePascal by default). Easiest solution would be to use a larger datatype for example longint (roughly between -2*10^9..2*10^9) or int64 (~9*10^18..9*10^18).

如果使用命令行编译器,则使用-gl命令行选项将在运行时错误回溯中显示行号.这样可以使您更轻松地找出问题所在.

If you use command line compiler using -gl command line option would display line numbers in run-time error backtraces. This would make it easier for you to pinpoint the issue.

这篇关于如何修复运行时错误201的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆