Ir ao conteúdo

Problemas com struct em C


Dedrlz

Posts recomendados

Postado

Ola pessoal, estou com um problema sério com Structs em C, ja tive esse problema algumas vezes e isso me irrita e MUITO nessa linguagem.

Vamos la, acontece que tenho uma matriz dinâmica onde cada celula é do tipo "TipoInfo" sendo:


typedef struct {
char letra;
int posi, posj, intersec;
} TipoInfo;

Eu queria HUMILDEMENTE setar esses valores em cada posição, porém ai causa o problema. Em alguns casos (lembrando que isso ocorre em apenas algumas celulas) quando altero o valor de "intersec", algumas das celulas tem seu valor de "letra" alterado.

Então testei alterar os valores separadamente, sendo uma função que altera os valores de LETRA e outra que altera de INTERSEC:


TipoInfo **SetLetras(TipoInfo **matriz, TipoPalavra *dicionario, int tamPalavra, int numPalavras){

int i, j;

for (i = 0; i < tamPalavra; i++) {
for (j = 0; j < numPalavras; j++){
matriz[i][j].letra = dicionario[j].Palavra[i];
}
}
}

return(matriz);
}

e...


TipoInfo **SetIntersec(TipoInfo **matriz, int tamPalavra, int numPalavras){

int i, j;


for (i = 0; i <= tamPalavra; i++) {
for (j = 0; j < numPalavras; j++){
matriz[i][j].intersec = 0;
}

}

return(matriz);
}

Então na main chamo a primeira, imprimo a matriz com as letras, então altero apenas os valores de intersec, imprimo novamente, e algumas letras são alteradas.

main:


// Lembrando: TipoInfo **matriz;

matriz = SetLetras(matriz, dicionario, tamPalavra, numPalavras);
ImprimeMatriz(matriz, tamPalavra, numPalavras);

matriz = SetIntersec(matriz, tamPalavra, numPalavras);
ImprimeMatriz(matriz, tamPalavra, numPalavras);

As palavras usadas são:

ANAGRAMA

ABAIXAR

IRRA

ABRIR

OCASIAO

TRAIR

OCORRER

ALTURA

RABUGICE

ABADE

RECADO

CROSTA

XAROPE

CABO

SEIVA

UNIAS

RUMO

Resultado da primeira impressão:

(ficou bem confuso aqui, tentei melhorar, mas da pra perceber cada palavra em uma coluna da matriz)

[A][A][ I][A][O][T][ O][A][R][A][R][C][X][C][R]

[N][R][C][R][C][L][A][E][R][A][A][E][N]

[A][A][R][R][A][A][O][T][A][C][O][R][ I][ I][M]

[G][i ][A][i ][i ][R][D][A][O][O][V][A][O]

[R][X][ ][R][ I][R][R][R][G][E][D][T][P][ ][A][ ]

[A][A][ ][ ][A][ ][E][A][i ][ ][ O][A][E][ ][ ][ ][ ]

[M][R][ ][ ][O][ ][R][ ][C][ ][ ] [ ][ ][ ][ ][ ][ ]

[A][ ][ ][ ][ ][ ][ ][ ][E][ ][ ][ ][ ][ ][ ][ ][ ]

Resultado da segunda impressão (após a função SetIntersec):

[A][A][ I][A][O][T][O][A][R][A][R][C][X][C][R]

[N][R][C][R][C][L][A][E][R][A][A][E][N]

[A][A][R][R][A][A][O][T][A][C][O][R][ I][ I][M]

[G][ I][A][ I][ I][R][D][A][O][O][V][A][O]

[R][X][ ][R][ I][R][R][R][G][E][D][T][P][ ][A][ ]

[][] [ ][ ][A][ ][E][A][ I][ ][O][A][E][ ][ ][ ][ ]

[M][R][ ][ ][O][ ][R][ ][C][ ][ ][ ][ ][ ][ ][ ][ ]

[A][ ][ ][ ][ ][ ][ ][ ][E][ ][ ][ ][ ][ ][ ][ ][ ]

as posições 5,0 e 5,1 simplesmente tiveram suas letras alteradas após aplicar os valores APENAS as variaveis "INTERSEC"

O mesmo ocorre quando inverto. Primeiro SetIntersec e depois SetLetras, porém dessa vez o problema ocorre nos valores dos intersec. Duas celulas tem seus valores alterados, e o mais incrivel é que NÃO são as mesmas celulas q ocorreu o erro anterior (5,0 e 5,1)

Como se alterar o valor do char letra interferisse no int intersec (em algum caso especifico) e vice e versa.

Isso ta me dando muita dor de cabeça ja, porque preciso alterar constantemente esses valores, sem interferir nos outros.

O que pode ser isso? :confused::confused::confused:

Desculpem a falação, o problema é bem específico e quis colocar o máximo de informações possível!

Fico muito grato a todos que puderem contribuir.

Editado:

Após realizar alguns testes, percebi q o simples fato de mudar a linha:

matriz[j].letra = dicionario[j].Palavra;

da função SetLetra para uma atribuição simples de um caractere qualquer como:

matriz[j].letra = 'X';

o problema não persiste. Como se o problema estivesse no uso do dicionario. porém o que me intriga é o fato de que uso o dicionário apenas na SetLetras, que me retorna um resultado positivo, o resultado negativo vem após chamada a função SetIntersec, que não tem envolvimento algum com o dicionário.

Imagino que isso ajude a explicar o porque desse problema todo, porém não consigo entender.

O "C" me surpreende com suas doideiras.

Postado

caramba, simplesmente alterando o valor de um membro outros também são alterados, cara não vejo nada de errado para dar esse problema, mas posso dar uma dica:

As funções recebem ponteiros como parametro, então não é necessário retornar o ponteiro(TipoInfo **matriz).

se encontrar a resposta e pudesse postar aqui eu agradeço, porque agora eu fiquei curioso e talvez um dia eu passe por esse erro também :)

Postado
caramba, simplesmente alterando o valor de um membro outros também são alterados, cara não vejo nada de errado para dar esse problema, mas posso dar uma dica:

As funções recebem ponteiros como parametro, então não é necessário retornar o ponteiro(TipoInfo **matriz).

se encontrar a resposta e pudesse postar aqui eu agradeço, porque agora eu fiquei curioso e talvez um dia eu passe por esse erro também :)

Exatamente isso cara, e eu só citei esse caso, fiz vários testes invertendo a ordem das atribuições e tudo mais, e cada hora algo diferente acontece. Totalmente sem nexo! To correndo risco de ter q alocar uma matriz pra cada membro! (_(

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!