Current time: 01.02.2025, 16:53 Hello There, Guest! (LoginRegister)
Language: english | russian  

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

Posts: 203
Post: #301

Ну вообще, это довольно сложный вопрос где как и что передавать и это сильно зависит от ситуации. Нас вот учили более-менее все нестандартные вещи передавать либо по константной ссылке либо по указателю - типо во избежание путаницы.
08.05.2012 20:12
Find all posts by this user Quote this message in a reply
GrayFace Offline
Forum Moderators

Posts: 1233
Post: #302

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

и на файл memory.h
36 Потеря корректности? Проблемы с освобождением?

Если массив часто надо увеличивать, то надо выделять больше памяти. Например, при нехватке памяти увеличивать размер выделенной памяти в 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-е измерение. А по сути тут одномерный массив патронов, точнее связный список. Если классы по-началу пугают, сделай патроны структурами, там всё просто, ни на какую мудрёную теорию не наткнёшься.


Вся правда обо мне
11.05.2012 14:44
Find all posts by this user Quote this message in a reply
NIKr0m@nceR Offline

Posts: 203
Post: #303

чем сишные функции выделения памяти лучше и почему их нельзя юзать в плюсах я так и не узнаю.

Quote:Если классы по-началу пугают, сделай патроны структурами, там всё просто, ни на какую мудрёную теорию не наткнёшься.
а в чём собственно разница? в с++ они отличаются лишь формой записи и тем, что в классах по умолчанию прайвет а в структурах - паблик. и насчёт списка мне кажется не вполне прав - список это реализация, а требуемому функционалу отвечает контейнер очередь (как мне видится). здесь снова виден плюс ооп - если что-то надо поменять, то меняется "внутренность" класса, а все внешние функции, методы и т.д. "ничего не почувствуют"


всё на благо народа
11.05.2012 18:14
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #304

(11.05.2012 18:14)NIKr0m@nceR Wrote:  чем сишные функции выделения памяти лучше и почему их нельзя юзать в плюсах я так и не узнаю.

1. В плюсах нет аналогов realloc и calloc, _aligned_malloc(), который просто необходим для работы с SSEx, AVX.
2. Не используют в плюсах, потому что считается дурным стилем использование malloc вместо new или их вместе, пусть и для разных типов. То есть, вопрос стиля, по большей части.
11.05.2012 20:25
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #305

Поделитесь ссылкой на нормальный компилятор под Си.
Чтобы ничего лишнего, никаких там #pragma hdrstop как в билдере например
И вообще чтобы был просто чистый лист, ф-ия сохранения, и компиляции\запуска. Ну и естественно отлов ошибок Sm

Перебрал много всяких они либо не работают на Win7, либо среды разработки, типа билдера (мне оч сложно в них разобраться, да и не нужно по большей части сейчас), либо виснут :-\

И да: Image: f0b899f25944t.jpg

Ab

Вопрос в догонку:
Можно ли обычному массиву в СИ в качестве размерности передавать переменную?
В С++ точно знаю что нет. Онли константы. Сам проверял))
А вот про СИ... по большей части сбили с толку здесь http://www.sql.ru/forum/actualthread.asp...25437&pg=1
Ваш ответ? Sm


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

Posts: 1210
Post: #306

Сам бы проверил, да вот компилятора не нашел, в добавок еще и забанили (


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

Posts: 1809
Post: #307

Quote:Поделитесь ссылкой на нормальный компилятор под Си.
   Чтобы ничего лишнего, никаких там #pragma hdrstop как в билдере например
Turbo C. Не знаю, правда, работает ли под Win 7.

Quote:Можно ли обычному массиву в СИ в качестве размерности передавать переменную?
Нет.

Quote:А вот про СИ... по большей части сбили с толку здесь
Это не обычный массив C.
12.05.2012 22:36
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6184
Post: #308

Для packa - кроме "Turbo C", в голову ничего больше не лезет. Но зачем? В том же Билдере можно создать консольное приложение, и в нём уже работать. Ты напрасно начал изучать C++ в GUI-режиме, а надо было - в консоли. Чем больше ты будешь со старта заморачиваться со всякими "кнопками" и "компонентами" - тем лучше ты будешь знать VCL, но сам C++ ты от этого будешь знать только хуже...

Так что, создавай консольку в Билдере, отключай VCL и радуйся жизни. Дебаггер и сохранение в нём есть, да и прочие вещи тоже необходимы. Панельки для "визуального проектирования" среда сама скроет, так что они мешать не будут.

А вместо заморочек с GUI - ты бы лучше прочёл, к примеру, как раз про #pragma hdrstop. Зря ты её ругаешь - это очень полезная директива. Которая, кстати, даже и в некоторых C-шных компиляторах есть. Но если так уж хочешь - можешь строчку с ней убрать. На работу программы это не повлияет, лишь компиляция может происходить дольше обычного.

packa Wrote:Можно ли обычному массиву в СИ в качестве размерности передавать переменную?
В С++ точно знаю что нет. Онли константы. Сам проверял))
Во многих плюсовых компиляторах прекрасно можно объявлять массивы с переменным размером. Насчёт "чистого С" не помню - но, вроде бы, в C99 это также можно делать.


Welcome!
12.05.2012 22:38
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #309

Quote:В нормальных плюсовых компиляторах прекрасно можно объявлять массивы с переменным размером.
Всмысле? Опытным путем... Как ты и говорил, "Компилятор твой лучший помощник"
Хотя я, наверное, как всегда, криво выразился:
Обычные статические массивы не принимают в размерность переменную.
Ну точно же! Писал что то вроде
int n=5;
int arr[n]; - ошибка!

Quote:Так что, создавай консольку в Билдере, отключай VLC и радуйся жизни.
Первым делом так и сделал, потому что в среде кодинга билдер самая родная вещь Sm))
Там ерунда какая то, так и не разобрался.
Помоги тогда с ним:
1 Создаю "консольный проект" по инструкции http://foreva.susu.ru/for_stud/prog_lang...oject.html
2 На всякий случай ничего не стирая дописываю #include <iostream> - для вывода вроде
3 Ну и начинаю: для проверки printf("HI!");
Ошибки...
Проба #2 cout<< "hi"; тоже самое!

Ошибка: Image: ed3a48984dbet.jpg

Код
Quote:#include <iostream>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
printf("HI!");
    return 0;
}
Зеленым мое, красным то что бы хотел убрать Sm
Кстати, про pragma я знаю что делают, а для чего в скобках у мейн стоит не понял - для чего?


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
(This post was last modified: 12.05.2012 22:56 by packa.)
12.05.2012 22:53
Find all posts by this user Quote this message in a reply
NIKr0m@nceR Offline

Posts: 203
Post: #310

Я использую MinGW studio, в которой компиллятор gcc со всеми вытекающими. В частности, можешь писать код в блокноте/vim'е/любом другом месте и компилить его из командной строки. а можешь и в мингв писать, там мне ничего не мешало. с прагмами, к примеру, гсс не дружит Bad Ещё, насколько я помню, объявление массива переменной длины зависит от компиллятора и там где смотрел я делать так КРАЙНЕ не рекомендуют. В конце концов, напиши ты new или malloc, всё равно компиллятору придётся это делать за тебя а так ты это контролируешь.
у мейн в скобках - параметры запуска (те которые из командной строки вбиваются или в ярлычке прописываются например) инт это их количество, а следующее, насколько я помню, массив из argc+1 строк, в нулевой из которых содержится полный адрес а дальше - те самые параметры. В некоторых компилерах (вроде борланда) есть ещё третий параметр но я его не помню, лучше гуглить. Я, обычно, шапку пишу int main(void) потому что мне такк привычнее но это всё равно вопрос вкуса. вот.
з.ы. мингв скачать можно с помощью гугла, также могу свою старенькую закинуть куданить на обменник если хочешь.


всё на благо народа
12.05.2012 23:45
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6184
Post: #311

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 я знаю что делают, а для чего в скобках у мейн стоит не понял - для чего?
Мда Bad
Пакка, срочно купи уже себе хоть какую-нибудь книгу по 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> - старую версию файла. Там нет неймспейсов, поэтому твоя предыдущая запись снова будет верна. Но учти, старые файлы есть не во всех компиляторах. Да и не стоит всё же так делать...


Welcome!
13.05.2012 11:08
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #312

Все равно та же ошибка...
Блин, мне срочно нужно тренироваться, ЕГЭ уже очень скоро! Паскаль выучить не успеваю, так что остается перейти с++ на чистый си

1) Не работает, ошибка на том скрине
2) Не работает, ошибка на том скрине
3)
Выходит ошибка не в записи - не синтаксическая, а в чем то другом, чего я не знаю...
Quote:Пакка, срочно купи уже себе хоть какую-нибудь книгу по C++.
Некогда( Кое-как заставил себя забить на с++ и готовиться к экзамену -_-


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

Posts: 6184
Post: #313

Нафига писать std::cout, коли ты уже подал команду "юзать std"? Ну да ладно, на работу программы это не влияет.

Это у тебя Билдер какой-то корявый, поскольку указанные примеры обязаны компилироваться. Либо переставляй его, либо пиши под другим компилятором...


Welcome!
13.05.2012 12:58
Find all posts by this user Quote this message in a reply
NIKr0m@nceR Offline

Posts: 203
Post: #314

Эфрит не указал ещё один вариант которому учили меня - подключать не весь стд а только необходимое:
using std::cout;
насчет аргументов мейна - а оставлять их зачем?
а еще, мне не нравятся эти сини с сяутами Bad наверное потому. что я кучу времени писал на с и привык к принтфосканфам.
а насчёт ошибки - мне бы побольше глянуть а то так не понятно нифига Bad


всё на благо народа
13.05.2012 18:49
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #315

Quote:а насчёт ошибки - мне бы побольше глянуть а то так не понятно нифига
А что там еще можно разглядеть?
Там просто еще ~100 строчек с "синтаксической ошибкой"

А передать мне нечего =( Т.к. похоже проблема только на моей машине\на моей версии билдера...

Бтв, скачал какую то MinGW studio, запустил, создал проект, вывел hi bro)
Вроде бы все работает (запускать ведь через ф5?)
NIKr0m@nceR, дай связь какую нибудь Sm Или ЛС тебе будет удобнее читать?


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
13.05.2012 19:02
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-2025 MyBB Group