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

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

Автор: V0lt
Дата сообщения: 09.08.2011 09:19
KF121

Цитата:
0.0999908447265625 -> 1036830720 -> 0 123 5031936 -> 0.0999908447265625
0.0999908447265624 -> 1036830720 -> 0 123 5031936 -> 0.0999908447265625
0.0999908447265626 -> 1036830720 -> 0 123 5031936 -> 0.0999908447265625

Тут слева три одинаковых float на самом деле, сам ведь расписал как оно изнутри выглядит
Автор: KF121
Дата сообщения: 09.08.2011 09:21
если вы присмотритесь внимательней то слева 3 разных числа. в конце 25-24-26, но как видите они представлены все как 25, за счет своей разрядной сетки.

Добавлено:
это и есть погрешность, и она составляет 0.0000000074505806
Автор: V0lt
Дата сообщения: 09.08.2011 09:32

Цитата:
если вы присмотритесь внимательней то слева 3 разных числа. в конце 25-24-26, но как видите они представлены все как 25, за счет своей разрядной сетки.

Эти три числа будут одинаковыми, если их записать как float, тупо не хватает битов.


Цитата:
почитайте мат часть про флоаты/даблы как представлются в памяти и т.п. потом лишние вопросы отпадут, и вам не захочится поступать так как вы сейчас делаете.

Мне нужно поймать конкретный float. В памяти он лежит в 32 битах всегда в одном виде. Я копирую эти 32 бита в int и анализирую. Все логично имхо.

Я не произвожу никаких вычислений. Я сравниваю число с шаблоном (который постоянен) и детектирую баг.
Автор: KF121
Дата сообщения: 09.08.2011 09:34
у вас шаблон омжет изменитсья, при следующей сборке и т.п.
как это вы ничего не вычисляте, как получается значение m_VMR9ColorControl[1].MinValue. оно константно?
Автор: V0lt
Дата сообщения: 09.08.2011 09:41
KF121

Цитата:
как это вы ничего не вычисляте, как получается значение m_VMR9ColorControl[1].MinValue. оно константно?

У системы запрашиваю. Такая хрень только для nvidia для конкретного параметра. Для amd/ati другие лимиты и они корректны. Если баг пофиксят, то мой "патч", скорее всего, тупо не сработает, что есть правильно.
Автор: ValidolX
Дата сообщения: 09.08.2011 09:47
вся правда про флоат, дабл, лонг дабл

http://babbage.cs.qc.edu/IEEE-754/
Автор: akaGM
Дата сообщения: 09.08.2011 10:30
что уж там, надо сразу к первоисточнику:
http://www.ieee.org/

а все погрешности/константы сидят во float.h
типа:
Код: #define FLT_DIG 6 /* # of decimal digits of precision */
#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */
#define FLT_MANT_DIG 24 /* # of bits in mantissa */
Автор: snkreg
Дата сообщения: 09.08.2011 11:35
Уважаемые, нет ли часом сорца криптора, простенького, нужно просто защитить ресурсы от редактирования, а потом уже паковать юпиксом. или мб кто-то уже юпикс модил под себя - подскажите куда копать, чтобы все сорцы не перерывать, ибо времени нет. Заранее благодарен.
Автор: Molniev
Дата сообщения: 09.08.2011 11:42
http://cracklab.ru/download.php?action=list&n=NDA=
Выбирайте что по душе для "защитить ресурсы от редактирования" сгодиться половина из того, что там есть.
Автор: snkreg
Дата сообщения: 09.08.2011 12:06
Molniev

Цитата:
сорца криптора

Автор: Molniev
Дата сообщения: 09.08.2011 12:25
Да кто ж даст? Все бояться, что поменяют слегка, и опять троянчика упакуют чтоб не палился особо.
А ссылка на тот сайт - посмотрите там на форуме, может и есть какие исходники. Хотя там тоже не жаждут особо новые версии старых штамов.
Автор: snkreg
Дата сообщения: 09.08.2011 12:53
Molniev
Да прекратите, Вы.Вечная тема о троянах и вирусах в кейгенах. Знаю я КракЛаб. и крипторов и скрамблеров открытых полно. а т.к. мне не нужны навороты, антиотладка, полиморф и тд - поэтому я и написал
Цитата:
простенького, нужно просто защитить ресурсы от редактирования

и для тех, кто в теме никакими троянами здесь не пахнет. Я просто задал вопрос, если поделятся - хорошо, не поделятся - ничего страшного, будет повод выкроить время и накодить самому. А Вы, как я вижу один из тех, кто думает и решает за всех.. не очень это вежливо с Вашей стороны. Лучше ничего не отвечайте, если нет ничего по делу.
Автор: Molniev
Дата сообщения: 09.08.2011 13:06
snkreg
Я не думаю и не решаю за всех (но хотелось бы...))). Исходников пакера только для ресурсов у меня нет - так что дать такой не могу. Мнение это по пакерам я высказал большинства - что б не было молчания на ваш вопрос. Если вас это как то задело - то извините.
Чтоб защитить ресурсы от редактирования в чужой программе - можно воспользоваться одной из программ по данной мной выше ссылке. Разнитцы между ней и стабом для дешифровки только ресурсов особой нет.

Если программа целиком ваша - то разумней не использовать криптор, а сами ресурсы отдельно зашифровать (какие нужно) и перед их использованием - расшифровать. Будет меньше претензий от разных эвристик. А то с легальной программой будете Generic.Trojan у отдельных ав (не буду тыкать пальцем). И меньше проблем с совместимостью.
Автор: snkreg
Дата сообщения: 09.08.2011 13:11
Molniev

Цитата:
. А то с легальной программой будете Generic.Trojan у отдельных ав (не буду тыкать пальцем).

Да, сочувствую многим авторам... Это уже политика авирей... К сожалению печальная политика, но есть и плюсы, без нее у нас бы сейчас не было утечки последней Иды))
Автор: Red Planet
Дата сообщения: 10.08.2011 21:32
Здравствуйте! Пишу приложение с GUI и функциональной частью. GUI находится в main.h, функциональная часть - в func.h. Данные в func.h помещаются в классы.

Цитата:
class overhead {
    int r, s, t;
    public: overhead () { r = 10; s = 10; t = 10; }
    int getR () const { return r; }
    void setR (int rr) { r = rr; }
};


Если эти переменные являются фактическими параметрами некоторой функции (здесь int f(int &p)), вызываемой в main.h (на OnClick, например), то возникает проблема (на скриншоте).

Цитата:
void __fastcall Tmain_form::ButtonClick(TObject *Sender)
{
    overhead ov1;
    f (ov1.getR());
    ShowMessage (ov1.getR());

}




Суть ясна: нельзя беспардонно забросить getR() в качестве параметра f, так как результат типа int подразумевает, что в левой части будет присваивание int'у. Да, можно сделать r в классе публичной и в функции писать

Цитата:
f (ov1.r)

и все будет работать.
Но здесь мы жертвуем инкапсуляцией, переменная r доступна теперь отовсюду. Оставить так или как-то здесь выходят из положения?
Автор: langobardi
Дата сообщения: 10.08.2011 23:57
Red Planet
Первое что приходит в голову объявить функцию f другом класса, а ей передавать ссылку на объект(или указатель).
Ещё лучше возвращать функцией getR () возвращать ссылку. Т.е. сделать её такой:

Код: int& getR () { return r; }
Автор: Aluminium
Дата сообщения: 12.08.2011 14:55
Добрый день.

есть вод такой код:
[more]
Код: #include <stdio.h>
#include <string.h>
#include <ctype.h>

#define MAXLINE 1000

struct cWord {
int count;
char *word;
struct cWord *left;
struct cWord *right;
struct cWord *nleft;
struct cWord *nright;
} *pWord;

struct cWord *add_pWord(struct cWord *, struct cWord *, char *);
struct nWord *add_nWord(struct cWord *, struct cWord *, int);
struct cWord *printSort_pWord(struct cWord *);
struct nWord *printSort_nWord(struct nWord *);

void main()
{
int i = 0;
char c, line[1000];

while ((c = getchar()) != EOF)
{
while (!isspace(c))
{
*(line+i++) = c;
continue;
}

*(line+i) = '\0';
i = 0;

if (isalpha(*(line+i)))
{
pWord = add_pWord(NULL,pWord,line);
add_nWord(NULL,pWord,pWord->count);
}
}
}

struct cWord *add_pWord(struct cWord *parentWord, struct cWord *stcWord, char *inLine)
{
int n;

if (stcWord == NULL)
{
stcWord = (struct cWord *)malloc(sizeof(struct cWord));
stcWord->word = malloc(strlen(inLine));
stcWord->word = memcpy(stcWord->word,inLine,strlen(inLine));
stcWord->count = 1;

if (parentWord == NULL)
stcWord->left = stcWord->right = NULL;
else
{
if ((n = strcmp(inLine,parentWord->word)) > 0)
stcWord->left = parentWord;
else if (n < 0)
stcWord->right = parentWord;
}
}
else if ((n = strcmp(inLine,stcWord->word)) > 0)
{
if (strcmp(inLine,parentWord->word) < 0)
{
struct cWord *newWord = (struct cWord *) malloc(sizeof(struct cWord));
newWord->word = memcpy(newWord->word,inLine,strlen(inLine));
newWord->count = 1;
newWord->left = parentWord->left;
newWord->right = parentWord;
parentWord->left->right = newWord;

return newWord;
}

stcWord->right = add_pWord(stcWord,stcWord->right,inLine);
}
else if (n < 0)
{
if (strcmp(inLine,parentWord->word) > 0)
{
struct cWord *newWord = (struct cWord *) malloc(sizeof(struct cWord));
newWord->word = memcpy(newWord->word,inLine,strlen(inLine));
newWord->count = 1;
newWord->left = parentWord;
newWord->right = parentWord->right;
parentWord->right->left = newWord;

return newWord;
}

stcWord->left = add_pWord(stcWord,stcWord->left,inLine);
}
else
stcWord->count++;

return stcWord;
}

struct nWord *add_nWord(struct cWord *parentWord, struct cWord *curWord, int count)
{
if (curWord->left != NULL && count < curWord->left->count)
add_nWord(curWord,curWord->left,count);
else if (curWord->right != NULL && count > curWord->right->count)
add_nWord(curWord,curWord->right,count);
else
{
curWord->nleft = curWord->left;
curWord->nright = curWord->right;
}
}
Автор: A1exSun
Дата сообщения: 12.08.2011 14:58
Aluminium
подключи библиотеку stdlib.h или alloc.h
Автор: akaGM
Дата сообщения: 12.08.2011 15:01
Aluminium
#include <stdlib.h>

и убери свой листинг под тег {more}
Автор: Aluminium
Дата сообщения: 12.08.2011 15:52

Цитата:
подключи библиотеку stdlib.h или alloc.h

вот я идиот, спасибо
Автор: darkogre
Дата сообщения: 13.08.2011 06:21
Задача: Решить следующий криптарифм: na * z * v,a * n * e *t = nazva
Задача имеет три решения. Следующий код находит эти самые решения.


Код:
#include <iostream.h>

int main()
{
for(short x1 = 1, Rez1 = 0, Rez2 = 0; x1 <= 9; x1++, Rez1 = 0, Rez2 = 0)
for(short x2 = 1; x2 <= 9; x2++)
for(short x3 = 1; x3 <= 9; x3++)
for(short x4 = 1; x4 <= 9; x4++)
for(short x5 = 1; x5 <= 9; x5++)
if((x1 != x2) && (x1 != x3) && (x1 != x4) && (x1 != x5) && (x2 != x3) && (x2 != x4) && (x2 != x5) && (x3 != x4) && (x3 != x5) && (x4 != x5))
{
Rez1 = x1 * x1 * x2 * x3 * x4 * x5;
Rez2 = 1000 * x1 + 10 * x2 + x3;

if (Rez1 == Rez2)
cout << Rez1 * 10 << endl;
}

system("pause");

return 0;
}
Автор: KChernov
Дата сообщения: 13.08.2011 10:09
darkogre

Цитата:
Задача: Решить следующий криптарифм: na * z * v,a * n * e *t = nazva
Задача имеет три решения. Следующий код находит эти самые решения.

Как-то этот криптарифм не соотносится с решением.
По крайней мере в криптарифме 6 переменных, а в программе всего 5.


Цитата:
Вопрос. Почему ответы выводятся по два раза?

А 2 раза выводится потому, что это 2 РАЗНЫХ варианта.
Автор: darkogre
Дата сообщения: 13.08.2011 12:15

Цитата:
По крайней мере в криптарифме 6 переменных, а в программе всего 5.

Упростил на бумаге немножко. Там очевидно, что a == 0


Цитата:
А 2 раза выводится потому, что это 2 РАЗНЫХ варианта.

Если можно, чуть подробнее. А то именно в этом и трудность. Сообразить не могу, откуда что берётся. Когда он второй раз попадает в то же самое решение?
Автор: KChernov
Дата сообщения: 13.08.2011 12:29
darkogre

Цитата:
Если можно, чуть подробнее. А то именно в этом и трудность. Сообразить не могу, откуда что берётся. Когда он второй раз попадает в то же самое решение?

Так выведите не только результирующее число, но и значение всех переменных - сразу всё станет понятно (там 2 переменных входят абсолютно симметрично - и это тоже видно по самому криптарифму).


Цитата:
Упростил на бумаге немножко. Там очевидно, что a == 0

Упростить на бумаге - это конечно хорошо, но не факт, что полезно с точки зрения программирования.

А вообще уж больно громоздкий код получается - так и хочется его упростить (например через массивы)...
Автор: darkogre
Дата сообщения: 13.08.2011 13:37

Цитата:
Так выведите не только результирующее число, но и значение всех переменных - сразу всё станет понятно (там 2 переменных входят абсолютно симметрично - и это тоже видно по самому криптарифму).

Теперь понятно)
Спасибо за помощь.


Цитата:
А вообще уж больно громоздкий код получается - так и хочется его упростить (например через массивы)

Насчет громоздскости согласен, но чем тут могут помочь массивы? Как вы это видите?
Автор: kotlomoy
Дата сообщения: 13.08.2011 17:56
darkogre
e и t меняются местами, отсюда и два варианта
Автор: KChernov
Дата сообщения: 14.08.2011 08:21
darkogre

Цитата:
Насчет громоздскости согласен, но чем тут могут помочь массивы? Как вы это видите?

Ну в общем да, как-то менее громоздко пока не получается.
Автор: Red Planet
Дата сообщения: 16.08.2011 10:32
Добрый день! Знаю, что нельзя сравнивать на равенство вещественные числа, что нужно использовать

Цитата:
double d1, d2, eps = 0.0000001;
if (fabs (d1 - d2 )< eps) {};


А как поступать с операциями "больше", "больше или равно"? Можно писать напрямую

Цитата:
d1 < d2

или там тоже какие-то особенности?
Автор: KF121
Дата сообщения: 16.08.2011 10:48
с операциями больше меньше нет никаких ограничений, а вот "больше или равно" или "Меньше или равно" попадает с од правило "нельзя сравнивать на равенство вещественные числа" т.е. равенство у вас никогда не выполнится, только если будете сравнивать 2 константы.
Автор: ItsJustMe
Дата сообщения: 16.08.2011 18:55
По логике вещей проблема только со строгим равенством. Операция же >= почти эквивалентна >. Если, допустим, > выполнится 1000000 раз из 2000000, то >= имеет шансы выполниться 1000001 из 2000000. Думаю, идея понятна. То же самое и с <= и =.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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