• Domingo 19 de Mayo de 2024, 08:18

Autor Tema:  Programa con vectores  (Leído 2944 veces)

keroveros

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Programa con vectores
« en: Jueves 23 de Octubre de 2008, 03:03 »
0
Saludos a todos.

Tengo un problema al ejecutar un programa con el compilador gcc de Linux. Vereis, en mi programa tengo declarado un vector como char con un tamaño de 5 posiciones. (Al principio le pasaba este parametro mediante atoi(argv[1]) pero al ver que lo que queria hacer no me funcionaba, decidi primero asignarle a la fuerza una longitud). El problema es que quiero introducir numero enteros uno detrás de orto separados por espacios (ya que el profesor nos lo indica asi) pero no encuentro el modo de hacerlo. Probé con "scanf("%s ", vec)", tambien probé con "gets(vec)" -->pero entonces el compilador gcc me ORDENAVA que no usase "gets" ya que era peligroso. Probé tambien usando "fgets(vec,5,stdin)" pero al introducir los enteros me daba error "SEGMENTATION FAULT"...

En fin, no se como demonios introducir una cadena de enteros dentro de un vector ¿alguien podria ayudarme?

PD: lo peor de todo es que ese es el menor problema que tengo, ya que he de confeccionar un programa que haga un torneo de artes marciales, una lucha entre vectores en el que se lucha 1 vector contra otro, el ganador pierde 1 punto en cada 1 de sus elementos, i el vencido pone todos sus elementos a 0. Si a alguien le apetece ayudarme en eso también, estari agradecido!

Saludos!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Programa con vectores
« Respuesta #1 en: Jueves 23 de Octubre de 2008, 06:31 »
0
Hola, keroveros, bienvenido al foro.

Yo que tú declararía el tipo de datos del vector tal que:

Código: C
  1. int vec[5];
  2.  

Y recibiría la cadena así:

Código: C
  1. char * entrada;
  2. [...]
  3. scanf("%s",entrada); 
  4.  

Después procesaría la cadena entrada e insertaría los número en vec[].

keroveros

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Programa con vectores
« Respuesta #2 en: Jueves 23 de Octubre de 2008, 10:48 »
0
No entiendo muy bien.


"Char * entrada"

eso es un puntero ?

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Programa con vectores
« Respuesta #3 en: Jueves 23 de Octubre de 2008, 10:55 »
0
Cita de: "keroveros"
eso es un puntero ?
Sí. Así es como se declara una cadena de caracteres en C.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Programa con vectores
« Respuesta #4 en: Jueves 23 de Octubre de 2008, 12:05 »
0
Asi no lo hagas, ese puntero a caracter (char *) esta apuntando (valga la redundancia) a una posicion indefinida y lo mas probable es que de una excepcion al acceder a memoria invalida. Podes usar memoria estatica o dinamica para leer la cadena.

VC++ advierte del problema: warning C4700: local variable 'str' used without having been initialized.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Programa con vectores
« Respuesta #5 en: Jueves 23 de Octubre de 2008, 12:18 »
0
Cita de: "Eternal Idol"
Asi no lo hagas

Bueno, más bien hazlo, pero como bien dice Eternal Idol reservando la memoria.

Reserva estática:
Código: C
  1. char entrada[256]; //Así reservas 256 caracteres, puedes poner los que quieras
  2.  

De esta forma no puedes modificar la memoria reservada, es decir, siempre van a ser 256 caracteres.

Reserva dinámica:
Código: C
  1. #include <stdio.h>
  2. [...]
  3. char * entrada;
  4. [...]
  5. entrada = malloc(256); //También reservas 256 caracteres, pero aquí puedes usar una expresión como argumento para malloc
  6.  

Con este segundo método puedes hacer aquello que comentabas de atoi(argv[1]), es decir, malloc(atoi(argv[1])), e incluso cambiar el tamaño posteriormente con realloc(). Cuando acabes de usar esta memoria, tendrás que hacer un free(entrada) para liberarla. Suerte!

keroveros

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Programa con vectores
« Respuesta #6 en: Jueves 23 de Octubre de 2008, 12:44 »
0
La verdad es que nunca use la funcion malloc(); ni se como se usa.

MI problema aun no lo he solucionado. Declaro un vector[N] ese N sera "atoi(argv[1])" porque no quiero que tenga una longitud definida, si no que el usuario la defina quando ejecute el programa "./programa.exe 5"
Ahora bien, el programa me pide que introduzca los valores del vector, y yo lo que quiero es introducirlos así:

"Introduzca los valores
1 2 3 4 5"

Probé a almacenarlos con scanf("%[^n]", vecor) pero el problema está en que me cuenta como caracter los espacios, entonces para introducir el tamaño en el vector, i que el usuario pueda poner "1 2 3 4 5" deberiamos poner "./programa.exe 9" Porque 5 son los numeros que el usuario va a poner i 4 mas por cada espacio. Pero no quiero eso, quiero que el usuario ponga que el vector sera de 5 y que el mismo ponga "1 2 3 4 5"

También probé a usar gets(); pero me da WARNING

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Programa con vectores
« Respuesta #7 en: Jueves 23 de Octubre de 2008, 12:56 »
0
Veo que estás muy verde en C aún.

Cita de: "keroveros"
Declaro un vector[N] ese N sera "atoi(argv[1])" porque no quiero que tenga una longitud definida

Entonces no puedes declararlo como vector[N] porque no se puede. Tienes que usar malloc()

Cita de: "keroveros"
La verdad es que nunca use la funcion malloc(); ni se como se usa.

Reserva tantos bytes de memoria como le indiques en el argumento, y devuelve un puntero a la zona de memoria reservada. Como te comentaba antes, tendrías que hacer:

Código: C
  1. int *vector;
  2. vector = malloc(atoi(argv[1]));
  3.  

Ahí tendrías tu vector, que puedes usar como vector[] (como un array, vamos).

Cita de: "keroveros"
Probé a almacenarlos con scanf("%[^n]", vecor)

No, vamos a ver, primero almacena la entrada en una cadena de caracteres (como te he comentado anteriormente), luego le sacas los números que van separados por espacios y los insertas en vector[]. No puedes meterlos directamente en vector[], olvídate de eso.

keroveros

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Programa con vectores
« Respuesta #8 en: Jueves 23 de Octubre de 2008, 13:28 »
0
Citar
luego le sacas los números que van separados por espacios y los insertas en vector[]

Podrias decirme como haces eso? porque no tengo ni idea

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Programa con vectores
« Respuesta #9 en: Jueves 23 de Octubre de 2008, 13:38 »
0
Con recorres la cadena carácter a carácter en un bucle. Saltas los espacios y almacenas los enteros con atoi() en el vector anteriormente mencionado. No es muy complicado intenta hacerlo.

EL_UNI

  • Nuevo Miembro
  • *
  • Mensajes: 19
  • Nacionalidad: es
    • Ver Perfil
Re: Programa con vectores
« Respuesta #10 en: Viernes 24 de Octubre de 2008, 11:53 »
0
Habría que tener en cuenta también lo que han dado en clase.... no puedes usar cosas que no hayan dado (o eso creo yo) porque podría decirte que no lo quiere así, que lo quiere como el diga...

De todas maneras, tienes que introducir todos los datos de golpe separados por espacios o puedes meterlos uno a uno (metes dato,enter,metes dato,enter....)??

Si es de la segunda manera lo tienes muchisimo más fácil.
Programar es dejar fluir tu imaginación ^^ - EL_UNI

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Programa con vectores
« Respuesta #11 en: Viernes 24 de Octubre de 2008, 12:31 »
0
Cita de: "EL_UNI"
Habría que tener en cuenta también lo que han dado en clase....

Perdona, pero no soy adivino. Si es el caso, que lo diga... De todas formas, si quiere hacerlo exactamente como dice, no tiene otra opción que usar memoria dinámica.

Cita de: "EL_UNI"
o puedes meterlos uno a uno

Desde luego así es más sencillo porque no hay que recorrer la entrada, sino encajarlos directamente en vector[]. Pero tanto como muchísimo más fácil... Recorrer una cadena tampoco es que sea muy difícil.

keroveros

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Programa con vectores
« Respuesta #12 en: Viernes 24 de Octubre de 2008, 13:54 »
0
He conseguido medio solucionar el problema que tenia.
Vereis, en la entrada tengo que introducir los datos en forma de cadena de carácteres, por tanto delcaré una variable char y la llenaba con un for. Despúes esa cadena tenia que introducirla en una matriz, por lo tanto delcaré un puntero char también. Despues igualé el puntero a la posición matriz[fila][columna](con un for para las filas i otro para las columnas)i le pasé los datos como entero. Es decir hice algo así: matriz[fila][columna]=(*p_mat)-48;
-48 para pasar de ASCII a entero (que también podria haber usado atoi).

Demomento me funciona como quiero..lo que no se si podria haberlo optimizado más y haberlo hecho mas sencillo.

Porcierto gracias a todos por las respuestas, Moskito, tus rspuestas, aunque no me ayudaron mucho, me hicieron buscar informacion sobre funciones que no conocia y ahora ya si! Gracias!^^

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Programa con vectores
« Respuesta #13 en: Viernes 24 de Octubre de 2008, 14:00 »
0
Cita de: "keroveros"
Moskito, tus rspuestas, aunque no me ayudaron mucho, me hicieron buscar informacion sobre funciones que no conocia

Me alegro, porque ese era el objetivo  ;) .

Cita de: "keroveros"
Declaro un vector[N] ese N sera "atoi(argv[1])" porque no quiero que tenga una longitud definida

¿Qué has hecho con este problema?

Cita de: "keroveros"
matriz[fila][columna]=(*p_mat)-48;

No está mal, veo que vas aprendiendo :good: aunque un char * lo puedes recorrer como si fuera un char[], es decir matriz[fila][columna]=entrada - 48;

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Programa con vectores
« Respuesta #14 en: Viernes 24 de Octubre de 2008, 14:01 »
0
Cita de: "EL_UNI"
Habría que tener en cuenta también lo que han dado en clase....

BAJO NINGUN CONCEPTO.

Cita de: "EL_UNI"
no puedes usar cosas que no hayan dado (o eso creo yo) porque podría decirte que no lo quiere así, que lo quiere como el diga...

Ese seria pura y exclusivamente SU problema si es que viene a pedir soluciones a tareas escolares. Espero que te quede claro y vayas comprendiendo la dinamica del foro.

GRACIAS.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.