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

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

Автор: ValidolX
Дата сообщения: 30.08.2010 15:58
V0lt

unsigned long long d2 = *(unsigned long long*)&d;
ето
1) &d - взять адрес переменной d, но поскольку d - double, тип адреса будет double*, поетому
2) делаем кастинг (изменение типа) (unsigned long long*)&d; теперь компилятор поймет что адрес - ето тип указателя (Pointer) на unsigned long long и....
3) взять вместимое по адресу - оператор звездочка *(unsigned long long*)&d;

тут проблема в другом - ежели например вместо double написать float то будет гав - почему? подумайте сами

Вариант с юнионом - тоже нормуль
Автор: V0lt
Дата сообщения: 30.08.2010 16:54
ValidolX
спасибо , разобрался
Автор: Dimrix
Дата сообщения: 01.09.2010 09:10
А от чего зависит скорость ответа сервера? У меня написана серверная часть на С++, которая принимает поток от одного клиента и просто ретранслирует его другому клиенту. Подсчёт переданных пакетов (передача происходит 30 раз/сек) и полученных пакетов дала мне статистику, что из 30 доходит лишь 10 пакетов. Я нашёл способо "прогнозирования" 5 пакетов из 6, что бы "сгладить" результаты, получаемые 2ым клиентом, но хотелосьбы что бы передавались все 30 пакетов/сек - это возможно или нет. Если возможно, то в чём затык: железо? криво написанный сервер? медленный клиент?
ЗЫ: в 1 пакете передаётся 10Байт
ЗЗЫ: для "сглаживания" стал передавать 20Байт, при этом на скорость работы это никак не сказалось (как было 10 из 30 так и осталось). Тестировал: передавал 40Байт в 1 пакете - всё-равно 10/30, посему складывается впечатления, что проблема скорее всего или в возможности сетевого адаптера или вообще в возможности так часто передавать дынные.
Автор: Red Planet
Дата сообщения: 03.09.2010 20:28
Начал изучать шаблоны.
Скажите, эквивалентны ли следующие две записи?



Цитата:
template <typename X, typename Y> double f (X a, Y b) {
    return a+b;
}


Цитата:
template <class X, class Y> double f (X a, Y b) {
    return a+b;
}


Автор: ValidolX
Дата сообщения: 03.09.2010 23:00
Dimrix
код сервера есть?
не может такого быть чтоб сервер терял 2/3 трафика!
какие у вас сокеты?
дайте больше деталей релазации пож-ста

Добавлено:
Red Planet
Cемантически - да, идентичны
но есть (как всегда и во всем) - нюансы
class используют если ето класс
typename - если ето другой шаблон, typedef и другие сложные типы

еще вопрос - у вас входной параметр -типов X, Y, а результат всегда double -
Автор: Red Planet
Дата сообщения: 04.09.2010 10:46

Цитата:
еще вопрос - у вас входной параметр -типов X, Y, а результат всегда double

Это код так, для примера. Предполагалось сложение int и double или int и float, или double и double.
Автор: distance
Дата сообщения: 07.09.2010 00:50
Red Planet

Скажите, эквивалентны ли следующие две записи?

полностью эквивалентны.
изначально было class, потом добавили typename чтобы не было путаницы с ключевым словом class
Автор: Qraizer
Дата сообщения: 07.09.2010 04:05
Скорее наоборот. Поначалу смирились с возможной путаницей, ибо ради применения в одном-единственном месте вводить целое новое ключевое слово в язык с риском потерять совместимость со многими старыми проектами, где typename использовалось программистами как простой иденитфикатор, посчитали слишком слабой мотивацией. В процессе развития языка шаблоны значительно усложнились, обросли мясом и приобрели столько новых качеств, что одно-единственное место уже перестало быть таковым, а class не справлялся с примененим во всех новых лексических оборотах. Мотивация сильно выросла. Вот и ввели.
Автор: Vostrikovskiy
Дата сообщения: 15.09.2010 21:17
Я использую в своей работе пакет LAPACK. И вот надыбал в инете улучшение одной функции из него, которая меня интересует, но реализация сделана на C (из CLAPACK). Но дело в том, что автор приводит модификацию только для одного случая, а там их несколько.Может, кого-либо этот вопрос тоже интересует и он сделает аналогичные замены для всех случаев? А перевод на фортран - дело техники. Вот адрес этого ресурса: http://software.intel.com/ru-ru/forums/showpost.php?p=128709
Автор: Dimrix
Дата сообщения: 16.09.2010 01:08
Вопрос по потоками (многопоточный демон): можно ли в с++ (если можно то как) при работе с потоками создавать глобальную переменную, доступную всем потокам.
Автор: Qraizer
Дата сообщения: 16.09.2010 06:10

Цитата:
...демон...

Потокам? Или-таки процессам? fork()-аешься?
Автор: Dimrix
Дата сообщения: 16.09.2010 09:48

Цитата:
Цитата:...демон...


Потокам? Или-таки процессам? fork()-аешься?

Да форкаюсь, действительно не правильно сказал - процессам, а не потокам
ЗЫ: ОСь - фря (на всякий случай)
Автор: Red Planet
Дата сообщения: 18.09.2010 18:56
Здравствуйте.

Встретил при изучении ООП перегрузку операторов new и delete для создания экземпляров через указатели и динамических массивов.
Следующий код работает и без их перегрузки.

Цитата:
class A {
/*Функции, конструкторы*/
}

ostream& operator << (ostream &s, const A &top) {
    s <<top.w<<" ("<<top.c<<")."<<endl;
    return s;
}


istream& operator >> (istream &is, A &top) {
    is >>top.w>>top.c;
    return is;
}

int _tmain (int argc, _TCHAR* argv[]) {
A *pointer;
int n;
cout <<"Quantity of things: ";
cin >>n;
for (int i=0; i<n; i++) cin >>pointer[i];
for (int i=0; i<n; i++) cout <<pointer[i];
}


Выходит, что операторы new и delete нужно перегружать только тогда, когда я хочу как-то по-своему задать правила выделения памяти под динамически создаваемые экземпляры (массивы) и не стоит изобретать велосипед, если и так все создается, вводится и выводится без ошибок? Правильно понимаю?

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

Цитата:
/*Первая*/
class CTimer
{
LARGE_INTEGER mlFrequency;
LARGE_INTEGER mlStart;
public:
double duration;
CTimer() {
QueryPerformanceFrequency(&mlFrequency);
}
void start() {
QueryPerformanceCounter(&mlStart);
}
void stop() {
LARGE_INTEGER lEnd;
QueryPerformanceCounter(&lEnd);
duration = (double(lEnd.QuadPart - mlStart.QuadPart) / mlFrequency.QuadPart)*1000;
}
};


/*Вторая*/
DWORD startTime, endTime;
startTime=GetTickCount();
/*Участок кода (решение какой-либо задачи), который нужно измерить.*/
endTime=GetTickCount();
printf ("Performance time: %g ms.\n", endTime-startTime); //Вывод результата.


Уверен, что существуют и другие. Могут ли подобные счетчики быть хорошими или плохими? Какие лучше и какие хуже?
Автор: KChernov
Дата сообщения: 20.09.2010 12:32
Red Planet
1. А на что тут выделять память? Ни одной классовой переменной.
И да, в простых случаях вроде бы компилятор сам справляется.

2. По-хорошему для таких задач надо использовать профилировщики.
Автор: karakurt2
Дата сообщения: 20.09.2010 17:51
Red Planet
по второму вопросу почитайте Рихтера
Автор: Red Planet
Дата сообщения: 26.09.2010 10:31
KChernov, karakurt2, спасибо за ответы.
Автор: Dee_Ecks
Дата сообщения: 26.09.2010 16:57
Подскажите как записать текстовую строку в отображаемый в память файл (ну и как прочитать, тоже желательно)

Код: int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hMapFile;
    LPVOID lpFileMap;
    hMapFile = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL, PAGE_READWRITE,0,1024,LPCWSTR("MyFM"));
    if(hMapFile == NULL)
{
fprintf(stdout,"CreateFileMapping: Error %ld\n",
GetLastError());
    std::cin.get();
return 0;
}

    lpFileMap = MapViewOfFile(hMapFile,
FILE_MAP_ALL_ACCESS, 0, 0, 0);
     if(lpFileMap == 0)
{
fprintf(stdout,"MapViewOfFile: Error %ld\n",
GetLastError());
std::cin.get();
return 0;
}


/* Здесь нужно записать текстовую строку в отображаемый файл.*/
std::cin.get();
    return 0;
}
Автор: Abs62
Дата сообщения: 26.09.2010 17:28
Dee_Ecks

Цитата:
Подскажите как записать текстовую строку в отображаемый в память файл

Как и в любую область памяти - CopyMemory, memcpy, strcpy и т.д. По указателю, возвращённому MapViewOfFile.
Только C++ тут не причём, это по WinAPI вопрос.
Автор: yurik86
Дата сообщения: 27.09.2010 13:11
Взялся за изучение C++ по книге "Роберт Лафоре - Объектно-ориентированное программирование в C++".
Установил Microsoft Visual Studio 2010. Глаза разбежались. Как в ней компилировать примеры из книги?
Например, такой

Код:
#include <iostream> //Для count и т.п
#include <cmath> //для sqrt()
using mamespace std;
int main()
{
    double number, answer; //аргументы типа double для функции sqrt()
    cout << "Введите число: ";
    cin >> number; //Ввод числа
    answer = sqrt(number); //извлечение корня
    cout << "Квадратный корень равен: "
    << answer << endl; //Вывод результата
    return 0;
}
Автор: ValidolX
Дата сообщения: 27.09.2010 13:59
yurik86

VS ->меню File -> New Project -> Visual C++ -> Win32 -> Win32 Console application

wizard создаст вам пустой проект - замените своим кодом

дальше Build-> Build Solution
если надо подебагать - проверьте что у вас дебаг версия собирается а не Релиз (выпадающий список в тулбаре)

удачи
Автор: yurik86
Дата сообщения: 27.09.2010 14:10
ValidolX
Спасибо!
Еще вопрос. Лучше поставить русскую или английскую версию? Думаю, что начинающему проще будет с русской, но ее не жалуют.
Автор: Barakud
Дата сообщения: 27.09.2010 15:36
Всем привет!
Вопрос такой - на WINAPI создаю обычное окно (прозрачное), в нем делаю DialogBox , в котором в свою очередь ресую фон из BITMAP и кнопки теми же BITMAP'ами (графические с текстом поферх TextOut'ами). Все отлично ровно до того момента, когда поверх моего окна встает/движется другое окно - тогда мое окно начинает перерисовываться в ответ на каждый пиксель движения (причем маленькие битмапы перерисовываются нормально, тогда как большие очень криво и неполно) - как можно отменить переисовку окна когда его другое окно перекрывает?
Автор: akaGM
Дата сообщения: 27.09.2010 17:30
Barakud
лучше здесь спроси:
http://forum.ru-board.com/topic.cgi?forum=33&topic=0555#1
Автор: sobre
Дата сообщения: 11.10.2010 18:59
есть ли у кого исходники сравнения звуковых файлов?
Автор: ruslrusl
Дата сообщения: 01.11.2010 17:51
Такой вопрос: создал пустой проект на VS2008. Написал обычный код:

Код:
#include <iostream>
using namespace std;
void main()
{
    char name;
    cin>>name;
    cout<<name;    
}
Автор: ValidolX
Дата сообщения: 01.11.2010 18:25
ruslrusl
VS2008:
File->New->Project-> Win32 Console Application
вводим имя проекта и путь
Next->Finish


студия создает пустой проект, вот такой:

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

удаляете _tmain (Но не #include "stdafx.h") и пишете свой код
(или вместо return 0 свой код) - все пойдет!
Автор: Red Planet
Дата сообщения: 05.11.2010 17:34
Здравствуйте. Нужно написать программу, которая генерирует выпуклую функцию (набор пар (x, y)).

Функция должна располагаться в первой четверти. Набор точек x генерировал случайным образом, потом упорядочил по возрастанию. Координаты y считаются по правилу y[i]=y[i-1]*k*(x[i]-x[i-1]), k изменяется с каждой итерацией, y[0] назначено. Сейчас проблема в том, чтобы запретить игрикам принимать отрицательные значения. Может я простых вещей не вижу? Подскажите.

Код.

Цитата:
// ---------------------------------------------------------------------------
#include <vcl>
#pragma hdrstop
#include <iostream>

using namespace std;


template <class T> void quickSortR (T *a, long N) {
    long i=0, j=N; //Поставить указатели на исходные места.
    T temp, p;

    p=a[N>>1]; //Центральный элемент.

    //Процедура разделения.
    do {
        while (a[i]<p) i++;
        while (a[j]>p) j--;

        if (i<=j) {temp=a[i]; a[i]=a[j]; a[j]=temp; i++; j--;}

    } while (i<=j);

    //Рекурсивные вызовы, если есть, что сортировать.
    if (j>0) quickSortR (a, j);
    if (N>i) quickSortR (a+i, N-i);
}




// ---------------------------------------------------------------------------

int _tmain (int argc, _TCHAR* argv[]) {
    system ("title Convex function");

unsigned int N; double R, r, min; int Left, Right;
    cout <<"Amount of methods: ";
    cin >>N;
    cout <<"Left limit: ";
    cin >>Left;
    cout <<"Right limit: ";
    cin >>Right;
    double *X=new double[N], *Y=new double[N];

    unsigned int some;
    long int L;
    L=(long)time(NULL); //Системное время.
    some =(unsigned)L; //Приведение типов.
    srand(some); //Задание исходного случайного числа для rand().

    cout <<"\nThe initial array of random numbers in the interval "
         <<"["<<Left<<", "<<Right<<"].\n";

    for (unsigned int i=0; i<N; ++i) {
        //Случайное число из интервала [0,1].
        r=(float)rand()/RAND_MAX;

        //Формирование случайного числа из заданного интервала.
        R=Left+(Right-Left)*r;
        X[i]=R;
    }

    quickSortR (X, N-1);

    double k=-1.4; Y[0]=100;

    cout <<endl<<"(x, y)"<<endl<<"("<<X[0]<<", "<<Y[0]<<")"<<endl;

    for (int i=1; i<N; i++) {
        Y[i]=Y[i-1]+k*(X[i]-X[i-1]);
        k=k+0.05;
        cout <<""<<X[i]<<", "<<Y[i]<<")"<<endl;
    }


    delete []X;
    delete []Y;
    cout <<endl;
    system ("pause");
    return 0;
}
Автор: KChernov
Дата сообщения: 06.11.2010 09:27
Red Planet

Цитата:
Сейчас проблема в том, чтобы запретить игрикам принимать отрицательные значения. Может я простых вещей не вижу?

Так
Цитата:
k=-1.4
- то есть отрицательное. А значит при фиксированном
Цитата:
Y[0]=100
всегда можно задать такие
Цитата:
Left, Right
, что будут отрицательные Y.
В данном случае поведение К должно зависеть и от числа точек, и от начального Y, и от диапазонов.
Простейший вариант (не вдаваясь в математику) - отслеживать появление первого отрицательного Y и менять К так, чтобы оно не появлялось. Но это может привести к тому, что выпуклости не появится вообще (если на первой же итерации будет -).

Можно добавить ещё 1 цикл, в котором варьировать К, добиваясь нужного вида функции.
Автор: Red Planet
Дата сообщения: 06.11.2010 15:11
Left и Right - соответственно левый и правый предел для иксов.


Цитата:
В данном случае поведение К должно зависеть и от числа точек

Чтобы более менее прослеживалась выпуклость, а не была прямая линия, нужно k изменять от большого отрицательного значения практически до нуля на последней итерации.


Цитата:
менять К так, чтобы оно (отрицательное значение y) не появлялось

Вот над этим и бьюсь.

Оно работает как положено (не получаются отрицательные игрики), но пока что с уверенностью не могу сказать, что всегда. Вот сейчас запускал - все были положительные, вчера - попадались отрицательные.

Автор: KChernov
Дата сообщения: 06.11.2010 16:55

Цитата:
Чтобы более менее прослеживалась выпуклость, а не была прямая линия, нужно k изменять от большого отрицательного значения практически до нуля на последней итерации.

С таким же успехом оно может от нуля и возрастать.

А вообще при желании можно набросать общую формулу и проанализировать, а что надо, чтобы не было отрицательных.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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