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
|
|
« Ответ #1 : 03-02-2007 19:24 » |
|
Пробегись по массиву и сравни pb, который ты получил в функции с каждым объектом массива. Это пока единственное, что приходит в голову. Если подумать, то может еще что-то наскребется , глядишь, еще идеи кто-то подаст .
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #5 : 04-02-2007 20:23 » |
|
Алексей1153++, это форум по .NET, а не по C++. Судя по коду, речь идёт о C#. Никакой арифметики с указателями.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 04-02-2007 20:29 » |
|
dimka, там нету что ли? *озадачен*
тогда остаётся одно - хранить индексы в самом элементе...
|
|
« Последнее редактирование: 04-02-2007 20:31 от Алексей1153++ »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #7 : 04-02-2007 21:06 » |
|
Алексей1153++, В шарпе указатели боком ходют. Напрямую с ними не играются. Привыкай.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 05-02-2007 16:05 » |
|
Finch, не притронусь никогда к вашему шарпу ))
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #9 : 05-02-2007 16:19 » |
|
Да фиг с ним, что он показал на С++. СМысл-то один- сравнить адреса объектов. Пускай юзает Equal. Т.е. если obj.Equal(obj1)==true, то объекты указывает на одну область памяти, иначе нет. Один объект он получит в качестве перфого параметра функции обработчика собтия. Пусть его и сравнит со всеми объектами массива. В чем проблема-то???
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #10 : 05-02-2007 16:57 » |
|
nikedeforest, скорость буде ниже несравнимо )
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #11 : 05-02-2007 17:03 » |
|
На каком Пентиуме ты это заметишь? Может на асм вообще перейдешь тогда? А хрен ли мелочится, у нас в терминальном комплексе на кафедре плакатик висит - сидит программист за компьютером, ав на клавиатуре только две клавиши. И надпись на плакате real code - binary code. з.ы. Пояснять какие клавиши на клавиатуре не надо я думаю.
|
|
« Последнее редактирование: 05-02-2007 17:06 от nikedeforest »
|
Записан
|
ещё один вопрос ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 05-02-2007 17:07 » |
|
nikedeforest, а если массив будет 10000000*10000000 ? )
к игре , где 8*8 - там фигня конечно.
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #13 : 05-02-2007 17:11 » |
|
Если такой массив будет, то стоит задуматься о внедрении БД в программу
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #14 : 05-02-2007 17:14 » |
|
nikedeforest, не в этом сссссуть, а что уходили от бейсика, а пришли туда же... Я уже не могу без указателей
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #15 : 05-02-2007 17:18 » |
|
А что ты именно не можешь без них? Я помню единственный момент, когда мне помогли указатели, это когда я работал с криптографией. А где еще ты не можешь без них обойтись? И то, там (в том случае) можно обойтись без них, использованием побитовых операторов.
|
|
« Последнее редактирование: 05-02-2007 17:23 от nikedeforest »
|
Записан
|
ещё один вопрос ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #16 : 05-02-2007 17:23 » |
|
nikedeforest, я постоянно использую - при работе с массивами, сортировке, передачи в параметры больших структур. На скорости отражается очень хорошо, я во многих случаях специально проверял , поэтому и оптимизировал
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #17 : 05-02-2007 17:25 » |
|
ПРи передаче параметров, если тип структурный, то в .НЕТ передается тоже адрес на область, а не побитовая копия объекта. Что-то еще? з.ы. Кстати, какие выйгрыши были-то? А то может ты выйграл пару миллисекунд и радовался, что твоя программа работает чуть быстрее при общей работате в 10 минут
|
|
« Последнее редактирование: 05-02-2007 17:29 от nikedeforest »
|
Записан
|
ещё один вопрос ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #18 : 05-02-2007 17:38 » |
|
nikedeforest, ты меня совсем за идиота принимаешь? ) Сортировка при помощи указателей, когда элементы - по килобайту , тут разница большая идёт, на минуты
конечно от мощности машины зависит, не спорю
а кроме того, указатели - это красиво )
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #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
|
|
« Ответ #21 : 05-02-2007 18:09 » |
|
Вот оно преимущество ООП . Вот тебе Алексей и скорость. msdubov, как я понимаю у тебя по сути получился пользовательский контрол, который наследован от PictureBox?
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #22 : 05-02-2007 18:30 » |
|
nikedeforest, да я не буду с тобой спорить ) Кому что нравится... Offtopic: а ты уже бросил курить? Поставлю в угол.
|
|
« Последнее редактирование: 05-02-2007 18:38 от Алексей1153++ »
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #23 : 05-02-2007 18:42 » |
|
Offtopic: А я собирался бросать курить? НЕ бросил, не так уж много я и курю.
А по поводу спора. В споре рождается истина. Мы с тобой сравниваем две технологии. По-моему вполне познавательно. Мы вроде не распаляемся, я не бью в грудь кулаком. Все чинно, благородно, жаль без пива.
|
|
« Последнее редактирование: 05-02-2007 18:43 от nikedeforest »
|
Записан
|
ещё один вопрос ...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #24 : 05-02-2007 20:42 » |
|
Т.е. если obj.Equal(obj1)==true, то объекты указывает на одну область памяти, иначе нет. Что-то мне казалось, что метод Equal как раз организует сравнение по содержанию, а не по адресу. Для сравнения указателей достаточно obj == obj1. Но не уверен - проверю на досуге. А вот теперь если ты сделаешь так UserType obj1=obj. То ты получишь практически тот же указатель на объект потому как obj1 будет указывать на тот же адрес. Понимаешь теперь? Это будет не копия, это будет тот же obj. Вот и все. Просто придется применить другую логику. Сиплюсплюснику лучше так показывать UserType &obj1 = obj; Понятнее будет основная идея работы с переменными . Я пошел другим путем - написал 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++ предложил: тогда остаётся одно - хранить индексы в самом элементе...
Спасибо. nikedeforestДа, просто новый, наследующий PictureBox контрол с 2-мя новыми свойствами.
|
|
|
Записан
|
|
|
|
|