Вниз
Скачать: CL | DM;

Работа с указателями в C и Pascal !!!   Найти похожие ветки 

← →
WebErr ©   (2004-02-13 18:09) [0]

В С массив от указателя почти ничем не отличается, в Пасе я встретился со следующими неприятностями:

Result {: ^Byte} := BytePointer + 3*(aX + RasterWidth*aY);

Выдаёт ошибку!!! Говорит, что нельзя складывать указатель и целое! Когда я разобрался, что указатель должен быть PChar, то тут же наткнулся на новую "бяку"!!!

Result {function: PChar} := PChar(BytePointer) + 3*(aX + RasterWidth*aY);

Несовместимость одинаковых типов Char и Byte - бред полный!!! Ну это ещё ладно, но когда он мне на:

PointPtr[0] {PointPtr: ^Byte} := GetRValue(aColor);

Выдал, что указатель и массив это совсем несовместимо в Пасе, то я понял, что пора писать в форум. "Выручайте, а то край" <(с)Брат 2>


← →
Dimka Maslov ©   (2004-02-13 18:13) [1]

1. Inc
2. Явное привдедение типов тебе поможет

3.
type
TByteArray = array[0..0] of Byte;
PByteArray = ^TByteArray;

var
P: PByteArray
Дальше работай как с массивом, но только не указывай константный индекс


← →
WebErr ©   (2004-02-13 18:19) [2]

В смысле?

P: PByteArray;
...
P[?] // чего с ним (вопросом) делать???

А почему нельзя константный индекс?!
И почему в Псе такая лажа с указателями?!


← →
y-soft ©   (2004-02-13 18:21) [3]

Все-таки C и Pascal языки разные, а не один язык с разным синтаксисом :)

Понятие "тип данных" в Паскале иное, гораздо более строгое
А разве это плохо?


← →
Palladin ©   (2004-02-13 18:22) [4]

Не вижу лажи... вернее вижу но не в Псе...

можешь и константный

type
TByteArray=array [0..MaxInt] of byte;
PByteArray=^TByteArray


← →
Dimka Maslov ©   (2004-02-13 18:26) [5]

>WebErr © (13.02.04 18:19) [2]
Индекс ставить


← →
WebErr ©   (2004-02-13 18:26) [6]

Так это вообще по смыслу получается P^[i], а как такой красоте присвоить указатель на байт, под который я уже выделил память?!


← →
Dimka Maslov ©   (2004-02-13 18:27) [7]

по смыслу так, но в данном случае ^ можно опустить, и работать как с массивом, а не как с указателем на массив


← →
WebErr ©   (2004-02-13 18:30) [8]

В смысле P^[i] и P[i] - это одно и то же?!! Странно как минимум! Но я попробую...


← →
Dimka Maslov ©   (2004-02-13 18:38) [9]

Синтаксис Delphi Pascal позволяет не разыменовывать указатели на массивы (array) и записи (record) при обращении к их элементам или полям, но требует разименовывания при обращении к записи в операторе with


← →
WebErr ©   (2004-02-13 18:43) [10]

А как же быть с динамически выделенной памятью под указатель на байт, мне теперь надо как-то выделить память либо под ваш тип, либо как-то совместить данные указателя на байт с указателем на байтовый массив, что маловероятно!!!


← →
Palladin ©   (2004-02-13 18:45) [11]

Ой... сделай лучше на Си, там проще же...


← →
WebErr ©   (2004-02-13 18:50) [12]

У меня сейчас нету С! А жаль!!!


← →
y-soft ©   (2004-02-13 18:56) [13]

>WebErr © (13.02.04 18:43) [10]

А в чем сложность-то?

Pascal по умолчанию не проверяет выход за объявленные границы массива.

Т.е. выделяйте памяти, сколько угодно, присваивайте ее указателю на массив из одного байта (Array[0..0] of Byte) и спокойно используйте. Только не забывайте следить, чтобы индекс не выходил за границы...


← →
WebErr ©   (2004-02-13 19:04) [14]


> Только не забывайте следить, чтобы индекс не выходил за
> границы...

В смысле не выходил?!! А такая штука, например, как

SomeByte := BytePtr[3*aX+RasterWidth*aY];

?!! Как быть, если 3*aX+RasterWidth*aY > 0, 0 который и есть граница?


← →
y-soft ©   (2004-02-13 19:07) [15]

>WebErr © (13.02.04 19:04) [14]

Я не точно выразился - имеется в виду граница реально выделенной памяти, а то может быть AV :)



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.02 c
1-79919
norman
2004-02-08 22:21
2004.02.25
Ошибка при запуске программы на delphi


8-80025
Agent[007]
2003-10-10 11:07
2004.02.25
OpenGL


14-80246
тихий вовочка
2004-02-04 07:00
2004.02.25
Я стал папой!


14-80275
OF
2004-02-04 06:37
2004.02.25
Конвертор VB в Delphi


1-79908
AlexandrKu
2004-02-09 16:14
2004.02.25
Доступ к ячейкам Excel через OleContainer




   Наверх