Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda em chamada de funcoes


Scolare

Pergunta

Eu estou fazendo um programa para resolucao de sistemas matematicos.

para isso, preciso das operacoes de matrizes envolvendo transpostas, multiplicacoes, determinantes e inversas

para isso, criei uma estrutura para a matriz, que indica tambem o numero de linhas e colunas para ela:

typedef struct matriz {
        float M[15][15];
        int linhas, colunas;
}matriz;
alem das funcoes já ditas, criei uma funcao que remove uma linha e uma coluna de uma matriz. as chamadas das minhas funcoes de transposta, multiplicacao e determinante são :
matriz Remover(matriz M, int linha, int coluna)
matriz Transposta(matriz M)
matriz Mult(matriz M1, matriz M2)
float Determinante(matriz M)
as tres primeiras funcoes funcionam normalmente quando testadas dentro do main do programa. mas na funcao derivada, quando eu faco uma chamada para a funcao de remocao, ocorre um erro de onflito de tipos na funcao remover.
float Determinante(matriz M) {
       if (M.linhas == M.colunas) {
            if (M.linhas == 1)
                return M.M[0][0];
            else {
                 float soma = 0;
                 int i = 0;
                 matriz Aux;
                 
                 for (i = 0; i < M.linhas; i++) {
                    Aux = Remover (M, i, 0);   <-- nesta chamada ocorre o erro
                    soma += pow(-1,i+2) * ( M.M[i][0] * Determinante(Aux) );
                 }
                 
                 return soma;
            }
       } else printf ("Matriz não quadrada, não existe derivada.\n");
}

eu já tentei fazer a funcao de remocao usando ponteiros ao invés de retorno, mas o mesmo erro ocorre

tentei tambem chamar as outras funcoes dentro uma da outra, mas ocorre o mesmo erro sempre que uma funcao é chamada dentro de outra

alguém sabe qual pode ser o problema?

grato

Editado por Scolare
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0
Eu estou fazendo um programa para resolucao de sistemas matematicos.

para isso, preciso das operacoes de matrizes envolvendo transpostas, multiplicacoes, determinantes e inversas

para isso, criei uma estrutura para a matriz, que indica tambem o numero de linhas e colunas para ela:

typedef struct matriz {
        float M[15][15];
        int linhas, colunas;
}matriz;
alem das funcoes já ditas, criei uma funcao que remove uma linha e uma coluna de uma matriz. as chamadas das minhas funcoes de transposta, multiplicacao e determinante são :
matriz Remover(matriz M, int linha, int coluna)
matriz Transposta(matriz M)
matriz Mult(matriz M1, matriz M2)
float Determinante(matriz M)
as tres primeiras funcoes funcionam normalmente quando testadas dentro do main do programa. mas na funcao derivada, quando eu faco uma chamada para a funcao de remocao, ocorre um erro de onflito de tipos na funcao remover.
float Determinante(matriz M) {
       if (M.linhas == M.colunas) {
            if (M.linhas == 1)
                return M.M[0][0];
            else {
                 float soma = 0;
                 int i = 0;
                 matriz Aux;
                 
                 for (i = 0; i < M.linhas; i++) {
                    Aux = Remover (M, i, 0);   <-- nesta chamada ocorre o erro
                    soma += pow(-1,i+2) * ( M.M[i][0] * Determinante(Aux) );
                 }
                 
                 return soma;
            }
       } else printf ("Matriz não quadrada, não existe derivada.\n");
}

eu já tentei fazer a funcao de remocao usando ponteiros ao invés de retorno, mas o mesmo erro ocorre

tentei tambem chamar as outras funcoes dentro uma da outra, mas ocorre o mesmo erro sempre que uma funcao é chamada dentro de outra

alguém sabe qual pode ser o problema?

grato

Primeiramente, cuidado com algumas más práticas!! Passar a estrutura toda como parâmetro faz com que toda a estrutura seja copiada na stack da função chamada. Quando você retorna a estrutura, faz com que ela seja copiada mais uma vez para a área de dados alocada para ela na função chamadora. Em vez disso, passe um ponteiro(ou referência, se estiver trabalhando com C++) para ela e não efetue retornos. Recomendaria fazer isso em todas as funções, sempre que possível(não tenho certeza se este é o caso, mas você que conhece o programa saberá).

Outra coisa. Tua função Determinante() só retorna caso o condicional seja válido. Caso contrário, ele imprime um erro na tela mas não encaminha retorno algum para a função chamadora saber se tudo saiu ok. Fazendo isso, o retorno será lixo de memória.

Obviamente, isto não vai interferir em nada no problema em sí, o que está errado vai continuar errado. Vamos agora à solução...

Uma dúvida... Tu estás compilando com um compilador C ou com um compilador C++?? Se for um compilador C tu não poderá declarar as variáveis daquela maneira. Neste caso, declare-as no início da função. Isto pode, dependendo do compilador, ser o problema. Estou assumindo que o erro seja de compilação, pelo que entendi, certo??

Caso positivo, tu poderia mostrar o output do teu compilador??

[]'s

Link para o comentário
Compartilhar em outros sites

  • 0

eu modifiquei o momento em que declaro as variaveis, agora elas são declaradas no comeco da funcao, como dito

não mudei a parte de retornar porque como foi dito não faz parte do meu problema propriamente dito e porque para mudar isso depois é facil (realmente não mudei agora porque tenho q correr e so terei tempo novamente amanha)

mas o erro continua o mesmo. é um erro q acusa a chamada do procedimento

ela acusa o ultimo argumento como conflito de tipo. se eu quiser eu posso ainda adicionar quantos argumentos eu quiser, e ao invés de falar q tem muitos argumentos continua falando de conflitos de tipos no ultimo remover

o compilador é um compilador c normal. eu já havia tentado passar com apontadores, cmo dito, mas o erro continuava o mesmo

abaixo vai o log da compilacao

Compilador: Default compiler

Executando gcc.exe...

gcc.exe "F:\simplex\Simplex.c" -o "F:\simplex\Simplex.exe" -g3 -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib" -g3

F:\simplex\Simplex.c: In function `Determinante':

F:\simplex\Simplex.c:23: error: incompatible types in assignment

F:\simplex\Simplex.c: At top level:

F:\simplex\Simplex.c:33: error: conflicting types for 'Remover'

F:\simplex\Simplex.c:23: error: previous implicit declaration of 'Remover' was here

Execução terminada

aqui esta como esta a funcao agora:

double Determinante(matriz M) {
       int i = 0;
       matriz Aux;
       double soma = 0;
       if (M.linhas == M.colunas) {
            if (M.linhas == 1)
                return M.M[0][0];
            else {
                 
                 for (i = 0; i < M.linhas; i++) {
                    Aux = Remover (M, i, 0);
                    soma += pow(-1,i+2) * ( M.M[i][0] * Determinante(Aux) );
                 }
                 
                 return soma;
            }
       } else printf ("Matriz não quadrada, não existe derivada.\n");
}

de um jeito ou de outro obrigado pela atencao

Editado por Scolare
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...