Вопрос № 101432: Уважаемые эксперты, подскажите, пожалуйста, как в C++Builder 6 передать информацию в порт LPT и прочитать данные пришедшие в него с подключенного устройства (не принтера)....Вопрос № 101495: Уважаемые эксперты!
Задаю свой вопрос уже в третий раз и снова по-новому.
Пишу тестирующую программу на BCB5.
Первая форма - регистрационная. Здесь пользователь вводит свои ФИО и нажимает предложенную ниже кнопку "Начать т...Вопрос № 101524: Доброе время суток эксперты!
Скажите как мне побороть преобразование типов. В с++ это какая-то жесть :-)
Никак не могу понять, как преобразовывать из типа в тип.
Помогите сделать строку в примере и дайте ссылок на то, как выполнять преоб...Вопрос № 101546: Приветствую! Как на bcb вызывать стандартные функции, написанные самим
bcb? Например: if (x == 0 ) вызвать функцию formshow. ...Вопрос № 101583: Здравствуйте господа программисты разьястните пожалуйста один параметр настройки проджекта "Character Set", что в группе "General", в чём здесь принципиальное различие м/у Unicode и Multi-Byte Character, и почему в Unicode строка ...
Вопрос
№ 101.432
Уважаемые эксперты, подскажите, пожалуйста, как в C++Builder 6 передать информацию в порт LPT и прочитать данные пришедшие в него с подключенного устройства (не принтера).
Отправлен: 09.09.2007, 21:43
Вопрос задал: 1Beginner1 (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Терсков Сергей
Здравствуйте, 1Beginner1!
На сайте www.pcports.ru есть раздел Статьи. В нем вы найдете руководство по программированию LPT-порта. А вообще сайт этим не ограничен и содержит много информации по работе с различными портами и микроконтроллерами.
Ответ отправил: Терсков Сергей (статус: Студент)
Ответ отправлен: 10.09.2007, 03:13 Оценка за ответ: 3 Комментарий оценки: Спасибо. Информация интересная, но примеры там для Microsoft Visual C++ 6.0, а у меня Borland C++ Builder 6. К сожалению моих знаний пока не хватает для использования полученной информации в этой системе. Вот такая невезуха :-)
Вопрос № 101.495
Уважаемые эксперты!
Задаю свой вопрос уже в третий раз и снова по-новому.
Пишу тестирующую программу на BCB5.
Первая форма - регистрационная. Здесь пользователь вводит свои ФИО и нажимает предложенную ниже кнопку "Начать тестирование". По нажатию на кнопку, создается файл для записи результатов тестирования + пользователь переходит ко второй форме - форма тестирования.
Вторая форма открывается уже с первым считанным из файла вопросом. Под вопросом располагаются три кнопки - возможные варианты ответа на вопрос: "Полностью согласен", "Частично согласен", "Не согласен". Нажимая по одной из кнопок, пользователь получает разное количество баллов. Все продолжается до тех пор, пока не конец первого файла с вопросами.
Как только программа показала все вопросы первого файла, кнопки для ответов блокируются, вместо них становится активной кнопка "Перейти на следующий шаг". Нажав эту кнопку, в файл результатов записывается сумма баллов, которые пользователь заработал за первый этап тестирования + пользователь должен перейти ко второму этапу тестирования в этой же форме. Т.е. должен осуществиться переход от одного файла с вопросами к другому + вывод первого вопроса второго файла с вопросами в эту же форму + разблокировать
кнопки для дачи ответов.
У меня все работает только один раз. Другими словами, не получается организовать циклическое выполнение программы. Как это правильно осуществить.
Спасибо всем!!
Нужно чтоб вопросы теста располагались в разных файлах. Каждый файл с вопросом - отдельный раздел. Необходимо организовать переход между файлами. Делаю так:
Отвечает: Irina Surina
Здравствуйте, Stacey_campbell!
Создаете массив имен файлов и перебираете. Или перебираете все файлы, находящиеся в одном каталоге. Или нумеруете файлы, перебираете по номерам. Напишите конкретнее, что Вы делаете, и что не получается
Ответ отправила: Irina Surina (статус: 1-ый класс)
Ответ отправлен: 10.09.2007, 18:20
Отвечает: Sov
Здравствуйте, Stacey_campbell!
Есть файлы с вопросами question_1.txt question_2.txt... Каждый вопрос это
отдельная строка. Хатя бы 1 строка(вопрс) в каждом файле есть
Для каждого цикла вопросов результаты выводятся в файлы res1.txt res2.txt...
Приложение:
Ответ отправил: Sov (статус: 7-ой класс)
Ответ отправлен: 10.09.2007, 22:06
Вопрос № 101.524
Доброе время суток эксперты!
Скажите как мне побороть преобразование типов. В с++ это какая-то жесть :-)
Никак не могу понять, как преобразовывать из типа в тип.
Помогите сделать строку в примере и дайте ссылок на то, как выполнять преобразования.
Отвечает: Aristos
Здравствуйте, Уваров Андрей Александрович!
Дело в том, что в С/С++ строка представляется массом целых чисел (размером 1 байт (char) для ANSI, 2 и больше байт (wchar_t) для UNICODE), обычно заканчивающийся нулём.
(Напомню, что массив в С/C++ - это непрерывная область памяти, занимаемая однотипными элементами, и представляется указателем на первый элемент. Индексация элементов идет с 0.)
Копирование и конкатенация (сложение) "строк" делается с помощью функций (например, strcpy и strcat), которые работают с элементами массива. Длина "строки" определяется путем нахождения количества элементов массива до первого нулевого элемента.
Единственная поддержка строк предоставляемая в С/С++ - это символьные и строковые константы вида 'a' и "srting". Но, фактически, это те же целые числа и массивы целых чисел (с нулем на конце). Кроме того, 'a' - это символ, а "a" - строка, представляемая массивом из 2х элементов ('a' и 0).
Поэтому числа и строки принципиально не приводимы друг к другу как типы (с помощью опрераторов приведения вроде (float) или (int)).
Для того, чтобы получить _предсталение_ числа в виде строки и, наоброт, из строкового представляения получить число, необходимо использовать специальные функции. Таких функций, на самом деле, достаточно много, вот некоторые из них (входящие в стандартную библиотеку):
atoi - переводит строковое представление в число типа int
atof - переводит строковое представление в число типа double (или float)
itoa - представляет число типа int в виде строки
_gcvt - представляет число типа double (или float) в виде строки
Вы можете посмотреть наличие функций аналогичных FloatToStr, которые идут с компилятором от Borland.
В приложении ваш пример с использованием стандартных функций.
ps: по поводу вашего примера, удобнее было бы хранить все значения в виде чисел, а к строкам обращаться только, например, для вывода на печать или предоставления пользователю в виде сообщений.
pps: если что то останется непонятным, пишите пс.
Приложение:
--------- нет ничего невозможного
Ответ отправил: Aristos (статус: 5-ый класс)
Ответ отправлен: 10.09.2007, 17:15 Оценка за ответ: 5 Комментарий оценки: Очень большое спасибо! Все так понятно! И теория и практика. А главное работает.
Отвечает: kool
Здравствуйте, Уваров Андрей Александрович!
Так делать
MbPerDay = FloatToStr( float( stat.freeMb )/DaysRemains );
низя.
Можно так
strcpy(MbPerDay,FloatToStr( float( stat.freeMb )/DaysRemains ));
Удачи!
--------- I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 10.09.2007, 20:05
Отвечает: Зелик Колабухин
Здравствуйте, Уваров Андрей Александрович!
Я полагаю, что Вы с помощью float( stat.freeMb ) желаете преобразовать строку в число. Но stat.freeMb - это указатель на массив из ЧИСЕЛ типа char, т.е. char *. Похоже, что компилятор не позволяет преобразовывать указатели во float. Но это вам и не нужно.
К тому же преобразовываются в с++ числа в числа. И чтобы лучше это представлять, записывайте преобразование в виде (float) stat.freeMb. Тогда четко видно, что программа должна взять то, что находится в stat.freeMb и понимать это как тип float.
Ну а в даном случае придется посимвольно пробежаться по stat.freeMb[] и получить число в численном виде.
И еще, по-моему FloatToStr не стандартная функция. Если она из другого места программы, то должна возвращать указатель на массив из char (если смотреть по программе). Но в программе идет присвоение полученного указателя переменной, которая указывает на совершенно другой массив. Если компилятор пропустит это, то выделенные через char MbPerDay[200]; 200 char'ов зависнут без переменной, которая на них указывает. Но я думаю, что скорее всего и здесь будет ошибка.
С другой стороны, при использовании sprintf нет необходимости делать FloatToStr. Думаю, что вместо %s в sprintf нужно просто написать %d (если не ошибаюсь, т.к. пишу по памяти) и тогда sprintf сама сделает все, что нужно.
Таким образом, пишем sprintf( StatPerDay, "В день: %d Мб", My_float( stat.freeMb )/DaysRemains);.
Ответ отправил: Зелик Колабухин (статус: 3-ий класс)
Ответ отправлен: 11.09.2007, 11:51
Вопрос № 101.546
Приветствую! Как на bcb вызывать стандартные функции, написанные самим
bcb? Например: if (x == 0 ) вызвать функцию formshow.
Все функции VCL вызываются через косвенный доступ, то есть с применением "->".
if(x==0) Form1->Show();
// либо
if(!x) Form1->Show();
Ответ отправил: Rockie (статус: 3-ий класс)
Ответ отправлен: 10.09.2007, 19:05 Оценка за ответ: 5
Вопрос № 101.583
Здравствуйте господа программисты разьястните пожалуйста один параметр настройки проджекта "Character Set", что в группе "General", в чём здесь принципиальное различие м/у Unicode и Multi-Byte Character, и почему в Unicode строка ниже выдаёт непонятно чё "КРЯКОЗЯБЛИКИ"
Какой параметр ЛУЧШЕ использовать и почему
Отвечает: Sergey A. Wedensky
Здравствуйте, Новак Александер Васильевич!
В зависимости от этого параметра определяется кодировка строк, используемая по умолчанию в Вашей программе. Большинство API-функций, принимающих строки имеют 2 варианта - юникодный и ANSI, например, CreateWindowA и CreateWindowW. В качестве строковых параметров они ожидают соответственно char* и wchar_t*. В заголовочных файлах определены макросы на каждую такую функцию, например макрос CreateWindow, который при использовании юникода (#define _UNICODE - что и делает параметр компилятора) определен как CreateWindowW,
а ANSI или MBCS - CreateWindowA.
Какой набор символов выбрать - Вам решать. Например, если работа ведется в основном с юникод-строками (чтение из файлов и пр.), удобнее выставить юникод всему проекту.
Для задания строковых констант рекомендую пользоваться макросом _T(), который при использовании юникода добавляет префикс L к строке, превращая ее в юникод-строку.
Например, _T("MainWINDOW") разименуется в L"MainWINDOW" если _UNICODE определено, и просто в "MainWINDOW", если нет.
Ответ отправил: Sergey A. Wedensky (статус: Студент)
Ответ отправлен: 11.09.2007, 10:24 Оценка за ответ: 5 Комментарий оценки: ЯСНЕНЬКО!!!!%-)