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

Вниз

CopyMemory - ограничена по сайзу?   Найти похожие ветки 

 
Yaro   (2002-09-12 09:32) [0]

Люди, что за фигня?
У меня есть два указателя:
1. просто указатель
2. указатель на динамический массив
делаю ГетМэм для 1-го указателя,
пишу CopyMemory(_1, _2, "размер _2");
выскакивает ошибка типа Эцесс Волитейшин.
когда сайз относительно маленикий ставлю - 500 байт, например - все ок, а большие - фигня... У меня подозрение, что мой второй массив фрагментирован в памяти, такое может быть?
(обмен происходит внутри программы, не в ДЛЛ)


 
MBo   (2002-09-12 09:35) [1]

код покажи


 
Yaro   (2002-09-12 09:59) [2]

var t: array of longint;
<...>
setlength(t, n);
lalala(@t, n*4);
<...>

procedure lalala(_mass: pointer; size: integer);
var bb: pointer;
<...>
if dd.lpSurface = nil then exit;
bb := dd.lpSurface;
CopyMemory(bb, _mass, Size-1); - ошибка!

ну что-то в этом духе, в общем...


 
Старый Паскалист   (2002-09-12 10:02) [3]

lalala(@t [0], n*4);


 
Yaro   (2002-09-12 10:10) [4]

Старый Паскалист - А чего так? До этого хранится размер массива?


 
Alx2   (2002-09-12 10:17) [5]

>Старый Паскалист - А чего так? До этого хранится размер массива?

Ага. Динамический массив потому-что.


 
McSimm   (2002-09-12 10:22) [6]

@t - адрес переменной t, в которой хранится указатель на массив.
Т.е. Pointer(@t)^ - адрес массива.

@t[0] - адрес первого элемента массива.


 
McSimm   (2002-09-12 10:25) [7]

Где хранится размер массива не играет роли. Он в данном случае не при чем.


 
Старый Паскалист   (2002-09-12 10:28) [8]

2Yaro ©
Для обычного массива эти вещи совпадают.
Но динамический массив устроен по другому - это указатель на данные (сами данные при изменении размера массива могут быть
переразмещены в памяти)


 
Yaro   (2002-09-13 07:24) [9]

Старый Паскалист ->
другими словами, если t: array of integer, то
t - ячейка в памяти, в которой хранится указатель на первый элемент массива.
@t - указатель на указатель, который указывает на первый элемент массива. Аж смешно получается :)

Если я правильно понял, то мой код теперь должен выглядеть так:

var t: array of longint;

<...>

setlength(t, n);
lalala( {@}t, n*4);

<...>

procedure lalala(_mass: pointer; size: integer);
var bb: pointer;
<...>
if dd.lpSurface = nil then exit;
bb := dd.lpSurface;
CopyMemory(bb, _mass, Size-1); - ошибка?

правильно?


 
Набережных С.   (2002-09-13 09:24) [10]

Правильно, если убрать "- ошибка?":) и если действительно нужно Size-1, в чем я почему-то сомневаюсь.

> @t - указатель на указатель, который указывает на первый элемент массива. Аж смешно получается :)

А мне как-то нет...



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

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

Наверх




Память: 0.46 MB
Время: 0.006 c
1-73659
silenser
2002-09-11 17:41
2002.09.23
Окна


4-73950
Vladimir Prokofiev
2002-08-01 14:22
2002.09.23
Как в MDI-application избавиться от появления ScroollBar,


14-73855
France
2002-08-28 14:17
2002.09.23
А из Харькова тут есть кто?


6-73784
Valentain
2002-07-18 14:12
2002.09.23
Уже страшновато задавать вопрос про ... сокеты...


7-73913
Александр
2002-07-10 10:41
2002.09.23
Принтеры





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