|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
|  | 
|  | Опции темы | Поиск в этой теме | Опции просмотра | 
|  | 
| 
			 
			#1  
			
			
			
			
		 | |||
| 
 | |||
|  Передача массива в процедуру с помощью указателя var DATA : array of Float; //динамический массив, размер которого задаю в тексте программы. DATAlength: integer; i,num: integer; //далее идёт процедура, которая находит максимальный элемент в массиве, и возвращает номер этого элемента в массиве. В эту процедуру нужно передать массив(точнее указатель на массив, чтобы не загружать память) procedure maxelement(mass : array of Float; mNFFT : integer; var element : integer); begin element:=0; for i:=1 to mNFFT-1 do begin if abs(mass[i])>abs(mass[element]) then element:=i; end; end; //далее идёт кусок из текста, в котором обращаюсь к процедуре setlength(DATA, DATAlength); ... maxelement(DATA, DATAlength, num); Правильно ли я понимаю, что если оставить всё как описано выше, то в процедуру передаётся массив целиком, а не указатель на него? Если всё таки это передача указателя, то почему когда передаю массивы размерности примерно 100000 - 150000 элементов всё в порядке. А как передаю массив примерно на 360000 элементов, выскакивает ошибка в ходе выполнения программы, о каком-то переполнении. Подскажите пожалуйста как решить эту проблему. | 
| 
			 
			#2  
			
			
			
			
		 | ||||
| 
 | ||||
|   Stack overflow - переполнение стэка Код: pArrAddr := @any_array[Low(any_array)] // указатель на первый элемент в массиве Pointer(any_array) := pArrAddr; // из указателя обратно в массив (не копирует массив! просто переменную указывает на существующий массив) pArrAddr это и есть тот самый указатель на массив Последний раз редактировалось AleD, 13.03.2010 в 17:10. | 
| 
			 
			#3  
			
			
			
			
		 | |||
| 
 | |||
|   Очень извиняюсь, но не очень понятно. Можно как-нибудь написать относительно того текста и тех переменных которые у меня уже имются? Очень прошу! Самое интересное просто как это передать в процедуру. Последний раз редактировалось Smerch66, 13.03.2010 в 17:14. | 
| 
			 
			#4  
			
			
			
			
		 | ||||
| 
 | ||||
|   Код: var DATA : array of Float; //динамический массив, размер которого задаю в тексте программы. DATAlength: integer; i,num: integer; //далее идёт процедура, которая находит максимальный элемент в массиве, и возвращает номер этого элемента в массиве. В эту процедуру нужно передать массив(точнее указатель на массив, чтобы не загружать память) procedure maxelement(pMass : Pointer; mNFFT : integer; var element : integer); var mass: array of Float; begin Pointer(mass) := pMass; element:=0; for i:=1 to mNFFT-1 do begin if abs(mass[i])>abs(mass[element]) then element:=i; end; end; //далее идёт кусок из текста, в котором обращаюсь к процедуре setlength(DATA, DATAlength); ... maxelement(@DATA[Low(DATA)], DATAlength, num); как то так | 
| 
			 
			#5  
			
			
			
			
		 | |||
| 
 | |||
|   Спасибо большое получилось! То есть теперь в этой процедуре не нужно делать очистку массива? Finalize(mass); И ещё один важный вопрос: что это было за переполнение стека и с чем оно связано? | 
| 
			 
			#6  
			
			
			
			
		 | ||||
| 
 | ||||
|   Цитата: 
 перед вызовом функции в стек (просто буфер определённого размера, регулируется в настройках делфи) записываются передаваемые параметры, если стек переполняется то и происходит соответствующее исключение |