Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как распознать номер элемента массива  (Прочитано 12093 раз)
0 Пользователей и 1 Гость смотрят эту тему.
msdubov
Гость
« : 03-02-2007 18:13 » 

Я пишу одну игрушку на C#, так вот, там я создаю поле (8x8) из PictureBox'ов.
Затем я присваиваю каждой картинке один и тот же обработчик:

Код:
PictureBox[,] pb1 = new PictureBox[8, 8];

for (int i = 0; i < 8; i++)
{
        for (int j = 0; j < 8; j++)
        {
                    pb1[i, j] = new PictureBox();

                    ...

                    pb1[i, j].Click += ImgClick;
        }
}

void ImgClick(object obj, EventArgs args)
{
PictureBox pb = obj as PictureBox;

????
}

А дальше мне необходимо узнать, каким по счету в массиве pb1 является pb2, возможно ли это?
И если нет, как поступать?
« Последнее редактирование: 13-12-2007 18:37 от Алексей1153++ » Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 03-02-2007 19:24 » 

Пробегись по массиву и сравни pb, который ты получил в функции с каждым объектом массива. Это пока единственное, что приходит в голову.  Если подумать, то может еще что-то наскребется Улыбаюсь, глядишь, еще идеи кто-то подаст Ага.
Записан

ещё один вопрос ...
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 04-02-2007 06:49 » 

Цитата
необходимо узнать, каким по счету в массиве pb1 является pb2
- не совсем понятна задача... где тут pb2 ?

а если нужно определить номер элемента массива , то проще по адресам
Код:
A arr[xmax,ymax];//

A elem=arr[?,?]; // имеется некий элемент

if(&elem > arr)
{
   int N_zb = &elem-arr; // порядковый номер в массиве
   int xelem_zb = N_zb%ymax;
   int yelem_zb = N_zb/ymax;

   //также тут надо проверить на максимальные индексы
   if(xelem_zb<xmax && yelem_zb<ymax)
   {
      //xelem_zb,yelem_zb - искомые индексы
   }
   else
   {
      //элемент не в массиве
   }

}
else
{
   //элемент не в массиве
}
Записан

msdubov
Гость
« Ответ #3 : 04-02-2007 15:57 » 

Мне нужно знать в ImgClick i и j того элемента, который его вызвал, потому что у меня есть параллельный массив других объектов (Field именуется) и в обработчике мне необходимо обратиться к элементу этого массива с теми же i и j.
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 04-02-2007 17:12 » 

а чем мой код не устраивает? Улыбаюсь

в принципе так можно определить не только индекс, но и даже массив, из которого элемент взят


кстати. Если эти два массива у тебя одинакового размера, то даже индекс высчитывать не надо:

Код:
A arr1[xmax,ymax];
B arr2[xmax,ymax];
...
A elem=arr1[?,?]; // имеется некий элемент
...
{
   B* pElem_B=0;
   int N_zb = &elem-arr1; // порядковый номер в массиве 1
   pElem_B=(arr2+N_zb);
   pElem_B->... ; //pElem_B - указатель на искомый элемент во 2 массиве

но адреса проверять на границы всё равно надо )
« Последнее редактирование: 04-02-2007 17:19 от Алексей1153++ » Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 04-02-2007 20:23 » 

Алексей1153++, это форум по .NET, а не по C++. Судя по коду, речь идёт о C#. Никакой арифметики с указателями. Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 04-02-2007 20:29 » 

dimka, там нету что ли?
*озадачен*

тогда остаётся одно - хранить индексы в самом элементе...
« Последнее редактирование: 04-02-2007 20:31 от Алексей1153++ » Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 04-02-2007 21:06 » 

Алексей1153++, В шарпе указатели боком ходют. Напрямую с ними не играются. Привыкай.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 05-02-2007 16:05 » 

Finch, не притронусь никогда к вашему шарпу ))
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 05-02-2007 16:19 » 

Да фиг с ним, что он показал на С++. СМысл-то один- сравнить адреса объектов. Пускай юзает Equal. Т.е. если obj.Equal(obj1)==true, то объекты указывает на одну область памяти, иначе нет. Один объект он получит в качестве перфого параметра функции обработчика собтия. Пусть его и сравнит со всеми объектами массива.  В чем проблема-то???
Записан

ещё один вопрос ...
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 05-02-2007 16:57 » 

nikedeforest, скорость буде ниже несравнимо )
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 05-02-2007 17:03 » 

На каком Пентиуме ты это заметишь? Может на асм вообще перейдешь тогда? Ага А хрен ли мелочится, у нас в терминальном комплексе на кафедре плакатик висит - сидит программист за компьютером, ав на клавиатуре только две клавиши. И надпись на плакате real  code - binary code.
з.ы. Пояснять какие клавиши на клавиатуре не надо я думаю.
« Последнее редактирование: 05-02-2007 17:06 от nikedeforest » Записан

ещё один вопрос ...
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 05-02-2007 17:07 » 

nikedeforest, а если массив будет 10000000*10000000 ? )

к игре , где 8*8 - там фигня конечно.
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 05-02-2007 17:11 » 

Если такой массив будет, то стоит задуматься о внедрении БД в программу Ага
Записан

ещё один вопрос ...
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 05-02-2007 17:14 » 

nikedeforest, не в этом сссссуть, а что уходили от бейсика, а пришли туда же... Я уже не могу без указателей
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 05-02-2007 17:18 » 

А что ты именно не можешь без них? Я помню единственный момент, когда  мне помогли указатели, это когда я работал с криптографией. А где еще ты не можешь без них обойтись? И то, там (в том случае) можно обойтись без них, использованием побитовых операторов.
« Последнее редактирование: 05-02-2007 17:23 от nikedeforest » Записан

ещё один вопрос ...
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 05-02-2007 17:23 » 

nikedeforest, я постоянно использую - при работе с массивами, сортировке, передачи в параметры больших структур. На скорости отражается очень хорошо, я во многих случаях специально проверял , поэтому и оптимизировал
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 05-02-2007 17:25 » 

ПРи передаче параметров, если тип структурный, то в .НЕТ передается тоже адрес на область, а не   побитовая копия объекта. Что-то еще?
з.ы. Кстати, какие выйгрыши были-то? А то может ты выйграл пару миллисекунд и радовался, что твоя программа работает чуть быстрее при общей работате в 10 минут Улыбаюсь
« Последнее редактирование: 05-02-2007 17:29 от nikedeforest » Записан

ещё один вопрос ...
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 05-02-2007 17:38 » 

nikedeforest, ты меня совсем за идиота принимаешь? ) Сортировка при помощи указателей, когда элементы - по килобайту , тут разница большая идёт, на минуты

конечно от мощности машины зависит, не спорю

а кроме того, указатели - это красиво )
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 05-02-2007 17:51 » 

Цитата
а кроме того, указатели - это красиво )
По-моему это просто понты Ага.

Вот смотри, ты говоришь о том, что элементы по пару килобайт. По сути на .НЕТ ты для него создал бы свой пользовательский. А вот теперь смотри. Ты создал объект этого пользовательского типа и инциализировал его. А вот теперь если ты сделаешь так
UserType obj1=obj. То ты получишь практически тот же указатель на объект потому как obj1 будет указывать на тот же адрес. Понимаешь теперь? Это будет не копия, это будет тот же obj. Вот и все. Просто придется применить другую логику. Хотя ексли нравится возится с байтами напрямую, то что ж ты не пишешь на асме все же? Улыбаюсь Ох там как скорость возрастет Улыбаюсь)
Записан

ещё один вопрос ...
msdubov
Гость
« Ответ #20 : 05-02-2007 18:02 » 

Я пошел другим путем - написал PicBoxAdv, наследующий PictureBox, и добавил 2 свойства - x и y.
Перед тем как присвоить обработчик событий, я в цикле для каждого элемента массива указываю x=i и y=j. ImgClick теперь знает x и y.
Все работает!
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 05-02-2007 18:09 » 

Вот оно преимущество ООП Улыбаюсь. Вот тебе Алексей и скорость. msdubov, как я понимаю у тебя по сути получился пользовательский контрол, который наследован от PictureBox?
Записан

ещё один вопрос ...
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #22 : 05-02-2007 18:30 » 

nikedeforest, да я не буду с тобой спорить )  Кому что нравится...

Offtopic:

а ты уже бросил курить? Ага
Поставлю в угол.
« Последнее редактирование: 05-02-2007 18:38 от Алексей1153++ » Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 05-02-2007 18:42 » 

Offtopic:

А я собирался бросать курить?
НЕ бросил, не так уж много я и курю.

А по поводу спора. В споре рождается истина. Мы с тобой сравниваем две технологии. По-моему вполне познавательно. Мы вроде не распаляемся, я не бью в грудь кулаком. Все чинно, благородно, жаль без пива.
« Последнее редактирование: 05-02-2007 18:43 от nikedeforest » Записан

ещё один вопрос ...
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #24 : 05-02-2007 20:42 » 

Цитата: nikedeforest
Т.е. если obj.Equal(obj1)==true, то объекты указывает на одну область памяти, иначе нет.
Что-то мне казалось, что метод Equal как раз организует сравнение по содержанию, а не по адресу. Для сравнения указателей достаточно obj == obj1. Но не уверен - проверю на досуге.

Цитата: nikedeforest
А вот теперь если ты сделаешь так
UserType obj1=obj. То ты получишь практически тот же указатель на объект потому как obj1 будет указывать на тот же адрес. Понимаешь теперь? Это будет не копия, это будет тот же obj. Вот и все. Просто придется применить другую логику.
Сиплюсплюснику лучше так показывать
Код: (C++)
UserType &obj1 = obj;
Понятнее будет основная идея работы с переменными Улыбаюсь.

Цитата: msdubov
Я пошел другим путем - написал PicBoxAdv, наследующий PictureBox, и добавил 2 свойства - x и y.
Перед тем как присвоить обработчик событий, я в цикле для каждого элемента массива указываю x=i и y=j. ImgClick теперь знает x и y.
Наш человек! Улыбаюсь Я это сразу хотел предложить, только подумал, что для малого по размеру поля это не будет лучшим решением. Расход памяти vs расход времени - выбор безразличен, а решение уже было предложено.
« Последнее редактирование: 05-02-2007 20:44 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
msdubov
Гость
« Ответ #25 : 06-02-2007 16:06 » 

dimka
Зато Алексей1153++ предложил:
Цитата: Алексей1153++
тогда остаётся одно - хранить индексы в самом элементе...
Спасибо.

nikedeforest
Да, просто новый, наследующий PictureBox контрол с 2-мя новыми свойствами.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines