Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 710

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Помогите, пожалуйста.
Я пишу дипломку на Delphi.
Программа должна находить обратную матрицу, произведение матриц, произведение матрицы на вектор и интегралы от введенных матриц. Ввод матрицы осуществляется поэлементно нажатием на кнопку(не через таблицу).
Тип элементов массива - Extended. На другие типы программа ругается и не хочет работать.
Когда пыталась перемножить матрицу на вектор, программа выдала ошибку про переполнение стека. В интернете нашла, что лучше использовать указатель на массив при выполнении таких операций, тем более, что Extended - самый "тяжелый" тип.
И теперь я не могу корректно работать с указателями на массив, программа выдает:project project1.exe raised exception class EAccessViolation with message 'Access violation at address in module' и т.д.
Помогите преодолеть эту ошибку, пожалуйста.
Заранее благодарю всех экспертов

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. unit Unit11;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, StdCtrls, ExtCtrls, ComCtrls, jpeg, det_txt,math;
  6.  
  7. type
  8. Float = Double;
  9. /////////////
  10. matr1 = array[1..poryadok_matr] of Float;
  11. matr2 = array[1..poryadok_matr,1..poryadok_matr] of Float;
  12. ////////////
  13.  
  14. TFunc = record
  15. Ffunc_t:string;
  16. Fkoef_t:string;
  17. Fkoef:Float;
  18. Fstep_t:string;
  19. Fstep:integer;
  20. end;
  21. TMatr1_func = array{[1..poryadok_matr]} of TFunc;
  22. TMatr2_func = array[1..poryadok_matr,1..poryadok_matr] of TFunc;
  23. {..................................}
  24. private
  25. { Private declarations }
  26. procedure CreateParams(var Params: TCreateParams); override;
  27. public
  28. { Public declarations }
  29. end;
  30. var
  31. Form_raschet_x: TForm_raschet_x;
  32. code,razmer_sist,i,j,i_x_1:integer;
  33. x,f,x_1,umn_rez,vekt_rez:^matr1;
  34. str,vektor_t,buf_B:^matr1_t;
  35. b_dop,b_1,b,a:^matr2;
  36. razmer_i, razmer_j, razmer_i_1,razmer_j_1,im,jm:integer;
  37. x_t,f_t:^TMatr1_func;
  38. a_t:^TMatr2_func;
  39. b_t:^matr2_t;
  40. implementation
  41. {$R *.dfm}
  42. procedure TForm_raschet_x.FormCreate(Sender: TObject);
  43. begin
  44. PageControl1.ActivePageIndex:=0;
  45. end;
  46. procedure TForm_raschet_x.CreateParams(var Params: TCreateParams);
  47. begin
  48. inherited CreateParams(Params);
  49.  
  50. Params.Style := Params.Style or ws_popup xor ws_dlgframe;
  51. end;
  52.  
  53. procedure TForm_raschet_x.Button_fClick(Sender: TObject);
  54.  
  55. begin
  56. if (StrToInt(Edit_step2.Text)>=0) and (StrToInt(Edit_step2.Text)<=3) then
  57. begin
  58. GetMem(f,SizeOf(Matr1));//new(f);
  59. GetMem(f_t,SizeOf(TMatr1_func));//new(f_t);
  60. j:=j+1;
  61. // inc(f);
  62. // inc(f_t);
  63. t:=0.5;
  64. label32.Caption:=IntToStr(j);
  65. if RadioButton3.Checked=true then
  66. begin
  67. f^[j]:=StrToFloat(Edit_koef2.text)*IntPower(sin(t),StrToInt(Edit_step2.Text));
  68. f_t^[j].Ffunc_t:=RadioButton3.Caption;
  69. end;
  70. if RadioButton4.Checked=true then
  71. begin
  72. f^[j]:=StrToFloat(Edit_koef2.text)*IntPower(cos(t),StrToInt(Edit_step2.Text));
  73. f_t^[j].Ffunc_t:=RadioButton4.Caption;
  74. end;
  75.  
  76. f_t^[j].Fstep_t:=Edit_step2.Text;
  77. f_t^[j].Fkoef_t:=Edit_koef2.Text;
  78. f_t^[i].Fkoef:=StrToInt(Edit_koef2.Text);
  79. f_t^[i].Fstep:=StrToInt(Edit_step2.Text);
  80.  
  81. if j=razmer_j then Button_f.Visible:=false;
  82. end
  83.  
  84.  
  85. freeMem(f,SizeOf(Matr1));
  86. freeMem(f_t,SizeOf(TMatr1_func));
  87.  
  88.  
  89. end;
  90.  
  91. end.
  92.  
  93.  
  94.  


Татьяна Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Татьяна (статус: Посетитель)
Вопрос отправлен: 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™

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™

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] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 21 октября 2017, 11:39
Выполнено за 0.12 сек.
Рейтинг@Mail.ru