Current time: 23.03.2024, 17:40 Hello There, Guest! (LoginRegister)
Language: english | russian  

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

Posts: 7107
Post: #46

(22.01.2012 17:16)Efrit Wrote:  Пакка, сразу несколько рекомендаций:
хотелось бы добавить
6) не стоит злоупотреблять STL


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
22.01.2012 18:33
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #47

угу, стоит злоупотреблять бустом))

Согласен, что не стоит. Как и любой из известных библиотек. Но и изобретать свой велосипед там, где он уже давно есть в стандартных библиотеках, не стоит также. И уж то, что динамический массив почти всегда лучше статического - по-моему, очевидно.

Да и в любом случае, до шестого пункта Пакка ещё явно не дорос 118


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
22.01.2012 18:40
Find all posts by this user Quote this message in a reply
gamecreator Offline

Posts: 7107
Post: #48

(22.01.2012 18:40)Efrit Wrote:  Но и изобретать свой велосипед там, где он уже давно есть в стандартных библиотеках, не стоит также.
если в стандартной библиотеке вездеход, то еще неизвестно что лучше


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
22.01.2012 19:29
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #49

Quote:если в стандартной библиотеке вездеход, то еще неизвестно что лучше

Что из используемого мною выше является вездеходом? std::vector - это вездеход? Или, может быть, dynamic_cast? (хоть это и не STL, но тоже шаблоны)


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
22.01.2012 20:36
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #50

Спасибо за рекомендации, запомню.
Quote:Никогда не используй нумерацию каких-либо элементов (массива, списка, STL-контейнера) с единицы, как в строке 6 твоего кода.
В том и соль, если начну с нуля код не работает... А с единицы начинает хотя бы хромать

Но почему вы плавно ушли от прямого вопроса? Sm

Почему_данный_код_не_работает!
Я просто не могу понять что в нем может быть не правильно... Перепробовал, кажется, все

Попробую воспользоваться твоим, но вопрос мой не отменяет Sm))
О гуру! Что же там поменять чтобы все таки работало?

Quote:это блок "обработки исключений" в C++ (поскольку файл может отсутствовать, и тогда функция LoadFromFile сгенерирует исключение, которое и будет поймано catch)
Не может Sm Это же игра, как ты представляешь игру без какой то картинки?))) По мне так лучше вообще не запускать не работающую, следовательно и исключения - лишний вес пригодный только для теста Sm


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

Posts: 7107
Post: #51

если хочешь, то вектор. особенно вектор векторов - это вообще зло. и все лишь для того, чтобы создать двумерный массив неизвестного заранее размера. а вся функциональность вектора будет висеть мертвым грузом. ладно бы еще vector<bool>, тут какая-нибудь экономия памяти еще пригодилась бы. возможно.


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
22.01.2012 21:57
Find all posts by this user Quote this message in a reply
FBX Offline

Posts: 2235
Post: #52

Иногда помогает метод "удалить всё и заново переписать". Особенно, покурив перед этим другой какой способ реализации.
22.01.2012 22:30
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #53

Quote:Иногда помогает метод "удалить всё и заново переписать". Особенно, покурив перед этим другой какой способ реализации.
Да цель уже не заставить работать, а найти почему не работает! О боги, неужели мой код не работает только потому что он тупой?)


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

Posts: 6183
Post: #54

gamecreator Wrote:если хочешь, то вектор. особенно вектор векторов - это вообще зло. и все лишь для того, чтобы создать двумерный массив неизвестного заранее размера. а вся функциональность вектора будет висеть мертвым грузом. ладно бы еще vector<bool>, тут какая-нибудь экономия памяти еще пригодилась бы. возможно.
Неужели ты хочешь, чтобы я рассказывал Пакке про работу с указателями и адресную арифметику, дабы он смог нормально писать свои функции для работы с многомерными массивами? Он же всего этого ещё не поймёт. Или, что ещё хуже, рассказывать ему про boost::multi_array? Юзать вектор - самое оптимальное для него решение: он и интуитивно понятен, и синтаксис обращения к элементу у него такой же, как в C (не рассказывать же Пакке про итераторы, в конце концов).


packa Wrote:Почему_данный_код_не_работает!
Я просто не могу понять что в нем может быть не правильно... Перепробовал, кажется, все
Частично я уже указал тебе на твою ошибку, смотри пункт 3 моих рекомендаций. Ты не заполняешь в массиве bh элементы вида bh[i][0] числами, и поэтому они принимают значение по умолчанию - то бишь 0. Поэтому, строчка с case 0 всегда срабатывает уже для самого первого элемента массива bh (то бишь, для bh[0][0]). А что в ней происходит? Ты пытаешься (через указатель) обратиться к элементу, который ещё не создан! Ты создаёшь его лишь ниже, командой Img[i]=new TImage(this);

Вот в этом всё и дело. Учти, что "создание указателя на объект" - вовсе не то же самое, что "создание объекта". Указатель может указывать и в "пустоту", как в твоём случае. А "изображение" - это уже объект. Ты же пытаешься обратиться к объекту через указатель (путём вызова компонентной функции LoadFromFile), а сам объект создаёшь лишь после этого. Вот где собака зарыта...

P.S. Что не отменяет того факта, что весь твой код лучше переписать Ab


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
22.01.2012 22:58
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1210
Post: #55

Quote:Частично я уже указал тебе на твою ошибку, смотри пункт 3 моих рекомендаций. Ты не заполняешь в массиве bh элементы вида bh[i][0] числами, и поэтому они принимают значение по умолчанию - то бишь 0. Поэтому, строчка с case 0 всегда срабатывает уже для самого первого элемента массива bh (то бишь, для bh[0][0])
Да это так, извини немного тебя запутал. Большая проблема кроется в том, что изменив bh-массив
Quote:randomize();
for(int i = 0 ;i < 8; i++)
    {
    for(int j = 0 ;j < 8; j++)
    {
    bh[i][j]=random(8);
    }
    }
Код приводит к ошибке на первом объекте, каким бы он ни был (цикл проходит только один раз, после чего ошибка),
А с единицей хоть рисуется что то Sm

Quote:P.S. Что не отменяет того факта, что весь твой код лучше переписать Ab
Так я не спорю, я буду его переделывать, но мне очень важно знать что не так.
Хотя бы потому, что я потратил 2 чистых дня на тест и безрезультатную отладку.
Ну и, конечно, чтобы не бить себя этими граблями дважды.


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

Posts: 1210
Post: #56

Quote:void __fastcall TForm1::FormCreate(TObject *Sender)
{
randomize();
for(int i = 0 ;i < 8; i++)
    {
    for(int j = 0 ;j < 8; j++)
    {
    bh[i][j]=random(8);
    }
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
int ProhodMassiva=0;
int OtstupVniz = 0;
NumImg=8;
Img=new TImage*[NumImg];
for(int j=0;j<NumImg;j++)
{
    for(int i=0;i<NumImg;i++)
    {
    Label7->Caption=Label7->Caption+bh[i][j] ;
    Label8->Caption=Label8->Caption+ProhodMassiva ;
    ProhodMassiva=ProhodMassiva++;
    Img[i]=new TImage(this);
    switch (bh[i][j])
    {
    case 0 : Img[i]->Picture->LoadFromFile("18.bmp"); break;
    case 1 : Img[i]->Picture->LoadFromFile("11.bmp"); break;
    case 2 : Img[i]->Picture->LoadFromFile("12.bmp"); break;
    case 3 : Img[i]->Picture->LoadFromFile("13.bmp"); break;
    case 4 : Img[i]->Picture->LoadFromFile("14.bmp"); break;
    case 5 : Img[i]->Picture->LoadFromFile("15.bmp"); break;
    case 6 : Img[i]->Picture->LoadFromFile("16.bmp"); break;
    case 7 : Img[i]->Picture->LoadFromFile("17.bmp"); break;
    default: ;
    }
    //Img[i]=new TImage(this);
    Img[i]->Parent=this;
    Img[i]->Left=25+i*45;
    Img[i]->Top=10+OtstupVniz;
    Img[i]->Visible=true;

    }
OtstupVniz=OtstupVniz+49;
Label7->Caption=Label7->Caption+" " ;
Label8->Caption=Label8->Caption+" " ;
}delete Img;
}

Отбой тревоги( Оказалось еще тупее ошибка чем я мог представить...
Шуруп помог.


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

Posts: 7107
Post: #57

(22.01.2012 22:58)Efrit Wrote:  Неужели ты хочешь, чтобы я рассказывал Пакке про работу с указателями и адресную арифметику, дабы он смог нормально писать свои функции для работы с многомерными массивами?
про какую еще работу с указателями? как выделить память и как ее освободить? на работу с указателями не тянет. а адресной арифметики там нет и в помине. или борландовский компилятор настолько убог, что не позволяет обращаться к элементу динамического массива напрямую? вот так:
Code:
int main()
{
    int **a;
    const m=8;
    const n=9;
    a=new int*[m];
    for(int i=0;i<m;i++)
    {
        a[i]=new int[n];
    }
    a[m/2][n/2]=-1;
    for(int i=0;i<m;i++)
    {
        delete[] a[i];
    }
    delete[] a;
    return 0;
}
(22.01.2012 22:58)Efrit Wrote:  Или, что ещё хуже, рассказывать ему про boost::multi_array?
с boost не знаком и не хочу, поэтому не могу сказать.
(22.01.2012 22:58)Efrit Wrote:  он и интуитивно понятен, и синтаксис обращения к элементу у него такой же, как в C
какое совпадение, у динамического массива синтаксис такой же. наверно Страуструп сплагиатил у авторов STL.


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
23.01.2012 00:45
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #58

packa Wrote:Отбой тревоги( Оказалось еще тупее ошибка чем я мог представить...
Шуруп помог.
Пакка, ты внимательно читаешь мои сообщения? Rolleyes Я же прямо указал тебе в сообщении 55, что ошибка связана со строкой Img[i]=new TImage(this) - она слишком низко стоит, ты создаёшь объект после обращения к нему. Даже пурпурным цветом её тогда выделил Ab Кстати, а ты вообще понимаешь, что именно делает эта строка?


gamecreator Wrote:про какую еще работу с указателями? как выделить память и как ее освободить? на работу с указателями не тянет. а адресной арифметики там нет и в помине.
Ну-ка напиши мне функцию транспонирования квадратной матрицы без использования адресной арифметики. Или же, ещё лучше - какую-нибудь функцию с неизвестным числом переменных (желательно строковых). Неужели, по-твоему, C++-программист не должен знать про адресную арифметику?

gamecreator Wrote:с boost не знаком и не хочу
Откуда такая категоричность?

gamecreator Wrote:какое совпадение, у динамического массива синтаксис такой же. наверно Страуструп сплагиатил у авторов STL.
Не пиши глупости. Далеко не у всех STL-ных контейнеров оператор "квадратные скобки" перегружен также, как у вектора... Я это и имел в виду.


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
23.01.2012 07:47
Find all posts by this user Quote this message in a reply
Solmyr2000 Offline
Moderators

Posts: 4744
Post: #59

Ох какие вы няши.
Эфрит прав. Давайте теперь вместо того, чтобы делать что-нибудь полезное, заменять STL и буст велосипедами. Зло, не зло, это всё очень абстрактно и бездоказательно, я погуглил и нашёл, что ВСЁ во ВСЕХ языках программирования - зло. Деньги, кстати, тоже зло. Такие дела.
(This post was last modified: 23.01.2012 11:40 by Solmyr2000.)
23.01.2012 11:35
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #60

(23.01.2012 07:47)Efrit Wrote:  Ну-ка напиши мне функцию транспонирования квадратной матрицы без использования адресной арифметики.

Code:
for(int i = 0; i < 32; i++)
     for(int k = 0; k < 32; k++)
     {
          int tmp = arr[i][k];
          arr[i][k] = arr[k][i];
          arr[k][i] = tmp;
     }
Никаких адресов, только индексы.Rolleyes
23.01.2012 11:58
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-2024 MyBB Group