Cosa non va in questo programma che lavora su matrici?

di il
2 risposte

Cosa non va in questo programma che lavora su matrici?

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

  • Re: Cosa non va in questo programma che lavora su matrici?

    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).
  • Re: Cosa non va in questo programma che lavora su matrici?

    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