Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двумерный динамический массив, +еще обычный 
V
    Опции темы
Vetos
Дата 18.9.2008, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 1
Всего: 4



Здравствуйте программисты!
Появилась проблема в заполнении такого массива
Код

   Texture:array of array of array[0..3] of GLUByte;

Вот заполнение
Код

Bitmap:=TBitmap.Create;
Bitmap.LoadFromFile(filename);
Width:=Bitmap.Width;
Height:=Bitmap.Height;
SetLength(Texture,Width);
   for i:=0 to width-1 do
    for j:=0 to height-1 do
     begin
       SetLength(Texture[i],Height);
       Texture[i,j,0]:=GetRValue(Bitmap.Canvas.Pixels[i,j]);
       Texture[i,j,1]:=GetGValue(Bitmap.Canvas.Pixels[i,j]);
       Texture[i,j,2]:=GetBValue(Bitmap.Canvas.Pixels[i,j]);
       Texture[i,j,3]:=255;
     end;
Bitmap.Free;



Вродебы на первый взгляд все правильно(ну незнаю это на мой взгляд smile ), а вот на экране у меня вместо нормальной текстуры этаже картинка только немного сжатая и повторяющаяся несколько раз(отвлекся).

Однако если явно описать массив
Код

Texture:array[0..255,0..255,0..3]of GLUByte;

Просто картинка 256х256, это я точно знаю))
И опустить строки с SetLength то картинка отображается нормально.
Немогу понять глюка.В приклепленном файле скриншоты.
Если скажете что не по адресу, это в графику, то эт не так, с графикой проблем нет, динамический массив неправильно заполняется, помогите пожалуйсто!!!






Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  ________.rar 101,37 Kb


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
Alexeis
Дата 18.9.2008, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Vetos, вместо массива указателей сделай матрицу

Код

SetLength(Texture, Width, Height);


Должно помочь.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Vetos
Дата 18.9.2008, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 1
Всего: 4



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


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
Alexeis
Дата 18.9.2008, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Vetos, может быть еще перепутал размеры строк и столбцов. Попробуй наоборот поменять размерности.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Vetos
Дата 18.9.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 1
Всего: 4



Так текстура квадратная я уже и ShowMessage проверял Width и Height. Уже в голову ничего не лезет smile 


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
Vetos
Дата 18.9.2008, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 1
Всего: 4



Короче я после загрузки массива записывал его в файл, получил два файла с массивами, сравнил их, они идентичны, тоесть все норм, дело в самой OpenGL, чот ненравится ей динамический массив.
 smile 


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
CodeMonkey
Дата 19.9.2008, 04:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Учли, что переменная динамического массива - это не указатель на первый элемент данных?
Как передаёте его в функцию?
А как сохраняли массивы? Если в функцию сохранения вы два раза передали одинаковые даные с разных массивов, то (при условии, что в OGL так же передаёте) и разницы при их выводе быть не должно.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Alexeis
Дата 19.9.2008, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(CodeMonkey @  19.9.2008,  03:41 Найти цитируемый пост)
Учли, что переменная динамического массива - это не указатель на первый элемент данных?

  Точно! Ведь опенгл ждет что к нему прийдет матрица единым блоком, а не массив указателей на строки. Нужно переписать строки в непрерывный блок в памяти. Примерно так 
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  Texture : array of array of array[0..3] of GLUByte;
  i, j, LSize : Integer;
  pTexture, ptmp : PAnsiChar;
  Width, Height : Integer;
  Bitmap : TBitmap;
begin
  Bitmap:=TBitmap.Create;
  Bitmap.LoadFromFile(filename);
  Width:=Bitmap.Width;
  Height:=Bitmap.Height;
  SetLength(Texture, Width, Height);
  LSize := Height * 4 * sizeof(GLUByte);
  GetMem(pTexture, Width * LSize);
  ptmp := pTexture;
  for i:=0 to width-1 do
  Begin
    SetLength(Texture[i],Height);
    for j:=0 to Height - 1 do
     begin
       Texture[i,j,0]:=GetRValue(Bitmap.Canvas.Pixels[i,j]);
       Texture[i,j,1]:=GetGValue(Bitmap.Canvas.Pixels[i,j]);
       Texture[i,j,2]:=GetBValue(Bitmap.Canvas.Pixels[i,j]);
       Texture[i,j,3]:=255;
     end;
    Move(Texture[i][0], ptmp^, LSize);
    inc(ptmp, LSize);
  End;
  Bitmap.Free;

  // pTexture - указатель на нужную матрицу (не забыть удалить после использоваиня)
end;


Нужная текстура будет в указателе pTexture .


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Vetos
Дата 19.9.2008, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 1
Всего: 4



Alexeis, большое спасибо+

Теперь хочу немного разобраться как оно работает smile 

Получается трехмерный массив строится в памяти строкой за строку, я это понял из того что процедура Move копирует участок памяти из Texture в pTmp начиная с LSize. Так получается последовательность, что собсвенно и есть массив.
Если это я правильно понял.

Есть несколько вопросов:

1)Что такое PAnsiChar? Почемуто Ctrl+Левая мыша просто указывает мне на модуль System. Как оно описано?

2)Чем отличается динамический массив от обычного(я имею ввиду в памяти).

3)Что значит удалить pTexture после использования?

Спасибо!

Это сообщение отредактировал(а) Vetos - 19.9.2008, 20:13


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
Alexeis
Дата 19.9.2008, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(Vetos @  19.9.2008,  19:09 Найти цитируемый пост)
Получается трехмерный массив строится в памяти строкой за строку, я это понял из того что процедура Move копирует участок памяти из Texture в pTmp начиная с LSize. Так получается последовательность, что собсвенно и есть массив.
Если это я правильно понял.

  Ну почти, строка за строкой это двумерный массив, но каждый элемент строки тоже массивчик из 4 элементов, поскольку он не динамической размерности то элементы строки идут непрерывным блоком. Если бы 3я размерность была динамической то каждый элемент строки был бы тоже указателем.

Цитата(Vetos @  19.9.2008,  19:09 Найти цитируемый пост)
1)Что такое PAnsiChar? Почемуто Ctrl+Левая мыша просто указывает мне на модуль System. Как оно описано?

  Простой типизировнный указатель. Указатель на символ. В данном случае удобно интерпретировать байты как символы, потому что над указателями типа  PAnsiChar можно производить арифметические операции (над другими нельзя, нужно дополнительное приведение). Раньше использовали PChar, но это уже не прокатывает в 2009й делфе так как там юникод, потому именно PAnsiChar.
Код

PAnsiChar = ^AnsiChar;


Цитата(Vetos @  19.9.2008,  19:09 Найти цитируемый пост)
2)Чем отличается динамический массив от обычного(я имею ввиду в памяти).

Одномерный динамический массив почти такой же как и простой, элементы идут друг за другом. Статическая матрица, это строки идущие одна за другой, динамическая матрица это массив указателей, каждый из которых указывает на свою строку.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Vetos
Дата 19.9.2008, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 1
Всего: 4



Спасибо smile 


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.