Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
2 / 2 / 2
Регистрация: 04.04.2011
Сообщений: 75
1

Как сделать чтобы результатом функции были три массива?

23.04.2011, 03:38. Просмотров 2097. Ответов 8
Метки нет (Все метки)

Помогите пожалуйста. Я пишу программу по разряженным матрицам, особо вникать не надо, просто скажите пожалуйста почему выдает ошибку. matrixtype содержит три массива row_ptr, val, col_ind.
Pascal
1
2
3
4
5
6
7
function Insert(x,y,z:integer; var matrix:matrixtype):matrixtype;
var i,j,a:integer;
begin
for i:=matrix.row_ptr[x] to matrix.row_ptr[x+1]-1 do begin
if (FindByMN(x,y)<>0) and (matrix.col_ind[i]=y) then
insert.val[i]:=z;
end;
вот чтобы выводил эту функцию в основной программе:
Pascal
1
write(Insert(2,2,7,matrix));
выдает ошибку на write(Insert(2,2,7,matrix))cant read or write variables of this type. Помогите плз, программа для зачета!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.04.2011, 03:38
Ответы с готовыми решениями:

Построить график функции f (x) таким образом, чтобы были видны все корни функции
1. Построить график функции f(x) таким образом, чтобы были видны все корни функции. 2. Графически...

Построить график функции f (x) таким образом, чтобы были видны все корни функции
ПОРЯДОК ВЫПОЛНЕНИЯ ЛАБОРАТОРНОЙ РАБОТЫ 1. Построить график функции f(x) таким образом, чтобы были...

Как сделать так, чтобы функции были не вложенными?
получается так, что сначала у меня идет функция int main(), потом int sum, и потом int maxx. Они...

Как сделать, чтобы у определенного пользователя, были доп. функции?
Имеется сайт, сайт с различными учебными материалами. Преподаватель сказал, чтобы у него в профиле,...

8
13038 / 5824 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
23.04.2011, 05:32 2
Можно работать через указатели.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
program Project1;
 
const
  N = 7;
type
  TArr = array[1..N] of Integer;
 
  TRec = record
    Arr1, Arr2, Arr3 : TArr;
  end;
 
  TPRec = ^TRec;
 
function GetPRec : TPRec;
var
  PRec : TPRec;
  i : Integer;
begin
  New(PRec);
 
  Randomize;
  for i := 1 to N do begin
    PRec^.Arr1[i] := Random(10);
    PRec^.Arr2[i] := 10 + Random(10);
    PRec^.Arr3[i] := 20 + Random(10);
  end;
 
  GetPRec := PRec;
end;
 
var
  PRec : TPRec;
  i : Integer;
begin
  PRec := GetPRec;
 
  Writeln('Arr1:');
  for i := 1 to N do begin
    if i > 1 then Write(#9);
    Write(PRec^.Arr1[i]);
  end;
  Writeln;
 
  Writeln('Arr2:');
  for i := 1 to N do begin
    if i > 1 then Write(#9);
    Write(PRec^.Arr2[i]);
  end;
  Writeln;
 
  Writeln('Arr3:');
  for i := 1 to N do begin
    if i > 1 then Write(#9);
    Write(PRec^.Arr3[i]);
  end;
  Writeln;
 
  (*Удаление структуры из памяти.*)
  Dispose(PRec);
 
  Readln;
end.
1
2 / 2 / 2
Регистрация: 04.04.2011
Сообщений: 75
23.04.2011, 18:03  [ТС] 3
спасибо большое что уделил время! Но просто я уже написал 250 строк программы с этими массивами, и не хочется все менять)
0
13038 / 5824 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
23.04.2011, 19:00 4
Цитата Сообщение от Rashmash Посмотреть сообщение
function Insert(x,y,z:integer; var matrix:matrixtype):matrixtype;
...
write(Insert(2,2,7,matrix));
Как я понял, массив или группу массивов надо распечатать? Для этого надо специальный код писать - т. е. цикл по элементам массива с последовательным вызовом Write() или Writeln().
Кроме того, что касается возвращения группы масивов из функций, чтобы указатели в явном виде не применять, лучше применить параметр со спецификатором var. Тем более, этот механизм уже использован в коде. Т. е., через этот параметр передать группу массивов процедуре и в теле процедуры обработать эти массивы. Группу массивов можно объединить в переменной типа record. Здесь зависит от построения алгоритма и целей, которые достигаются в программе.
0
2 / 2 / 2
Регистрация: 04.04.2011
Сообщений: 75
23.04.2011, 19:45  [ТС] 5
да спасибо я вот попробовал поменять, но почему то стало выдавать другую ошибку. Смотри как я сделал
Pascal
1
2
3
4
function Insert(x,y,z:integer):matrixtype; 
...
Insert:=matrix; {тело основной программы уже}
write(Insert(2,2,7))
но теперь на insert:=matrix выдает ошибку wrong number of parameters specified for call to "insert". Да именно в matrix я записал три массива через рекорд. И просто теперь этот insert по идее как я думаю должен считать эту матрицу из основной программы. Матрица и инсерт одного типа matrixtype.
0
13038 / 5824 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
23.04.2011, 20:38 6
Pascal
1
function Insert(x,y,z:integer):matrixtype;
Функции, возвращающие сложные (составные) типы - записи, массивы - такое возможно в Delphi. В Pascal это не сработает. Вернуть запись или массив в качестве значения функции в Pascal можно только через указатели. - Так как я в прежних постах показал. Либо, без указателей, передавать/возвращать сложные данные можно через параметр со спецификатором var.
И такая конструкция не сработает:
Pascal
1
write(Insert(2,2,7))
Не умеют процедуры Write() и Writeln() распечатывать данные сложных типов. Чтобы распечатать значения массива или записи надо вручную реализовывать распечатку каждого элемента, входящего в структуру.
1
2 / 2 / 2
Регистрация: 04.04.2011
Сообщений: 75
23.04.2011, 20:59  [ТС] 7
А ты уверен, что нельзя чтобы функция возвращала массив? я уже написал одну функцию с возвращающим результатом массива, так она вроде хорошо работает и выводится отлично. Вот:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
type vecttype=array [1..30] of integer;
...
function vector(n:integer;matrix:matrixtype;vect:vecttype):vecttype;
var
        sum:integer;
        i1,j1,a1,b1:integer;
        res:vecttype;
begin
        for i1:=1 to n do begin
        sum:=0;
                for b1:=1 to n do begin
                        if matrix.row_ptr[i1]<>0 then begin
                        a1:=i1;
                        repeat a1:=a1+1 until ((matrix.row_ptr[a1]<>0) or (a1>n));
                        if a1>n then a1:=matrix.col_ind[0] else a1:=matrix.row_ptr[a1]-1;
                        for j1:=matrix.row_ptr[i1] to a1 do
                                if matrix.col_ind[j1]=b1 then begin
                                sum:=sum+matrix.val[j1]*vect[matrix.col_ind[j1]];
                                end;
                        end;
                end;
                res[i1]:=sum;
        end;
        vector:=res;
end;
...
writeln('Enter ',n,' elemenst of the vector:');
        for i:=1 to n do
        read(vect[i]);
for i:=1 to n do
        write (vector(n,matrix, vect)[i]:5);
0
13038 / 5824 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
23.04.2011, 21:15 8
В Borland Pascal 7.0 функция не может возвращать сложные типы - массивы или записи. Возможно в других Pascal может - например, Pascal ABC, Free Pascal и др.
1
2 / 2 / 2
Регистрация: 04.04.2011
Сообщений: 75
23.04.2011, 21:22  [ТС] 9
Ну да у меня free pascal. Вообщем спасибо тебе большое и искренние за помощь!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2011, 21:22

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как сделать, чтобы элементы динамического массива, которые равны 0, были размещены в конце массива?
Нужно упорядочить массив по возрастанию и сделать, чтобы элементы, которые равны 0, были в конце....

Как сделать ,чтобы строки двумерного массива были кратные двум?
Как сделать ,чтобы строки двумерного массива были кратные двум?То есть когда я заполняю массив ,...

Как сделать, чтобы все элементы массива, встречающиеся более 2х раз были удалены
Как сделать, чтобы все элементы массива, встречающиеся более 2х раз были удалены и выводился размер...

Массив: как сделать так, чтобы рандомно выбирались только те элементы массива, которые не были выбраны раньше?
В общем, из массива рандомно выбирается элемент, как сделать так, чтобы выбирались только те,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.