Форум: "Начинающим";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];
Вниз
dlina : array of integer; Найти похожие ветки
← →
Нуб (2007-03-16 10:14) [0]У меня вот такой вопрос у меня есть массив элементов типа int, я в программе задаю количество элементом путем
SetLength(dlina,kol4isel);
необходимо ли в конце выполнения программы освобождать память выделенную под элементы этого массива ?
← →
Ega23 © (2007-03-16 10:22) [1]По-хорошему - да.
← →
Jeer © (2007-03-16 10:26) [2]Нуб (16.03.07 10:14)
Ega23 © (16.03.07 10:22) [1]
По правильному - не надо.
Динамические массивы финализируются автоматически.
Если же это массив массив объектов, то достаточно очистить все объекты, а ссылки на них приведутся к nil автоматически.
← →
Нуб (2007-03-16 10:27) [3]
> Ega23 ©
мда глюк если задаю массив определенной длины , то все работает ок , а если задаю его SetLengthом программа прерывается и пишет хвак ю
← →
Нуб (2007-03-16 10:28) [4]
> Jeer ©
сенкс за инфу , на будущее учту
← →
Jeer © (2007-03-16 10:29) [5]
> Нуб (16.03.07 10:27) [3]
Телепаторы в отпуске - код предъяви.
← →
Нуб (2007-03-16 10:31) [6]
procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
i, kol4isel: integer;
k, posl_tab : integer;
arrstr : string;
str : string;
step : integer;
dlina : array of integer;
begin
k := 1;
kol4isel := 1;
step := 1;
posl_tab :=0;
str := Clipboard.asText;
if ((Key = ord("V")) and (ssCtrl in Shift)) then begin
for i := 1 to Length(str) do // kol ya4eek
if str[i] = chr(9) then
Inc(kol4isel);
SetLength(dlina,kol4isel+1); - ПОЖЛОБИЛСЯ НА 1 :) // massiv iz kol4isel elementov
for i := 1 to Length(str) do begin // opredelyaem all dlinuYa4eyki v simvolah
if str[i] = chr(9) then begin
dlina[k] := i-posl_tab-1 ;
posl_tab := i; // indeks posl tab
Inc(k);
end;
end;
dlina[k] := Length(str) - posl_tab-2; // dlina posl ya4eyki
StringGrid1.ColCount := kol4isel+1;
Label1.Caption := IntToStr(dlina[k]);
Label2.Caption := IntToStr(Length(str));
Label3.Caption := IntToStr(posl_tab);
for i := 1 to kol4isel do begin
arrstr := copy(str,step,dlina[i]);
step := step + dlina[i]+1;
StringGrid1.Cells[i,1] := arrstr;
end;
Label4.Caption := FloatToStr(StrToFloat(arrstr));
end;
end;
все рабатоет тему считаю закрытой :)
← →
ЮЮ © (2007-03-16 10:38) [7]Не > - ПОЖЛОБИЛСЯ НА 1 :), а не расточительно не используешь dlina[0]
← →
Jeer © (2007-03-16 10:51) [8]
> ЮЮ © (16.03.07 10:38) [7]
Вряд ли до автора этот намек дошел.
Разъясню популярнее:
индексация в динамических массивах строк начинается с 1, а в остальных случаях по умолчанию с нуля, а потому:
k := 0;
..
SetLength(dlina,kol4isel);
for i := 1 to Length(str) do begin // opredelyaem all dlinuYa4eyki v simvolah
if str[i] = chr(9) then begin
dlina[k-1] := i-posl_tab-1 ;
posl_tab := i; // indeks posl tab
Inc(k);
end;
end;
← →
Jeer © (2007-03-16 10:52) [9]
> dlina[k]
разумеется:))
← →
Нуб (2007-03-16 10:57) [10]
> Jeer © (16.03.07 10:52) [9]
та вы что ? :), а я типа не знал :), та я и в Си не любил когда нумерация начинается на 0 , по-этому когда перешел на Делфи решил 0 не пользоваться , как-то это не естественно, а то что я в программе не задействовал 0 элемент массива , это только потому что ну я уже писал выше
← →
Jeer © (2007-03-16 10:59) [11]Нуб (16.03.07 10:57) [10]
> та вы что ? :), а я типа не знал :),
Судя по тону вопросов и стилю программирования еще многое не знаешь.
← →
TUser © (2007-03-16 11:42) [12]В конце работы программы не надо. Операционка сотрет все из памяти, не разбирая, массив там или цитаты из Лао Цзы. А вот если это выделяется в программе, скажем, 100000 раз, то изволь освободить, а то каждый раз будешь новую память кушать. Исключение - динамические массивы, объявленные как локальные переменные.
← →
Нуб (2007-03-16 14:35) [13]благодаря усилиям мастеров заварганил следующий код . Копирует с экселя данные с ячеек размерности n*m в стрингрид еще при том в область которую вы хотите :)
var
Form1: TForm1;
row : Integer;
col : Integer;
implementation
{$R *.dfm}
procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
i, c,b, kol4isel: integer;
k, posl_tab : integer;
arrstr : string;
str : string;
step : integer;
dlina : array of integer;
stroki : array of string;
kolstrok : integer;
begin
kolstrok := 1;
str := Clipboard.asText;
step := 1;
if ((Key = ord("V")) and (ssCtrl in Shift)) then begin
for i := 1 to Length(str) do // kol ya4eek
if str[i] = chr(13) then
Inc(kolstrok);
SetLength(stroki,kolstrok+1); // massiv iz "kolstrok" strok
kolstrok := 1;
for i := 1 to Length(str) do begin // kazhduyu stroku zanosim v array of string
if str[i] = chr(13) then begin
stroki[kolstrok] := copy(str,step,i-step+2);
step := i+2;
Inc(kolstrok);
end;
end;
for c:=1 to kolstrok-1 do begin // perebor po vsem strokam
kol4isel := 1;
step := 1;
posl_tab :=0;
k := 1;
for i := 1 to Length(stroki[c]) do // kol ya4eek
if stroki[c][i] = chr(9) then
Inc(kol4isel);
SetLength(dlina,kol4isel+1); // massiv iz "kol4isel" elementov
for i := 1 to Length(stroki[c]) do begin // opredelyaem all dlinuYa4eyki v simvolah
if stroki[c][i] = chr(9) then begin
dlina[k] := i-posl_tab-1 ;
posl_tab := i; // indeks posl tab
Inc(k);
end;
end;
dlina[k] := Length(stroki[c]) - posl_tab-2; // dlina posl ya4eyki
for b := 1 to kol4isel do begin // zaganyaem 4isla v grd
arrstr := copy(stroki[c],step,dlina[b]);
step := step + dlina[b]+1;
StringGrid1.Cells[b+col-1,row-1+c] := arrstr;
end;
end; // end perebor po vsem strokam
end;
end;
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
row := ARow;
col := ACol;
end;
end.
← →
Kolan © (2007-03-16 14:42) [14]> dlina,kol4isel
Руки бы отбил...
Трудно написать так чтобы поняли во всем мире? Length, SelCount например, если я правильно понял этот ужОс...
:(
← →
Нуб (2007-03-16 14:48) [15]
> Kolan ©
ну уж извинте, потрудитесь Вы сами уже заменить :) если будете юзать , а зачем же руки отбивать length называть как-то не хочется плутаница может получица, а не ужели на этом сайте висят со всего мира ? :)
← →
Kolan © (2007-03-16 15:31) [16]> ну уж извинте, потрудитесь Вы сами уже заменить :)
Мне оно нафиг ненадо, увидев такой код я его тут же выкину.
Я тебя вразумить пытаюсь.
Предствь что ты открываешь код а там написано:var
Largo: Integer;
Quantitat: Integer;
Compteur: Integer;
begin
for Compteur := 1 to Quantitat do
Largo := Largo + 1;
end;
Нравится? Понятно? Вот и твои каракули никому кроме тибя непонятны, даже я зная русский струдом их понимаю....
← →
Jeer © (2007-03-16 15:49) [17]Вышенаписанного ужаса тут никто не советовал, а вся функциональность
сводится вот к такому ядру:
const
TAB = #9;
CR = #13;
var
s: string;
i, j, k, m, rows, cols: integer;
begin
s := Clipboard.AsText;
j := Pred(Length(s));
rows := 1;
cols := 0;
grid.RowCount := rows;
k := 1;
m := 0;
for i := 1 to j do begin
if (s[i] = TAB) or (s[i] = CR) then begin
if (rows = 1) then begin
Inc(cols);
grid.ColCount := cols;
end;
grid.Cells[m, rows - 1] := copy(s, k, i - k);
if s[i] = TAB then k := i + 1;
if s[i] = CR then k := i + 2;
Inc(m);
end;
if (s[i] = CR) and (i < j) then begin
Inc(rows);
grid.RowCount := rows;
m := 0;
end;
end;
end;
← →
Нуб (2007-03-16 15:54) [18]ну монстры , монстры браво Вам, я Вами горжусь , я пишу всего лишь месяц на Делфи , чего Вы от меня хотите ? :), неужели Вы так не писали ? :) и та это смешно смотреть на то как люди хотят показать себя выше кого-то , а зачем ? работай , зарабатывай свое и помогай другим чем можешь, но унижать кого-то - зачем ? :), ядро красивое ничего не скажу - супер оптимизировали , надеюсь само рано или поздно к такому приду
← →
Нуб (2007-03-16 15:56) [19]
> Kolan ©
← →
Jeer © (2007-03-16 16:17) [20]
> оптимизировали ,
Далеко не все:))
if s[i] = TAB then
k := i + 1
else
k := i + 2;
Надо стремится к пониманию того, что делаешь и не плодить сущности там, где можно обойтись меньшим.
← →
Плохиш © (2007-03-16 16:19) [21]
> неужели Вы так не писали ?
Можешь не поверить, но так не писал. Недавно смотрел свои первые исходники начала 90х и, честно скажу, мне за них стыдно не было. Может это от того, что тогда сначало были прочитанные книги по программированию и только потом топтание кнопок...
← →
Jeer © (2007-03-16 16:27) [22]
> та я и в Си не любил когда нумерация начинается на 0 , по-
> этому когда перешел на Делфи решил 0 не пользоваться ,
А вот это подразумевает, что была была практика на C.
Да, похоже, такая же как и на Delphi - плохая.
Если человек получил опыт программирования на каком-либо языке, то освоенные правила и методы он легко переносит на новый язык и эта наследственность есть признак сбережения положительного опыта.
← →
GrayFace © (2007-03-16 20:29) [23]TUser © (16.03.07 11:42) [12]
В конце работы программы не надо. Операционка сотрет все из памяти, не разбирая, массив там или цитаты из Лао Цзы.
Исключение - массив объектов, если они при Free уничтожают атомы, сохраняют настройки и т.п.
Нуб (16.03.07 15:54) [18]
Код должен быть красивым. И себе приятно, и тем, кто его будет читать.
← →
Johnmen © (2007-03-16 21:06) [24]
> GrayFace © (16.03.07 20:29) [23]
> >TUser © (16.03.07 11:42) [12]В конце работы программы
> >не надо. Операционка сотрет все из памяти, не разбирая,
> >массив там или цитаты из Лао Цзы.
> Исключение - массив объектов,
> если они при Free уничтожают атомы, сохраняют настройки
> и т.п.
Никаких исключений. Вся память будет освобождена. Менеджер памяти обеспечит...
← →
Kolan © (2007-03-16 21:41) [25]неужели Вы так не писали ?
Писал так на паскале, потому что так научили на информатике. А ты учись на чужих ошибках, и так не пЕши..
И вообще есть такое правило/призыв:
Пиши не для себя а для другого программиста, который будет читать твой код(даже если этого никогда не случится).
(с) Kent Beck, кажется
показать себя выше кого-то , а зачем
Это про меня что ли? И не думал даже. :)
← →
GrayFace © (2007-03-17 11:04) [26]> Никаких исключений. Вся память будет освобождена. Менеджер памяти обеспечит...
Память освобождать не надо, надо освобождать атомы и делать другие полезные вещи, которые могут содержаться в деструкторах объектов. Это менеджер памяти не обеспечит.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.036 c