Программа C ++ не завершится по возвращении

0

У меня проблема. Я не могу выйти из программы, когда обнаруживаю ошибку.

int main()
{
    int N,N1;

    cout<<("Zadejte pocet prvku mnoziny A:")<<endl;
    cin>>N;
        if (N<=0 || cin.fail()){
            cout<<("Nespravny vstup.")<<endl;
            return 1;
        }
    int *A=(int *)malloc(sizeof(int)*N); /***********/

    cout<<("Zadejte prvky mnoziny A:")<<endl;
    napln(A,N);

    /************************************************/

    cout<<("Zadejte pocet prvku mnoziny B:")<<endl;
    cin>>N1;
        if (N1<=0 || cin.fail()){
            cout<<("Nespravny vstup.")<<endl;
            return 1;
        }
    int *B=(int *)malloc(sizeof(int)*N1); /***********/

    cout<<("Zadejte prvky mnoziny B:")<<endl;
    napln(B,N1);

    int *C=(int *)malloc(sizeof(int)*((N1>N)? N1:N)); /***********/

    vypis(C,porovnej(A,B,C,N,N1));

    free(A);
    free(B);
    free(C);
    return 0;
}

int napln(int *p,int n){

        int prvek,i,j;

        for (i=0;i<n;i++){
            cin>>prvek; //dodelat kontrolu
            if (cin.fail()){
                cout<<("Nespravny vstup.")<<endl;
                free(p);
                return 1;
            }
            else{
                p[i]=prvek;
                for(j=0;j<i;j++){
                    if (p[i]==p[j]){
                        cout<<("Nespravny vstup.")<<endl;
                        free(p);
                        return 1;
                    }
                }
            }
        }
    return 1;
}

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

  • 1
    вместо использования return 1 в вашей основной функции попробуйте использовать exit (1). Кроме того, перевод результатов на английский будет немного проще
  • 2
    в C ++ вы можете избежать вызова malloc/free , new[]/delete[] предпочтителен. а не вызывать выделение памяти самим еще лучше, так что вы можете использовать std::vector .
Показать ещё 5 комментариев
Теги:
return

2 ответа

1
Лучший ответ

return только из функции, в которой вы находитесь. Вы можете использовать возвращаемое значение вашей функции napln чтобы решить извне, что программа должна закончиться, на основе возвращаемого значения. Например, вы могли бы вернуть napln, допустим 1 при неудаче и 0 при успехе и на основе возвращаемого значения вы могли бы сделать:

if(!napln(A,N))
   return 1; //return from main

C++ также имеет исключения в качестве альтернативы управлению потоком вашей программы через возвращаемые значения.

Кроме того, вы можете использовать функцию выхода void exit(int status) для выхода из вашей программы, независимо от вашего текущего контекста, хотя это не очень хорошая практика для структурирования вашего кода.

Во всяком случае, код не очень хорошо структурирован. Например, вы должны попытаться не повторять себя и сделать часть запроса запроса частью своего кода функцией вместо копирования и вставки его и изменения A на B.

  • 0
    Здравствуй. Проблема уже решена, но вы правы. if (! napln (A, N)) вернет 1; было решение (было и кое-что еще, но я не понимаю, почему это работает один раз и не будет работать во второй раз ... не важно ... может быть, я галлюцинировал :)). И в отношении структуры программы вы снова правы, но как новичок я предпочитаю код ... код ... код ... чем код (код (код (значения))), но я хочу работать над этим :)
1

Я не могу понять идентификатор в вашей программе, но, возможно, проблема в том, что вы освобождаете память дважды: сначала free(p) в функции napln, вторая free(A) и free(B) в main. Старайтесь не освобождать указатель в функции napln.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню