Autor Tema: :: Tamaño de un vertor ::  (Leído 4505 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
:: Tamaño de un vertor ::
« en: 17 de Junio de 2012, 16:48:42 »
Hola

No recuerdo como se hace en CCS pic c
para obtener el tamaño de un vector de numeros.
bBsque hilos por el foro pero no di con ninguno que cuante como se hace eso
mis vectores no son de letras son de numero.no puede ser muy dificil hacer esto.

es decir si yo quiero generar una funcion en la cual le paso un vector
a la funcion como parametro,
como por ejemplo:

Código: C++
  1. // funcion que cuenta ceros
  2. //vector.length no funciona
  3. //---------------------------
  4. int8 num_n(int8 vector[]){
  5.     int8 a,cnt;
  6.     cnt=0;
  7.         for(a=0;a<vector.length;a++){
  8.              if(vector[a]==0){
  9.                    cnt=cnt+1;
  10.              }
  11.         }
  12.     return cnt;
  13. }

¿como se puede hacer esto,?
¿que libreia maneja los vectores en ccs?
¿Es posible esto?

Un Saludo

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: :: Tamaño de un vertor ::
« Respuesta #1 en: 17 de Junio de 2012, 17:00:41 »
ninguna, no existen vectores en ccs. Posible es, o bien lo tendrias que hacer tu, o bien buscarte alguna persona que lo haya hecho y usar su codigo.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: :: Tamaño de un vertor ::
« Respuesta #2 en: 17 de Junio de 2012, 19:40:48 »
quizas esta funcion es la que estas buscando

strlen(vector)


te regresa la longitud de la cadena "vector",
"Nada es imposible, no si puedes imaginarlo"

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: :: Tamaño de un vertor ::
« Respuesta #3 en: 17 de Junio de 2012, 21:57:20 »
strlen no es el tamaño de ningun array, unicamente busca hasta que encuentre un 0, y entonces ahi determina el final del array, que da igual que tenga 100 posiciones y solo los 2 primeros en uso, como 100/100

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: :: Tamaño de un vertor ::
« Respuesta #4 en: 17 de Junio de 2012, 22:01:46 »
strlen no es el tamaño de ningun array, unicamente busca hasta que encuentre un 0, y entonces ahi determina el final del array, que da igual que tenga 100 posiciones y solo los 2 primeros en uso, como 100/100

 :o, esa no me la sabia. Gracias por la informacion MerLiNz ;-)
"Nada es imposible, no si puedes imaginarlo"

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: Tamaño de un vertor ::
« Respuesta #5 en: 17 de Junio de 2012, 22:02:15 »
hola
Una solución, pero seguro que hay otra.

- yo queria obtener la longitud de un vector

Código: C++
  1. #include <stdio.h>
  2. int8 v[]={1,0,1,0,1,0}
  3.  
  4. void main(void){
  5. int8 n;
  6. n=sizeof(v);
  7. printf("\n\r tamano del vector: %d"n)
  8.  
  9. }

Si alguien conoce alguna otra forma,
que la añada al hilo asi la proxima vez
sera mas facil


Un Saludo.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: :: Tamaño de un vertor ::
« Respuesta #6 en: 17 de Junio de 2012, 22:52:34 »
el sizeof solo funciona como macro, es decir, una vez lo compila automaticamente reemplaza el n=sizeof por n=6, sin embargo no puedes determinar el tamaño de arrays que no se sabe de un principio su tamaño como has indicado anteriormente en tu codigo:

int8 num_n(int8 vector[]){
    int8 a,cnt;
    cnt=0;
        for(a=0;a<sizeof(vector);a++){ //aqui te dara un error
             if(vector[a]==0){
                   cnt=cnt+1;
             }
        }
    return cnt;
}

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: Tamaño de un vertor ::
« Respuesta #7 en: 19 de Junio de 2012, 06:59:52 »
Hola
La solucion a eso es inicializar la variable a un tamaño, y pasarle siempre el tamaño como parametro,
otra cosa que termine haciendo fue definir el vector asi:
vector[]; te lo detecta como 1 si lo inicializas a vector[4] o vector[]={1,2,3,4}
te devuelve el tamaño => 4.

Tambien lei por ahi que hay una forma dinamica de cambiar la variable en proceso de ejecucion dediante
el uso de la direcion y punteros.

Ademas el uso de punteros te evita gastar mucha memoria pero como la cagues, la preparas gorda.

Un Saludo.
« Última modificación: 19 de Junio de 2012, 14:01:05 por pajaro »

Desconectado Zardoz

  • PIC10
  • *
  • Mensajes: 18
    • ZardoZ the Technomage
Re: :: Tamaño de un vertor ::
« Respuesta #8 en: 19 de Junio de 2012, 11:35:01 »
Así debería de ser el código:

Código: [Seleccionar]
int8 num_n(int8* array, size_t length){
  size_t a;
  int8 cnt = 0;
  for(a=0 ; a<length ; a++){
    if( vector[a] == 0 ) {
      cnt=cnt+1;
    }
  }
  return cnt;
}

Por favor, no confundamos C++ con C. Aquí nunca han existido vectores. Si necesitas la longitud de un array, dicha longitud la almacenas en una variable (o en un constante si hablamos de un array estático).

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: :: Tamaño de un vertor ::
« Respuesta #9 en: 19 de Junio de 2012, 13:05:30 »
los punteros no ahorran memoria, eso ya lo he dicho varias veces, un puntero es unicamente una variable que almacena una direccion de memoria para usarla, sin embargo la memoria que utilizas tiene que estar controlada, porque puedes pisar datos, de todas formas lo puedes pisar tanto con punteros como con arrays.

char array[5];

si ponemos array[100]=10; no nos da error, sin embargo estamos escribiendo en una parte de la memoria de la cual no habemos reservado por lo cual podemos estar sobrescribiendo otra variable en esa direccion.
char *p=&array;

al igual que si ponemos *(p+100)=10; estamos haciendo lo mismo que en el caso anterior

Desconectado Zardoz

  • PIC10
  • *
  • Mensajes: 18
    • ZardoZ the Technomage
Re: :: Tamaño de un vertor ::
« Respuesta #10 en: 19 de Junio de 2012, 20:10:39 »
los punteros no ahorran memoria, eso ya lo he dicho varias veces, un puntero es unicamente una variable que almacena una direccion de memoria para usarla, sin embargo la memoria que utilizas tiene que estar controlada, porque puedes pisar datos, de todas formas lo puedes pisar tanto con punteros como con arrays.

Efectivamente el uso de punteros no ahora memoria de por si, pero pasar el puntero de algo grande (lo que seria paso por referencia en lenguajes de más alto nivel) si permite ahorrar algo de memoria en el C ANSI.

Código: [Seleccionar]
struct BUFFER {
 int8 buf[512];
 int8 pos_r;
 int8 pos_w;
};

int8 pop_buff (struct BUFFER buf, int8 pos) {
...
}

int8 pop2_buff (struct BUFFER* buf, int8 pos) {
...
}

La diferencia entre pop_buf y pop2_buf es que en pop_buf, cuando es llamada, se le pasa toda una copia de la estructura buf, lo cual es lento y requiere reservar memoria de pila para toda la estructura. (En los PIC por su peculiar arquitectura, entiendo que usa otro trozo de memoria RAM directamente, ya que no existe memoria de pila de la forma que es habitual en x86, mips , sparc, etc...).
Sin embargo en pop2_buf, solo se pasa la dirección de memoria en donde esta la estructura, evitando tener que duplicar toda la estructura, y por lo tanto ahorrando memoria al mismo tiempo que se gana velocidad al no tener que duplicar dicha estructura entera.

char array[5];

si ponemos array[100]=10; no nos da error, sin embargo estamos escribiendo en una parte de la memoria de la cual no habemos reservado por lo cual podemos estar sobrescribiendo otra variable en esa direccion.
char *p=&array;

al igual que si ponemos *(p+100)=10; estamos haciendo lo mismo que en el caso anterior

Igualmente *(array +100) también accede la misma dirección de memoria, así como hacer p[100] y 100[p] o 100[array] .

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: :: Tamaño de un vertor ::
« Respuesta #11 en: 19 de Junio de 2012, 20:27:35 »
el caso es que depende de lo que quieras hacer, si quieres utilizar determinados datos para escribirlos tendrias que usar el pop ya que si te pones a escribir los datos de pop2 entonces modificarias la memoria original. Y al contrario, usar el pop para leer unicamente la memoria pues es un desperdicio. Lo que quiero decir es que depende de lo que quieras hacer debes usar un metodo u otro.