Foros del Web » Programación para mayores de 30 ;) » C/C++ »

matriz dinamica y punteros

Estas en el tema de matriz dinamica y punteros en el foro de C/C++ en Foros del Web. HOLA A TODOS, Hay momentos en que la memoria falla y no se puede hacer mas, estoy retomando la programacion en c++, pero no recuerdo. ...
  #1 (permalink)  
Antiguo 30/05/2006, 00:32
Avatar de a n g e l u s  
Fecha de Ingreso: enero-2006
Ubicación: Chile
Mensajes: 237
Antigüedad: 18 años, 4 meses
Puntos: 1
Exclamación matriz dinamica y punteros

HOLA A TODOS,

Hay momentos en que la memoria falla y no se puede hacer mas, estoy retomando la programacion en c++, pero no recuerdo.

necesito de vuestra ayuda,

primero si esta bien declarado la estructura.

luego mi pregunta es como hago, cuando creo la matriz y reservo dinamicamente espacio en la memoria, la llamo para ingresarle datos
ej. matriz->datos = 1

no recuerdo si es correcto y ya ha esta hora estoy fundido .
agradezo de antemano cualquier ayuda o aventon que me puedan dar para avanzar .


este es mi codigo, esta guardado como trabajo.c, y compilado con Turbo C++ 3.0

Código:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<ALLOC.H>

typedef struct {
	int N, M;
	float **datos;
}matriz;

void ImprimirMatriz(const matriz m,int N,int M){//

int i,f,j,c;

	for(i=0;i<N;i++){
		printf("\n|");
		for(j=0;j<M;j++){
			printf("\t%i\t| ",*(*(m.datos+i)+j));
		}
	}
	printf("\n\n");
}



matriz MatrizCrear(int N, int M){

matriz *m;
int i;

	m->datos=((float**)malloc(N*sizeof(float*)));

	if(m->datos==NULL){
		printf("\n\t\tERROR:MEMORIA INSUFICIENTE");
		getch();
	exit(-1);
	}


	for(i=0;i<N;i++)
		*(m->datos+i)=((float*)malloc(M*sizeof(float)));

	if(*(m->datos+i)==NULL){
		printf("\n\t\tERROR:MEMORIA INSUFICIENTE");
		getch();
	exit(-1);
	}
}

matriz MatrizCrearIdentidad(int N){
matriz *m;
int f,c;

	for (f=0;f<N;f++){
		for (c=0;c<N;c++){
			if(f == c){
			   m->datos[f][c] = 1;
			}
			else{
			   m->datos[f][c] = 0;
			}
		}
	}

  getch();
}

void LeerMatriz(matriz m, int N, int M){

int i,j;

	for(i=0;i<N;i++){
		for(j=0;j<M;j++){
			printf("ingrese dato %i.%i : ",i,j);
			scanf("%i",*(m.datos+i)+j);
		}
	}

}

void MatrizDestruir(matriz m, int N){
/*
	free(m.N);
	free(m.M);
	free(m.datos);
	free(m);
*/
}

//void MatrizInicializar(matriz m, int N, int M, double v){
void MatrizInicializar(matriz m, int N, int M, float v){
 int i,j;

	for(i=0;i<N;i++){
		for(j=0;j<M;j++){
		       *(m.datos+i)+j = &v;
		}
	}


}

//-> matriz MatrizCrear(int N, int M)
//-> matriz MatrizCrearIdentidad(int N);
//-> void MatrizDestruir(matriz m, int N);
//-> void MatrizInicializar(matriz m, int N, int M, double v);
//void MatrizCopiar(matriz a, const matriz b, int N, int M);
//int MatrizComparar(const matriz a, const matriz b, int N, int M);
//void MatrizSumar(matriz c, const matriz a, const matriz b, int N, int M);
//void MatrizRestar(matriz c, const matriz a, const matriz b, int N, int M);
//int MatrizMultiplicar(matriz c, const matriz a, int N, int M, const matriz b, int S, int T) ;
//double MatrizProductoPunto(const matriz a, const matriz b, int N, int M);
//void MatrizTraspuesta(matriz a, const matriz b, int N, int M);
//void MatrizAdjunta(matriz a, const matriz b, int N);
//double MatrizDeterminante(const matriz a, int N);
//void MatrizInversa(matriz a, const matriz b, int N);
//-> void LeerMatriz(matriz m, int N, int M);
//-> void ImprimirMatriz(const matriz m, int N, int M);



void main(){

matriz *m;
int N,M;
float v;

clrscr();

	printf("Ancho : ");
	scanf("%i",&N);
	printf("Largo : ");
	scanf("%i",&M);


ImprimirMatriz(m,N,M);
MatrizCrear(N,M);
MatrizCrearIdentidad(N);
LeerMatriz(m,N,M);
MatrizInicializar(m,N,M,v);

getch();

}
__________________
Atte,
A n g e l u s
Concepción - Chile
más vale respuestas bien pensadas, que 7000 post
  #2 (permalink)  
Antiguo 30/05/2006, 00:59
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Pues no especificas algun error en particular, lo que puedo ver es esa rrara forma de resferenciar el puntero.
en unas ocasiones usas datos[][] y en otras *(m.datos+i).

lo ideal es usar la notacion de matriz.

es decir m.datos[i][j] = .

la asignacion de memoria parece estar correcta salvo la notacion.

podrias hacer :
m->datos[i] = (float*)malloc(sizeof(float) * N);


free(m.N);
free(m.M);
free(m.datos);
free(m);

esto no creo que sea correcto.
tendras que destruir en el mismo orden que creas.

for()
{
free(m.datos[i];
}

free(m.datos);

Por el momento solo eso, tal vez mañana lo compile hoy ya tengo mucho sueño.

Saludos.
  #3 (permalink)  
Antiguo 30/05/2006, 10:32
Avatar de a n g e l u s  
Fecha de Ingreso: enero-2006
Ubicación: Chile
Mensajes: 237
Antigüedad: 18 años, 4 meses
Puntos: 1
gracias Nivel7

pero aun tengo una duda, o confusion tal vez, cuando paso por parametro la matriz me da error en las funciones, no estoy pasando correctamente la matriz me pueden orientar en eso por favor.


este es el error:
type mismatch in parameter 'm' in call to 'ImprimirMatriz'
type mismatch in parameter 'm' in call to 'LeerMatriz'
type mismatch in parameter 'm' in call to 'MatrizInicializar'
__________________
Atte,
A n g e l u s
Concepción - Chile
más vale respuestas bien pensadas, que 7000 post
  #4 (permalink)  
Antiguo 30/05/2006, 15:24
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
he de suponer que ese error es por que tus funciones esperan una matriz por valor y tu le mandas un puntero.

es decir:
el parametro se declara

UnaFuncion(matriz m,...);

y la usas con un puntero.

matriz *m;

UnaFuncion(m,....

ese es un error, lo carrecto seria:
matriz m;

UnaFucion(m,

o si lo que tienes es un puntero seria,

matriz *m;

UnaFuncion(*m, .... //Desrrefernciar m.

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 23:37.