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;
}