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

Вниз

Проблемы при передаче массива в другй модуль   Найти похожие ветки 

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

Наверх





Память: 0.48 MB
Время: 0.066 c
2-1132694527
Бандерас
2005-11-23 00:22
2005.12.11
Вставка из буфера обмена только один раз ...


2-1132598088
Tapok
2005-11-21 21:34
2005.12.11
Как узнать размер класера?


1-1132052114
ANB
2005-11-15 13:55
2005.12.11
Каким способом проще всего вытянуть данные из ячеек Excel в Delph


2-1132499036
Express
2005-11-20 18:03
2005.12.11
TRichEdit


14-1132410065
quickblack
2005-11-19 17:21
2005.12.11
Командная строка DOS





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