Error can t read or write variables of this type

Cannot read or write variables of this type Pascal ABC Решение и ответ на вопрос 148893

Sp1ne

18 / 17 / 11

Регистрация: 19.10.2009

Сообщений: 43

1

23.06.2010, 21:45. Показов 3209. Ответов 6

Метки нет (Все метки)


Вообще не могу понять, почему вот эта программа в PascalABC работает без ошибок, а в Turbo Pascal
выдает error 64: cannot read or write variables of this type, и жалуется вот на эту строку

Pascal
1
writeln(' ',s);

А вот и сама программа

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
uses crt; 
type fraza=(god, goda, let); 
var s: fraza; 
k,n:integer; 
begin 
clrscr; 
readln(n); 
for k:=1 to n do 
begin 
write('mne ', k); 
if k mod 10=0 then s:=let; 
if (k mod 10>=5) and (k mod 10<=9) then s:=let; 
if (k mod 10<5) and (k mod 10>1) and (k>20) then s:=goda; 
if (k mod 10 = 1) and (k>20) then s:=god; 
if k=1 then s:=god; 
if (k>10) and (k<15) then s:=let; 
if (k>1) and (k<5) then s:=goda; 
writeln(' ',s); 
end; 
readln; 
end.

P.S. Условие программы: Для целого числа К от 1 до 99 напечатать фразу «мне К лет», учитывая при этом , что при некоторых значениях К слово «лет» надо заменить на слова «год» или «года»

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



636 / 219 / 64

Регистрация: 03.11.2009

Сообщений: 488

23.06.2010, 21:53

2

Sp1ne, разве она в Паскале ABc Работает? я вот запустила и ничего выдается ошибка т.к. перечисляемый тип данных нельзя выводить.
вам проще уж сделать со строкой и зачем вам перечисляемый тип данных?



0



18 / 17 / 11

Регистрация: 19.10.2009

Сообщений: 43

23.06.2010, 21:54

 [ТС]

3

именно через перечисляемый тип нужно решать



0



18 / 17 / 11

Регистрация: 19.10.2009

Сообщений: 43

23.06.2010, 21:55

 [ТС]

4

у меня в pascalABC работает исправно



0



636 / 219 / 64

Регистрация: 03.11.2009

Сообщений: 488

23.06.2010, 22:05

5

Sp1ne, так тут нужно всё ваши if менять на условие принадлежит ваше k к тому то интервалу и исходя из это писать год или лет

Добавлено через 7 минут
ну что ж тогда Вам нужно проверять k на принадлежность тому или иному интервалу и отсюда тогда писать лет или год



0



Sp1ne

18 / 17 / 11

Регистрация: 19.10.2009

Сообщений: 43

23.06.2010, 22:07

 [ТС]

6

Короче я вот так сделал

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const Years : array[1..3] of String = ('год','года','лет'); 
var inN,N01,N10,idx,i:integer;
tmps:string;
begin
readln(InN);
for i:=1 to InN do begin
Str(i, tmpS); 
N01 := i mod 10; 
N10 := i div 10; 
if (N01 = 0) or (N01 > 4) or (N10 = 1) then idx := 3 else 
if (N01 > 1) and (N01 < 5) then idx := 2 else idx := 1; 
tmpS := tmpS + ' ' + Years[idx]; 
writeln(tmpS);
end;
readln;
end.



0



636 / 219 / 64

Регистрация: 03.11.2009

Сообщений: 488

23.06.2010, 22:08

7

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



0



В этом разделе описаны все ошибки, которые могут случиться при проверке типов.

Сообщение

Описание

Error: Type mismatch

Это может произойти во многих случаях:

Назначенная вами переменная отличается от типа, который используется в выражении

Вы вызываете функцию или процедуру с параметрами, которые несовместимы с параметрами в объявлении функции или процедуры

Error: Incompatible types: got «Сообщ1» expected «Сообщ2»

Невозможно преобразование между двумя типами. Ещё одна причина – типы объявлены в разных объявлениях:

Var A1 : Array[1..10] Of Integer;
  A2 : Array[1..10] Of Integer;
Begin
A1:=A2; {Этот оператор также даёт такую ошибку, потому
          что выполняется строгая проверка типов Pascal}
End.

Error: Type mismatch between «Сообщ1» and «Сообщ2»

Типы не являются эквивалентными.

Error: Type identifier expected

Идентификатор не является типом, или вы забыли указать идентификатор type.

Error: Variable identifier expected

Это случается, если вы помещаете константу в процедуру (такую как Inc или Dec), в то время как процедура требует переменной. Для таких процедур в качестве параметров можно помещать только переменные.

Error: Integer expression expected, but got «Сообщение»

Компилятор ожидает выражения типа integer, но получает другой тип.

Error: Boolean expression expected, but got «Сообщение»

Выражение должно быть типа boolean. Оно должно возвращать True или False.

Error: Ordinal expression expected

Выражение должно быть порядкового типа, то есть максимум типа Longint. Эта ошибка случается, например, если вы указали второй параметр процедуры Inc или Dec, который не соответствует порядковому типу.

Error: pointer type expected, but got «Сообщение»

Переменная или выражения не являются указателем. Это случается, если вы помещаете переменную, которая не является указателем, в New или Dispose.

Error: class type expected, but got «Сообщение»

Переменная или выражение не являются типом class. Это обычно случается, если

1.Родительский класс в объявлении класса не является классом

2.Обработчик исключения (On) cсодержит идентификатор типа, который не является классом.

Error: Can’t evaluate constant expression

Эта ошибка может случиться, если границы объявленного вами массива не обозначены порядковыми константами.

Error: Set elements are not compatible

Вы пытаетесь выполнить операцию с двумя множествами, в то время как типы элементов этих множеств не являются одинаковыми. Базовые типы множеств должны быть одинаковыми при объединении.

Error: Operation not implemented for sets

Некоторые бинарные операторы не определены для множеств. Это операторы: div, mod, **, >= и <=. Последние два могут быть определены для множеств в будущих версиях.

Warning: Automatic type conversion from floating type to COMP which is an integer type

Обнаружено явное преобразование типов из real в comp. s encountered. Поскольку comp – это 64-битное целое число, то это может вызвать ошибку.

Hint: use DIV instead to get an integer result

Если подсказки включены, то целочисленное деление с оператором ‘/‘ приведёт к этому сообщению, потому что результатом будет вещественный тип.

Error: string types doesn’t match, because of $V+ mode

Если выполняется компиляция в режиме {$V+}, то строка, передаваемая вами в качестве параметра, должна быть точно такого же типа, как параметр процедуры.

Error: succ or pred on enums with assignments not possible

Если вы объявили перечисляемый тип в стиле С, например, так:

Tenum = (a,b,e:=5);

То вы не сможете использовать функции Succ или Pred с этим перечислением.

Error: Can’t read or write variables of this type

Вы пытаетесь прочитать или записать переменную из файла или в файл текстового типа, который не поддерживает тип переменной. Только целочисленные типы, вещественные, pchars и strings можно читать из файла или записывать в текстовый файл. Логические переменные можно только записывать в текстовый файл.

Error: Can’t use readln or writeln on typed file

readln и writeln можно использовать только с текстовыми файлами.

Error: Can’t use read or write on untyped file.

read и write допускаются только для текстовых или типизированных файлов.

Error: Type conflict between set elements

Это означает, что не менее одного элемента множества имеют неправильный тип.

Warning: lo/hi(dword/qword) returns the upper/lower word/dword

Free Pascal поддерживает перегруженную версию lo/hi для longint/dword/int64/qword, которые возвращают наименьшее/наибольшее (результат типа слово/двойное слово) значение аргумента. Turbo Pascal позволяет использовать 16-битные lo/hi, которые возвращают биты 0..7 для lo и биты 8..15 для hi. Если вы хотите получить поведение, аналогичное Turbo Pascal, вы должны использовать приведение типов к word или integer.

Error: Integer or real expression expected

Первый аргумент для str должен быть типа real или integer.

Error: Wrong type «Сообщение» in array constructor

Вы пытаетесь использовать тип в конструкторе массива, который недопустим.

Error: Incompatible type for arg no. Сообщ1: Got «Сообщ2», expected «Сообщ3»

Вы пытаетесь передать неправильный тип в указанный параметр.

Error: Method (variable) and Procedure (variable) are not compatible

Вы не можете связать метод с процедурной переменной или процедуру с указателем на метод.

Error: Illegal constant passed to internal math function

Аргумент-константа, переданный в функцию ln или sqrt выходит за пределы диапазона для этой функции.

Error: Can’t take the address of constant expressions

Невозможно получить адрес выражения-константы, потому что оно не записывается в память. Вы можете попробовать сделать типизированную константу. Эта ошибка может также появиться, если вы пытаетесь поместить свойство в параметр var.

Error: Argument can’t be assigned to

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

Error: Can’t assign local procedure/function to procedure variable

Не допускается присваивать локальные процедуры/функции процедурным переменным, потому что соглашение о вызовах локальных процедур/функций отличаются. Вы можете только присвоить локальную процедуру/функцию пустому указателю.

Error: Can’t assign values to an address

Не допускается присваивать значение адресу переменной, константы, процедуры или функции. Вы можете попытаться выполнить компиляцию с опцией -So, если идентификатор является процедурной переменной.

Error: Can’t assign values to const variable

Не допускается присваивать значение переменной, которая объявлена как константа. Обычно параметр объявляется как константа. Чтобы иметь возможность изменять значение, передавайте параметр по значению или параметр по ссылке (используя var).

Error: Array type required

Если вы хотите получить доступ к переменной, используя индекс ‘[<x>]‘, то тип должен быть массивом. В режиме FPC указатель также допускается.

Error: interface type expected, but got  «»Сообщение»

Компилятор ожидал для нумератора имя типа интерфейса, но получил нечто другое. Следующий код приведёт к этой ошибке:

Type
TMyStream = Class(TStream,Integer)

Hint: Mixing signed expressions and longwords gives a 64bit result

Если вы делите (или вычисляете модуль) выражения со знаком с типом longword (или наоборот), или если вы имеете переполнение и/или включена проверка диапазона и используется арифметическое выражение (+, -, *, div, mod), в котором оба числа со знаком и появляется longwords, то всё это вычисляется как 64-битная арифметическая операция, которая медленнее, чем обычная 32-битная. Вы можете избежать этого при помощи преобразования типа одного из операндов в подходящий для результата и другого операнда.

Warning: Mixing signed expressions and cardinals here may cause a range check error

Если вы используете бинарный оператор (and, or, xor) и один из операндов — это longword, в то время как другой – это выражение со знаком, то, если проверка диапазона включена, вы можете получить ошибку проверки диапазона, потому что в этом случае оба операнда преобразуются в longword перед выполнением операции. Вы можете избежать этого при помощи преобразования типа одного из операндов в подходящий для результата и другого операнда.

Error: Typecast has different size (Сообщ1 -> Сообщ2) in assignment

Преобразование типа при отличающихся размерах не допускается, когда переменная используется в присваивании.

Error: enums with assignments can’t be used as array index

Если вы объявили перечисляемый тип, который имеет С-подобные присваивания, как показано ниже:

Tenum = (a,b,e:=5);

Вы не можете использовать его как индекс массива.

Error: Class or Object types «Сообщ1» and «Сообщ2» are not related

Выборка из одного класса в другой, в то время как класс/объект не являются связанными. Вероятно, это ошибка ввода.

Warning: Class types «arg1» and «arg2» are not related

Выборка из одного класса в другой, в то время как класс/объект не являются связанными. Вероятно, это ошибка ввода.

Error: Class or interface type expected, but got «arg1»

Компилятор ожидал имя класса или интерфейса, но получил другой тип или идентификатор.

Error: Type «Сообщение» is not completely defined

Эта ошибка случается, если тип не завершён, например, тип pointer, который указывает на неопределённый тип.

Warning: String literal has more characters than short string length

Размер строки-константы, которая связана с shortstring, больше максимального размера для shortstring (255 символов).

Warning: Comparison is always false due to range of values

Это сравнение беззнакового значения и константы со знаком, которая меньше нуля. По причине преобразования оператор всегда будет возвращать FALSE. Выполните явное преобразование константы в правильный диапазон, чтобы избежать этой проблемы.

Warning: Comparison is always true due to range of values

Это сравнение беззнакового значения и константы со знаком, которая меньше нуля. По причине преобразования оператор всегда будет возвращать TRUE. Выполните явное преобразование константы в правильный диапазон, чтобы избежать этой проблемы.

Warning: Constructing a class «Сообщ1» with abstract method «Сообщ2»

Например, создаваемый класс содержит неисполняемые абстрактные методы. Имеется вероятность, что случится ошибка времени исполнения 211 в коде, если эта процедура будет когда-либо вызвана. Все абстрактные методы должны быть перегружаемыми.

Hint: The left operand of the IN operator should be byte sized

Левый операнд в операторе IN не является порядковым или перечислением, который помещается в 8 бит. Это может привести к ошибке проверки диапазона. На текущий момент оператор in поддерживает левый оператор только в пределах байта. В случае с перечислениями, размер элемента перечисления может изменяться опциями {$PACKENUM} или {$Zn}.

Warning: Type size mismatch, possible loss of data / range check error

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

Hint: Type size mismatch, possible loss of data / range check error

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

Error: The address of an abstract method can’t be taken

Не найдено тело абстрактного метода, поэтому адрес абстрактного метода не может быть назначен.

Error: Assignments to formal parameters and open arrays are not possible

Вы пытаетесь присвоить значение формальному параметру (нетипизированный var, const или out), или открытому массиву.

Error: Constant Expression expected

Компилятор ожидал выражение-константу, но получил выражение- переменную.

Error: Operation «Сообщ1» not supported for types «Сообщ2» and «Сообщ3»

Операция не допускается для указанных типов.

Error: Illegal type conversion: «Сообщ1» to «Сообщ2»

Когда выполняете преобразование типов, вы должны понимать, что размеры переменной и типа назначения одинаковы.

Hint: Conversion between ordinals and pointers is not portable

Если вы преобразуете тип pointer в longint (или наоборот), то код не будет компилироваться на машинах, использующих 64-разрядную адресацию.

Warning: Conversion between ordinals and pointers is not portable

Если вы преобразуете тип pointer в порядковый тип с другим размером (или наоборот), то могут возникнуть проблемы. Это предупреждение помогает в поиске 32-битного специального кода, где cardinal/longint используются для преобразования указателей в порядковые типы. Решением проблемы является использование вместо этого типов ptrint/ptruint.

Error: Can’t determine which overloaded function to call

Вы вызываете перегруженную функцию с параметром, который не связан с каким-либо объявленным списком параметров, например, когда вы имеете объявленную функцию с параметрами word и longint, а затем вызываете её с параметром типа integer.

Error: Illegal counter variable

Переменная для цикла for должна быть порядкового типа. Переменные циклов не могут быть вещественными числами или строками.

Warning: Converting constant real value to double for C variable argument, add explicit typecast to prevent this.

В C значения вещественных констант по умолчанию имеют тип double. Из этих соображений, когда вы передаёте вещественную константу в функцию С в качестве параметра, компилятор FPC по умолчанию преобразует её в тип double. Если вы хотите контролировать этот процесс, добавьте для константы явное преобразование в нужный тип.

Error: Class or COM interface type expected, but got «Сообщение»

Некоторые операторы, такие как AS, применяются только для классов или COM-интерфейсов.

Error: Constant packed arrays are not yet supported

Вы не можете объявить битовый (упакованный) массив как типизированную константу.

Error: Incompatible type for arg no. Сообщ1: Got «Сообщ2» expected «(Bit)Packed Array»

Компилятор ожидает битовый (упакованный) массив как указанный параметр.

Error: Incompatible type for Сообщение no. Сообщ1: Got «Сообщ2» expected «»(not packed) Array»

Компилятор ожидает регулярный (то есть НЕ упакованный) массив как указанный параметр.

Error: Elements of packed arrays cannot be of a type which need to be initialised

Поддержка упакованных массивов, которым необходима инициализация (таких как ansistrings, или записей, содержащих ansistrings), пока не реализована.

Error: Constant packed records and objects are not yet supported

Вы не можете объявить битовый (упакованный) массив как типизированную константу в данное время.

Warning: Arithmetic «Сообщение» on untyped pointer is unportable to {$T+}, suggest typecast

Сложение/вычитание из нетипизированных указателей может работать по разному в {$T+}. Используёте преобразование типов для типизированных указателей.

Error: Can’t take address of a subroutine marked as local

Нельзя получить адрес подпрограммы, помеченной как локальная.

Error: Can’t export subroutine marked as local from a unit

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

Error: Type is not automatable: «Сообщение»

Только byte, integer, longint, smallint, currency, single, double, ansistring, widestring, tdatetime, variant, olevariant, wordbool и все интерфейсы являются automatable.

Hint: Converting the operands to «Сообщение» before doing the add could prevent overflow errors.

Сложение двух типов может вызвать ошибку переполнения. Обычно вы конвертируете результат в больший тип. Вы должны предотвращать такие ошибки, преобразуя операнды в этот тип перед сложением.

Hint: Converting the operands to «Сообщение» before doing the subtract could prevent overflow errors.

Вычитание между двумя типами может вызвать ошибку переполнения. Обычно вы конвертируете результат в больший тип. Вы должны предотвращать такие ошибки, преобразуя операнды в этот тип перед вычитанием.

Hint: Converting the operands to «Сообщение» before doing the multiply could prevent overflow errors.

Умножение между двумя типами может вызвать ошибку переполнения. Обычно вы конвертируете результат в больший тип. Вы должны предотвращать такие ошибки, преобразуя операнды в этот тип перед умножением.

Warning: Converting pointers to signed integers may result in wrong comparison results and range errors, use an unsigned

Виртуальное адресное пространство на виртуальных машинах располагается от $00000000 до $ffffffff. Многие операционные системы позволяют выделять память с адресами выше $80000000. Например, как WINDOWS, так и LINUX, допускают использование указателей в диапазоне от $0000000 до $bfffffff. Если вы преобразуете типы со знаком, это может вызвать ошибки переполнения и проверки диапазона, но также $80000000 < $7fffffff. Это может вызвать случайную ошибку в коде, подобно этому: «if p>q».

Error: Interface type Сообщение has no valid GUID

Если применяется оператор as для интерфейса или класса, то интерфейс (то есть правый операнд оператора as) должен иметь правильный GUID.

Error: Invalid selector name

Селектор Objective-C не может быть пустым, он должен быть правильным идентификатором или одинарным двоеточием, а если он содержит менее одного двоеточия, он также должен быть завершён.

Error: Expected Objective-C method, but got Сообщение

Селектор может быть создан только для методов Objective-C, не для любых других процедур/функций/методов.

Error: Expected Objective-C method or constant method name

Селектор может быть создан только для методов Objective-C, при задании имени используются строковые константы или идентификатор метода Objective-C, который является видимым из текущей области видимости.

Error: No type info available for this type

Информация о типах не генерируется для некоторых типов, таких как перечисления с пропусками в их диапазоне значений (включая перечисления, нижняя граница которых отлична от нуля).

Error: Ordinal or string expression expected

The expression must be an ordinal or string type.

Error: String expression expected

The expression must be a string type.

Warning: Converting 0 to NIL

Use NIL rather than 0 when initialising a pointer.

Error: Objective-C protocol type expected, but got ”arg1”

The compiler expected a protocol type name, but found something else.

Error: The type ”arg1” is not supported for interaction with the Objective-C runtime

Objective-C makes extensive use of run time type information (RTTI). This format is defined by the maintainers of the run time and can therefore not be adapted to all possible Object Pascal types. In particular, types that depend on reference counting by the compiler (such as ansistrings and certain kinds of interfaces) cannot be used as fields of Objective-C classes, cannot be directly passed to Objective-C methods, and cannot be encoded using objc_encode.

Error: Class or objcclass type expected, but got ”arg1”

It is only possible to create class reference types of class and objcclass

Error: Objcclass type expected

The compiler expected an objcclass type

Warning: Coerced univ parameter type in procedural variable may cause crash or memory corruption: arg1 to arg2

univ parameters are implicitly compatible with all types of the same size, also in procedural variable definitions. That means that the following code is legal, because single and longint have the same size:

{$mode macpas}

Type

  TIntProc = procedure (l: univ longint);

  procedure test(s: single);

    begin

      writeln(s);

    end;

  var

    p: TIntProc;

  begin

    p:=test;

    p(4);

  end.

This code may however crash on platforms that pass integers in registers and floating point values on the stack, because then the stack will be unbalanced. Note that this warning will not flagg all potentially dangerous situations. when test returns.

Error: Type parameters of specializations of generics cannot reference the currently specialized type

Recursive specializations of generics like Type MyType = specialize MyGeneric<MyType>; are not possible.

Error: Type parameters are not allowed on non-generic class/record/object procedure or function

Type parameters are only allowed for methods of generic classes, records or objects

Error: Generic declaration of ”arg1” differs from previous declaration

Generic declaration does not match the previous declaration

Error: Helper type expected

The compiler expected a class helper type.

Error: Record type expected

The compiler expected a record type.

Error: Derived class helper must extend a subclass of ”arg1” or the class itself

If a class helper inherits from another class helper the extended class must extend either the same class as the parent class helper or a subclass of it

Error: Derived record helper must extend ”arg1”

If a record helper inherits from another record helper it must extend the same record that the parent record helper extended.

СООБЩЕНИЯ КОМПИЛЯТОРА ОБ ОШИБКАХ

1 Out of memory Выход за границы памяти Компилятор выполняется вне допустимых границ памяти. Имеется ряд возможных решений проблемы:

§ Если в меню Options?Linker?Link Buffer, установлен параметр Memory, переключите его в значение Disk.

§ Возможно программа слишком велика, чтобы компилироваться в таком объеме памяти. Следует разбить ее на два или более модуля.

2 Identifier expected Не указан идентификатор В этом месте должен находиться идентификатор. 3 Unknown identifier Неизвестный идентификатор Этот идентификатор не был описан. 4 Duplicate identifier Повторный идентификатор Идентификатор уже представляет имя программы, модуля, константы, переменной, типа, процедуры и функции, описанных в текущем блоке. 5 Syntax  error Синтаксическая ошибка В исходном тексте найден неверный символ. 6 Error in real constant Ошибка в вещественной константе   7 Error in integer constant Ошибка в целой константе   8 String constant exceeds line Строковая константа превышает размеры строки Вероятно, отсутствует кавычка в конце строковой константы. 10 Unexpected end of file Неожиданный конец файла Причины:

§ несоответствующее количество begin и end (не забудьте, что оператор case также заканчивается словом end);

§ включаемый файл заканчивается в середине раздела операторов. Каждый раздел операторов должен целиком помещаться в одном файле;

§ незаконченный комментарий.

11 Line too long Строка слишком длинная Максимальная длина строки может равняться 126 символам. Возможно, отсутствует апостроф в конце строковой константы. 12 Type identifier expected Нужен идентификатор типа Не указан типа идентификатора, как это должно быть. 13 Too many open files Слишком много открытых файлов Файл CONFIG.SYS не содержит параметра FILES=xx или этот параметр указывает слишком много файлов. Следует увеличить число файлов. 14 Invalid file name Неверное имя файла Имя файла неверно или указывает несуществующий путь. 15 File not found Файл не найден Файл не может быть найден ни в текущем каталоге, ни в каком-либо другом исследуемом каталоге, предназначенном для этого типа файлов. 16 Disk full Диск заполнен Удалите некоторые файлы или воспользуйтесь новым диском (если речь идет о сменном носителе). 17 Invalid compiler directive Неправильная директива компилятора Возможно, неверная буква в директиве компилятора, один из параметров директивы компилятора неверный или используется глобальная директива компилятора, когда компиляция тела программы уже началась. 18 Too many files Слишком много файлов В компиляции программы или программного модуля участвует слишком много  файлов. Следует объединить включаемые файлы или сделать короче имена файлов. 19 Undefined type in pointer definition Неопределенный тип в определении ссылки Была осуществлена ссылка на тип в приведенном ранее описании указателя, но этот тип не был описан. 20 Variable identifier expected Нужен идентификатор переменной Идентификатор не описывает переменную, как это должно быть. 21 Error in type Ошибка в определении типа Определение типа не может начинаться с этого символа. 22 Structure too large Слишком большая структура Максимально допустимый размер структурного типа 65 535 байт. 23 Set base type of range Базовый тип множества выходит за допустимые границы Базовый тип множества должен представлять собой отрезок типа с границами в пределах от 0 до 255 или перечислимого типа, допускающим не более чем 256 значений. 24 File components may not be files or objects Элементы файла не могут быть файлами или объектами Тип компоненты файлового типа не может быть объектным или файловым типом и не может быть структурным типом с компонентами файлового или объектного типа: конструкции file of file или file of object не допускаются. 25 Invalid string length Неверная длина строки Длина строки должна находиться в диапазоне от 1 до 255. 26 Type mismatch Несоответствие типов Причины:

§ несовместимые типы переменной и выражения в операторе присваивания;

§ несовместимые типы фактического и формального параметров в обращении к процедуре или функции;

§ тип выражения, несовместимый с типом индекса при индексировании массива;

§ несовместимые типы операндов в выражении.

27 Invalid subrange base type Неправильный базовый тип интервального типа Допустимыми являются все порядковые типы. 28 Lower bound greater than upper bound Нижняя граница больше верхней В описании диапазона нижняя граница больше, чем верхняя. 29 Ordinal type expected Нужен порядковый тип Вещественные, строковые, структурные и ссылочные типы в данном случае  не допускаются. 30 Integer constant expected Нужна целая константа   31 Constant expected Нужна константа   32 Integer or real constant expected Нужна целая или вещественная константа   33 Pointer type identifier expected Нужен идентификатор типа указателя Данный идентификатор не обозначает тип указателя, как это требуется. 34 Invalid function result type Неправильный тип результата функции Правильными типами результата функции являются все простые типы, а также строковые и ссылочные типы. 35 Label identifier expected Нужен идентификатор метки Метка не обозначена с помощью идентификатора, как это требуется. 36 BEGIN expected Нужен BEGIN   37 END expected Нужен END Следует проверить соответствие ключевых слов BEGIN и END. 38 Integer expression expected Нужно выражение типа INTEGER Предыдущее выражение должно иметь целочисленный тип INTEGER 39 Ordinal expression expected Нужно выражение порядкового типа Предшествующее выражение должно иметь порядковый тип. 40 Boolean expression expected Нужно выражение типа BOOLEAN Предшествующее выражение должно иметь тип BOOLEAN 41 Operand types do not math operator Типы операндов не соответствуют оператору Данный оператор не может быть применен к операндам этого типа, например, нельзя ‘A’ разделить на ‘2’. 42 Error in expression Ошибка в выражении Данный идентификатор не может участвовать в выражении указанным образом. 43 Illegal assignment Неверное присваивание § Нетипизированным файлам и переменным нельзя присваивать значения.

§ Идентификатору функции можно присваивать значения только внутри раздела операторов данной функции.

44 Field identifier expected Нужен идентификатор поля Данный идентификатор не является полем предшествующей переменной типа «запись». 45 Object file too large Объектный файл слишком большой Нельзя компоновать файлы .obj, превышающие 64 Кбайт. 46 Undefined external Не определена внешняя процедура Внешняя процедура или функция не имеет соответствующего определения Public в объектном файле. Убедитесь, что вы указали все объектные файлы в директивах   {$L имя_файла}, и проверьте написание идентификаторов процедуры или функции в файле .asm. 47 Invalid object file record Неправильная запись объектного файла Файл .obj содержит неверную объектную запись. Убедитесь, что данный файл является действительно файлом .obj. 48 Code segment too large Сегмент кода слишком большой Максимальный размер кода программы или программного модуля равняется 65 520 байт. Если вы компилируете программный модуль, разбейте его на два или более программных модулей. 49 Data segment too large Сегмент данных слишком велик Максимальный размер сегмента данных равен 65 520 байт, включая данные, описываемые используемыми программными модулями. Если вам нужно большее количество глобальных данных, опишите большие структуры с помощью указателей и выделяйте для них память динамически с помощью процедуры New. 50 DO expected Нужен оператор DO   51 Invalid PUBLIC definition Неверное определение PUBLIC § Две или более директивы PUBLIC на языке ассемблера определяют один и тот же идентификатор.

§ Объектный файл .obj определяет идентификаторы PUBLIC, которые не находятся в сегменте CODE.

52 Invalid EXTRN definition Неверное определение EXTRN § На идентификатор имеется ссылка в директиве EXTRN на языке ассемблера, но он не описан в программе или модуле на Паскале или в интерфейсной части какого-либо из используемых модулей.

§ Идентификатор обозначает абсолютную переменную.

§ Идентификатор обозначает процедуру или функцию типа inline.

53 Too many EXTRN definition Слишком много определений EXTRN Невозможно обработать файлы .obj, если имеется более чем 256 EXTRN. 54 OF expected Требуется OF   55 INTERFACE expected Требуется интерфейсный раздел   56 Invalid relocatable reference Недопустимая перемещаемая ссылка § Файл .obj содержит данные и перемещаемые ссылки в сегментах, отличных от CODE. Например, вы пытаетесь описать инициализированные переменные в сегменте DATA.

§ Файл .com содержит ссылки с размерами в байтах на перемещаемые идентификаторы. Такая ошибка происходит в случае, если вы используете операторы HIGH и DOWN с перемещаемыми идентификаторами или если вы ссылаетесь в директивах DB на перемещаемые идентификаторы.

§ Операнд ссылается на перемещаемый идентификатор, который не был определен в сегменте CODE или в сегменте DATA.

§ Операнд ссылается на процедуру EXTRN или функцию EXTRN со смещением, например CALL SortProc+8.

57 Then expected Требуется THEN В нужном месте отсутствует слово then. 58 TO or DOWNTO expected Требуется TO или DOWNTO В нужном месте отсутствует ключевое слово TO или DOWNTO. 59 Undefined forward Не определено опережающее описание § Процедура или функция были описаны в интерфейсном разделе программного модуля, но их определение отсутствует в разделе реализации.

§ Процедуры или функции были описаны с помощью описания forward, но их определение не найдено.

61 Invalid typecast Неверное преобразование типа § Размеры ссылки на переменную и тип результата отличаются друг от друга при изменении типа переменной.

§ Вы пытаетесь осуществить приведение типа выражения, когда разрешается только ссылка на переменную, процедуру или функцию.

62 Division by zero Деление на нуль Предшествующая операция пытается выполнить деление на нуль. 63 Invalid file type Неверный файловый тип Данный файловый тип не обслуживается процедурой обработки файлов. Например, вы пытаетесь использовать процедуру Readln для типизированного файла или процедуру Seek для текстового. 64 Cannot Read or Write variables of this type Нельзя считать или записать переменные данного типа Процедуры Read и Readln могут считывать переменные символьного, целого, вещественного и строкового типа. 65 Pointer variable expected Нужно использовать переменную-указатель Предыдущая переменная должна иметь тип «указатель». 66 String variable expected Нужна строковая переменная Предшествующая переменная должна иметь строковый тип. 67 String expression expected Нужно выражение строкового типа Предшествующее выражение должно иметь строковый тип. 68 Circular unit reference Циклическая ссылка на модуль Два модуля не могут ссылаться друг на друга в разделе interface, но могут это делать в разделе implementation. Переупорядочите операторы uses таким образом, чтобы циклические ссылки имели место только в разделе implementation. 69 Unit name mismatch Несоответствие имен программных модулей Имя программного модуля, найденное в файле .tpu, не соответствует имени, указанному в операторе uses. 70 Unit version mismatch Несоответствие версий программных модулей Один или несколько программных модулей, используемых данной программой, были изменены после их компиляции. Воспользуйтесь командой Compile?Make или Compile?Build в интегрированной интерактивной среде программирования, что позволит автоматически скомпилировать программные модули, нуждающиеся в перекомпиляции. 71 Internal stack overflow Переполнение внутреннего стека Внутренний стек компилятора исчерпан из-за слишком большого уровня вложенности операторов. Переорганизуйте исходный код и уменьшите уровень вложенности. Например, переместите внутренние уровни вложенных операторов в отдельную процедуру. 72 Unit file format error Ошибка формата файла программного модуля Файле .tpu является недействительным. Возможно, он создан с помощью старой версии Turbo Pascal или Borland Pascal. В этом случае нужно перекомпилировать исходный код модуля и создать новый модуль. 73 Implementation expected Требуется раздел реализации Ключевое слово Implementation отсутствует там, где оно должно быть. Возможно, вы включили реализацию процедуры, функции или метода в интерфейсную часть модуля. 74 Constant and case types do not math Типы констант и выражения оператора Case не соответствуют друг другу Тип константы оператора Case несовместим с выражением селектора в операторе выбора 75 Record variable expected Нужна переменная типа запись Предшествующая переменная должна иметь тип «запись». 76 Constant out of range Константа выходит за допустимые границы § Вы пытаетесь указать массив с константами, нарушающими границы.

§ Вы пытаетесь присвоить константу вне диапазона переменной.

§ Вы пытаетесь передать константу вне диапазона в качестве параметра процедуре или функции.

77 File variable expected Нужна файловая переменная Предшествующая переменная должна иметь файловый тип. 78 Pointer expression expected Нужно выражение типа указатель Предшествующая переменная должна иметь ссылочный тип. 79 Integer or real expression expected Нужно выражение типа real  или integer Предшествующее выражение должно иметь тип real  или integer. 80 Label not within current block Метка не находится внутри текущего блока Оператор goto не может ссылаться на метку, находящуюся вне текущего блока. 81 Label already defined Метка уже определена Данная метка уже помечает оператор. 82 Undefined label in processing statement part Неопределенная метка в предшествующем разделе операторов Данная метка была описана, и на нее осуществлялась ссылка в предшествующем разделе операторов, но она не определена. 83 Invalid @ argument Недействительный аргумент оператора @ Действительными аргументами являются ссылки на переменные и идентификаторы процедур или функций. 84 Unit expected Нужно ключевое слово Unit Не указано ключевое слово Unit, как это требуется. 85 « expected Нужно указать «;» Не указана, где это требуется, точка с запятой. 86 «:» expected Нужно указать «:» Не указана, где это требуется, двоеточие. 87 «,» expected Нужно указать «,» Не указана, где это требуется, запятая. 88 «(» expected Нужно указать «(» Не указана, где это требуется, открывающаяся круглая скобка. 89 «)» expected Нужно указать «)» Не указана, где это требуется, закрывающаяся круглая скобка. 90 «=» expected Нужно указать «=» Нужно указать знак равенства. 91 «:=» expected Нужно указать «:=» Требуется использовать операцию присваивания. 92 « or «(.» expected Нужно «[» or «(.» Требуется указать квадратную скобку или «(. ». 93 « or «.expected Нужно «]» or «.)» Требуется указать квадратную скобку или «.) ». 94 « expected Нужно «.» Требуется указать точку. Убедитесь, что тип не используется как переменная или что именем программы не переопределяется важный идентификатор другого модуля. 95 «..» expected Нужно «..» Требуется указать точки. Там, где это нужно, не указан диапазон. 96 Too many variables Слишком много переменных Общий размер глобальных переменных, описанных в программе или программном модуле, не может превышать 64 Кбайт.

Размер локальных переменных, описанных в программе или функции, не может превышать 64 Кбайт.

97 Invalid for control variable Недопустимая управляющая переменная оператора for Управляющая переменная оператора for должна быть переменной перечисляемого типа, определенной в разделе описаний текущей подпрограммы. 98 Integer variable expected Нужна переменная целого типа Предшествующая переменная должна иметь тип integer. 99 Files are not allowed here Здесь не допускаются файлы Типизированная константа не может иметь файловый тип. 100 String length mismatch Несоответствие длины Длина строковой константы не соответствует количеству элементов символьного массива. 101 Invalid ordering of fields Неверный порядок полей Поля в константе типа «запись» должны указываться в порядке их описания. 102 String constant expected Нужна константа строкового типа   103 Integer or real variable expected Нужна переменная типа integer или real Предшествующая переменная должна иметь целый или вещественный тип. 104 Character expression   Ожидается символьные выражения 105 Compilation aborted   Компиляция прервана 106 Error in statement   Ошибка в операторе 107 Error in type   Ошибка в типе 108 Expected   Ожидается имя 109 Invalid floating point operation    Неправильная операция для вещественных операндов 110  Ordinal variable expected   Ожидается переменная целого или символьного типа 111  Too many symbols    Слишком много символов 112 Undefined type   Неопределенный тип 113 Abnormal program termination   Ненормальное окончание программы 114 Ctrl-Break to quit   нажмите CTRL и Break для входа 115 Disk is write-protected   Диск защищен от записи 116 Disk read error   Ошибка записи на диск 117 Disk write error   Ошибка записи на диск 118 Drive not ready   дисковод не готов (нет дискеты) 119 Error on execute    Ошибка исполнения 120 Floating point overflow   Вещественное переполнение 121 Hardware failure   Ошибка оборудования 122 Heap overflow error   Не хватает основной памяти 123 I/O checking   Ошибка ввода/вывода 124 Invalid Breakpoint   Неправильная точка останова 125 Invalid format specifier   Неправильный формат 126 No debug info   Не задана информация для отладки 127 Not enough memory   Не хватает памяти 128 Press any key   Нажмите любую клавишу 129 Program terminated   Исполнение программы прекращено 130 Range check error   Выход индекса за пределы массива 131 Runtime error   Ошибка во время исполнения 132 Stack overflow error   Ошибка по переполнению стека 133 Too many breakpoints   Слишком много точек останова 134 Type EXIT to return to Turbo Pascal   Введите Exit для возврата в Турбо Паскаль 135 User Break   Пользователь прервал исполнение программы

Модератор: Модераторы

Перегрузка ToString

Прошу помощи, нет сил уже, Гугл не помогает

Вот простая консольная программка:

Код: Выделить всё
program project1;

type

TMyClass = class
  public
   function ToString: string; override;
end;

function TMyClass.ToString: string;
  begin
   result := 'hello';
  end;

var

mc: TMyClass;

begin

mc := TMyClass.Create;

WriteLn(mc);

ReadLn;

end.

Выходит ошибка «project1.lpr(23,12) Error: Can’t read or write variables of this type» на строке с WriteLn(mc);

Что я делаю не так?

Koder
незнакомец
 
Сообщения: 2
Зарегистрирован: 21.12.2020 14:27:41


Re: Перегрузка ToString

Сообщение Seenkao » 25.12.2020 01:01:09

iskander писал(а):mc.ToString

жестоко… ))) пишут и не знаю сами, что пишут.

Seenkao
постоялец
 
Сообщения: 428
Зарегистрирован: 01.04.2020 03:37:12
  • Профиль
  • Сайт

Re: Перегрузка ToString

Сообщение скалогрыз » 25.12.2020 05:48:01

Seenkao писал(а):жестоко… ))) пишут и не знаю сами, что пишут.

я бы не стал так радикально говорить! судя по-заявлению человек пришёл в Паскаль из С#, где Console.WriteLine, как раз использует ToString().

Желательного функционала можно было БЫ добиться, если Write/WriteLn проверяли бы наличие implicit-cast операторов.

Вот это код не скомпилируется (хотя мог бы!)

Код: Выделить всё
operator := (o: TObject): AnsiString;
begin
  if Assigned(o) then result:= o.tostring()
  else Result := 'nil';
end;   

var
  o : TMyClass;
begin
  o := TMyClass.Create;
  Writeln(o); // ошибка
end.

Зато так тоже можно:

Код: Выделить всё
operator := (o: TObject): AnsiString;
begin
  if Assigned(o) then result:= o.tostring()
  else Result := 'nil';
end;   

var
  o : TMyClass;
  s: string;
begin
  o := TMyClass.Create;
  s := o;
  Writeln(s);
end.

или даже так:

Код: Выделить всё
operator := (o: TObject): AnsiString;
begin
  if Assigned(o) then result:= o.tostring()
  else Result := 'nil';
end;   

var
  o : TMyClass;
begin
  o := TMyClass.Create;
  Writeln(string(o)); // явное приведение из неявного
end.

При ЯВНОМ приведении типа, можно добиться желаемого результата:

Код: Выделить всё
operator explicit (o: TObject): AnsiString;
begin
  if Assigned(o) then result:= o.tostring()
  else Result := 'nil';
end;   

var
  o : TMyClass;
begin
  o := TMyClass.Create;
  Writeln(String(o));
end.

Но тогда уж, проще писать сразу o.ToString();

может и поправят когда-нить!

скалогрыз
долгожитель
 
Сообщения: 1801
Зарегистрирован: 03.09.2008 02:36:48

Re: Перегрузка ToString

Сообщение runewalsh » 25.12.2020 17:10:12

Поаккуратнее с неявными кастами, я себе однажды попробовал добавить касты между всеми типами векторов, чтобы можно было смешивать их типы в выражениях:

Код: Выделить всё
   operator +(const a, b: Vec3f32): Vec3f32;
   operator :=(const a: Vec3i16): Vec3f32;
   operator :=(const a: Vec3u8): Vec3f32;

var
   x: Vec3f32;
   d: Vec3i16;
   u: Vec3u8;
begin
   x := x + d + u;
end;

и вместо трёх секунд всё стало компилироваться по ПОЛМИНУТЫ, пришлось вернуть всё назад и больше не вспоминать. При этом код, явно приводящий векторы через перегруженную Make:

Код: Выделить всё
   operator +(const a, b: Vec3f32): Vec3f32;
   class function Vec3f32.Make(const a: Vec3i16): Vec3f32;
   class function Vec3f32.Make(const a: Vec3u8): Vec3f32;

var
   x: Vec3f32;
   d: Vec3i32;
   u: Vec3u8;
begin
   x := x + Vec3f32.Make(d) + Vec3f32.Make(u);
end;

— компилируется с прежней скоростью.

Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 572
Зарегистрирован: 27.04.2010 00:15:25

Re: Перегрузка ToString

Сообщение haword » 26.12.2020 17:33:03

Koder писал(а):Выходит ошибка «project1.lpr(23,12) Error: Can’t read or write variables of this type» на строке с WriteLn(mc);

Что я делаю не так?

по-русски же пишет — неможу считать или записать переменную этого типа. поэтому надо глянуть что WriteLn принимает как аргумент, и увидим что классы он не принимает
The Write command accepts an arbitrary number of arguments. The V1, V2, V3 in the declaration here are in fact just samples, the actual number may be much higher. The types of arguments (Type1 etc.) are limited to the following types:
Any character type.
Any string type (including pchar).
Any ordinal type (integer, enumerated).
The Int64 and QWord type.
Any floating-point type (such as double, single, extended).

мораль сей басни такова — учитесь читать что вам пишет компилятор или не занимайтесь программированием )

haword
постоялец
 
Сообщения: 298
Зарегистрирован: 02.03.2006 11:34:40

Re: Перегрузка ToString

Сообщение Vadim » 27.12.2020 05:14:56

haword писал(а):мораль сей басни такова — учитесь читать что вам пишет компилятор или не занимайтесь программированием )

Злая школьная учителка заставляет. Причём — удалёнская, от этого ещё страшнее… :D

Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Понравилась статья? Поделить с друзьями:
  • Error can t open vcd что делать
  • Error can t open file перевод
  • Error can t load xml config file farming simulator 2015 как исправить
  • Error can t load invalid boot image перевод
  • Error can t initialize plugins directory please try again later