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

Вниз

передача данных из масива в масив   Найти похожие ветки 

 
Lena19   (2004-02-12 20:09) [0]

Всем привет.
народ подскажите как перебросить
содержимое одного двух мерного массива в другой
такойже.
за как можно меньшее число шагов .


 
Тимохов ©   (2004-02-12 20:11) [1]

Динамического?
Если нет, то прямым присваиванием...


 
Lena19   (2004-02-12 20:17) [2]

масивы статические но при прямом присвоении типа (m1:=m1)
компилятор выдает несоответствие типов


 
Тимохов ©   (2004-02-12 20:21) [3]

Они у тебя наверное обявлены так?

a1: array [1..100] of integer;
a2: array [1..100] of integer;
так работать не будет.

Тогда обяви их так.

type
ta = array [1..100] of integer;
var
a1: ta;
a2: ta;


 
kentavr ©   (2004-02-12 20:21) [4]

Как ты это делаешь? Тип описала по-разному что ли?


 
Rouse_ ©   (2004-02-12 20:25) [5]

move


 
Тимохов ©   (2004-02-12 20:27) [6]


> Rouse_ © (12.02.04 20:25) [5]

Массив строк, move"ом?
АВ будет.


 
Яичница ©   (2004-02-12 20:28) [7]

CopyMemory


 
Тимохов ©   (2004-02-12 20:30) [8]


> Яичница © (12.02.04 20:28) [7]

Массив строк, copymemory"ем?
Еще один АВ будет.


 
Lena19   (2004-02-12 20:33) [9]

один из масивов описан через typ а второй как переменная
масивы двухмерные как в етом случае использовать move ?


 
Тимохов ©   (2004-02-12 20:34) [10]

Lena19 (12.02.04 20:33) [9]
Почему бы вам не описать оба их через type.
Они же идентичные...


 
Anatoly Podgoretsky ©   (2004-02-12 23:56) [11]

Lena19 (12.02.04 20:33) [9]
Что то не то, ты никак не можешь присвоить тип переменной


 
Rouse_ ©   (2004-02-13 00:01) [12]

> [6] Тимохов © (12.02.04 20:27)
А где в вопросе указание на массив строк?


 
Rouse_ ©   (2004-02-13 00:07) [13]

> [6] Тимохов © (12.02.04 20:27)
и впредь, не делайте голословных утверждений:

procedure TForm1.Button1Click(Sender: TObject);
var
A: array [0..4] of String;
B: array [0..4] of String;
begin
A[0] := "This";
A[1] := "is";
A[2] := "only";
A[3] := "a";
A[4] := "test";
Move(A[0], B[0], SizeOf(A));
Caption := B[1];
end;


 
MBo ©   (2004-02-13 07:55) [14]

Зачем обсуждать непонятно что, пока автор не привел код?

>Rouse_ © (13.02.04 00:07) [13]
Подводные камни этого подхода чувствуешь?


 
Rouse_ ©   (2004-02-13 09:06) [15]

> [14] MBo © (13.02.04 07:55)
Именно в данном варианте подводных камней нет (если конечно развить идею, то да)


 
Silver Alex ©   (2004-02-13 09:08) [16]

procedure TForm1.Button1Click(Sender: TObject);
var
A: array [0..4] of String;
B: array [0..4] of String;
begin
A[0] := "This";
A[1] := "is";
...
B:=Copy(A);// b:=copy(a,1,3);
end;


 
Тимохов ©   (2004-02-13 09:52) [17]

Rouse_ © (13.02.04 00:07) [13]
Я вроде слышал, что Вы модератор.
И где-то вы выражали благодарность кажется, Игорю Шевченко, за то что он иногда вас поправляет. Может я и ошибаюсь (память подводит), но не в этом суть.
Думаю если вы внимательно посмотрите на все это, почитаете хелп, то вы и мне выразите благодарность, т.к. этот подход является грубой ошибкой при работе с ДЛИННЫМИ строками. Когда вы поймете свою ошибку, буду очень признателен, если вы мне об этом скажете - приятно все-таки.
А, то что у вас нет ошибки - это счатье. Будет потом.

Всего хорошего.


 
MBo ©   (2004-02-13 09:59) [18]

>Именно в данном варианте подводных камней нет
Я за подсчет ссылок переживаю ;)
Правда, присвоение b[0] новой строки отработало корректно, но, думаю, могут быть и контрпримеры...


 
Тимохов ©   (2004-02-13 10:01) [19]


> MBo © (13.02.04 09:59) [18]

Ура! Я не одинок в разоблачении ереси.
С сылками будет полная фигня. Хотя иногда это все срабатывает - но до поры до времени.


 
Владислав ©   (2004-02-13 10:09) [20]

> Тимохов © (13.02.04 10:01) [19]

Дык вот если отдавать себе отчет в том, что с подсчетом ссылок полная фигня, взять на себя ответственность и с пониманием использовать полученный массив, ничего страшного действительно не произойдет. А вот если на такой массив в конечном итоге "забить", то проблем будет действительно выше крыши. Но уж если пошел на такой шаг, и "забил", то, конечно, сам себе злобный буратино. Ну и бесспорен тот факт, что изменять такую программу будет чрезвычайно сложно. И лучше ее снабдить, может быть, даже излишними комментариями.


 
Тимохов ©   (2004-02-13 10:12) [21]


> Дык вот если отдавать себе отчет в том, что с подсчетом
> ссылок полная фигня, взять на себя ответственность

Дык пример из 16 показывает обратное - никто ничего на себя не берет.


 
Владислав ©   (2004-02-13 10:23) [22]

> MBo © (13.02.04 09:59) [18]

В [16] за них можно не переживать.


 
Владислав ©   (2004-02-13 10:27) [23]

И в [13] можно не переживать.

Судя по асемблерному коду, знаковый бит в подсчете ссылок играет совсем иную роль, нежели просто дополнительное количество ссылок.
Если знаковый бит установлен, то счетчик ссылок на строку вообще не изменяется.


 
Тимохов ©   (2004-02-13 10:29) [24]


>
> Владислав © (13.02.04 10:27) [23]


В 13 все корректно работает по одной причине - там строки константы. Если вместо констант взять переменную типа строка, то будет ж.
Вы согласны?


 
Владислав ©   (2004-02-13 10:41) [25]

Абсолютно. При чем ж. будет длинной с массив плюс длина всех строк :)

Если использовать не константные строки, массив нужно ручками забивать нулями. При чем, компилятор не должен догадаться, что мы пытаемся присваивать строку. Иначе в первоначальном массиве будут битые ссылки (ну или они появяться позже).


 
Тимохов ©   (2004-02-13 10:44) [26]

Одним словом вопрос к Rouse_ © (13.02.04 00:07) [13] - признайте свою ошибку и закончим этот флейм (и вообще не мешало бы извиниться за обвинения в голословности).


 
Владислав ©   (2004-02-13 10:52) [27]

> Тимохов © (13.02.04 10:44) [26]

Ах вот чего так зацепились :)))


 
Тимохов ©   (2004-02-13 10:54) [28]


> Владислав © (13.02.04 10:52) [27]

Конечно, если уж я чего-то знаю, то знаю. Что меня обвинять в голосновности. Да и к тому давать неверные и вреднейшие ответы.


 
nexxiss ©   (2004-02-13 13:42) [29]

Можно через указатели на массивы, но это уже не совсем то, что необходимо автору вопроса


 
Anatoly Podgoretsky ©   (2004-02-13 17:18) [30]

Зачем MOVE используете, а раз используете, то должны понимать, что это делается в обход механизма ссылок и отвественность берется на себя.
Кроме того серьезные проблемы в Д8 не стоит использовать процедуры работающие с нетипизироваными указателями.


 
Тимохов ©   (2004-02-13 17:27) [31]


> Anatoly Podgoretsky © (13.02.04 17:18) [30]

В связи с http://delphimaster.net/view/15-1076655907/

Почему не красным цветом :))))))))


 
Mystic ©   (2004-02-13 17:28) [32]

Конртпример на присваивание строк при помощи Move. Сравните две реализации:

procedure TMainForm.TestBtn1Click(Sender: TObject);
var
A, B: string;
begin
A := "Test";
A := A + A; // (*)
Move(A, B, SizeOf(A));
ShowMessage(A);
B[1] := "R";
ShowMessage(A);
B := "";
end;

procedure TMainForm.TestBtn2Click(Sender: TObject);
var
A, B: string;
begin
A := "Test";
A := A + A;
B := A;
ShowMessage(A);
B[1] := "R";
ShowMessage(A);
end;


(*) этот оператор нужен для того, чтобы разместить строку в динамической памяти. Первоначально после инициализации строка указывает на объект в секции данных, которых имеет счетчих ссылок, равный -1 ($FFFFFFFF). При копировании методом Move таких строк максимальная неприятность --- Memory Leak.


 
Тимохов ©   (2004-02-13 17:31) [33]


> Mystic © (13.02.04 17:28) [32]

Я что-то тоже ценность не понимаю.
В чем контр пример? Вывод какой?


 
Sandman25+1   (2004-02-13 17:37) [34]

[32] Mystic © (13.02.04 17:28)

Еще лучше так:

A := "Test";
A := A + A; // (*)
Move(A, B, SizeOf(A));
ShowMessage(A);
B[1] := "R";
ShowMessage(A);
B := "";
ShowMessage(A);


 
Mystic ©   (2004-02-13 17:43) [35]

Нельзя использовать Move для копирования строк.


 
Тимохов ©   (2004-02-13 17:45) [36]


> Нельзя использовать Move для копирования строк.

НЕлья, а кто спорит?
О том то и речь, начиная с самого начала :)))))


 
Mystic ©   (2004-02-13 17:55) [37]

Но написание контрпримера в лоб не проходит, ведь

var
A, B: string;
begin
A := "Test";
Move(A, B, SizeOf(A));


отработает корректно


 
Anatoly Podgoretsky ©   (2004-02-13 17:58) [38]

Тимохов © (13.02.04 17:27) [31]
Потому что я описываю свой подход к допустимости использования MOVE для автоматически управляемыми объектами и также на серьезные проблемы в .NET


 
Тимохов ©   (2004-02-13 18:05) [39]

Граждане, какой вывод красной строкой?

Я так понимаю, что как обычно - move использовать можно, но с умом? Так?


 
WebErr ©   (2004-02-13 18:40) [40]

Бла-бла-бла...
Переходите на С там с указателями проще не куда, а строки и указатели там вообще не отличаются вашу проблему с копированием массива строк s[N][M] в t[N][M] можно рашить простым

memcpy(t[0],s[0],M*N);

Где char s[N][M] и char s[][M] - это просто одно и то же :))))


 
Palladin ©   (2004-02-13 18:44) [41]

Ну ты то что сюда полез? Провокатор...


 
Владислав ©   (2004-02-14 10:52) [42]

> Mystic © (13.02.04 17:43) [35]

Могу поспорить с таким утверждением. Сам компилятор генерирует такой код в некоторых случаях.

> Anatoly Podgoretsky © (13.02.04 17:58) [38]

Про NET я еще вообще ничего не знаю, но Ваше утверждение не добавляет желание с ним знакомиться :)

> WebErr © (13.02.04 18:40) [40]

Если в Паскале все так плохо, есть тысяча и один способ уйти обратно в Си. Если 1000 и 1 способ не позволили таки уйти на Си, нужно принимать то, что есть в Паскале. Если это принимать с умом, хуже, чем в Си не будет. :)

> Palladin © (13.02.04 18:44) [41]

Во, во :)


 
Rouse_ ©   (2004-02-14 11:09) [43]

> [17] Тимохов © (13.02.04 09:52)
Данный пример был приведен в ответ на > [6] Тимохов © (12.02.04 20:27)
Это раз.
Во вторых - где вы тут увидели что разговор идет про массив строк?
Ну и в третьих, разве я что-либо говорил про то что так нужно делать? Я показал что моментального АВ не будет.

Так что... но пасаран ;)


 
Anatoly Podgoretsky ©   (2004-02-14 11:13) [44]

Тимохов © (13.02.04 18:05) [39]
Правильно, надо понимать что делаешь. А если есть понимание то вооружен и опасен.

Владислав © (14.02.04 10:52) [42]
Зря, одна из сутей создание надежного кода, нетипизированые указатели не позволяют этого. Поэтому наиболее тяжел переход с языков где нет строгой типизации, где низкоуровневая работа с указателями ложится на слабые плечи программистов.
Переход на Си не меняет сути Move=memcpy один к одному. Так что полноценный провокатор, поп Гапон.


 
Владислав ©   (2004-02-14 11:21) [45]

> Anatoly Podgoretsky © (14.02.04 11:13) [44]

"Зря, одна из сутей создание надежного кода, нетипизированые указатели не позволяют этого."

Полность согласен с этим, но, ИМХО, боюсь, в критических по времени выполнения кусках кода невозможно будет сделать какую либо оптимизацию (Еще раз повторюсь, на ответственность программиста). А в таких случаях остается надеятся на более мощную машину твоих потребителей, что не всегда факт. Может быть, риторический вопрос, "Дык как же быть?".


 
Anatoly Podgoretsky ©   (2004-02-14 11:48) [46]

Дык тебе рашать, но все там будем.


 
Владислав ©   (2004-02-14 11:57) [47]

> Anatoly Podgoretsky © (14.02.04 11:48) [46]

Консерватизм, однако. Хотя, это мои личные проблемы :)
В любом случае, спасибо за ответы! (Надо, однако, что-то с собой делать).



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

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

Наверх




Память: 0.59 MB
Время: 0.023 c
14-80202
Begin
2004-01-30 18:58
2004.02.25
Подскажите, плиз... Лицензионная копия Delphi 7....


3-79546
twist
2004-01-30 03:03
2004.02.25
Уважаемые, как из Delphi подсоедениться к кларионовской


1-79744
CacoDemon
2004-02-12 10:49
2004.02.25
Можно ли в RichEdit...


14-80286
jack128
2004-02-01 12:48
2004.02.25
Намагничена, поляризована...


1-79773
Yuri Btr
2004-02-11 21:17
2004.02.25
Уникальность Pointer в TList