Значение типа word для хранения длины строки в байтах
Типы данных на языке ассемблера и подробные определения данных
Ассемблер распознает набор основных внутренних типов данных (внутренние типы данных) и описывает их типы в соответствии с размером данных (байты, слова, двойные слова и т. Д.), Подписаны ли они, являются ли они целым или действительным числом. Эти типы в значительной степени перекрываются: например, тип DWORD (32-битное целое число без знака) может быть заменен типом SDWORD (32-битное целое число со знаком).
Некоторые люди могут сказать, что программист использует SDWORD, чтобы сообщить читателю, что это значение подписано, но это не обязательно для ассемблера. Ассемблер оценивает только размер операнда. Поэтому, например, программисты могут указывать только 32-разрядные целые числа как типы DWORD, SDWORD или REAL4.
В следующей таблице приведен список всех внутренних типов данных.Символы IEEE в некоторых записях относятся к стандартному формату вещественных чисел, опубликованному IEEE Computer Society.
Заявление об определении данных
Оператор определения данных (оператор определения данных) резервирует место для хранения переменных в памяти и присваивает дополнительное имя. Оператор определения данных определяет переменную в соответствии с внутренним типом данных (таблица выше).
Синтаксис определения данных следующий:
[name] directive initializer [,initializer]…
Ниже приводится пример оператора определения данных:
count DWORD 12345
- Имя: необязательное имя, присвоенное переменной, должно соответствовать спецификации идентификатора.
- Псевдо-инструкция: псевдо-инструкция в операторе определения данных может быть BYTE, WORD, DWORD, SBTYE, SWORD или другими типами, перечисленными в приведенной выше таблице. Кроме того, это также может быть традиционная директива определения данных, как показано в следующей таблице.
В определении данных должно быть хотя бы одно начальное значение, даже если значение равно 0. Остальные начальные значения, если есть, разделяются запятыми. Для целочисленных типов данных начальное значение (инициализатор) представляет собой целочисленную константу или целочисленное выражение, которое соответствует типу переменной, например BYTE или WORD.
Если программист не хочет инициализировать переменную (присвоить значение случайным образом), символ? Можно использовать в качестве начального значения. Все начальные значения, независимо от их формата, ассемблер преобразует в двоичные данные. Начальные значения 0011, 0010b, 32h и 50d имеют одинаковое двоичное значение.
Добавьте переменную в программу AddTwo
Программа AddTwo была представлена в предыдущем разделе «Сложение и вычитание целых чисел», а теперь создана ее новая версия, которая называется AddTwoSum. Эта версия вводит переменную сумму, которая появляется в полном листинге программы:
Вы можете установить точку останова в строке 13, выполнять по одной строке за раз и пошагово выполнять программу в отладчике. После выполнения строки 15 наведите указатель мыши на сумму переменной, чтобы просмотреть ее значение. Или откройте окно Watch.Процесс открытия выглядит следующим образом: выберите Windows в меню Debug (в сеансе отладки), выберите Watch и выберите один из четырех доступных вариантов (Watch1, Watch2, Watch3 или Watch4). Затем с помощью мыши выделите переменную суммы и перетащите ее в окно Watch. На следующем рисунке показан пример, где большая стрелка указывает текущее значение суммы после выполнения строки 15.
Определите данные BYTE и SBYTE
Начальное значение вопросительного знака (?) Делает переменную неинициализированной, что означает присвоение значения переменной во время выполнения:
Необязательное имя - это метка, которая определяет смещение от начала переменной, содержащей раздел, до переменной. Например, если value1 находится по смещению 0000 сегмента данных и занимает один байт в памяти, то value2 автоматически находится по смещению 0001:
value1 BYTE 10h
value2 BYTE 20h
val1 DB 255; беззнаковый байт
val2 DB -128; Байт со знаком
1) Несколько начальных значений
Если в одном определении данных используется несколько начальных значений, его метка указывает только смещение первого начального значения. В следующем примере предположим, что смещение списка равно 0000. Тогда смещение 10 равно 0000, смещение 20 равно 0001, смещение 30 равно 0002, а смещение 40 равно 0003:
list BYTE 10,20,30,40
На следующем рисунке показан список последовательности байтов, показывающий каждый байт и его смещение.
Не все определения данных должны использовать метки. Например, если вы продолжите добавлять массивы байтов после списка, вы можете определить их в следующей строке:
В одном определении данных для его начального значения могут использоваться разные базы. Также можно произвольно комбинировать символы и строковые константы. В следующем примере list1 и list2 имеют одинаковое содержимое:
2) Определить строку
Чтобы определить строку, заключите ее в одинарные или двойные кавычки. Наиболее распространенный тип строки - использование нулевого байта (значение 0) в качестве конечного тега, который называется строкой с завершающим нулем. Этот тип строки используется во многих языках программирования:
Каждый символ занимает один байт памяти. Строки являются исключением из правила, согласно которому значения байтов должны разделяться запятыми. Если бы таких исключений не было, приветствие1 было бы определено как:
greeting1 BYTE 'G', 'o', 'o', 'd'….etc.
Это очень долго. Строку можно разделить на несколько строк, и нет необходимости добавлять метку к каждой строке:
Шестнадцатеричные коды 0Dh и 0Ah также называются CR / LF (возврат каретки и перевод строки) или символы конца строки. При записи стандартного вывода они перемещают курсор в левую часть строки рядом с текущей строкой.
Символ продолжения строки () соединяет две строки исходного кода в оператор, и он должен быть последним символом строки. Следующие утверждения эквивалентны:
greeting1 BYTE "Welcome to the Encryption Demo program "
и
greeting1
BYTE "Welcome to the Encryption Demo program "
Оператор DUP использует целочисленное выражение в качестве счетчика для выделения пространства хранения для нескольких элементов данных. Этот оператор очень полезен при выделении места для хранения строк или массивов. Он может использовать инициализированные или неинициализированные данные:
Определите данные WORD и SWORD
Директивы WORD (слово определения) и SWORD (слово со знаком определения) выделяют место для хранения одного или нескольких 16-битных целых чисел:
Вы также можете использовать традиционную псевдо-инструкцию DW:
Массив 16-битных слов создается путем перечисления элементов или с помощью оператора DUP. Следующий массив содержит набор значений:
myList WORD 1,2,3,4,5
На рисунке ниже представлена схематическая диаграмма массива в памяти при условии, что смещение начальной позиции myList равно 0000. Поскольку каждое значение занимает два байта, приращение его адреса равно 2.
Оператор DUP предоставляет удобный способ объявления массивов:
массив WORD 5 DUP (?); 5 значений, не инициализировано
Определите данные DWORD и SDWORD
Псевдоинструкции DWORD (определение двойного слова) и SDWORD (определение двойного слова со знаком) выделяют место для хранения одного или нескольких 32-битных целых чисел:
Традиционная псевдо-инструкция DD также может использоваться для определения данных двойного слова:
DWORD также можно использовать для объявления переменной, содержащей 32-битное смещение другой переменной. Как показано ниже, pVal содержит смещение val3:
pVal DWORD val3
32-битный массив двойных слов
Теперь определите массив двойных слов и явно инициализируйте каждое его значение:
myList DWORD 1,2,3,4,5
На следующем рисунке показана схематическая диаграмма этого массива в памяти.Предположим, что смещение начальной позиции myList равно 0000, а приращение смещения равно 4.
Определить данные QWORD
Псевдо-инструкция QWORD (определить четыре слова) выделяет место для хранения 64-битных (8 байтов) значений:
quad1 QWORD 1234567812345678h
Традиционная псевдо-инструкция DQ также может использоваться для определения данных из четырех слов:
quad1 DQ 1234567812345678h
Определить сжатые данные BCD (TBYTE)
Intel хранит сжатое двоично-десятичное (BCD, двоично-десятичное) целое число в 10-байтовом пакете. Каждый байт (кроме самого старшего) содержит две десятичные цифры. В младших 9 байтах памяти каждый полубайт хранит десятичное число. В старшем байте самый старший бит представляет бит знака числа. Если старший байт равен 80h, число отрицательное; если старший байт равен 00h, число положительное. Диапазон целых чисел: от -999 999 999 999 999 999 до +999 999 999 999 999 999.
Пример В следующей таблице перечислены шестнадцатеричные байты хранения положительных и отрицательных десятичных чисел 1234, в порядке от младшего до самого старшего байта:
Десятичное значение | Байты памяти |
---|---|
+1234 | 34 12 00 00 00 00 00 00 00 00 |
-1234 | 34 12 00 00 00 00 00 00 00 80 |
MASM использует псевдо-инструкцию TBYTE для определения сжатых переменных BCD. Начальное значение константы должно быть в шестнадцатеричном формате, поскольку ассемблер не будет автоматически преобразовывать начальное десятичное значение в код BCD. В следующих двух примерах показаны допустимые и недопустимые выражения десятичного числа -1234:
Второй пример недействителен, поскольку MASM кодирует константы как двоичные целые числа вместо сжатия целых чисел BCD.
Если вы хотите закодировать действительное число в сжатый код BCD, вы можете использовать инструкцию FLD для загрузки действительного числа в стек регистров с плавающей запятой, а затем использовать инструкцию FBSTP для преобразования его в сжатый код BCD. Эта инструкция округляет значение до ближайшего Целое число:
Если posVal равно 1,5, результирующее значение BCD равно 2.
Определить тип с плавающей запятой
В следующей таблице описано минимальное количество значащих цифр и приблизительные диапазоны стандартных вещественных типов:
тип данных | эффективное число | Приблизительный диапазон |
---|---|---|
Короткий реальный номер | 6 | 1.18x 10-38 to 3.40 x 1038 |
Длинное действительное число | 15 | 2.23 x 10-308 to 1.79 x 10308 |
Действительное число повышенной точности | 19 | 3.37 x 10-4932 to 1.18 x 104932 |
Псевдо-инструкции DD, DQ и DT также могут определять действительные числа:
Ассемблер MASM включает такие типы данных, как wal4 и real8, которые указывают на то, что значение является действительным числом. Чтобы быть более точным, эти значения представляют собой числа с плавающей запятой с ограниченной точностью и диапазоном. С математической точки зрения точность и размер действительных чисел неограниченны.
Программа сложения переменных
До сих пор в примерах программ в этом разделе реализовано целочисленное сложение, хранящееся в регистрах. Теперь, когда у вас есть некоторое представление о том, как определять данные, вы можете изменить ту же программу, чтобы добавить три целочисленные переменные и сохранить сумму в четвертой переменной.
Обратите внимание, что три переменные инициализированы ненулевыми значениями (строки с 9 по 11). Добавьте переменные в строки 16-18. Набор инструкций x86 не позволяет напрямую добавлять одну переменную к другой переменной, но позволяет добавлять одну переменную в регистр. Вот почему EAX используется как аккумулятор в строках 16-17:
mov eax,firstval
add eax,secondval
После строки 17 EAX содержит сумму firstval и secondval. Затем в строке 18 добавьте третье значение к сумме в EAX:
Наконец, в строке 19 сумма копируется в переменную с именем sum:
В качестве упражнения всем рекомендуется запускать эту программу в сеансе отладки и проверять каждый регистр после выполнения каждой инструкции. Окончательная сумма должна быть 53335333 в шестнадцатеричной системе.
Если во время сеанса отладки вы хотите, чтобы переменная отображалась в шестнадцатеричном формате, выполните следующие действия: наведите указатель мыши на переменную или зарегистрируйтесь в течение 1 секунды, пока под курсором мыши не появится серый прямоугольник. Щелкните прямоугольник правой кнопкой мыши и выберите во всплывающем меню «Шестнадцатеричный формат».
Little endian
Процессор x86 хранит и извлекает данные в памяти в обратном порядке (от младшего к большему). Младший байт сохраняется в первом адресе памяти, присвоенном данным, а остальные байты сохраняются в последующих последовательных ячейках памяти. Рассмотрим двойное слово 12345678h. Если он сохраняется по смещению 0000, 78h сохраняется в первом байте, 56h сохраняется во втором байте, а оставшиеся байты сохраняются по смещениям адресов 0002 и 0003, как показано на следующем рисунке. .
Некоторые другие компьютерные системы используют прямой порядок байтов (от старшего к младшему). На следующем рисунке показано, что 12345678h хранится в обратном порядке, начиная со смещения 0000.
Объявить неинициализированные данные
.DATA? Директива объявляет неинициализированные данные. При определении большого количества неинициализированных данных директива .DATA? Уменьшает размер компилятора. Например, следующий код является допустимым утверждением:
С другой стороны, скомпилированная программа, сгенерированная следующим кодом, будет иметь дополнительные 20 000 байтов:
Гибридный ассемблер кода и данных позволяет переключать код и данные в программе туда и обратно. Например, вы хотите объявить переменную, чтобы ее можно было использовать только в локальной области программы. В следующем примере между двумя операторами кода вставляется переменная с именем temp:
Хотя присутствие оператора temp прерывает поток исполняемых инструкций, MASM поместит temp в раздел данных и отделит его от раздела кода, который остается скомпилированным. Однако в то же время смешивание директив .code и .data может затруднить чтение программы.
Помогите,пожалуйста .Вообще не полнимаю что здесь делать
Вот такое задание:
Описать базовый класс СТРОКА.
Обязательные члены класса:
* указатель на char - хранит адрес динамически выделенной памяти
для размещения символов строки;
* значение типа int - хранит длину строки в байтах.
Обязательные методы должны выполнять следующие действия:
* конструктор без параметров;
* конструктор, принимающий в качестве параметра
Си-строку (заканчивается нулевым байтом);
* конструктор, принимающий в качестве параметра символ (char).
* конструктор копирования;
* деструктор.
* чтение символа из заданной позиции;
Производный от СТРОКА класс СТРОКА_ИДЕНТИФИКАТОР
Строки данного класса строятся по правилам записи идентификаторов
в СИ, и могут включать в себя только те символы, которые могут входить
в состав Си-идентификаторов. Если исходные данные противоречат правилам записи идентификатора, то создается пустая СТРОКА_ИДЕНТИФИКАТОР.
Обязательные методы:
* конструктор без параметров;
* конструктор, принимающий в качестве параметра Си-строку
(заканчивается нулевым байтом);
* конструктор, принимающий в качестве параметра символ (char).
* конструктор копирования;
* деструктор.
* перевод всех символов строки (кроме цифр) в нижний регистр;
Переопределить следующие операции:
* присваивание (=);
* оператор == - проверка на равенство;
Производный от СТРОКА класс БИТОВАЯ_СТРОКА.
Строки данного класса могут содержать только символы '0' или '1'. Если
в составе инициализирующей строки будут встречены любые символы, отличные
от допустимых, БИТОВАЯ_СТРОКА принимает нулевое значение.
Содержимое данных строк рассматривается как двоичное число.
Отрицательные числа хранятся в дополнительном коде.
Число считается отрицательным, если крайний левый(знаковый) разряд = 1,
при этом разрядность числа может быть любой в пределах ограничений, указанных в файле README.TXT. Таким образом, числа 11101 и 101 являются отрицательными и равными по значению.
Обязательные методы:
* конструктор без параметров;
* конструктор, принимающий в качестве параметра
Си-строку (заканчивается нулевым байтом);
* конструктор копирования;
* деструктор;
* удаление лишних ведущих символов (нулей или единиц в зависимости от
знака числа);
Переопределить следующие операции (длина строки результата равна длине большей из строк, в случае необходимости, более короткая битовая строка расширяется влево знаковым разрядом) :
* присваивание (=);
* операция == - проверка на равенство
* операция < - проверка на меньше (по значению).
Разработчик вправе вводить любое (с обоснованием необходимости) число дополнительных членов и методов.
Задание:
Разработать иерархию классов по следующей схеме:
СТРОКА
|
V
| |
СТРОКА_ИДЕНТИФИКАТОР БИТОВАЯ_СТРОКА
с обязательной поддержкой заданных членов и методов.
Написать тестовую программу, которая:
* динамически выделяет массив указателей на базовый класс размерностью,
заданной в п/п. 1.1.
* в режиме диалога заполняет этот массив указателями на производные классы,
при этом экземпляры производных классов создаются динамически с заданием
начальных значений;
* для созданных экземпляров производных классов выполняется
проверка всех разработанных методов (в соответствии с вариантом задания),
с выводом исходных данных и результатов на дисплей.
Описать базовый класс СТРОКА. Обязательные члены класса: * указатель на char - хранит адрес динамически выделенной памяти для размещения символов строки; * значение типа int - хранит длину строки в байтах. Обязательные методы должны выполнять следующие действия: * конструктор без параметров; * конструктор, принимающий в качестве параметра Си-строку (заканчивается нулевым байтом); * конструктор, принимающий в качестве параметра символ (char). * конструктор копирования; * деструктор. * чтение символа из заданной позиции; |
Начнём с этого задания. Какие пункты Вы можете выполнить? Каков результат их выполнения? Какие пункты Вы не знаете, как выполнить?
вопросы:
* конструктор, принимающий в качестве параметра символ (char).
* чтение символа из заданной позиции;
вот эти я не сделал
конструктор, принимающий в качестве параметра символ (char) |
Видимо, имеется в виду метод, который на вход принимает индекс, на выходе - символ.
Что интереснее, Вы:
1) Забыли квалификатор доступа public: - сейчас объект класса нельзя создать, все методы, включая конструкторы, недоступны извне.
2) Аргумент конструктора, наверное, const char* str? Иначе нельзя создать объект по константной строке.
3) При копировании C-строки настоятельно рекомендуется отводить n+1 символ (последний символ - под нуль-терминатор '\0', которым кончается любая C-строка). Прочитайте главу Вашего учебника про C-строки ещё раз.
В остальном вроде вполне сносно.
а в моей реализации конструктора, принимающего строку текста, строка заканчивается нулевым байтом?или для этого что-то нужно дополнительно прописать?
а в моей реализации конструктора, принимающего строку текста, строка заканчивается нулевым байтом?или для этого что-то нужно дополнительно прописать? |
Разумеется, нет - Вы же этого не сделали.
Посмотрите описание функции strcpy() / strncpy(). И описание функции strlen(), внимательно.
Далее, не забываем: данные - в private-секции, методы - в public-секции.
Далее, конструктор String::String(char) не устанавливает значение n. Не хорошо.
Далее, если массив имеет длину n+1, то последний элемент имеет индекс n, у Вас ошибка на единицу.
Репутация: нет
Всего: нет
помогите разобраться, что мне нужно делать, пожалуйста
Описать базовый класс СТРОКА.
Обязательные поля класса:
указатель на тип char – хранит адрес динамически выделенной памяти для размеще-ния символов строки;
значение типа int – хранит длину строки в байтах.
Обязательные методы должны выполнять следующие действия:
конструктор без параметров;
конструктор, принимающий в качестве параметра СИ-строку (заканчивается ну-левым байтом);
конструктор, принимающий в качестве параметра символ;
конструктор копий;
получение длины строки;
очистка строки (сделать строку пустой);
деструктор.
Описать производный от СТРОКА класс ДЕСЯТИЧНАЯ_СТРОКА.
Строки данного класса могут содержать только символы десятичных цифр и символы + или , задающие знак числа. Символы + или могут находится только в первой позиции чис-ла, причем символ + может отсутствовать, в этом случае число считается положительным. Если в составе инициализирующей строки будут встречены любые символы, отличные от допусти-мых, ДЕСЯТИЧНАЯ_СТРОКА принимает нулевое значение. Содержимое данных строк рас-сматривается как десятичное число.
Обязательные методы:
конструктор без параметров;
конструктор, принимающий в качестве параметра СИ-строку (заканчивается ну-левым байтом);
конструктор копий;
деструктор;
метод, определяющий, можно ли представить данное число в формате int.
Переопределить следующие операции:
присваивание (=);
вычитание () – арифметическая разность строк;
операция > – проверка на больше (по значению);
операция < – проверка на меньше (по значению).
Разработчик вправе вводить любое (с обоснованием необходимости) число дополнительных полей и методов.
Написать тестовую программу, которая:
динамически выделяет массив указателей на базовый класс (4 – 6);
в режиме диалога заполняет этот массив указателями на производные классы, при этом экземпляры производных классов создаются динамически с заданием начальных значений;
для созданных экземпляров производных классов выполняет проверку всех разрабо-танных методов с выводом исходных данных и результатов на дисплей.
Для конструкторов копирования каждого класса предусмотреть диагностическую печать количества его вызовов в определенное место дисплея (рекомендуется использовать статические члены класса).
Режим диалога обеспечивается с помощью иерархического меню.
Репутация: 3
Всего: 13
Цитата |
Описать базовый класс СТРОКА. Обязательные поля класса: указатель на тип char – хранит адрес динамически выделенной памяти для размеще-ния символов строки; значение типа int – хранит длину строки в байтах. Обязательные методы должны выполнять следующие действия: конструктор без параметров; конструктор, принимающий в качестве параметра СИ-строку (заканчивается ну-левым байтом); конструктор, принимающий в качестве параметра символ; конструктор копий; получение длины строки; очистка строки (сделать строку пустой); деструктор. Описать производный от СТРОКА класс ДЕСЯТИЧНАЯ_СТРОКА. Строки данного класса могут содержать только символы десятичных цифр и символы + или , задающие знак числа. Символы + или могут находится только в первой позиции чис-ла, причем символ + может отсутствовать, в этом случае число считается положительным. Если в составе инициализирующей строки будут встречены любые символы, отличные от допусти-мых, ДЕСЯТИЧНАЯ_СТРОКА принимает нулевое значение. Содержимое данных строк рас-сматривается как десятичное число. Обязательные методы: конструктор без параметров; конструктор, принимающий в качестве параметра СИ-строку (заканчивается ну-левым байтом); конструктор копий; деструктор; метод, определяющий, можно ли представить данное число в формате int. Переопределить следующие операции: присваивание (=); вычитание () – арифметическая разность строк; операция > – проверка на больше (по значению); операция < – проверка на меньше (по значению). Разработчик вправе вводить любое (с обоснованием необходимости) число дополнительных полей и методов. Написать тестовую программу, которая: динамически выделяет массив указателей на базовый класс (4 – 6); в режиме диалога заполняет этот массив указателями на производные классы, при этом экземпляры производных классов создаются динамически с заданием начальных значений; для созданных экземпляров производных классов выполняет проверку всех разрабо-танных методов с выводом исходных данных и результатов на дисплей. Для конструкторов копирования каждого класса предусмотреть диагностическую печать количества его вызовов в определенное место дисплея (рекомендуется использовать статические члены класса). Режим диалога обеспечивается с помощью иерархического меню. |
Добавлено через 24 секунды
P.S. Задавайте чтоли вопросы по тому что непонятно
Репутация: нет
Всего: нет
Репутация: нет
Всего: нет
sQu1rr, ок! Конкретный вопрос: как должно выглядеть иерархическое меню и какие элементы нужно использовать при построении в visual studio 2010? Чисто визуально не могу представить!
Репутация: нет
Всего: 2
что касается строкового класса, можешь посмотреть исходники mfc, CString, на мой взгляд, имеет довольно несложную реализацию, думаю оттуда можно много накопипастить, только имя класса поменяй
Возможно и std::basic_string вполне подойдёт, но stl сложнее читать.
Репутация: 63
Всего: 196
Репутация: 3
Всего: 13
Цитата(krah @ 12.4.2013, 10:41 ) |
ок! Конкретный вопрос: как должно выглядеть иерархическое меню и какие элементы нужно использовать при построении в visual studio 2010? Чисто визуально не могу представить! |
Зависит от задачи, если вам нужен интерфейс, то иерархическое меню может представлять из себя меню "Файл" В проводнике например, если консольное приложение, то спиской действий и поддействий 1. 2. 2а. 2б. 3. и так далее.
Репутация: нет
Всего: нет
Цитата(krah @ 11.4.2013, 17:22 ) |
Для конструкторов копирования каждого класса предусмотреть диагностическую печать количества его вызовов в определенное место дисплея (рекомендуется использовать статические члены класса). |
sQu1rr, как вот это воплотить в реальность?
Репутация: 3
Всего: 13
Цитата(krah @ 12.4.2013, 10:41 ) |
Чисто визуально не могу представить! |
Цитата(krah @ 13.4.2013, 13:47 ) |
как вот это воплотить в реальность? |
Цитата(sQu1rr @ 11.4.2013, 19:22 ) |
Задавайте чтоли вопросы по тому что непонятно |
Это я к тому что никто ничего делать за вас не будет, если что-то непонятно, спрашивайте. Воплотить в реальность можно на С/C++. Вы так и не указали язык, вы так и не указали графическое приложение или консольное. Вы указали только среду разработки которая, увы, ничего мне не говорит. Visual Studio работает как С так и с С++, да еще и со многими другими языками.
Репутация: 22
Всего: 135
Хмм. Класс с конструкторами и переопределёнными операторами. На Си.
Как?
Добавлено через 2 минуты и 56 секунд
P.S.
/me сильно удивлён, что тема до сих пор не в ЦП
Репутация: нет
Всего: нет
Цитата(borisbn @ 14.4.2013, 07:26 ) |
Хмм. Класс с конструкторами и переопределёнными операторами. На Си. |
Репутация: 3
Всего: 13
Цитата(borisbn @ 14.4.2013, 07:26 ) |
Хмм. Класс с конструкторами и переопределёнными операторами. На Си. Как? |
Репутация: 22
Всего: 135
Если это опечатка, то извините. Просто там дальше по тексту ещё было про Си
> Visual Studio работает как С так и с С++
Репутация: нет
Всего: нет
Репутация: нет
Всего: нет
а где именно прописывать базовый и производный класс? сразу после или перед
public ref class Form1 : public System::Windows::Forms::Form
public:
Form1(void)
InitializeComponent();
//
//TODO: добавьте код конструктора
//
>
protected:
///
/// Освободить все используемые ресурсы.
///
~Form1()
if (components)
delete components;
>
>
private:
///
/// Требуется переменная конструктора.
///
System::ComponentModel::Container ^components;
Репутация: нет
Всего: 2
Цитата(krah @ 2.5.2013, 18:48 ) |
а где именно прописывать базовый и производный класс? сразу после или перед |
не знаю, может кто-то тебя и понимает, но по-моему ты как-то недостаточно чётко формулируешь вопрос.
Репутация: нет
Всего: нет
мне нужно написать это все на с++ CLI, не по собственному желанию!
базовый и производные классы мне нужно описать и использовать методы описанные выше.
Репутация: нет
Всего: 2
Цитата(krah @ 2.5.2013, 23:39 ) |
базовый и производные классы мне нужно описать и использовать методы описанные выше. |
я в c++ CLI не понимаю.. Что касается твоего кода, то насколько я понимаю, это шаблон кода базового класса, ты должен его дописать и производный класс наследовать от него. Но мне пока не совсем понять, зачем вообще нужен производный класс.. Можно, конечно, сделать базовый класс абстрактным и реализовать методы в наследнике.. но зачем, что мешает реализовать весь функционал в одном классе?
Репутация: нет
Всего: нет
вот я описал базовый класс и производные классы
class mystring
protected:
char *p;
int length;
public:
mystring();
mystring(const char *s);
mystring(char c);
mystring(const mystring &str);
~mystring();
int get_length();
>;
class desstring: public mystring
public:
desstring();
desstring(const char *s);
desstring(char c);
desstring(const desstring &str);
~desstring();
int find_char(char c);
desstring operator+(desstring id);
desstring operator=(desstring id);
bool operator<(desstring id);
>;
Репутация: нет
Всего: нет
Репутация: 63
Всего: 196
смысла в такой иерархии нет. В целом верно. Но я бы вместо length использовал указатель на конец области, занятой строкой. И еще бы пару добавил для оптимизации.
Репутация: нет
Всего: нет
class stroka // Опишем базовый класс строки
protected:
char *p; // Указатель на char - хранит адрес динамически выделенной памяти для размещения символов строки
int length; // Значение типа int - хранит длину строки в байтах
public: // Обязательные методы должны выполнять следующие действия:
stroka()<> // Конструтор без параметров
stroka(const char *s) // Конструктор, принимающий в качестве параметра Си-строку (заканчивается нулевым байтом)
;
stroka(char c) // Конструктор, принимающий в качестве параметра символ (char)
p[1]='\0';
n=1;>;
stroka(const stroka &str) // Конструктор копирования
p = new char[n+1];
strcpy(p, str.s);>;
~stroka(); // Деструктор
int get_length(); // Получение длины строки
>;
class desstring: public stroka
public: // Обязательные методы:
desstring()<> // Конструтор без параметров
desstring(const char *s):stroka(s); // Конструктор, принимающий в качестве параметра Си-строку (заканчивается нулевым байтом)
desstring(char c):stroka©; // Конструктор, принимающий в качестве параметра символ (char)
desstring(const desstring &str):stroka(str); // Конструктор копирования
~desstring(); // Деструктор
int find_char(char c); // Поиск первого вхождения символа в строку
desstring operator+(desstring id); // Переопределим сложение (+) - операция конкатенации строк
desstring operator=(desstring id); // Переопределим присваивание (=)
bool operator <(desstring id); // Переопределим оператор < - проверка на меньше. Строка считается меньше другой,
// если код символа первой строки в i-й позиции
// (i изменяется от 0 до n-1, где n - длина более
// короткой строки) меньше кода символа в той же позиции
// кода символа в той же позиции во второй строке,
// длины строк могут не совпадать.
>;
правильно объявлены параметры методов классов??
Репутация: нет
Всего: 2
Цитата(krah @ 23.5.2013, 20:40 ) |
правильно объявлены параметры методов классов?? |
Так попробуй скомпилировать, и увидишь.
Когда скомпилируется, попробуй использовать по назначению. Создай объект класса, на его основе (через конструктор копирования), создай другой. Измени один из них, присвой первый второму и т.п.
Вообще найди кнопку "код" и используй её.. читать же невозможно..
Репутация: нет
Всего: нет
оно выдает ошибки только public ref class Form1 : public System::Windows::Forms::Form
в том, что я описала нет ошибок, он из-за этого не компилируется.
Репутация: 63
Всего: 196
Репутация: нет
Всего: нет
Репутация: нет
Всего: 2
Цитата(krah @ 24.5.2013, 17:17 ) |
у меня не правильно описан конструктор копий! как по-другому можно его описать?? |
Код |
stroka(const stroka &str) length = str.length; p = new char[length+1]; strcpy(p, str.p); >; |
Цитата(krah @ 23.5.2013, 21:39 ) |
оно выдает ошибки только public ref class Form1 : public System::Windows::Forms::Form |
- Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
- Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
- Прежде чем задать вопрос, прочтите это и/или это! хранится весь мировой запас ссылок на документы, связанные с C++ :)
- Не брезгуйте пользоваться тегами [code=cpp][/code].
- Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
[ Время генерации скрипта: 0.1956 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Тип данных WORD
Здравствуйте.
Хотелось бы использовать тип данных WORD для управления множеством выходов, поскольку для массового изменения очень подходит битовые операции. Но не могу понять как грамотно привязвыать выходы к такой переменной. Получаются совсем уж нелепые конструкции.
Для чего этот тип данных используется на практике, в реальной работе?
Тип данных WORD
egjar писал(а): ↑ 22 мар 2021, 22:39 Для чего этот тип данных используется на практике, в реальной работе?
Тип Word - это целочисленный беззнаковый тип данных, в два байта. Диапазон 0-65535. Используется везде, где оказывается нужным.
Где конкретно, в какой среде, с каким ПЛК, по какому протоколу Вы работете с выходами?
Тип данных WORD
egjar писал(а): ↑ 22 мар 2021, 22:39 Для чего этот тип данных используется на практике, в реальной работе?
Вот для упаковки-распаковки битовых переменных и используется в основном.
И, например, в Step7 тип Word интерпретируется как массив бит.
А как использовать. по разному в различных системах например Var_Bool0:=Var_Word.0, где-то операторы есть Pack- UnPack, а в софте для программирования есть кнопка "HELP", если что не понятно жмем и ищем-читаем там.
Тип данных WORD
stesl писал(а): ↑ 23 мар 2021, 10:37 Тип Word - это целочисленный беззнаковый тип данных, в два байта. Диапазон 0-65535. Используется везде, где оказывается нужным.
Не путайте Word с UInt (unsigned integer16), он не относится к целочисленным, так как не кодирует числовые значения и не совместим с математическими операциями.
Потому что:
Sergy6661 писал(а): ↑ 23 мар 2021, 12:54 Вот для упаковки-распаковки битовых переменных и используется в основном.
Но не в основном, а только для этого. Если конечно в конкретном ПЛК не срабатывает неявное преобразование, из-за которого кажется, что Word - это целое число.
Это разные типы данных, хотя все они 16 бит.
Тип данных WORD
Михайло писал(а): ↑ 23 мар 2021, 21:52 Не путайте Word с UInt (unsigned integer16), он не относится к целочисленным, так как не кодирует числовые значения и не совместим с математическими операциями.
Ну, допустим, в CoDeSys WORD по большему счету как UINT16, но в CoDeSys можно по биту к любому целочисленному обращаться.
В общем все от системы разработки зависит и опять же кнопка "HELP" рулит.
Тип данных WORD
Михайло писал(а): ↑ 23 мар 2021, 21:52 Не путайте Word с UInt (unsigned integer16), он не относится к целочисленным, так как не кодирует числовые значения и не совместим с математическими операциями.
Тип данных WORD
Почему именно беззнаковое? Значения в диапазоне -32767. 32767 в какие-то другие типы укладывается?
[+] В начале было слово.
И слово было - два байта.
Другими словами, BYTE - это тип без знака, WORD - беззнаковый короткий тип, а DWORD - беззнаковый длинный тип.
В VC ++ 6.0 1 байт символа, short - 2 байта, int и long - 4 байта, поэтому можно считать, что переменные, определяемые BYTE, WORD, DWORD, - это 1 раздел, 2 байта, 4 слова. Раздел.
То есть: BYTE = unsigned char, WORD = unsigned short, DWORD = unsigned long
DWORD обычно используется для сохранения адреса или сохранения указателя
Разница между словом и словом
Определение WORD и DWORD в основном для: 1. Легко трансплантировать; 2. Более строгая проверка типов
WORD фиксируется на 2 байта, DWORD фиксируется на 4 байта
Int, с разными операционными системами, имеет разное количество байтов, в 32-битной операционной системе - 4 байта, в 16-битной операционной системе - 2 байта
В операции сериализации, поскольку сериализация хранится в соответствии с потоком байтов, чтобы гарантировать, что она не будет выровнена, необходимо использовать тип данных с четким числом байтов.
Интеллектуальная рекомендация
Java.nio.Buffer flip () метод jdk Ошибка перевода на китайский язык
Когда я сегодня читал «Идеи программирования на Java», я столкнулся с методом java.nio.Buffer flip (). Дело в том, что «[color = red] переворачивает этот буфер. Сначала установите ог.
Предварительное понимание регулярных выражений Python (4)
Сегодня я продолжу делиться базовыми знаниями о регулярных выражениях Python. В основном я представляю использование специального символа "<>". Ниже приведено конкретное руководство. .
Все белое Введение Сверток Neural Network (CNN)
Использование внутреннего соединения, левого соединения, правого соединения в оракуле
Левое-правое соединение фактически говорит, какая таблица является результатом нашего совместного запроса ~ 1. Взаимосвязь проста select A.*, B.* from A,B where A.id = B.id select A.*, B.* from.
[Код очень подробный] POJ 2492 A Bug's Life (и проверьте коллекцию)
1. Описание заголовка 2. Инструкции по анализу алгоритмов и руководство по написанию кода. Похожие темы:POJ 1182 Решение проблемы пищевой цепи Наблюдается m насекомых и n вязок. Насекомые u и v могут .
Читайте также: