Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
dextroza
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 35
1

Нахождение элементов, которые принадлежат и массиву a и массиву b (segmentation fault)

26.02.2018, 17:20. Просмотров 163. Ответов 6
Метки нет (Все метки)

добрый день, стоит задача нахождения элементов, которые принадлежат и массиву а и массиву б.
вот код:
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
#include <iostream>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;
void intersect(vector <int> &mass1,vector <int> &mass2,int size1,int size2){
    vector <int> mass3;
    int max_1 = *max_element(mass1.begin(), mass2.end());
    int max_2 = *max_element(mass2.begin(),mass2.end());
    mass3.reserve(max_1+1);
    for(int i=0;i<max_1;i++){
        mass3[i]=0;
        }
    for(int i=0;i<size1;i++){
        mass3[mass1[i]]+=1;
        }
    for(int i=0;i<size2;i++){
        mass3[mass2[i]]+=1;
        }
    for(int i=0;i<max_1;i++){
       cout<<mass3[i]<<" ";
        }
}
 
 
 
 
 
int main(){
    vector <int> mass1,mass2;
    int a,i=0;
    string s;
    cout<<"enter mass1"<<endl;
    getline(cin, s);
    istringstream iss(s);
    int n;
    while (iss >> n)
        mass1.push_back(n);
    cout<<"enter mass2"<<endl;
    getline(cin,s);
    while(iss >>n)
        mass2.push_back(n);
 
 
    intersect(mass1,mass2,mass1.size(),mass2.size());
}
ошибка "segmentation fault", но не могу найти, где я обращаюсь к не инициализированному элементу массива. Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2018, 17:20
Ответы с готовыми решениями:

Массив: Найти элементы в диапазоне от 1 до 7, которые не принадлежат массиву А
Дан одномерный массив допустим А={1,3,5,7}, надо найти значения от 1 до 7...

Присваивание элементов двумерного массива другому двумерному массиву
нужно элементы одного двумерного массива присвоить другому. Вот программа. Но...

Segmentation fault
Пишу лабу для универа. В общем необходимо использовать только свои функции,...

Segmentation fault
Пытаюсь реализовать генетический алгоритм на с++. Всего существует два класса:...

Segmentation fault
Почему при таком варианте происходит Segmentation fault? vec3f trace(const...

6
LegionK
Че,пацаны,аниме?
158 / 135 / 135
Регистрация: 02.05.2017
Сообщений: 544
Завершенные тесты: 2
26.02.2018, 17:50 2
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
#include <iostream>
#include <cstdlib>
#include <vector>
#include <cmath>
#include <ctime>
#include <string>
using namespace std;
 
int main(int argc, char *argv[])
{
    vector<int>v(50);
    vector<int>v1(20);
 
    srand(time(0));
 
    for(int i = 0;i<50;i++){
        v[i] = rand() % 50;
    }
 
    for(int i = 0;i<v1.size();i++){
        v1[i] = rand() % 50;
    }
 
    for(int i = 0;i<v.size();i++){
        cout << v.at(i) << " ";
    }
 
    cout << endl;
    cout << endl;
 
    for(int i = 0;i<v1.size();i++){
        cout << v1.at(i) << " ";
    }
 
    cout << endl;
    cout << endl;
 
    for(int i = 0;i<v.size();i++){
        for(int j = 0;j<v1.size();j++){
            if(v.at(i) == v1.at(j)){
                cout << v.at(i) << " ";
            }
        }
    }
 
    return 0;
}
0
dextroza
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 35
26.02.2018, 18:06  [ТС] 3
спасибо конечно, но хотел бы узнать где у меня ошибка
0
Serg1nho
9 / 9 / 2
Регистрация: 08.02.2018
Сообщений: 9
26.02.2018, 18:56 4
Во-первых, ошибка в 8-й строке. Используются итераторы различных векторов.
Во-вторых, mass2 не заполняется, т.к. строковый поток инициализирован предыдущим значением s.
В итоге, в 9-й строке max_element возвращает mass2.end(), а его разыменование приводит к ошибке.

Затем в 12-й строке происходит обращение к неинициализированной памяти.
Вместо reserve и следующего за ней цикла следует использовать resize.

В resize также нужно использовать не значение max_1, а наибольшее из значений max_1 и max_2.

Вроде как-то так.
1
dextroza
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 35
26.02.2018, 19:35  [ТС] 5
спасибо большое,изменил код и заработало
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
#include <iostream>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;
void intersect(vector <int> &mass1,vector <int> &mass2,int size1,int size2){
    vector <int> mass3;
    int max_1 = *max_element(mass1.begin(), mass1.end());
    int max_2 = *max_element(mass2.begin(),mass2.end());
    if(max_2>max_1)
        max_1=max_2;
    mass3.resize(max_1);
    for(int i=0;i<size1;i++){
        mass3[mass1[i]]+=1;
        }
    for(int i=0;i<size2;i++){
        mass3[mass2[i]]+=1;
        }
    for(int i=0;i<max_1;i++){
       if(mass3[i]==2){
           cout<<i<<" ";
           }
 
        }
}
 
 
 
 
 
int main(){
    vector <int> mass1,mass2;
    int a,i=0;
    string s;
    cout<<"enter mass1"<<endl;
    getline(cin, s);
    istringstream iss(s);
    int n;
    while (iss >> n)
        mass1.push_back(n);
    cout<<"enter mass2"<<endl;
    istringstream oss(s);
    getline(cin,s);
    while(oss >>n)
        mass2.push_back(n);
 
 
    intersect(mass1,mass2,mass1.size(),mass2.size());
}
но результат все равно не тот,который ожидается. В чем может быть проблема?
0
Serg1nho
9 / 9 / 2
Регистрация: 08.02.2018
Сообщений: 9
26.02.2018, 20:07 6
Строковый поток istringstream oss(s) снова инициализирован предыдущим значением s.
Его нужно расположить после getline(cin,s), находящегося в строке 43.

Также в строке 12 нужно сделать max_1 + 1 чтобы не было выхода за пределы допустимого диапазона.

После этих изменений вроде работает.
1
dextroza
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 35
26.02.2018, 20:21  [ТС] 7
спасибо большое, все работает)
0
26.02.2018, 20:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2018, 20:21

Segmentation fault :(
#include&lt;iostream&gt; #include&lt;fstream&gt; using namespace std; struct test{...

Segmentation fault
Здравствуйте. Нужно динамически получить такое: char * a = {&quot;abc&quot;, NULL};...

Segmentation fault
не могу скинуть код по личным причинам. я использую строковые операторы...


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

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

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