Текущий архив: 2005.12.11;
Скачать: CL | DM;
ВнизПроблемы при передаче массива в другй модуль Найти похожие ветки
← →
SamProf © (2005-11-24 14:50) [0]Народ помогите, бо то-ли лыжи не едут или я .....
вот такие типы определены: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 чём проблема?
← →
umbra © (2005-11-24 14:57) [1]а что такое
b
?
← →
TUser © (2005-11-24 14:58) [2]Жуть - зачем inc"ом мучать указатель. Передавай просто два указателя, а то и просто два массива - оно проще и обычно так и делают.
А причина - после inc у тебя указатель увеличился, а то, что оказалось в этом новом месте в памяти (неизвестно что) проинтерпретировалось, как массив. Так получилось, что в этой памяти лежали нули, могла бы абракадабра оказаться.
← →
Digitman © (2005-11-24 15:01) [3]сначала перестань нам тут лапшу на уши вешать)
если RunGraphic у тебя объявлен как процедура без параметров, какого ж ты вызываешь ее с параметрами ?
← →
umbra © (2005-11-24 15:04) [4]из справки про Inc:
Если X - указатель, процедура увеличивает его значение на произведение N на размер типа, на который указывает X.
Так что вместоinc(p,sizeof(T40b));
надо писатьinc(p);
← →
SamProf © (2005-11-24 15:07) [5]
> 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ами, а значит и получить я должен то-же! или не так?
← →
SamProf © (2005-11-24 15:10) [6]
> umbra © (24.11.05 15:04) [4]
> из справки про Inc:Если X - указатель, процедура увеличивает
> его значение на произведение N на размер типа, на который
> указывает X. Так что вместо inc(p,sizeof(T40b)); надо писать
> inc(p);
Превеликое СПАСИБО!!!!!!!!!!!!!!!!!!!!!!!!
← →
evvcom © (2005-11-24 15:13) [7]
> если RunGraphic у тебя объявлен как процедура без параметров,
> какого ж ты вызываешь ее с параметрами ?
Да могёт и такое быть. У него RunGraphic; реализация приведена, а в интерфейсной части написано с параметрами. Меня такое тоже коробит, но компилятор пропускает такое. Имхо, а зря.
← →
evvcom © (2005-11-24 15:17) [8]
> TUser © (24.11.05 14:58) [2]
> Жуть - зачем inc"ом мучать указатель. Передавай просто два
> указателя, а то и просто два массива - оно проще и обычно
> так и делают.
Да, нормально inc"ом указатель. Обычно в Си такие параметры и передают и с указателями так и работают.
← →
TUser © (2005-11-24 15:18) [9]
> Мне в параметре b бкдут передавать массив 40байтнвх элементов
> - его мне надо получить и обработать..... num - это колличество
> этих элементов - он может =1 а может и 1000000....
> в общем мне будут передавить стока скока есть!
Прочитай про динамические массивы и передачу параметров по ссылке.
← →
SamProf © (2005-11-24 15:20) [10]
> Да могёт и такое быть. У него RunGraphic; реализация приведена,
> а в интерфейсной части написано с параметрами. Меня такое
> тоже коробит, но компилятор пропускает такое. Имхо, а зря.
>
а сее учень даже удобно, если не трогать перегрузку фукций, если ты хочешь изменить параметры функции, то изменять гадо только в интерфейсной части, а не там и там! Вот!
Кстати блогадаря этому я ещё и баг у себя откопал!.....
← →
evvcom © (2005-11-24 16:05) [11]
> TUser © (24.11.05 15:18) [9]
У него не динамический массив в понятиях Дельфи, т.е. не array of type, а array[type1] of type2. Т.е. массив как бы статический. Но место под него выделяется динамически.
Единственное, что замечу, обычно, массивы индексируют с нуля, а не 1.
← →
evvcom © (2005-11-24 16:08) [12]
> а сее учень даже удобно,
Ты забыл "имхо" добавить. А мое имхо, что сее все-таки неудобно. Я лучше в очень редких случаях поменяю и там и там, чем очень часто смотреть на реализацию метода и прыгать на декларацию, чтобы посмотреть, а что же это за параметр такой? Так что тут на вкус и цвет...
← →
TUser © (2005-11-24 16:24) [13]
> У него не динамический массив в понятиях Дельфи
Вот я и посоветовал прислушаться к этим весьма удобным понятиям. Хотя, дело автора, конечно.
Страницы: 1 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.046 c