Duvida de C++

feye

Membro
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:
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;
}

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
 
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

Obg pela resposta, mas eu ja tentei chamar a função usando &D[4][4] mas dá-me o mesmo erro
 
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
 
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
 
O programa só tem de funcionar com matrizes 2 por 2?
É que para determinantes de 2ª ordem tens a regra dos produtos cruzados.

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.
 
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...


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++.
 
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.
 
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?
 
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 ;)
 
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.

Assim dá um erro


my.php
 
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ênciasApontadores

edit: agora não posso testar, mais logo faço isso ;)

obg pela dica
 
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:
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:
Back
Topo