Current time: 23.03.2024, 12:32 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
С++, общая тема
Author Message
gamecreator Offline

Posts: 7107
Post: #91

не легче ли определять какая кнопка находится под указателем и ее подсвечивать?


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
13.02.2012 21:47
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #92

Нет) Я не могу сообразить как такое провернуть.
Например если делать через форммаусмув то координаты на кнопке прекращаются, а где они прекратились - тот еще геммор определить - многотонные Иф.
Это как я вижу.


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
13.02.2012 22:10
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #93

packa Wrote:Нет) Я не могу сообразить как такое провернуть.

http://bit.ly/xoDRO9

Ну и плюс - событие OnMouseMove для всех кнопок сделай единым. Например, назначь его всем кнопкам как SpeedButton1MouseMove, а внутри него обращайся не к Button1, а к Sender (приведённому к классу TSpeedButton с помощью static_cast или dynamic_cast).


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
13.02.2012 22:39
Find all posts by this user Quote this message in a reply
gamecreator Offline

Posts: 7107
Post: #94

и static TObject *previousSender чтобы возвращать картинку у предыдущей кнопки. главное проверять чтобы кнопка изменялась и не грузить попусту картинки.


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
13.02.2012 23:15
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #95

Загружаю изображение, рисую его его на канве (Canvas->Drow)
Какими способами его можно повернуть?

Для упрощения - вид сверху, машинка поворачивает.


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
(This post was last modified: 29.03.2012 20:00 by packa.)
29.03.2012 19:59
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #96

Насколько я помню, у VCL нету стандартных функций для "поворота канвы" (равно как и для "поворота картинки").
Так что - либо написать свою функцию поворота (это нетрудно), либо пользоваться сторонними библиотеками типа DirectX.


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
29.03.2012 20:28
Find all posts by this user Quote this message in a reply
gamecreator Offline

Posts: 7107
Post: #97

если можно перейти к контексту устройства, то через GDI можно повернуть с помощью PlgBlt


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
29.03.2012 21:29
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #98

Это снова я)

Нужно передать в функцию Двумерный массив int enemy_group[4][3]

void zahvat (массив, int a){
//Некоторые действия с массивом
a++;
}

На выход нужно переменную а.

Просто с переменными получалось, хоть и тяжело, а с массивом вообще ни в какую...
Гуглил, находил, ничего не понял.


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
01.04.2012 18:29
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #99

Вот поэтому, Пакка, я и рекомендовал тебе читать про указатели - без них в C++ никуда. Знал, что понадобится...
Или, если бы ты юзал динамические массивы вместо статических (что я также рекомендовал) - то тебе бы и указатели не понадобились (а лишь ссылки).

Попробуй для начала написать функцию, которая меняет передаваемую в неё переменную. То есть: была у тебя какая-то int value = 5, затем ты вызвал функцию - и, вуаля, value стала равна уже не 5. Для этого тебе нужно прочитать про "передачу аргументов в функцию по значению, по указателю и по ссылке".

Если сможешь это сделать - то затем попробуй провернуть то же непотребство с одномерным массивом. Подсказка: помимо самого массива, в функцию также нужно будет передавать его размерность. И вот лишь затем, вернись к своему исходному двумерному массиву.

P.S. Я, конечно, могу и тупо написать необходимую тебе строчку вызова функции - но работать с этим массивом внутри самой функции ты вряд ли сможешь. Иначе бы ты уже заметил, что Игродел в сообщении #76 сделал именно то, что тебе и нужно 118


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
01.04.2012 18:47
Find all posts by this user Quote this message in a reply
gamecreator Offline

Posts: 7107
Post: #100

массивы всегда передаются по ссылке из-за своей указательной природы. но! если одномерный массив можно передать как написав int *array, так и int array[], то n-мерный статический массив нельзя передать, не указав размеры n-1 его измерений, а в памяти он все равно выглядит как указатель на одномерный массив. я не пробовал, но может сработает шаблон:
Code:
template<int m, int n> void foo(int array[m][n])
{
// код функции
}


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
01.04.2012 19:23
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #101

Вот что получилось, а получилось ничего Bad

PHP Code:
TForm1 *Form1;
void kakaya_to_functcia(int *[], int g); // объявляю функцию
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponentOwner)
        : 
TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int kakoy_to_massiv[5]; // объявляю массив с 6 элементами
for (int i=0i<6i++){
     
kakoy_to_massiv[i]=i;  // присваиваю каждому значения 
}
kakaya_to_functcia(&kakoy_to_massiv6);  // вызываю функцию. Ссылка на адрес 1го элемента массива, 6 - длина
for (int i=0i<6i++){
Label1->Caption=Label1->Caption+kakoy_to_massiv[i];  // вывожу на экран
}
}
//----------------
void kakaya_to_functcia(int *[], int g){  // а - указатель на массив(не уверен насчет нужности квадратных скобок) и переменная длины массива
for (int i=0i<g,i++){
*(
a[]+i)=i+1;  // увеличиваю все элементы на 1, чтобы проверить
}
}
//--------------------------------------------------------------------------- 


Кстати не подскажите зачем сначала объявлять функцию
void kakaya_to_functcia(int *a [], int g);

а потом когда вызывать, по новой инициализировать указатель и переменную, или это я неправильно делаю?
void kakaya_to_functcia(int *a [], int g){}

gamecreator, спасибо, но шаблонов пока нет перспективе изучения


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
(This post was last modified: 03.04.2012 13:49 by packa.)
02.04.2012 18:59
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #102

Пакка, про шаблоны пока забудь, рано тебе ещё в них копаться Ab И без них можно писать хороший код.

packa Wrote:Кстати не подскажите зачем сначала объявлять функцию
void kakaya_to_functcia(int *a [], int g);

а потом когда вызывать, по новой инициализировать указатель и переменную, или это я неправильно делаю?
void kakaya_to_functcia(int *a [], int g){}

Да, объявление функции должно повторять её "заголовок" (в большинстве случаев). Хотя я бы первым её параметром поставил одиночный указатель, а затем два int-параметра размерности двумерного массива... Не, можно и "указатель на указатель" передавать - если хочется внутри функции "как с массивом" работать. Как правило, это зависит от того, где именно у тебя объявлен массив - в стеке, или же в куче. Игродел почему-то любит создавать всё в куче, хотя создание чего-то в стеке - более правильный вариант.

И, блин, не просто int - а unsigned int! Moral Что, неужели я вот в этом сообщении зря распинался?

Да, зря ты меня опять не послушал Bad Я же недаром написал - вначале научись с помощью функций менять сторонние переменные, затем - одномерный массивы, и только потом - двумерные и N-мерные.
Серьёзно, Пакка. Если ты научишься делать это - то потом сам наверняка всё поймёшь. А то сейчас ты пытаешься сесть за руль гоночного болида, хотя ещё толком не научился ездить на обычном автомобиле...
(да, утрирую, но суть именно такова)


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
02.04.2012 19:34
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #103

Quote:Что, неужели я вот в этом сообщении зря распинался?
Прошло слишком много времени (для меня) без практики, поэтому такие тонкости давно забыл Bad

Quote:Да, зря ты меня опять не послушал Bad Я же недаром написал - вначале научись с помощью функций менять сторонние переменные, затем - одномерный массивы, и только потом - двумерные и N-мерные.
Почему, как раз таки послушал)
Менять переменные через функцию меня Шуруп научил Sm (за что ему огромное спасибо)
Через ссылки.
Потом я несколько раз перечитал главы "Указатели и ссылки", "Передача указателей и ссылок в функции".
Конечно не идеально понял, но какое-то представление составил точно (для этого я писал комментарии в коде)
Попытался собрать передачу массива в функцию.

А вот двумерые массивы действительно пока не трогаю )

Да кстати, там можно легко передать массив через значения, но раз уж коснулся указателей, то хочу именно через них.


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
(This post was last modified: 03.04.2012 13:48 by packa.)
02.04.2012 20:23
Find all posts by this user Quote this message in a reply
gamecreator Offline

Posts: 7107
Post: #104

(02.04.2012 18:59)packa Wrote:  а - указатель на массив(не уверен насчет нужности квадратных скобок)
сравни варианты записи:
int *a - указатель на начало массива (в данном примере). можно работать как с массивом
int a[] - массив (= указатель), по сути то же, что и выше, но я не знаю, можно ли его использовать как указатель
int *a[] - указатель на переменную, которая содержит указатель на начало массива (или адрес массива). для статических массивов бесполезен, т.к. им нельзя присвоить другую область памяти, а разыменовывать указатель все равно придется.
(02.04.2012 18:59)packa Wrote:  Кстати не подскажите зачем сначала объявлять функцию а потом когда вызывать, по новой инициализировать указатель и переменную?
не понял вопроса. что значит "по новой инициализировать" параметры функции?
(02.04.2012 19:34)Efrit Wrote:  Да, объявление функции должно повторять её "заголовок" (в большинстве случаев).
я бы сказал не "в большинстве случаев", а "по большей части". в объявлении функции можно указать только типы переменных, а имена им дать уже в определении.
(02.04.2012 19:34)Efrit Wrote:  затем два int-параметра размерности двумерного массива.
речь об одномерном массиве
(02.04.2012 19:34)Efrit Wrote:  Игродел почему-то любит создавать всё в куче
я люблю использовать подходящие вещи. если мне нужен массив неизвестной или переменной длины (или возможность управлять указателями на массивы), то я выделяю память. если определенной длины - объявляю массив.

(02.04.2012 20:23)packa Wrote:  Да кстати, там можно легко передать массив через значения
массив по значению нельзя передать. это указатель. элементы массива при изменении в функции будут меняться везде.


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
02.04.2012 21:27
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #105

packa Wrote:Прошло слишком много времени (для меня) без практики, поэтому такие тонкости давно забыл Bad
Это не "тонкости", это вообще должно быть на уровне гигиены Ab Как "помыть руки перед едой". Если переменная содержит размер чего-либо (неважно чего), или же переменная является индексом массива - то её обязательно нужно объявлять как unsigned.

packa Wrote:Менять переменные через функцию меня Шуруп научил Sm (за что ему огромное спасибо) Через ссылки.
Передача по ссылке - это хорошо, но попробуй и передачу переменной (обычной переменной, не массива) через указатель.
Объясняю, что при этом произойдёт: (Click to View)
   
   
gamecreator Wrote:речь об одномерном массиве
Сорри, не заметил.

gamecreator Wrote:если мне нужен массив неизвестной или переменной длины (или возможность управлять указателями на массивы), то я выделяю память. если определенной длины - объявляю массив.
Создавать объекты в куче без особой надобности плохо, потому что это часто приводит к утечкам памяти. Например, после такой инициализации нельзя делать return - будет явная утечка памяти, равно как и при break с continue. Именно поэтому и придумали смарт-пойнтеры, чтобы вообще с кучей не работать...

P.S. Кстати, призываю всех пользоваться тегами [рhр][/рhр] для сишного кода - он его очень хорошо понимает, читать код с подсветкой намного приятнее.


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
02.04.2012 22:04
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group