Falha de segmentação

1. Falha de segmentação

Beatriz Neaime
biaiaou

(usa Ubuntu)

Enviado em 14/09/2019 - 12:31h

Bom dia, preciso fazer a troca das posições da minha matriz, porém está apresentando falha de segmentação na hora de trocar.
[#include <stdio.h>
#include <stdlib.h>
char **ler(){
char **m;
int i;
m= malloc(5 * sizeof(char*));
for (int i = 0; i < 5; i++){
m[i] = malloc(5 * sizeof(char *));
}
for(i=0; i<5; i++){
scanf("%[^\n]%*c", m[i]);
}
}
char **printar(char **m){
int i;
for(i=0; i<5; ++i){
for(int j=0; j<5; ++j){
printf(" %c", m[i][j]);
}
printf("\n");
}
}
void *achar(char **m, int *a, int *b){ //achei espaço
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
if(m[i][j]==' '){
*a=i;
*b=j;
}
}
}
}
void trocar(int comando, char **m, int a, int b){
char change;
if(comando == 'A'){ //cima
change= m[a-1][b];
m[a-1][b]=m[a][b];
m[a][b]=change;
} else if(comando == 'R'){ //direita
change = m[a][b+1];
m[a][b+1]= m[a][b];
m[a][b]=change;
} else if(comando == 'B'){ //baixo
change=m[a+1][b];
m[a+1][b]=m[a][b];
m[a][b]=change;
} else if(comando == 'L'){ //esquerda
change= m[a][b-1];
m[a][b-1]=m[a][b];
m[a][b]=change;
}

}
void **comandos(char **m){
char op;
int *a, *b;
do{
scanf("%c", &op);
achar(m,a,b);
if(op =='A'){
trocar(op, m, *a,*b);
} else if(op == 'B'){
trocar(op, m, *a,*b);
} else if(op == 'R'){
trocar(op, m, *a,*b);
} else if (op == 'L'){
trocar(op, m, *a, *b);
}
}
while(op != 'O');
}
int main (){
char **m=ler();
comandos(m);
printar(m);
for(int i =0; i<5; i++){
free(m[i]);
}
free(m);



return 0;
}[


  


2. Re: Falha de segmentação

José
DeuRuimDotCom

(usa Linux Mint)

Enviado em 14/09/2019 - 18:20h

biaiaou escreveu:
m= malloc(5 * sizeof(char*));
for (int i = 0; i < 5; i++){
m[i] = malloc(5 * sizeof(char *));

Não li o código inteiro, mas aqui já me parece que cometeu um erro de alocação. Deveria ter feito assim:

m= malloc(5 * (sizeof *m));
for (int i = 0; i < 5; i++){
m[i] = malloc(5 * (sizeof **m));


Um dica: Quando postar códigos, use a formatação adequada, a fim de facilitar a leitura pelos foristas.


3. Re: Falha de segmentação

Calistu
CalistoW

(usa Debian)

Enviado em 14/09/2019 - 18:46h

Não entendi muito bem seu enigma, mas..
pelo que vc fez, me pareceu que quer receber 5 vetores
aloca-los dentro de um vetor **
depois pesquisar esse vetor em busca de espaços ( acho que seria mais legal, deixar o usuario escolher o char )
quando achar os espaços preencher ele trocando com o char
da opcao selecionada

assim como você, vou apenas disponinbilizar o codigo e você ira buscar entende-lo
Fiz algumas mudanças no seu codigo, que ao meu ver foi basico para rodar ele.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char** m;
char**
ler()
{
int i;
m = malloc(100);
for (int i = 0; i < 5; i++) {
m[i] = malloc(20);
}
for (i = 0; i < 5; i++) {
printf("entrada pos %i: ", i);
fgets(m[i], 20, stdin);
}
return m;
}

char**
printar(char** m)
{
int i;
printf("\n");
for (i = 0; i < 5; ++i) {
for (int j = 0; j < strlen(m[i]); ++j) {
printf(" %c", m[i][j]);
}
printf("\n");
}
return m;
}

int* achar(char** m, int* a)
{ //achei espaC'o
for (int i = 0; i < 5; i++) {
for (int j = 0; j < sizeof(m[i]); j++) {
if (m[i][j] == ' ') {
a[0] = i;
a[1] = j;
printf("\n\nPosicao encontrada %i %i\n", i, j);
return a;
}
}
}
printf("\n\nNão encontrei nenhum espaço\n");
}

void trocar(int comando, char** m, int* a)
{
char change;
if (comando == 'A') { //cima
m[a[0]][a[1]] = m[a[0]][a[1]];
change = m[a[0] - 1][a[1]];
m[a[0]][a[1]] = change;
}
else if (comando == 'R') { //direita
change = m[a[0]][a[1] + 1];
m[a[0]][a[1]] = m[a[0]][a[1]];
m[a[0]][a[1]] = change;
}
else if (comando == 'B') { //baixo
change = m[a[0] + 1][a[1]];
m[a[0] + 1][a[1]] = m[a[0]][a[1]];
m[a[0]][a[1]] = change;
}
else if (comando == 'L') { //esquerda
change = m[a[0]][a[0] - 1];
m[a[0]][a[1]] = m[a[0]][a[1]];
m[a[0]][a[1]] = change;
}
}

void comandos(char** m)
{
char op[] = "";
int a[2];
printf("opcao:");
fgets(op, 2, stdin);
achar(m, a);
printf("\nposicoes [a][b]: %i %i\n\n", a[0], a[1]);
trocar(op[0], m, a);
}

int main()
{
char** m = ler();
comandos(m);
printar(m);
for (int i = 0; i < 5; i++) {
free(m[i]);
}
free(m);
return 0;
}



Ainda tem o que arrumar, mas está funcional.