Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.01.11;
Скачать: CL | DM;

Вниз

Работа с указателями вопросы   Найти похожие ветки 

 
вова   (2013-12-17 01:35) [0]

есть функция

GetMassive(var InPTStart, InPTStop: pWord): boolean;
var
 sumBufX: TSimpleSearchArray;
 fSizeUS : integer;
begin
 .....................................

 InPTStart := @sumBufX[0];
 InPTStop  := @sumBufX[fSizeUS];

 result := true;
end;


вопрос: что будет когда эта функция выполнится? В вызывающей функции из которой были переданы InPTStart,InPTStop  они будут указывать на массив? или массив уничтожится при выходе из этой функции и указатели будут указывать хз куда? А если массив все еще будет существовать, то как его потом очистить? Указателям вызывающей функции присвоить nil? или при завершении вызывающей функции указатели итак обнулятся? И что если вызывающая функция передает эти полученные указатели в конструктор класса(уже без var), в котором они присваиваются переменным этого класса, когда вызывающая функция закончится единственные указатели на массив будут в переменных класса? и когда класс будет уничтожен массив также будет уничтожен?


 
RWolf ©   (2013-12-17 02:47) [1]

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


 
Ega23 ©   (2013-12-17 08:39) [2]


> или массив уничтожится при выходе из этой функции и указатели
> будут указывать хз куда?


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


>  или при завершении вызывающей функции указатели итак обнулятся?


В Delphi само ничего никогда не обнуляется. Исключение - счётчики ссылок, но тебе про это, похоже, ещё рановато...


> И что если вызывающая функция передает эти полученные указатели
> в конструктор класса(уже без var), в котором они присваиваются
> переменным этого класса, когда вызывающая функция закончится
> единственные указатели на массив будут в переменных класса?
>  и когда класс будет уничтожен массив также будет уничтожен?


Ничего не будет. Указатель - это просто указатель на некий адрес. Что по этому адресу сидит - это не его забота. Если аналогию провести, то у тебя есть квартира, ты адрес этой квартиры диктуешь товарищу (передаёи полученные указатели), тот записывает их в свой блокнот (в котором они присваиваются переменным этого класс), а потом блокнот рвёт (и когда класс будет уничтожен). Квартира-то не взорвалась, верно?


 
Вова   (2013-12-17 10:40) [3]


> В Delphi само ничего никогда не обнуляется. Исключение -
>  счётчики ссылок, но тебе про это, похоже, ещё рановато.
> ..


массив же сам обнуляется (

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

GetMassive(var  sumBufX: TSimpleSearchArray): boolean;
var
 fSizeUS : integer;
begin
 .....................................

 result := true;
end;

А вызывающая функция создает объект класса для которого собственно этот массив и создавался и т.е. когда я передам в конструктор этот массив, там мне его нужно будет опять копировать во второй массив, т.к. первый массив уничтожится после того как вызывающая функция отработает, а объект класса останется. Не торт. Хочу 1 массив и просто передать на него указатель (


 
DVM ©   (2013-12-17 10:46) [4]


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

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


 
Вова   (2013-12-17 10:50) [5]

InPTStart : ^TSimpleSearchArray;

New(InPTStart);
Dispose(InPTStart);

?

Вообще я где то читал, что память зарезервирована пока на нее указывает хоть 1 указатель (ну то есть она не будет отдана кому то другому), только не помню к чему это относилось.


 
Вова   (2013-12-17 10:54) [6]


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


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


 
Inovet ©   (2013-12-17 10:57) [7]

> [5] Вова   (17.12.13 10:50)
> что память зарезервирована пока на нее указывает хоть 1
> указатель (ну то есть она не будет отдана кому то другому)

Это ты не про Делфи читал, а про то, где есть сборщик мусора.


 
Вова   (2013-12-17 10:58) [8]


> InPTStart : ^TSimpleSearchArray;New(InPTStart);Dispose(InPTStart);


ток вот, где то тут задание размера массива.....т.е. динамический массив не получается.....


 
Вова   (2013-12-17 11:01) [9]


> Это я и написал, но этот массив я делаю, чтобы передать
> его в создаваемый класс. И второй получается нужен в классе,
>  потому что вызывающая функция (в которой массив будет локальной
> переменной) прекратит работу, а объект класса который она
> создала останется.


И да, объектов классов может быть несколько, и в каждом из них свой массив с разным содержимым, т.е. глобальный массив тоже не катит.


 
DVM ©   (2013-12-17 11:05) [10]


> Вова   (17.12.13 11:01) [9]


> И да, объектов классов может быть несколько, и в каждом
> из них свой массив с разным содержимым, т.е. глобальный
> массив тоже не катит.

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


 
Вова   (2013-12-17 11:05) [11]

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


 
MBo ©   (2013-12-17 11:06) [12]

А что такое TSimpleSearchArray ?


 
Вова   (2013-12-17 11:16) [13]

array of word;


 
MBo ©   (2013-12-17 11:24) [14]

тогда возня с указателями на массив и new/dispose совсем не нужна


 
Ega23 ©   (2013-12-17 12:58) [15]


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


Нормальная практика, не вижу никаких проблем.


 
Sapersky   (2013-12-17 19:29) [16]

Вообще я где то читал, что память зарезервирована пока на нее указывает хоть 1 указатель (ну то есть она не будет отдана кому то другому), только не помню к чему это относилось.

Применительно к дин. массивам (строкам, интерфейсам, вариантам) - да.
Но только при копировании переменных одного типа присвоением, т.е.
Var a,b : TSimpleSearchArray;
b:=a; // если уничтожить a, массив всё равно будет жить (под именем b)
Var a : TSimpleSearchArray;
    b : Pointer;
b:=@a[0]; // а так не будет

Ну и тебе уже говорили, наверное, что если подразумевается постоянная работа этого дела, да ещё и в реальном времени, то лучше выделять память заранее (включая создание объектов, битмапов и т.д.), а "на лету" создавать/уничтожать как можно меньше.


 
Вова   (2013-12-17 23:58) [17]

ну я поэксперементировал на тему создания на "лету", и массив 1920 на 1080 создается и уничтожается за 0.156 миллисекунды. Учитывая что самая быстрая обработка этого массива у меня занимает в районе 3 миллисекунд, то вроде бы вполне приемлемо на лету создавать массивы, т.к. разница не ощутима. А вот если например забабахать массив 19200 н 1080 тогда уже и скорость создания и освобождения будет раз в 10 медленнее, но таких массивов у меня нет. Поэтому я пока решил что лучше сэкономить на занимаемой памяти, чем на скорости.


 
DVM ©   (2013-12-18 00:04) [18]


> то вроде бы вполне приемлемо на лету создавать массивы,
> т.к. разница не ощутима.

Если постоянно выделять-освобождать большие блоки данных через некоторое время можем получить Out of Memory на ровном месте из за фрагментации памяти. Критично для программ 24*7.


 
вова   (2013-12-18 00:14) [19]

а битмап у меня остался только 1 и он существует постоянно. Если таки переделаю деланье скриншота через DirectX то ни одного битмапа не будет.

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


 
Ega23 ©   (2013-12-18 12:12) [20]

А какая задача-то решается?



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

Текущий архив: 2015.01.11;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.005 c
2-1387273889
_guest_
2013-12-17 13:51
2015.01.11
Текст по столбцам в Excel из Delphi XE4


11-1238844674
SPeller
2009-04-04 15:31
2015.01.11
MCK и D2009


15-1401983298
Павиа
2014-06-05 19:48
2015.01.11
Мыша сходит с ума.


15-1401375136
WalterWhite
2014-05-29 18:52
2015.01.11
Кириллица в Delphi


1-1329069169
Eraser
2012-02-12 21:52
2015.01.11
Форма в доп. потоке