|
Вопрос # 1 710/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Помогите, пожалуйста.
Я пишу дипломку на Delphi.
Программа должна находить обратную матрицу, произведение матриц, произведение матрицы на вектор и интегралы от введенных матриц. Ввод матрицы осуществляется поэлементно нажатием на кнопку(не через таблицу).
Тип элементов массива - Extended. На другие типы программа ругается и не хочет работать.
Когда пыталась перемножить матрицу на вектор, программа выдала ошибку про переполнение стека. В интернете нашла, что лучше использовать указатель на массив при выполнении таких операций, тем более, что Extended - самый "тяжелый" тип.
И теперь я не могу корректно работать с указателями на массив, программа выдает:project project1.exe raised exception class EAccessViolation with message 'Access violation at address in module' и т.д.
Помогите преодолеть эту ошибку, пожалуйста.
Заранее благодарю всех экспертов
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
Приложение: Переключить в обычный режим- unit Unit11;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, ExtCtrls, ComCtrls, jpeg, det_txt,math;
-
- type
- Float = Double;
- /////////////
- matr1 = array[1..poryadok_matr] of Float;
- matr2 = array[1..poryadok_matr,1..poryadok_matr] of Float;
- ////////////
-
- TFunc = record
- Ffunc_t:string;
- Fkoef_t:string;
- Fkoef:Float;
- Fstep_t:string;
- Fstep:integer;
- end;
- TMatr1_func = array{[1..poryadok_matr]} of TFunc;
- TMatr2_func = array[1..poryadok_matr,1..poryadok_matr] of TFunc;
- {..................................}
- private
- { Private declarations }
- procedure CreateParams(var Params: TCreateParams); override;
- public
- { Public declarations }
- end;
- var
- Form_raschet_x: TForm_raschet_x;
- code,razmer_sist,i,j,i_x_1:integer;
- x,f,x_1,umn_rez,vekt_rez:^matr1;
- str,vektor_t,buf_B:^matr1_t;
- b_dop,b_1,b,a:^matr2;
- razmer_i, razmer_j, razmer_i_1,razmer_j_1,im,jm:integer;
- x_t,f_t:^TMatr1_func;
- a_t:^TMatr2_func;
- b_t:^matr2_t;
- implementation
- {$R *.dfm}
- procedure TForm_raschet_x.FormCreate(Sender: TObject);
- begin
- PageControl1.ActivePageIndex:=0;
- end;
- procedure TForm_raschet_x.CreateParams(var Params: TCreateParams);
- begin
- inherited CreateParams(Params);
-
- Params.Style := Params.Style or ws_popup xor ws_dlgframe;
- end;
-
- procedure TForm_raschet_x.Button_fClick(Sender: TObject);
-
- begin
- if (StrToInt(Edit_step2.Text)>=0) and (StrToInt(Edit_step2.Text)<=3) then
- begin
- GetMem(f,SizeOf(Matr1));//new(f);
- GetMem(f_t,SizeOf(TMatr1_func));//new(f_t);
- j:=j+1;
- // inc(f);
- // inc(f_t);
- t:=0.5;
- label32.Caption:=IntToStr(j);
- if RadioButton3.Checked=true then
- begin
- f^[j]:=StrToFloat(Edit_koef2.text)*IntPower(sin(t),StrToInt(Edit_step2.Text));
- f_t^[j].Ffunc_t:=RadioButton3.Caption;
- end;
- if RadioButton4.Checked=true then
- begin
- f^[j]:=StrToFloat(Edit_koef2.text)*IntPower(cos(t),StrToInt(Edit_step2.Text));
- f_t^[j].Ffunc_t:=RadioButton4.Caption;
- end;
-
- f_t^[j].Fstep_t:=Edit_step2.Text;
- f_t^[j].Fkoef_t:=Edit_koef2.Text;
- f_t^[i].Fkoef:=StrToInt(Edit_koef2.Text);
- f_t^[i].Fstep:=StrToInt(Edit_step2.Text);
-
- if j=razmer_j then Button_f.Visible:=false;
- end
-
-
- freeMem(f,SizeOf(Matr1));
- freeMem(f_t,SizeOf(TMatr1_func));
-
-
- end;
-
- end.
-
-
-
 |
Вопрос задала: Татьяна (статус: Посетитель)
Вопрос отправлен: 19 июня 2008, 17:59
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Мережников Андрей
Здравствуйте, Татьяна!
В строке TMatr1_func = array{[1..poryadok_matr]} of TFunc; у Вас объявляется динамический массив - это так задумано? размерность массива Вы оформили как комментарий, поставив фигурные скобки. Если да, то где инициализируется его размер?
Попробуйте их убрать. Да, еще, в приложении к вопросу Вы прикрепили .exe файл. Он то как-раз меньше всего нужен для поиска ошибок в программе. В другой раз отправляйте сам проект (*.dpr, *.pas, *.dfm и т.д.), а exe не надо
 |
Ответ отправил: Мережников Андрей (статус: Абитуриент)
Время отправки: 19 июня 2008, 19:11
|
Ответ #2. Отвечает эксперт: Шичко Игорь
Здравствуйте, Татьяна!
В строке Float = Double; нет ли у Ва конфликта, ведь это разные типы данных.
Попробуйте формировать матрицу без указателей (может с использованием промежуточного массива).
Т.е. построчное преобразование элементов.
Я бы попробовал использовать динамический массив с определением размерности через SetLength(имя массива).
Если не получится, то прикрепите вместо *.exe файл *.pas
 |
Ответ отправил: Шичко Игорь (статус: 9-ый класс)
Время отправки: 20 июня 2008, 07:52
|
Мини-форум вопроса
Всего сообщений: 21; последнее сообщение — 1 июля 2008, 15:22; участников в обсуждении: 5.
Страницы: [« Предыдущая] [1] [2]
|
Паровоз (статус: 10-ый класс), 1 июля 2008, 15:22 [#21]:
to Валим К:
Выше отношение - элементарное заблуждение. В этом легко убедиться, открыв любой словарь. Основное значение слова "результат" - итог некоторой деятельности. В том числе математический результат - это итог деятельности математика, представленный на обсуждение математического сообщества и этот итог (результат) может быть не только верным и неверным, а известным сообществу или неизвестным (новым).
То, что Вы понимаете под словом "результат" - в математике называется иначе (утверждение, теорема и т.п.). В том, что Ваше утверждение несостоятельно, можно увидеть, взяв положение ВАК о защите диссертаций, где вполне определенно используется термин "результат" как итог деятельности, а не как математическое утверждение. И Ваша попытка "выстроить" всех по своему ранжиру (в том числе профессоров и академиков, которые пользуются этим термином) просто абсурдна.
|
Страницы: [« Предыдущая] [1] [2]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|