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!
Что, неужели я вот в этом сообщении зря распинался?Да, зря ты меня опять не послушал
Я же недаром написал - вначале научись с помощью функций менять сторонние переменные, затем - одномерный массивы, и только потом - двумерные и N-мерные.Серьёзно, Пакка. Если ты научишься делать это - то потом сам наверняка всё поймёшь. А то сейчас ты пытаешься сесть за руль гоночного болида, хотя ещё толком не научился ездить на обычном автомобиле...
(да, утрирую, но суть именно такова)
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:Прошло слишком много времени (для меня) без практики, поэтому такие тонкости давно забылЭто не "тонкости", это вообще должно быть на уровне гигиены
Как "помыть руки перед едой". Если переменная содержит размер чего-либо (неважно чего), или же переменная является индексом массива - то её обязательно нужно объявлять как unsigned.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р] для сишного кода - он его очень хорошо понимает, читать код с подсветкой намного приятнее.