Как я могу присвоить значение массиву символов?

#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.