How to make a pointer point to NULL?

Asked

Viewed 303 times

1

I need an element position in a dynamic vector to be empty, so I can check if I can place an element inside it later. However, the compiler does not allow it. Follow my code:

MATRIZ_ESPARSA *criar_matriz(MATRIZ_ESPARSA *matriz, int nr_linhas, int nr_colunas){
    matriz = (MATRIZ_ESPARSA *)malloc(sizeof(MATRIZ_ESPARSA));
    (*matriz).linhas = (CELULA *)malloc(nr_linhas*sizeof(CELULA));
    for(int i = 0; i < nr_linhas; i++){
        (*matriz).linhas[i] = NULL;
    }
    (*matriz).colunas = (CELULA *)malloc(nr_colunas*sizeof(CELULA));
    for(int i = 0; i < nr_colunas; i++){
        (*matriz).colunas[i] = NULL;
    }
    return(matriz); 
}

Checking whether there is any element:

if((*matriz).linhas[linha] == NULL && (*matriz).colunas[coluna] == NULL){
    (*matriz).linhas[linha] = *novo;
    (*matriz).linhas[linha].direita = NULL;
    (*matriz).colunas[coluna] = *novo;
    (*matriz).colunas[coluna].abaixo = NULL;
}
  • Which error?

  • In Function ?crea_matrix': pdf4.c:98:29: error: incompatible types when assigning to type ?CELULA {aka struct CELULA}' from type ːvoid *' (*matrix). lines[i] = NULL;

  • MATRIZ_ESPARSA.linhas is the type CELULA**?

  • no, it’s a CELLULA type *

  • 2

    You’re confusing the typing. (CELULA*)[i] is not a pointer, but yes CELULA. Since it’s not a pointer, it can’t receive NULL

1 answer

1

You can include a flag indicator of NULL in each of the cells in its matrix, for example:

#include <stdlib.h>


typedef struct CELULA {
    int is_null;
    double valor;
} CELULA;


typedef struct MATRIZ_ESPARSA {
    int nlinhas;
    int ncolunas;
    CELULA ** celulas;
} MATRIZ_ESPARSA;


MATRIZ_ESPARSA * matriz_criar( int ncolunas, int nlinhas )
{
    int y, x;

    /* Aloca a matriz */
    MATRIZ_ESPARSA * m = (MATRIZ_ESPARSA*) malloc( sizeof(MATRIZ_ESPARSA) );

    /* Aloca uma array de ponteiros */
    m->celulas = (CELULA**) malloc( nlinhas * sizeof(CELULA*) );

    /* Aloca uma array de doubles para cada linha da matriz */
    for( y = 0; y < nlinhas; y++ )
        m->celulas[y] = (CELULA*) calloc( ncolunas,  sizeof(CELULA) );

    /* Todas as celulas sao inicializadas com flag NULL */
    for( y = 0; y < nlinhas; y++ )
        for( x = 0; x < ncolunas; x++ )
            m->celulas[y][x].is_null = 1;

    m->nlinhas = nlinhas;
    m->ncolunas = ncolunas;

    return m;
}

Browser other questions tagged

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