Cosa non va in questo programma che lavora su matrici?

di Anonimizzato10289 il
2 risposte
Ragazzi volevo chiedervi aiuto su questo semplice programma che, nelle mie intenzioni, dovrebbe
permettere all'utente di inserire tutti gli elementi di una matrice quadrata (di dimensione anch'essa scelta dall'utente) e di raddoppiare tutti i suoi elementi, visualizzando il risultato. Ho fatto tutti i tentativi possibili e immaginabili, ma non va bene. Il programma è questo:

#include <iostream>
#include <cmath>
#include <stdlib.h>
#include <vector>
using namespace std;

double* matr(int dim, double* M[])
{
int i, j;
double *N[dim];
N[dim] = new (nothrow) double[dim];
for(i=0; i<dim; i++)
{
for(j=0; j<dim; j++)
{
N[j]=2*M[j];
}
}

return(N[dim]);
delete [] N[dim];
}



int main()
{
int i, j, dim;
double *A[dim];
double *B[dim];

cout << "Dimensione matrice quadrata";
cin >> dim;

cout <<"Inserisci matrice\n";
for(i=0; i<dim; i++)
{
for(j=0; j<dim; i++)
{
cin >> A[j];
}
}

B[dim]=matr(dim, A);

for(i=0; i<dim; i++)
{
for(j=0; j<dim; j++)
{
cout << B[j] << "\n";
}
}

system("pause");
return 0;
}

Se qualcuno sa dove sbaglio, vorrei mi dicesse esattamente quali modifiche devo fare per farlo funzionare correttamente.

2 Risposte

  • Nel main, dim non è inizializzata e anche se lo fosse l'istruzione:
    
    double *A[dim];
    
    appartiene allo standard C99, che in pratica è supportato solo da gcc e vari porting. Appena cambi compilatore non funziona più.
    Se devi dimensionare al volo qualcosa l'unica strada è usare puntatori, doppi puntatori e new.
    Tra l'altro non capisco il senso di:
    
    N[dim] = new (nothrow) double[dim];
    
    Con quella forma il new non lancia eccezioni, pertanto non sai se hai davvero allocato la memoria o no. Per di più non fai nessun test su N, ma ti limiti a usarlo come se tutto vada bene.
    Ora è vero che è praticamente impossibile avere eccezioni su una simile allocazione, ma operator new è ridefinibile a livello globale e non è detto che in futuro non ti ritrovi a usare una libreria che lo ridefinisca per qualche scopo particolare (ad esempio usare un allocatore più performante di quello di sistema).
  • Azzurrino: ultimo avvertimento. Usa i code tags. E quando gli altri ti rispondono cerca di trarre profitto e di non fare di nuovo gli stessi errori.
Devi accedere o registrarti per scrivere nel forum
2 risposte