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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2011, 19:57   #1
Язь
 
Регистрация: 11.10.2011
Сообщений: 7
По умолчанию [Delphi] Перевернуть массив

Всем добрый вечер, заранее извиняюсь за быдлокод, застопорился на одной лабе по переворачиванию массива.

Условие:



Собственно код:
Код:
type
  A = array[1..1] of Integer;
  B = ^A;

var
  Form1: TForm1;
  j : B;
implementation

{$R *.dfm}

procedure TForm1.BitBtn3Click(Sender: TObject);
var c1 : Integer;
begin
c1 := 0;
while (StringGrid1.ColCount > c1) do begin
  StringGrid1.Cells[c1,0] := IntToStr(Random(10));
  c1 := c1+1;
end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var c : Integer;
begin
  c := 0;
  GetMem(j, StringGrid1.ColCount+8);
    while (StringGrid1.ColCount > c) do begin
      j[c] := StrToInt(StringGrid1.Cells[c,0]);
      StringGrid2.Cells[(StringGrid1.ColCount-c-1),0] := IntToStr(j[c]);
      c := c+1;
    end;
  FreeMem(j, 800);
end;
end.
Баги:

1) Распределяет по ячейкам правильно, но в итоге выбивает ошибку:


2) Продолжение первого бага после разрушения формы:



Собственно два вопроса:
а) Как пофиксить баг 1) и 2)?
б) Как запихивать не только числа, но и буквы из StringGrid1 в массив?

Последний раз редактировалось Язь; 11.10.2011 в 20:01.
Язь вне форума Ответить с цитированием
Старый 11.10.2011, 20:47   #2
Язь
 
Регистрация: 11.10.2011
Сообщений: 7
По умолчанию

UPD: допилил пункт б), буквы теперь не помеха:

Код:
type
  A = array[1..1] of PChar;
  B = ^A;

var
  Form1: TForm1;
  j : B;
implementation

{$R *.dfm}

procedure TForm1.BitBtn3Click(Sender: TObject);
var c1 : Integer;
begin
c1 := 0;
while (StringGrid1.ColCount > c1) do begin
  StringGrid1.Cells[c1,0] := char(Random(32)+65); // Английские буквы верхнего регистра + немного спецсимволов
  c1 := c1+1;
end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var c : Integer;
begin
  c := 0;
  GetMem(j, StringGrid1.ColCount+8);
    while (StringGrid1.ColCount > c) do begin
      j[c] := PChar(StringGrid1.Cells[c,0]);
      StringGrid2.Cells[(StringGrid1.ColCount-c-1),0] := PChar(j[c]);
      c := c+1;
    end;
  FreeMem(j, StringGrid1.ColCount+8);
end;

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

Последний раз редактировалось Язь; 11.10.2011 в 21:51.
Язь вне форума Ответить с цитированием
Старый 11.10.2011, 21:26   #3
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

1. каждый элемент типа Integer занимает 4 байта, следовательно необходимо выделять
Код:
GetMem(j, StringGrid1.ColCount*4);
2. Правильнее использовать динамические массивы ...
3. Самое главное - дополнительный массив(j) здесь не нужен. Пройди в цикле первую половину массива хранящегося в StringGrid и обменяй значения его элементов с последними (0-й с последним, 1-й с предпоследним,...), через буферную переменную типа String
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 11.10.2011, 21:42   #4
Язь
 
Регистрация: 11.10.2011
Сообщений: 7
По умолчанию

Интересно получилось, памяти уже хватает после шага 1. и 2.:

Код:
var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn3Click(Sender: TObject);
var c1 : Integer;
begin
c1 := 0;
while (StringGrid1.ColCount > c1) do begin
  StringGrid1.Cells[c1,0] := char(Random(32)+65); // Английские буквы верхнего регистра + немного спецсимволов
  c1 := c1+1;
end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var c, b : Integer;
Z : array of PChar;
begin
  c := 0;
  b := StringGrid1.ColCount;
  GetMem(Z, b*4);
    while (b > c) do begin
      Z[c] := PChar(StringGrid1.Cells[c,0]);
      StringGrid2.Cells[(b-c-1),0] := PChar(Z[c]);
      c := c+1;
    end;
  FreeMem(Z, b*4);
end;

end.
Нужно ли теперь использовать совет 3.? Если нужно, не могли бы Вы предоставить пример?

Последний раз редактировалось Язь; 11.10.2011 в 21:45.
Язь вне форума Ответить с цитированием
Старый 11.10.2011, 21:57   #5
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var c, b : Integer;
begin
  b := StringGrid1.ColCount-1;
  for c:=0 to b do
      StringGrid2.Cells[b-c,0] := StringGrid1.Cells[c,0];
end;
... набивал здесь - могут быть синтаксические ошибки
ЗЫ рекомендации выше дал прочитав задание ... это решение если формируется новый массив на основании исходного
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 12.10.2011, 11:22   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Простите, где тут ОБМЕН данных ? простое присвоение с затиранием... причем проход не до половины, а полностью.. Думаю, надо так :
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var 
  c, b : Integer;
  s : string;
begin
  b := StringGrid1.ColCount-1; 
  for c := 0 to b div 2 do
    begin
    s := StringGrid2.Cells[b-c,0];      
    StringGrid2.Cells[b-c,0] := StringGrid1.Cells[c,0];
    StringGrid1.Cells[c,0] := s;
    end;
end;
phomm вне форума Ответить с цитированием
Старый 12.10.2011, 12:27   #7
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

2 phomm, для обмена писал в 3 посте ... в ващем коде необходимо заменить StringGrid2 на StringGrid1
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 12.10.2011, 12:45   #8
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Цитата:
Сообщение от Step_UA Посмотреть сообщение
3. Самое главное - дополнительный массив(j) здесь не нужен. Пройди в цикле первую половину массива хранящегося в StringGrid и обменяй значения его элементов с последними (0-й с последним, 1-й с предпоследним,...), через буферную переменную типа String
Цитата:
Сообщение от Язь
Нужно ли теперь использовать совет 3.? Если нужно, не могли бы Вы предоставить пример?
После этого идёт Ваш ответ с кодом - логично же, что я предположил, что Вы код примера обмена предлагаете, соответственно и ответил, а Вы получается на другую ошибочку указывали ? Извиняюсь тогда ) но и Вы меня поймите
А заменить гриды - я же копипастил из Вашего поста, не обессудьте ))

Последний раз редактировалось phomm; 12.10.2011 в 12:47.
phomm вне форума Ответить с цитированием
Старый 12.10.2011, 12:56   #9
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Вот ведь интересная штука, редактирование поста. Изначально в 4 посте был вопрос - нельзя ли уменьшить код ... пока отвечал - отредактировали ))
Сначала набил подобный вашему код, но заметив присутствие 2-х StringGrid'ов переделал в существующий, дописав
Цитата:
ЗЫ рекомендации выше дал прочитав задание ... это решение если формируется новый массив на основании исходного
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 15.10.2011, 20:45   #10
Язь
 
Регистрация: 11.10.2011
Сообщений: 7
По умолчанию

Вести с полей: преподу не понравился код, меня отправили переделывать с фразой "что такое PChar? Я не давал вам PChar!" За сим пытаюсь перелопатить с использованием массива типа String:

Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var c, b : Integer;
Z : array of String;
begin
  c := 0;
  b := StringGrid1.ColCount;
  GetMem(Z, b*4);
    while (b > c) do begin
      Z[c] := (StringGrid1.Cells[c,0]);
      StringGrid2.Cells[(b-c-1),0] := (Z[c]);
      c := c+1;
    end;
  FreeMem(Z, b*4);
end;

end.
... та же ошибка с раздачей памяти, её хватает только на 1 элемент:



Что я делаю не так?

Последний раз редактировалось Язь; 15.10.2011 в 20:51.
Язь вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевернуть число. MAKEDON Общие вопросы C/C++ 3 23.04.2017 15:16
перевернуть двумерный массив.(динамический) Arcueid1691 Общие вопросы C/C++ 0 29.11.2010 21:04
Перевернуть список delphi 7 GaLiof Помощь студентам 1 18.06.2010 08:23
Перевернуть матрицу 10Rabbit Помощь студентам 11 09.10.2009 17:34
Перевернуть строку Манжосов Денис :) Общие вопросы Delphi 13 03.12.2008 04:37