Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массиву присвоить сразу все значения 
:(
    Опции темы
pavelv
Дата 17.2.2008, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 5.2.2006

Репутация: нет
Всего: нет



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

Знаю, что можно сделать константно, но теперь уже просто хочется узнать "собственно как?". Заранее благодарен за помощь.
PM MAIL   Вверх
LesnoyChelovek
Дата 17.2.2008, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


странник Интернета
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 27.2.2006
Где: Русь

Репутация: нет
Всего: 10



Для твоего примера код будет выглядеть так:
Код

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


Это сообщение отредактировал(а) LesnoyChelovek - 17.2.2008, 17:24


--------------------
Делай добро и бросай его в воду... оно не утонет.. добром к тебе вернеться.
http://picasaweb.google.com/LesnoyChelovek/Photo
PM MAIL   Вверх
Esperito
Дата 17.2.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 2.9.2007

Репутация: нет
Всего: 3



Если записывать константы в секции interface, то можно так:
Код

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

PM MAIL   Вверх
pavelv
Дата 17.2.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 5.2.2006

Репутация: нет
Всего: нет



Вы не очень поняли о чем я, всё это я знаю.

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
PM MAIL   Вверх
bems
Дата 17.2.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



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



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Qu1nt
Дата 17.2.2008, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



Код

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

Ы?
PM MAIL   Вверх
pavelv
Дата 17.2.2008, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 5.2.2006

Репутация: нет
Всего: нет



Угу извиняюсь, про интерфэйс чет недочитал. Массив в процедуре, задан локально. Единственная идея была как-то преобразовать (1,2,3,...) в массив и присвоить уже нужному массиву. Но только функций преобразования в такие типы я не знаю :(
PM MAIL   Вверх
bems
Дата 17.2.2008, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(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



--------------------
Обижено школьников: 8
PM MAIL   Вверх
pavelv
Дата 17.2.2008, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 5.2.2006

Репутация: нет
Всего: нет



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

P.S> Возможно туплю, но пока не понимаю какой такой тип равен array[1..x] of integer
PM MAIL   Вверх
bems
Дата 17.2.2008, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Код

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


Добавлено через 3 минуты и 13 секунд
а это чем не нравится?


--------------------
Обижено школьников: 8
PM MAIL   Вверх
lukas
Дата 18.2.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 23.2.2007

Репутация: 3
Всего: 15



или усовершенствованный вариант немного....

Код

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;
 


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


--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
VICTAR
Дата 18.2.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 10
Всего: 80



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

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

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

ибо для компилятора это разные типы
PM MAIL   Вверх
lukas
Дата 18.2.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 23.2.2007

Репутация: 3
Всего: 15



ну тогда вот так...


Код


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 компилятор ругается.... 

Это сообщение отредактировал(а) lukas - 18.2.2008, 17:40


--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
VICTAR
Дата 18.2.2008, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 10
Всего: 80



lukas, я думаю, что тут задача не перегнать значения из одного массива в другой. 
А для обычного копирования либо Move, либо массивы одного типа.
PM MAIL   Вверх
bems
Дата 18.2.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



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

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


--------------------
Обижено школьников: 8
PM MAIL   Вверх
ama_kid
Дата 18.2.2008, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 9
Всего: 95



Цитата(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, что-то придумали в этом плане?


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
pavelv
Дата 19.2.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 5.2.2006

Репутация: нет
Всего: нет



VICTAR наверное лучше меня пояснил одной фразой, действительно был вопрос как именно задачу решить не перегонкой. Всем спасибо за помощь, сделал посимвольным присваиванием.
PM MAIL   Вверх
Bug_Hunter
Дата 20.2.2008, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 19.2.2008
Где: Бл. Подмосковье

Репутация: нет
Всего: нет



А вот такой вариант не подойдет?
Код

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.

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0971 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.