Autor Tema: Función - Situa posición - imprime valor con formato - Vector  (Leído 6575 veces)

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

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Función - Situa posición - imprime valor con formato - Vector
« en: 27 de Abril de 2009, 21:11:01 »
Hola amigos

Quisiera hacer en C una función, que me imprimiese los valores de un vector. de forma apilada, y que me valise para diferentes vectores.

tipo a esto :

////////////////////////////////////////////////////////////////////
imprime_vector(int x,int y,int a, int b,char cadena);
const char vactor[4][10]={"El uno","El dos","El tres","El cuatro"};
char cadena,cad;
int valor;

main()
  {
    for(valor=0;valor<5;valor++)
      {
       cad=*vector[valor];
       imprime_vector(3,1,0,valor,cad);
      }
getch(); //si pulsas tecla sale.
  }

imprime_vector(int x,int y,int a, int b,char cadena)
{
gotoxy(x+a,y+b);
printf("%s",cadena);
}

este programa no me funiona, podrian decirme cual es mi error/es.

Un saludo,
« Última modificación: 28 de Abril de 2009, 08:07:24 por pajaro »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Función - Situa posición - imprime valor con formato - Vector
« Respuesta #1 en: 27 de Abril de 2009, 21:31:00 »
Hola

Los errores que veo:

const char vactor[4][10]={"El uno","El dos","El tres","El cuatro"};
Debe ser:
const char vector[4][10]={"El uno","El dos","El tres","El cuatro"};

char cadena,cad;
cadena y cad deben ser declarados como apuntadores a char y no como un simple char:
char *cadena, *cad;

cad=*vector[valor];
Es una forma errónea de obtener la dirección ram de vector, si fuera CCS sería doblemente errónea ya que los const se guardan en ROM y no hay forma de direccionar un apuntador desde ram hacia rom directamente. La corrección que yo haría es usar el ampersand & para obtener la dirección ram de memoria y asignarla al apuntador cad.
cad=&vector[valor];
Si usas CCS entonces la constante vector declárala en ram para que el apuntador cad pueda accesarla (quítale el const).

getch();
Desconozco si está función existe en CCS, yo usaría getc() en espera de un char desde rs232.

imprime_vector(int x,int y,int a, int b,char cadena)
El prototipo de imprimevector deberá aceptar una dirección ram en cadena y no un char.
imprime_vector(int x,int y,int a, int b,char *cadena)

Veo que hay muchas dudas con el uso de arreglos de chars y strings. Gera comentó que iba a hacer un tutorial de strings, espero que lo tenga listo pronto.

Me gustaría hacer uno también  :mrgreen:
« Última modificación: 27 de Abril de 2009, 21:36:51 por migsantiago »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Función - Situa posición - imprime valor con formato - Vector
« Respuesta #2 en: 28 de Abril de 2009, 17:16:15 »
hola amigo

tengo alguna dudilla, con esto de los vectores y las cadenas .
tengo 3 vectores de 5,3,4 elementos:

v1[5][10]={"primero ","segundo ","tercero ","cuarto ","quinto "}
v2[5][10]={"primero ","segundo ","tercero "}
v3[5][10]={"primero ","segundo ","tercero ","cuarto "}

primero me gustaria saber si existe alguna funcion que cuente los elementos de un vector.

Por algun otro foro, me han recomendado que inicialice mi ultimo elemento a "\0", como identificador de fin de cadena.
¿Esto es fiable?¿Hay otra forma de hacerlo?

Pregunto .... seria algo asi..a mi no me rula..


Código: C
  1. e_vector()              //funcion para saber la logitud de un vector
  2.       {
  3. int a=0;              // a es el acumulador, b es la posicion del vector a buscar
  4. char b;
  5.  
  6. while(b!=0)           //mientras sea distinto busca
  7.      {
  8.       if(b!="\0")       //si es distinto
  9.            {
  10.            b=v1[a];
  11.            a=a+1;
  12.            }
  13.       }
  14. }


El segundo problema es, como modificar dicha funcion para pasarle el nombre del vertor a contar.
la funcion seria de salida un entero y de entrada un vector.

Código: C
  1. int e_vector(char v1(n))
  2. {
  3. int a=0;              // a es el acumulador, b es la posicion del vector a buscar
  4. char b;
  5.  
  6. while(b!=0)           //mientras sea distinto busca
  7.      {
  8.       if(b!="\0")       //si es distinto
  9.            {
  10.            b=v1[a];
  11.            a=a+1;
  12.            }
  13.       }
  14. return(a);              //nos da el valor de a, elementosde a.
  15. }

alguien puede aconsejarme o decirme...

es posible convertir una cosntante tipo char a una constante.


Un saludito, a todos




« Última modificación: 28 de Abril de 2009, 17:22:15 por pajaro »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Función - Situa posición - imprime valor con formato - Vector
« Respuesta #3 en: 28 de Abril de 2009, 17:55:21 »
Bueno, no has mencionado qué compilador usas.

¿Primero mencionabas que querías hacer una función que imprimiera valores en printf y luego quieres contar los elementos de una matriz? Creo que no has definido bien tu problema.

Lo que te mencionaron sobre el último elemento de un arreglo de chars siendo un Null char (0x00) es solo para marcar el fin de una cadena y no sirve para contar elementos de una matriz como v1 o v2.

En CCS busqué y no encontré una función que indique el tamaño de un arreglo o matriz. Sí existen en otros compiladores, por ejemplo en C# existe el GetLength().

Voy a hacer un pequeño tutorial de cadenas.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Función - Situa posición - imprime valor con formato - Vector
« Respuesta #4 en: 28 de Abril de 2009, 19:25:05 »
Bueno, ya terminé el tutorial. Dale una checada y dime si puedes resolver tus dudas con él.  :mrgreen:

http://www.todopic.com.ar/foros/index.php?topic=25785.new#new

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Función - Situa posición - imprime valor con formato - Vector
« Respuesta #5 en: 28 de Abril de 2009, 21:28:57 »
Hola amigo

Por fin me deja entrar..ese error de up!..base de...


pues si amigo, para micros uso la programacion de C CCS .
el tuto encontre una "rata" debajo del segundo cuadro gris donde pone novena creo que es octava.
el 4 y 5 cuadro gris me interesa, te explico.


bueno mire tu tuto comprendi muchas cosas de las que explicaste ahi, pero me surgieron otras dudas.

los arregros se pueden llamar string?
son vectores, de constantes de tipo cadena "char", cierto?
tambien pueden ser variables, cierto?,

cadena[]="cadena"
cadena[]={"c","a","d","e","n","a"}

¿estas dos cosas son lo mismo?

se debe de definir la longitud de la cadena, teniendo en cuenta que si definimos 5 elementos el quinto elemento sera un nulo.

pregunto, lo designo yo o lo designa el compilador?

si designo un vector de 5 v1[5]="abcde" //no se si son comillas simples o doble -->corrigeme.
y lo imprimo con un for desde el 0 hasta el 7

//////////////////////////////////////////////////no se si el programa funciona.
for(a=0;a<8;a++) //para que imprima de 0 a 7
{
print("%s \n",v1[a]);
}

///////////////////////////////////////
me imprima Todas las letras o solo las 4 primeras?
el resto de posiciones los llenara con lo de memoria o me los dejara en blanco?

el caso anterior es un vector lleno con letras,
si lo llenamos con cadenas entonces se define como una matriz?

v1[5][10]={uno,dos,tres,cuatro,cinco}//aceptaria sin comillas

si llevara caracter terminador, lo llevaria cada cadena de las 5 ,
en lo leido dice que cada cadena llevara su caracter terminador, correcto lo cogi.

la funcion strlen te cuenta caracteres de una cadena pero te contaria los de todo un vector.


un  saludo, dormir debo.



« Última modificación: 28 de Abril de 2009, 21:31:03 por pajaro »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Función - Situa posición - imprime valor con formato - Vector
« Respuesta #6 en: 29 de Abril de 2009, 11:34:29 »
Cierto, en el tutorial debe decir octava. Lo voy a corregir.

Citar
los arregros se pueden llamar string?

Los arreglos son arreglos. Los strings son la traducción de cadenas en inglés. Solo podrás llamar string a un arreglo de chars que maneje un NULL char al final del texto útil.

Citar
son vectores, de constantes de tipo cadena "char", cierto?

No, son vectores de variables tipo char. El contenido de esas variables se modifica en el programa (sprintf, strcat, funciones manuales, etc.). Ejemplo:

Código: [Seleccionar]
char nombre[50]="Santiago";
...
sprintf(nombre,"%s Todopic",nombre);

Al principio nombre contendrá 'Santiago'. Al final nombre contendrá 'Santiago Todopic'.

Código: [Seleccionar]
cadena[]="cadena"
cadena[]={"c","a","d","e","n","a"}

¿estas dos cosas son lo mismo?

No. La primer cadena está bien declarada. La segunda se debe declarar así:

Código: [Seleccionar]
cadena[]={'c','a','d','e','n','a'}
De tal forma ambas ya será iguales.

Citar
si designo un vector de 5 v1[5]="abcde" //no se si son comillas simples o doble -->corrigeme.
y lo imprimo con un for desde el 0 hasta el 7

Está mal, debes declarar el texto útil + Null. Debe ser así:

v1[6]="abcde";

o que el compilador los cuente solito:

v1[]="abcde"; //aparta 6 bytes para el vector automáticamente (5 letras + null)

Citar
for(a=0;a<8;a++) //para que imprima de 0 a 7
{
print("%s \n",v1[a]);
}

Eso no funciona. Al pedirle a printf que use %s le estás indicando que imprima caracteres hasta encontrar un null char. Debes usar %c para imprimir un solo caracter.

Código: [Seleccionar]
printf("%c",v1[a]);
Citar
si lo llenamos con cadenas entonces se define como una matriz?

v1[5][10]={uno,dos,tres,cuatro,cinco}//aceptaria sin comillas

Sin comillas no te deja compilar. Es una matriz correcta, ponle comillas a cada cadena.

Citar
la funcion strlen te cuenta caracteres de una cadena pero te contaria los de todo un vector.

strlen() solo cuenta caracteres hasta encontrar un NULL char. Solo dice cuántas letras útiles hay.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Función - Situa posición - imprime valor con formato - Vector
« Respuesta #7 en: 30 de Abril de 2009, 16:58:33 »
hola amigo MigSantiago

quisisera preguntar una cosilla

si se quisisera hacer una función que imprimiese los valores de un verctor de constantes, como se definiria?

Código: C
  1. cont char menup1[6][]={"uno","dos","tres","cuatro","cinco","seis"};
  2. cont char menup2[6][]={"unoA","dosA","tresA","cuatroA","cincoA","seisA"}
  3.  
  4. apila_vectr(int col,int lin,int posA,int posB,menup1[pos-1]);
  5. {
  6. for(pos=col;pos<col+lin;pos++)
  7.           {
  8.            lcd_gotoxy(posA,posB);                           /// Situa menu 3,posb(1,2,3,4)
  9.            printf(lcd_putc,"%s",menup1[pos-1]);       ///muestra mirecion de menu
  10.            posB=posB+1;                                        ///inc. linea
  11.            if(posB>lin){posB=1;}                             ///limita linea
  12.           }
  13. }

esto te mostraria el contenido del vector? o eso he eintentado
como se le pasaria el volor de otro vector.
la cabecera de la funcion debe de ser incorrecta. 
c de CSS me tira muchos errores


Un saludo amigo
« Última modificación: 01 de Mayo de 2009, 08:43:58 por pajaro »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Función - Situa posición - imprime valor con formato - Vector
« Respuesta #8 en: 30 de Abril de 2009, 18:51:14 »
Creo que estás complicándote mucho, aunque todavía no entiendo qué quieres que la función haga.

Te pongo un ejemplo de función que imprime una cadena de acuerdo a un entero:

Código: [Seleccionar]
const char cadena[][]=
   {"Este es un UNO",
   "Este es un DOS",
   "Este es un TRES",
   "Y este es el último. Tan Tan."};

void ImprimeLCD(int x, int y, int numero)
{
lcd_gotoxy(x,y);
printf(lcd_putc,"%s", cadena[numero]);
}

Si numero vale 3, entonces la salida será:

Código: [Seleccionar]
Y este es el último. Tan Tan.
« Última modificación: 30 de Abril de 2009, 18:57:33 por migsantiago »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Función - Situa posición - imprime valor con formato - Vector
« Respuesta #9 en: 30 de Abril de 2009, 21:15:40 »
hola Amigo MigSantiago

esto de la funcion es sencillo se trata de implementar una funcion que la entrada sea un vector diferente segun situacion,
me explico tengo un vector.
menup[][]={"1.-menu1","2.-menu2","3.-menu3","4.-menu4","5.-menu5"};

lo quiero mostrar asi:

_ _ 1.-menu1
_ _ 2.-menu2
_ _ 3.-menu3
_ _ 4.-menu4
_ _ 5.-menu5

esta función la usaría siempre que quìsera leer un menu o un submenu, ya que serían vectores, ambos.

Código: C
  1. cont char menup1[6][]={"uno","dos","tres","cuatro","cinco","seis"};
  2. cont char menup2[6][]={"unoA","dosA","tresA","cuatroA","cincoA","seisA"}
  3.  
  4. apila_vectr(int col,int lin,int posA,int posB,menup1[pos-1]);
  5. {
  6. for(pos=col;pos<col+lin;pos++)
  7.           {
  8.            lcd_gotoxy(posA,posB);                           /// Situa menu 3,posb(1,2,3,4)
  9.            printf(lcd_putc,"%s",menup1[pos-1]);       ///muestra opcion de menu
  10.            posB=posB+1;                                        ///inc. linea
  11.            if(posB>lin){posB=1;}                             ///limita linea
  12.           }
  13. }

pero menup1 no se va ha llamar siempre seria posible hacer


//////////////////////////////////////////////////////////////////////////

cont char menup1[6][]={"uno","dos","tres","cuatro","cinco","seis"};
cont char menup2[6][]={"unoA","dosA","tresA","cuatroA","cincoA","seisA"}

apila_vectr(int col,int lin,int posA,int posB,menup1[pos-1]);
{
for(pos=col;pos<col+lin;pos++)
          {
           lcd_gotoxy(posA,posB);                           /// Situa menu 3,posb(1,2,3,4)
           
           printf(lcd_putc,"%s",menup1[pos-1]);       ///muestra mirecion de menu

           posB=posB+1;                                        ///inc. linea
           if(posB>lin){posB=1;}                             ///limita linea
          }
}

////////////////////////////////////////////////////

menup1 sera esta vez pero otras sera menup2 , que hago declaro una variable vector de intercabio.
o simplemente en entrada declaro como vector

apila_vectr(int col,int lin,int posA,int posB,menup1[8]);

lo malo es que ese vector no simpre va ha ser de 8 sino que va ha variar, y me interesa ahorrar memoria.


tu como lo ves, entiendes ahora lo que intento hacer, basicamente es esto, después tendre que perfecionar más la función.

Un saludo amigo.

« Última modificación: 01 de Mayo de 2009, 09:32:43 por pajaro »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Función - Situa posición - imprime valor con formato - Vector
« Respuesta #10 en: 01 de Mayo de 2009, 12:15:31 »
No declaras bien la función.

Código: [Seleccionar]
#
apila_vectr(int col,int lin,int posA,int posB,char *menu);
#
{
#
for(pos=col;pos<col+lin;pos++)
#
         {
#
          lcd_gotoxy(posA,posB);                           /// Situa menu 3,posb(1,2,3,4)
#
          printf(lcd_putc,"%s",menu);       ///muestra opcion de menu
#
          posB=posB+1;                                        ///inc. linea
#
          if(posB>lin){posB=1;}                             ///limita linea
#
         }
#
}

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Función - Situa posición - imprime valor con formato - Vector
« Respuesta #11 en: 01 de Mayo de 2009, 12:30:25 »
Hola Amigo MigSantiago

Si declaro la cabecera de funcion:

apila_vectr(int col,int lin,int posA,int posB,char *menu);

el vector lo declaramos como un puntero?
entoces con solo pasarle el nombre del vertor, por ejemplo menup01, o menup02, sin ponerle por ejemplo menup01[8];

Amigo Santigo puedes explicarme? te lo agradeceria amigo MigSantiago.

Un saludo, gracias por tu ayuda.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Función - Situa posición - imprime valor con formato - Vector
« Respuesta #12 en: 01 de Mayo de 2009, 13:08:12 »
Si le pasas:

Código: [Seleccionar]
apila_vectr(1,2,3,4,menupo1[2]);
Imprimirá

Código: [Seleccionar]
3.-menu3

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Función - Situa posición - imprime valor con formato - Vector
« Respuesta #13 en: 01 de Mayo de 2009, 16:55:32 »
Hola Amigo MigSantiago

te agradezco tu respuesta,pero yo le quiero pasar el nombre del vector, no un valor del vector, esto es posible?

apila_vectr(1,2,3,4,menupo1[2]);

con esta cabecera le paso a la función una direcion del vector,

apila_vectr(1,2,3,4,menupo1[]);

pero lo que yo quiero hacer es pasarle el nombre del vector solamente,

para posteriormente operar sobre el

/////////////////////////////////////////////////////////////////////////

void pantalla(int col,int lin,int posA,int posB,char menup1[])
{
int pos;
 for(pos=col;pos<col+lin;pos++)                  ///limita las lineas a mostrar con referencia al cursor
   {
    lcd_gotoxy(posA,posB);                           ///posiciona el cursor segun referencia de entrada y linea a mostrar
    printf(lcd_putc,"%s",menup1[pos-1]);       ///muestra  opciones del menu segun las lineas permitidas
    posB=posB+1;                                       ///incrementa la posición del cursor con refercia a la entrada y la linea
   }
}

/////////////////////////////////////////////////////////////////////////

es posible pasarle el nombre del vector, sin pasarle ninguna direccion de este vector

la idea es pasar a la entrada de esta funcion diferentes nombres de vectores con los
que posteriormente se operara, teniendo en cuenta que van ha tener diferente longitud.


tengo otra duda ..

char* ptr   es distinto de char *ptr
me da que si! pero puedes indicarme la diferencia.

Un saludo, amigo MigSantiago

« Última modificación: 01 de Mayo de 2009, 16:58:18 por pajaro »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Función - Situa posición - imprime valor con formato - Vector
« Respuesta #14 en: 01 de Mayo de 2009, 17:18:50 »
No, no se puede. En C se mueven datos: contenido de variables o dirección ram de variables, pero no nombres de variables.

Estás planteando mal tu problema.

Lo puedes resolver con el ejemplo de multicadenas del tutorial. Estúdialo otra vez.

Código: [Seleccionar]
char* ptr
 char *ptr

Ambos son idénticos hasta donde yo sé.