Olá, estou fazendo seguinte programa com o objetivo simples de criar uma matriz com as dimensões dadas pelo usuário durante a execução do programa, depois preencher todos os elementos da matriz com um caractere também dado pelo usuário, e por fim exibir todos os elementos da matriz na tela. Ignorem o fato de eu não ter liberado memoria por que como disse ainda estou escrevendo o programa então falta algumas partes ainda.
Bom vamos ao que interessa "O erro", o programa esta compilando normalmente sem erros. Porem não consigo executá-lo até o final, ele trava antes de imprimir os elementos da matriz. Eu depurei o programa no visual estúdio e obtive a seguinte mensagem de erro:
"Exception thrown at 0x00CD19CD in SQUARE.exe: 0xC0000005: Access violation writing location 0xCDCDCDCD. If there is a handler for this exception, the program may be safely continued."
Também já consegui localizar o erro só não sei como corrigi-lo :). O erro está na hora de alocar o caractere na matriz, ou seja na função "gravar_char(void)". Desde já agradeço se poderem me ajudar.
OBS. se forem compilar o código em um compilador que não seja o do visual studio, alterem a função "scanf_s" por "scanf" ou então dará erro na compilação.
CÓDIGO:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// program name: SQUARE //
// author: "I.L" //
// target: criar uma matriz bidimencional com as dimenções dadas pelo usuario durante a execução do programa //
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//libarys
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
//variaveis globais
int COLUNAS_MATRIZ;
int LINHAS_MATRIZ;
char **MATRIZ;
char CARACTER;
//declaraçõa das funções
void menu_inicial(void);
void menu_texturas(void);
char **Alocar_matriz_real(int linhas, int colunas);
void gravar_char(void);
void mostrar_matriz(char **vetor);
void clearbuffer(void);
//função principal (main)
int main(void)
{
system("title SQUARE");
menu_inicial();
system("cls");
menu_texturas();
gravar_char();
mostrar_matriz();
cin.get();
return 0;
}
//menu inicial //recebe as dimenções do usuario
void menu_inicial(void)
{
//aqui é onde o usuario entra com as dimenções da matriz
printf("\tMENU INICIAL\n\n");
printf("Especifique o numero de colunas e o numerode linhas da matriz:\n");
printf("colunas: ");
scanf_s("%i", &COLUNAS_MATRIZ);
clearbuffer();
printf("linhas: ");
scanf_s("%i", &LINHAS_MATRIZ);
clearbuffer();
//gerando a matriz
MATRIZ = Alocar_matriz_real(LINHAS_MATRIZ, COLUNAS_MATRIZ);
}
//menu texturas // da ao usuario a opção de escolher um caracter para peencher sua matriz
void menu_texturas(void)
{
int escolha;
//LISTA DE TESTURAS
char text_01 = -78;
char text_02 = -79;
char text_03 = -80;
char text_04 = 36;
char text_05 = 35;
char text_06 = 38;
char text_07 = 64;
char text_08 = -37;
char text_09 = -36;
char text_10 = -50;
printf("\t TEXTURAS\n\n");
printf("Escolha uma textura para seu quadrado:");
printf("\n\n");
printf(" _____ _____ _____ _____ _____ _____ _____ _____ _____ ______\n");
printf("| 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 |\n");
printf("| | | | | | | | | | | | | | | | | | | |\n");
printf("| %c | | %c | | %c | | %c | | %c | | %c | | %c | | %c | | %c | | %c |\n", text_01, text_02, text_03, text_04, text_05, text_06, text_07, text_08, text_09, text_10);
printf("|_____| |_____| |_____| |_____| |_____| |_____| |_____| |_____| |_____| |______|\n\n\t\t\t\tEscolha: ");
scanf_s("%i", &escolha);
clearbuffer();
while (true)
{
if (escolha <= 0 || escolha > 10)
{
printf("\n");
while (escolha <= 0 || escolha > 10)
{
printf("Erro, valor %i nao permitido! ", escolha);
scanf_s("%i", &escolha);
clearbuffer();
}
}
break;
}
switch (escolha)
{
case 1:
CARACTER = text_01;
break;
case 2:
CARACTER = text_02;
break;
case 3:
CARACTER = text_03;
break;
case 4:
CARACTER = text_04;
break;
case 5:
CARACTER = text_05;
break;
case 6:
CARACTER = text_06;
break;
case 7:
CARACTER = text_07;
break;
case 8:
CARACTER = text_08;
break;
case 9:
CARACTER = text_09;
break;
case 10:
CARACTER = text_10;
break;
default:
printf("\nErro desconhecido!");
cin.get();
break;
}
}
//função que gera a matriz com as dimenções que o usuario passou
char **Alocar_matriz_real(int linhas, int colunas)
{
if (linhas < 1 || colunas < 1) { /* verifica parametros recebidos */
printf("** Erro: Parametro invalido **\n");
return (NULL);
}
/* aloca espaço na memoria para a matriz */
char **matriz_aux = (char **)malloc((5 * sizeof(char *)) - 1);
if (matriz_aux == NULL) {
printf("** Erro: Memoria Insuficiente **");
return (NULL);
}
return(matriz_aux);
}
//função que aloca o caracter inserido pelo usuario
void gravar_char(void)
{
//loop que vai alocar o caracter passado pelo usuario em cada elemento da matriz
for (int linhas = 0; linhas < LINHAS_MATRIZ; ++linhas)
{
for (int colunas = 0; colunas < COLUNAS_MATRIZ; ++colunas)
{
MATRIZ[linhas][colunas] = (char)CARACTER;
}
}
}
//função que inprime na tela todos os elementos da matriz
void mostrar_matriz(char **vetor)
{
printf("\tRESULTADO\n\n");
printf("Quadrado gerado: \n\n");
for (int linhas = 0; linhas < LINHAS_MATRIZ; ++linhas)
{
for (int colunas = 0; colunas < COLUNAS_MATRIZ; ++colunas)
{
printf("%c", vetor[linhas][colunas]);
}
printf("\n");
}
}
//limpa o buffer
void clearbuffer(void)
{
char c;
while ((c = getchar() != '\n' && c != EOF));
}