Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2015, 16:41   #1
Loqwer78rus
Пользователь
 
Регистрация: 24.03.2014
Сообщений: 60
По умолчанию Замена SetLength

Могу ли я заменить SetLength циклом for ?

Код:
var
Table:array of array of extended;
MoreCount: integer;
begin
if (StrGrd1.Cells[0,i]='>') or (StrGrd1.Cells[0,i]='>=') then
inc(MoreCount);
SetLength(Table,StrGrd1.ColCount+2,MoreCount);

Последний раз редактировалось Stilet; 14.12.2015 в 18:07.
Loqwer78rus вне форума Ответить с цитированием
Старый 14.12.2015, 16:44   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Код:
setLength(table, 10);
for j:=0 to 9 do 
   SetLength(table[j], 5 +j);
так писать можно.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 14.12.2015, 17:09   #3
Loqwer78rus
Пользователь
 
Регистрация: 24.03.2014
Сообщений: 60
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
setLength(table, 10);
for j:=0 to 9 do 
   SetLength(table[j], 5 +j);
так писать можно.
А вообще убрать его можно ?

Код:
for i:=1 to StrGrd1.RowCount-1 do
    begin
    if (StrGrd1.Cells[0,i]='>') or (StrGrd1.Cells[0,i]='>=') then
      begin
      inc(MoreCount);
      SetLength(Table,StrGrd2.ColCount+2,MoreCount);
      //коэффициенты
      for j:=0 to StrGrd2.ColCount-1 do
      Table[j+2,MoreCount-1]:=StrToFloat(StrGrd2.cells[j,i]);
      //Пока нули (потом базис...)
      Table[0,MoreCount-1]:=0;
      //Значение  (B i-ый)
      Table[1,MoreCount-1]:=StrToFloat(StrGrd3.cells[0,i]);
      end;
    end;
Loqwer78rus вне форума Ответить с цитированием
Старый 14.12.2015, 17:29   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
А вообще убрать его можно ?
что убрать?
Setlength(table[x], 0); // так???
так он есть такой изначально СРАЗУ ПОСЛЕ
SetLength(table, 10); === SetLength(table, 10, 0);

СОВСЕМ НЕ ИСПОЛЬЗОВАТЬ SetLength ???
так его будет размерности будут по нулям (массив то будет но НУЛЕВОЙ длины)
и никаких table[i, j]:=.... НЕ получится.

Задавать размеры можно в любой момент, когда вам данные размеры потребовались.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 14.12.2015 в 17:31.
evg_m вне форума Ответить с цитированием
Старый 14.12.2015, 17:37   #5
Loqwer78rus
Пользователь
 
Регистрация: 24.03.2014
Сообщений: 60
По умолчанию

Я не понимаю для чего здесь нужен Setlength. Я с трудом даже понимаю как он работает. Я всегда задаю массив по чайниковскому способу.

Код:
mas1:array[1..3,1..3] of Real;
for i:=1 to 3 do
    for j:=1 to 3 do
    begin
      Mas1[i,j]:=StrToFloat(strngrd1.Cells[j-1,i-1]);
    end;
Loqwer78rus вне форума Ответить с цитированием
Старый 14.12.2015, 17:51   #6
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Вы ж не путайте массивы ФИКСИРОВАННОГО размера и ДИНАМИЧЕСКОГО размера.
Откуда ему знать какой количеств вам нужен? Изначально размер у динамического - ноль элементов.

Либо
Код:
var Table: array [0..999] of array [0..999] of extended;
Либо
Код:
// пишите SetLength()
ResourceSpace вне форума Ответить с цитированием
Старый 14.12.2015, 17:53   #7
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Заменить массив на более удобоваримое.
come-on вне форума Ответить с цитированием
Старый 14.12.2015, 17:55   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Я не понимаю для чего здесь нужен Setlength. Я с трудом даже понимаю как он работает. Я всегда задаю массив по чайниковскому способу.
Массивы бывают статические (это по вашему "чайниковскому" способу), когда их размер определяется на этапе компиляции программы, компилятор выделяет под этот массив сразу необходимое число памяти
и массиивы бывают ДИНАМИЧЕСКИЕ. Это когда на этапе компиляции неизвестно, сколько элементов будет в массиве.
Для таких массивов нужно выделять память прямо в процессе выполнения программы (прежде чем обращаться к содержимому динамического массива, нужно выделить нужное число памяти). Вот для этих целей и служит процедура SetLength()

теперь стало чуть понятней?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.12.2015, 18:08   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Могу ли я заменить SetLength циклом for ?
А чем это не устроило то?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2015, 18:15   #10
Loqwer78rus
Пользователь
 
Регистрация: 24.03.2014
Сообщений: 60
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А чем это не устроило то?
Не понимаю как работает данная процедура

// Устанавливаем длину многомерного массива
SetLength(multiArray, 2, 3);
Что в данном случае означает 2; 3 ?
Loqwer78rus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
setlength ritty18 Помощь студентам 10 31.03.2012 00:57
SetLength _-Re@l-_ Общие вопросы Delphi 0 31.08.2010 15:11
SetLength 16*16 Alex Cones Общие вопросы Delphi 13 23.03.2010 15:57
setlength Smerch66 Общие вопросы Delphi 8 22.03.2010 19:32