#arrays #delphi #char #variable-assignment
#массивы #delphi #символ #переменная-назначение
Вопрос:
Допустим, у меня есть переменная:
Var question : array[1..50] of char;
Когда я делаю:
question := 't'; //What is the correct way to change the value?
Возвращает ошибку:
Несовместимые типы: ‘array[1..50] of Char’ и ‘Char’
Примечание: я хочу, чтобы максимальный размер строки составлял 50 символов, а не 50 разных символов.
Причина этого вопроса в том, что у меня есть запись в другом блоке (это всего лишь базовый пример, а не то, что я на самом деле написал выше) В этом блоке у меня есть запись, в которой я не могу использовать строковый тип данных (или есть способ? пожалуйста, объясните, если есть). Мне просто нужно знать, как присвоить массиву символов значение.
Комментарии:
1. Какую ошибку вы получаете, когда объявляете строку в записи? Это определенно возможно и намного проще, чем манипулирование массивом символов.
2. Несовместимые типы: ‘array[1..50] of Char’ и ‘Char’ — это один. Однако, если я сопоставлю количество символов в строке с диапазоном массива, это сработает.
3. Просто предложение, пожалуйста, ознакомьтесь с этим руководством, оно поможет вам понять некоторые конструкции и основы delphi… delphi.about.com/od/beginners/a/delphicourse.htm
4. это ошибка, которую вы получаете для этого объявления, это не может быть ошибка, которую вы получаете при попытке использовать строку в записи.
5. Спасибо, Наин, я бы прочитал это, но на данный момент у меня немного не хватает времени с проектом. Однако я прочитаю это после, даже если тема изменится. @Lieven, я предоставлю весь код проекта.
Ответ №1:
Хотя строки Delphi и массивы символов связаны, это не одно и то же.
Delphi перегружает присвоение строк и литералов (char и string) массиву символов, но только тогда, когда нижняя граница массива равна нулю.
Следующий код работает для меня в D2007 и Delphi XE:
var x : array[0..49] of char;
begin
x:='b'; // char literal
x:='bb'; // string literal
end.
Если я изменю [0 на [1, произойдет сбой. Это ограничение, вероятно, упрощает языковой помощник, который заботится об этом, и, вероятно, функция предназначена только для работы с преобразованными структурами C, где массивы всегда имеют нижнюю границу 0.
Комментарии:
1. @Skeela87, хорошо, если у вас это работает, но оно должно было работать (компилироваться) и с простыми строками. Он компилируется для меня с использованием Delphi 5 (после удаления var в объявлении записи) и Delphi 2010
2. Ливен: Я предполагаю, что он хочет заблокировать запись. И нет, тогда вы можете использовать только shortstring , но у этого есть ограничение в 255 символов и байт длины начала.
Ответ №2:
Вы уверены, что не можете использовать строковый тип данных в записи? В любом случае…
type
TCharArray = array[Char] of Char;
function StringToArray(Str: string): TCharArray;
begin
FillChar(Result, High(Byte), #0);
Move(Str[1], Result, length(Str));
end;
procedure TestCharArray;
var
question: TCharArray;
begin
question := StringToArray('123');
ShowMessage(PChar(@question));
end;
Также взгляните на StrPCopy
функцию.
Комментарии:
1. Неважно, я знаю, что я забыл сделать. Поместите его в класс TForm
2. Но используя ваш код с StringToArray(‘test’). Я получаю сообщение об ошибке: Несовместимые типы: ‘массив [0 ..65535] символа’ и ‘Система. TArray<System.Char>’
Ответ №3:
Если вам не нужны символы Юникода, вы должны просто определить свою строку следующим образом string[50]
.
После этого вам не понадобятся никакие функции или преобразования для работы с этой строкой, и ее будет так же легко прочитать и записать в файл.
Hscores = record
var
_topscore : integer;
_topname : string[50];
end;
Комментарии:
1. Это наиболее идиоматичный способ обработки строковых данных ansi фиксированной длины в записи. 1 за указание на то, что String[50] на самом деле является строкой фиксированной длины, состоящей из элементов AnsiChar (размер в байтах).
Ответ №4:
Я почти уверен, что вы можете использовать строки в типах записей.
В этой записи в блоге показан пример: http://delphi.about.com/od/beginners/a/record_type.htm
Чтобы присвоить значение массиву символов, вы должны проиндексировать его, как и любой другой массив:
question[1] := 't';
Комментарии:
1. Я попытался использовать пример из приведенной вами ссылки, но все равно получил эту ошибку. Я еще не настолько силен в delphi, так что, возможно, я сделал что-то не так. Хотя я только что выяснил, что если я помещу array [1 ..5] из char , я должен использовать строку длиной в 5 символов. Теперь мне нужен способ указать длину, которая мне нравится. Спасибо за ответ, но, возможно, мне следует перефразировать свой вопрос, я внесу правку в основной пост.
2. Здесь, в этом случае, индекс начинается с 1, поэтому (вопрос [0]:= ‘t’;) снова выдаст ошибку, связанную с массивом во время компиляции, вопрос[1]:= ‘t’; лучше 🙂
3. @Nains: блин! я так давно не пользовался Delphi.