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

Вниз

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

 
вова   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.002 c
15-1402259403
Юрий
2014-06-09 00:30
2015.01.11
С днем рождения ! 9 июня 2014 понедельник


2-1387273889
_guest_
2013-12-17 13:51
2015.01.11
Текст по столбцам в Excel из Delphi XE4


2-1386666267
Scott Storch
2013-12-10 13:04
2015.01.11
Оптимизация SELECT-запроса


2-1387118291
demi
2013-12-15 18:38
2015.01.11
фильтр в делфи


2-1387229735
вова
2013-12-17 01:35
2015.01.11
Работа с указателями вопросы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский