Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Declarando dinamicamente uma matriz de 3 dimensões - erro

Preciso de uma matriz, declarada de forma dinamica, de 3 dimensões, para isso, criei 2 funções (uma para alocar, outra para liberar a matriz), segue o trecho do codigo que contem as funções

int*** numero_quartos;
int i,j;   // sao variaveis globais

void aloca_numero_quartos(int a,int b){
    int c = 2; // social e serviço
        numero_quartos = malloc (sizeof (int**) * a);

        for ( i = 0; i<b; i++){
            numero_quartos[i] = malloc (sizeof (int*) * b);
        }

        for ( i = 0; i<b; i++){
            for (jj = 0 ; j<c; j++){
                numero_quartos[i][j] = malloc (sizeof (int) * c );
            }
        }
}

void libera_numero_quartos(int a,int b){
    for ( i=0 ; i<a ; i++){
        for ( j=0; j<b ; j++){
            free ( numero_quartos[i][j] );
        }
    }

    for ( i=0 ; i<a ; i++ ){
        free ( numero_quartos [i] );
    }

    free ( numero_quartos );
}

Porem ao tentar utilizar a matriz, querendo inserir valores nela, meu programa simplesmente é finalizado, as duas seguintes linhas, podem, individualmente, finalizar o programa

ENTÃO A DÚVIDA SERIA: como declarar corretamente a matriz de 3 dimensões ? o que está errado no meu código, para toda vez que tento utilizar a matriz, o meu programa é finalizado ?

numero_quartos[0][0][0] = 5;
scanf ("%d", (numero_quartos[i-1][j-1][0]));

OBS: segue abaixo o codigo completo

os arquivos complementares são 2:

001 consumo per capta.txt => é so uma tabela para o usuario ver as opções que tem, nao é necessario para o funcionamento do programa

relatorio.txt => a ideia é que esse seja meu terminal de saida do meu projeto, isto é, fazer um relatorio , nao é necessario para o funcionamento do programa

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "inst hidro.h"

char nome_arquivo[45];
int*** numero_quartos;
int i,j,ii,jj,decisao, contador; 
int validacao[5];
int ajuda_inteiro[5];
int ajuda_inteiro_1;




void abertura(){
    printf("****************************************************\n");
    printf("*** BEM VINDO ao DIMENSIONAMENTO HIDRO SANITÁRIO ***\n");
    printf("****************************************************\n");
}

void acentos(){
    #include <locale.h>
    setlocale(LC_ALL, "Portuguese");}

void imprime_arquivo(char nome_arquivo[45]){
    FILE* f;

    f = fopen (nome_arquivo,"r");
    if ( f == 0 ) {printf("Erro na leitura do arquivo %c",nome_arquivo);return;}

    char leitura;
    do{

        fscanf(f, "%c",&leitura);
        printf ("%c", leitura);
    } while (leitura != '@');
    printf("\n");

    fclose(f);    
}    

void aloca_numero_quartos(int a,int b){
    int c = 2; // social e serviço
        numero_quartos = malloc (sizeof (int**) * a);

        for ( i = 0; i<b; i++){
            numero_quartos[i] = malloc (sizeof (int*) * b);
        }

        for ( i = 0; i<b; i++){
            for (jj = 0 ; j<c; j++){
                numero_quartos[i][j] = malloc (sizeof (int) * c );
            }
        }
}

void libera_numero_quartos(int a,int b){
    for ( i=0 ; i<a ; i++){
        for ( j=0; j<b ; j++){
            free ( numero_quartos[i][j] );
        }
    }

    for ( i=0 ; i<a ; i++ ){
        free ( numero_quartos [i] );
    }

    free ( numero_quartos );
}


int main(){


    FILE* r;
    r = fopen ("relatorio.txt","r+");
    fseek( r , 0, SEEK_END );
    fprintf( r , "\n\nRELATORIO \n\n" );

    acentos();
    abertura();

    printf("Qual o consumo per capta do edifício ? \n");
    sprintf( nome_arquivo, "001 consumo per capta.txt" );
    imprime_arquivo(nome_arquivo);
    printf("Consumo per capta: ");
    float consumo_per_capta; 
    scanf("%f", &consumo_per_capta);
    fprintf( r , "%.1f é o consumo per capta \n", consumo_per_capta);

    printf(" 1 - Quantas variações de pav tipo existem ? Resposta: ");
    int variacao_pav_tipo; 
    scanf("%d", &variacao_pav_tipo);
    fprintf( r , "    %d é o numero de variações de pav tipo \n" , variacao_pav_tipo );

    for ( i=1 ; i<=variacao_pav_tipo; i++ ){



                if(i==1){printf("IMPORTANTE: o numero de apartamentos no tipo 1 DEVE SER o maior de todos os tipos \n");}

        printf("2.%d - qual o numero de variações de apartamentos no tipo %d ? Resposta: ",i,i);
        int variacao_apartamento;
        scanf("%d", &variacao_apartamento);

                if(i!=1){ goto pula_declaracao_dinamica_numero_quartos; }
                void aloca_numero_quartos(int variacao_pav_tipo,int variacao_apartamento);
                ajuda_inteiro[0] = variacao_apartamento;
                printf("\n*******\n*********\nFOI ALOCADO COM SUCESSO\n*********\n********");
                pula_declaracao_dinamica_numero_quartos:

                if(i==1){
                    validacao[0] = variacao_apartamento;
                } else{
                    if ( validacao[0] < variacao_apartamento ) {
                        printf(" nao foi observada a condicao de que: \n");
                        printf("IMPORTANTE: o numero de apartamentos no tipo 1 DEVE SER o maior de todos os tipos \n");
                        exit(1);
                    }
                }


        fprintf( r , "        %d é o numero de variacoes de apartamentos no tipo %d \n",variacao_apartamento, i );
        for ( j =1 ; j<= variacao_apartamento; j++){
            printf("    %d.%d.1 - Quantos quartos sociais existem na variacao_pav_tipo %d; na variacao_apartamento %d ? Resposta: ",i,j,i,j);
            scanf ("%d", (numero_quartos[i-1][j-1][0]));    
            printf("    %d.%d.2 - Quantos quartos de serviço existem na variacao_pav_tipo %d; na variacao_apartamento %d ? Resposta: ",i,j,i,j);
            scanf ("%d", (numero_quartos[i-1][j-1][1]));
        }

        if ( i == variacao_pav_tipo ){

            printf("Terminamos de coletar as informacoes sobre quantidades de quartos\n");
            printf("agora vamos imprimir a matriz para conferencia \n");

            for ( ii=0 ; ii<variacao_pav_tipo; ii++ ){
                for( jj=0 ;jj<ajuda_inteiro[0]; jj++  ){
                    printf("[%d][%d][1]: %d  ;; [%d][%d][2]: %d \n", ii+1,jj+1,numero_quartos [ii][jj][0] ,ii+1,jj+1, numero_quartos [ii][jj][1] );

                }

            }

            ajuda_inteiro_1 = ajuda_inteiro[0]; // isso é pq nao quero usar ponteiro como argumento da funcao libera_numero_quartos , e sim usar inteiro como argumento
            void libera_numero_quartos(int variacao_pav_tipo,int ajuda_inteiro_1);
        }

    }

    fclose(r);

    return 0;
    }
1 resposta
solução!

Olá Igor,

respondi a outra dúvida que você abriu sobre este mesmo problema. Veja se aquilo consegue te ajudar.