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

Массив теряет значения:/ - C++

Восстановить пароль Регистрация
 
angryjack93
7 / 3 / 1
Регистрация: 04.11.2012
Сообщений: 218
18.04.2013, 08:17     Массив теряет значения:/ #1
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
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <audiere.h>
 
using namespace std;
using namespace audiere;
 
void sound_func(char **text_sound, int kol_symb_text, int sum_words);
 
int InitialAudiere(){
    AudioDevicePtr device = OpenDevice();
    if(!device) {
        cout << "OpenDevice() failed!\n";
        return 1;
    };
}
 
void PlaySymbols(char symbol, int softness){
    char SoundFileName[6];
    SoundFileName[2] = '.';
    SoundFileName[3] = 'w';
    SoundFileName[4] = 'a';
    SoundFileName[5] = 'v';
    
    if(softness == '1') SoundFileName[1] = '\'';
    if(softness == '0') SoundFileName[1] = '$';
    
    SoundFileName[0] = symbol;
}
 
int main()
{
    char text_string[] = "";
    cout << "Please, enter text for the voice: \n";
    gets(text_string);
    int kol_symb = strlen(text_string);
    int spaces = 0;
 
    for(int i = 0; i < kol_symb; i++) {if(text_string[i] == ' ') spaces++;}
 
    int sum_words = spaces + 1;
    char **strip_words = new char* [sum_words];
    for(int i = 0; i <= sum_words; i++)
        strip_words[i] = new char [30];
    int symb_beg_word = 0;
    int p = 0; int sum_spaces = 0;
    
    for(int i = 0; i < sum_words; i++){
        int g = 0;
        for(int j = symb_beg_word; j < kol_symb; j++){
            if(text_string[j] != ' ')
            {
               strip_words[i][g] = text_string[j];
               g++;
            }
            else{
                p = j; sum_spaces = 0;
                symb_beg_word = j + sum_spaces;
                break;
            }
 
        }
    }
    sound_func(strip_words, kol_symb, sum_words);
 
    getch();
    return 0;
}
 
void sound_func(char **text_sound, int kol_symb_text, int sum_words)
{
    InitialAudiere();
    
    for(int j = 0; j < sum_words; j++){
        for(int i = 0; i < kol_symb_text; i++){
            cout << text_sound[j][i];
            switch(text_sound[j][i]){
                case 'а':
                    break;
                case 'б': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;
                case 'в': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;
                case 'г': 
                    if(text_sound[j][i++] == text_sound[j][i])
                    break;
                case 'д': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;          
                case 'е': 
                    if((i == 0) || (text_sound[j][i--] == ' ') || (text_sound[j][i--] == 'ъ') || (text_sound[j][i--] == 'ь') ||
                      (text_sound[j][i--] == 'а' || text_sound[j][i--] == 'А' || text_sound[j][i--] == 'е' || text_sound[j][i--] == 'Е' ||
                       text_sound[j][i--] == 'ё' || text_sound[j][i--] == 'Ё' || text_sound[j][i--] == 'и' || text_sound[j][i--] == 'И' ||
                       text_sound[j][i--] == 'о' || text_sound[j][i--] == 'О' || text_sound[j][i--] == 'у' || text_sound[j][i--] == 'У' ||
                       text_sound[j][i--] == 'ы' || text_sound[j][i--] == 'Ы' || text_sound[j][i--] == 'э' || text_sound[j][i--] == 'Э' ||
                       text_sound[j][i--] == 'ю' || text_sound[j][i--] == 'Ю' || text_sound[j][i--] == 'я' || text_sound[j][i--] == 'Я')){
                        kol_symb_text++;
                        text_sound[j][i] = 'й';
                        for(int k = i; k < kol_symb_text; k++)
                            text_sound[j][k++] = text_sound[j][k];
                        text_sound[j][i++] = 'э';
                    }
                    break;  
                case 'ё': 
                    if((i == 0) || (text_sound[j][i--] == ' ') || (text_sound[j][i--] == 'ъ') || (text_sound[j][i--] == 'ь') ||
                      (text_sound[j][i--] == 'а' || text_sound[j][i--] == 'А' || text_sound[j][i--] == 'е' || text_sound[j][i--] == 'Е' ||
                       text_sound[j][i--] == 'ё' || text_sound[j][i--] == 'Ё' || text_sound[j][i--] == 'и' || text_sound[j][i--] == 'И' ||
                       text_sound[j][i--] == 'о' || text_sound[j][i--] == 'О' || text_sound[j][i--] == 'у' || text_sound[j][i--] == 'У' ||
                       text_sound[j][i--] == 'ы' || text_sound[j][i--] == 'Ы' || text_sound[j][i--] == 'э' || text_sound[j][i--] == 'Э' ||
                       text_sound[j][i--] == 'ю' || text_sound[j][i--] == 'Ю' || text_sound[j][i--] == 'я' || text_sound[j][i--] == 'Я')){
                        kol_symb_text++;
                        text_sound[j][i] = 'й';
                        for(int k = i; k < kol_symb_text; k++)
                            text_sound[j][k++] = text_sound[j][k];
                        text_sound[j][i++] = 'о';
                    }
                    break;          
                case 'ж': 
                    if(text_sound[j][i++] == text_sound[j][i])
                    break;      
                case 'з': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;      
                case 'и': 
                    break;      
                case 'й': 
                    break;      
                case 'к': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;                       
                case 'л': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;      
                case 'м': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;                       
                case 'н': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;  
                case 'о':
                    break;  
                case 'п': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;  
                case 'р': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;      
                case 'с': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;
                case 'т': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;  
                case 'у':
                    break;      
                case 'ф': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;      
                case 'х': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;                       
                case 'ц': 
                    if(text_sound[j][i++] == text_sound[j][i])
                    break;
                case 'ч': 
                    if(text_sound[j][i++] == text_sound[j][i])
                    break;
                case 'ш': 
                    if(text_sound[j][i++] == text_sound[j][i])
                    break;                      
                case 'щ': 
                    if(text_sound[j][i++] == text_sound[j][i])
                    break;          
                case 'ъ':
                    break;                               
                case 'ы': 
                    if(text_sound[j][i++] == text_sound[j][i])
                    break;      
                case 'ь':
                    break;
                case 'э':
                    break;      
                case 'ю':
                    if((i == 0) || (text_sound[j][i--] == ' ') || (text_sound[j][i--] == 'ъ') || (text_sound[j][i--] == 'ь') ||
                      (text_sound[j][i--] == 'а' || text_sound[j][i--] == 'А' || text_sound[j][i--] == 'е' || text_sound[j][i--] == 'Е' ||
                       text_sound[j][i--] == 'ё' || text_sound[j][i--] == 'Ё' || text_sound[j][i--] == 'и' || text_sound[j][i--] == 'И' ||
                       text_sound[j][i--] == 'о' || text_sound[j][i--] == 'О' || text_sound[j][i--] == 'у' || text_sound[j][i--] == 'У' ||
                       text_sound[j][i--] == 'ы' || text_sound[j][i--] == 'Ы' || text_sound[j][i--] == 'э' || text_sound[j][i--] == 'Э' ||
                       text_sound[j][i--] == 'ю' || text_sound[j][i--] == 'Ю' || text_sound[j][i--] == 'я' || text_sound[j][i--] == 'Я')){
                        kol_symb_text++;
                        text_sound[j][i] = 'й';
                        for(int k = i; k < kol_symb_text; k++)
                            text_sound[j][k++] = text_sound[j][k];
                        text_sound[j][i++] = 'у';
                    }
                    break;  
                case 'я':
                    if((i == 0) || (text_sound[j][i--] == ' ') || (text_sound[j][i--] == 'ъ') || (text_sound[j][i--] == 'ь') ||
                      (text_sound[j][i--] == 'а' || text_sound[j][i--] == 'А' || text_sound[j][i--] == 'е' || text_sound[j][i--] == 'Е' ||
                       text_sound[j][i--] == 'ё' || text_sound[j][i--] == 'Ё' || text_sound[j][i--] == 'и' || text_sound[j][i--] == 'И' ||
                       text_sound[j][i--] == 'о' || text_sound[j][i--] == 'О' || text_sound[j][i--] == 'у' || text_sound[j][i--] == 'У' ||
                       text_sound[j][i--] == 'ы' || text_sound[j][i--] == 'Ы' || text_sound[j][i--] == 'э' || text_sound[j][i--] == 'Э' ||
                       text_sound[j][i--] == 'ю' || text_sound[j][i--] == 'Ю' || text_sound[j][i--] == 'я' || text_sound[j][i--] == 'Я')){
                        kol_symb_text++;
                        text_sound[j][i] = 'й';
                        for(int k = i; k < kol_symb_text; k++)
                            text_sound[j][k++] = text_sound[j][k];
                        text_sound[j][i++] = 'а';
                    }
                    break;              
            }
    }
}
}
Знаю, что много, но сам не разберусь, в чем проблема:\ В общем в функцию передаю массив динамический, а после в цикле пытаюсь его напечатать, но если в массиве будет "просто", то печатает "прос". Если убрать switch{}, то все нормально.... Подскажите, в чем проблема??
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
18.04.2013, 11:51     Массив теряет значения:/ #2
angryjack93, я думаю, у Вас проблема с регулярным декрементом/инкрементом во втором индексе text_sound. Вы понимаете, что значит запись i++, i-- ?
angryjack93
7 / 3 / 1
Регистрация: 04.11.2012
Сообщений: 218
18.04.2013, 14:25  [ТС]     Массив теряет значения:/ #3
Цитата Сообщение от Tulosba Посмотреть сообщение
angryjack93, я думаю, у Вас проблема с регулярным декрементом/инкрементом во втором индексе text_sound. Вы понимаете, что значит запись i++, i-- ?
Ну вроде i = 1;
а text_sound[j][1+1] тогда
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
18.04.2013, 14:40     Массив теряет значения:/ #4
Цитата Сообщение от angryjack93 Посмотреть сообщение
Ну вроде i = 1;
а text_sound[j][1+1] тогда
i++; равнозначно i = i+1; т.е. i меняется. А теперь посмотрите сколько изменений происходит в какой-нибудь case 'ю'.
angryjack93
7 / 3 / 1
Регистрация: 04.11.2012
Сообщений: 218
18.04.2013, 15:00  [ТС]     Массив теряет значения:/ #5
Цитата Сообщение от Tulosba Посмотреть сообщение
i++; равнозначно i = i+1; т.е. i меняется. А теперь посмотрите сколько изменений происходит в какой-нибудь case 'ю'.
хм) походу я сглупил сильно)))

Добавлено через 3 минуты
А каким образом мне тогда обратиться к следующему элементу?
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
18.04.2013, 15:02     Массив теряет значения:/ #6
Цитата Сообщение от angryjack93 Посмотреть сообщение
А каким образом мне тогда обратиться к следующему элементу?
можно просто i+1, т.е. без присваивания. Или завести временную переменную и использовать ее уже:
C++
1
2
int nexti = i+1;
text_sound[j][nexti] ...
shuffle
19 / 19 / 1
Регистрация: 30.03.2013
Сообщений: 35
18.04.2013, 15:03     Массив теряет значения:/ #7
Цитата Сообщение от angryjack93 Посмотреть сообщение
А каким образом мне тогда обратиться к следующему элементу?
Вместо text_sound[j][i--] пишите text_sound[j][i - 1], аналогично для +. Не совмещайте обращение к элементам массива и изменение счетчика в одной инструкции.
Tulosba
18.04.2013, 15:05
  #8

Не по теме:

Цитата Сообщение от shuffle Посмотреть сообщение
Не совмещайте обращение к элементам массива и изменение счетчика в одной инструкции.
Иногда это удобно и более лаконично. Просто надо понимать что делаешь.

shuffle
18.04.2013, 15:11
  #9

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Иногда это удобно и более лаконично. Просто надо понимать что делаешь.
Согласен с вами. Совет относится к новичку. Особенно в подобном коде, в котором на результат влияет семантика ленивых вычислений оператора ||.

angryjack93
7 / 3 / 1
Регистрация: 04.11.2012
Сообщений: 218
19.04.2013, 08:11  [ТС]     Массив теряет значения:/ #10
хм, а почему у меня при замене на такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for(int i = 0; i < kol_symb_text; i++){
        cout << text_sound[j][i];
            switch(text_sound[j][i]){
                case 'а':
                    cout << "\n" << text_sound[j][i];
                    break;
                case 'б': 
                    cout << "\n" << text_sound[j][i];
                    if(text_sound[j][i+1] == text_sound[j][i]){}
                    if(text_sound[j][i+1] == 'ь'){}
                    break;
                case 'в': 
                    cout << "\n" << text_sound[j][i];
                    if(text_sound[j][i+1] == text_sound[j][i]){}
                    if(text_sound[j][i+1] == 'ь'){}
                    break;
Тут в общем при любых буквах пробегает по всем ветвям case. В общем снова ввожу "просто", а выводит:
"пр
рос
ст
то"

Должно же только по определенной ветви идти? ИЛи я не прав?
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.04.2013, 08:42     Массив теряет значения:/ #11
Цитата Сообщение от angryjack93 Посмотреть сообщение
Тут в общем при любых буквах пробегает по всем ветвям case. В общем снова ввожу "просто", а выводит:
"пр
рос
ст
то"

Должно же только по определенной ветви идти? ИЛи я не прав?
Чего вообще Вы хотите добиться? Если не понятно как ветвится программа - запустите под отладчиком.
angryjack93
7 / 3 / 1
Регистрация: 04.11.2012
Сообщений: 218
19.04.2013, 09:05  [ТС]     Массив теряет значения:/ #12
Цитата Сообщение от Tulosba Посмотреть сообщение
Чего вообще Вы хотите добиться? Если не понятно как ветвится программа - запустите под отладчиком.
Я хочу, чтобы от одной буквы шло по ветви с той же буквой, а не чтобы у меня при "р" шло по ветке "а":\
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.04.2013, 09:33     Массив теряет значения:/ #13
Цитата Сообщение от angryjack93 Посмотреть сообщение
Я хочу, чтобы от одной буквы шло по ветви с той же буквой, а не чтобы у меня при "р" шло по ветке "а":\
Я имел в виду логику более высокого уровня. Что должна делать программа? Приведите итоговый код, где ветвление идет не так, как Вам хочется.
angryjack93
7 / 3 / 1
Регистрация: 04.11.2012
Сообщений: 218
20.04.2013, 12:28  [ТС]     Массив теряет значения:/ #14
Первый пост - вся программа. Суть ее работы: помещаем в двумерный массив разбитый на слова другой, одномерный массив. Передаем двумерный в функцию, где Каждый элемент проверяется (какая буква этот элемент) и в зависимости от буквы идет по определенной ветви. Сами ветки ничего пока что не делают...
Если это не то, что вам надо, то я не в курсе, что еще написать:\

Вся конструкция switch идет неправильно.

Добавлено через 20 часов 46 минут
Похоже, что идей ни у кого нет(

Добавлено через 11 минут
Хм, оказывается дело в кодировке:\ НО! Если я ставлю system("chcp 1251"), то вся кириллица выводиться непонятными иероглифами, но работает правильно... идет по нужной ветке. Пробовал ставить chcp 65001, но тогда русские буквы вообще не выводит. Какую кодировку ставить не пойму:/
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.04.2013, 14:12     Массив теряет значения:/ #15
Цитата Сообщение от angryjack93 Посмотреть сообщение
Первый пост - вся программа.
В строке 34 не выделена память, надо хотя бы так:
C++
1
char text_string[100] = "";
Отсюда возможны разные нюансы поведения.
angryjack93
7 / 3 / 1
Регистрация: 04.11.2012
Сообщений: 218
20.04.2013, 14:27  [ТС]     Массив теряет значения:/ #16
Цитата Сообщение от Tulosba Посмотреть сообщение
В строке 34 не выделена память, надо хотя бы так:
C++
1
char text_string[100] = "";
Отсюда возможны разные нюансы поведения.
Соглашусь, но мне неизвестно количество элементов, пока пользователь их не введет
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.04.2013, 14:32     Массив теряет значения:/ #17
Цитата Сообщение от angryjack93 Посмотреть сообщение
Соглашусь, но мне неизвестно количество элементов, пока пользователь их не введет
Используйте std::string тогда. Просто писать в массив, под который не выделена память нельзя.
angryjack93
7 / 3 / 1
Регистрация: 04.11.2012
Сообщений: 218
20.04.2013, 18:06  [ТС]     Массив теряет значения:/ #18
Но проблема с кодировкой все равно не решена:\
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2013, 23:47     Массив теряет значения:/
Еще ссылки по теме:

Написать программу, в которой создается двухмерный массив, значения вводятся с клавиатуры,потом значения умножаются по строкам - access violation C++
Заменяемые значения вывести в массив В. Вывести на экран полученную матрицу и массив B. C++
C++ Почему не полностью работает программа шифрования? шифрует ок, а дешифрирует плохо, теряет последние 2 символа

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.04.2013, 23:47     Массив теряет значения:/ #19
Цитата Сообщение от angryjack93 Посмотреть сообщение
Но проблема с кодировкой все равно не решена:\
По кодировке в консоле много тем. Смотрите в ВАЖНЫХ для начала.
Yandex
Объявления
20.04.2013, 23:47     Массив теряет значения:/
Ответ Создать тему
Опции темы

Текущее время: 00:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru