Wake of Gods Forum | Форум Во Имя Богов

Full Version: С++, общая тема
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
не легче ли определять какая кнопка находится под указателем и ее подсвечивать?
Нет) Я не могу сообразить как такое провернуть.
Например если делать через форммаусмув то координаты на кнопке прекращаются, а где они прекратились - тот еще геммор определить - многотонные Иф.
Это как я вижу.
packa Wrote:Нет) Я не могу сообразить как такое провернуть.

http://bit.ly/xoDRO9

Ну и плюс - событие OnMouseMove для всех кнопок сделай единым. Например, назначь его всем кнопкам как SpeedButton1MouseMove, а внутри него обращайся не к Button1, а к Sender (приведённому к классу TSpeedButton с помощью static_cast или dynamic_cast).
и static TObject *previousSender чтобы возвращать картинку у предыдущей кнопки. главное проверять чтобы кнопка изменялась и не грузить попусту картинки.
Загружаю изображение, рисую его его на канве (Canvas->Drow)
Какими способами его можно повернуть?

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

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

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

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

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

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

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

P.S. Я, конечно, могу и тупо написать необходимую тебе строчку вызова функции - но работать с этим массивом внутри самой функции ты вряд ли сможешь. Иначе бы ты уже заметил, что Игродел в сообщении #76 сделал именно то, что тебе и нужно 118
массивы всегда передаются по ссылке из-за своей указательной природы. но! если одномерный массив можно передать как написав int *array, так и int array[], то n-мерный статический массив нельзя передать, не указав размеры n-1 его измерений, а в памяти он все равно выглядит как указатель на одномерный массив. я не пробовал, но может сработает шаблон:
Code:
template<int m, int n> void foo(int array[m][n])
{
// код функции
}
Вот что получилось, а получилось ничего 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, спасибо, но шаблонов пока нет перспективе изучения
Пакка, про шаблоны пока забудь, рано тебе ещё в них копаться 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-мерные.
Серьёзно, Пакка. Если ты научишься делать это - то потом сам наверняка всё поймёшь. А то сейчас ты пытаешься сесть за руль гоночного болида, хотя ещё толком не научился ездить на обычном автомобиле...
(да, утрирую, но суть именно такова)
Quote:Что, неужели я вот в этом сообщении зря распинался?
Прошло слишком много времени (для меня) без практики, поэтому такие тонкости давно забыл Bad

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

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

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

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

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

P.S. Кстати, призываю всех пользоваться тегами [рhр][/рhр] для сишного кода - он его очень хорошо понимает, читать код с подсветкой намного приятнее.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
Reference URL's