Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Динамический многомерный массив/японский кросворд. 13.10.03 21:45
Автор: oleaster Статус: Незарегистрированный пользователь
|
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. Если кто реализовывал алгоритм разгадывания "японского кросворда" (числа преобразовывать в картинки)
(делали это простым перебором или логическим анализом).
|
![](/img/dot.gif) |
[C++] Динамический многомерный массив/японский кросворд. 15.10.03 15:33
Автор: sem4a Статус: Незарегистрированный пользователь
|
Lu4she vsego STL kone4no no,
eshe mojno tak:
int a = 2, b =2; // [2][2]
//Alokazia:
// VC++
int* p = (int*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(int) * a * b);
ili
// All
char* pCh[] = new char[a * b];
p = (int*)pCh;
// Ovrashenie
(&(p[0]))[0] = 1;
(&(p[0]))[1] = 2;
(&(p[1 * a]))[0] = 3;
(&(p[1 * a]))[1] = 4;
|
![](/img/dot.gif) | ![](/img/dot.gif) |
[C++] Динамический многомерный массив/японский кросворд. 15.10.03 17:40
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
|
Это не беда, если память криво выделить придется:
int *p = (int *)malloc( x * y * sizeof( int ) );
А, вот обращаться к элементу хочется именно через скобочки без упоминания о количестве строк/столбцов.
p[ 1 ][ 1 ] = 0;
а не так извратно, как ниже.
> (&(p[0]))[0] = 1; > (&(p[0]))[1] = 2; > (&(p[1 * a]))[0] = 3; > (&(p[1 * a]))[1] = 4;
|
![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) |
[C++] восползуйса operator overload 15.10.03 17:43
Автор: sem4a Статус: Незарегистрированный пользователь
|
|
![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) |
[C++] Я вот думаю 15.10.03 18:11
Автор: amirul <Serge> Статус: The Elderman
|
На фига писать свой класс-массив, если в STL уже все есть.
Или правда все таки в той истории про русского программиста: "Переделать все нах"
ЗЫ: Повторю: пользуйся <vector<vector<int> >, если не нравится такая запись, один typedef может все исправить
|
![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) |
[C++] и еше о STL 15.10.03 18:41
Автор: sem4a Статус: Незарегистрированный пользователь
|
Легче свой один маленький клас написат,
если ето единственое использование
|
![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) |
[C++] Легче как следует выучить классы и алгоритмы STL и уметь их правильно применять. 15.10.03 19:03
Автор: Ktirf <Æ Rusakov> Статус: Elderman
|
> Легче свой один маленький клас написат, > если ето единственое использование Это оно сейчас единственное. А через год может быть уже не единственное. А STL как раз на масштабируемость упирает.
|
![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) |
Не обобшай 15.10.03 19:29
Автор: sem4a Статус: Незарегистрированный пользователь
|
|
![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) |
Сорри, согласен, слишком огульно сказал. 15.10.03 19:48
Автор: Ktirf <Æ Rusakov> Статус: Elderman
|
Но STL программисту на C++ в наше время знать все же надо :)
|
![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) |
Сорри, согласен, слишком огульно сказал. 15.10.03 19:54
Автор: sem4a Статус: Незарегистрированный пользователь
|
> Но STL программисту на C++ в наше время знать все же надо > :)
То что касается меня я о4ен часто ползуус,
List, Map, vector, iterator'i i tak dalee
|
![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) |
[C++] STL 15.10.03 18:38
Автор: sem4a Статус: Незарегистрированный пользователь
|
> На фига писать свой класс-массив, если в STL уже все есть.
STL плохая библиотека, много memory leaks, но удобная
|
![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) |
[C++] STL 15.10.03 21:45
Автор: amirul <Serge> Статус: The Elderman
|
> > На фига писать свой класс-массив, если в STL уже все > есть. > > STL плохая библиотека, много memory leaks, но удобная В STL (да и вообще при использовании шаблонов) инстанцируется только то, что используется. Не думаю, что в реализации vector::vector и vector::operator[] так уж много ликов. Даже в MSVC6. А в данном случае именно эта функциональность нужна.
Так что смело мы в бой пойдем :-)
|
![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) |
[C++] STL 15.10.03 19:02
Автор: Ktirf <Æ Rusakov> Статус: Elderman
|
> STL плохая библиотека, много memory leaks, но удобная В какой именно реализации STL много memory leaks? ;)
|
![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) |
[C++] STL 15.10.03 19:25
Автор: sem4a Статус: Незарегистрированный пользователь
|
> > SL плохая библиотека, много меморы леакс, но удобная > В какой именно <б>реализации</б> STL много > меморы леакс? ;)
VC++ 6.0 SP 5
Запусти с BoundsCheker'ом
|
![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) |
[C++] Извините за грубость... (updated) 15.10.03 19:43
Автор: Ktirf <Æ Rusakov> Статус: Elderman Отредактировано 15.10.03 19:52 Количество правок: 2
|
> > В какой именно <б>реализации</б> STL много > > меморы леакс? ;) > > VC++ 6.0 SP 5 бееееееееее....
А я-то думал что-то новое... Ну что сказать, это одна из самых печальных реализаций STL, которые я видел :) (кстати, сервис-паки на этот предмет не слишком помогают).
Рекомендую STLPort либо (если по каким-то причинам хочется именно MS) STL из VC7, правда, если я не путаю, VC 6 она не собирается.
|
![](/img/dot.gif) |
Никак. 14.10.03 12:37
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
|
Сам когда-то сталкивался с этой проблемой.
Метод, предлженный Вами, вполне работоспособен и ни чему не противоречит. Единственное, что он не удобен, поскольку требует создание и инициализацию массива указателей.
В оригинале, когда многомерный массив согдается не динамически, отводится память только под данные. Компилятор "знает" о размере строки и о количестве столбцов и генерит соответствующий код.
На сколько я знаю ни в каком из стандартов С, ни в С++ не предусмотрен необходимый для этого оператор (динамически определяющий размерности массива для указателя).
Может помочь С++, только индексы придется передавать по-другому. Не array_ptr[ i ][ j ], а, например, array.ref( i, j ), где метод ref будет возвращать ссылку на элемент массива.
А все-таки было бы удобно, если бы в С эта возможность была бы предусмотрена, хотя по возможности следует вообще не прользоваться массивами. Но это уже философия.
|
![](/img/dot.gif) | ![](/img/dot.gif) |
а можно немного философии?? 15.10.03 22:28
Автор: zelych Статус: Member
|
..
> бы предусмотрена, хотя по возможности следует вообще не > прользоваться массивами. Но это уже философия.
чем массивы так не угодили??
|
![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) |
Можно. 16.10.03 12:08
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman Отредактировано 16.10.03 12:10 Количество правок: 1
|
> чем массивы так не угодили??
Каким бы большим не был массив, его размера может не хватить.
Каким бы маленьким не был массив, обязательно найдуться неиспользуемые элементы.
Если задачу можно решить без массива, то так и следует поступить.
Пример: Напишите програмку, которая делает следующее - последовательно вводятся числа (количество введенных чисел немзвестно/неограничено), при вводе заранее оговоренного числа программа должна выдать второе по максимальности число (именно не самое максимальное, а второе по величине) и закончить работу.
Так и хочется завести массив, считывать циклически введенные числа в последовательные ячейки массива, при вводе ключевого числа вывалиться из цикла ввода, отсортировать массив и выдать значение второго элемента. Проблема в том, что надо обойтись без массива, поскольку количество введенных чисел неограничено.
Из ностальгии: Смотрел когда-то на исходники программы математического моделирования динамических систем, где под параметры звеньев и связей были отведены приличного размера массивы и понимал, что программа может столкнуться с проблемой нехватки свободных элементов массива при большом количистве исходных данных. Благо массивы были огромные, а задачи решались в основном элементарные. И програмка эта была очень жирная в памяти - очень неудобно было.
Разумеется исключением из этих правил будут являться хакерские задачи типа: решить систему из ЧЕТЫРЕХ линейных уравнений с ЧЕТЫРЬМЯ неизвестными матричным методом.
|
![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) |
Можно. 22.10.03 00:01
Автор: zelych Статус: Member
|
> Каким бы большим не был массив, его размера может не > хватить. > Каким бы маленьким не был массив, обязательно найдуться > неиспользуемые элементы.
кажется это основное свойство памяти - она частенько заканчивается..
а всякие списки и очереди здорово ударяют как по эффективности использования памяти, так и по производительности..
|
![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) | ![](/img/dot.gif) |
Интересно ;-) 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.
---
|
|
|