22.01.2012, 18:33
22.01.2012, 18:40
угу, стоит злоупотреблять бустом))
Согласен, что не стоит. Как и любой из известных библиотек. Но и изобретать свой велосипед там, где он уже давно есть в стандартных библиотеках, не стоит также. И уж то, что динамический массив почти всегда лучше статического - по-моему, очевидно.
Да и в любом случае, до шестого пункта Пакка ещё явно не дорос

22.01.2012, 19:29
(22.01.2012 18:40)Efrit Wrote: [ -> ]Но и изобретать свой велосипед там, где он уже давно есть в стандартных библиотеках, не стоит также.если в стандартной библиотеке вездеход, то еще неизвестно что лучше
22.01.2012, 20:36
Quote:если в стандартной библиотеке вездеход, то еще неизвестно что лучше
Что из используемого мною выше является вездеходом? std::vector - это вездеход? Или, может быть, dynamic_cast? (хоть это и не STL, но тоже шаблоны)
22.01.2012, 21:49
Спасибо за рекомендации, запомню.
Но почему вы плавно ушли от прямого вопроса?
Почему_данный_код_не_работает!
Я просто не могу понять что в нем может быть не правильно... Перепробовал, кажется, все
Попробую воспользоваться твоим, но вопрос мой не отменяет
))
О гуру! Что же там поменять чтобы все таки работало?
Это же игра, как ты представляешь игру без какой то картинки?))) По мне так лучше вообще не запускать не работающую, следовательно и исключения - лишний вес пригодный только для теста
Quote:Никогда не используй нумерацию каких-либо элементов (массива, списка, STL-контейнера) с единицы, как в строке 6 твоего кода.В том и соль, если начну с нуля код не работает... А с единицы начинает хотя бы хромать
Но почему вы плавно ушли от прямого вопроса?

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

О гуру! Что же там поменять чтобы все таки работало?
Quote:это блок "обработки исключений" в C++ (поскольку файл может отсутствовать, и тогда функция LoadFromFile сгенерирует исключение, которое и будет поймано catch)Не может


Spoiler (Click to View)
(ну это просто так, ты не мог знать моих коварных планов) )
22.01.2012, 21:57
если хочешь, то вектор. особенно вектор векторов - это вообще зло. и все лишь для того, чтобы создать двумерный массив неизвестного заранее размера. а вся функциональность вектора будет висеть мертвым грузом. ладно бы еще vector<bool>, тут какая-нибудь экономия памяти еще пригодилась бы. возможно.
22.01.2012, 22:30
Иногда помогает метод "удалить всё и заново переписать". Особенно, покурив перед этим другой какой способ реализации.
22.01.2012, 22:57
Quote:Иногда помогает метод "удалить всё и заново переписать". Особенно, покурив перед этим другой какой способ реализации.Да цель уже не заставить работать, а найти почему не работает! О боги, неужели мой код не работает только потому что он тупой?)
22.01.2012, 22:58
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. Что не отменяет того факта, что весь твой код лучше переписать

22.01.2012, 23:28
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);
}
}
Spoiler (Click to View)
если важно, хотя врятли, в момент теста ошибка была поочередно (после каждого запуска) в case 0, case 2, case 7, но я уверен что тут полный рандом поэтому зря все расписал)

Quote:P.S. Что не отменяет того факта, что весь твой код лучше переписать AbТак я не спорю, я буду его переделывать, но мне очень важно знать что не так.
Хотя бы потому, что я потратил 2 чистых дня на тест и безрезультатную отладку.
Ну и, конечно, чтобы не бить себя этими граблями дважды.
23.01.2012, 00:06
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;
}
Отбой тревоги( Оказалось еще тупее ошибка чем я мог представить...
Шуруп помог.
23.01.2012, 00:45
(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.
23.01.2012, 07:47
packa Wrote:Отбой тревоги( Оказалось еще тупее ошибка чем я мог представить...Пакка, ты внимательно читаешь мои сообщения?
Шуруп помог.


gamecreator Wrote:про какую еще работу с указателями? как выделить память и как ее освободить? на работу с указателями не тянет. а адресной арифметики там нет и в помине.Ну-ка напиши мне функцию транспонирования квадратной матрицы без использования адресной арифметики. Или же, ещё лучше - какую-нибудь функцию с неизвестным числом переменных (желательно строковых). Неужели, по-твоему, C++-программист не должен знать про адресную арифметику?
gamecreator Wrote:с boost не знаком и не хочуОткуда такая категоричность?
gamecreator Wrote:какое совпадение, у динамического массива синтаксис такой же. наверно Страуструп сплагиатил у авторов STL.Не пиши глупости. Далеко не у всех STL-ных контейнеров оператор "квадратные скобки" перегружен также, как у вектора... Я это и имел в виду.
23.01.2012, 11:35
Эфрит прав. Давайте теперь вместо того, чтобы делать что-нибудь полезное, заменять STL и буст велосипедами. Зло, не зло, это всё очень абстрактно и бездоказательно, я погуглил и нашёл, что ВСЁ во ВСЕХ языках программирования - зло. Деньги, кстати, тоже зло. Такие дела.
23.01.2012, 11:58
(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;
}
