Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
mr_free
69 / 3 / 0
Регистрация: 08.08.2012
Сообщений: 223
Записей в блоге: 1
#1

Аппаратный генератор случайных чисел! SOS - C++

13.08.2012, 15:04. Просмотров 1206. Ответов 8
Метки нет (Все метки)

И снова здравствуйте! Продолжаю заниматься аппаратным генератором случайных чисел на основе звуковой карты! И у меня снова проблемы, точнее ошибки. Пожалуйста, напишите в чем ошибка и как её решить. И вопрос к знающим, действительно ли то что я пишу можно будет после избавления от ошибок назвать аппаратным генератором случайных чисел? Может я вообще пишу все не правильно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <fstream>
#include <iostream>
#include <windows.h>
#include "stdafx.h"
#include <mmsystem.h>
using namespace std;
 
void processData(const>short* data), const int n)
{
    ofstream output("data.txt");
    output.flags(std::ios::right+std::ios::fixed);
 
    double avr = 0.0;
    double deviation = 1.0;
 
    const double outDeviation = 13.0f;
    const double outAvr = 13.0f;
 
    for (int i = 0; i < n; i++)
    {
        avr += (double)data[i];
        deviation += (double)(data[i] * data[i]);
    }
 
    avr /= (double)n;
    deviation = sqrt(deviation / (double)n - avr * avr);
 
    for (int i = 0; i < n; i++)
    {
        double conv = (outDeviation * (double)data[i]) / deviation + 
            outAvr - (outDeviation * avr) / deviation;
        output << conv << endl;        
        //output << (short)data[i] << std::endl;
    }
 
    output.close();
}
 
void CALLBACK onBufferIn(HWAVEIN hwi, UINT uMsg, DWORD dwInstance, 
                              DWORD dwParam1, DWORD dwParam2)
{
    switch (uMsg)
    {
    case WIM_DATA:
        cout << "data message" << endl;
 
        LPWAVEHDR lpWaveHdr;
 
        lpWaveHdr = (LPWAVEHDR)dwParam1;
        cout << "recorded = " << lpWaveHdr->dwBytesRecorded << endl;
        cout << "coping.." << endl;
 
        void* bufferData = malloc(lpWaveHdr->dwBytesRecorded);
        memcpy((void *)bufferData, (const void*)lpWaveHdr->lpData, lpWaveHdr->dwBytesRecorded);
 
        processData((short*)bufferData, lpWaveHdr->dwBytesRecorded / sizeof(short));
 
        free(bufferData);
        waveInUnprepareHeader(hwi, lpWaveHdr, sizeof(WAVEHDR));
        free(lpWaveHdr->lpData);
 
        break;
    }
}
void openDevice()
{
    HWAVEIN hWaveIn;
    WAVEHDR waveHdr;
    WAVEFORMATEX waveFormat;
 
    //open
    waveFormat.wFormatTag = WAVE_FORMAT_PCM;
    waveFormat.nChannels = 1;
    waveFormat.nSamplesPerSec = 44100L;
    waveFormat.wBitsPerSample = 16;
    waveFormat.nBlockAlign = 2; //bytes
    waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign;
    waveFormat.cbSize = 0;
 
    MMRESULT result;
    result = waveInOpen(&hWaveIn, 1, &waveFormat, /*(DWORD)onBufferIn*/NULL, 0, CALLBACK_FUNCTION);
    if (result != MMSYSERR_NOERROR) 
        cout << "waveInOpen error" << endl;
 
    ULONG bufferSize = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign * 1;
 
    ZeroMemory(&waveHdr, sizeof(WAVEHDR));
    waveHdr.lpData = (LPSTR)malloc(bufferSize);
    waveHdr.dwBufferLength = bufferSize;
 
    //prepare
    result = waveInPrepareHeader(hWaveIn, &waveHdr, sizeof(WAVEHDR));
    if (result != MMSYSERR_NOERROR)
        cout << "waveInPrepareHeader error " << result << endl;
 
    //add buffer
    result = waveInAddBuffer(hWaveIn, &waveHdr, sizeof(WAVEHDR));
    if (result != MMSYSERR_NOERROR)
        cout << "waveInAddBuffer error " << result << endl;
 
    result = waveInStart(hWaveIn);
    if (result != MMSYSERR_NOERROR)
        cout << "waveInStart error" << result <<endl;
 
    Sleep(2000);
    waveInStop(hWaveIn);
}
 
int main()
{
    openDevice();
 
    return 0;
}
ОШИБКИ:
Код
error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
error C2143: синтаксическая ошибка: отсутствие ")" перед ">"
 error C2059: синтаксическая ошибка: >
 синтаксическая ошибка: )
 error C2059: синтаксическая ошибка: )
 error C2143: синтаксическая ошибка: отсутствие ";" перед "{"
error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2012, 15:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Аппаратный генератор случайных чисел! SOS (C++):

Работа со звуком! (Ошибка) Аппаратный генератор случайных чисел! - C++
Доброго времени суток занимаюсь созданием аппаратного генератора случайных чисел на основе звуковой карты, и вот застала в расплох некая...

генератор случайных чисел - C++
Всем доброго времени суток, вот решил написать генератор чисел длины 768 бит, все отлично вроде и работает но только проблема в том что...

Генератор случайных чисел - C++
Реализовать генератор случайных числе в диапазоне от нуля до единицы. После генерации случайного числа, записывать 0 или 1 (в соответствии...

Генератор случайных чисел - C++
Как написать генератор случайных (пусть и псевдо) чисел, выдающий на выходе целые случайные числа от 1 до 10 и в кол-ве 10-и и без...

Генератор случайных чисел - C++
Добрый день!У меня есть код #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;cstring&gt; #include &lt;ctime&gt; char randSym() { ...

Генератор случайных чисел - C++
Здравствуйте, для программы мне требуется генератор, который будет задавать рандомно число, но данное число должно быть с определенными...

8
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
13.08.2012, 15:12 #2
Цитата Сообщение от mr_free Посмотреть сообщение
void processData(const>short* data), const int n)
Это что такое? Исправьте:
C++
1
void processData(const short* data, const int n)
И для быстрого решения проблем, желательно давать ошибки с указанием строки (если компилятор предоставляет).
0
mr_free
69 / 3 / 0
Регистрация: 08.08.2012
Сообщений: 223
Записей в блоге: 1
13.08.2012, 15:33  [ТС] #3
Это опечаточка! Сейчас предоставлю координаты ошибок.

Добавлено через 9 минут
Сами ошибки:
Код
1>d: error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
 error C2143: синтаксическая ошибка: отсутствие ")" перед ">"
 error C2059: синтаксическая ошибка: >
 error C2059: синтаксическая ошибка: )
 error C2143: синтаксическая ошибка: отсутствие ";" перед "{"
 error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа)
Координаты ошибок в том же порядке:
Код
Строка 11 Столбец 1 Знак 1
Добавлено через 2 минуты
Увы не получиться, так как компилятор обрезаный, пишу с нетбука, а он не потянет!
0
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
13.08.2012, 15:33 #4
Я же вам показал исправленный вариант в предыдущем сообщении.
0
mr_free
69 / 3 / 0
Регистрация: 08.08.2012
Сообщений: 223
Записей в блоге: 1
13.08.2012, 16:02  [ТС] #5
Увы не получиться строиться проект на нетбуке, и поэтому компилятор обрезанный, а он полный не потянет!

Добавлено через 4 минуты
Измененный код!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <fstream>
#include <iostream>
#include <windows.h>
#include "stdafx.h"
#include <mmsystem.h>
using namespace std;
 
 
void processData(const short* data, const int n)
{
    ofstream output("data.txt");
    output.flags(std::ios::right+std::ios::fixed);
 
    double avr = 0.0;
    double deviation = 1.0;
 
    const double outDeviation = 13.0f;
    const double outAvr = 13.0f;
 
    for (int i = 0; i < n; i++)
    {
        avr += (double)data[i];
        deviation += (double)(data[i] * data[i]);
    }
 
    avr /= (double)n;
    deviation = sqrt(deviation / (double)n - avr * avr);
 
    for (int i = 0; i < n; i++)
    {
        double conv = (outDeviation * (double)data[i]) / deviation + 
            outAvr - (outDeviation * avr) / deviation;
        output << conv << endl;        
        //output << (short)data[i] << std::endl;
    }
 
    output.close();
}
 
void CALLBACK onBufferIn(HWAVEIN hwi, UINT uMsg, DWORD dwInstance, 
                              DWORD dwParam1, DWORD dwParam2)
{
    switch (uMsg)
    {
    case WIM_DATA:
        cout << "data message" << endl;
 
        LPWAVEHDR lpWaveHdr;
 
        lpWaveHdr = (LPWAVEHDR)dwParam1;
        cout << "recorded = " << lpWaveHdr->dwBytesRecorded << endl;
        cout << "coping.." << endl;
 
        void* bufferData = malloc(lpWaveHdr->dwBytesRecorded);
        memcpy((void *)bufferData, (const void*)lpWaveHdr->lpData, lpWaveHdr->dwBytesRecorded);
 
        processData((short*)bufferData, lpWaveHdr->dwBytesRecorded / sizeof(short));
 
        free(bufferData);
        waveInUnprepareHeader(hwi, lpWaveHdr, sizeof(WAVEHDR));
        free(lpWaveHdr->lpData);
 
        break;
    }
}
void openDevice()
{
    HWAVEIN hWaveIn;
    WAVEHDR waveHdr;
    WAVEFORMATEX waveFormat;
 
    //open
    waveFormat.wFormatTag = WAVE_FORMAT_PCM;
    waveFormat.nChannels = 1;
    waveFormat.nSamplesPerSec = 44100L;
    waveFormat.wBitsPerSample = 16;
    waveFormat.nBlockAlign = 2; //bytes
    waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign;
    waveFormat.cbSize = 0;
 
    MMRESULT result;
    result = waveInOpen(&hWaveIn, 1, &waveFormat, /*(DWORD)onBufferIn*/NULL, 0, CALLBACK_FUNCTION);
    if (result != MMSYSERR_NOERROR) 
        cout << "waveInOpen error" << endl;
 
    ULONG bufferSize = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign * 1;
 
    ZeroMemory(&waveHdr, sizeof(WAVEHDR));
    waveHdr.lpData = (LPSTR)malloc(bufferSize);
    waveHdr.dwBufferLength = bufferSize;
 
    //prepare
    result = waveInPrepareHeader(hWaveIn, &waveHdr, sizeof(WAVEHDR));
    if (result != MMSYSERR_NOERROR)
        cout << "waveInPrepareHeader error " << result << endl;
 
    //add buffer
    result = waveInAddBuffer(hWaveIn, &waveHdr, sizeof(WAVEHDR));
    if (result != MMSYSERR_NOERROR)
        cout << "waveInAddBuffer error " << result << endl;
 
    result = waveInStart(hWaveIn);
    if (result != MMSYSERR_NOERROR)
        cout << "waveInStart error" << result <<endl;
 
    Sleep(2000);
    waveInStop(hWaveIn);
}
 
int main()
{
    openDevice();
 
    return 0;
}
А ошибки те же!

Добавлено через 22 минуты
Ошибки происходят в этих строках!
Код
void processData(const>short*data, const int n)
{
0
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
13.08.2012, 16:04 #6
У меня ваш код компилируется без ошибок.

Добавлено через 1 минуту
Сделайте rebuild
0
mr_free
69 / 3 / 0
Регистрация: 08.08.2012
Сообщений: 223
Записей в блоге: 1
13.08.2012, 16:26  [ТС] #7
То был косой компилятор поставил visual studio и заработал!Благодарю за помощь!!
cossack5, а не могли бы выполнить построение проекта у себя что пройзойдет ошибки waveinopeneror etc.?
0
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
13.08.2012, 22:00 #8
Исправьте у себя на это:
C++
1
result = waveInOpen(&hWaveIn, WAVE_MAPPER, &waveFormat, /*(DWORD)onBufferIn*/NULL, 0, CALLBACK_FUNCTION);
0
raxp
10164 / 6550 / 477
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
13.08.2012, 22:12 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
действительно ли то что я пишу можно будет после избавления от ошибок назвать аппаратным генератором случайных чисел?
аппаратно-программным назвать можно. Однако нужно учитывать, что собственный шум у разных аудиокарт разный по уровню (точнее, он нормирован для самого аудиочипа), а значит будет смещение статистики генерации.

Поясните вашу нормировку:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
double avr = 0.0;
    double deviation = 1.0;
 
    const double outDeviation = 13.0f;
    const double outAvr = 13.0f;
 
    for (int i = 0; i < n; i++)
    {
        avr += (double)data[i];
        deviation += (double)(data[i] * data[i]);
    }
 
    avr /= (double)n;
    deviation = sqrt(deviation / (double)n - avr * avr);
 
    for (int i = 0; i < n; i++)
    {
        double conv = (outDeviation * (double)data[i]) / deviation + 
            outAvr - (outDeviation * avr) / deviation;
        output << conv << endl;        
        //output << (short)data[i] << std::endl;
    }
0
13.08.2012, 22:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2012, 22:12
Привет! Вот еще темы с ответами:

Генератор случайных чисел - C++
Добрый вечер! Собственно-то тако задание: необходимо правильно задать параметры для ЛКГ и написать функцию, возвращающую случайные числа,...

Генератор случайных чисел - C++
Здравствуйте! Кто-нибудь объясните пожалуйста. Вот есть функция rand(). Она возвращает псевдослучайные числа от нуля до RAND_MAX. А можно...

Генератор случайных чисел - C++
Пишу курсовую по криптографии, для генерации ключей, естественно, нужен генератор случайных чисел. Что вообще можно использовать в этом...

Генератор случайных чисел - C++
Всем привет, вот такая задачка. &quot;Датчики случайных чисел можно привлекать при подборе проверочных исходных данных для программ. а) 25...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru