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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2014, 12:47   #1
.FROST.
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 56
По умолчанию Задача о наборе высоты и скорости летательным аппаратом.

Доброго времени суток. Я пишу программу, которая находит минимальный расход топлива при наборе высоты и

скорости ЛА. Проблема в следующем:
Когда я пытаюсь заполнить 1 строку массива S используя считанные значения из StringGridа массива, двигаясь

справа налево, возникает ошибка "invalid pointer operation". Где ошибка, не понимаю.
Вот код:
Код:
//Вычисление расходов топлива S
procedure TForm1.Button3Click(Sender: TObject);
var
  S:array of array of double;
  V:array of array of double;
  H:array of array of double;
  i,j,k,c:integer;
  begin
  SetLength(V,StringGrid1.ColCount,StringGrid1.RowCount);
  SetLength(H,StringGrid1.ColCount,StringGrid1.RowCount);
  SetLength(S,StringGrid1.ColCount,StringGrid1.RowCount);

      For j:= 1 to StringGrid1.ColCount-1 do    //столбец
  For i:= 1 to StringGrid1.RowCount-1 do    //строка
      begin
      if ((i mod 2 = 0) and (j mod 2 = 1)) then
      begin
         H[i,j]:=strtofloat(StringGrid1.Cells[j,i]); //Заполнение массива H[i,j]
      end;
      if ((i mod 2 = 1) and (j mod 2 = 0)) then
      begin
        V[i,j]:=strtofloat(StringGrid1.Cells[j,i]);  //Заполнение массива V[i,j]
      end;
    end;

  //Заполнение  первой строки массива S с конца
  c:=2*(strtoint(Form2.edtn.text))+1; //кол-во столбцов
  S[1,c-2]:=V[1,c-1];
  c:=c-2;
  while (c<=1) do
  for k:= 1 to 2*(strtoint(Form2.edtm.text))+1 do
    begin
      c:=c-2;
      S[1,c]:=S[1,c+2]+V[1,c+k];
      StringGrid1.Cells[c,1]:=floattostr(S[1,c]);
    end;
   

end;
Что я делаю не так?
Вот весь проектProject.rar
И теория к нему Задача о наборе высоты и скорости летательным аппаратом.rar

Мне одно не нравится, В теории присутствует координатная плоскость, что понятно. А в стринггрде оси можно

расположить только сверху и слева,что не очень смотрится и затрудняет,думаю счет. Думал наклепать эдитов, но

получится ограничение по ихкол-ву.. Может посоветуете?

Осталось самое сложное, собственно. Посчитать значения S(расходы топлива) и найти оптимальный путь. Готов

обсудить оплату, при необходимости.
.FROST. вне форума Ответить с цитированием
Старый 31.03.2014, 13:01   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для сведения - индексация динамических массивов с нуля начинается, аналогично колонки и строки стрингрида тоже с нуля.

while (c<=1) do - если c=1, то по этому условию обязательно влетите в минуса с нехорошими последствиями
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.03.2014, 13:15   #3
.FROST.
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 56
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Для сведения - индексация динамических массивов с нуля начинается, аналогично колонки и строки стрингрида тоже с нуля.

while (c<=1) do - если c=1, то по этому условию обязательно влетите в минуса с нехорошими последствиями
Это я знаю, но мне нулевые индексы не нужно запоминать в массив, там находятся значения высот и скоростей. Сейчас попробую уменьшить на единицу, как Вы посоветовали.

А как тогда быть с while-ом? ведь считать нужно с конца? С репитом таких проблем не возникнет?
.FROST. вне форума Ответить с цитированием
Старый 31.03.2014, 13:20   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сейчас попробую уменьшить на единицу, как Вы посоветовали
Я не советовал уменьшать, в алгоритме не разбирался. Может так и нужно. Просто эти единички режут глаз.
А в WHILE условие выполняется пока истинно, в отличие от REPEAT
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.04.2014, 17:17   #5
.FROST.
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 56
По умолчанию

чуть подправил
Код:
//Вычисление расходов топлива S
procedure TForm1.Button3Click(Sender: TObject);
var
  S:array of array of double;
  V:array of array of double;
  H:array of array of double;
  i,j,k,c:integer;
  begin
  SetLength(V,StringGrid1.ColCount,StringGrid1.RowCount);
  SetLength(H,StringGrid1.ColCount,StringGrid1.RowCount);
  SetLength(S,StringGrid1.ColCount,StringGrid1.RowCount);
 
      For j:= 0 to StringGrid1.ColCount-1 do    //столбец
      For i:= 0 to StringGrid1.RowCount-1 do    //строка
      begin
      if ((i mod 2 = 0) and (j mod 2 = 1)) then
      begin
         H[i,j]:=strtofloat(StringGrid1.Cells[j,i]); //Заполнение массива H[i,j]
      end;
      if ((i mod 2 = 1) and (j mod 2 = 0)) then
      begin
        V[i,j]:=strtofloat(StringGrid1.Cells[j,i]);  //Заполнение массива V[i,j]
      end;
    end;
 
  //Заполнение  первой строки массива S с конца
  c:=StringGrid1.ColCount-1; //кол-во столбцов
  S[1,c-2]:=V[1,c-1];
  StringGrid1.Cells[c-2,1]:=floattostr(S[1,c-2]);
  c:=c-2;
  while (c>1) do
      begin
        c:=c-2;
        S[1,c]:=S[1,c+2]+V[1,c+1];
        StringGrid1.Cells[c,1]:=floattostr(S[1,c]);
      end;
end;
Но теперь выскакивают ошибки list index out of bounds и Invalid pointer рoperation. Но первая строка заполняется, хотя и весьма странно(в 2 соседние ячейки заносятся одинаковое значение)...

И еще одна странность, если вводить большое столбцов, то при прокручивании в ячейках цифры как бы накладываются друг на друга...

Последний раз редактировалось .FROST.; 01.04.2014 в 18:48.
.FROST. вне форума Ответить с цитированием
Старый 02.04.2014, 09:11   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Все напутано с индексами. Смотрим например выделение памяти под H - для 1-го индекса кол-во колонок задано, для 2-го - строк грида . А в цикле наоборот. И если колонок и строк разное кол-во, то неизбежен выход за пределы массива
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.04.2014, 13:12   #7
.FROST.
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 56
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Все напутано с индексами. Смотрим например выделение памяти под H - для 1-го индекса кол-во колонок задано, для 2-го - строк грида . А в цикле наоборот. И если колонок и строк разное кол-во, то неизбежен выход за пределы массива
Тоже это заметил при тестировании. Планирую переделать заполнение грида.
.FROST. вне форума Ответить с цитированием
Старый 06.04.2014, 19:37   #8
.FROST.
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 56
По умолчанию

Даже за деньги никто не знает, как это сделать?
.FROST. вне форума Ответить с цитированием
Старый 06.04.2014, 20:53   #9
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

.FROST. За деньги три четверти форума знает. Только во первых, денег ни кто не предлагает, а во вторых для платных просьб есть соответственный раздел.
XE5 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача о минимальном наборе станций Sparky Помощь студентам 0 17.12.2011 18:52
Задача на вычисление высоты в треугольнике проФан Паскаль, Turbo Pascal, PascalABC.NET 1 19.10.2011 00:16
Работа с кассовым аппаратом zabej C# (си шарп) 2 08.06.2011 09:40
Замена слов при наборе medved6216 Общие вопросы Delphi 2 13.09.2010 17:54