помогите разобраться с динамическими массивами

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Аватара пользователя
kai.nbt
Сообщения: 6
Зарегистрирован: 07 май 2007, 14:16
Откуда: Russian Federation, Moscow
Контактная информация:

08 май 2007, 12:26

BBB писал(а):Вроде, изначально решь шла об одномерном массиве?
да.но разницы нет) так можно сделать так,чтобы при вводе N в режиме диалога СОЗДАВАЛСЯ массив(все равно сколько-мерный)с размерностью N? :)
И вот еще вопрос: мне друг дал код, который почему-то не работает, хотя сделал вроде все по лекции. Выдает ошибку Invalid Qualifier, что там не так?
Прога ищет максимальное значение в массиве, и набивает другой массив номерами элементов, равных максимальному.
вот код:

Procedure CreateMassive (var B;N:integer;var C;k:integer);
Type vector=array [1..100] of real;
var i:integer;
Max:real;
Begin
Max:=Vector(B[1]); <- в этой строке
For i:=1 to N do
if Max<Vector(B) then Max:=Vector(B);
k:=0;
For i:=1 to N do
If Vector(B)=Max then
begin
k:=k+1;
Vector(C[k]):=i;
end;
End;

Заранее еще раз спасибо :)
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

08 май 2007, 13:17

kai.nbt,
Если создавать массив динамически разница есть.
Принцип такой. Объявляется указатель на "большой массив":

Код: Выделить всё

type tHugeArray : array [1..32767] of integer;
       pDynamicArray : ^tHugeArray;
Затем, когда пользователь укзал размерность N, выделяешь сколько нужно памяти динамически:

pDynamicArray := GetMem (N * SizeOf (pDynamicArray^[1]));

(При этом еще надо помнить, что в Pascale ограничение: одним оператором GetMem нельзя выделить памяти больше 64 Kb)

Для двумерного массива ты не сможешь объявить такой "обстрактрный тип" и затем выделить ДВУМЕРНЫЙ массив. Хотя это можно смоделировать логически. Ведь что такое двумерный массив MxN ? Это те же (M * N) ячеек памяти, просто ты адресуешься к ним не "подряд" (одним инндексом), а двумя.

То есть, если пользоваель задал M и N, то можно выделить динамически одномерный массив:

pDynamicArray := GetMem (M * N * SizeOf (pDynamicArray^[1]));

А затем адресоваться к "логическому" элементу A [j] как:
pDynamicArray [(i - 1) * M + j]


Invalid qualifier потому, что переменная B - параметр без типа, а в той строке попытка обратиться к ней как к массиву.
Аватара пользователя
Колядин Максим
Сообщения: 285
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

08 май 2007, 14:37

BBB писал(а):Вроде, изначально решь шла об одномерном массиве?
А где ты увидел здесь двумерный массив?
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

08 май 2007, 23:46

Для Delphi
См. справку по теме Dynamic arrays. Там есть примеры.

Код: Выделить всё

var
  A: array of Integer;
  n:integer;
begin
  n:=strtoint(inputbox('Введите N','Введите N',''));
  SetLength(A, N);
  for i:=0 to pred(n) do begin
    A[i]:=.......;
    .....
  end;
end;
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

09 май 2007, 00:01

Для Pascal

BBB уже привел пример с GetMem. Остается только добавить, что для того, чтобы не смущало 32768 ставят 0..0, но выключают опцию компилятора Range Checking.

Код: Выделить всё

type
{$R-}
  TDinArrayItem = Integer;
  TDinArray = array[0..0] of TDinArrayItem;
  PDinArray = ^TDinArray;
var
  DinArray : PDinArray;
  i, n : integer;
begin
  Readln(n);
  GetMem(DinArray, n*sizeof(TDinArrayItem));
  for i:=0 to pred(n) do begin
    DinArray^[i]:=......;
    ......
  end;
end.
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

10 май 2007, 09:39

Колядин Максим писал(а):А где ты увидел здесь двумерный массив?
Вот тут вот:
kai.nbt писал(а):а можно ввести размерность матрицы в режиме диалога?то есть вводишь N и создается матрица NxN.
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

10 май 2007, 09:42

Naeel Maqsudov писал(а):Для Pascal

BBB уже привел пример с GetMem. Остается только добавить, что для того, чтобы не смущало 32768 ставят 0..0, но выключают опцию компилятора Range Checking.
Можно диапазон индексов обявить и 1..1, если кто привык считать элементы от 1, а не от 0. (Иногда, таки, это удобнее)

Код: Выделить всё

TDinArray = array[1..1] of TDinArrayItem;
Ответить