Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Pascal]массивами


Автор: AntonPavlov 23.4.2011, 02:17
Нужно сделать следующую вещь: пройтись по элементам массива, каждый возвести в квадрат, и перемножать их (элементы). Так делаю
Код

const
 C: array[1..4] of real = (1,2,3,4);

function CountMass(arr: array of real): real;
    var
    n: integer;
    op: real;
    i: integer;
begin
    op := 1;
    for i := 1 to 4 do op := arr[i] * arr[i] * op;
    CountMass:= op;
    end;

begin
WriteLn(CountMass(c));
readln;
end.


Выдает нулевой результат...в чем проблема? 

Автор: v4v4n 23.4.2011, 10:12
Попробуй так
Код

Type
    TArr = array[1..4] of real;
const
 C: TArr = (1,2,3,4);

function CountMass(arr: TArr): real;
    var
    n: integer;
    op: real;
    i: integer;
begin
    op := 1;
    for i := 1 to 4 do op := arr[i] * arr[i] * op;
    CountMass:= op;
    end;

begin
WriteLn(CountMass(c));
readln;
end.

Автор: AntonPavlov 23.4.2011, 10:48
Все, спасибо большое, вопрос решен!Но вот только почему же не работал мой код? Все же одно и тоже, по сути-то....

Автор: leniviy 23.4.2011, 11:28
потому что при передаче в функцию не передаётся, что он стартует с единицы.
"array of real" это по умолчанию "array[0..?]" of real;
arr[0] = 1, arr[3] = 4, а arr[4]  был по случайности равен 0.

Автор: volvo877 23.4.2011, 11:37
Цитата(AntonPavlov @  23.4.2011,  09:48 Найти цитируемый пост)
Но вот только почему же не работал мой код?
Твой код работал, но не выдавал правильный результат. А все потому, что ты не зашел в опции компилятора и не включил там Range Check. Тогда бы программа действительно не работала. Поверь, лучше получить вылет по ошибке, и, зная, что она есть, определить место ее возникновения (и компилятор тебе в этом помогает, показывает точное место ошибки), чем получить какой-то результат, возможно, при одних запусках правильный (по счастливой случайности arr[4]=1), а при других - нет.

Не отключай никогда контроль границ, переполнения и стека. Программа должна отлаживаться, когда эти опции во включенном состоянии.

Автор: v4v4n 23.4.2011, 13:24
Цитата(AntonPavlov @  23.4.2011,  12:48 Найти цитируемый пост)
Но вот только почему же не работал мой код? Все же одно и тоже, по сути-то.... 

Потому что тип "массив в программе" не совпадает с типом "массив в функции". Их нужно описывать одинаково, иначе могут возникать несовпадения. Как, например, здесь были несовпадения диапазона индексов 1..4 и 0..3.
То есть можно было исправить программу так 
Код


const
 C: array[1..4] of real = (1,2,3,4);

function CountMass(arr: array of real): real;
    var
    n: integer;
    op: real;
    i: integer;
begin
    op := 1;
    for i := 0 to 3 do op := arr[i] * arr[i] * op;
    CountMass:= op;
    end;

begin
WriteLn(CountMass(c));
readln;
end.

Или, как предлагали выше, положиться на компилятор - включить опцию Range Checking.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)