У меня проблема. Я не могу выйти из программы, когда обнаруживаю ошибку.
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), он отлично работает (обнаружение удвоенных значений и выход), но когда я делаю то же самое для другого динамика. выделенной памяти он не выйдет и не продолжит (сообщение я записано в консольное окно, но поток программы просто продолжается...). Есть идеи, как это исправить?
return
только из функции, в которой вы находитесь. Вы можете использовать возвращаемое значение вашей функции napln
чтобы решить извне, что программа должна закончиться, на основе возвращаемого значения. Например, вы могли бы вернуть napln, допустим 1 при неудаче и 0 при успехе и на основе возвращаемого значения вы могли бы сделать:
if(!napln(A,N))
return 1; //return from main
C++ также имеет исключения в качестве альтернативы управлению потоком вашей программы через возвращаемые значения.
Кроме того, вы можете использовать функцию выхода void exit(int status)
для выхода из вашей программы, независимо от вашего текущего контекста, хотя это не очень хорошая практика для структурирования вашего кода.
Во всяком случае, код не очень хорошо структурирован. Например, вы должны попытаться не повторять себя и сделать часть запроса запроса частью своего кода функцией вместо копирования и вставки его и изменения A на B.
Я не могу понять идентификатор в вашей программе, но, возможно, проблема в том, что вы освобождаете память дважды: сначала free(p)
в функции napln
, вторая free(A)
и free(B)
в main
. Старайтесь не освобождать указатель в функции napln
.
malloc/free
,new[]/delete[]
предпочтителен. а не вызывать выделение памяти самим еще лучше, так что вы можете использоватьstd::vector
.