Iniciar sesión

Ver la versión completa : Duda tonta programacion en C



The_Punisher
05/11/2008, 15:19
El compilador me tira este error:

"subscripted value is neither array nor pointer"

En esta funcion en concreto, se que tiene que ver con punteros, pero yo no uso punteros, tambien se que es una tonteria porque estamos empezando pero yo no lo veo :(

void Anadedato(int vector,int tam, int dato)
{
Desplazavector(vector,tam);
vector[tam-1]=dato;
}

Malenko
05/11/2008, 15:21
pues te falla esto:
vector[tam-1] = dato

porque vector es únicamente un valor entero.

No querrías declarar la función algo así como:
void Anadedato(int* vector, int tam, int dato)

??

(que conste que de punteros no estoy mu puesto, aunque el fallo es facil de encontrar :P)

The_Punisher
05/11/2008, 15:24
pues te falla esto:
vector[tam-1] = dato

porque vector es únicamente un valor entero.

No querrías declarar la función algo así como:
void Anadedato(int* vector, int tam, int dato)

??

(que conste que de punteros no estoy mu puesto, aunque el fallo es facil de encontrar :P)

Gracias a ti he dado con el fallo, el vector es un array de valores enteros con lo cual deberia haberlo declarado como int vector[]

:D ahora ya tengo menos errores en el codigo :quepalmo::quepalmo:

Es un ejercicio para buscar errores y correjirlos ^^

efegea
05/11/2008, 15:24
Es lo que dice Malenko, estás declarando la variable vector, como un número entero, en lugar de como un puntero a enteros.

Los punteros a enteros son equivalentes a arrays de enteros, o mejor dicho, un array de enteros se puede interpretar como un puntero al primero de esos enteros.

Así que eso, esta bien como dice Malenko, necesitas un * despues del int.


Puedo equivocarme porque no conozco el resto del código, pero parece que es eso.

EDIT: ouch! demasiado tarde

pakoito
05/11/2008, 15:25
Vector se lo has pasado a la función como un dato y luego lo usas como un array, básicamente.

The_Punisher
05/11/2008, 15:27
Se nota que soy un newbie eh? xDDDDDDDDDDD

punteros no voy a usar en todo el curso asi que no os preocupeis xD

Os dejo el codigo a medio arreglar por si quereis mirarlo quemarlo o cualquier cosa :P


#include <p30f6010.h>
#define TAMVECTOR 20
#define ORDENFILTRO 5

int Leerdato() ;
float Filtromedia (int vector[], int tam, int orden) ;
void Inicializavector (int vector[]) ;
void Anadedato(int vector,int tam, int dato);
void Desplazavector(int vector[], int tam);

int Leerdato() {
static int numero=1;
return numero++;
}

void Desplazavector(int vector[], int tam)
{
int i;
for (i=0;i<tam;i++)
vector[i]=vector[i+1];
}

void Anadedato(int vector[],int tam, int dato)
{
Desplazavector(vector,tam);
vector[tam-1]=dato;
}

float Filtromedia (int vector[], int tam, int orden, int media, int i)
{
media=0;
for (i=tam-1;i>tam-1-orden;i--)
media=media+vector[i];
return media/orden;
}

void Inicializavector (int vector[])
{
int i;
for (i=0;i<tam;i++)
vector[i]=0;
}


int main() {
int senal[TAMVECTOR];
int filtrada[TAMVECOT];
Inicializavector(senal,TAMVECTOR);
Inicializavector(filtrada,TAMVECTOR);
dato=Leerdato();
Anadedato(senal,TAMVECTOR,dato);
dato=Filtromedia(senal,TAMVECTOR,ORDENFILTRO);
Anadedato(filtrada,TAMVECTOR,dato);
return 0;
}

pakoito
05/11/2008, 15:29
Variables globales [Ahhh][Ahhh]

The_Punisher
05/11/2008, 15:31
Variables globales [Ahhh][Ahhh]

Pues si, eso parece, porque te asustan asi? No se usan para nada no? muchos conflictos, pero bueno, para lo que las vamosa usar, nos dijeron que nos valian xD

Malenko
05/11/2008, 15:33
Variables globales [Ahhh][Ahhh]

Estoy cegato o yo no las veo :S

The_Punisher
05/11/2008, 15:40
#include <p30f6010.h>
#define TAMVECTOR 20
#define ORDENFILTRO 5

int Leerdato() ;
float Filtromedia (int vector[], int tam, int orden, int media, int i);
void Inicializavector (int vector[], int tam) ;
void Anadedato(int vector[],int tam, int dato);
void Desplazavector(int vector[], int tam);

int Leerdato() {
static int numero=1;
return numero++;
}

void Desplazavector(int vector[], int tam)
{
int i;
for (i=0;i<tam;i++)
vector[i]=vector[i+1];
}

void Anadedato(int vector[],int tam, int dato)
{
Desplazavector(vector,tam);
vector[tam-1]=dato;
}

float Filtromedia (int vector[], int tam, int orden, int media, int i)
{
media=0;
for (i=tam-1;i>tam-1-orden;i--)
media=media+vector[i];
return media/orden;
}

void Inicializavector (int vector[], int tam)
{
int i;
for (i=0;i<tam;i++)
vector[i]=0;
}


int main() {
int dato;
int senal[TAMVECTOR];
int filtrada[TAMVECTOR];
Inicializavector(senal,TAMVECTOR);
Inicializavector(filtrada,TAMVECTOR);
dato=Leerdato();
Anadedato(senal,TAMVECTOR,dato);
dato=Filtromedia(senal,TAMVECTOR,ORDENFILTRO);
Anadedato(filtrada,TAMVECTOR,dato);
return 0;
}

Código corregido, casi compila, me devuelve un error que casi nunca entiendo, cosas que tiene no comprender del todo el funcionamiento de las funciones:(

Practica1.c:53: error: too few arguments to function 'Filtromedia'

Quiere decir que me faltan mas variables para procesar esa funcion? :S

pakoito
05/11/2008, 15:43
Calla, calla, que me he equivocado con las declaraciones de las primeras funciones. Nunca usé cabeceras, no me molan :p

efegea
05/11/2008, 15:43
Claro, fijate que defines Filtrmedia con cuatro argumentos y la llamas con solo 3

Malenko
05/11/2008, 15:43
Facil.

la defines asi:
float Filtromedia (int vector[], int tam, int orden, int media, int i)

y la llamas asi:
dato=Filtromedia(senal,TAMVECTOR,ORDENFILTRO);

te faltan argumentos para la llamada, no? cuento 5 en la declaración y 3 en la llamada

;)

efegea
05/11/2008, 15:45
Shit, he contado mal, ya mismo pa parbulitos!!

xzakox
05/11/2008, 16:06
Ademas parece que esos dos parametros de la función, int media e int i, no son tales parametros sino variables locales que usa la función, asi que supongo que tienes que quitarlos de la lista de parametros y meter las declaraciones dentro...

float Filtromedia (int vector[], int tam, int orden)
{
int media=0;
int i;
for (i=tam-1;i>tam-1-orden;i--)
media=media+vector[i];
return media/orden;
}

Por cierto, ya de paso, normalmente las funciones en C se ponen con la primera letra minúscula... para diferenciarlas mas adelante en C++ (o en POO en C, que también se puede hacer...) de nombres de clases...

Yo pondria algo como filtroMedia(....) por ejemplo.
Un saludo.

The_Punisher
05/11/2008, 16:34
Si veo que me faltan variables, pero no acabo de ver cuales son las que me faltan, no veo la relacion, tengo el tamaño del vector, el orden del filtro, las dos nuevas que cree, y que es la variable senal :S

hardyx
05/11/2008, 17:58
Creo que te va a reventar el programa cuando lo ejecutes, por la razón de que en la función Desplazavector estás accediendo a vector[i+1] y como tu vector tiene 20 posiciones, no puedes acceder a vector[20].

No veo la utilidad de la función Desplazavector, ten en cuenta que al principio está vacío, no hay nada que desplazar. Es mejor usar un índice static o global de esta manera.


// añadir mejorado
void Anadedato(int vector[], int tam, int dato)
{
static int indice = 0; // índice del elemento a añadir
// tam se usa ahora para chequear tamaño
if (indice < tam)
vector[indice++]=dato; // añade e incrementa índice
}

<-->


Sobre las variables de tu función, no confundas los parámetros con las variables locales. Unos son valores de llamada y las otras son internas a la función. Te pongo la función con lo que hay que borrar el rojo, y lo que hay que añadir en azul.


float Filtromedia (int vector[], int tam, int orden, int media, int i)
{
int media=0;
int i;
for (i=tam-1;i>tam-1-orden;i--)
media=media+vector[i];
return media/orden;
}
<-->

Otra cosa, para que función filtroMedia te dé un valor decimal tienes que convertir alguno de los operadores a float, de otra forma se hará una división entera (3/2 = 1) que no es lo que quieres:


return (float)media/orden;

Suerte

Drumpi
08/11/2008, 01:43
Solo por curiosidad ¿que es un indice static? (Es decir ¿que es un static int?)

pakoito
08/11/2008, 03:20
Tiene que ver con las formas de acceso con las herencias, es temario de C++/Java. Los estáticos pueden ser accedidos sin que una instancia de la clase haya sido creada, al menos en Java.

swapd0
08/11/2008, 14:08
Las variables static que declares dentro de una función se acordaran del valor la próxima vez que la llames.

Drumpi
08/11/2008, 17:10
Aaaah, vale, es chino :D
No, en serio, lo he pillado. Gracias por instruirme ;)