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
(22.01.2012 17:16)Efrit Wrote: [ -> ]Пакка, сразу несколько рекомендаций:
хотелось бы добавить
6) не стоит злоупотреблять STL
угу, стоит злоупотреблять бустом))

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

Да и в любом случае, до шестого пункта Пакка ещё явно не дорос 118
(22.01.2012 18:40)Efrit Wrote: [ -> ]Но и изобретать свой велосипед там, где он уже давно есть в стандартных библиотеках, не стоит также.
если в стандартной библиотеке вездеход, то еще неизвестно что лучше
Quote:если в стандартной библиотеке вездеход, то еще неизвестно что лучше

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

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

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

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

Quote:это блок "обработки исключений" в C++ (поскольку файл может отсутствовать, и тогда функция LoadFromFile сгенерирует исключение, которое и будет поймано catch)
Не может Sm Это же игра, как ты представляешь игру без какой то картинки?))) По мне так лучше вообще не запускать не работающую, следовательно и исключения - лишний вес пригодный только для теста Sm
если хочешь, то вектор. особенно вектор векторов - это вообще зло. и все лишь для того, чтобы создать двумерный массив неизвестного заранее размера. а вся функциональность вектора будет висеть мертвым грузом. ладно бы еще vector<bool>, тут какая-нибудь экономия памяти еще пригодилась бы. возможно.
Иногда помогает метод "удалить всё и заново переписать". Особенно, покурив перед этим другой какой способ реализации.
Quote:Иногда помогает метод "удалить всё и заново переписать". Особенно, покурив перед этим другой какой способ реализации.
Да цель уже не заставить работать, а найти почему не работает! О боги, неужели мой код не работает только потому что он тупой?)
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
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 чистых дня на тест и безрезультатную отладку.
Ну и, конечно, чтобы не бить себя этими граблями дважды.
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;
}

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


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

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

gamecreator Wrote:какое совпадение, у динамического массива синтаксис такой же. наверно Страуструп сплагиатил у авторов STL.
Не пиши глупости. Далеко не у всех STL-ных контейнеров оператор "квадратные скобки" перегружен также, как у вектора... Я это и имел в виду.
Ох какие вы няши.
Эфрит прав. Давайте теперь вместо того, чтобы делать что-нибудь полезное, заменять STL и буст велосипедами. Зло, не зло, это всё очень абстрактно и бездоказательно, я погуглил и нашёл, что ВСЁ во ВСЕХ языках программирования - зло. Деньги, кстати, тоже зло. Такие дела.
(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
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