Informatică, întrebare adresată de tmbogdan120, 8 ani în urmă

Cum se rezolva eroarea la codul acesta:

#include

#include

using namespace std;

int main()

{





int rows, colums;

cout << "row= ";

cin >> rows;

cout << "colums= ";

cin >> colums;


int *Matrix = (int*)malloc(rows * colums * sizeof(int));


for (int i = 0; i < rows; i++)

{

for (int j = 0; j, colums; j++)

{

cout << "Matrix[" << i << "][" << j << "]= ";

cin << Matrix[i][j];

}

}

for (int i = 0; i < rows; i++)

{

for (int j = 0; j, colums; j++)

{

cout << Matrix[i][j];

}

cout << endl;

}

free(Matrix);

return 0;

}

Răspunsuri la întrebare

Răspuns de Apollyon
0

Răspuns:

#include <iostream>

using namespace std;

int main()

{

   int rows, colums;

   cout << "row= ";

   cin >> rows;

   cout << "colums= ";

   cin >> colums;

   int **Matrix = (int **)malloc(rows * sizeof(int *));

   for (int i = 0; i < rows; i++)

   {

       Matrix[i] = (int *)malloc(colums * sizeof(int));

       for (int j = 0; j < colums; j++)

       {

           cout << "Matrix[" << i << "][" << j << "]= ";

           cin >> Matrix[i][j];

       }

   }

   for (int i = 0; i < rows; i++)

   {

       for (int j = 0; j < colums; j++)

           cout << Matrix[i][j];

       cout << endl;

   }

   for (int i = 0; i < rows; i++)

       free(Matrix[i]);

   free(Matrix);

   return 0;

}

Explicație:

În primul rând ștergi cele două include-uri și adaugi un #include <iostream>.
După foloseai din câte am văzut << cu cin, pentru cin folosești >>.

După în for, de exemplu „for (int j = 0; j, colums; j++)” trebuie să-l scrii ca și „for (int j = 0; j < colums; j++)”.

Când aloci matricea dinamică prima dată aloci un array de dublu pointeri ( fiecare pointer „va arăta” spre o linie a matricii ( care e un alt array de intregi )) și la final eliberezi matricea alocată.


tmbogdan120: si cum pot face sa fie dublu pointer?
tmbogdan120: adica nu inteleg partea asta :
tmbogdan120: int **Matrix = (int **)malloc(rows * sizeof(int *));

for (int i = 0; i < rows; i++)

{

Matrix[i] = (int *)malloc(colums * sizeof(int));

for (int j = 0; j < colums; j++)

{

cout << "Matrix[" << i << "][" << j << "]= ";

cin >> Matrix[i][j];

}
Apollyon: Ok, o să-ți încarc o poză unde am încercat s-o explic cât de bine am putut ideea cu ** :)) sper să nu te fi băgat mai tare-n ceață
Apollyon: https://imgur.com/6C0KSz2
Apollyon: int **Matrix = (int **)malloc(rows * sizeof(int *)) îți alocă o zonă de memorie de 4/8 bytes * rows ( dacă ai 3 linii o să-ți aloce 12/24 bytes ) în care o să ai salvați 3 pointeri și-ți returnează adresa de început a zonei ăleia pe care o salvezi în Matrix.
poate cu sintaxa din c++ îți e mai ușor de văzut
int ** Matrix = new int*[rows]; ( un vector de pointeri )
Apollyon: după parcurgi vectorul cu pointer și fiecărui pointer îi aloci un vector de întregi.. asta face Matrix[i] = (int *)malloc(colums * sizeof(int)) practic, ia primul element din vectorul cu pointeri și-n el salvează adresa vectorului cu întregi, după ia al doilea pointer din vector și face același lucru și tot așa...
Apollyon: și după citești matricea în for-ul cu j
Alte întrebări interesante