> > А проверять работоспособность пробовали? > > > > Заренее оговоренное СТОП-значение пусть будет 0. > > Попробуйте последовательность: 1, 10, 9, 8, 7, 6, 5, > 4, 3, > > 2. > > Второе наибольшее должно быть 9 > > Программа работает, но не в ней дело.
Неужели 9 выдала?
> Задача-то тривиальная, для того чтобы вытаскивать > «предпоследнее» максимальное значение, была организована >очередьиз двух элементов в лице переменных Max и oldMax.
> А вот если немного усложнить задачу, т.е «выдавть n-е с > конца максимальное значение», вот тут наступят заморочки. > Тут уже надо организовывать динамический массив из n > элементов, двигать его (это же очередь), или пользоваться > связанным списком, что эффективнее. Но бездинамического > выделения памяти не обойтись. Обычно нерадивые программеры > боятся всей этой динамики, указателей и проч. нетривиальных > вещей, поэтому и появляются в программах монстроидальные > массивы «про запас».
Динамический массив действительно решает многие проблемы, и динамическим выделением памяти однозначно имеет смысл пользоваться там, где неизвестна длина массива или она может меняться до неизвестных значений. Если же размерность заранее известна, то можно использовать статический массив. Обычно эти задачи более ущербные, то есть поставлены для конкретного случая, но не универсальны. В особо крайнем случае можно попользоваться и статическим массивом, если его предельные размеры будут принебрежимо малы по отношению к объему оперативной памяти. Для кроссворда можно завести массивчик 1000х1000 или даже 10000х10000. Просто кроссворды-гиганты. В первом случае мегабайт памяти потребуется - это ничто, по сравнению с гигабайтом имеющейся оперативной памяти. Во втором случае 100 мегабайт - на десятичный порядок меньше, чем объем ОЗУ. Ну не очень красиво, зато легко запрограммировать. Современные ОС лояльно отнесуться к таким массивам. Свободная системная память будет отжираться по мере обращения к ячейкам. Конечно надо не забывать рассматривать возможность обходится без массивов (статических и динамических), но это не тот случай. Я кроссворд имею в виду.
1. В массиве int A[10][10] ,- является ли A типом (int **) ?
(Я так понял, что не является ,- он у меня функциями void a (int ** b) наотрез не принимается
и кроме того я последовательно память просмотрел ,- мой вывод - массив размещен последовательно)
В конечном счете мне нужно было динамически выделить int A[10][10].
Как я понял new может выделить только последовальную область, поэтому пришлось бы самому A[a][a*10+b];
int ** GG, ee=0;
GG = new (int *) [10];
while (ee<10) GG[ee++] = new int [10];
Странно, но это у меня работает как int GG[10][10], т. е. как аналог int A[10][10], при том, что и void a (int ** b) его принимает.
Я в принципе не до конца понимаю ситуацию, поэтому расчитываю, что вы что-нибудь умное скажите и у меня все станет на свои места.
Что по этому поводу говорит стандарт языка C/C++
и как решаются проблемы с динамическими многомерными массивами (предполагаю, что все решается как-то более элегантно) ?
2. Если кто реализовывал алгоритм разгадывания "японского кросворда" (числа преобразовывать в картинки)
(делали это простым перебором или логическим анализом).
> Легче свой один маленький клас написат, > если ето единственое использование Это оно сейчас единственное. А через год может быть уже не единственное. А STL как раз на масштабируемость упирает.
Не обобшай15.10.03 19:29 Автор: sem4a Статус: Незарегистрированный пользователь
> > На фига писать свой класс-массив, если в STL уже все > есть. > > STL плохая библиотека, много memory leaks, но удобная В STL (да и вообще при использовании шаблонов) инстанцируется только то, что используется. Не думаю, что в реализации vector::vector и vector::operator[] так уж много ликов. Даже в MSVC6. А в данном случае именно эта функциональность нужна.
> > В какой именно <б>реализации</б> STL много > > меморы леакс? ;) > > VC++ 6.0 SP 5 бееееееееее....
А я-то думал что-то новое... Ну что сказать, это одна из самых печальных реализаций STL, которые я видел :) (кстати, сервис-паки на этот предмет не слишком помогают).
Рекомендую STLPort либо (если по каким-то причинам хочется именно MS) STL из VC7, правда, если я не путаю, VC 6 она не собирается.
Никак.14.10.03 12:37 Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
Сам когда-то сталкивался с этой проблемой.
Метод, предлженный Вами, вполне работоспособен и ни чему не противоречит. Единственное, что он не удобен, поскольку требует создание и инициализацию массива указателей.
В оригинале, когда многомерный массив согдается не динамически, отводится память только под данные. Компилятор "знает" о размере строки и о количестве столбцов и генерит соответствующий код.
На сколько я знаю ни в каком из стандартов С, ни в С++ не предусмотрен необходимый для этого оператор (динамически определяющий размерности массива для указателя).
Может помочь С++, только индексы придется передавать по-другому. Не array_ptr[ i ][ j ], а, например, array.ref( i, j ), где метод ref будет возвращать ссылку на элемент массива.
А все-таки было бы удобно, если бы в С эта возможность была бы предусмотрена, хотя по возможности следует вообще не прользоваться массивами. Но это уже философия.
а можно немного философии??15.10.03 22:28 Автор: zelych Статус: Member
Каким бы большим не был массив, его размера может не хватить.
Каким бы маленьким не был массив, обязательно найдуться неиспользуемые элементы.
Если задачу можно решить без массива, то так и следует поступить.
Пример: Напишите програмку, которая делает следующее - последовательно вводятся числа (количество введенных чисел немзвестно/неограничено), при вводе заранее оговоренного числа программа должна выдать второе по максимальности число (именно не самое максимальное, а второе по величине) и закончить работу.
Так и хочется завести массив, считывать циклически введенные числа в последовательные ячейки массива, при вводе ключевого числа вывалиться из цикла ввода, отсортировать массив и выдать значение второго элемента. Проблема в том, что надо обойтись без массива, поскольку количество введенных чисел неограничено.
Из ностальгии: Смотрел когда-то на исходники программы математического моделирования динамических систем, где под параметры звеньев и связей были отведены приличного размера массивы и понимал, что программа может столкнуться с проблемой нехватки свободных элементов массива при большом количистве исходных данных. Благо массивы были огромные, а задачи решались в основном элементарные. И програмка эта была очень жирная в памяти - очень неудобно было.
Разумеется исключением из этих правил будут являться хакерские задачи типа: решить систему из ЧЕТЫРЕХ линейных уравнений с ЧЕТЫРЬМЯ неизвестными матричным методом.
> Каким бы большим не был массив, его размера может не > хватить. > Каким бы маленьким не был массив, обязательно найдуться > неиспользуемые элементы.
кажется это основное свойство памяти - она частенько заканчивается..
а всякие списки и очереди здорово ударяют как по эффективности использования памяти, так и по производительности..
Интересно ;-)16.10.03 13:24 Автор: HandleX <Александр М.> Статус: The Elderman
> Пример: Напишите програмку, которая делает следующее - > последовательно вводятся числа (количество введенных чисел > немзвестно/неограничено), при вводе заранее оговоренного > числа программа должна выдать второе по максимальности > число (именно не самое максимальное, а второе по величине) > и закончить работу. > > Так и хочется завести массив, считывать циклически > введенные числа в последовательные ячейки массива, при > вводе ключевого числа вывалиться из цикла ввода, > отсортировать массив и выдать значение второго элемента. > Проблема в том, что надо обойтись без массива, поскольку > количество введенных чисел неограничено. Гы. Ну не знаю, мне не хочется ;-)
Program Sort;
Var aValue, Max, oldMax, stopValue: Integer;
Begin
Max := Low(Integer);
Write('Введите значение для остановки>');
ReadLn(stopValue);
Repeat
Write('Input value>');
ReadLn(aValue);
If aValue > Max Then
Begin
OldMax := Max;
Max := aValue;
End;
Until aValue = stopValue;
WriteLn('oldMax = ', oldMax, ', Max = ', Max);
WriteLn('Enjoy and good bye... There was no any arrays!');
End.