Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];

Вниз

Как работать с указателями на динамические массивы.   Найти похожие ветки 

 
Галинка   (2004-01-28 15:50) [0]

Доброго Вам времени суток.

Не могу разобраться как работать с динамическими массивами через указатели. В моей программе возникает все время одна и та же ошибка "Acsess violution ...".

Помогите если можете...


 
Тимохов   (2004-01-28 15:52) [1]

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


 
имя   (2004-01-28 15:53) [2]

Удалено модератором


 
Некто   (2004-01-28 15:54) [3]

Удалено модератором


 
Тимохов   (2004-01-28 15:56) [4]

Удалено модератором


 
Некто   (2004-01-28 16:00) [5]

Удалено модератором


 
Palladin   (2004-01-28 16:26) [6]

Удалено модератором


 
Goida   (2004-01-28 16:33) [7]

Ты задай вопрос конкретнее. А пока не ясно о чем тебе рассказывать. Приведи код или отрывок из него. В общем, конкретизируй.


 
alex_***   (2004-01-28 16:44) [8]

хорошо народ покромсали... Так Галинка и не увидит ничего, даже если чего путевого скажут. Да и меня вырежут, наверно.


 
Галинка   (2004-01-29 07:08) [9]

Доброго времени суток!

Вот, конкретизирую :

unit UnitRaschet;

interface

uses SysUtils,MAIN,CHILDWIN;

type
TArAmplitud = array of real;
TArofArAmplitud = array of TArAmplitud;
PTekArAmplitud = ^TArAmplitud;

var
TekAmplitudy : TArAmplitud;
ArTekAmplitud : TArofArAmplitud;
DatFile : Text;
TekPArray : PTekArAmplitud;

function DatFileRead(DatFileName:string):PTekArAmplitud;
procedure DataShow(TekArray:TArofArAmplitud);

implementation

function DatFileRead(DatFileName:string):PTekArAmplitud;
var
i, j : integer;
mystr, mysubstr1, mysubstr2 : string;
StrAmp : array of string;
flag : boolean;

begin
i:=0;
try
AssignFile(DatFile,DatFileName);
Reset(DatFile);
while not EoF(DatFile) do
begin
readln(DatFile, mystr);
inc(i);
end;
finally
SetLength(StrAmp,i);
SetLength(TekAmplitudy,i);
New(TekPArray);
end;
Reset(DatFile);
i:=0;
while not EoF(DatFile) do
begin
readln(DatFile,mystr);
j:=0;
flag:=false;
DecimalSeparator:=".";
repeat
mysubstr1:=copy(mystr,j,2);
mysubstr2:=copy(mystr,j+1,2);
if (mysubstr1=" ") and (mysubstr2<>" ") then
begin
StrAmp[i]:=copy(mystr,j+1,Length(mystr)-j);
inc(i);
flag:=true;
end;
inc(j);
until (flag) or (j=Length(mystr)-1);
end;
CloseFile(DatFile);
for i:=Low(StrAmp) to High(StrAmp) do
TekPArray^[i]:=StrToFloat(StrAmp[i]);
DatFileRead:=TekPArray;
end;

procedure DataShow(TekArray:TArofArAmplitud);
var
i, j:integer;
begin
For i:=Low(TekArray) to high(TekArray) do
begin
For j:=Low(TekArray[i]) to High(TekArray[i]) do
MainForm.ListBox1.Items.Add(FloatToStrF(TekArray[i,j],ffFixed,5,4));
MainForm.ListBox1.Items.Add(" ");
end;
end;

end.


Если найдете что исправить, милости прошу...

И еще, место использования всего этого

for i:=0 to OpenDialog.Files.Count-1 do
MainForm.ListAmplitud.Add(DatFileRead(MainForm.OpenDialog. Files.Strings[i]));


Всем, кто ответит ЗАРАНЕЕ СПАСИБО!!!


 
Тимохов   (2004-01-29 11:05) [10]

1. Зачем тебе указатель на дин массив? Дин массив - сам указатель...
2. Что у тебя здесь конкретно не работает? На каком месте случается ошибка и какая ошибка?


 
Goida   (2004-01-29 13:33) [11]

Возможно у тебя ошибка как раз и кроется за тем, что ты используешь указатель на указатель, как сказал Тимохов:
> 1. Зачем тебе указатель на дин массив? Дин массив - сам
> указатель...
И еще,
> 2. Что у тебя здесь конкретно не работает?

Мы ведь не без дела сидим, чтобы разбираться в чужом коде (правда времени пмочь хватает :] )


 
Галинка   (2004-01-29 13:48) [12]

Удалено модератором
Примечание: Дубль


 
Галинка   (2004-01-29 13:49) [13]

Удалено модератором
Примечание: Дубль


 
Галинка   (2004-01-29 13:51) [14]

Удалено модератором
Примечание: Дубль


 
Галинка   (2004-01-29 13:58) [15]

Удалено модератором
Примечание: Дубль


 
Игорь Шевченко   (2004-01-29 14:03) [16]

const
vMaxElements = (High(Cardinal)-$F) div sizeof(TElem);

type
TDynArrayNDX = 1..vMaxElements;
TArrayElements = array [TDynArrayNDX] of TElem;

Error: Data type too large: exceeds 2 GB

Зачем нужен такой тип для размера массива ?


 
Тимохов   (2004-01-29 14:07) [17]

Странно, что у меня компилятор говорит, что "[Error] DynArrayUnit.pas(17): "TArrayElements" is not a type identifier",
Хотя очевидно, что ошибка в "Error: Data type too large: exceeds 2 GB" :(((


 
Галинка   (2004-01-29 14:17) [18]

Для Игоря Шевченко:

Спасибо за совет. У меня такой ошибки не было. Но я к нему прислушаюсь...


 
Erik   (2004-01-29 14:45) [19]

А зачем делать New(TekPArray);? Почемубы несоздать глобыльную переменую, лучше конечно переменую класса и сам клас в придачу. И потенчиальных утечек памяти небудет. Причем вродебы так для этого и задумана переменая TekAmplitudy. Демаю, что
Result := @TekAmplitudy; будет удобнее.


 
Erik   (2004-01-29 14:47) [20]

Удалено модератором
Примечание: Не стоит обсуждать действия модератора, лучше прочитай правила, надеюсь это в последний раз, хорошо, да


 
Галинка   (2004-01-29 14:56) [21]

Доброго Всем вам времени суток!

Вот, кое-что начало получаться. Проинспектируйте пожайлуста.

procedure TMainForm.FileOpen1Execute(Sender: TObject);
var
i,j,k:integer;
begin
if OpenDialog.Execute then
begin
// CreateMDIChild(OpenDialog.FileName);
MainForm.ListBox1.Items:=MainForm.OpenDialog.Files;
SetLength(UnitRaschet.TekAmplitudy,MainForm.OpenDialog.Files.Count);
for i:=0 to OpenDialog.Files.Count-1 do
begin
UnitRaschet.DatFileRead(MainForm.OpenDialog.Files.Strings[i],UnitRaschet.TekAmplitudy,i);
end;
UnitRaschet.DataShow(UnitRaschet.TekAmplitudy);
end;
end;


У OpenDialog"а стоит AllowMultiSelect:=true;

А обработка каждого файла:

function DatFileRead(DatFileName:string; OldAmplitudy:TArAmplitud; NumbFile:byte):TArAmplitud;
var
i : integer;
chislo1, chislo2 : double;

begin
i:=0;
try
AssignFile(DatFile,DatFileName);
Reset(DatFile);
while not EoF(DatFile) do
begin
readln(DatFile, mystr);
inc(i);
end;
finally
SetLength(StrAmp,i);
SetLength(OldAmplitudy[NumbFile],i);
end;
Reset(DatFile);
i:=0;
while not EoF(DatFile) do
begin
readln(DatFile,chislo1,chislo2);
OldAmplitudy[NumbFile,i]:=chislo2;
inc(i);
end;
DatFileRead:=OldAmplitudy;
end;


Вот.

Заранее благодарна Всем, кто ответит!


 
Anatoly Podgoretsky   (2004-01-29 15:12) [22]

Не оптимально, не надо читать файл, что бы узнать количество строк. Немного не понятно что здесь делается, но можно примерно так, как заготовка к задаче.

function DatFileRead(DatFileName: string; OldAmplitudy: TArAmplitud; NumbFile: Integer): TArAmplitud;
var
i : integer;
begin
i:=0;
try
AssignFile(DatFile,DatFileName);
Reset(DatFile);
while not EoF(DatFile) do
begin
I := I + 1;
SetLength(OldAmplitudy, I);
ReadLn(DatFile, OldAmplitudy[NumbFile,i]);
end;
finally
CloseFile(DatFile);
end;
...
end;


 
Галинка   (2004-01-29 15:28) [23]

Для Анатолия Подгорецкого.

А в файлах вот что:

0.565092683727494 12.7563915074414
1.65777427425459 12.3009282597613
2.54700524100955 12.3040054927400
3.44517720359216 12.2977413291255
4.51959446878597 12.0296616248196
5.48845957766532 12.0142697613465
6.33298556528204 12.0640539772912
7.22221653203701 12.0671312102699
8.04886052799844 12.1355982194011
9.00961946137457 12.0639442796341
9.96143739892306 12.0016317364604
10.8685503573333 11.9860261762527
11.7220173407777 12.0264689956042
12.6201893033603 12.0202048319897
13.4557742951494 12.0793304445276
14.3986512368702 12.0263592979471
15.2521182203146 12.0668021172986
16.1949951620354 12.0138309707181
17.1021081204457 11.9982254105103
17.9376931122348 12.0573510230483


Не пугайтесь. Это файлы оцифровки сейсмограмм. Я же Институте геологии и геофизики АН РУз работаю, в лаборатории геофизики. :)


 
Romkin   (2004-01-29 15:51) [24]

Так мне таки все же интересно, а сделать-то что надоть с этими файлами? А то куски какого-то странновыглядящего кода только...
Считать его в массив? В список? Типа Double достаточно.

type
TFloatPoint = record
x, y: double;
end;

TPointArray = array of TFloatPoint;

var
F: TextFile;
i, n: integer;
Arr: TPointArray;

begin
assignFile(F, "points.txt");
reset(F);
try
n := 0;
while not EOF(F) do
inc(n);
finally
closeFile(F);
end;
if N = 0 then
raise EInOutError.Create("А где отсчеты?!");
SetLength(Arr, n);
reset(F);
try
for i := 0 to n-1 do
readln(F, Arr[i].x, Arr[i].y);
finally
CloseFile(F);
end;
//Тута юзаем Arr
end;


 
Anatoly Podgoretsky   (2004-01-29 15:52) [25]

Приведи определение массива, а то похоже я тебе с ошикой дал пример

Для одномерного
SetLength(OldAmplitudy, I);

Для двухмерного, непрямоугольного, установка второго измерения
SetLength(OldAmplitudy[NumbFile], I);
в цикле по одному файлу

И еще отдельно, ранее установка первого измерения (не обязательно, но так удобнее и надежнее)
SetLength(OldAmplitudy, NumbFile);
в цикде по файлам


 
Галинка   (2004-01-29 15:59) [26]

Да, спасибо.

Объяняю для ВСЕХ. Я работаю в Институте геологии и геофизики АН РУз, в лаборатории геофизики. Мы занимаемся рудной (и не только) сейсморазведкой. Так вот, мои исходные файлы это оцифрованные в дополнительной программе сейсмограммы (т.е. каждый файл, одна трасса сейсмограммы). А мне их нада отрисовать в каком-нибудь виде на мониторе.

Дальше, что не понятно, спрашивайте. :)


 
Anatoly Podgoretsky   (2004-01-29 16:04) [27]

Разъяснение по поводу двухмерных динамических непрямоугольных массивах понятны? Вся суть в использовании SetLength - она имеет несколько форм.


 
Anatoly Podgoretsky   (2004-01-29 16:05) [28]

Да и приведи объявления массивов, старое уже не актуально.


 
Romkin   (2004-01-29 16:11) [29]

Так мне таки все же интересно, а сделать-то что надоть с этими файлами? А то куски какого-то странновыглядящего кода только...
Считать его в массив? В список? Типа Double достаточно.

type
TFloatPoint = record
x, y: double;
end;

TPointArray = array of TFloatPoint;

var
F: TextFile;
i, n: integer;
Arr: TPointArray;

begin
assignFile(F, "points.txt");
reset(F);
try
n := 0;
while not EOF(F) do
inc(n);
finally
closeFile(F);
end;
if N = 0 then
raise EInOutError.Create("А где отсчеты?!");
SetLength(Arr, n);
reset(F);
try
for i := 0 to n-1 do
readln(F, Arr[i].x, Arr[i].y);
finally
CloseFile(F);
end;
//Тута юзаем Arr
end;


 
Галинка   (2004-01-30 06:28) [30]

Доброго времени суток!

Для Romkin:
Вообще-то мне х-ы не нужны. А код, кстати, у меня почти такой же получился...

Для Anatoly Podgoretsky:
Почему-то у меня

while not EoF(DatFile) do
begin
I := I + 1;
SetLength(OldAmplitudy, I);
ReadLn(DatFile, OldAmplitudy[NumbFile,i]);
end;
finally
CloseFile(DatFile);
end;

не проходит. Уж не знаю почему...


 
Anatoly Podgoretsky   (2004-01-30 09:20) [31]

Потому что надо немного не так, я же просил приведи описания массивов и вот Ромкин тоже просит, что надо по подробнее и не относитьс к этому коду как к рабочему, это только демонстрации.
Будем исходить из того, что у тебя двухмерный массив

type
AmplitudyArray: array of array of Double;

где первое измерение это номер файла, то есть отдельный набор данных, а второе это данные этого набора, тогда

var
OldAmplitudy: AmplitudyArray;

В функции перед циклом увеличиваешь первое измерение на еденицу, то есть создаешь место для нового набора, номер видимо последовательно наращиваеммый ты передаешь в функцию, поэтому его высчитывать не надо, а нужно только по беспокоиться о последовательной нумерации начиная с единицы.

SetLength(OldAmplitudy, NumbFile);

Затем в цикле выделеляешь место для элемента данных и заносишь туда данные из файла

I := 0; // инициализация индекса
while not EoF(DatFile) do
begin
I := I + 1;
SetLength(OldAmplitudy[NumbFile], I);
// вот здесь выделили место для нового элемента данные по строке NumbFile, не затрагивая другие строки массива
// при чтении надо учесть, что индексация массива с нуля, а номера файлов и индексы данных с еденицы, поэтому и и -1
ReadLn(DatFile, OldAmplitudy[NumbFile-1,I-1]);
end;
finally
CloseFile(DatFile);
end;


Предположения об нумерации с единицы, только предположения, если же ты ведешь нумерацию файлов с нуля, то немного изменить код, в выделении места использовать +1, а обращение прямое по индексу, это уже как удобнее.


 
Anatoly Podgoretsky   (2004-01-30 09:23) [32]

Исправить
SetLength(OldAmplitudy[NumbFile], I);
на
SetLength(OldAmplitudy[NumbFile-1], I);

Типовые ошибки работы с индексами и размерами.


 
Галинка   (2004-02-02 12:24) [33]

Вот другой код. Про ломанную.

procedure TForm1.FormClick(Sender: TObject);
begin
inc(NumbClicks);
SetLength(TekPLUnits,NumbClicks);
GetMem(TekPLUnits,NumbClicks*sizeof(TPoint));
TekPLUnits[NumbClicks].X:=Mouse.CursorPos.X-Form1.ClientRect.Left;
TekPLUnits[NumbClicks].Y:=Mouse.CursorPos.Y-Form1.ClientRect.Top;
Form1.StringGrid1.Cells[0,NumbClicks]:=IntToStr(TekPLUnits[NumbClicks].X);
Form1.StringGrid1.Cells[1,NumbClicks]:=IntToStr(TekPLUnits[NumbClicks].Y);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Form1.Canvas.Pen.Color:=clBlack;
Form1.Canvas.Pen.Width:=3;
NumbClicks:=0;
end;

procedure TForm1.FormDblClick(Sender: TObject);
begin
Form1.Canvas.MoveTo(TekPLUnits[0].X,TekPLUnits[0].Y);
Form1.Canvas.Polyline(Form1.TekPLUnits);
FreeMem(TekPLUnits);
NumbClicks:=0
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Form1.StatusBar1.SimpleText:="X="+IntToStr(x)+" "+"Y="+IntToStr(Y);
Form1.StatusBar1.Update;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeMem(TekPlUnits);
end;

end.


Может посоветуете что?

Заранее благодарна.... Галинка.


 
Anatoly Podgoretsky   (2004-02-02 14:30) [34]

Две проблемы
Главная
SetLength(TekPLUnits,NumbClicks);
GetMem(TekPLUnits,NumbClicks*sizeof(TPoint));

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

Вторая, наблюдается двойное освобождение памяти
FreeMem(TekPlUnits);
это тоже вызовет проблему.


 
Галинка   (2004-02-03 06:48) [35]

У меня ощущение, что не работает конструкция вида:

inc(NumbClicks);
SetLength(TekPLUnits,NumbClicks);


Потому, что когда делаю SetLength(TekPLUnits,NumbClicks); заранее посчитав NumbClicks, то никаких "Access violution..." нету..

Может такое быть?


 
Anatoly Podgoretsky   (2004-02-03 11:44) [36]

Такое не может быть, эта функция не имеет ошибок. Будет создан массив TekPLUnits на NumbClicks элементов.


 
Галинка   (2004-02-03 12:07) [37]

Доброго времени суток всем, кто заглянул сегодня ко мне на ветку...

Значит теперь задача такая... Имеется файл (*.jpg) с изображением исходной сейсмограммы. Его нада загрузить в TImage и оцифровать. Т.е. раскрасить трассы разными цветами, а потом через определенный шаг по Х поднять перепендикуляры, до точек нужных цветов.

Раскрашивать кривые думаю, апроксиммируя их ломанной заданного цвета.
Цвета всех ломанных буду запоминать, наверное, в массив - TColorArray = array of TColor;

Вот вкраце суть новой заморочки... Только громко не смейтесь и сильно не плюйтесь... Мониторы всетаки ваши... :)

Заранее спасибо всем кто ответит. Если что не понятно спрашивайте.


 
Romkin   (2004-02-03 12:34) [38]

Уточнение, по общению в чате: Автоматическая программная трассировка не требуется. Требуется:
1. вывести изображение
2. предоставить пользователю возможность проведения мышкой кривых поверх изображения, выбранным цветом
3. Создать координатную сетку к этим кривым, с определенным шагом в секундах. Предполагается, что шаг изображения точек/сек известен.
4. сохранить результат
Так?
Что из этого специфицировано? В каком виде нужен результат?


 
Галинка   (2004-02-03 12:54) [39]

Для Ромкина:
Так и не так...
1) Вывести изображение;
2) Зарегистрировать его в нужной системе отсчета, типа апмлитуда - время (y-x);
3) Обвести трассы нужными цветами, запомнив цвета в какой-то структуре, ну типа массива;
4) Задать шаг оцифровки в реальных (времени) единицах, оттранслировать его в единицы изображения;
5) "Просканировать" изображение по вертикалям через deltax с целью выявления точек заданного цвета (цвета беруться из заранее сохраненной стурктуры);
6) Как только нашли точку, заносим её в динамический массив "на свое место".

Пока все.


 
Галинка   (2004-02-03 15:54) [40]

Для Анатолия Подгорецкого.
Так вот по поводу Вашего алгоритма.

procedure TForm1.Button1Click(Sender: TObject);
begin
NumbClick:=NumbClick+1;
SetLength(Form1.TekDArray,NumbClick);
TekDArray[NumbClick]:=NumbClick;
Form1.Edit1.Text:=InTToStr(TekDArray[NumbClick]);
end;

Все равно не пашет. Может из-за самого компилятора?



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.011 c
14-39078
ИМХО
2004-01-23 22:45
2004.02.13
Теория Большого Взрыва


1-38822
Maxio
2004-02-04 17:08
2004.02.13
Проценты


4-39146
Pat
2003-12-10 17:51
2004.02.13
GetUserName или мои кривые руки? :-)


3-38703
alless
2004-01-22 15:06
2004.02.13
Boyce - Code


1-38944
Лысый
2004-02-04 08:19
2004.02.13
ComboBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский