Главная страница
    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.037 c
14-1132652595
SerJaNT
2005-11-22 12:43
2005.12.11
Client and Server


5-1116325152
Rep
2005-05-17 14:19
2005.12.11
Компонент для работы с базами данных DataSet или DataSource?


14-1132554332
Жук
2005-11-21 09:25
2005.12.11
Музыка из Цивилизации 4


3-1130403953
Zhekson
2005-10-27 13:05
2005.12.11
(Сохранение базы)Invalid File Name


14-1132696208
Separator
2005-11-23 00:50
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский