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