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

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: помогите разобраться с динамическими массивами

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

BBB » 10 май 2007, 09:42

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

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

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

TDinArray = array[1..1] of TDinArrayItem;

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

BBB » 10 май 2007, 09:39

Колядин Максим писал(а):А где ты увидел здесь двумерный массив?
Вот тут вот:
kai.nbt писал(а):а можно ввести размерность матрицы в режиме диалога?то есть вводишь N и создается матрица NxN.

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

Naeel Maqsudov » 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.

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

Naeel Maqsudov » 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;

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

Колядин Максим » 08 май 2007, 14:37

BBB писал(а):Вроде, изначально решь шла об одномерном массиве?
А где ты увидел здесь двумерный массив?

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

BBB » 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 - параметр без типа, а в той строке попытка обратиться к ней как к массиву.

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

kai.nbt » 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;

Заранее еще раз спасибо :)

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

BBB » 08 май 2007, 12:12

kai.nbt писал(а):спасибо за совет!только я не знаю как это)
а можно ввести размерность матрицы в режиме диалога?то есть вводишь N и создается матрица NxN.
Вроде, изначально решь шла об одномерном массиве?

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

kai.nbt » 08 май 2007, 11:51

Колядин Максим писал(а):Если нужен, то вот полный код программы:

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

var c,p: array [1..10000] of integer;
n,i,j,sum: integer;
begin
readln(n);                       {размер массива}
for i:= 1 to n do readln(c[i]);
for i:= 1 to n do begin
sum:=0;
for j:= 1 to i do sum:=sum+c[j];
p[i]:=sum;
end;
end.
Большое спасибо! :) я наверное так и сделаю.только array[1..65535] сделаю,ибо препод урод,может и заставить
somewhere писал(а):Ага, и прикинь их потом все забивать? :-))
:D

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

kai.nbt » 08 май 2007, 11:21

BBB писал(а):Колядин Максим,
А если пользователь укажет n > 10000 ??

Может, лучше воспользоваться динамическим выделение памяти через GetMem ?
спасибо за совет!только я не знаю как это)
а можно ввести размерность матрицы в режиме диалога?то есть вводишь N и создается матрица NxN.
п.с. это не дельфи :( а паскаль

Вернуться к началу