1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Duvida de C++

Discussão em 'Programação' iniciada por feye, 7 de Janeiro de 2009. (Respostas: 15; Visualizações: 873)

  1. Boas ppl. Tenho um trabalho em mãos, mas estou a ter problemas... Escrevi um programa para calcular o determinante de matrizes, com uma função de trocas de colunas.

    A função é a seguinte:
    Código:
    float trocar_coluna (int c,int d, float b[4], float *C[4][4])
    {
        int l;
                        for(l=0;l<d;l++) *C[l][c] = b[l];
    return 0;
    }
    
    e quando eu a chamo por exemplo:
    Código:
    trocar_coluna(0,2,B,&D);
    
    aparece um erro de compilação a dizer:

    Código:
    erro C2664: 'trocar_coluna' : cannot convert paramter 4 from 'float(*)[4][4]' to 'float*[][4]'
    
    Alguem me pode ajudar a descobrir o que é que eu estou a fazer mal? Pode ser coisa simples, mas como so aprendi c++ este semestre ainda sou verde nestas andanças.

    Bg por toda a juda que me dispensarem.
     
    Última edição: 7 de Janeiro de 2009
  2. Ronnie_03

    Ronnie_03 Power Member

    Acho que o problema é declarares a variavel c como um array bidimensional de apontadores e depois chamares esta função com &D (array de uma dimensão).

    O melhor é esperares por outra resposta, mas acho que é este o problema.

    Cumps
     
  3. Obg pela resposta, mas eu ja tentei chamar a função usando &D[4][4] mas dá-me o mesmo erro
     
  4. Ronnie_03

    Ronnie_03 Power Member

    Experimenta declarar *c na função como sendo um array de uma dimensão, mas se calhar também não deve dar, porque &d é apenas um endereço de uma variável e *c é um array de apontadores.

    Se calhar é melhor mostrares mais um pouco do teu código para ver se percebo a tua ideia para fazer o programa.


    Cumps
     
  5. Código:
                case 2:
                    {
                        det=determinante(2, A);
                        if(det==0)
                        {
                            fprintf(fich, "\n\nSistema impossivel");
                            printf("\n\nSistema Impossivel\n\n");
                        }
                        else
                        {
                            D[4][4]=A[4][4];
                            trocar_coluna(0,2,B,&D);
                            detx=determinante(2,D)/det;
                            D[4][4]=A[4][4];
                            trocar_coluna(1,2,B,&D);
                            dety=determinante(2,D)/det;
                            printf("\n x=%g", detx),fprintf(fich,"\n x=%g", detx);
                            printf("\n y=%g \n\n", dety),fprintf(fich,"\n y=%g", dety);
                        }
                    }break;
    
    Aqui está o codigo quando o utilizador introduz dados para uma matriz dimensao [2][2] e eu uso a matriz D para poder copiar os dados que eu pedi ao utilizador (que se encontram guardados na matriz A). E depois a matriz que eu vou usar para calcular é a matriz D para n estragar a matriz com os dados originais do utilizador. Se não perceberes avisa que explico
     
  6. Ronnie_03

    Ronnie_03 Power Member

    O programa só tem de funcionar com matrizes 2 por 2?
    É que para determinantes de 2ª ordem tens a regra dos produtos cruzados.
     
  7. Não, eu tenho de calcular ate uma 4x4 mas isso dos cálculos já tenho tudo feito. O problema é que eu quero fazer trocar um vector na coluna da matriz copia que fiz, mas dá-me este problema...


    Já agora eu estou a usar funções para os calculos para organizar melhor o programa e n ter de repetir codigo. visto que o programa vai ser avaliado.
     
  8. IComeFromBehind

    IComeFromBehind Power Member

    Não devias ter uma classe matrix?
     
  9. Ronnie_03

    Ronnie_03 Power Member


    Se fosse até 3x3 também havia regra.
    Acho que não estou a perceber muito bem o que pretendes...dizes que queres fazer trocar um vector na coluna da matriz copia...o quê que queres dizer com isto??

    Pretendes trocar duas colunas ou duas linhas é isso?

    Eu vou tentar ajudar-te o que puder, mas aviso-te que também não sei assim muito de c++.
     
  10. OubeLa

    OubeLa Power Member

    Experimenta assim

    Código:
    void trocar_coluna (int c,int d, float b[4], float &C[4][4])
    {
        int l;
                        for(l=0;l<d;l++) C[l][c] = b[l];
    }
    E depois chamas assim

    trocar_coluna(0,2,B,D);

    Estás a passar uma referência de um array bidimensional, e alterando a referencia altera também o valor da variável D quando chamas a função.
     
  11. Este programa resolve sistemas de equações a duas incógnitas e por ai a fora, e o que eu quero trocar é as variáveis independentes numa coluna.

    Código:
    #include<stdio.h>
    float trocar_coluna (int c,int d, float b[4], float *C[4][4])
    {
        int l;
                        for(l=0;l<d;l++) *C[l][c] = b[l];
    return 0;
    }
    void main()
    {
        float D[4][4],A[4][4],B[4];                    
                            D[4][4]=A[4][4];
                            trocar_coluna(0,2,B,&D);
    
    }
    
    se puderes executa este troço do programa e ve se percebes o erro sff?
     
  12. OubeLa

    OubeLa Power Member

    Umas referencias:

    - A função main deve retornar um inteiro. É uma boa prática.
    - A biblioteca stdio é de C, e não de C++. Deves incluir iostream se quiseres fazer output, e ter using namespace std;
    - A tua função troca coluna não precisa de retornar um float, visto que o que tu estás a fazer é a tentar alterar o valor do array que recebes como argumento.

    Aqui estão uns apontamentos interessantes sobre apontadores: http://psantos.zi-yu.com/wiki.aspx?topic=PRE.Refer%C3%AAnciasApontadores

    edit: agora não posso testar, mais logo faço isso ;)
     
  13. Assim dá um erro
    [​IMG]

    [​IMG]
     
  14. obg pela dica
     
  15. IComeFromBehind

    IComeFromBehind Power Member

    Código:
    #include <string.h>
    #include <stdlib.h>
    
    struct matrix
    {
        size_t row_size;
        size_t column_size;
        
        double* matrix;
    };
    
    struct matrix* matrix_create(
        size_t row_size,
        size_t column_size,
        const double* matrix)
    {
        struct matrix* new_matrix = (struct matrix*) malloc(sizeof(struct matrix));
        new_matrix->row_size      = row_size;
        new_matrix->column_size   = column_size;
        new_matrix->matrix        = (double*) malloc(sizeof(double)
                                                     * row_size
                                                     * column_size);
        memcpy(new_matrix->matrix, matrix, sizeof(double) * row_size * column_size);
        return new_matrix;
    }
    
    void matrix_swap_columns(struct matrix* matrix, size_t to, size_t from) {
        double temp;
        size_t i;
        double* from_pointer = matrix->matrix + from;
        double* to_pointer = matrix->matrix + to;
        for(i = 0; i < matrix->row_size; ++i)
        {
            temp = *from_pointer;
            *from_pointer = *to_pointer;
            *to_pointer = temp;
            from_pointer += matrix->column_size;
            to_pointer += matrix->column_size;
        }
        
        
    }
    
    void matrix_destroy(struct matrix* matrix_to_destroy) {
        free(matrix_to_destroy->matrix);
        free(matrix_to_destroy);
    }
    
    void matrix_print(const struct matrix* matrix) {
        putchar('[');
        size_t i;
        for(i = 0; i < matrix->row_size; ++i)
        {
            putchar('[');
            size_t j;
            for(j = 0; j < matrix->column_size; ++j)
            {
                printf("%f ", *((matrix->matrix) + j + i * matrix->column_size));
            }
            putchar(']');
            putchar('\n');
        }
        putchar(']');
    }
    
    int main ()
    {
        double temp[] = {1, 2, 3, 4, 20, 40, 50, 100, 255, 266, 201, 21};
        struct matrix* test = matrix_create(3, 4, temp);
        matrix_swap_columns(test, 2, 3);
        matrix_print(test);
        matrix_destroy(test);
        return 0;
    }
    
    Talvez isto ajude. Odeio C++ :P.
     
    Última edição: 7 de Janeiro de 2009
  16. OubeLa

    OubeLa Power Member

    Bem me parecia que não estava a ver bem a coisa. O problema é que tu estás a tentar passar um apontador de um array, e isso não é possível da maneira que estás a fazer.

    Código:
    #include <iostream>
    
    using namespace std;
    
    void trocar_coluna (int c,int d, float b[4], float *C)
    {
        int l;
    
        for(l=0;l<10;l++)
            ++C;
    
        //quando l for 9, C foi incrementado 9 vezes (o elemento numero 11 passa a 300)
        *C = 300;
    
    
    }
    int main()
    {
        float D[4][4],A[4][4],B[4];                    
        //D[4][4]=A[4][4];
        float D1[4][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
    
        cout << "antes de o elemento ser alterado" << endl;
        for (int i = 0; i != 4; i++) {
            for (int j = 0; j != 4; j++)
                cout << D1[i][j] << endl;
        }
    
        cout << endl << endl;
    
        cout << "depois do elemento ser alterado" << endl;
        trocar_coluna(0,2,B,&D1[0][0]);
    
        for (int i = 0; i != 4; i++) {
            for (int j = 0; j != 4; j++)
                cout << D1[i][j] << endl;
        }
        return 0;
    
    }
    
    Espero que isto te ajude a compreender. Tens de passar um apontador para o primeiro elemento do array (C é um apontador para a posição 0, 0 do array D1), e depois para acederes a outros elementos vais incrementando o apontador de forma a ele apontar para outras posições do array.


    Agora só tens de adaptar ao teu programa. Se tiveres alguma dúvida, diz.
     
    Última edição: 7 de Janeiro de 2009

Partilhar esta Página