Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> долго выполняется программа 
V
    Опции темы
Mikron
Дата 19.11.2009, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 2.5.2007

Репутация: нет
Всего: нет



Добрый день. Помогите решить вопрос
Вот код
в файле initial_data.txt содержатся различные числа в 16 СС в таком виде 0x00  
я хочу записать в файл target_data.txt эти же числа в двоичной системе
ничего умнее не придумал, чем брать каждый третий и четвертый элемент из initial_data.txt  и переводить сравнением
Код

#include<windows.h> 
#include<string.h>
#include<stdlib.h>

int WINAPI WinMain ( HINSTANCE hInst, HINSTANCE hPrevInst,
                      LPSTR lpszCmdLine, int nCmdShow)

{    
    HANDLE hFile_INID=CreateFile("initial_data.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if(hFile_INID==NULL)
        return 1;

    HANDLE hFile_TD=CreateFile("target_data.txt",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    if(hFile_TD==NULL)
        return 1;
    
    DWORD dwNumberOfBytes1, dwNumberOfBytes2;

    int size_INID = GetFileSize(hFile_INID, 0);
    int bit_slov = (size_INID+2)/6;                                                        //количество чисел в initial_data.txt
    int bit_slov_read = bit_slov*8;                                                       //размер второго файла
    
        char *buf;
    buf = (char*)malloc( size_INID*sizeof(*buf) );
    memset(buf, 0, size_INID*sizeof(*buf) );

    ReadFile(hFile_INID, buf, size_INID*sizeof(*buf), &dwNumberOfBytes2, 0);                  //считываю первый файл в массив
    
    char *p;
    p = (char*)malloc( bit_slov_read*sizeof(*p) );
    memset(p, 0, bit_slov_read*sizeof(*p));


    for(int q=0;q<bit_slov;q++){
        
        char a = buf[2+6*q];                                                                                            //сравниваю 3-й и 4-й эл-т
        char b = buf[3+6*q];
        if(a=='0')
        {
            char str[]="0001";
            strcat(p,str);
        }

        else if(a=='1')
        {
            char str[]="0001";
            strcat(p,str);
        }
        else if(a=='2')
        {
            char str[]="0010";
            strcat(p,str);
        }
        else if(a=='3')
        {
            char str[]="0011";
            strcat(p,str);
        }
        else if(a=='4')
        {
            char str[]="0100";
            strcat(p,str);
        }
        else if(a=='5')
        {
            char str[]="0101";
            strcat(p,str);
        }
        else if(a=='6')
        {
            char str[]="0110";
            strcat(p,str);
        }
        else if(a=='7')
        {
            char str[]="0111";
            strcat(p,str);
        }
        else if(a=='8')
        {
            char str[]="1000";
            strcat(p,str);
        }
        else if(a=='9')
        {
            char str[]="1001";
            strcat(p,str);
        }
        else if(a=='A')
        {
            char str[]="1010";
            strcat(p,str);
        }
        else if(a=='B')
        {
            char str[]="1011";
            strcat(p,str);
        }
        else if(a=='C')
        {
            char str[]="1100";
            strcat(p,str);
        }
        else if(a=='D')
        {
            char str[]="1101";
            strcat(p,str);
        }
        else if(a=='E')
        {
            char str[]="1110";
            strcat(p,str);
        }
        else if(a=='F')
        {
            char str[]="1111";
            strcat(p,str);
        }
        else
            return 0;
        
        if(b=='0')
        {
            char str[]="0001";
            strcat(p,str);
        }

        else if(b=='1')
        {
            char str[]="0001";
            strcat(p,str);
        }
        else if(b=='2')
        {
            char str[]="0010";
            strcat(p,str);
        }
        else if(b=='3')
        {
            char str[]="0011";
            strcat(p,str);
        }
        else if(b=='4')
        {
            char str[]="0100";
            strcat(p,str);
        }
        else if(b=='5')
        {
            char str[]="0101";
            strcat(p,str);
        }
        else if(b=='6')
        {
            char str[]="0110";
            strcat(p,str);
        }
        else if(b=='7')
        {
            char str[]="0111";
            strcat(p,str);
        }
        else if(b=='8')
        {
            char str[]="1000";
            strcat(p,str);
        }
        else if(b=='9')
        {
            char str[]="1001";
            strcat(p,str);
        }
        else if(b=='A')
        {
            char str[]="1010";
            strcat(p,str);
        }
        else if(b=='B')
        {
            char str[]="1011";
            strcat(p,str);
        }
        else if(b=='C')
        {
            char str[]="1100";
            strcat(p,str);
        }
        else if(b=='D')
        {
            char str[]="1101";
            strcat(p,str);
        }
        else if(b=='E')
        {
            char str[]="1110";
            strcat(p,str);
        }
        else if(b=='F')
        {
            char str[]="1111";
            strcat(p,str);
        }
        else
            return 0;
    }

    WriteFile(hFile_TD,p,bit_slov_read*sizeof(*p),&dwNumberOfBytes1,NULL);


        free(p);   
    free(buf);

    CloseHandle(hFile_TD);
    CloseHandle(hFile_INID);
    return 0;
}



программа компилируется, но либо выполняется долго, либо еще что, но результат не получается.
Вопрос, что не так?
И еще вопрос, можно придумать другой метод перевода.

Спасибо за помощь
PM MAIL   Вверх
zim22
Дата 19.11.2009, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Mikron @  19.11.2009,  07:09 Найти цитируемый пост)
либо еще что,

очень интересно. т.е. вы сами не знаете, что происходит внутри вашей программы?


--------------------
PM MAIL   Вверх
586
Дата 19.11.2009, 10:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Особо не оптимизировал. Как минимум, тут нужно использовать массивы, чтобы было меньше условий в цикле.
Код
#include<windows.h> 
#include<string.h>
#include<stdlib.h>

const char *digits[10] = {"0000", "0001", "0010", "0011",
                          "0100", "0101", "0110", "0111",
                          "1000", "1001"};

const char *hex_digits[6] = {"1010", "1011",
                          "1100", "1101", "1110", "1111"};

int WINAPI WinMain ( HINSTANCE hInst, HINSTANCE hPrevInst,
                      LPSTR lpszCmdLine, int nCmdShow)
{    
    HANDLE hFile_INID=CreateFile("initial_data.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if(hFile_INID==NULL)
        return 1;
    HANDLE hFile_TD=CreateFile("target_data.txt",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    if(hFile_TD==NULL)
        return 1;
    
    DWORD dwNumberOfBytes1, dwNumberOfBytes2;
    int size_INID = GetFileSize(hFile_INID, 0);
    int bit_slov = (size_INID+2)/6;                                                        //количество чисел в initial_data.txt
    int bit_slov_read = bit_slov*8;                                                       //размер второго файла
    
        char *buf;
    buf = (char*)malloc( size_INID*sizeof(*buf) );
    memset(buf, 0, size_INID*sizeof(*buf) );
    ReadFile(hFile_INID, buf, size_INID*sizeof(*buf), &dwNumberOfBytes2, 0);                  //считываю первый файл в массив
    
    char *p;
    p = (char*)malloc( bit_slov_read*sizeof(*p) );
    memset(p, 0, bit_slov_read*sizeof(*p));
    for(int q=0;q<bit_slov;q++){
        
        char a = buf[2+6*q];                                                                                            //сравниваю 3-й и 4-й эл-т
        char b = buf[3+6*q];
        if(a >= '0' && a <= '9')
            strcat(p, digits[a-'0']);
        else if(a >= 'a' && a <='f')
            strcat(p, hex_digits[a-'a']);
        else if(a >= 'A' && a <='F')
            strcat(p, hex_digits[a-'A']);
        else
            return 0;
    }
    WriteFile(hFile_TD,p,bit_slov_read*sizeof(*p),&dwNumberOfBytes1,NULL);
        free(p);   
    free(buf);
    CloseHandle(hFile_TD);
    CloseHandle(hFile_INID);
    return 0;
}


Это сообщение отредактировал(а) 586 - 19.11.2009, 10:02
PM   Вверх
ller
Дата 19.11.2009, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.8.2008
Где: г. Таганрог

Репутация: 2
Всего: 4



А открыть потоки с файлами?
И читать числа в 16 СС а потом писать в 2 СС...
Причем читать в переменную типа int.
PM MAIL   Вверх
xvr
Дата 19.11.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Откройте для себя функции strtol (с radix равным 0), и itoa (с radix равным 2)

PM MAIL   Вверх
ller
Дата 19.11.2009, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.8.2008
Где: г. Таганрог

Репутация: 2
Всего: 4



xvr, itoa я думаю не обязательно. 
Код

int in_num;
std::cin>>hex>> in_num;
std::cout<<bin<<in_num;


Что то в этом ключе. Только подсунуть поток нужный для ввода и вывода.

PM MAIL   Вверх
Mikron
Дата 20.11.2009, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 2.5.2007

Репутация: нет
Всего: нет



Цитата(zim22 @  19.11.2009,  09:52 Найти цитируемый пост)
очень интересно. т.е. вы сами не знаете, что происходит внутри вашей программы? 

спасибо, я имел ввиду, что либо долго (не знаю к сожалению, как количество if/else влияет на время выполнения программы), либо бесконечно долго, то есть программа не может завершиться. Файл она создает, но процесс зависает,


586, большое спасибо. Количество условий в цикле влияет на время выполнения программы, или это не заметно?


вот в этом что ли проблема? 
Код

for(int q=0;q<bit_slov;q++){
        
        char a = buf[2+6*q];                                                                                           
        char b = buf[3+6*q];

        if(a >= '0' && a <= '9')
            strcat(p, digits[a-'0']);
        else if(a >= 'a' && a <='f')
            strcat(p, hex_digits[a-'a']);
        else if(a >= 'A' && a <='F')
            strcat(p, hex_digits[a-'A']);
        else
            return 0;

        if(b >= '0' && b <= '9')
            strcat(p, digits[b-'0']);
        else if(b >= 'a' && b <='f')
            strcat(p, hex_digits[b-'a']);
        else if(b >= 'A' && b <='F')
            strcat(p, hex_digits[b-'A']);
        else
            return 0;
}

так нельзя писать? если с одним if то все нормально

Это сообщение отредактировал(а) Mikron - 20.11.2009, 03:21
PM MAIL   Вверх
bsa
Дата 20.11.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Mikron @  20.11.2009,  03:15 Найти цитируемый пост)
не знаю к сожалению, как количество if/else влияет на время выполнения программы
Линейно. Т.е. чтобы дойти до последнего условия, будут проверены все предыдущие. Если ситуация позволяет, лучше от подобных вещей отказываться в пользу алгоритмов с константным временем выполнения (таблицы, формулы) или хотя бы логарифмическим (switch/case, std::map).

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0677 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.