Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Incompatible types: 'Dynamic array' and 'array of  [new]
neteurt
Member

Откуда:
Сообщений: 81
function TForm.CheckDbData(pArrDbData: array of String): boolean;
var
   test: array of String;
begin
    test := pArrDbData;


Подскажите как в test присвоить данные которые находятся в pArrDbData
25 июн 20, 09:53    [22156971]     Ответить | Цитировать Сообщить модератору
 Re: Incompatible types: 'Dynamic array' and 'array of  [new]
cptngrb
Member

Откуда:
Сообщений: 576
neteurt,

SetLength(test,Length(pArrDbData));
Move(pArrDbData[0], test, Length(pArrDbData));
25 июн 20, 10:10    [22156985]     Ответить | Цитировать Сообщить модератору
 Re: Incompatible types: 'Dynamic array' and 'array of  [new]
cptngrb
Member

Откуда:
Сообщений: 576
а по поводу ошибки, то в параметрах у тебя открытый массив, а в var динамический
25 июн 20, 10:11    [22156986]     Ответить | Цитировать Сообщить модератору
 Re: Incompatible types: 'Dynamic array' and 'array of  [new]
cptngrb
Member

Откуда:
Сообщений: 576
Move(pArrDbData[0], test[0], Length(pArrDbData));
25 июн 20, 10:20    [22156996]     Ответить | Цитировать Сообщить модератору
 Re: Incompatible types: 'Dynamic array' and 'array of  [new]
neteurt
Member

Откуда:
Сообщений: 81
cptngrb,
спасибо, только копирует в данном случае одно значение. Чтобы скопировать все нужно в цикле пройтись от 0 и до Length(pArrDbData) ?
25 июн 20, 10:24    [22157003]     Ответить | Цитировать Сообщить модератору
 Re: Incompatible types: 'Dynamic array' and 'array of  [new]
neteurt
Member

Откуда:
Сообщений: 81
   for i := 0 to Length(pArrDbData) - 1 do
   begin
     Move(pArrDbData[i], test[i], Length(pArrDbData));
   end;
25 июн 20, 10:27    [22157006]     Ответить | Цитировать Сообщить модератору
 Re: Incompatible types: 'Dynamic array' and 'array of  [new]
cptngrb
Member

Откуда:
Сообщений: 576
neteurt, нет, move копирует память, а если ты хочешь пройтись циклом, то тоже можно но по другому

SetLength(test,Length(pArrDbData));
for i:=0 to Length(pArrDbData) -1 do
test[i]:= pArrDbData[i];
25 июн 20, 10:27    [22157007]     Ответить | Цитировать Сообщить модератору
 Re: Incompatible types: 'Dynamic array' and 'array of  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 12682
cptngrb
neteurt,

SetLength(test,Length(pArrDbData));
Move(pArrDbData[0], test, Length(pArrDbData));
И трындец счетчикам ссылок.
Либо честно переприсвоить, либо архитектуру изменить чтобы операция вообще была не нужна.
25 июн 20, 10:39    [22157021]     Ответить | Цитировать Сообщить модератору
 Re: Incompatible types: 'Dynamic array' and 'array of  [new]
iStrannik
Member

Откуда:
Сообщений: 137
Move для строк лучше не использовать.

function TForm.CheckDbData(pArrDbData: TArray<String>): boolean;
var
   test: TArray<String>;
   I: Integer;
begin
    for I := 0 to High(pArrDbData) do
     begin
          test[I] := pArrDbData[I];
     end;
end;
25 июн 20, 11:10    [22157062]     Ответить | Цитировать Сообщить модератору
 Re: Incompatible types: 'Dynamic array' and 'array of  [new]
iStrannik
Member

Откуда:
Сообщений: 137
Забыл перед for добавить SetLength(test, Length(pArrDbData));
25 июн 20, 11:12    [22157065]     Ответить | Цитировать Сообщить модератору
 Re: Incompatible types: 'Dynamic array' and 'array of  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26656
neteurt
array of String

Не проще объявить типом?
25 июн 20, 11:17    [22157072]     Ответить | Цитировать Сообщить модератору
 Re: Incompatible types: 'Dynamic array' and 'array of  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 12682
iStrannik
Move для строк лучше не использовать.
Теоретически можно если потом счетчики ссылок подправить.
Практически - так себе решение, только для очень специфических случаев можно использовать.
25 июн 20, 11:22    [22157077]     Ответить | Цитировать Сообщить модератору
 Re: Incompatible types: 'Dynamic array' and 'array of  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2323
Лучше изначально так не делать, чтоб потом по граблям не бегать
25 июн 20, 17:06    [22157335]     Ответить | Цитировать Сообщить модератору
 Re: Incompatible types: 'Dynamic array' and 'array of  [new]
alekcvp
Member

Откуда:
Сообщений: 2178
neteurt
Подскажите как в test присвоить данные которые находятся в pArrDbData

type
  TStringArray = array of string;

function TForm.CheckDbData(pArrDbData: TStringArray): boolean;
var
   test: TStringArray;
begin
    test := pArrDbData;

cptngrb
Move(pArrDbData[0], test[0], Length(pArrDbData));

А если подумать?.. Что такое Length(pArrDbData) и сколько байт скопирует эта команда?
Ну и счётчики ссылок, да.

Сообщение было отредактировано: 26 июн 20, 01:03
26 июн 20, 01:03    [22157542]     Ответить | Цитировать Сообщить модератору
 Re: Incompatible types: 'Dynamic array' and 'array of  [new]
cptngrb
Member

Откуда:
Сообщений: 576
alekcvp, после того, как написал, заметил, что string. Размер символа конечно нужно учитывать. Поэтому второй вариант написал
26 июн 20, 09:26    [22157599]     Ответить | Цитировать Сообщить модератору
 Re: Incompatible types: 'Dynamic array' and 'array of  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
cptngrb
alekcvp, после того, как написал, заметил, что string. Размер символа конечно нужно учитывать. Поэтому второй вариант написал
Не размер символа, а размер элемента массива.
В данном случае, элемент массива - строка, указатель. Length(a) * sizeof( String ), что-то типа того.
Но и то это ужас. Будет крах с памятью скорее всего, ведь это молчаливое копирование указателей автоматического типа. Они могут уже освободиться, а ты их решишь использовать...
26 июн 20, 10:43    [22157656]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить