Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.055 c
15-1174061032
wacom
2007-03-16 19:03
2007.04.08
HEAD, GET + Content-Length


1-1171362268
StriderMan
2007-02-13 13:24
2007.04.08
Редактор скриптов JScript


15-1173709952
Prohodil Mimo
2007-03-12 17:32
2007.04.08
If ... then : Begin End VS Exit;


15-1174082588
Константинов
2007-03-17 01:03
2007.04.08
Настройка почтового клиента


1-1171611476
sia
2007-02-16 10:37
2007.04.08
F1Book печатает не на тот принтер, что я указываю





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский