Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2009, 20:00   #1
Ivin
Пользователь
 
Регистрация: 08.10.2008
Сообщений: 17
По умолчанию Динамический массив

Столкнулся с небольшой проблемкой.
....
For i := 0 to Size-1 do
For j := 0 to Size-1 do
begin
A [j, i, 0] := GetRValue(bitmap.Canvas.Pixels[j,i]);
A [j, i, 1] := GetGValue(bitmap.Canvas.Pixels[j,i]);
A [j, i, 2] := GetBValue(bitmap.Canvas.Pixels[j,i]);
end;
....
glBindTexture( GL_TEXTURE_2D, B[0] );
....
При работе с обычными массивами
....
A: Array [0..127,0..127,0..2]of GLubyte;
B : Array [0..1] of GLUint;

....
Все работает нормально, но если массивы будут динамические то выдает ошибку на строке glBindTexture( GL_TEXTURE_2D, B[0] );, если массив A будет обычным, а B динамическим то ошибка выйдет на строке A [j, i, 0] := GetRValue(bitmap.Canvas.Pixels[j,i]);
....
A : Array of Array of Array of GLubyte;
B : Array of GLUint;
SetLength(A,128,128,2);
SetLength(B,1);
....
Подскажите плиз, где я допускаю ошибку?
Ivin вне форума Ответить с цитированием
Старый 26.02.2009, 01:02   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я не телепат, потому
либо приведи текст ошибки
либо проверяй размер массива
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.02.2009, 10:13   #3
Котовский
Пользователь
 
Аватар для Котовский
 
Регистрация: 24.12.2008
Сообщений: 19
По умолчанию

лично меня смущает запись SetLength(A,128,128,2); что-то, по-моему многовато параметров вы в функцию передаете. Скорее всего,здесь ошибка.
Пока жирафы думают, кролики делают!
Котовский вне форума Ответить с цитированием
Старый 26.02.2009, 12:09   #4
Ivin
Пользователь
 
Регистрация: 08.10.2008
Сообщений: 17
По умолчанию

Текст ошибки:

Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 0044CB75 in module 'Project1.exe'.Read of address 00000001'.
Process stopped. Use Step or Run to continue.

SetLength(A,128,128,2);
Это задание размера динамического массива. У меня масиив трех мерный, поэтому 4 параметра (сам массив и 3 значения его размера). Так что здесь все должно быть нормально.
Ivin вне форума Ответить с цитированием
Старый 26.02.2009, 19:27   #5
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от Ivin Посмотреть сообщение
A: Array [0..127,0..127,0..2]of GLubyte;
B : Array [0..1] of GLUint;
....
SetLength(A,128,128,2);
SetLength(B,1);
Что-то тут размеры разные.
[128][128][3],[2] - [128][128][2],[1].
Somebody вне форума Ответить с цитированием
Старый 26.02.2009, 19:41   #6
Ivin
Пользователь
 
Регистрация: 08.10.2008
Сообщений: 17
По умолчанию

SetLength(B,1);
Это вообще другой (B) массив. Массив A это пиксели текстуры (нужно для загрузки), а B это список текстур.
Ivin вне форума Ответить с цитированием
Старый 26.02.2009, 20:04   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

теббе указывают на то что ты здесь
Код:
A: Array [0..127,0..127,0..2]of GLubyte;
B : Array [0..1] of GLUint;
обьявляешь одни массивы(A[128,128,3];B[2])
а здесь:
Код:
SetLength(A,128,128,2);
SetLength(B,1);
другие(A[128,128,3];B[1])
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.02.2009, 23:24   #8
Ivin
Пользователь
 
Регистрация: 08.10.2008
Сообщений: 17
По умолчанию

Это ничего существенного не меняет. При использовании обычных массивов с не правильными размерами вылаезиет ошибка выходе за границы массива, но не ЭТО. Ошибочка действительно имела место быть, но до нее просто не доходила работа программы.
Надо было вот так SetLength(A,128,128,3);, но это ничего не изменило. Ошибка продолжает вылазить. В массиве B вообще используется только 0й элемент, так что там размер в принципе не важен.
Я так думаю что это что то именно OpenGL не нравится. А вообще разрешается ли в OpenGL загружать текстуры при помощи динамических массивов.
И еще одно, все это происходит в процедурах отдельного класса и с переменными этого класса. Возможно в этом проблемма.
Код:
Type TClas=class
A: Array [0..127,0..127,0..2]of GLubyte;
B : Array [0..1] of GLUint;
//A : Array of Array of Array of GLubyte;
//B : Array of GLUint;
TexCol:integer;
procedure TexGen(Name:string;Size:integer);
end;

procedure TClas.TexGen(Name:string;Size:integer);
begin
   glBindTexture( GL_TEXTURE_2D, B[TexCol] );
   PloadBMP(Name,Size);
   glTexImage2D( GL_TEXTURE_2D, 0, 3, Size, Size, 0, GL_RGB, GL_UNSIGNED_BYTE, @A );
   glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
   glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
   TexCol:=TexCol+1;
end;
Ошибка происходит на строке:
glBindTexture( GL_TEXTURE_2D, B[0] );

Последний раз редактировалось Ivin; 27.02.2009 в 08:28.
Ivin вне форума Ответить с цитированием
Старый 27.02.2009, 01:02   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Жаль у меня Дельфи здох...постарался бы помочь точнее...

при той ошибке варианта два...
либо ты неверно применяешь процедуру
либо ошибка в переменных(не задан массив, или неверное значение переменной TexCol)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.02.2009, 08:28   #10
Ivin
Пользователь
 
Регистрация: 08.10.2008
Сообщений: 17
По умолчанию

TexCol, вроде правильно, она всегда равна 0.
Значит все же ошибка в динамических массивах. Ведь если массив не динамический то работает отлично, а так отказывается. Жаль.
Ivin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамический массив Dimon Паскаль, Turbo Pascal, PascalABC.NET 3 21.03.2008 18:08
Динамический массив _ares_ Паскаль, Turbo Pascal, PascalABC.NET 3 26.12.2007 23:54
динамический массив Diller Помощь студентам 48 07.10.2007 16:43
Динамический массив. Mickle Помощь студентам 9 21.06.2007 20:31
Динамический массив Mickle Общие вопросы Delphi 8 19.06.2007 06:45