Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Массиву присвоить сразу все значения


Автор: pavelv 17.2.2008, 16:59
В пятницу хотел сделать подобное и понял, что не знаю как. Почитал хелп, что-то по нолям. Собственно задача, если вдруг кто не понял:
var a:array[1..3] of integer;
begin
 //наверное что-то такое
 a:=(1,2,3);
end;

Знаю, что можно сделать константно, но теперь уже просто хочется узнать "собственно как?". Заранее благодарен за помощь.

Автор: LesnoyChelovek 17.2.2008, 17:22
Для твоего примера код будет выглядеть так:
Код

for i:=1 to 3 do
a[i]:=i;

Автор: Esperito 17.2.2008, 17:33
Если записывать константы в секции interface, то можно так:
Код

var
  a: array[1..3] of integer = (1, 2, 3);

Автор: pavelv 17.2.2008, 17:54
Вы не очень поняли о чем я, всё это я знаю.

var
  a: array[1..3] of integer = (1, 2, 3);

Насколько мне не изменяет память этот код работать не будет, вот если "var" заменить на "const" то всё будет впорядке.
2LesnoyChelovek: 1,2,3 были для примера. А если у тебя массив состоит из 15ти значений и все разные(связи между ними нте), а ну и при этом нельзя использовать константы. Каждому a[i]-му свой элемент присваивать? Помойму это не очень красивый код, да и к тому же громоздкий.

Ещё раз попробую пояснить чего хочу.
var a:array[1..x] of integer;
x известен заранее и не меняется. Все значения массива известны заранее, но через константы его задать нельзя. Вариант задать каждый элемент в отдельности недопустим. Хочется написать один оператор присваивания и засунуть через него сразу все элементы массива.

Вот такой вариант кода тоже неверен:
Код

const b:array[1..x] of integer =(....)
var a:array[1..x] of integer;
begin
 a:=b;
end.


Много конечно хочу, но не верю что такой возможности нет smile

Автор: bems 17.2.2008, 18:02
Цитата(pavelv @  17.2.2008,  17:54 Найти цитируемый пост)
Насколько мне не изменяет память этот код работать не будет, вот если "var" заменить на "const" то всё будет впорядке.
если мпассив глобальный, то можно и с var

Автор: Qu1nt 17.2.2008, 18:04
Код

procedure TForm1.Button1Click(Sender: TObject);
{$J+}
const
  a: array [1..5] of Integer = (6, 2, 3, 4, 5);
begin
  a[1] := 1; // magic ;)
end;

Ы?

Автор: pavelv 17.2.2008, 18:05
Угу извиняюсь, про интерфэйс чет недочитал. Массив в процедуре, задан локально. Единственная идея была как-то преобразовать (1,2,3,...) в массив и присвоить уже нужному массиву. Но только функций преобразования в такие типы я не знаю :(

Автор: bems 17.2.2008, 18:10
Цитата(pavelv @  17.2.2008,  18:05 Найти цитируемый пост)
Массив в процедуре, задан локально
тогда этот вариант

Цитата(pavelv @  17.2.2008,  17:54 Найти цитируемый пост)
const b:array[1..x] of integer =(....)
var a:array[1..x] of integer;
begin
 a:=b;
end.
но вместо array[1..x] of integer идентификатор типа, равного array[1..x] of integer

Автор: pavelv 17.2.2008, 18:25
bems если честно не очень понял. Если ты хочешь в конст просто задать всё явно и потом присвоить, то так нельзя. Считай, что Const просто не существует.

P.S> Возможно туплю, но пока не понимаю какой такой тип равен array[1..x] of integer

Автор: bems 17.2.2008, 18:35
Код

type TIntArr=array[1..x] of integer;
const b:TIntArr =(....)
var a:TIntArr;
begin
 a:=b;
end.


Добавлено через 3 минуты и 13 секунд
а http://forum.vingrad.ru/index.php?showtopic=196640&view=findpost&p=1415845 чем не нравится?

Автор: lukas 18.2.2008, 17:19
или усовершенствованный вариант немного....

Код

function ArrayX(Ar: Array of String): Array of String;
begin
Result := Ar;
end;

...
 Var
 AR: Array[0..3] of String;
begin

AR := ArrayX(['a','b','c','d']);

end;
 


Вообще не проверял, но если компилятор не будет ругаться, должно по идее работать

Автор: VICTAR 18.2.2008, 17:30
Цитата(lukas @  18.2.2008,  17:19 Найти цитируемый пост)
Вообще не проверял, но если компилятор не будет ругаться, должно по идее работать 

не будет. не будет работать даже такой вариант
Код

var
 a : array [0..9] of String;
 b : array [0..9] of String;
begin
  a := b;
end;

ибо для компилятора это разные типы

Автор: lukas 18.2.2008, 17:38
ну тогда вот так...


Код


procedure ArrayX(Var Result: Array of String; const Ar: Array of String);
  Var
  I: Integer;
begin
SetLength(Result,Length(Ar));
 for i:=0 to High(Ar) do Result[i] := Ar[i];
end;
...
 Var
 AR: Array[0..3] of String;
begin
ArrayX(AR,['a','b','c','d']);
end;




Добавлено через 3 минуты и 43 секунды
хм... почему то в процедуре SetLength компилятор ругается.... 

Автор: VICTAR 18.2.2008, 17:48
lukas, я думаю, что тут задача не перегнать значения из одного массива в другой. 
А для обычного копирования либо Move, либо массивы одного типа.

Автор: bems 18.2.2008, 18:03
Цитата(lukas @  18.2.2008,  17:38 Найти цитируемый пост)
почему то в процедуре SetLength компилятор ругается.... 
это потому что 

Цитата(lukas @  18.2.2008,  17:38 Найти цитируемый пост)
Array of String
в параматрах подпрограммы это любой массив строк, а не динамический массив

Автор: ama_kid 18.2.2008, 19:39
Цитата(pavelv @  17.2.2008,  16:59 Найти цитируемый пост)
"собственно как?"
Почему-то мне кажется, что "никак".  smile 
Цитата
Assignment-compatibility is not a symmetric relation. An expression of type T2 can be assigned to a variable of type T1 if the value of the expression falls in the range of T1 and at least one of the following conditions is satisfied.

T1 and T2 are of the same type, and it is not a file type or structured type that contains a file type at any level.
T1 and T2 are compatible ordinal types.
T1 and T2 are both real types.
T1 is a real type and T2 is an integer type.
T1 is PChar, PWideChar or any string type and the expression is a string constant.
T1 and T2 are both string types.
T1 is a string type and T2 is a Char or packed-string type.
T1 is a long string and T2 is PChar or PWideChar.
T1 and T2 are compatible packed-string types.
T1 and T2 are compatible set types.
T1 and T2 are compatible pointer types.
T1 and T2 are both class, class-reference, or interface types and T2 is a derived from T1.
T1 is an interface type and T2 is a class type that implements T1.
T1 is PChar or PWideChar and T2 is a zero-based character array of the form array[0..n] of Char (when T1 is PChar) or of WideChar (when T1 is PWideChar).
T1 and T2 are compatible procedural types. (A function or procedure identifier is treated, in certain assignment statements, as an expression of a procedural type. See "Procedural types in statements and expressions" on page 5-30.)
T1 is Variant and T2 is an integer, real, string, character, Boolean, interface type or OleVariant type.
T1 is an OleVariant and T2 is an integer, real, string, character, Boolean, interface, or Variant type.
T1 is an integer, real, string, character, or Boolean type and T2 is Variant or OleVariant.
T1 is the IUnknown or IDispatch interface type and T2 is Variant or OleVariant. (The variant's type code must be varEmpty, varUnknown, or varDispatch if T1 is IUnknown, and varEmpty or varDispatch if T1 is IDispatch.)
Как видим, из массивов тут упоминаются только массивы символов (строки)... 

P.S. Может в более поздних, чем моя D7, что-то придумали в этом плане?

Автор: pavelv 19.2.2008, 16:57
VICTAR наверное лучше меня пояснил одной фразой, действительно был вопрос как именно задачу решить не перегонкой. Всем спасибо за помощь, сделал посимвольным присваиванием.

Автор: Bug_Hunter 20.2.2008, 00:29
А вот такой вариант не подойдет?
Код

program init_array;

{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure InitIntArray(var a: array of integer; const b: array of integer);
  var
    na, nb, i: cardinal;
  begin
    na:=high(a);
    nb:=high(b);
    if nb>na then nb:=na; for i:=0 to nb do a[i]:=b[i];
    if nb<na then for i:=succ(nb) to na do a[i]:=0;
  end;

var
  a: array[1..5] of integer;
  b: array[1..3] of integer;
  i: integer;

begin
  InitIntArray(a, [1,2,3,4,5]);
  InitIntArray(b, [6,7,8]);

  write('a:');
  for i:=1 to 5 do write(' ', a[i]);
  writeln;

  write('b:');
  for i:=1 to 3 do write(' ', b[i]);
  writeln;

  readln;
end.

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