![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы при передаче массива в другй модуль [D7, WinXP]
SamProf © (2005-11-24 14:50:00)Народ помогите, бо то-ли лыжи не едут или я .....
вот такие типы определены:
type
P40b=^T40b;
T40b=array [1..40] of byte;
в одном модуле чисто для теста делаю такую охинею:
var
_b,_b1:P40b;
begin
........
GetMem(_b,sizeof(t40b)*3);
_b1:=_b;
fillchar(_b^,sizeof(t40b),0);
_b^[1]:=1;
inc(_b);
fillchar(_b^,sizeof(t40b),0);
_b^[1]:=5;
inc(_b);
fillchar(_b^,sizeof(t40b),0);
_b^[1]:=7;
RunGraphic(_l,_b1,3);
.........
end;
А в другом вот что:
procedure RunGraphic;
var
p:P40b;
begin
p:=b;
for i:=1 to num do
begin
Вот тут я использую элементы данного массива посредством p^[]
inc(p,sizeof(T40b));
end;
end;
проблема в том, что первый массив передаётся отлично, а вот помле Inc следующий массив весь в нулях.......
D чём проблема?
TUser (2005-11-24 16:24:00) [1]
> У него не динамический массив в понятиях Дельфи
Вот я и посоветовал прислушаться к этим весьма удобным понятиям. Хотя, дело автора, конечно.
evvcom (2005-11-24 16:08:00) [2]
> а сее учень даже удобно,
Ты забыл "имхо" добавить. А мое имхо, что сее все-таки неудобно. Я лучше в очень редких случаях поменяю и там и там, чем очень часто смотреть на реализацию метода и прыгать на декларацию, чтобы посмотреть, а что же это за параметр такой? Так что тут на вкус и цвет...
evvcom (2005-11-24 16:05:00) [3]
> TUser © (24.11.05 15:18) [9]
У него не динамический массив в понятиях Дельфи, т.е. не array of type, а array[type1] of type2. Т.е. массив как бы статический. Но место под него выделяется динамически.
Единственное, что замечу, обычно, массивы индексируют с нуля, а не 1.
SamProf (2005-11-24 15:20:00) [4]
> Да могёт и такое быть. У него RunGraphic; реализация приведена,
> а в интерфейсной части написано с параметрами. Меня такое
> тоже коробит, но компилятор пропускает такое. Имхо, а зря.
>
а сее учень даже удобно, если не трогать перегрузку фукций, если ты хочешь изменить параметры функции, то изменять гадо только в интерфейсной части, а не там и там! Вот!
Кстати блогадаря этому я ещё и баг у себя откопал!.....
TUser (2005-11-24 15:18:00) [5]
> Мне в параметре b бкдут передавать массив 40байтнвх элементов
> - его мне надо получить и обработать..... num - это колличество
> этих элементов - он может =1 а может и 1000000....
> в общем мне будут передавить стока скока есть!
Прочитай про динамические массивы и передачу параметров по ссылке.
evvcom (2005-11-24 15:17:00) [6]
> TUser © (24.11.05 14:58) [2]
> Жуть - зачем inc'ом мучать указатель. Передавай просто два
> указателя, а то и просто два массива - оно проще и обычно
> так и делают.
Да, нормально inc'ом указатель. Обычно в Си такие параметры и передают и с указателями так и работают.
evvcom (2005-11-24 15:13:00) [7]
> если RunGraphic у тебя объявлен как процедура без параметров,
> какого ж ты вызываешь ее с параметрами ?
Да могёт и такое быть. У него RunGraphic; реализация приведена, а в интерфейсной части написано с параметрами. Меня такое тоже коробит, но компилятор пропускает такое. Имхо, а зря.
SamProf (2005-11-24 15:10:00) [8]
> umbra © (24.11.05 15:04) [4]
> из справки про Inc:Если X - указатель, процедура увеличивает
> его значение на произведение N на размер типа, на который
> указывает X. Так что вместо inc(p,sizeof(T40b)); надо писать
> inc(p);
Превеликое СПАСИБО!!!!!!!!!!!!!!!!!!!!!!!!
SamProf (2005-11-24 15:07:00) [9]
> umbra © (24.11.05 14:57) [1]
> а что такое b?
procedure RunGraphic(L:TList; b:P40b;num:integer);
> TUser © (24.11.05 14:58) [2]
> Жуть - зачем inc'ом мучать указатель. Передавай просто два
> указателя, а то и просто два массива - оно проще и обычно
> так и делают.
Мне в параметре b бкдут передавать массив 40байтнвх элементов - его мне надо получить и обработать..... num - это колличество этих элементов - он может =1 а может и 1000000....
в общем мне будут передавить стока скока есть!
> А причина - после inc у тебя указатель увеличился, а то,
> что оказалось в этом новом месте в памяти (неизвестно что)
> проинтерпретировалось, как массив. Так получилось, что в
> этой памяти лежали нули, могла бы абракадабра оказаться.
>
Я понимаю так :
Я выделяю массив из 3 элементов:
GetMem(_b,sizeof(t40b)*3);
точно такими-же Inc ами заполняю его и передаю его в процедуру
там Я этот указатель обрабатываю темеже incами, а значит и получить я должен то-же! или не так?
umbra (2005-11-24 15:04:00) [10]из справки про Inc:
Если X - указатель, процедура увеличивает его значение на произведение N на размер типа, на который указывает X.
Так что вместоinc(p,sizeof(T40b));надо писатьinc(p);
Digitman (2005-11-24 15:01:00) [11]сначала перестань нам тут лапшу на уши вешать)
если RunGraphic у тебя объявлен как процедура без параметров, какого ж ты вызываешь ее с параметрами ?
TUser (2005-11-24 14:58:00) [12]Жуть - зачем inc'ом мучать указатель. Передавай просто два указателя, а то и просто два массива - оно проще и обычно так и делают.
А причина - после inc у тебя указатель увеличился, а то, что оказалось в этом новом месте в памяти (неизвестно что) проинтерпретировалось, как массив. Так получилось, что в этой памяти лежали нули, могла бы абракадабра оказаться.
umbra (2005-11-24 14:57:00) [13]а что такое
b?