Всем добрый вечер. Не компилируеться програмка, зависает на процедуре сумирования элементов столбцов:
uses crt; const m=5; n=7; type realm = array[1..n] of real; var mA: array[1..m] of realm; mS: array[1..n] of real; tr: boolean; e, v: integer; rr, tt: integer;
procedure fill_matrix(var mF: array of realm;ll, mm: integer); var l, m: integer; begin randomize; for l:=1 to ll do begin for m:=1 to mm do begin mF[l, m]:=random(300)-150; end; end; end;
function suma_el_st(mT: array of realm;i, j: integer): real; var k: integer; suma: real; begin suma:=0; for k:=1 to i do suma:=suma+mT[k, j]; suma_el_st:=suma; end;
procedure perestanovka_st(mP: array of realm; x, y: integer); var f: integer; begin for f:=1 to m do begin mP[x, f]:=mP[x, f]+mP[y, f]; mP[y, f]:=mP[x, f]-mP[y, f]; mP[x, f]:=mP[x, f]-mP[y, f]; end; end;
begin fill_matrix(mA, m, n); {sort} repeat tr:=true; for e:=1 to n-1 do begin if suma_el_st(mA, e, n) < suma_el_st(mA, e, n+1) then begin perestanovka_st(mA, n, n+1); tr:=false; end; end; until tr;
for rr:=1 to n do begin for tt:=1 to m do begin write(mA[rr, tt]); end; writeln; end; end.
Это ты так пытаешься менять элементы местами? Смысл?
Второе - Array of ... индексируется с 0, а не с 1-цы...
Bokul
10.12.2006 4:21
Цитата
Не компилируеться програмка, зависает на процедуре сумирования элементов столбцов
Ну во-первых, если программа не компилируется, то она и зависнуть не может. Такая пакость происходит только в RunTime, т.е. уже после компиляции и запуска. Во-вторых, ошибка происходит в процедуре perestanovka_st. Ты хочешь поменять местами столбцы массива не вводя вспомогательную переменную, грубо говоря так: a:=a+b; b:=a-b'; a:=a-b; но паскаль не умеет отнимать и складывать массивы. У тебя есть два выхода: 1 Если программируешь на Fpc воспользуйся Перегрузкой операций 2 меняй их значения используя 3-ью переменную.
Это ты так пытаешься менять элементы местами? Смысл?
Второе - Array of ... индексируется с 0, а не с 1-цы...
Спасибо, не знал что арей оф индексируеться с [0]. А менять местами элементы просто нравиться без дополнительной переменной. Одного не понимаю, почему в 6-ом столбце все элементы всегда рвны 0 ?
Цитата(Bokul @ 9.12.2006 23:21)
Ну во-первых, если программа не компилируется, то она и зависнуть не может. Такая пакость происходит только в RunTime, т.е. уже после компиляции и запуска. Во-вторых, ошибка происходит в процедуре perestanovka_st. Ты хочешь поменять местами столбцы массива не вводя вспомогательную переменную, грубо говоря так: a:=a+b; b:=a-b'; a:=a-b; но паскаль не умеет отнимать и складывать массивы. У тебя есть два выхода: 1 Если программируешь на Fpc воспользуйся Перегрузкой операций 2 меняй их значения используя 3-ью переменную.
Где идет зависание "видно" при комбинацыи Ctrl + Break, и я не отнимаю масивы, а элементы. При вводе дополнительной переменной проблема осталась
Bokul
10.12.2006 4:50
Цитата
и я не отнимаю масивы, а элементы
Извиняюсь перепутал.
У тебя походу идет переполнение стека + почему ты в процедуре perestanovka_st переменную mP: array of realm не под Var поставил? Какая от нее тогда польза? Поставь Var, должно помочь.
TS*
10.12.2006 6:07
Цитата(Bokul @ 9.12.2006 23:50)
Извиняюсь перепутал. У тебя походу идет переполнение стека + почему ты в процедуре perestanovka_st переменную mP: array of realm не под Var поставил? Какая от нее тогда польза? Поставь Var, должно помочь.
Спсибо, точно вар забыл . А как в даном случае избаится от переполнения стека?
Алена
10.12.2006 6:13
А каким образом у тебя возникает переполнение? Где именно? При таких маленьких размерах массивов его быть просто не должно, кроме того, Var - это передача "по ссылке", что не приближает Stack Overflow, а наоборот, отдаляет его...
TS*
10.12.2006 6:45
Цитата(Алена @ 10.12.2006 1:13)
А каким образом у тебя возникает переполнение? Где именно? При таких маленьких размерах массивов его быть просто не должно, кроме того, Var - это передача "по ссылке", что не приближает Stack Overflow, а наоборот, отдаляет его...
Переполнение стека выкидает у Bokula на компиляторе, у меня програмка раз запускаеться и исполняеться, раз запускаеться и зависает на функции сумирования или процедуре подсчета столбцов
Алена
10.12.2006 13:37
TS*, ты выбрал не самый правильный способ представления данных... У тебя в процедуру перестановки передается массив строк, а работать тебе нужно с массивом столбцов...
Но поскольку телепатией я не владею, и что у тебя N - число строк или столбцов - не знаю( а гадать не буду) - то жду твоего ответа...
TS*
10.12.2006 16:45
Цитата(Алена @ 10.12.2006 8:37)
TS*, ты выбрал не самый правильный способ представления данных... У тебя в процедуру перестановки передается массив строк, а работать тебе нужно с массивом столбцов...
Но поскольку телепатией я не владею, и что у тебя N - число строк или столбцов - не знаю( а гадать не буду) - то жду твоего ответа...
столбцов
-xxx-
10.12.2006 16:48
напиши в конце как получилась гтовая прога плз
TS*
10.12.2006 19:04
uses crt; const m=5;{stroki} n=7;{stolbcu} type realm = array[1..n] of real; var mA: array[1..m] of realm; mS: array[1..n] of real; tr: boolean; e, v: integer; rr, tt: integer;
procedure fill_matrix(var mF: array of realm;ll, mm: integer); var l, m: integer; begin randomize; for l:=0 to ll-1 do begin for m:=0 to mm-1 do begin mF[l, m]:=random(300)-150; end; end; end;
function suma_el_st(mT: array of realm;i, j: integer): real; var k: integer; suma: real; begin suma:=0; for k:=0 to i-1 do suma:=suma+mT[k, j]; suma_el_st:=suma; end;
procedure perestanovka_st(var mP: array of realm; x, y: integer); var f: integer; ss: real; begin for f:=0 to m-1 do begin ss:=mP[x, f]; mP[x, f]:=mP[y, f]; mP[y, f]:=ss; end; end;
begin fill_matrix(mA, m, n); {sort} repeat tr:=true; for e:=1 to n-1 do begin if suma_el_st(mA, e, n) < suma_el_st(mA, e, n+1) then begin perestanovka_st(mA, n, n+1); tr:=false; end; end; until tr;
writeln;writeln;writeln; for rr:=1 to n do begin for tt:=1 to m do begin write(mA[rr, tt]); end; writeln; end; end.
uses crt; const m=5; n=7; { columns count } type realm = array[1..m] of real; var mA: array[1..n] of realm; tr: boolean; curr_col, curr_line: integer;
e, v: integer;
procedure fill_matrix(var mF: array of realm; const num_lines, num_columns: integer); var lines, cols: integer; begin randomize; for cols := 0 to num_columns - 1 do for lines := 1 to num_lines do begin mF[cols][lines] := random(300)-150; end;
end;
function suma_el_st(const mT: array of realm; const col_to_sum, num_lines: integer): real; var k: integer; suma: real; begin
suma:=0; for k := 1 to num_lines do suma:=suma+mT[col_to_sum - 1][k]; suma_el_st:=suma;
end;
procedure perestanovka_st(var mP: array of realm; const change_from, change_to: integer); var f: integer; T: realm; begin T := mP[change_from - 1]; mP[change_from - 1] := mP[change_to - 1]; mP[change_to - 1] := T; end;
begin fill_matrix(mA, m, n); writeln; writeln; for curr_line := 1 to m do begin for curr_col := 1 to n do write(mA[curr_col][curr_line]:8:3); writeln; end;
{sort} repeat tr:=true; for e:=1 to n-1 do begin if suma_el_st(mA, e, m) < suma_el_st(mA, e+1, m) then begin perestanovka_st(mA, e, e+1); tr:=false; end; end; until tr;
writeln; writeln; for curr_line := 1 to m do begin for curr_col := 1 to n do write(mA[curr_col][curr_line]:8:3); writeln; end; readln; end.
TS*
11.12.2006 7:23
Цитата(Алена @ 10.12.2006 15:35)
TS* Не то... Смотри, что она у меня выводит:
Спасибо, логично названные переменные, а то видимо где то перепутал столбцы со строками А какое преимущество дает const в параметрах функцый?
Bokul
11.12.2006 7:50
Цитата
А какое преимущество дает const в параметрах функцый?
Есть два преимущества: 1 предохраняет от случайного изменения переменной. 2 экономит память в стеке. Без const процедура сначала скопирует переменную себе в стек, и только потом начнет работать с ней, а так она сазу работает с указателем на настоящую переменную, защищая данные расположены по адресу этого указателя от изменений.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.