Ошибка сегментации (дамп ядра) ошибка времени выполнения с программой MaxPairwiseProduct

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
int main()
{
    int MaxPairwiseProduct(vector<int>& numbers);
    //declaration
    vector<int> *x;
    x->push_back(1);
    x->push_back(2);

    int answer = MaxPairwiseProduct(*x);
    cout << answer;
}

int MaxPairwiseProduct(vector<int>& numbers) {
    int index1 =  1;
    int index2;

    //vector<int> numbers = number;
    int n = numbers.size();
    for(int i = 2;i < n;++i){
        if (numbers[i]>numbers[index1]){
            index1 = i;
            }
    }
    if (index1 == 1){
        index2 = 2;
    } else {
    index2 = 1;
    }

    for(int i = 1;i < n;++i){
        if (numbers[i] != numbers[index1] && numbers[i]>numbers[index2]){
            index2 = i;
        }
    }
    numbers[index1] * numbers[index2];
    return numbers[index1] * numbers[index2];
}

Я пытаюсь реализовать, казалось бы, продвинутый алгоритм, чтобы найти максимальный попарный продукт. Я продолжаю получать ошибки Segmentation fault (core dumped), и я знаю, что это как-то связано с моими указателями и, возможно, объемом моих функций. Какие-нибудь советы или подсказки?

vector<int> *x; ваш векторный указатель никогда не инициализируется действительным экземпляром. Почему вы вообще используете там указатель?
πάντα ῥεῖ 16.12.2018 10:55

До нашей эры. Я могу догадаться, лол, хочу убедиться, что помню управление памятью в C++. Как мне инициализировать его действительным экземпляром?

CAM 16.12.2018 11:00

Лучшим способом было бы вообще не использовать указатель: vector<int> x; и заменить стрелки разыменования -> на ., а также опустить * при передаче его другой функции.

πάντα ῥεῖ 16.12.2018 11:06

Я сделал то же самое, и теперь получаю 0 как ответ, который является ложным.

CAM 16.12.2018 11:23

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

πάντα ῥεῖ 16.12.2018 11:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
83
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
int main()
{
    int MaxPairwiseProduct(vector<int>& numbers);
    //declaration
    vector<int> *x = new vector<int>();
    x->push_back(7);
    x->push_back(4);
    x->push_back(5);
    x->push_back(6);


    int answer = MaxPairwiseProduct(*x);

    cout << answer;delete x;
}

int MaxPairwiseProduct(vector<int>& numbers) {
    int index1 =  1;
    int index2;

    //vector<int> numbers = number;
    int n = numbers.size();
    for(int i = 0;i < n;++i){
        if (numbers[i]>numbers[index1]){
            index1 = i;
            }
    }
    if (index1 == 1){
        index2 = 2;
    } else {
    index2 = 1;
    }

    for(int i = 0;i < n;++i){
        if (numbers[i] != numbers[index1] && numbers[i]>numbers[index2]){
            index2 = i;
        }
    }

    return numbers[index1] * numbers[index2];
}

Я заставил это работать там был странный ночной пердун мозга.

Привет - добро пожаловать в stackoverflow! Ваш код выглядит хорошо. Я просто хотел добавить, что вам не нужно создавать x как указатель на вектор. Использование его в качестве вектора будет работать нормально, и тогда вам не нужно будет вызывать delete в конце. Он будет выглядеть как vector<int> x = vector<int>(); или, альтернативно, vector<int> x{}.

Alecto Irene Perez 17.12.2018 03:43
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;


int main(){
    long MaxPairwiseProductFast(vector<long>& numbers);

    long N, input;
    vector<long> *V = new vector<long>();
    cin >> N;


    do {
                V->push_back(input);}
    while (V->size() <= N && cin >> input);

    long answer = MaxPairwiseProductFast(*V);

    cout << answer;
    delete V;
}

 long MaxPairwiseProductFast(vector<long>& numbers) {
    int index1 =  1;
    int index2 = 1;

    int n = numbers.size();
    for(int i = 2;i < n;++i){
        if (numbers[i]>numbers[index1]){
            index1 = i;
            }
    }
    if (index1 == 1){
        index2 = 2;
    } else {
    index2 = 1;
    }

    for(int i = 2;i < n;++i){
        if (i != index1 && numbers[i]>numbers[index2]){
            index2 = i;
        }
    }

    return  (long)(numbers[index1] * numbers[index2]);
}

long MaxPairwiseProduct(vector<long>& A) {
int index = 1;
int n = A.size();
for(int i = 2; i < n; ++i){
    if (A[i] > A[index]){
        index = i;
    }
}
swap(A[index], A[n]);
index = 1;
for (int i = 2; i < n-1; ++i){
    if (A[i] > A[index]){
        index = i;
    }
}
swap(A[index], A[n - 1]);
return A[n-1] * A[n];
}

Модифицированная версия с определяемым пользователем размером вектора и возможностью определять вводимые пользователем значения.

Другие вопросы по теме