Консультация № 40414
16.04.2006, 02:35
0.00 руб.
0 5 2
Уважаемые Эксперты, подскажите пожалуйста. Я делфи знаю на уровне "1-го класса", но продвигаюсь с большими темпами. У меня при написании программы возникли такие проблемы: 1-я) необходимо вернуть с функции массив типа double или real (не важно) при этом создаю свой тип (см. приложение 1) и определяю,например, две переменные созданого мною типа. Но при изменении одной изменяються значения другой. Такое впечетление что эти переменные указывают на один и тодже адрес в памяти...Как это можно обойти или иссправить? Спросил у "Делфиста" на кафедре, то он сказал создавай свой класс типа массив и присваивай переменным этот тип, тогда будет все нормал. Но я "чайник" в этих делах. Может подскажете как мне это зделать. Если будет пример буду очень благодарен. 2-я) Таже проблемма но уже с мартицами.
Вообще занимаюсь прогнозированием с помощью ARIMA-моделей, а точнее только "подклассом" моделей - АР(p). Мне нужно рассчитать ЧАКФ и построить прогноз на несколько значений. Если кто-то из Вас с этим хотябы встречался то помогите. "Буду обязан всю жизнь!"

Приложение:
Приложение 1:interfacetype TArrayDouble = array of double;var ... MassivData:TArrayDouble; DiffMassivData: TArrayDouble; ...

Обсуждение

Неизвестный
16.04.2006, 06:13
общий
А код функции и способ её вызова можно ? Вообще, лучше все операции с данными переменными покажите.
Неизвестный
16.04.2006, 06:22
общий
Я подобной проблемы не обнаружил. Вот, попробуйте:unit Unit13;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TArrayDouble = array of double;type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Memo1: TMemo; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); function something(in1:integer):TArrayDouble; procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; MassivData:TArrayDouble; DiffMassivData: TArrayDouble;implementation{$R *.dfm}function TForm1.something(in1:integer):TArrayDouble;vark1:integer;tmp:TArrayDouble;beginsetlength(tmp, 6);for k1:=1 to in1 do tmp[k1]:=(6-k1)*pi;something:=tmp;end;procedure TForm1.Button1Click(Sender: TObject);vark1:integer;beginsetlength(massivdata, 6);setlength(Diffmassivdata, 6);for k1:=1 to 5 do massivdata[k1]:=(k1)*pi;for k1:=1 to 5 do diffmassivdata[k1]:=0;button2.Click;end;procedure TForm1.Button2Click(Sender: TObject);vark1:integer;beginfor k1:=1 to 5 do memo1.Lines.Add(floattostr(massivdata[k1]));memo1.Lines.Add(‘==================‘);for k1:=1 to 5 do memo1.Lines.Add(floattostr(diffmassivdata[k1]));memo1.Lines.Add(‘%%%%%%%%%%%%%%%%%%%%%%%%%%%‘);end;procedure TForm1.Button3Click(Sender: TObject);begindiffmassivdata:=something(5);button2.Click;end;end.
Неизвестный
16.04.2006, 08:40
общий
это ответ
Здравствуйте, Харсеев Владимир Александрович!
Не видел Ваш код, поэтому пишу на основе кода, приведённого Полховским в мини-форуме. Итак:
1. Зачем определять свой тип, не проще ли без своего типа просто:
var
...
MassivData:array of double;
DiffMassivData: array of double;

2. Вы пользуетесь динамическими массивами. Нужно ли Вам это? Может быть проще
var
MassivData:array [1..6] of double;
DiffMassivData: array [1..6] of double;
И далее без всяких
setlength(massivdata, 6);
setlength(Diffmassivdata, 6);

3. После использования динамических массивв нужно освободить память:
massivdata := NIL;//и другим способом
Finalize(Diffmassivdata);
Вы это делаете?

4.Вы пишете
setlength(massivdata, 6); //затем
for k1:=1 to 5 do
massivdata[k1]:=(k1)*pi;
...
здесь k1 можно менять от 1 до 6

5. Возможно, при выходе за пределы границ первого описанного в var массива начинается запись в другой, сам не проверял, посмотрите.
Неизвестный
16.04.2006, 10:51
общий
это ответ

<i>Здравствуйте, <b>Харсеев Владимир Александрович</b>!</i>

У Вас в этом небольшом куске кода все выглядит правильно. Кроме того, Вы уже выполнили (как я понимаю) совет программиста с кафедры - Вы объявили свой тип - "массив типа double" (правда, не понимаю, к чему это он или может Вы написали "класс типа массив" - я на вас посмотрел бы, когда вы будете с этим программистом объявлять <i><b>type</b>TArrayDouble = <b>class</b>(<b>array of</b> double )</i> - это у вас не пройдет).
<i>Скорее всего, проблема не в том, как Вы задаете эти массивы и матрицы, а в том, как Вы их обрабатываете.</i>

<i>Удачи!</i>
Неизвестный
16.04.2006, 14:28
общий
<b>Все:</b><b>Я</b> писал этот код, абсолютно не зная, что за код у Харсеева Владимира Александровича. <u>Кому</u> и <u>на что</u> вы все отвечаете ?<b>Злоумышленник:</b><i>"здесь k1 можно менять от 1 до 6"</i>При забивании массива до 6 значений, выскакивало странное исключение :<i>"Project ... faulted with message: access violation at 0x00405939: write of address 0x00030df4. Project stopped. Use Run to continue."</i>Вот я и уменьшил до 5. Там, как я понял, первое (нулевое) значение тоже используется. Так получается, что их 6, но раз с №1 начали, то 5. По крайней мере с 0 по 5 всё работает. <i>"Вы пользуетесь динамическими массивами. Нужно ли Вам это? Может быть проще..."</i>Ещё раз повторю: это <b>мой</b> код, а у спрашивающего условие было именно такое (динамический массив).<i>"После использования динамических массивв нужно освободить память..."</i>Да, забыл я освободить память, редко с динамическими массивами работаю.<b>Deniss:</b><i>"У Вас в этом небольшом куске кода все выглядит правильно..."</i>Это вот в тех трёх строчках в приложении-то? Надо быть на уровне детсада, чтобы там ошибиться. А человек уже в первом классе и продвигается.
Форма ответа