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

Porque me falla al pasar un array bidimensional?

Estas en el tema de Porque me falla al pasar un array bidimensional? en el foro de C/C++ en Foros del Web. Hola! Estoy haciendo un programa que trata de leer un fichero y sacar datos a traves de él. El objetivo de este es sacar los ...
  #1 (permalink)  
Antiguo 12/03/2008, 13:24
 
Fecha de Ingreso: enero-2008
Mensajes: 22
Antigüedad: 16 años, 4 meses
Puntos: 0
Exclamación Porque me falla al pasar un array bidimensional?

Hola!
Estoy haciendo un programa que trata de leer un fichero y sacar datos a traves de él. El objetivo de este es sacar los importes totales de cada mes, y el total de cada vendedor (cod)

He señalado en el código las partes que fallan, espero que puedan ayudarme!

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

 struct FVENTAS
{
	int cod;
	int imp;
	int mes;
	int dia;
};

FILE *abrir_fichero(char *nom,char *modo)
{
	FILE* fich;
	fich=fopen(nom,modo);
	if (fich==NULL)
	{
		printf("Error en la apertura del archivo");
		exit (1);
	}
	return fich;
}

void mostrar_totales_mes(int *codmes)
{
	int x,y;
	
	for (x=0;x<10;x++)
		{
			printf("Vendedor %d\n",x+1);
			puts("---------------");
			for(y=0;y<12;y++)
				printf("Mes de %d: €%d",y+1,codmes[x][y]);
		}		
			
}

void mostrar_totales(int *total)
{
	int x;
	for (x=0;x<10;x++)
		{
			printf("Vendedor %d\n",x+1);
			puts("--------------");
			printf("Ha generado un total de %d euros\n",total[x][y]);
                /*Y aquí: Subscripted value is neither array or pointer*/		
}	
}


void calculo(FILE* fich)
{
	int total[10];
	int codmes[10][12];
	struct FVENTAS comodin;
	int x,y;
	
	for (x=0;x<10;x++)
	{
		total[x]=0;
		for(y=0;y<12;y++)
			codmes[x][y]=0;
	}	
	fread(&comodin,sizeof(comodin),1,fich);
	while(!feof(fich))
	{
		codmes[comodin.cod-1][comodin.mes-1]+=comodin.imp;
		total[comodin.cod-1]+=comodin.imp;
		fread(&comodin,sizeof(comodin),1,fich);
	}
	mostrar_totales_mes(codmes);
// Aqui me dice -> Warning: passing argument 1 of "mostrar_totales_mes" from //incompatible pointer type
	mostrar_totales(total);
}

int main()
{
	FILE* fich;
	fich=abrir_fichero("fventas.rtf","r");
	calculo(fich);
	fclose(fich);
	return 0;
}

Última edición por athiria; 12/03/2008 a las 13:51
  #2 (permalink)  
Antiguo 12/03/2008, 15:12
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: Porque me falla al pasar un array bidimensional?

Tienes problemas con los tipos de las variables que declaras en los encabezados de las definiciones y los que usas realmente, por ejemplo:
Código:
...
int codmes[10][12];
...
mostrar_totales_mes(codmes);
...
Y en el encabezado de la definición pones:
Código:
...
void mostrar_totales_mes(int *codmes)
...
Deberías tener algo así:
Código:
...
void mostrar_totales_mes(int codmes[][12])
...
Te recomiendo que verifiques todas las funciones, llamados, etc.

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #3 (permalink)  
Antiguo 12/03/2008, 15:35
 
Fecha de Ingreso: enero-2008
Mensajes: 22
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: Porque me falla al pasar un array bidimensional?

Muchas gracias ya funciona!

Sin embargo, me gustaria saber porque hay que poner void mostrar_totales_mes(int codmes[][12]) cuando es un array bidimensional, y no int *codmes, que es lo que se pone en un array unidimensional :S

Gracias de nuevo.
  #4 (permalink)  
Antiguo 13/03/2008, 15:01
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: Porque me falla al pasar un array bidimensional?

Cuando pones un array unidimensional puedes poner:
Código:
...
void funcion(int arraglo[])
...
En esencia un array es un puntero, por eso puedes escribirlo de ambas maneras, lo que haces con el operador "[]" es obtener el valor que está en la posición de memoria que le indicas.

Cuando es un arreglo multidimensional puedes dejar vacío el primer par de corchetes y debes colocar el tamaño que tendrán las demás dimensiones, esto es necesario por la forma en la que el C/C++ almacena los arreglos multidimensionales en memoria (como arreglos unidimensionales) y por la forma en la que accede a cada una de las posiciones de memoria.

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #5 (permalink)  
Antiguo 13/03/2008, 16:35
Avatar de Mephisto  
Fecha de Ingreso: enero-2006
Ubicación: Mexico DF
Mensajes: 184
Antigüedad: 18 años, 4 meses
Puntos: 3
Re: Porque me falla al pasar un array bidimensional?

Sin afan de molestar, quisiera corregir al compañero Lucifer ya que un array no es un puntero, ya que el array es la localidad de memoria y el puntero es la referencia a la localidad de memoria.

Cuando colocas

void mostrar_totales_mes(int *codmes)

indicas que la función recibirá un puntero a un entero y cuando haces la llamada a la función

mostrar_totales_mes(codmes);

Estas enviando por si mismo el arreglo y no la referncia a este, lo cual es un error de consistencia.

Prueba cambiando la llamada de la siguiente manera

mostrar_totales_mes(&codmes);

con esto mandas la referencia a tu array.
__________________
Saludos...

Todos somos sabios, solo que en diferentes disciplinas...
  #6 (permalink)  
Antiguo 15/03/2008, 13:41
 
Fecha de Ingreso: enero-2008
Mensajes: 22
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: Porque me falla al pasar un array bidimensional?

Cita:
Iniciado por _Lucifer_ Ver Mensaje
Cuando pones un array unidimensional puedes poner:
Código:
...
void funcion(int arraglo[])
...
En esencia un array es un puntero, por eso puedes escribirlo de ambas maneras, lo que haces con el operador "[]" es obtener el valor que está en la posición de memoria que le indicas.

Cuando es un arreglo multidimensional puedes dejar vacío el primer par de corchetes y debes colocar el tamaño que tendrán las demás dimensiones, esto es necesario por la forma en la que el C/C++ almacena los arreglos multidimensionales en memoria (como arreglos unidimensionales) y por la forma en la que accede a cada una de las posiciones de memoria.

Saludos
Gracias me ha quedado claro

Mephisto tu solucion no funciona
  #7 (permalink)  
Antiguo 17/03/2008, 11:53
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: Porque me falla al pasar un array bidimensional?

Cita:
Iniciado por athiria Ver Mensaje
...
Gracias me ha quedado claro
...
De nada
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
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




La zona horaria es GMT -6. Ahora son las 03:02.