почему эта программа падает после того, как я вставил первые 2 ввода - PullRequest
0 голосов
/ 30 октября 2019

Мне нужно сделать динамическое распределение (двойной указатель) в функции, а затем я должен поместить в матрицу некоторое число и затем освободить его

Я также попытался написать ** матрицу вместоиз * (matrice [i]) в первой функции, когда мне нужно создать матрицу после первого динамического размещения, но это всегда неправильно, и в этом случае программа завершается после того, как я вставляю первую строку матрицы

#include <iostream>
#include <stdlib.h>

using namespace std;

void allocaMatrice(int *** matrice,int * r,int * c);
void leggiMatrice(int ** matrice,int r,int c);
void scriviMatrice(int ** matrice,int r,int c);
void deallocaMatrice(int ** matrice,int r);

int main (){
int **matrice;
    int r, c;
    allocaMatrice(&matrice,&r,&c);
    leggiMatrice(matrice,r,c);
    scriviMatrice(matrice,r,c);
    deallocaMatrice(matrice,r);

    cin.get();
    return 0;
}

void allocaMatrice(int *** matrice,int * r,int * c){
    cout<<"Dimmi il numero di righe della matrice"<<endl;
    cin>>*r;
    while(cin.get()!='\n');
    cout<<"Dimmi il numero di colonne della matrice"<<endl;
    cin>>*c;
    while(cin.get()!='\n');

    *matrice=(int **) calloc (*r,sizeof(int));

    for(int i=0;i<*c;i++){
        *matrice[i]=(int *) malloc ((*c)*sizeof(int));
    }   
}

void leggiMatrice(int ** matrice,int r,int c){
    for(int i=0;i<r;i++){
        for(int j=0;j<c;j++){
           cout<<"Dimmi l'elemeno alla riga e colonna corrente"<<endl;
            cin>>matrice[i][j];
            while(cin.get()!='\n');
        }
    }
}

void scriviMatrice(int ** matrice,int r,int c){

for(int i=0;i<r;i++){
    for(int j=0;j<c;j++){
        cout<<matrice[i][j]<<"\t";
    }
    cout<<endl;;
}

}

void deallocaMatrice(int ** matrice,int r){
    int i;
    for(i=0;i<r;i++){
       free((*matrice)+1);
    }
    free(matrice);
}

ошибка отладки: «Программа получила сигнал SIGSEGV, Ошибка сегментации»

Ответы [ 3 ]

1 голос
/ 30 октября 2019

Линия

*matrice=(int **) calloc (*r,sizeof(int));

неверна. Он выделяет память для *r числа int с. Вам нужно выделить память на *r количество int* с (указатели не int с)

Это должно быть:

*matrice=(int **) calloc (*r, sizeof(int*));

Вы используетеC ++ как языковой тег, но ваш код предназначен для работы как программа на C. Правильно используйте C ++ и сделайте вашу программу чище.

  1. Используйте std::vector для контейнеров и избавьте от необходимости управлять памятью.
  2. Используйте ссылочные типы для передачи аргументов между функциями.

таким образом:

#include <iostream>
#include <vector>

template<typename T>
using VecVec = std::vector<std::vector<T>>;
using IntVecVec = VecVec<int>;

void allocaMatrice(IntVecVec& matrice);
void leggiMatrice(IntVecVec& matrice);
void scriviMatrice(IntVecVec const& matrice);

// Not necessary.
// void deallocaMatrice(int ** matrice,int r);

int main() {
    IntVecVec matrice;
    allocaMatrice(matrice);
    leggiMatrice(matrice);
    scriviMatrice(matrice);

    std::cin.get();
}

void allocaMatrice(IntVecVec& matrice) {
    int righe, colonne;
    std::cout << "Dimmi il numero di righe della matrice\n";
    std::cin >> righe;
    //while (cin.get() != '\n');???
    std::cout << "Dimmi il numero di colonne della matrice\n";
    std::cin >> colonne;
    //while (cin.get() != '\n');??

    matrice.resize(righe, std::vector<int>(colonne, 0));
}

void leggiMatrice(IntVecVec& matrice) {
    for (auto& riga : matrice) {
        for (auto& elemeno : riga) {
            std::cout << "Dimmi l'elemeno alla riga e colonna corrente\n";
            std::cin >> elemeno;
            //while(cin.get()!='\n'); // what does this add?
        }
    }
}

void scriviMatrice(IntVecVec const& matrice) {
    for (auto const& riga : matrice) {
        for (auto const& elemeno : riga) {
            std::cout << elemeno << '\t';
        }
        std::cout << '\n';
    }
}
0 голосов
/ 31 октября 2019

Я думаю, что нашел решение: в функции allocaMatrice после первого динамического выделения (* matrice = (int **) calloc (* r, sizeof (int));) я допустил ошибку во втором динамическомраспределение вместо:

for(int i=0;i<*c;i++){
        *matrice[i]=(int *) malloc ((*c)*sizeof(int));
}

я должен был написать это:

for(int i=0;i<*c;i++){
        (*matrice)[i]=(int *) malloc ((*c)*sizeof(int));
}   

Итак, последняя программа будет такой: #include #include

using namespace std;

void allocaMatrice(int *** matrice,int  &r,int &c);
void leggiMatrice(int ** matrice,int r,int c);
void scriviMatrice(int ** matrice,int r,int c);
void deallocaMatrice(int ** matrice,int r);

int main (){
   int **matrice;
   int r, c;
   allocaMatrice(&matrice,r,c);
   leggiMatrice(matrice,r,c);
   scriviMatrice(matrice,r,c);
   deallocaMatrice(matrice,r);

   cin.get();
   return 0;
}

void allocaMatrice(int *** matrice,int  &r,int &c){
    int i;
    cout<<"Dimmi il numero di righe della matrice"<<endl;
    cin>>r;
    while(cin.get()!='\n');
    cout<<"Dimmi il numero di colonne della matrice"<<endl;
    cin>>c;
    while(cin.get()!='\n');

   *matrice=(int **) calloc (r, sizeof(int*));
   cout<<"c";
   for(i=0;i<c;i++){
       (*matrice)[i]=(int *) calloc (c,sizeof(int));
   }    
}

void leggiMatrice(int ** matrice,int r,int c){
    for(int i=0;i<r;i++){
        for(int j=0;j<c;j++){
            cout<<"Dimmi l'elemeno alla riga "<<i+1<<" e alla colonna     "<<j+1<<endl;
            cin>>matrice[i][j];
            while(cin.get()!='\n');
        }
    }
}

void scriviMatrice(int ** matrice,int r,int c){

    for(int i=0;i<r;i++){
        for(int j=0;j<c;j++){
            cout<<matrice[i][j]<<"\t";
        }  
        cout<<endl;;
    }

}

void deallocaMatrice(int ** matrice,int r){
    int i;
    for(i=0;i<r;i++){
        free((*matrice)+1);
    }
    free(matrice);
}
0 голосов
/ 31 октября 2019

Я добавлю предыдущий ответ с важной концепцией в C ++: классы. Вы используете C ++ для объектно-ориентированного программирования. В противном случае вы также можете использовать C.

Проверьте, можете ли вы следовать.

#include <iostream>
#include <vector>

template<typename T>
class Matrice {
private:
    std::vector<std::vector<T>> matrice;
public:
    void alloca();
    void leggi();
    void scrivi() const;
};

int main() {
    Matrice<int> matrice;

    matrice.alloca();
    matrice.leggi();
    matrice.scrivi();

    std::cin.get();
}

template<typename T>
T Read() {
    T output;
    std::cin >> output;
    return output;
}

template<typename T>
void Matrice<T>::alloca() {
    std::cout << "Dimmi il numero di righe della matrice\n";
    auto righe = Read<int>();

    std::cout << "Dimmi il numero di colonne della matrice\n";
    auto colonne = Read<int>();

    matrice.resize(righe, std::vector<T>(colonne, 0));
}

template<typename T>
void Matrice<T>::leggi() {
    for (auto& riga : matrice) {
        for (auto& elemeno : riga) {
            std::cout << "Dimmi l'elemeno alla riga e colonna corrente\n";
            std::cin >> elemeno;
        }
    }
}

template<typename T>
void Matrice<T>::scrivi() const {
    for (auto const& riga : matrice) {
        for (auto const& elemeno : riga) {
            std::cout << elemeno << '\t';
        }
        std::cout << '\n';
    }
}
...