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

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

Автор: 0Vovan0
Дата сообщения: 29.05.2006 03:48
HANDLE
Большое спасибо, но..
Из твоего поста я понял как подогнать решенный вариант под себя, но толком не понял что делать.
Если не в тягость, можно обьснить более доступным языком что значит эта инфармация о состоянии устройства и т.п. В чем вообще смысл этой программы? Поврторюсь еще раз, мы толком ничего не успели пройти, недавно сказали чтло по указателям лабюы делать не надо, так что обьем знаний невелик - тольком ничего и не прошли за семестр.
Автор: Mickey_from_nsk
Дата сообщения: 29.05.2006 07:22
0Vovan0
Многие устройства, подключенные к компьютеру достаточно медленные (или используют медленные интерфейсы типа COM). Многие (особенно промышленные) устройства по разрядности шин данный и прочим деталям не совпадают с PC. Часто встречаются ситуации, когда количество устройств на одной шине (одном контроллере) не должно превышать 2-4-8 штук, а количество команд для него тоже достаточно мало. Многие устройства используют старые, но широко используемые интерфейсы (типа SCSI), при разработке которых инженеры не могли себе позволить выделить по байту на каждое поле команды или данных.
В общем, куча причин, по которым требуется чтобы в одном байте или слове содержалось более одного параметра. Для этого применяется механизм упаковки.
Делается это или как приведено выше, или через битовые поля, например так:

Код:
struct PackedInfo
{
int C : 3;
int U : 5;
int E : 6;
int reserved : 1
int B : 1;
}

...
PackedInfo pi = readPackedInfoStructure(...);
cout << "C = " << pi.C << " U = " << pi.U << " E = " << pi.E << "B = " << pi.B << endl;
Автор: 0Vovan0
Дата сообщения: 30.05.2006 01:41
Mickey_from_nsk
Вот как оно, спасибо, разьяснил
Автор: AnGo
Дата сообщения: 31.05.2006 07:30
Hi, All!
Помогите разобраться с темплейтами.
Этот код нормально работает под VC++, но надо чтобы работал и под BCB 6.

template <class Type,class DataType2=NodeData<Type> > class Tree; (стр. 9)

template <class Type> class NodeData
{
private:
// тело класса

};


template <class Type,class DataType2=NodeData<Type> > (стр. 35)
class Tree : private Ref<DataType2> (стр. 36)
{
    typedef Ref<DataType2> NodeBase;
public:
    typedef Tree<Type> Node;
// тело класса
};

При компиляции под BCB жалуется на

template <class Type,class DataType2=NodeData<Type> > class Tree;

[C++ Error] tree.h(9): E2041 Incorrect use of default
[C++ Error] tree.h(9): E2428 Templates must be classes or functions
[C++ Error] tree.h(9): E2141 Declaration syntax error
[C++ Error] tree.h(35): E2041 Incorrect use of default
[C++ Error] tree.h(35): E2428 Templates must be classes or functions
[C++ Error] tree.h(35): E2238 Multiple declaration for 'NodeData'
[C++ Error] tree.h(9): E2344 Earlier declaration of 'NodeData'
[C++ Error] tree.h(35): E2141 Declaration syntax error

Ежели поступим следующим образом, сделаем предварительное объявление
перед строкой 9

template <class Type> class NodeData;

то тогда жалется уже по-другому:

[C++ Error] tree.h(36): E2148 Default argument value redeclared for parameter 'DataType2'

Что-то совсем лыжи не едут.
Что не так в этом коде?
Автор: WiseAlex
Дата сообщения: 31.05.2006 10:41
AnGo
попробуй из

Цитата:
template <class Type,class DataType2=NodeData<Type> > class Tree; (стр. 9)

сделать так:

Код: template <class Type,class DataType2 > class Tree; (стр. 9)
Автор: AnGo
Дата сообщения: 31.05.2006 12:38
WiseAlex

Все - проблема снята, сделал как обычно.
Снял объявление умолчания в стр. 35.
Автор: DeviL
Дата сообщения: 02.06.2006 12:22
Привет народ!
Возник такой вопрос по ссылкам: в чем различие?

Код: const int &i
int const &i
int & const i
Автор: RedLord
Дата сообщения: 02.06.2006 13:58
const int &i
int const &i

ссылка на константу
i = 5; // error l-value specifies const object

int zz = i;

можно только читать


ссылка на не константу
int & const i
i = 5; // Ok
int zz = i;
можно и читать и писать

в данном случае const не нужен.
Автор: SaDFromSpb
Дата сообщения: 02.06.2006 15:26
Хм.. а у меня
int & const i; // error: 'const' qualififers cannot be applied to 'int&'
Да и вообще смысл этой записи никак понять мне не удается.
Автор: RedLord
Дата сообщения: 02.06.2006 15:36
SaDFromSpb

Цитата:
в данном случае const не нужен

и по стандарту - это так.
Но на VC 6.0 - только warning.
на компилирах с EDG ядром (Intel, Comeau) - error


Автор: bombastic
Дата сообщения: 02.06.2006 19:44
Проблема: проэкт скомпелирован в 2 выполняемых файла (*.exe). Нужно запускать один за другим.

Вопрос: какую команду/метод нужно вставить в код, чтобы запустить *.exe файл?
Автор: RedLord
Дата сообщения: 02.06.2006 20:00
CreateProcess, семейство _exec - смотри MSDN
Автор: LLexa
Дата сообщения: 03.06.2006 01:06
Народ ПОМОГИТЕ!!
Неделю бъюсь над задачей:
" Дополнить текст строкой, состоящей из первых слов всех строк" =(
Я знаю, что (нужно) можно действовать через pos, string,substring,ansistring
( в C++ Builder)
Автор: koderr
Дата сообщения: 06.06.2006 11:06
Вот простенькая прога:

Код:
#include <windows.h>
int main()
{
    HFILE hFile;
    DWORD dwSize;
    DWORD nBytes;
    char *lpBuffer1;
    char *lpBuffer2;
    int i = 0, j = 0;

    hFile = CreateFile("input.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    if(hFile != -1)
    {
        dwSize = GetFileSize(hFile, NULL);
        lpBuffer1 = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize);
        lpBuffer2 = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize);
        ReadFile(hFile, lpBuffer1, dwSize, &nBytes, NULL);
        lpBuffer1[nBytes] = 0;        // write terminating byte to source buffer
        lpBuffer2[j] = 13;            // write
        lpBuffer2[j + 1] = 10;        //        CRLF
        j += 2;                        //            to destination buffer
        while(lpBuffer1[i] != 0)
        {
            while(lpBuffer1[i] == ' ' || lpBuffer1[i] == '\t')
            {
                i++;                            // skip leading spaces and tabs
            }
            while(lpBuffer1[i] != ' ' && lpBuffer1[i] != '\t' && lpBuffer1[i] != 13)
            {
                lpBuffer2[j] = lpBuffer1[i];    // write to destination buffer
                i++;
                j++;
            }
            lpBuffer2[j] = ' ';
            j++;
            while(lpBuffer1[i] != 10) i++;        // feed line
            i++;
        }
        lpBuffer2[j] = 0;                        // terminating character
        SetFilePointer(hFile, 0, NULL, FILE_END);
        WriteFile(hFile, lpBuffer2, j, &nBytes, NULL);
        CloseHandle(hFile);
        HeapFree(GetProcessHeap(), 0, lpBuffer1);
        HeapFree(GetProcessHeap(), 0, lpBuffer2);
    }

    return 0;
}
Автор: JekaCh
Дата сообщения: 14.06.2006 11:42
Здравствуйте! Если кто знает подскажите плиз. Программка загружает текстовый файл и считывает из него данные. Проблема следующая:
1. Нужно проверить текстовый файл перед загрузкой на соотвествие шаблону. Шаблон следующий - 8 чисел разделённых табулятором. Как это сделать?
2. Можно как-то получить число строчек в файле не считывая весь файл? Или считать первое число в последней строчке файла не считывая перед эти весь файл? Просто приходится программой загружать большие файлы хочу сделать ProgressBar загрузки.
Автор: zMD
Дата сообщения: 14.06.2006 18:20
Никогда не знал C++, ну да и не особо переживал по этому поводу. Но вот один момент никогда не давал мне покоя.
Borland C++ (не Builder)
Допустим, создаю окошко функцией window.
Начинаю для этого окошка рисовать превдографикой красивую такую рамочку. Все отлично рисуется, до самого последнего символа. Когда ставлю последний символ, гадкий DOS перевод строку, возращает указатель на первый стобец, в результате чего возникает неприятный артефакт - две последние строки дублируются, рамка смещается вверх на 1 строку, ну да Вам, думаю, знакома эта ситуация. Посему вопрос - как же все-таки красиво нарисовать эту дурацку рамочку в псевдографике?
Автор: Abs62
Дата сообщения: 14.06.2006 20:22
JekaCh
1. Считать первую строку (fgets), из неё попробовать считать 9 чисел в соответствии с форматом шаблона (sscanf). Если получилось 8 - оно.
2. Нельзя. Но если длина всех строк одинакова, можно взять размер файла и разделить его на длину строки, не забыв про CR/LF.

zMD
BC 3.1 и DOS программа? Тогда стоит использовать консольные функции вывода из того же conio.h - cputs, cprintf, putch, gotoxy.
Автор: LLexa
Дата сообщения: 14.06.2006 21:45
KODERR
-Огромное СПАСИБО!
П.С. Всё прокатило!!!
Автор: zMD
Дата сообщения: 14.06.2006 23:46
Abs62, неа, та же фигня. Правда, я поборол природную лень и открыл help (в который раз), и, о чудо!, я обнаружил простую такую функцию под названием putchar, которая частично решила мою проблему (так как ей по-ходу наплевать в окошке она символ ставит или где, просто сдвигает курсор на одну позицию вправо или вниз), т.е. window я могу теперь рамочкой обводить, но сделать рамку из символов для всего экрана не могу (все равно переводит строки).
Автор: Abs62
Дата сообщения: 15.06.2006 00:31
zMD
Тогда задействуй puttext всё из того же conio.h. Уж он-то на курсор не влияет, насколько я помню.
Автор: Mickey_from_nsk
Дата сообщения: 15.06.2006 10:19
JekaCh
2. А тебе действительно прогресс бар охота в строчках мерить? Можно получить размер файла и по мере его считывания получать текущую позицию. Это и отображать на прогресс-баре.
Автор: zMD
Дата сообщения: 15.06.2006 13:07
Abs62, спасибо, текст, действительно не переносит, но возникла другая проблема.
Насколько я понял, эта функция выводит текст следующим образом: символ/атрибут/символ/атрибут, в общем-то ничего сложного, но тут какой-то совершенно жутчайший атрибут текста. Никак не могу подобрать для белого символа на черном фоне. Вернее навскидочку это будет что-то вроде: § (0x15), но как его засандалить в текст типа:
putchar(1,2,2,2, "t ");
после буквы t, не имею ни малейшего понятия.
Автор: Abs62
Дата сообщения: 15.06.2006 20:55
zMD

Цитата:
но тут какой-то совершенно жутчайший атрибут текста.

Ничего жуткого в нём нет - обычный байт.
Младшие 4 бита - цвет текста (0-15).
Следующие 3 бита - цвет фона (0-7).
Самый старший бит заставляет текст мигать, если установлен.

Цитата:
putchar(1,2,2,2, "t ");

puttext(1,2,1,2, "t\x0F");

Но может быть проще сделать простенькую функцию, которая будет формировать нужную строку и выводить её на экран. Что-нибудь вроде этого:

Код: #define BUFFER_SIZE 80
int PutString(int x,int y, const char *text, unsigned char attribute)
{
char Buffer[BUFFER_SIZE*2];
int i,n;
n=strlen(text);
if(n>BUFFER_SIZE) n=BUFFER_SIZE;
for(i=0;i<n;i++) {
Buffer[i*2]=text[i];
Buffer[i*2+1]=attribute;
}
return(puttext(x,y,x+n-1,y,Buffer));
}
Автор: zMD
Дата сообщения: 15.06.2006 21:29
Abs62, спасибо еще раз, что подсказал как записывать 16-ричные числа.
По поводу функции, конечно, буду выводить строку целиком, просто хотел прояснить на примере.
Автор: vserd
Дата сообщения: 16.06.2006 10:09
Всем доброго здравия!!!
Поясните такую проблемку.
Есть проект в котором определен класс.
Есть другой проект в котором я хочу использовать этот класс.
Структура проектов
первый \source\
второй \source\test\
в .сpp файле второго проекта написал
#include "../prj1.h"
объявления класса подхватилось. Но при линковке вылазит сообщение Link 2001 unresolved external simbol ... и дальше имя метода класса.
Если включить соответсвующий prj1.cpp в проект то все работает. Но его включение загромождает проект. В Delphi я просто указывал в таком случае что нужно искать в определенной папке и все, а как в VC++ 6.0 это можно сделать?

Автор: WiseAlex
Дата сообщения: 16.06.2006 10:26
vserd
Я конечно могу ошибаться, но, по-моему, другого метода нет. В отличии от delphi в с++ нет понятия библиотеки (а жаль...).
Автор: Mickey_from_nsk
Дата сообщения: 16.06.2006 11:41
vserd
Можно сделать библиотеку классов и зацепить ее из второго проекта.
Автор: vserd
Дата сообщения: 16.06.2006 12:01
WiseAlex, Mickey_from_nsk
Давайте немного переформулируем задачку.
Есть проект, разбросанный по разным папкам. Как осуществить генерацию финального EXE? Ведь по сути у меня такая картина: Есть несколько файлов исходников и заголовочных. С заголовочными я разобрался, там либо указывать относительные пути, либо прописывать в параметре поиска. Мне нужен такой-же параметр для .cpp. чтобы линкер искал исходники вне текущей папки. Ведь никто в здравом уме не будет скидывать сотни и тысячи файлов в одну папку ради компиляции проекта. Как-то эту проблему решают, и решение на поверхности, просто у меня нет нужных ориентиров куда копать. :(
Автор: vhl
Дата сообщения: 16.06.2006 12:06
Народ, кто-нибудь знает где найти инфу по оптимизации под HT/многоядерность? А то порыл инет - так ничего толкового не нашел
Автор: WiseAlex
Дата сообщения: 16.06.2006 15:24
vserd
как я понял нужно взять и перенести проект на другой компьютер (в др. место) и там собрать.
Если так, то в проете запоминаются относительные пути. главное расположить все аналогично - т.е. если есть проект в c:\a\b а все зависимости в c:\a? а располагаем в d:\b\bb\bbb то щависимости лягут в d:\b\bb - т.е. сохраняем относительные пути (относительно самого проекта)
Надеюсь понятно (а то сам могу запутаться). Достоверность не 100%

Цитата:
чтобы линкер искал исходники вне текущей папки.

линкер с исходниками вообще-то не работает В общем случае приходится указывать компилятору сам cpp (в том месте где он есть)

Добавлено:
vhl
посмотри например здесь
На каком уровне нужно оптимизировать и почему вопрос в ветке по С++?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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