". exe has stopped working"

Asked

Viewed 1,206 times

2

I have the following code:

typedef struct {
     unsigned int ordem;
     int *elementos;
}MAT_DIAG;

void criar_matriz (MAT_DIAG *m, int d);
void inicializar_matriz (MAT_DIAG *m);
void imprimir_matriz (MAT_DIAG *m);
int retornar_elemento_matriz (MAT_DIAG *m, int i, int j);

void main(){
    int ord, o=1;
    MAT_DIAG *d;

    printf ("Qual e a ordem da matriz? ");
    scanf ("%d", &ord);
    while ((o>=1)&&(o<=2)){
    printf ("\n");
    printf ("1. Criar e inicializar matriz\n");
    printf ("2. Imprimir matriz\n");
    printf ("Escolha a opcao: ");
    scanf ("%d", &o);
    printf ("\n");

    switch (o){
        case 1: criar_matriz(d, ord);
                inicializar_matriz(d);
        break;
        case 2: imprimir_matriz(d);
        break;
        default: printf ("Opcao invalida");
                exit(1);
    }
}
}

void criar_matriz(MAT_DIAG *m, int d){
    m->ordem=d;
    m->elementos = (int *)malloc(sizeof(int)*d);
    if (!m->elementos){
        printf ("Nao foi possivel reservar memoria para a matriz!\n");
        exit(2); }
}

void inicializar_matriz(MAT_DIAG *m){
    int i;
    printf ("\nEntre com os elementos da diagonal principal da matriz: \n");
    for (i=0;i<m->ordem;i++){
        printf ("matriz[%d][%d]",i+1,i+1);
        scanf ("%d",m->elementos+i);}
}

void imprimir_matriz(MAT_DIAG *m){
    int i, j;
    for (i=0;i<m->ordem;i++){
        printf ("\n");
        for (j=0;j<m->ordem;j++){
            printf ("%05d ", retornar_elemento_matriz(m,i,j)); 
        }
    }
}

I don’t know why, but when I compile it says the program stopped working. D:

  • Why do you use that condition (o>=1)&&(o<=2)?

  • For the menu to keep repeating while the user type the two options

  • 1

    Don’t forget to do free() to memory allocated when you no longer need it.

  • I know you’ve already received some answers, but the first step in these cases is to run the program step by step in a debugger and add the information you got through the debugger to the question, including reducing the code to relevant areas in order to speed up the evaluation of the code.

2 answers

3

    MAT_DIAG *d;

    /* ... codigo que nao atribui valor a d ... */

        case 1: criar_matriz(d, ord);
                inicializar_matriz(d);
        break;
        case 2: imprimir_matriz(d);
        break;

    /* ... */

On the lines of case 1 and those of case 2 you use the variable d without a value having been assigned.


Suggested solution: it modifies criar_matriz() to return a pointer and assign that pointer to the variable:

        case 1: d = criar_matriz(ord);

1

Here is a second solution. The first was quoted by @pmg.

//code...
//passa o endereço de d para a função cria_matriz saber onde está na memória o d, 
//pois voce trabalha em escopos diferentes, 
//se vc não passar o endereço de d, a função cria_matriz simplesmente faz uma cópia de d
case 1: criar_matriz(&d, ord);
//code....

//cria matriz recebe um endereço de ponteio, ou seja preciso de um ponteiro para ponteiro..
void criar_matriz(MAT_DIAG **m, int d){
    int i;
    //aloco a matriz na memória
    (*m) = (MAT_DIAG *)malloc(sizeof(MAT_DIAG) * d * d);
    if(!(*m)){
        printf ("Nao foi possivel reservar memoria para a matriz!\n");
        exit(2); 
    }
    (*m)->ordem=d;
    for(i=0;i<d;i++){
        //aloco todos os elmentos da matriz na memória
        (*m+i)->elementos=(int *)malloc(sizeof(int));
        if (!(*m)->elementos){
            printf ("Nao foi possivel reservar memoria para a matriz!\n");
            exit(2); 
        }
    }
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.