Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
 Аватар для Xaviichi
0 / 0 / 0
Регистрация: 20.12.2014
Сообщений: 18

Глобальное задание массива в качестве параметра функции

15.02.2015, 17:25. Показов 701. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дамы и господа, такой вопрос.
Работаю с классами и функциями, и мне необходимо сделать так, чтобы значения в массиве сохранялись после вызова функции. Ниже привожу класс и функцию.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class WavProcessor
{
public:
    WavProcessor();
    ~WavProcessor();
 
    short *w;
    bool ReadWav(std::string fileName, short& );
    bool SaveWav(std::string targetFileName);
 
 
 
private:
    WAVHEADER *wh;
    short *waveData;
    //short *w;
    short *data1;
    size_t dataLen;
};
C++
1
2
3
4
5
6
7
8
bool WavProcessor::ReadWav( std::string fileName, short (&w) [10000] ) 
{wh = new WAVHEADER;
            fs.read((char*)wh, sizeof(WAVHEADER));
            dataLen = wh->subchunk2Size;
            waveData = new short[dataLen];
            w = new short[dataLen];
            data1 = new short[dataLen];
            fs.read((char*)waveData, dataLen);}
Очень буду благодарен за любую помощь.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.02.2015, 17:25
Ответы с готовыми решениями:

Функции, передача массива в качестве параметра
Приветствую) Собственно, есть простенькое задание с двумерными массивами, оно выполнено: #include <iostream.h> #include...

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

Передача двумерного массива указателей на char в качестве параметра функции
Есть массив char *result2; Нужно передать его в функцию void defDouble(???) в качестве одного из параметров . Как будет выглядеть...

8
Модератор
Эксперт С++
 Аватар для zss
13778 / 10971 / 6491
Регистрация: 18.12.2011
Сообщений: 29,257
15.02.2015, 17:29
C++
1
bool WavProcessor::ReadWav( std::string fileName, short*& w)
Будет передавать массив w.
1
 Аватар для Xaviichi
0 / 0 / 0
Регистрация: 20.12.2014
Сообщений: 18
15.02.2015, 18:05  [ТС]
Спасибо, а я правильно задал прототип функции в классе?
0
Модератор
Эксперт С++
 Аватар для zss
13778 / 10971 / 6491
Регистрация: 18.12.2011
Сообщений: 29,257
15.02.2015, 18:45
Прототип
C++
1
 bool ReadWav(std::string fileName, short*& w);
1
 Аватар для Xaviichi
0 / 0 / 0
Регистрация: 20.12.2014
Сообщений: 18
15.02.2015, 19:04  [ТС]
Почему-то не получается
Программа должна работать так: я открываю файл, записываю его содержимое в массив, изменяю его и записываю его в другой файл. Затем я открываю другой файл и пытаюсь найти разницу между содержимым двух файлов, что не получается, так как при повторном вызове функции содержимое массива исчезает.
Вот код полностью.
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#include <string>
#include <fstream>
#include <tchar.h>
#include <iostream>
#include <math.h>
 
using namespace std;
 
struct WAVHEADER
{
    char chunkId[4];
    unsigned long chunkSize;
    char format[4];
    char subchunk1Id[4];
    unsigned long subchunk1Size;
    unsigned short audioFormat;
    unsigned short numChannels;
    unsigned long sampleRate;
    unsigned long byteRate;
    unsigned short blockAlign;
    unsigned short bitsPerSample;
    char subchunk2Id[4];
    unsigned long subchunk2Size;
};
 
class WavProcessor
{
public:
    WavProcessor();
    ~WavProcessor();
 
    short *w;
    bool ReadWav(std::string fileName, short*& w);
    bool SaveWav(std::string targetFileName);
 
 
 
private:
    WAVHEADER *wh;
    short *waveData;
    //short *w;
    short *data1;
    size_t dataLen;
};
 
WavProcessor::WavProcessor() : wh(0), waveData(0)
{
}
 
 
WavProcessor::~WavProcessor()
{
    if(wh)
        delete wh;
    if(waveData)
        delete waveData;
}
 
bool WavProcessor::ReadWav( std::string fileName, short*& w )
{
    if(wh)
        delete wh;
    if(waveData)
        delete waveData;
 
    std::fstream fs(fileName.c_str(), std::ios::in | std::ios::binary);
    if(!fs.is_open())
        return false;
    int sw;
    //1000010000100011
    int psp[5]={1,-1,-1,1,1};
    int b[16]={1,0,0,1,1,0,0,1,1,1,0,1,0,1,0,1};
    int N = 5;
    unsigned int i=0;
    int a = 3;
    while (sw!=4) {
            cout << "ACTION WITH FILE" << endl;
            cout << "Choose an option:" << endl;
            cout << "1 -- Read file;" << endl;
            cout << "2 -- Embed information in file" << endl;
            cout << "3 -- Extract information from the file" << endl;
            cout << "4 -- Exit" << endl;
            cin >> sw;
        switch (sw) {
    case 1:
            wh = new WAVHEADER;
            fs.read((char*)wh, sizeof(WAVHEADER));
            dataLen = wh->subchunk2Size;
            waveData = new short[dataLen];
            w = new short[dataLen];
            data1 = new short[dataLen];
            fs.read((char*)waveData, dataLen);
            cout << "FILE WAS READ" << endl;
            for (i = 0; i < dataLen; i++) {
            if (i<16*N+1) cout << w[i] << " " << waveData[i] << " " << endl;
            }
            break;
    case 2:
        int j;
        for (i = 0; i < 16; i++) {
                 for (j = 0; j< N; j++) {
                 data1[j+i*N] = pow((-1),b[i])*a*psp[j];
                 cout << data1[j+i*N] << " ";
                 }
                 cout << endl;
            }
            cout << endl;
            i=0;
            for (i = 0; i < dataLen; i++) {
            w[i]=waveData[i];
            if (i<16*N+1) cout << w[i] << " ";
            waveData[i]=waveData[i]+data1[i];
            if (i<16*N+1) cout << waveData[i] << " " << endl;
            }
            i=0;
            cout << "EMBEDDING IS DONE" << endl;
            break;
    case 3:
        int l=0;
        j=0;
        int bizvl;
        i=0;
        for (i = 0; i < 16; i++) {
                l=0;
            for (j= 0; j < N; j++) {
                l=l+(waveData[j+i*N]-w[j+i*N])*psp[j];
                cout << waveData[j+i*N] << " " << w[j+i*N] << " " << "l = " << l << endl;
                 }
            if (l>=0) {bizvl = 0;}
            else {bizvl = 1;}
            cout << b[i] << " " << bizvl << endl;
            }
            break;
        }}
fs.close();
    return true;
}
 
bool WavProcessor::SaveWav( std::string targetFileName )
{
    if(!waveData || !wh)
        return false;
 
    std::fstream fs(targetFileName.c_str(), std::ios::out | std::ios::binary);
    if(!fs.is_open())
        return false;
 
    fs.write((char*)wh, sizeof(WAVHEADER));
    fs.write((char*)waveData, dataLen);
    fs.close();
    cout << "FILE SAVED" << endl;
 
    return true;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    WavProcessor wp;
    short int *w;
    int gd;
    while (gd!=5) {
        cout << "Choose an option:" << endl;
        cout << "1 -- Action with file test3.wav;"<< endl;
        cout << "2 -- Save out.wav;"<< endl;
        cout << "3 -- Action with file out.wav;" << endl;
        cout << "4 -- Save out1.wav;" << endl;
        cout << "5 -- Exit" << endl;
        cin >> gd;
        switch (gd) {
    case 1:wp.ReadWav("C:\\C++\\Stega\\test3.wav", w); break;
    case 2:wp.SaveWav("C:\\C++\\Stega\\out.wav"); break;
    case 3:wp.ReadWav("C:\\C++\\Stega\\out.wav", w); break;
    case 4:wp.SaveWav("C:\\C++\\Stega\\out1.wav"); break;
        }
    }
    return 0;
}
0
Модератор
Эксперт С++
 Аватар для zss
13778 / 10971 / 6491
Регистрация: 18.12.2011
Сообщений: 29,257
15.02.2015, 19:10
1.Так Вы в main переменную w нигде не используете.
Зачем ее передавать?
2. В классе WavProcessor у Вас тоже есть переменная w, почему ее не используете?

3. Где в деструкторе удаление data1 и w?
и waveData - массив:
C++
1
2
3
4
5
6
7
WavProcessor::~WavProcessor()
{
    if(wh)
        delete wh;
    if(waveData)
        delete[] waveData;
}
1
 Аватар для Xaviichi
0 / 0 / 0
Регистрация: 20.12.2014
Сообщений: 18
15.02.2015, 20:27  [ТС]
По 1 и 2 -- переменная w -- и есть та переменная, в которой я, как Вы видите, сохраняю значение массива waveData перед его изменением и хочу сохранить эти значения после вызова функции ReadWav для первого файла (test3.wav).
По третьему пункту полностью согласен, забыл добавить, но тут с переменной w тоже вопрос: раз я хочу сохранить ее значения, значить ее удалять не надо?
Или, как Вы считаете, лучше разбить функцию ReadWav на три разные функции?

Добавлено через 35 минут
Именно переменную w я и пытаюсь использовать в качестве области для хранения оригинального содержимого, данных до изменения файла, но после того, как я изменяю данные и сохраняю их в другой файл, то при чтении другого файла (повторного вызова функции) данные почему-то не сохраняются, хоть я их и не удаляю в деструкторе, непонятно почему.

Добавлено через 11 минут
Не подскажете, как же все-таки сохранить массив w[] при повторном вызове функции??
То, что данные не сохраняются, показывается при повторном вызове функции (после ее вызова для чтения файла test3.wav и вложения информации в файл) для чтения out.wav -- там первые четыре значения чему-то равны, а остальные равны нулю.
0
Модератор
Эксперт С++
 Аватар для zss
13778 / 10971 / 6491
Регистрация: 18.12.2011
Сообщений: 29,257
15.02.2015, 20:55
Зачем тогда w есть в параметрах метода.
Параметр скрывает w, которая член класса.
Уберите ее из параметров:
C++
1
bool WavProcessor::ReadWav( std::string fileName);
0
 Аватар для Xaviichi
0 / 0 / 0
Регистрация: 20.12.2014
Сообщений: 18
15.02.2015, 21:25  [ТС]
В общем-то и ввел я эту переменную в параметры функции только для того, чтобы попытаться сохранить массив.
Все убрал, вот код, все равно выдает только первые 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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#include <string>
#include <fstream>
#include <tchar.h>
#include <iostream>
#include <math.h>
 
using namespace std;
 
struct WAVHEADER
{
    char chunkId[4];
    unsigned long chunkSize;
    char format[4];
    char subchunk1Id[4];
    unsigned long subchunk1Size;
    unsigned short audioFormat;
    unsigned short numChannels;
    unsigned long sampleRate;
    unsigned long byteRate;
    unsigned short blockAlign;
    unsigned short bitsPerSample;
    char subchunk2Id[4];
    unsigned long subchunk2Size;
};
 
class WavProcessor
{
public:
    WavProcessor();
    ~WavProcessor();
 
    short *w;
    bool ReadWav(std::string fileName);
    bool SaveWav(std::string targetFileName);
 
 
 
private:
    WAVHEADER *wh;
    short *waveData;
    //short *w;
    short *data1;
    size_t dataLen;
};
 
WavProcessor::WavProcessor() : wh(0), waveData(0)
{
}
 
 
WavProcessor::~WavProcessor()
{
    if(wh)
        delete wh;
    if(waveData)
        delete[] waveData;
    if(data1)
        delete[] data1;
}
 
bool WavProcessor::ReadWav( std::string fileName)
{
    if(wh)
        delete wh;
    if(waveData)
        delete waveData;
 
    std::fstream fs(fileName.c_str(), std::ios::in | std::ios::binary);
    if(!fs.is_open())
        return false;
    int sw;
    //1000010000100011
    int psp[5]={1,-1,-1,1,1};
    int b[16]={1,0,0,1,1,0,0,1,1,1,0,1,0,1,0,1};
    int N = 5;
    unsigned int i=0;
    int a = 3;
    while (sw!=4) {
            cout << "ACTION WITH FILE" << endl;
            cout << "Choose an option:" << endl;
            cout << "1 -- Read file;" << endl;
            cout << "2 -- Embed information in file" << endl;
            cout << "3 -- Extract information from the file" << endl;
            cout << "4 -- Exit" << endl;
            cin >> sw;
        switch (sw) {
    case 1:
            wh = new WAVHEADER;
            fs.read((char*)wh, sizeof(WAVHEADER));
            dataLen = wh->subchunk2Size;
            waveData = new short[dataLen];
            w = new short[dataLen];
            data1 = new short[dataLen];
            fs.read((char*)waveData, dataLen);
            cout << "FILE WAS READ" << endl;
            for (i = 0; i < dataLen; i++) {
            if (i<16*N+1) cout << w[i] << " " << waveData[i] << " " << endl;
            }
            i=0;
            break;
    case 2:
        int j;
        for (i = 0; i < 16; i++) {
                 for (j = 0; j< N; j++) {
                 data1[j+i*N] = pow((-1),b[i])*a*psp[j];
                 cout << data1[j+i*N] << " ";
                 }
                 cout << endl;
            }
            cout << endl;
            i=0;
            for (i = 0; i < dataLen; i++) {
            w[i]=waveData[i];
            if (i<16*N+1) cout << w[i] << " ";
            waveData[i]=waveData[i]+data1[i];
            if (i<16*N+1) cout << waveData[i] << " " << endl;
            }
            i=0;
            cout << "EMBEDDING IS DONE" << endl;
            break;
    case 3:
        int l=0;
        j=0;
        int bizvl;
        i=0;
        for (i = 0; i < 16; i++) {
                l=0;
            for (j= 0; j < N; j++) {
                l=l+(waveData[j+i*N]-w[j+i*N])*psp[j];
                cout << waveData[j+i*N] << " " << w[j+i*N] << " " << "l = " << l << endl;
                 }
            if (l>=0) {bizvl = 0;}
            else {bizvl = 1;}
            cout << b[i] << " " << bizvl << endl;
            }
            i=0;
            break;
        }}
fs.close();
    return true;
}
 
bool WavProcessor::SaveWav( std::string targetFileName )
{
    if(!waveData || !wh)
        return false;
 
    std::fstream fs(targetFileName.c_str(), std::ios::out | std::ios::binary);
    if(!fs.is_open())
        return false;
 
    fs.write((char*)wh, sizeof(WAVHEADER));
    fs.write((char*)waveData, dataLen);
    fs.close();
    cout << "FILE SAVED" << endl;
 
    return true;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    WavProcessor wp;
    int gd;
    while (gd!=5) {
        cout << "Choose an option:" << endl;
        cout << "1 -- Action with file test3.wav;"<< endl;
        cout << "2 -- Save out.wav;"<< endl;
        cout << "3 -- Action with file out.wav;" << endl;
        cout << "4 -- Save out1.wav;" << endl;
        cout << "5 -- Exit" << endl;
        cin >> gd;
        switch (gd) {
    case 1:wp.ReadWav("C:\\C++\\Stega\\test3.wav"); break;
    case 2:wp.SaveWav("C:\\C++\\Stega\\out.wav"); break;
    case 3:wp.ReadWav("C:\\C++\\Stega\\out.wav"); break;
    case 4:wp.SaveWav("C:\\C++\\Stega\\out1.wav"); break;
        }
    }
    return 0;
}
Добавлено через 5 минут
При этом вроде все должно быть верно:
1. Читаю файл test3.wav, при этом значения w[] есть только в первых 4 значениях, остальные 0.
2. Вкладываю информацию в этот файл, значения массива на 3 отличаются от считанного.
3. Выхожу из функции работы с файлом test3.wav и сохраняю файл out.wav
4. Работаю с файлом out.wav, при этом уже при чтении выясняется, что значения w[] опять же есть только в первых 4 значениях, остальные 0, поэтому разницу искать дальше бесполезно.
Вот такая незадача.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.02.2015, 21:25
Помогаю со студенческими работами здесь

Передача функции в качестве параметра
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; double f(double x) { return (2*x*x)-(exp(x)); double...

Использование функции в качестве параметра
Добрый день! У меня есть класс, каждый раз при создании которого, мы соединяем его со слотом. Для удобства хочу сделать конструктор этого...

Передача функции в качестве параметра
Все привет. Помогите в решении следующей проблемы: есть класс XXX, один из методов которого принимает в качестве параметра указатель на...

Передача функции в качестве параметра
Может кто помочь объяснить следующую часть кода: double MyMethod(Func&lt;double, double&gt; f, double a, double b, double c) { ...

Передача функции в качестве параметра
Есть функция которая генерирует строковые переменные и записывает их в файл. В файл они должны записываются по разному(в текстовый,...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru