|
Вопрос # 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] [Следующая »]
|
Мережников Андрей (статус: Абитуриент), 19 июня 2008, 19:14 [#1]:
Несколько сумбурный получился ответ. Следует читать так: где инициализируется размер динамического массива (переменных, имеющих тип TMatr1_func? Попробуйте в указанной строке убрать фигурные скобки
|
|
Татьяна (статус: Посетитель), 19 июня 2008, 19:26 [#2]:
Спасибо за ответ.Убрала скобки - также не работает. Как вам можно выслать .pas файл?
|
|
Вадим К (статус: Академик), 19 июня 2008, 23:21 [#3]:
а зачем в программе используются указатели, если можно и без них обойтись? просто хочеться проблем на свою голову? Если не понимаете, что такое указатели, как выделяется и освобождается память - не используйте их.
Помните простое правило - для начала надо сделать, что бы работало, а потом оптимизировать.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 20 июня 2008, 08:37 [#4]:
Посмотрел кусок твоего кода. Жуть какая! И ни одного комментария по делу. Как ты в нём разбираешься - ума не разложу.
ИМХО, выкинь эту страсть и напиши всё заново, без всяких указателей и прочей ненужной фигни, иначе сама запутаешься ещё больше. Начни, хотя бы, с описания типов, например:
type
TVector: array of Extended; // Вектор
TMatrix: array of array of Extended; // Матрица
Затем разбей задачу не несколько подзадач-функций, каждая из которых будет делать одну операцию над матрицей (матрицами): произведение, нахождение обратной и т.д.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Паровоз (статус: 10-ый класс), 21 июня 2008, 22:52 [#5]:
"Программа должна находить ... интегралы от введенных матриц"
Очень интересная задача.
|
|
Мережников Андрей (статус: Абитуриент), 22 июня 2008, 21:23 [#6]:
to Паровоз. В высшей математике действительно существует понятие интегрирование матриц.
|
|
Паровоз (статус: 10-ый класс), 26 июня 2008, 12:05 [#7]:
to Мережников Андрей:
В высшей математике существует понятие интегрирования не матриц, а
матричных фунций (о которых никакой речи в вопросе нет).
|
|
Мережников Андрей (статус: Абитуриент), 26 июня 2008, 18:34 [#8]:
Видимо высшую математику нам преподавали в разных институтах
|
|
Татьяна (статус: Посетитель), 26 июня 2008, 18:46 [#9]:
У меня каждый элемент матрицы представляет собой периодическую функцию и я беру интеграл матрицы поэлементно.
Всем спасибо за советы.
Я убрала указатели.
Программа великолепно у меня работает и находит правильное решение. И вообще, я запрограммировала метод, который в математике еще не применялся для того класса уравнений, который я рассматривала. Как сказала мой научный руководитель, мы получили совершенно новый результат.
Я на днях получаю красный диплом и меня также рекомендовали для поступления в магистратуру.
|
|
Вадим К (статус: Академик), 26 июня 2008, 23:39 [#10]:
мы получили совершенно новый результат
Насколько я помню математику, в ней не бывает "совершенно новых результатов". Бывает правильный и неправильные.
Напрашивается вопрос - за что дали диплом.
Возможно хотели написать "получили новый метод решения", тем более, что это более коррелировано с первой частью высказывания. Но тогда я опять не понимаю, за что дали диплом.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Татьяна (статус: Посетитель), 27 июня 2008, 13:39 [#11]:
Да у вас, Вадим К, обыкновенная зависть.
Вы уже и математику всю позабыли, и от времени вы немного приотстали, потому как в нынешнеее время девушкам незазорно учиться на матфаке, да еще и получать новые результаты в математике. Новый метод решения я не получала. Я его адаптировала для класса дифференциально-разностных уравнений с запаздывающим аргументом. А этого пока никто не делал.
Кроме того, сейчас девушки не только не сидят дома, но и зарабатывают больше своих мужей и также более успешны в жизни, чем мужчины.
В связи с тем вопросом, который вы мне задали (за что мне дали диплом) у меня возник вопрос: за что у вас на этом сайте статус: Кандидат наук?
А насчет указателей я бы хотела добавить, что в университете преподаватели мне порекомендовали использовать указатели в программе.
|
|
Вадим К (статус: Академик), 27 июня 2008, 21:35 [#12]:
Я абсолютно не против девушек, которые учаться на матфаке. Я не против тех, кто открывает новые методы решений. Но вы написали, что преподаватель сказал, что вы получили новый результат - значит старый был неправильный? Вот это меня и смутило. В математике 2+2 будет 4, как не крути (если мы конечно в десятичной системе находимся). все другие результаты выражения 2+2 идут лесом по известной причине.
Мой статус на сайте - это идея Андрея (администратора и создателя сего сайта). Он расчитывается на основании количества ответов, которые я дал. Можете заглянуть в профиль и убедиться, что кол-во их не мало.
В реальной жизни - я окончил магистратуру, инженер связи.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Татьяна (статус: Посетитель), 28 июня 2008, 17:12 [#13]:
Ну теперь я вижу, что вы нормальный )
А то сразу в атаку бросились - за что дали мне диплом.
За знания! Я ведь еще и преподаю математику (с 17-ти лет!) в частном порядке.
|
|
Вадим К (статус: Академик), 28 июня 2008, 18:21 [#14]:
Я ведь сразу написал, с чем я не согласен в вашем высказывании, но вы напали на меня. Ведь достаточно было сказать - да, тут чуточку описалась, последипломная радость/праздник/алкоголь (вычеркнуть лишнее). А нет, сразу о феминизме, о равноправии полов...
Хотя всё это уже оффтоп.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Паровоз (статус: 10-ый класс), 28 июня 2008, 19:48 [#15]:
to Вадим К.
"вы получили новый результат - значит старый был неправильный"
Вы совершено не в курсе научной терминологии. Если получен новый результат, то это не означает, что старый результат неправильный. Это просто означает, что старого результата нет. Это общепринятая терминология в математической науке, в которой "совершенно новые результаты" получают постоянно.
|
|
Вадим К (статус: Академик), 29 июня 2008, 00:52 [#16]:
Я в курсе научной терминологии. Получен новый результат - в математике - это конщунство. В спорте новый результат может быть получен - спортсмен пробежал на секунду быстрее. А вот в математике результат может быть правильным или неправильным. Может быть получен новый метод нахождения результата (решения). Но не результат!
Но в некоторых случаях новый результат может быть получен. если старый и новый есть неверным. Но это больше характерно для физики, но не для математики. Хотя, у вас в России всё не так как в людей. Я к этому привык и не обижаюсь.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 30 июня 2008, 12:44 [#17]:
Вопрос: какова вероятность, выйдя на улицу, встретить живого динозавра?
Ответ: 50%: или встречу, или не встречу.
И, ведь, хрен опровергнешь!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 30 июня 2008, 16:47 [#18]:
не надо ругаться.
живого динозавра? 0%. Его точно не встречу.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Паровоз (статус: 10-ый класс), 30 июня 2008, 21:05 [#19]:
"Я в курсе научной терминологии"
Нет, Вы не в курсе научной терминологии в математике. "Новый результат" - это общепринятый в математических исследованиях термин. И возражаете Вы против него или нет - от этого ничего не изменится. Этот термин применялся, применяется и будет применяться.
|
|
Вадим К (статус: Академик), 1 июля 2008, 09:41 [#20]:
Хватит оффтопить, мое отношение к этому выражению вы дал выше.
Галочка "подтверждения прочтения" - вселенское зло.
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|