Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.049 c
3-1130058026
darklord
2005-10-23 13:00
2005.12.11
update тока одной записи


14-1132637157
DelphiN!
2005-11-22 08:25
2005.12.11
Отоброжение смежных ячеек


4-1125515885
Дмитрий_05
2005-08-31 23:18
2005.12.11
Создать виртуальный зашифрованный диск


4-1129190985
312Kbps
2005-10-13 12:09
2005.12.11
Имя пользователя в домене !


14-1132214056
Карелин Артем
2005-11-17 10:54
2005.12.11
Определение пола автоматом.