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

Вниз

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

Наверх




Память: 0.46 MB
Время: 0.007 c
4-73952
Delphi 5.01
2002-08-03 12:56
2002.09.23
kak proverit najati li dve klavishi VK_Shift+VK_R !


8-73778
indigo
2002-05-20 21:15
2002.09.23
images


1-73631
easy
2002-09-12 13:45
2002.09.23
Как из компонента обрабатывать события предка?


14-73814
Udjin
2002-08-26 08:41
2002.09.23
Интересную телегу мне прислали


4-73934
Vitalik
2002-08-05 22:49
2002.09.23
MessageBoxEx





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