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

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

Автор: bomzzz
Дата сообщения: 20.03.2013 12:46
где тут пожелание, констатация свободы действий. фантазеры

получение строки из сжатого десятичного формата сто лет как решено, есть в учебниках, но как это не странно нет в винде, хотя это можно решить тремя последовательными wsprintf-ами. все обычно пользуются готовыми решениями, такую задачку могут студентам дать. свой старый код вытащил и мне он показался неуклюжим, пришел в голову новый алгоритм быстро действенный, какой выбрать алгоритм - надо доказывать какой оптимальнее. на быструю сортировку есть весь матаппарат готовый, может кому то попадалось что то про разжатие.
Автор: ItsJustMe
Дата сообщения: 20.03.2013 14:16

Цитата:
засунь ее в аналы.

Неожиданно... Ну хорошо, учтем на будущее...
Автор: AZJIO
Дата сообщения: 20.03.2013 17:08
bomzzz
типа MakeLong
Автор: bomzzz
Дата сообщения: 20.03.2013 21:02
не совсем. это только макрос. который правильно раставляет старшее и младшее двойное слово, чтоб слепить 64 битную переменную
Автор: AZJIO
Дата сообщения: 20.03.2013 22:00
да я знаю... просто последняя попытка угадать о чём ты пишешь
Автор: bomzzz
Дата сообщения: 20.03.2013 22:35
про сопроцессор. я не могунаписать на Си но сопроцессор умеет переводить числа 64 битные, в 80 битные числа в сжатом десятичном формате - это когда каждый байт представляет собой два десятичных числа каждые четыре бита по одному числу. и вот я спрашивал не знает ли кто оптимальный алгоритм, как распаковать сжатое десятичное число в строку символьную.

fild integer64
fbstp 80bitcompressdecimal

я получил в нативном режиме три числа байт на сектор, сектор на кластер, и свободное число кластеров. теперь это надо все перемножить и вывести на экран свободное место.

вот только что закончил делать


Автор: AZJIO
Дата сообщения: 20.03.2013 23:04
bomzzz
нужно сделать битовые операции, например
10100110 - сдвигаешь число влево
01100000 - это получилось, потом вправо
00000110 и о вот оно, первая часть числа
теперь получаем вторую часть числа
00001010 - просто сдвинули число вправо
Автор: bomzzz
Дата сообщения: 20.03.2013 23:35
ну я так и сделал. просто было непонятно не может быть более быстрого алгоритма. операция смещения битов не самая быстрая, хотя ее ускорили все же каждая единица смещения требует треть такта. вот и спросил как это в Си решают.
[more]            ; ====================
            compressdecimal2string:
                        fbstp CompressDec
                        lea esi,CompressDec
                        lea edi,String+34
                        mov dword ptr [edi], 0
                        mov ecx, 9
                    @@:
                        xor eax, eax
                        lodsb
                        shl ax, 4
                        shr al, 4
                        add ax, 3030h
                        mov byte ptr[edi], al
                        sub edi, 2
                        mov byte ptr[edi], ah
                        sub edi, 2
                        loop @B
                        mov ecx, 20
                        lea edi, String
                        mov ax, "0"
                        repe scasw
                        sub edi, 2
                        shl ecx, 1
                        mov word ptr[usstring], cx
                        mov word ptr[usstring+2], 40
                        mov dword ptr[usstring+4], edi
                        invoke NtDisplayString, addr usstring
                        retn
                        ; ==
                    .endif[/more]

Добавлено:
shl ax, 4
shr al, 4
add ax, 3030h

но все же так быстрее, во первых тут всего 4 смещения подряд, а если выковыривать значения из таблицы это не только будет занимать кеш, но и более медленно в память лазить, чем в регистре биты гонять

Добавлено:
0000000010100110

0000101001100000 - сначала влево 16 битную часть регистра

0000101000000110 - потом вправо 8 битную часть

потом к каждой части прибавляешь 48 - получаешь в каждой части 16 битной части регистра асци код числа. вот сопсвена и всё
Автор: AZJIO
Дата сообщения: 21.03.2013 00:42
bomzzz

Цитата:
операция смещения битов не самая быстрая
тут ты ошибаешся, смещение битов как раз самая быстрая операция. Там есть операторы >> и <<
Автор: spt8416
Дата сообщения: 21.03.2013 01:04
Помогите решить проблему с adf.ly'ем кто знает, пожалуйста. Есть у меня мини браузер, написанный на Delphi. Я просто накинул на главную форму компонент WebBrowser. Всё работает, но при обратном отсчёте (до генерации ссылки) выскакивают бесконечные ошибки сценария, причём в IE у меня похожая проблема, только переход вообще не происходит (зависает на последней секунде). В FF и Chrome всё работает отлично и без проблем. Всё что мне нужно это просто открыть веб страницу, подождать 5 секунд и пропустить рекламу. В принципе не обязательно делать на Delphi, просто всё что мне нужно - это загружаемая страница, свободная от ошибок сценариев. Я так почему спрашиваю, просто опыта банально не много.

Можно что-то придумать, например взять движок того же Chrome? Что нибудь попроще и эффективней.
Автор: bomzzz
Дата сообщения: 21.03.2013 06:29
AZJIO
быстрые по сравнению с делением и умножением которые больше сотни тактов занимают. а так каждое смещение на позицию отдельная операция, и если на 8088 процессоре это был такт, на пентиуме треть такта, а на последних возможно и меньше, все же в некоторых ситуациях она не самый оптимальный вариант
Автор: ne_viens
Дата сообщения: 21.03.2013 10:19
Это на старых P4 shl, shr за 4 такта выполнялась. На Core 2 уже за 1 такт.
Автор: bomzzz
Дата сообщения: 21.03.2013 11:04
писать лучше с учетом более старых машин, а на новых все операции быстрее выполняются, или делать несколько враиантов под разные машины.
ne_viens
как в кернел моде получить список всех дисков (разделов)?
Автор: ne_viens
Дата сообщения: 21.03.2013 13:19
ZwCreateFile() от "\\.\C:" до "\\.\Z:"
Всех, которые отзываются, в список.

Добавлено:
Про C++ вопрос:
Дллка экспортирует foo::bar* foo::bar::getInstance();

Что на C++ надо написать, чтобы ее вызвать?
Автор: bomzzz
Дата сообщения: 21.03.2013 16:28

Цитата:
ZwCreateFile() от "\\.\C:" до "\\.\Z:"
Всех, которые отзываются, в список.

это mounted получится? а через dosdevice? а как видеть скрытые тома?
Автор: AZJIO
Дата сообщения: 21.03.2013 22:58
bomzzz
То есть ты устанешь ждать 3 миллисекунды? Или ты в цикле делаешь миллион раз?
Автор: bomzzz
Дата сообщения: 22.03.2013 04:04
AZJIO
это о чем?
делал новый кусок кода по расжатию числа, я его в папочку положу и потом буду использовать, конечно надо делать оптимально

Добавлено:
ne_viens
IOCTL_DISK_GET_DRIVE_LAYOUT_EX
вот наверно как еще можно получить списак
Автор: bomzzz
Дата сообщения: 22.03.2013 09:54

Цитата:
IOCTL_DISK_GET_DRIVE_LAYOUT

никто такое не делал? чета не могу попасть в строку перечисления разделов. на первый раздел получил смещение и размер, а дальше чета муть какая то, толи структура выровнена и не написано об этом в мсдне, толи что то не понял, толи и то и другое вместе
Цитата:
IOCTL_DISK_GET_DRIVE_LAYOUT_EX

а тут вообще пустота возвращается


Добавлено:
ну как абычна, хорошая мысля приходит апосля - просканировал через два байта пока не нашел. оказывается аж 64 байта, фиг знает почему.
все ранвно прро скрытые разделы нет инфы
Автор: bomzzz
Дата сообщения: 22.03.2013 12:41
посмотрите пожалуйста в Си как эта структура устроена
PARTITION_INFORMATION

Цитата:

PARTITION_INFORMATION STRUCT
    StartingOffset        LARGE_INTEGER <>
    PartitionLength        LARGE_INTEGER <>
    HiddenSectors        DWORD ?
    PartitionNumber        DWORD ?
    PartitionType        BYTE ?
    BootIndicator        BOOLEAN ?
    RecognizedPartition    BOOLEAN ?
    RewritePartition        BOOLEAN ?
PARTITION_INFORMATION ENDS
PPARTITION_INFORMATION typedef ptr PARTITION_INFORMATION

какой у нее размер общий и какое смещение на каждый элемент. для этого не надо получать таблицу разделов, а просто через wsprintf messagebox можно посмотреть. почему то ее размер равен 32 - иногда структуры выравнивают на 4 и в мсдне ниче про это не пишут. но я еще видимо не могу попасть точно в PartitionType

http://msdn.microsoft.com/ru-RU/library/windows/desktop/aa364007%28v=vs.85%29.aspx
http://msdn.microsoft.com/ru-RU/library/windows/desktop/aa365451%28v=vs.85%29.aspx


Добавлено:
вот так она выровнена, не понятно зачем она и так кратна 4. мсдн какашка


Цитата:
PARTITION_INFORMATION STRUCT
    StartingOffset        LARGE_INTEGER <>
    PartitionLength        LARGE_INTEGER <>
    HiddenSectors        DWORD ?
    PartitionNumber        DWORD ?
    PartitionType        BYTE ?
    BootIndicator        BOOLEAN ?
    RecognizedPartition    BOOLEAN ?
    RewritePartition    BOOLEAN ?
                DWORD ?
PARTITION_INFORMATION ENDS
PPARTITION_INFORMATION typedef ptr PARTITION_INFORMATION


Автор: bomzzz
Дата сообщения: 23.03.2013 19:37
никто не знает или нет примера как форматировать разделы, менять hide\unhide и тд и тп. ?

Автор: bomzzz
Дата сообщения: 24.03.2013 08:46

никто не знает, как соотнести геометрию диска с буквами и метками разделов?
Автор: bomzzz
Дата сообщения: 24.03.2013 15:06
открыв диск вот так \\??\\PhysicalDrive0 через IOCTL_DISK_GET_DRIVE_LAYOUT получаю в PARTITION_INFORMATION PartitionNumber - номер раздела диска

поставивив этот номер сюда - \\Device\\Harddisk0\\Partition1\\ получают метку тома и серийный номер через NtQueryVolumeInformationFile, а как получить букву?
Автор: Genadyruk
Дата сообщения: 26.03.2013 21:28
люди скажите пожалуйста где у меня тут ошибка? спасибо
// U(0,t) = t, U(l,t) = t*t - граничные условия
// U(x,0) = x - начальные условия
#include <cmath>
#include <math.h>
#include <iostream>
using namespace std;
double function(double **array, double a, double b, double c, double d, int e, int f);
int main()
{
double lambda = 0.5, h, tau;
double a,b,c = 0.,d,k;
// a & b - left and right border for x
// c & d - left and right border for time
// k - cofficient of termal conductivity
// nx - number for x
// nt - number for time
// lambda - determines of stability(lambda <= 0.5)
int nx, nt;
cout << "enter left border for x"<< endl;
cin >> a;
cout << "enter right border for x"<<endl;
cin >> b;
if (a > b)
{
    cout << "ERROR! Left border > right border";
    return 0;
}
cout << "enter right border for time" << endl;
cin >> d;
cout << "enter cofficient of termal conductivity" << endl;
cin >> k;
if ( k < 0. ) { cout << "ERROR! Coffiecient of termal conductivity is not may be < 0!"; return 0;}
cout << "enter number n(note: this number is determines the size grid for x)" << endl;
cin >> nx;
h = (b - a)/nx;
tau = lambda*h*h/k;
nt = ((d - c)/tau) + 1;
double **u = new double*[nt];
for (int i = 0; i<nt; i++)
{
    u[i] = new double[nx];
}
function (u, a, h, tau, lambda, nx, nt);
for (int i = 0; i<nt; i++)
{
    delete [] u[i];
}
delete u;
return 0;
}
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
double function (double **u, double a, double h, double tau, double lambda, int nx, int nt)
{
double x, x0 = a, t0 = 0., t;
int i, j, k = 0;
x = x0 + h;
j = 0;
for (i = 0; i<nx; i ++)
{
    u[j][i] = x;
    x = x + h;
}
t = t0 + tau;
i = 0;
for (j = 1; j<nt; j++)
{
    u[j][i] = t;
    t = t + tau;
}
t = t0;
i = nx;
for (j = 1; j<nt; j++)
{
    u[j][i] = t*t;
    t = t + tau;
}
for ( int j = 0; j < nt - 1; j++)
{
    for ( int i = 1; i<nx-1; i++)
    {
        u[j+1][i] = lambda*u[j][i + 1] + (1. - 2.*lambda)*u[j][i] + lambda*u[j][i - 1];
        cout << u[j][i]<<endl;
        k = k + 1;
        if ( k == 100 )
            {
                return 0;
            }
    }
}
}
Автор: akaGM
Дата сообщения: 26.03.2013 21:38
Genadyruk

ошибка в двадцать третей строке, восьмая колонка...

может всё-таки начать с формулировки задачи?
Автор: Genadyruk
Дата сообщения: 26.03.2013 21:45
akaGM хорошо. Я программирую уравнение теплопроводности. Граничные и начальные условия я ввожу сам. Код я вроде как написал и компилятор не выдал ни одной ошибки, создал исполняемый файл. Когда запускаю и ввожу с клавиатуры все данные, программа ничего не делает, а просто аварийно завершается. В Ubuntu она считает, но в самом конце пишет "Ошибка сегментирования (сделан дамп памяти)". Ну вот я и хочу знать, что не так? Я вроде как думаю, что она запаривается на функции.
Автор: akaGM
Дата сообщения: 26.03.2013 21:58
Genadyruk

посмотри очень аккуратно на индексацию в своей функции, что-то у тебя там запутано, то с 1, то с нуля начинаешь...

и вообще, ты под отладчиком запускать умеешь?
Автор: Genadyruk
Дата сообщения: 26.03.2013 21:59
akaGM
я пишу в блокноте и компиляторами компилирую
Автор: akaGM
Дата сообщения: 26.03.2013 22:01
Genadyruk
ну тогда делай промежуточную печать и отключи всю оптимизацию и включи все проверки (проверка диапазонов, переполнения)...
Автор: Abs62
Дата сообщения: 26.03.2013 22:03
Genadyruk

Цитата:
i = nx;

Тут имеет место быть выход за пределы массива. Индекс может меняться от 0 до nx-1.
Автор: Genadyruk
Дата сообщения: 26.03.2013 22:09
Abs62 Спасибо тебе ,человечище, огромное, при огромное. Я весь сегодня парюсь, а ошибка в одной строчке была.
akaGM тебе тоже спасибо. а можно по подробней, как отключить оптимизацию и т.д. Все, что ты выше писал, или где почитать можно про это.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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