Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.28;
Скачать: CL | DM;

Вниз

Почему это не работает   Найти похожие ветки 

 
_koha   (2008-08-19 13:49) [0]

Компилируется без ошибок, но при работе "падает".

//..............................
var
 Conter: integer;
 N: array of integer;
 buf: array of integer;

//..................................
procedure TForm2.Button3Click(Sender: TObject);
Var
 num:integer;
begin
 Num:=Length(N);
 SetLength(Buf,Num);
 Move(N, Buf, Num);
 Inc(Num);
 setlength(N, Num);
 move(Buf, N, Num-1);
 N[Num]:=num;
 for num:=0 to Length(N)-1 do
   memo1.Lines.Add(IntToStr(N[num]));
 memo1.Lines.Add("----------------------------");
end;


 
Германн ©   (2008-08-19 13:55) [1]


> Move(N[0], Buf[0], Num);

Читай книжки. Изучай динамические массивы.


 
Medbe}I{onok XML ©   (2008-08-19 13:56) [2]

move(Buf, N, Num-1);

и многое другое тоже изучай.


 
Юрий Зотов ©   (2008-08-19 13:56) [3]

Первая же строчка:
Num := Length(N);
Чему будет равно Num?

А вообще-то, почему бы не пройти отладчиком и не выяснить точную причину?


 
Vlad Oshin ©   (2008-08-19 14:01) [4]

N[Num-1]:=num;


 
Palladin ©   (2008-08-19 14:03) [5]

троянописец млин :)


 
oldman ©   (2008-08-19 14:05) [6]


> Юрий Зотов ©   (19.08.08 13:56) [3]
> Первая же строчка:
> Num := Length(N);


Учитывая, что
N: array of integer;

действительно
"Компилируется без ошибок"?


 
_koha   (2008-08-19 14:08) [7]


> Юрий Зотов ©   (19.08.08 13:56) [3]

Num := Length(N);
при самом первом вызове Num = 0 при всех последующих = +1


> Medbe}I{onok XML ©   (19.08.08 13:56) [2]
> move(Buf, N, Num-1);

Сдесь так и задумывалось Num-1 это правильное дейстаие


 
Medbe}I{onok XML ©   (2008-08-19 14:09) [8]

Сдесь так и задумывалось Num-1 это правильное дейстаие

Нужели?


 
Сергей М. ©   (2008-08-19 14:11) [9]


> _koha   (19.08.08 13:49)


Отладчик, конечно же, молчит как партизан ?)


 
Medbe}I{onok XML ©   (2008-08-19 14:11) [10]

И в чем сакральный смысл передачи муву длины массива минус один?
"Больше строчек кода, веселых и странных"?


 
Medbe}I{onok XML ©   (2008-08-19 14:13) [11]

procedure Move(const Source; var Dest; Count: Integer);

Description

Move copies Count bytes from Source to Dest.


 
_koha   (2008-08-19 14:15) [12]

Правильный код


//..............................
var
 Conter: integer;
 N: array of integer;
 buf: array of integer;
//..................................
procedure TForm2.Button3Click(Sender: TObject);
Var
 num:integer;
begin
 Num:=Length(N);
 SetLength(Buf,Num);
 Move(N[0], Buf[0], Num);
 Inc(Num);
 setlength(N, Num);
 move(Buf[0], N[0], Num-1);
 N[Num-1]:=num;
 for num:=0 to Length(N)-1 do
   memo1.Lines.Add(IntToStr(N[num]));
 memo1.Lines.Add("----------------------------");


Что касается функции move() был уверен, что она с нулевого элемента копирует из масиивов, почему ей явно надо указывать начало массива?


 
Сергей М. ©   (2008-08-19 14:18) [13]


> она с нулевого элемента копирует из масиивов


А где ты вообще видишь в прототипе ф-ции Move(), что она работает с массивами, да еще и с динамическими ?


 
Medbe}I{onok XML ©   (2008-08-19 14:23) [14]

Допустим N = 2
Твой мув скопирует 1 байт.
В то время как любой элемент массива (Integer) состоит из четырех байт.
Ку?


 
Palladin ©   (2008-08-19 14:23) [15]


> она с нулевого элемента копирует из масиивов

а ты задумывался о том, что есть идентификатор дин массива?


 
_koha   (2008-08-19 14:24) [16]


> Medbe}I{onok XML ©   (19.08.08 14:11) [10]
> И в чем сакральный смысл передачи муву длины массива минус
> один?"Больше строчек кода, веселых и странных"?


Очень простой:
вот о меня есть коробок спичек в нем их 10 и одинадцатая не влазит, то я беру такой же коробок (для 10 спичек) и перекладываю списки из первого во второй затем растягиваю первый коробок на +1 спичку
Inc(Num);
setlength(N, Num);

и как ты думаешь сколько спичек я должен вернуть их второго коробка?
одинадцать  или всетаки (Num-1) десять?


 
Medbe}I{onok XML ©   (2008-08-19 14:24) [17]

Правильный код

Ага, правильный. Только бессмысленный.


 
Medbe}I{onok XML ©   (2008-08-19 14:25) [18]

и как ты думаешь сколько спичек я должен вернуть их второго коробка?
одинадцать  или всетаки (Num-1) десять?


Move не имеет никакого понятия ни про спички ни про тип Integer


 
_koha   (2008-08-19 14:36) [19]


> Medbe}I{onok XML ©   (19.08.08 14:24) [17]
</I
> Ага, правильный. Только бессмысленный.

>

Это же модель просто пример, когда код гораздо сложнее и запутанный, то прибегают к простым моделям, для того, чтобы понять их суть. Для тебя он бессмысленный для меня вовсе и не бессмысленный, а будет работать как функция увеличения д.массива на +1


 
Medbe}I{onok XML ©   (2008-08-19 14:37) [20]

Пациент очень тяжелый. Мы его щас потеряем.


 
Medbe}I{onok XML ©   (2008-08-19 14:38) [21]

а будет работать как функция увеличения д.массива на +1

Длинна массива увеличится.
А после мува в нем будет мусор.


 
_koha   (2008-08-19 14:44) [22]


>Medbe}I{onok XML ©   (19.08.08 14:38) [21]
> А после мува в нем будет мусор


А с чего ты взял?


 
Сергей М. ©   (2008-08-19 14:45) [23]


> _koha   (19.08.08 14:24) [16]
>
>


ПРежде чем городить велосипед, нужно почитать справку.
Там четко и внятно сказано про SetLength:

Existing characters in the string or elements in the array are preserved

Так что все эти твои потуги с мувом попросту бестолковые телодвижения)


 
Medbe}I{onok XML ©   (2008-08-19 14:46) [24]

Снимись с ручника-то.
Мув копирует не спички, а байты.
Каждая спичка состоит из четырех байт.


 
Palladin ©   (2008-08-19 14:48) [25]


> _koha   (19.08.08 14:44) [22]

а что там будет по твоему? спички?


 
Сергей М. ©   (2008-08-19 14:48) [26]

Inc(Num);
SetLength(N, Num);
N[Pred(Num)] := Num;

вгот и весь велосипед)


 
_koha   (2008-08-19 14:56) [27]


> Medbe}I{onok XML ©   (19.08.08 14:46) [24]
>
> Снимись с ручника-то.
> Мув копирует не спички, а байты.
> Каждая спичка состоит из четырех байт.


Значит и не только байты а еще и элементы массива, незнаю но вот тот код работает и нет там никакого мусора.


 
Medbe}I{onok XML ©   (2008-08-19 14:58) [28]

и нет там никакого мусора.

Тебе же сказали, что setlenth не портит содержимое массива.
Потому и не мусор.
Замувишь в новый чистый массив, будет мусор.


 
Сергей М. ©   (2008-08-19 15:00) [29]

Мда..
Далеко пойдет сей троянописец)


 
_koha   (2008-08-19 15:00) [30]

setlenth  как раз то все и портит!


 
Medbe}I{onok XML ©   (2008-08-19 15:00) [31]

все. к терапевту.


 
Сергей М. ©   (2008-08-19 15:01) [32]


> _koha   (19.08.08 15:00) [30]


Эт ты для сокетов что ли массивчик заготавливаешь ?


 
Amoeba ©   (2008-08-19 15:01) [33]


> _koha   (19.08.08 15:00) [30]
>
> setlenth  как раз то все и портит!

Лучше жевать, чем говорить!
LMD!


 
_koha   (2008-08-19 15:02) [34]


> Сергей М. ©   (19.08.08 15:00) [29]
>
> Мда..
> Далеко пойдет сей троянописец)


а вы и ту ветку видели?


 
Сергей М. ©   (2008-08-19 15:02) [35]


> _koha   (19.08.08 15:02) [34]


А что ее видеть ?
Она вон до сих пор красуется)


 
+koha   (2008-08-19 15:06) [36]


> Сергей М. ©   (19.08.08 15:01) [32]
> Эт ты для сокетов что ли массивчик заготавливаешь ?


- К удивлению нет.


 
Dennis I. Komarov ©   (2008-08-19 15:07) [37]

О уже забанили, а ветка еще висит...


 
Renegat ©   (2008-08-19 15:08) [38]

> [30] _koha   (19.08.08 15:00)

Быть такого не может. SetLength имеет в своей основе GlobalReAlloc. Он автоматически копирует данные из предыдущего блока памяти в только что зарезервированный, если тот большего размера, чем исходный. Если же размер меньше - то вообще ничего никуда не копирует, и память остаётся на месте.


 
+koha   (2008-08-19 15:10) [39]

> Сергей М. ©   (19.08.08 15:02) [35]
вопрос об динамических массивах меня давно  интересовал в плане общего развития. Вот решил выяснить все подробности.


 
Сергей М. ©   (2008-08-19 15:14) [40]


> решил выяснить все подробности


Что ж ты не обратился за разъяснениями, в первую очередь, к отладчику ?

Отладчик ведь - первый друг, товарищ и брат трояноделов)

А ты почему-то сразу в клинику обратился за диагнозом)


 
Medbe}I{onok XML ©   (2008-08-19 15:15) [41]

Вот решил выяснить все подробности.

Зачем?
Тебе пора новую редакцию хелпа выпускать.
А то в том что у нас, написано одно вранье.


 
Renegat ©   (2008-08-19 15:16) [42]

> [38] Renegat ©   (19.08.08 15:08)
> GlobalReAlloc

Имелось в виду "Принцип, использованный в GlobalReAlloc".


 
Medbe}I{onok XML ©   (2008-08-19 15:19) [43]

Имелось в виду "Принцип, использованный в GlobalReAlloc".

Эти принципы устарели давно.
Согласно новому постановлению вцспс мув по переданному адресу понимает, что автор работает с массивом и даже может определить тип элементов массива.


 
+koha   (2008-08-19 15:20) [44]


> А ты почему-то сразу в клинику обратился за диагнозом)

Ну так а клиника это значит  вы? т.е. форум? так вы здесь диагнозы выдаете только? или еще и лечите?


 
Medbe}I{onok XML ©   (2008-08-19 15:23) [45]

и лечат. но временами попадаются неизлечимые.


 
+koha   (2008-08-19 15:24) [46]


> Medbe}I{onok XML ©   (19.08.08 15:19) [43]

Ну так в том то и дело, что по твоему описанию оно работать и не должно, но вопреки всякой логики работает, вопрос почему же? Объясни.


 
Сергей М. ©   (2008-08-19 15:24) [47]


> вы здесь диагнозы выдаете только?


И диагнозы ставим, и лечим, и калечим, и Шопена заказываем)

Ты ты про отладчик-то так и не  сподобился прояснить ситуацию ...


 
Medbe}I{onok XML ©   (2008-08-19 15:26) [48]

Объясни.

за этим не сюда. терапевт в соседней палате обход делает.


 
Терапевт   (2008-08-19 15:36) [49]

var a,b : array of integer; i : integer;
begin
SetLength(a,3);

a[0] := maxint;
a[1] := pred(maxint);
a[2] := pred(pred(maxint));

SetLength(b,3);
Move(a[0],b[0],3);
//копирование "спичек"
for i := 0 to Pred(Length(b)) do ShowMessage(Format("a = %d b= %d",[a[i],b[i]]));

//Порча памяти сетленсом
SetLength(a,4);
for i := 0 to Pred(Length(a)) do ShowMessage(Format("a = %d",[a[i]]));
end;


 
Сергей М. ©   (2008-08-19 15:37) [50]


> вопреки всякой логики работает


Потому что копию туда-сюда гоняет.
Абсолютно бессмысленная работа тобой выполняется)


 
Medbe}I{onok XML ©   (2008-08-19 15:39) [51]

Потому что копию туда-сюда гоняет.

Часть копии.


 
Сергей М. ©   (2008-08-19 15:42) [52]


> Часть копии.


А неважно.
Копия она и в Африке копия)


 
Medbe}I{onok XML ©   (2008-08-19 15:47) [53]

А неважно.

Важно. Так рождаются легенды про мув работающий с элементами массива.


 
Сергей М. ©   (2008-08-19 15:48) [54]


> +koha   (19.08.08 15:24) [46]


var
Conter: integer;
N: array of integer;
buf: array of integer;
//..................................
procedure TForm2.Button3Click(Sender: TObject);
Var
num:integer;
begin
Num:=Length(N);
SetLength(Buf,Num);
Move(N[0], Buf[0], Num);
Inc(Num);
setlength(N, 0); // бочка дегтя в твою ложку мёда)
setlength(N, Num);
move(Buf[0], N[0], Num-1);
N[Num-1]:=num;
for num:=0 to Length(N)-1 do
  memo1.Lines.Add(IntToStr(N[num]));
memo1.Lines.Add("----------------------------");


 
+koha   (2008-08-19 15:51) [55]


> Сергей М. ©   (19.08.08 15:24) [47]
>
> Ты ты про отладчик-то так и не  сподобился прояснить ситуацию
> ...


Ща картинку сброшу. Отладчик говорит, что Move() все-таки копирует элементы массива.


 
+koha   (2008-08-19 15:54) [56]


> Сергей М. ©   (19.08.08 15:48) [5


> setlength(N, 0); // бочка дегтя в твою ложку мёда)

Причем это работает, если массивы глобальные-переменные, а если локальные, то нет, почему?


 
Сергей М. ©   (2008-08-19 15:54) [57]


> Отладчик говорит, что Move() все-таки копирует элементы
> массива


Я вообще-то о той "версии", которая у тебя "падает") ..


 
Сергей М. ©   (2008-08-19 15:57) [58]


> Причем это работает


Кто работает ? Бочка дёгтя ?
Не работает она, на то она и бочка - ни "глобально", ни тем более "локально")


> а если локальные, то нет, почему?


Потому что разное время жизни.


 
Medbe}I{onok XML ©   (2008-08-19 16:04) [59]

Ща картинку сброшу. Отладчик говорит, что Move() все-таки копирует элементы массива.

пример из [49] не убедил?


 
Сергей М. ©   (2008-08-19 16:05) [60]


> koha


var
Conter: integer;
N: array of integer;
buf: array of integer;
//..................................
procedure TForm2.Button3Click(Sender: TObject);
Var
num:integer;
begin
Num:=Length(N);
SetLength(Buf,Num);
Move(N[0], Buf[0], Num * SizeOf(N[0])); // компенсирующая бочка мёда
Inc(Num);
setlength(N, 0); // бочка дегтя
setlength(N, Num);
move(Buf[0], N[0], (Num-1) * SizeOf(Buf[0])); // еще одна компенсирующая бочка мёда
N[Num-1]:=num;
for num:=0 to Length(N)-1 do
 memo1.Lines.Add(IntToStr(N[num]));
memo1.Lines.Add("----------------------------");


То же самое бестолковое "гониво" данных тудя-сюда, но корректное с т.з. логики.

Разницу осюсяешь ?


 
+koha   (2008-08-19 16:09) [61]

>Сергей М. ©   (19.08.08 16:05) [60]

> Разницу осюсяешь ?


- "осюсяю"  картинка отменяется.


 
Medbe}I{onok XML ©   (2008-08-19 16:09) [62]

Отладчик говорит, что Move() все-таки копирует элементы массива.

var pInt : PInteger; i : integer;
begin
New(pInt);
i := 777;
Move(i,pInt^,SizeOf(i));
ShowMessage(IntToStr(pInt^));

ShowMEssage("Спичка содержит " + IntToStr(SizeOf(i)) + " байт");
end;

Где здесь массив, с элементами которого работал бы мув?
Или  как он догадался, что массива нет?


 
oldman ©   (2008-08-19 16:13) [63]


> Medbe}I{onok XML ©  


Плюнь, пациента мы таки потеряли...


 
+koha   (2008-08-19 16:22) [64]

"розибралси"  все-таки, извеняйте за мое занудство.....

move(Move(N[0], Buf[0], Num) ничего не копировало вообще ни в Buf ни в N, а работало потому как вы и говорили setlength(N, num) ничего не ломал.


 
oldman ©   (2008-08-19 16:28) [65]

А почему _koha стал +koha?
Забанили, что ли?


 
Сергей М. ©   (2008-08-19 16:29) [66]


> ничего не копировало вообще


Да нифига ты не "розибралси")

Мув не копирует как минимум в одном случае - когда Num = 0



Страницы: 1 2 вся ветка

Текущий архив: 2008.09.28;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.027 c
2-1218574646
ProgRAMmer Dimonych
2008-08-13 00:57
2008.09.28
Создание монохромного битмапа на WinAPI


8-1186323330
bagos
2007-08-05 18:15
2008.09.28
Online music editor


15-1208159604
Костик
2008-04-14 11:53
2008.09.28
.net или нет?


2-1218603223
Кирей
2008-08-13 08:53
2008.09.28
Коментарии в тексте запроса


1-1198754585
Kerk
2007-12-27 14:23
2008.09.28
Не переключается раскладка клавиатуры в Excel в OLE-контейнере