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

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

Автор: wmlife24
Дата сообщения: 18.10.2007 22:56
Спасибо!!=))
Автор: Ape
Дата сообщения: 20.10.2007 11:55
Подскажите пожалуйста, как определить, что виндовая программа запускается под Linux в среде WINE?
OSVERSIONINFO не катит. WINE честно отдаёт версию установленной переменной версии винды.
В Kylix есть директива ifdef __linux__
Может есть какой нибудь стандартный способ определить linux?
Автор: mothes
Дата сообщения: 20.10.2007 17:22
Уважаемые форумцы, помогите с такой задачкой:
Разработать программу, выдающую двоичное представление трех заданных типов с выбранными значениями., т.е. пользователь выбирает тип, а потом вводит значение(произвольное)
У меня типы
long int
float
char

с long int я уже справился
с char не знаю какую функцию применить, и как, есть вроде chr() или atoi, но разобраться не могу
а с float вообще завал

Аомогите пожалуйста
Автор: Lyrik
Дата сообщения: 21.10.2007 00:57
mothes
Не совсем нормальный способ, но пойдет
[more]
Код: #include <iostream>

using std::cout;
using std::endl;

// функция преобразует четыре бита в их строковое представление
void
numToBin( char num, char *res )
{
    switch( num )
    {
    case 0x0:
        strcat( res, "0000" );break;
    case 0x01:
        strcat( res, "0001" );break;
    case 0x02:
        strcat( res, "0010" );break;
    case 0x03:
        strcat( res, "0011" );break;
    case 0x04:
        strcat( res, "0100" );break;
    case 0x05:
        strcat( res, "0101" );break;
    case 0x06:
        strcat( res, "0110" );break;
    case 0x07:
        strcat( res, "0111" );break;
    case 0x08:
        strcat( res, "1000" );break;
    case 0x09:
        strcat( res, "1001" );break;
    case 0x0A:
        strcat( res, "1010" );break;
    case 0x0B:
        strcat( res, "1011" );break;
    case 0x0C:
        strcat( res, "1100" );break;
    case 0x0D:
        strcat( res, "1101" );break;
    case 0x0E:
        strcat( res, "1110" );break;
    case 0x0F:
        strcat( res, "1111" );break;
    }
}

// функция получает из числа его двоичное представление
void
getBinary( void * value, size_t valueSize, char * result, size_t resultSize )
{
    if ( resultSize < valueSize * 8 + 1 ) {
        return;
    }

    char *revers = new char[valueSize];
    if ( NULL == revers ) {
        return;
    }

    char *ptr = (char*)value;
    for ( int i = valueSize-1; i >= 0; --i ) {
        revers[i] = *ptr;
        ptr++;
    }

    for ( size_t i = 0, j = 0; i < valueSize; ++i, j+=4 ) {
        numToBin( (revers[i]>>4)&0x0F, result+j );
        numToBin( revers[i]&0x0F, result+j );
    }
    delete revers;
    revers = NULL;
}

int
main( )
{
    float d = 100;
    char res[100] = { 0 };
    getBinary( &d, sizeof d, res, sizeof res );
    cout << res << endl;
    return (EXIT_SUCCESS);
}
Автор: mothes
Дата сообщения: 21.10.2007 01:21
есть такой нюанс, пользоваель должен сам выбрать какой тип ему нужен, и сам ввести число. т.е.
при запусе проги вылетает меню на экран
1) введите любое число типа float
2) введите любое число типа long int
3) введите любой символ типа char

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

спаисбо за помощь, надеюсь на вашу поддержку
Автор: ItsJustMe
Дата сообщения: 21.10.2007 01:43
mothes, странно, что ты задаешь этот вопрос в "Вопросах по C++", а не в "Задачах", ну да ладно
1. Пользователю незачем задавать тип числа. Разбирай его ввод так же, как это делает компилятор. Т.е
xxxx.xxx - double (8)
xxxx.xxxF - float (4)
xxx - int (4)
xxxLL, xxxi64 - long long (8)
'x' - wchar_t (2)
2. Как видишь, максимальный размер - 8 байт. (Или ты пишешь на IA64? ) Так что пиши ввод юзера в переменную, размером в 8 байт, предварительно обнулив ее, потом читай ее как long long и выводи в bin или hex.
Автор: mothes
Дата сообщения: 21.10.2007 01:50
я на всякий случай и там и там задал!

да но сам алгоритм преобразования не догоню, особенно для float, хотя сёдня в поисках решения пол дня провёл,
Автор: Lyrik
Дата сообщения: 21.10.2007 02:04
mothes
А моя прога не подходит?

Цитата:
сам алгоритм преобразования не догоню, особенно для float

вам надо представить float как в компьютере или просто как число вида 111100101.1010?
Автор: ItsJustMe
Дата сообщения: 21.10.2007 02:59
Алгоритм преобразования чего? float to long long?

Код:
long long p;
//some code
p = 0;
*((float*) &p) = 10.1;
//some code
Автор: AirB
Дата сообщения: 21.10.2007 09:09
Хелп!
Каким образом в С++ можно динамически создавать объекты с временем жизни=времени работы программы и областью видимости - в пределах модуля?

Кроме как выделить всю память сразу, в коде, а динамически в неё лишь записывать, я ничего придумать не могу. А сразу выделять - это не дело.
Автор: Rudia
Дата сообщения: 21.10.2007 10:48
mothes
Представляйте любой из этих типов в виде массива байтов:
char* p;
float f;
p=(char*)&f;
for (i=0; i<sizeof(float); i++)
{
printbyte(p[i]);
}
где printbyte - ваша функция, которая печатает сhar(байт) в двоичном виде, пишется элементарно используя сдвиг и битовые операции.
AirB
В С++ нет уборщика мусора, поэтому динамическое выделение памяти подразумевает что, если сами выделяем память, то сами и должные её освободить. И вообще ваша формулировка вопроса расплывчатая, приведите лучше конкретный пример того, что вам нужно сделать.
Автор: Lyrik
Дата сообщения: 21.10.2007 10:58
Rudia
А как быть с обратным порядком?
видимо нужно так:

Код: for (i=sizeof(float)-1; i>=0; i--)
{
printbyte(p[i]);
}
Автор: AirB
Дата сообщения: 21.10.2007 12:08
Rudia
Заранее не известно сколько объектов будет создано (от 5 до 50), нужно создавать их по ходу. И после создания они должны быть доступны не только функции, в которой были созданы, но и другим.
Автор: Mr Nobody
Дата сообщения: 21.10.2007 12:42
Rudia, как вклад в общее дело могу придложить функцию

Цитата:

void print_byte(unsigned char arg)
{
    unsigned char MASK = 0x80;
    int index;

    for(index = 0; index != 8; ++index)
    {
        printf(" %d ", (arg & MASK) ? 1 : 0);

        MASK >>= 1;
    }
}

Которая распечатывет побитовое представление любого байта.

Автор: WiseAlex
Дата сообщения: 21.10.2007 12:47
AirB
в .cpp файле:

static std::vector<object_type> g_Objects; //создаем вектор объектов в модуле
или вариации
static std::vector<object_type*> g_Objects; //создаем вектор указателей
static std::vector<boost::shared_ptr<object_type> > g_Objects; //создаем вектор указателей с автоматичеким удалением

ну или в стиле с что-то в таком духе
typedef struct {
object_type * g_objects[MaxObjectsNumber];
unsigned g_ObjectsCount;
} mystruct;
static mystruct g_data;
--
можешь почитать также про шаблон (паттерн) проектирования одиночка (singleton)
Автор: mothes
Дата сообщения: 21.10.2007 14:16
спасиб за программы, они все по чуть чуть подходят, я очень восхищен оперативностью вашей помощи и качеством.

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

тема: Внутримашинное предстовление данных

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

у меня заданные типы по таблице long int, float, char

я конечно пытаюсь вот сейчас собрать программу по кусочкам, но явно чёто мне не хватает.

Спасиб всем за Вашу помощь!
Автор: rain87
Дата сообщения: 21.10.2007 20:24
mothes
не понял. тут http://forum.ru-board.com/topic.cgi?forum=33&topic=8927#1 TheChampion и так, по-моему, всё написал. или я таки не понял?
Автор: ItsJustMe
Дата сообщения: 22.10.2007 01:35
for mothes
Раз уж я встрял в обсуждение этой проги, то надо как-то и до логического конца довести.
Ловите мега прогу.
Автор: AirB
Дата сообщения: 22.10.2007 15:15
WiseAlex
Спасибо, воспользуюсь std::vector<>.

UPDATE:
А как его использовать, если конструктора по умолчанию нет? В частности для VCL компонентов.
Автор: mothes
Дата сообщения: 22.10.2007 19:23
for ItsJustMe

А в какой программной среде вы писали свою программу. У меня к сожалению не получилось её откомпелировать. Пользуюсь Dev C++ 4.9.9.2

Там есть файлы


Код:
AssemblyInfo.cpp
NumberAsBin.cpp
stdafx.cpp
Автор: ItsJustMe
Дата сообщения: 22.10.2007 23:29
Visual Studio.
2005 подойдет.
Собственно, если вы не смогли это откомпайлить (за неимением, как я понимаю, VS) - не беда. Прочитать-то вы source в любом случае сможете
Смотрите функцию textBox1_TextChanged в файле Form1.h (в самом конце). Возможно, она поможет вам прояснить некоторые моменты. Удачи!
PS: Выкладываю exe-файл, чтобы вы могли посмотреть, а что, собственно, он делает
Автор: WiseAlex
Дата сообщения: 23.10.2007 10:40
AirB

Цитата:
А как его использовать, если конструктора по умолчанию нет? В частности для VCL компонентов.

а зачем там нужен конструктор по-умолчанию?
avector.push_back(myclass(parameters));
кроме того я привел разные варианты. в частности и для указателей
Автор: wmlife24
Дата сообщения: 23.10.2007 15:47
Программеры нужна Ваша помощь!
Помогите написать игру "Пятнашки" --в Visual studio-- Win32 Console project..

-------------------.
0 | 1 | 2 | 3 |
-------------------.
4 | 5 | 6 | 7|
-------------------.
8 | 9 | 10 | 11|
-------------------.
12 | 13| 14| 15 |
-------------------
Необходимо чтоб перемещить можно было только "0" , а также по нажатию на клавиатурные стрелки можно было передвигать, затем каждыйход проверялся не собрались ли пятнашки.
Автор: ItsJustMe
Дата сообщения: 23.10.2007 17:36
Нынче стало модно писать в ВОПРОСАХ, а не в ЗАДАЧАХ.
Рисуй коробочку в DirectX.
У меня к тебе встречный вопрос: а Console Project для этой проги используется для того, чтоб жизнь медом не казалась?
И еще. 0 - это пустое место. Ну вот и меняй его местами с той цифрой, куда его двигаешь.
Автор: wmlife24
Дата сообщения: 23.10.2007 21:33
Просто постарался выразится конкретно с рисуночком, чтоб было понятно. 0 пустое место делать лучше пробелом тоесть (сhar). Меня интересует сам код...
Автор: vipettut
Дата сообщения: 24.10.2007 13:49
Подскажите плиз как в VS2005 сделать, чтобы исходники (.cpp, .h) она сохраняла в формате UTF-8?

Это нужно потому что одни из одних и тех же исходников собираются проги под виндой и под линуксом. В исходниках есть русские буквы в строках, кроме того есть функции которым надо указывать кодировку. Мне проще один раз указать uft-8, чем через define делать под виндой win1251, а для линукса соотв. Основная IDE для разработки - VS2005.
Автор: ItsJustMe
Дата сообщения: 24.10.2007 14:25
Гм... Щаз под рукой VS нет, но я как-то в свое время подсовывал ей исходники в UTF-16LE. Она с ними нормально работала и сохраняла.
Автор: Mickey_from_nsk
Дата сообщения: 25.10.2007 12:01
vipettut
Когда делаешь сохранение, делай Save ... as, потом на кнопке Save жми стрелку и выбирай Save with encoding... Дальше, думаю, понятно. Но вообще то, это не вопрос по программированию на С++
Автор: vipettut
Дата сообщения: 25.10.2007 14:24
ItsJustMe
Mickey_from_nsk

спасибо за ответы!

У VS2005 все нормально с юникодом, НО нужен UFT-8 without signature.

(Насчет Save As... - все работает, просто не додумался там искать. Искал в настройках. Хотя в Save As вполне логично, если нужны разные кодировки per file.)
Автор: BeTeP1
Дата сообщения: 28.10.2007 09:43
Люди помогите пожалуйста
проблема вот в чем
написал класс
Код:
class CTest{
public:
LPWSTR wcName;
CTest(void);
~CTest(void);
};
CTest::CTest(void){
wcName = new WCHAR[10];
wcscpy(wcName,_T("Проверка"));
}
CTest::~CTest(void){
if (wcName != NULL){
delete [] wcName;
}
}
main(){
CTest* lpTest = new CTest[5];
delete []lpTest;
}


но при уничтожении wcName(delete [] wcName) вылетает ожибка This may be due to a corruption of the heap and indicates a bug in or any of the DLLs it has loaded.
в чем может быть проблема.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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