Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Двухмерный динамичиекий масив?


Автор: WaReZMEN 14.2.2007, 04:58
Раньше я писал на Delphi И там были динамические масивы и любой размерности
(Mas: Array of Array of Integer)
А как токае сделать в C#?

Автор: Idsa 14.2.2007, 08:14
Можно, например, сделать вот так:
Код

List<List<int>> a = new List<List<int>>;

К переменной a можно обращаться через индексаторы: a[i][j].

Автор: ivashkanet 14.2.2007, 10:25
А если просто массив, то их два типа:
Код

int[][] // ---- массив массивов
int[,]  // ---- двумерный массив


P.S. Можно конечно и большемерные

Автор: Naum 14.2.2007, 11:31
Цитата(WaReZMEN @  14.2.2007,  05:58 Найти цитируемый пост)
динамические масивы

А в C# есть динамические массивы? Например, в VB.Net 
Код

Dim cells() as Cell
Redim cells(-1)
Do While (Condition())
   Redim Preserve cells(cells.Lenght)
   cells(Ubound(cells)) = New Cell()
Loop


Автор: mr.DUDA 14.2.2007, 12:09
А динамических массивов вообще не бывает в природе  smile 

Код
Module Module1
    Sub Main()
        Dim arr(10) As Integer
        arr(1) = 1
        ReDim Preserve arr(11)

    End Sub
End Module


Раскладывается в рефлекторе на:
Код
[STAThread]
public static void Main()
{
      int[] arr = new int[11];
      arr[1] = 1;
      arr = (int[]) Utils.CopyArray((Array) arr, new int[12]);
}



Автор: Naum 14.2.2007, 12:26
Цитата(mr.DUDA @  14.2.2007,  13:09 Найти цитируемый пост)
динамических массивов вообще не бывает в природе

Это понятно. Я имел ввиду средства языка для более простого добавления элемента в массив.
З.Ы. 
Цитата(mr.DUDA @  14.2.2007,  13:09 Найти цитируемый пост)
Utils.CopyArray

Че-то я не нашел такого, есть два internal класса Utils, но ни у одного из них нет метода CopyArray.
З.З.Ы Рефлектор не лучший способ узнать средства языка. Он отображает только логику. С синтаксисом есть небольшие недочеты. Встречали ли вы в коде сгенерированном рефлектором циклы while, for. И еще, это конечно мелочи, но, например, строки
Код

(System.IntPtr)0;
//и
System.IntPtr.Zero;

образуют разный IL-код, а в рефлекторе обе выглядят как System.IntPtrZero.
(Все вышесказанное относится только к Lutz Roeder's .NET Reflector)

Автор: -Mikle- 14.2.2007, 13:54
Array.Copy(....);

Автор: Naum 14.2.2007, 13:57
-Mikle-, BR.

Автор: marcusmae 14.2.2007, 14:31
Цитата

Раньше я писал на Delphi И там были динамические масивы и любой размерности
(Mas: Array of Array of Integer)
А как токае сделать в C#?


WaReZMEN, мнений об ответах Вы не помещали, а ведь несовсем понятно, правильно ли поняли Ваш вопрос.

Помнится, 8 лет назад, когда занимались Pascal'ем и Fortran'ом, заходила речь о динамических переменных, и под этим понималась обычно динамическая инициализация с помощью new, dispose, alloc и т.п.

Цитата(mr.DUDA @  14.2.2007,  12:09 Найти цитируемый пост)
А динамических массивов вообще не бывает в природе

Код

LOGICAL l
ALLOCATABLE l(:,:,:)
! l is a 3-dimensional, allocatable, deferred shape logical array.

- динамический массив (с) Бартеньев  smile
эквивалентом будет
Код

bool[][][] l;


В этом смысле, C#-ная инициализация почти всюду динамическая, за исключением интегральных типов.

А если хотите pointer^ на Array of Array of Integer, то на C# указатели доступны только в режиме unsafe.

Автор: -Mikle- 14.2.2007, 15:04
[OFFTOP]
Цитата(Naum @  14.2.2007,  16:57 Найти цитируемый пост)
-Mikle-, BR.

сори, как это понять?  smile 

[/OFFTOP]

Автор: Naum 14.2.2007, 15:06
 smile Спасибо.

Автор: Idsa 14.2.2007, 18:41
А все-таки мне кажется, что автору нужно что-то вроде предложенного мной... Это, конечно, не массив, а коллекция, но функционал очень схож с дельфийскими динамическими массивами.
Цитата(mr.DUDA @  14.2.2007,  12:09 Найти цитируемый пост)
А динамических массивов вообще не бывает в природе

Поясни, пожалуйста.

Автор: Exception 14.2.2007, 19:35
А что тут пояснять smile ? Так уж устроен в памяти массив, что у него фиксированный размер.

Автор: Idsa 14.2.2007, 19:55
Цитата(Exception @  14.2.2007,  19:35 Найти цитируемый пост)
А что тут пояснять  ? Так уж устроен в памяти массив, что у него фиксированный размер.

Массив - это, в первую очередь, набор однотипных данных. А уж как он организован, вопрос открытый. Почему бы и не организовать массив, как коллекции, выделяя память динамически. Ну в конце концов, динамические массивы Delphi - это не массивы что ли?

Автор: -Mikle- 14.2.2007, 20:36
Цитата(Idsa @  14.2.2007,  22:55 Найти цитируемый пост)
Ну в конце концов, динамические массивы Delphi - это не массивы что ли?


В языках высокого уровня, такие вещи типа выделения памяти скрываются от программиста. Но все равно, на низком уровне это так все и выглядит. Ну не может "набор однотипных данных" выделить просто дополнительную память! Как? А вдруг за ним еще какие-то данные расположены? Поэтому при изменении размера массива, нужно выделить новое место в памяти, и туда скопировать данные из старого. А понятие динамический массив существует только в рамках языков высокого уровня и за собой скрывает реализацию выделенния новой памяти.

В С# есть классы, которые тоже скрывают истинную сущность динамического выделения памяти. Тот же ArrayList внутри себя хранит массив, размером свойства Capacity. А когда массив заполнится, происходит выделение новой памяти с копированием туда данных из старого места. Таким образом прогрммист просто добавляет данные в коллекцию, и не задумывается о выделении новой памяти.

Автор: Idsa 14.2.2007, 20:46
Цитата(-Mikle- @  14.2.2007,  20:36 Найти цитируемый пост)
 Поэтому при изменении размера массива, нужно выделить новое место в памяти, и туда скопировать данные из старого. А понятие динамический массив существует только в рамках языков высокого уровня и за собой скрывает реализацию выделенния новой памяти.

Ну это-то понятно. Просто категоричное высказывание Дуды "динамических массивов не бывает" меня смутило smile
Mikle, пасиб  smile

Автор: -Mikle- 14.2.2007, 21:08
Цитата(Idsa @  14.2.2007,  23:46 Найти цитируемый пост)
категоричное высказывание Дуды "динамических массивов не бывает" меня смутило 

mr.DUDA мыслит исключительно низкоуровневым программированием  smile 

Автор: marcusmae 14.2.2007, 21:15
Цитата

mr.DUDA мыслит исключительно низкоуровневым программированием   


и правильно делает  smile 

другое дело, что динамический - такое слово, что всегда рискуеш увязнуть в болоте тонкостей терминологии...

Автор: Idsa 14.2.2007, 21:27
А вообще странно, что в fw нет коллекций, которые, при необходимости расширить коллекцию не копируют все данные, а ищут подходящий участок в памяти для новых данных и записывают их туда, не забывая при этом хранить ссылки на все участки памяти. Такой подход более предпочтителен с точки зрения производительности... но жизнь сборщика мусора усложняется на порядок smile

Автор: Exception 14.2.2007, 21:52
Цитата(Idsa @  14.2.2007,  20:55 Найти цитируемый пост)
Почему бы и не организовать массив, как коллекции, выделяя память динамически. 


А почему бы не называть его списком?

Добавлено @ 21:52 
Цитата(Idsa @  14.2.2007,  22:27 Найти цитируемый пост)
А вообще странно, что в fw нет коллекций, которые, при необходимости расширить коллекцию не копируют все данные, а ищут подходящий участок в памяти для новых данных и записывают их туда, не забывая при этом хранить ссылки на все участки памяти.


А List это что?

Автор: mr.DUDA 14.2.2007, 22:47
Господа, давайте определимся тогда о чём мы говорим - о динамически выделяемом массиве или массиве с динамически изменяемым размером ? А то у нас получается испорченный телефон: кто про фому, а кто - про ерёму...

Автор: Idsa 14.2.2007, 23:13
Цитата(mr.DUDA @  14.2.2007,  22:47 Найти цитируемый пост)
Господа, давайте определимся тогда о чём мы говорим - о динамически выделяемом массиве или массиве с динамически изменяемым размером ? А то у нас получается испорченный телефон: кто про фому, а кто - про ерёму...

Второе smile
Цитата(Exception @  14.2.2007,  21:52 Найти цитируемый пост)
А почему бы не называть его списком?

Цитата(Exception @  14.2.2007,  21:52 Найти цитируемый пост)
А List это что?

Как заметил -Mikle-, при необходимости расширения размера коллекции происходит выделение новой памяти и копирование данных. А я же описал другой способ.


Автор: WaReZMEN 15.2.2007, 02:21
Я задовал вопрос о динамических массивах тоесть тех каторые могут менять свои размер в процессе работы программы а также эти масивы должны быть двумерными тоесть  иметь какбы калонку и строку (типа матрицы)... 

 

Автор: Idsa 15.2.2007, 10:16
Цитата(WaReZMEN @  15.2.2007,  02:21 Найти цитируемый пост)
Я задовал вопрос о динамических массивах тоесть тех каторые могут менять свои размер в процессе работы программы а также эти масивы должны быть двумерными тоесть  иметь какбы калонку и строку (типа матрицы)... 

Об этом мы уже догадались smile Ну дык вопрос закрыт или что-то непонятно?

Автор: ivashkanet 15.2.2007, 10:28
Цитата(Idsa @  14.2.2007,  22:13 Найти цитируемый пост)
Цитата(Exception)
Цитата(Idsa @  14.2.2007,  20:27 Найти цитируемый пост)
А вообще странно, что в fw нет коллекций, которые, при необходимости расширить коллекцию не копируют все данные, а ищут подходящий участок в памяти для новых данных и записывают их туда, не забывая при этом хранить ссылки на все участки памяти. Такой подход более предпочтителен с точки зрения производительности... но жизнь сборщика мусора усложняется на порядок
А List это что?
Как заметил -Mikle-, при необходимости расширения размера коллекции происходит выделение новой памяти и копирование данных. А я же описал другой способ.

Ну тогда LinkedList. Правда его нужно напильником для полного соответствия задаче.
И это, ИМХО, единственное решение этой проблемы.

Почему? Да потому, что кто-то ведь должен знать где находится конкретный элемент. 
Если о положении элементов знает сам массив, то это... обычный массив объектов (каждый элемент массива -- ссылка на элемент в куче).



Автор: mr.DUDA 15.2.2007, 10:36
ivashkanet, речь о массиве и массиво-подобных контейнерах. Ты же говоришь о связном списке, который при всех своих достоинствах не позволяет брать элемент по индексу (и напильник в виде внешнего индексирующего массива или хэштейбла ему как пятая нога).

Модератор: дабы пресечь нарастающие отклонения от эвклидовой прямой темы топика, призываю не флеймить, уважаемые.

Автор: Naum 15.2.2007, 11:26
Цитата(-Mikle- @  14.2.2007,  21:36 Найти цитируемый пост)
В С# есть классы, которые тоже скрывают истинную сущность динамического выделения памяти.

Еще пример - String.

Автор: ivashkanet 15.2.2007, 11:32
mr.DUDA, это просто был ответ на пост Idsa (он в самом сердце цитаты).

Никто не говорит, что в этом листе будут храниться именно элементы. Там можно хранить массивы.
("ищут подходящий участок в памяти для новых данных и записывают их туда")
Напильник -- это просто скрытие самой сути связного списка, который наружу выставит интерфейс обычного массива.

То что я не буду пользоваться таким зверем это точно (меня более чем устраивает List<T>). Но теоретически он возможен.

Цитата(WaReZMEN @  15.2.2007,  01:21 Найти цитируемый пост)
Я задовал вопрос о динамических массивах тоесть тех каторые могут менять свои размер в процессе работы программы

ИМХО, это соответствует теме.

Автор: mr.DUDA 15.2.2007, 12:30
Тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)