13.02.2012, 21:47
13.02.2012, 22:10
Нет) Я не могу сообразить как такое провернуть.
Например если делать через форммаусмув то координаты на кнопке прекращаются, а где они прекратились - тот еще геммор определить - многотонные Иф.
Это как я вижу.
Например если делать через форммаусмув то координаты на кнопке прекращаются, а где они прекратились - тот еще геммор определить - многотонные Иф.
Это как я вижу.
13.02.2012, 22:39
packa Wrote:Нет) Я не могу сообразить как такое провернуть.
http://bit.ly/xoDRO9
Ну и плюс - событие OnMouseMove для всех кнопок сделай единым. Например, назначь его всем кнопкам как SpeedButton1MouseMove, а внутри него обращайся не к Button1, а к Sender (приведённому к классу TSpeedButton с помощью static_cast или dynamic_cast).
13.02.2012, 23:15
и static TObject *previousSender чтобы возвращать картинку у предыдущей кнопки. главное проверять чтобы кнопка изменялась и не грузить попусту картинки.
29.03.2012, 19:59
Загружаю изображение, рисую его его на канве (Canvas->Drow)
Какими способами его можно повернуть?
Для упрощения - вид сверху, машинка поворачивает.
Какими способами его можно повернуть?
Для упрощения - вид сверху, машинка поворачивает.
29.03.2012, 20:28
Насколько я помню, у VCL нету стандартных функций для "поворота канвы" (равно как и для "поворота картинки").
Так что - либо написать свою функцию поворота (это нетрудно), либо пользоваться сторонними библиотеками типа DirectX.
Так что - либо написать свою функцию поворота (это нетрудно), либо пользоваться сторонними библиотеками типа DirectX.
29.03.2012, 21:29
если можно перейти к контексту устройства, то через GDI можно повернуть с помощью PlgBlt
01.04.2012, 18:29
Это снова я)
Нужно передать в функцию Двумерный массив int enemy_group[4][3]
void zahvat (массив, int a){
//Некоторые действия с массивом
a++;
}
На выход нужно переменную а.
Просто с переменными получалось, хоть и тяжело, а с массивом вообще ни в какую...
Гуглил, находил, ничего не понял.
Нужно передать в функцию Двумерный массив int enemy_group[4][3]
void zahvat (массив, int a){
//Некоторые действия с массивом
a++;
}
На выход нужно переменную а.
Просто с переменными получалось, хоть и тяжело, а с массивом вообще ни в какую...
Гуглил, находил, ничего не понял.
01.04.2012, 18:47
Вот поэтому, Пакка, я и рекомендовал тебе читать про указатели - без них в C++ никуда. Знал, что понадобится...
Или, если бы ты юзал динамические массивы вместо статических (что я также рекомендовал) - то тебе бы и указатели не понадобились (а лишь ссылки).
Попробуй для начала написать функцию, которая меняет передаваемую в неё переменную. То есть: была у тебя какая-то int value = 5, затем ты вызвал функцию - и, вуаля, value стала равна уже не 5. Для этого тебе нужно прочитать про "передачу аргументов в функцию по значению, по указателю и по ссылке".
Если сможешь это сделать - то затем попробуй провернуть то же непотребство с одномерным массивом. Подсказка: помимо самого массива, в функцию также нужно будет передавать его размерность. И вот лишь затем, вернись к своему исходному двумерному массиву.
P.S. Я, конечно, могу и тупо написать необходимую тебе строчку вызова функции - но работать с этим массивом внутри самой функции ты вряд ли сможешь. Иначе бы ты уже заметил, что Игродел в сообщении #76 сделал именно то, что тебе и нужно
Или, если бы ты юзал динамические массивы вместо статических (что я также рекомендовал) - то тебе бы и указатели не понадобились (а лишь ссылки).
Попробуй для начала написать функцию, которая меняет передаваемую в неё переменную. То есть: была у тебя какая-то int value = 5, затем ты вызвал функцию - и, вуаля, value стала равна уже не 5. Для этого тебе нужно прочитать про "передачу аргументов в функцию по значению, по указателю и по ссылке".
Если сможешь это сделать - то затем попробуй провернуть то же непотребство с одномерным массивом. Подсказка: помимо самого массива, в функцию также нужно будет передавать его размерность. И вот лишь затем, вернись к своему исходному двумерному массиву.
P.S. Я, конечно, могу и тупо написать необходимую тебе строчку вызова функции - но работать с этим массивом внутри самой функции ты вряд ли сможешь. Иначе бы ты уже заметил, что Игродел в сообщении #76 сделал именно то, что тебе и нужно

01.04.2012, 19:23
массивы всегда передаются по ссылке из-за своей указательной природы. но! если одномерный массив можно передать как написав int *array, так и int array[], то n-мерный статический массив нельзя передать, не указав размеры n-1 его измерений, а в памяти он все равно выглядит как указатель на одномерный массив. я не пробовал, но может сработает шаблон:
Code:
template<int m, int n> void foo(int array[m][n])
{
// код функции
}
02.04.2012, 18:59
Вот что получилось, а получилось ничего 
Кстати не подскажите зачем сначала объявлять функцию
void kakaya_to_functcia(int *a [], int g);
а потом когда вызывать, по новой инициализировать указатель и переменную, или это я неправильно делаю?
void kakaya_to_functcia(int *a [], int g){}
gamecreator, спасибо, но шаблонов пока нет перспективе изучения

PHP Code:
TForm1 *Form1;
void kakaya_to_functcia(int *a [], int g); // объявляю функцию
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int kakoy_to_massiv[5]; // объявляю массив с 6 элементами
for (int i=0; i<6; i++){
kakoy_to_massiv[i]=i; // присваиваю каждому значения
}
kakaya_to_functcia(&kakoy_to_massiv, 6); // вызываю функцию. Ссылка на адрес 1го элемента массива, 6 - длина
for (int i=0; i<6; i++){
Label1->Caption=Label1->Caption+kakoy_to_massiv[i]; // вывожу на экран
}
}
//----------------
void kakaya_to_functcia(int *a [], int g){ // а - указатель на массив(не уверен насчет нужности квадратных скобок) и переменная длины массива
for (int i=0; i<g,i++){
*(a[]+i)=i+1; // увеличиваю все элементы на 1, чтобы проверить
}
}
//---------------------------------------------------------------------------
Кстати не подскажите зачем сначала объявлять функцию
void kakaya_to_functcia(int *a [], int g);
а потом когда вызывать, по новой инициализировать указатель и переменную, или это я неправильно делаю?
void kakaya_to_functcia(int *a [], int g){}
gamecreator, спасибо, но шаблонов пока нет перспективе изучения
02.04.2012, 19:34
Пакка, про шаблоны пока забудь, рано тебе ещё в них копаться
И без них можно писать хороший код.
Да, объявление функции должно повторять её "заголовок" (в большинстве случаев). Хотя я бы первым её параметром поставил одиночный указатель, а затем два int-параметра размерности двумерного массива... Не, можно и "указатель на указатель" передавать - если хочется внутри функции "как с массивом" работать. Как правило, это зависит от того, где именно у тебя объявлен массив - в стеке, или же в куче. Игродел почему-то любит создавать всё в куче, хотя создание чего-то в стеке - более правильный вариант.
И, блин, не просто int - а unsigned int!
Что, неужели я вот в этом сообщении зря распинался?
Да, зря ты меня опять не послушал
Я же недаром написал - вначале научись с помощью функций менять сторонние переменные, затем - одномерный массивы, и только потом - двумерные и N-мерные.
Серьёзно, Пакка. Если ты научишься делать это - то потом сам наверняка всё поймёшь. А то сейчас ты пытаешься сесть за руль гоночного болида, хотя ещё толком не научился ездить на обычном автомобиле...

packa Wrote:Кстати не подскажите зачем сначала объявлять функцию
void kakaya_to_functcia(int *a [], int g);
а потом когда вызывать, по новой инициализировать указатель и переменную, или это я неправильно делаю?
void kakaya_to_functcia(int *a [], int g){}
Да, объявление функции должно повторять её "заголовок" (в большинстве случаев). Хотя я бы первым её параметром поставил одиночный указатель, а затем два int-параметра размерности двумерного массива... Не, можно и "указатель на указатель" передавать - если хочется внутри функции "как с массивом" работать. Как правило, это зависит от того, где именно у тебя объявлен массив - в стеке, или же в куче. Игродел почему-то любит создавать всё в куче, хотя создание чего-то в стеке - более правильный вариант.
И, блин, не просто int - а unsigned int!

Да, зря ты меня опять не послушал

Серьёзно, Пакка. Если ты научишься делать это - то потом сам наверняка всё поймёшь. А то сейчас ты пытаешься сесть за руль гоночного болида, хотя ещё толком не научился ездить на обычном автомобиле...
(да, утрирую, но суть именно такова)
02.04.2012, 20:23
Quote:Что, неужели я вот в этом сообщении зря распинался?Прошло слишком много времени (для меня) без практики, поэтому такие тонкости давно забыл

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

Через ссылки.
Spoiler (Click to View)
PHP Code:
TForm1 *Form1;
//---------------------------------------------------------------------------
void funcName(int &a, int &b);
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int a = 4;
int b = 10;
funcName(a,b);
Label1->Caption= IntToStr(a) + " " + IntToStr(b);
}
//---------------------------------------------------------------------------
void funcName(int &a, int &b){
if (a < b)
{
a=a*2;
b=b/2;
}
else {
a=a/2;
b=b*2;
}
}
Конечно не идеально понял, но какое-то представление составил точно (для этого я писал комментарии в коде)
Попытался собрать передачу массива в функцию.
А вот двумерые массивы действительно пока не трогаю )
Да кстати, там можно легко передать массив через значения, но раз уж коснулся указателей, то хочу именно через них.
02.04.2012, 21:27
(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: [ -> ]Да кстати, там можно легко передать массив через значениямассив по значению нельзя передать. это указатель. элементы массива при изменении в функции будут меняться везде.
02.04.2012, 22:04
packa Wrote:Прошло слишком много времени (для меня) без практики, поэтому такие тонкости давно забылЭто не "тонкости", это вообще должно быть на уровне гигиены

packa Wrote:Менять переменные через функцию меня Шуруп научилПередача по ссылке - это хорошо, но попробуй и передачу переменной (обычной переменной, не массива) через указатель.(за что ему огромное спасибо) Через ссылки.
Объясняю, что при этом произойдёт: (Click to View)
PHP Code:
void adding_function(int* variable) // функция добавляет 2 к переданной в неё переменной, изменяя при этом саму переменную
{
*variable += 2; // переменная предварительно разыменовывается, дабы изменялось её значение, а не значение указателя на неё
}
int main()
{
int A = 8;
adding_function(A); // неправильный вызов функции - нужно передавать не значение переменной A, а её адрес.
adding_function(&A); // правильный вызов - передан адрес переменной A. После исполнения функции, A станет равно 10.
}
Что такое указатель вообще? Это переменная, которая хранит какой-то адрес в ОЗУ (как правило, адрес какой-то другой переменной). Соответственно, если указатель фигурирует среди параметров функции (как в случае с adding_function) - то эта функция требует себе именно адрес какой-то переменной, а не её значение. Поэтому я и пишу adding_function(&A), ведь знак амперсанда - это операция "взятия адреса переменной".
А внутри тела самой функции написано *variable += 2, то есть идёт "разыменование указателя" (то есть, "обращение к значению переменной, на которую указывает указатель").
gamecreator Wrote:речь об одномерном массивеСорри, не заметил.
gamecreator Wrote:если мне нужен массив неизвестной или переменной длины (или возможность управлять указателями на массивы), то я выделяю память. если определенной длины - объявляю массив.Создавать объекты в куче без особой надобности плохо, потому что это часто приводит к утечкам памяти. Например, после такой инициализации нельзя делать return - будет явная утечка памяти, равно как и при break с continue. Именно поэтому и придумали смарт-пойнтеры, чтобы вообще с кучей не работать...
P.S. Кстати, призываю всех пользоваться тегами [рhр][/рhр] для сишного кода - он его очень хорошо понимает, читать код с подсветкой намного приятнее.