Форум: "Основная";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
Внизпередача данных из масива в масив Найти похожие ветки
← →
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] - это просто одно и то же :))))
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.033 c