Ну вообще, это довольно сложный вопрос где как и что передавать и это сильно зависит от ситуации. Нас вот учили более-менее все нестандартные вещи передавать либо по константной ссылке либо по указателю - типо во избежание путаницы.
(27.04.2012 22:53)gamecreator Wrote: [ -> ]он крайне корректный и крайне медленный. для ускорения можно сразу создавать новый массив нового размера, копировать, удалять старый и переприсваивать. но так теряется корректность и могут быть проблемы с освобождением памяти. вот в чем С лучше С++ - так это в выделении памяти. обрати внимание на функции calloc, realloc, free.
и на файл memory.h

Потеря корректности? Проблемы с освобождением?
Если массив часто надо увеличивать, то надо выделять больше памяти. Например, при нехватке памяти увеличивать размер выделенной памяти в 2 раза и, пока не заполнится, расширять без перевыделений.
(28.04.2012 15:06)packa Wrote: [ -> ]
Code:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
ammo = new Graphics::TBitmap;
ammo->LoadFromFile("ammo.bmp");
Form1->Canvas->Brush->Color=(TColor)RGB(0,0,0);
Form1->Canvas->Rectangle(0,0,ClientWidth,ClientWidth);
/*Много кода и отрисовок*/
delete ammo;
}
Надо 1 раз загружать из файла, а не в таймере.
(28.04.2012 17:41)gamecreator Wrote: [ -> ]не рисуй ничего в таймере, забудь что ты вообще такое можешь. вот правильно сделали в windows forms в c#, что скрыли возможность рисования где попало.
Почему же? Спокойно можно рисовать в таймере
и в OnPaint. Еще можно вызывать Repaint - он отрисовывает сразу, а не когда дойдет до сообщения.
(28.04.2012 18:28)Efrit Wrote: [ -> ]Мда. А работать с прозрачными спрайтами не судьба? Поставил transparent у TImage в true и радуйся жизни...
Для анимации TImage неприменим из-за мерцания. Хотя DoubleBuffered может и поможет...
(03.05.2012 17:49)packa Wrote: [ -> ][принадлежность к башне][номер патрона в потоке (очереди)][корды патрона, а также его тип]
Где 3-е измерение? Даже в таком варианте "корды патрона, а также его тип" - это не 3-е измерение. А по сути тут одномерный массив патронов, точнее связный список. Если классы по-началу пугают, сделай патроны структурами, там всё просто, ни на какую мудрёную теорию не наткнёшься.
чем сишные функции выделения памяти лучше и почему их нельзя юзать в плюсах я так и не узнаю.
Quote:Если классы по-началу пугают, сделай патроны структурами, там всё просто, ни на какую мудрёную теорию не наткнёшься.
а в чём собственно разница? в с++ они отличаются лишь формой записи и тем, что в классах по умолчанию прайвет а в структурах - паблик. и насчёт списка мне кажется не вполне прав - список это реализация, а требуемому функционалу отвечает контейнер очередь (как мне видится). здесь снова виден плюс ооп - если что-то надо поменять, то меняется "внутренность" класса, а все внешние функции, методы и т.д. "ничего не почувствуют"
(11.05.2012 18:14)NIKr0m@nceR Wrote: [ -> ]чем сишные функции выделения памяти лучше и почему их нельзя юзать в плюсах я так и не узнаю.
1. В плюсах нет аналогов realloc и calloc, _aligned_malloc(), который просто необходим для работы с SSEx, AVX.
2. Не используют в плюсах, потому что считается дурным стилем использование malloc вместо new или их вместе, пусть и для разных типов. То есть, вопрос стиля, по большей части.
Поделитесь ссылкой на нормальный компилятор под Си.
Чтобы ничего лишнего, никаких там #pragma hdrstop как в билдере например
И вообще чтобы был просто чистый лист, ф-ия сохранения, и компиляции\запуска. Ну и естественно отлов ошибок
Перебрал много всяких они либо не работают на Win7, либо среды разработки, типа билдера (мне оч сложно в них разобраться, да и не нужно по большей части сейчас), либо виснут :-\
И да:
Вопрос в догонку:
Можно ли обычному массиву в СИ в качестве размерности передавать переменную?
В С++ точно знаю что нет. Онли константы. Сам проверял))
А вот про СИ... по большей части сбили с толку здесь
http://www.sql.ru/forum/actualthread.asp...25437&pg=1
Ваш ответ?

Сам бы проверил, да вот компилятора не нашел, в добавок еще и забанили (
Quote:Поделитесь ссылкой на нормальный компилятор под Си.
Чтобы ничего лишнего, никаких там #pragma hdrstop как в билдере например
Turbo C. Не знаю, правда, работает ли под Win 7.
Quote:Можно ли обычному массиву в СИ в качестве размерности передавать переменную?
Нет.
Quote:А вот про СИ... по большей части сбили с толку здесь
Это не обычный массив C.
Для
packa - кроме "Turbo C", в голову ничего больше не лезет. Но зачем? В том же Билдере можно создать консольное приложение, и в нём уже работать. Ты напрасно начал изучать C++ в GUI-режиме, а надо было - в консоли. Чем больше ты будешь
со старта заморачиваться со всякими "кнопками" и "компонентами" - тем лучше ты будешь знать VCL, но сам C++ ты от этого будешь знать только хуже...
Так что, создавай консольку в Билдере, отключай VCL и радуйся жизни. Дебаггер и сохранение в нём есть, да и прочие вещи тоже необходимы. Панельки для "визуального проектирования" среда сама скроет, так что они мешать не будут.
А вместо заморочек с GUI - ты бы лучше прочёл, к примеру, как раз про
#pragma hdrstop. Зря ты её ругаешь - это очень полезная директива. Которая, кстати, даже и в некоторых C-шных компиляторах есть. Но если так уж хочешь - можешь строчку с ней убрать. На работу программы это не повлияет, лишь компиляция может происходить дольше обычного.
packa Wrote:Можно ли обычному массиву в СИ в качестве размерности передавать переменную?
В С++ точно знаю что нет. Онли константы. Сам проверял))
Во многих плюсовых компиляторах прекрасно можно
объявлять массивы с переменным размером. Насчёт "чистого С" не помню - но, вроде бы, в C99 это также можно делать.
Quote:В нормальных плюсовых компиляторах прекрасно можно объявлять массивы с переменным размером.
Всмысле? Опытным путем... Как ты и говорил, "Компилятор твой лучший помощник"
Хотя я,
наверное, как всегда, криво выразился:
Обычные статические массивы не принимают в размерность переменную.
Ну точно же! Писал что то вроде
int n=5;
int arr[n]; - ошибка!
Quote:Так что, создавай консольку в Билдере, отключай VLC и радуйся жизни.
Первым делом так и сделал, потому что в среде кодинга билдер самая родная вещь

))
Там ерунда какая то, так и не разобрался.
Помоги тогда с ним:
1 Создаю "консольный проект" по инструкции
http://foreva.susu.ru/for_stud/prog_lang...oject.html
2 На всякий случай ничего не стирая дописываю #include <iostream> - для вывода вроде
3 Ну и начинаю: для проверки printf("HI!");
Ошибки...
Проба #2 cout<< "hi"; тоже самое!
Ошибка:
Код
Quote:#include <iostream>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
printf("HI!");
return 0;
}
Зеленым мое, красным то что бы хотел убрать

Кстати, про pragma я знаю что делают, а для чего в скобках у мейн стоит не понял - для чего?
Я использую MinGW studio, в которой компиллятор gcc со всеми вытекающими. В частности, можешь писать код в блокноте/vim'е/любом другом месте и компилить его из командной строки. а можешь и в мингв писать, там мне ничего не мешало. с прагмами, к примеру, гсс не дружит

Ещё, насколько я помню, объявление массива переменной длины зависит от компиллятора и там где смотрел я делать так КРАЙНЕ не рекомендуют. В конце концов, напиши ты new или malloc, всё равно компиллятору придётся это делать за тебя а так ты это контролируешь.
у мейн в скобках - параметры запуска (те которые из командной строки вбиваются или в ярлычке прописываются например) инт это их количество, а следующее, насколько я помню, массив из argc+1 строк, в нулевой из которых содержится полный адрес а дальше - те самые параметры. В некоторых компилерах (вроде борланда) есть ещё третий параметр но я его не помню, лучше гуглить. Я, обычно, шапку пишу int main(void) потому что мне такк привычнее но это всё равно вопрос вкуса. вот.
з.ы. мингв скачать можно с помощью гугла, также могу свою старенькую закинуть куданить на обменник если хочешь.
packa Wrote:Ну точно же! Писал что то вроде
int n=5;
int arr[n]; - ошибка!
В борландовском и
MS компиляторах действительно будет ошибка - а, к примеру, компилятор
GCC прекрасно сработает.
packa Wrote:Помоги тогда с ним:
1 Создаю "консольный проект" по инструкции http://foreva.susu.ru/for_stud/prog_lang...oject.html
2 На всякий случай ничего не стирая дописываю #include <iostream> - для вывода вроде.
Здесь всё правильно. Писать эту строчку желательно выше, чем
hdrstop.
packa Wrote:Кстати, про pragma я знаю что делают, а для чего в скобках у мейн стоит не понял - для чего?
Мда

Пакка, срочно купи уже себе хоть какую-нибудь книгу по C++. Потому как функция
main - это ну самые основы языка...
Пока можешь на эти параметры просто забить. И удалять их не надо - они что, есть просят?
packa Wrote:Ошибки...
Проба #2 cout<< "hi"; тоже самое!
Ну дык. Функция
cout действительно определена в
<iostream>, но ведь там она находится в пространстве имён
std! Так что, у тебя есть три пути:
1) Писать не
cout << "hi!", а
std::cout << "hi!". И для всех остальных функций из
стандартной библиотеки тоже. И заодно про неймспейсы прочти, это очень простая штука.
2) Написать в начале своего исходника
(ниже, чем hdrstop) строчку
using namespace std; Всё, после этого твоя запись будет верна. Но не вздумай вставлять эту строчку в h-файлы! Только в cpp-шники, да и то с осторожностью.
3) Инклудить не
<iostream>, а
<iostream.h> - старую версию файла. Там нет неймспейсов, поэтому твоя предыдущая запись снова будет верна. Но учти, старые файлы есть не во всех компиляторах. Да и не стоит всё же так делать...
Все равно та же ошибка...
Блин, мне
срочно нужно тренироваться, ЕГЭ уже очень скоро! Паскаль выучить не успеваю, так что остается перейти с++ на чистый си
1) Не работает, ошибка на том скрине
Code:
#include <iostream>
#pragma hdrstop
//using namespace std; -с комментарием и без все одно - не работает
#pragma argsused
int main(int argc, char* argv[])
{
std::cout<<"hi";
return 0;
}
2) Не работает, ошибка на том скрине
Code:
#include <iostream.h>
#pragma hdrstop
#pragma argsused
int main(int argc, char* argv[])
{
cout<<"hi";
return 0;
}
3)
Code:
//---------------------------------------------------------------------------
#include <iostream.h>
#pragma hdrstop
#pragma argsused
int main(int argc, char* argv[])
{
puts("Hi.");
return 0;
}
//---------------------------------------------------------------------------
Code:
#include <iostream.h>
#pragma hdrstop
#pragma argsused
int main(int argc, char* argv[])
{
printf("hi.");
return 0;
}
Выходит ошибка не в записи - не синтаксическая, а в чем то другом, чего я не знаю...
Quote:Пакка, срочно купи уже себе хоть какую-нибудь книгу по C++.
Некогда( Кое-как заставил себя забить на с++ и готовиться к экзамену -_-
Нафига писать std::cout, коли ты уже подал команду "юзать std"? Ну да ладно, на работу программы это не влияет.
Это у тебя Билдер какой-то корявый, поскольку указанные примеры обязаны компилироваться. Либо переставляй его, либо пиши под другим компилятором...
Эфрит не указал ещё один вариант которому учили меня - подключать не весь стд а только необходимое:
using std::cout;
насчет аргументов мейна - а оставлять их зачем?
а еще, мне не нравятся эти сини с сяутами

наверное потому. что я кучу времени писал на с и привык к принтфосканфам.
а насчёт ошибки - мне бы побольше глянуть а то так не понятно нифига

Quote:а насчёт ошибки - мне бы побольше глянуть а то так не понятно нифига
А что там еще можно разглядеть?
Там просто еще ~100 строчек с "синтаксической ошибкой"
А передать мне нечего =( Т.к. похоже проблема только на моей машине\на моей версии билдера...
Бтв, скачал какую то MinGW studio, запустил, создал проект, вывел hi bro)
Вроде бы все работает (запускать ведь через ф5?)
NIKr0m@nceR, дай связь какую нибудь

Или ЛС тебе будет удобнее читать?