Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: Abs62
Дата сообщения: 03.02.2007 18:12
Qraizer

Цитата:
На него подаётся кварц с немного меньшей 2МГц частотой

Намного меньшей - 1.19318 МГц. Хотя это и непринципиально.

Цитата:
Вот вам и разница в точности таймеров.

Функции задержки обычно int 08H не пользовали. BC 3.1, к примеру, привязывался непосредственно к счётчику канала таймера, BP 7.0 тупо крутил циклы задержки. А 55 мс - это дискретность хода RTC.
Автор: PavelO
Дата сообщения: 04.02.2007 00:18
Спасибо за грамотное объяснение разницы delay и Sleep.
А вот еще фишка одна: написал код, откомпилировал его, запускаю, а там вместо русских букв абра-кадабра. При этом в моей программе вводить с клавиатуры можно русские буквы, а если через принтф выводишь, то получается абра-кадабра. может кто подскажет как от этого избавиться. Спасибо.
Автор: Lyrik
Дата сообщения: 04.02.2007 00:42
PavelO
попробуй OemToAnsi, а лучше приведи код
Автор: Abs62
Дата сообщения: 04.02.2007 01:05
PavelO
Почему вместо русских букв в консольном приложении выводится мусор?
Автор: veronica b
Дата сообщения: 04.02.2007 07:47
Qraizer
Значит тогда, в 1996 году я мог, сформировать прямоугольныу импульсы с точность в 1мс, используя функцию delay()? Раз вы так все помните, вы что продолжаете работать в MS-DOS?
Автор: royt
Дата сообщения: 05.02.2007 08:17
LuckyELF
Цитата:
что это значит? вот например у меня есть приложение my_app.exe, которое лежит в d:\prj\my_app\, и когда я его запускаю получается такая строчка d:\prj\my_app\my_app.exe, вот ее я и хотел получить.
а о чем вы я не знаю

Например: работаю в командной строке, текущий каталог C:\TEMP, набираю "d:\prj\my_app\my_app.exe", жму Enter. Тогда значение "из какой директории запустили программу" можно интепретировать двояко:
1) директория, в которой находится файл запущенного процесса.
2) директория, находясь в которой ("текущая директория", есть такое понятие) мы инициировали запуск процесса.
Думаю, что большинство программистов подумали бы про второй вариант. В общем теперь ясно, вопрос закрыт.

Kostin275
Так вопрос то в чем заключается?
Цитата:
она выводит как читаетю файл
рпограмма
Не компилируется программа? Не работает конкретная функция? Надо написать отсутствующую функцию?
Автор: Qraizer
Дата сообщения: 05.02.2007 15:53
veronica b
Цитата:
Значит тогда, в 1996 году я мог, сформировать прямоугольныу импульсы с точность в 1мс, используя функцию delay()? Раз вы так все помните, вы что продолжаете работать в MS-DOS?
Уже нет. Но иногда... Приходится. Да и не так уже хорошо я всё помню - вон, единичку после десятичной запятой в частоте кварца упустил.
Цитата:
Намного меньшей - 1.19318 МГц
Просто в своё время был авторитетным системщиком под DOS и Win9x, знания остались. Под WinNT пока не настолько авторитетный
Насчёт формирования импульсов с точностью 1мс - наверное да, только что касается delay() - вот это вряд ли. Как справедливо заметил Abs62, RTLные функции паскаля и си/сиплюсплюсов просто крутили цикл с опросом счётчика "переполнений делителя" в области данных BIOS. Их по любому надо было бы заменить. А кроме того перехватить IRQ0, перепрограммировать таймер... И что касается прямоугольности - это ещё и режим таймера менять, а как к этому отнесётся контроллер прерываний, я честно говоря не представляю. Возможно, что на ISA-е и прохляет, но на PCI получится жёсткий висняк. Проще самому отщёлкивать время с точностью по миллисекунды и программить 2-й канал. Могу поискать, где-то у меня были исходники таймера, работающего с микросекундной точностью с погрешностью, зависящей от скорости процессора. Чем выше, тем быстрее он будет способен реагировать на значение счётчиков таймера.
Автор: LuckyELF
Дата сообщения: 06.02.2007 19:44

Цитата:
Например: работаю в командной строке, текущий каталог C:\TEMP, набираю "d:\prj\my_app\my_app.exe", жму Enter. Тогда значение "из какой директории запустили программу" можно интепретировать двояко:
1) директория, в которой находится файл запущенного процесса.
2) директория, находясь в которой ("текущая директория", есть такое понятие) мы инициировали запуск процесса.
Думаю, что большинство программистов подумали бы про второй вариант. В общем теперь ясно, вопрос закрыт.


LOL
текущая директория - это помоему чисто ДОСовское понятие.
а если открыто 3 консоли, все с разными "текущими каталогами", что тогда?
а если не открыто ни одной консоли, тогда нет текущей директории?
не знаю как там большинство программистов, но меньшенство дали мне правильный ответ
спасибо всем и большинству и меньшинству.

ЗюЫю "Есть приложение написанное на WinAPI, как получить путь к запускному файлу? т.е. узнать из какой директории запустили программу?" - извиняюсь за второе предложение, которое сбило вас с толку.
Автор: TeXpert
Дата сообщения: 06.02.2007 20:34
LuckyELF

Цитата:
Есть приложение написанное на WinAPI, как получить путь к запускному файлу

Работает также __argv[0]
Автор: rain87
Дата сообщения: 06.02.2007 21:17
LuckyELF
сарказм ни к чему. у каждого приложения свой текущий каталог. поскольку дос был однозадачным (кстати, почему был? он и щас однозадачный ), то текущий каталог был один. так сказать на всех

по поводу же "как узнать полный путь и имя программы из неё самой" - надо взять 0й параметр из командной строки, система туда подставляет именно полный путь и имя программы
Код: #include <stdio.h>

void main(int argc,char* argv[])
{
printf("Programm is %s\n",argv[0]);
}
Автор: Mickey_from_nsk
Дата сообщения: 07.02.2007 06:16
rain87

Цитата:
система туда подставляет именно полный путь и имя программы

Все таки, ИМХО, не полный, а строку запуска. Если при запуске указывался относительный путь, он туда и пропишется.
Цитирую MSDN:

Цитата:
By convention, argv[0] is the command with which the program is invoked

Однако эта информация в сочетании с рабочим каталогом и содержимым путей PATH может дать намек, из какого места была запущена программа
В UNIX для этого есть утилита which.
Автор: xdude
Дата сообщения: 07.02.2007 06:28

Цитата:
текущая директория - это помоему чисто ДОСовское понятие.

Да уж... Что тут скажешь... Поставлена жирная точка в дальнейшей эволюции всех операционных систем. ДОС рулит однозначно


Цитата:
а если открыто 3 консоли, все с разными "текущими каталогами", что тогда?
а если не открыто ни одной консоли, тогда нет текущей директории?

Попробовал бы ты интереса ради написать маленькую программrу, которая выводила бы в диалоговом окне (или в консоли) результат работы функции _getcwd(...) (что есть ни что иное, как текущий каталог). А потом с этой программой побаловался: открыл 3 разных консоли, и позапускал её из этих консолей из разных папок, например, засунул бы её в папку c:\test1\:

Код:
c:\test1>test.exe
...
c:\test1>cd \
c:\>c:\test1\test.exe
...
c:\>cd c:\windows
c:\windows>c:\test1\test.exe
...
Автор: Mickey_from_nsk
Дата сообщения: 07.02.2007 06:43
О! Кажись виндовую функцию нарыл:
GetProcessImageFileName.
Автор: xdude
Дата сообщения: 07.02.2007 06:51
Mickey_from_nsk
Я ж вроде уже написал здесь

Код:
char buf[1024]; // или [_MAX_PATH]
GetModuleFileName(GetModuleHandle(NULL), buf, sizeof(buf));
Автор: TeXpert
Дата сообщения: 07.02.2007 07:19
xdude

Цитата:
Это сработает только для консольных приложений, с функцией main(...). Для чисто оконных приложений, с функцией WinMain(...), такой фокус не прокатит.

С __argv[0] прокатит.
Автор: HighwayStar
Дата сообщения: 07.02.2007 14:12
У меня есть такой вопрос:
Как в C++ под win32 менять цвет текста в консоли, причем не всего сразу как можно сделать например командой
system("color FC");
а одного символа. или как можно по другому выделить один символ в строке?
Автор: Mickey_from_nsk
Дата сообщения: 07.02.2007 14:45
Смотри в сторону SetConsoleTextAttribute
Автор: Qraizer
Дата сообщения: 07.02.2007 16:43
xdude
Кроме адаптера для метода класса тебе нужен ещё биндер, который инкапсульнёт экземпляр. Вот простой пример:
Код: #include <iostream>
#include <functional>

// Класс отображатель
struct CClass3
{
void set_progress(int progress)
{
std::cout << "Progress is " << progress << std::endl;
}
};

CClass3 class3; // Экземпляр отображателя

struct CClass1
{
// Callback-функтор
typedef std::binder1st<std::mem_fun1_t<void, CClass3, int> > CallbackFunc;

CClass1():cbFun(std::bind1st(std::mem_fun(&CClass3::set_progress), &class3)){}

void progress(int currentProgress)
{
cbFun(currentProgress);
}

private:
CallbackFunc cbFun;
};

CClass1 class1;

int main()
{
class1.progress(1);
class1.progress(3);
class1.progress(7);
}
Автор: IUnknown777
Дата сообщения: 07.02.2007 19:13
Добрый день.
Подскажите почему компилятор ругается на RUNTIME_CLASS(CGridCellBut)
ошибка - 'CGridCellBut' : is not a class or namespace name
Класс определен и виден средой.

программирую на VS.

Автор: RedLord
Дата сообщения: 07.02.2007 19:29
IUnknown777
ИМХО: нет include хедера, где обявлен класс CGridCellBut?
Автор: IUnknown777
Дата сообщения: 08.02.2007 15:17
нет, проблема была в том, что в
#if !defined(
повторящийся идентификатор)))))))

Автор: RedLord
Дата сообщения: 08.02.2007 16:09
IUnknown777

Копирование
Автор: Dayver2009
Дата сообщения: 08.02.2007 19:53
Помогите Пожалуйста!!!Уже не знаю что делать.

Есть такой программный код:

Код:
int fhandle = FileOpen(ExtractFilePath(Application->ExeName)+"key.dat", fmOpenRead);
if (fhandle == (-1)) throw Exception("Не могу открыть файл");
__int32 content = 0;
int cou = FileRead(fhandle, &content, sizeof(content));
FileClose(fhandle);
if (cou != sizeof(content)) throw Exception("Проблемы с размером файла данных");
int K[sizeof(content)*8];
for (int i(0), n(0); i < sizeof(content); i++)
for (int j=0x80; j; j >>= 1)
K[n++] = (content & (j << i*8))? 1 : 0;
Автор: veronica b
Дата сообщения: 09.02.2007 09:27
Dayver2009
Скажите, вы используете сдесь WIN32 API? Что то похоже, но не то. Короче. что вы используете?
Автор: distance
Дата сообщения: 09.02.2007 13:36
veronica b
судя по записи Application->ExeName и 'компонентом ComboBox' это наверное Borland C/C++ Builder (или как он там называется)


Добавлено:
Dayver2009
набросал функцию...

[more]
Код: #include <io.h>
#include <fcntl.h>
#include <tchar.h>

/*
    fileName - имя файла, откуда считывать
    dwCount - сколько байтов считывать
    v - буфера для возврата
*/

typedef std::vector<bool> V;

BOOL read_bits(LPCTSTR fileName, DWORD dwCount, V& v)
{
    _ASSERTE(fileName);

    int fh = -1;
    BYTE* pBuf = NULL;
    BOOL res = FALSE;

    do
    {
        // выделение память для буфера
        pBuf = new BYTE[dwCount];
        if (pBuf == NULL)
            break;
        
        // открываем файл
        fh = _topen(fileName, _O_BINARY | _O_RDONLY);
        if (fh == -1)
            break;
        
        // считываем данные
        int readed = _read(fh, pBuf, dwCount);
        if (readed != dwCount)
            break;

        // перегоняем байты в биты
        v.reserve(CHAR_BIT * dwCount);
        for(DWORD i=0; i < dwCount; i++)
        {
            for(int j=0; j < CHAR_BIT; j++)
            {
                bool curBit = (pBuf[i] & (1 << j)) ? true : false;
                v.push_back(curBit);
            }
        }
        res = TRUE;
    } while(FALSE);

    // подчищаем за собой
    delete[] pBuf;
    if (fh != -1)
    {
        _close(fh);
    }

    return (res);
}
Автор: Dayver2009
Дата сообщения: 09.02.2007 17:27
Да использую - Borland C++ Builder 6.0 без WIN32 API.

А есть ли другой способ реализовать даную задачу?
Спрашиваю потому как плохо умею работать с функциями.

(Попробовал скомпилировать выдало ошыбку :
[C++ Error] Unit1.cpp(51): E2268 Call to undefined function '_ASSERTE'

А если еще обявлять как вы написали то еще и такое:
[C++ Error] Unit1.cpp(31): E2451 Undefined symbol 'V'
[C++ Error] Unit1.cpp(31): E2379 Statement missing ;
[C++ Error] Unit1.cpp(32): E2268 Call to undefined function 'read_bits'
[C++ Error] Unit1.cpp(32): E2451 Undefined symbol 'v'
)

Как я понял здесь используются битовые поля? В них я вообще не разберусь.

Можно ли как то зделать все в таком стиле как я написал?
Автор: veronica b
Дата сообщения: 10.02.2007 10:49
Dayver2009

Цитата:
Он выполняет такие действия:
Считывает в бинарном режиме байты из файла "key.dat" который имеет размер 4 байта(32 бита) по методу - младшый байт по старшему адресу в файле,биты идут от старшего к младшему.
Далее записывает значение етих битов в масив К.

А почему тут нельзя использовать Run Time Library языка C? Это с файла "key.dat" считываются данные по 4 байта?
Автор: CrystalIT
Дата сообщения: 11.02.2007 20:09
Здравствуйте.
Есть такой код

int WINAPI WinMain(HINSTANCE, HINSTANCE, PTSTR, int)
{ --skip--
объявление переменных, открытие, создание файла
--skip--

dwBytesRead = GetWindowsDirectory( cTmpBuff, 0x400 );
WriteFile(hFile, cTmpBuff, dwBytesRead, &dwBytes, NULL);
dwBytesRead = GetSystemDirectory( cTmpBuff, 0x400 );
WriteFile(hFile, cTmpBuff, dwBytesRead, &dwBytes, NULL);

CloseHandle(hFile);

--skip--
}

При таком подходе все пишется в файл в одну строку, какую использовать winapi функцию, чтобы каждый раз при записи переводить каретку (filepointer) на новую строку?
Подскажите плиз начинающему.
Забыл сказать, все пишется и компилиться в Microsoft Visual C++ .NET(2002).
Автор: rain87
Дата сообщения: 11.02.2007 20:23
CrystalIT
перевод строки определяют 2 байта - 13, 10
т.е. когда ты записал строку, запиши ещё 2 байта, чтоб следующая строка писалась с новой строки
т.е.
int WINAPI WinMain(HINSTANCE, HINSTANCE, PTSTR, int)
{ --skip--
объявление переменных, открытие, создание файла
--skip--

int cr=0x0a0d;

dwBytesRead = GetWindowsDirectory( cTmpBuff, 0x400 );
WriteFile(hFile, cTmpBuff, dwBytesRead, &dwBytes, NULL);

WriteFile(hFile, cr, 2, &dwBytes, NULL); //переход на следующую строку

dwBytesRead = GetSystemDirectory( cTmpBuff, 0x400 );
WriteFile(hFile, cTmpBuff, dwBytesRead, &dwBytes, NULL);

CloseHandle(hFile);

--skip--
}

где-то так
хотя я для форматированного вывода всегда пользую fprintf
Автор: CrystalIT
Дата сообщения: 11.02.2007 20:45

Цитата:
WriteFile(hFile, cr, 2, &dwBytes, NULL); //переход на следующую строку


да честно говоря это я знаю, и это не сложно, но в этой функции второй параметр не может быть int, там может быть только указатель на буфер, в этом то вся и проблема.
int cr=0x0d; это я уже давно кумекаю как туда впихнуть .

Цитата:
где-то так
хотя я для форматированного вывода всегда пользую fprintf

да я бы с удовольствием , мне она тоже нравится, но линкер будет против
int WINAPI WinMain(HINSTANCE, HINSTANCE, PTSTR, int) точка входа не та, /SUBSYSTEM:WINDOWS, если подобное попробовать использовать(fprintf) то будет
unresolved external symbol(вроде правильно написал).
может как-то ещё можно.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.