Главная страница
    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.48 MB
Время: 0.077 c
2-1132476842
The One
2005-11-20 11:54
2005.12.11
Как получить обратиться к полю класса (private) из регулярной...


3-1130236727
syte_ser78
2005-10-25 14:38
2005.12.11
Какой компонент правильно использывать?


14-1132418718
Pazitron_Brain
2005-11-19 19:45
2005.12.11
Как оживить картириджи?


2-1132769705
Plotnick
2005-11-23 21:15
2005.12.11
FormatFloat


2-1133043077
Дмитрий Ка
2005-11-27 01:11
2005.12.11
Как изменить знак перемнной?





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