Junio 23, 2018, 02:36:52 am

Autor Tema: Pasar estructura a función, dentro de main no funciona, global si.  (Leído 1574 veces)

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

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 51
  • Sexo: Masculino
    • Ver Perfil
Hola gente, ¿como están?
Les cuento un poco de mi, tengo 66 años y soy un entusiasta autodidacta de programación, estuve unos 3 años estudiando C y realmente llegue a una gran frustración, no aprendí casi nada porque todo era copiar y pegar, para valorizarme un poco y no repetir estudie python y me fue muy bien pero extraño los punteros el trabajar con memoria etc. etc.
Bueno el primer problema que encontré es el trabajar con estructuras:
Este es el código, me funciona con la variable ip como global, pero lo que quiero es declarar la variable de tipo struct dentro de la función principal.

Código: You are not allowed to view links. Register or Login
#include <stdio.h>
#include <string.h>

typedef struct{
int codigo;
char des[50];
float precio;
}producto;

producto ip[5];

void imprimir();

int main (int argc, char *argv[]){
int i, ch=0;
char *p=NULL;


for (i=0; i<5; i++){
printf ("\n Ingrese codigo del producto........: ");
scanf ("%d", &ip[i].codigo);
if((p=strchr(ip[i].des, '\n'))){
*p='\0';
}else{
while((ch = getchar()) !='\n' && ch!=EOF);

}

printf ("\n Ingrese descripcion del producto...: ");
fgets (ip[i].des, 50, stdin);

printf ("\n Ingrese precio del producto........: ");
scanf ("%f", &ip[i].precio);

printf ("\n");
}

imprimir();

return 0;
}

void imprimir(){
printf ("\n Ok todo funciona...");
}
Desde ya muchas gracias.
Daniel.

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

Desconectado Solid Water

  • Yo vivo en CPH
  • ***
  • Mensajes: 1133
  • Sexo: Masculino
  • Vuelvan Hackers!
    • Ver Perfil
Re:Pasar estructura a función, dentro de main no funciona, global si.
« Respuesta #1 en: Mayo 23, 2018, 10:19:29 pm »
Me conmueve tu historia.
No sé que problema tienes:
Código: You are not allowed to view links. Register or Login
#include <stdio.h>
#include <string.h>

typedef struct{
        int codigo;
        char des[50];
        float precio;
}producto;


void imprimir();

int main (int argc, char *argv[]){
        int i, ch=0;
        char *p=NULL;

        producto ip[5];


        for (i=0; i<5; i++){
                printf ("\n Ingrese codigo del producto........: ");
                scanf ("%d", &ip[i].codigo);
                if((p=strchr(ip[i].des, '\n'))){
                        *p='\0';
                }else{
                        while((ch = getchar()) !='\n' && ch!=EOF);

                }

                printf ("\n Ingrese descripcion del producto...: ");
                fgets (ip[i].des, 50, stdin);

                printf ("\n Ingrese precio del producto........: ");
                scanf ("%f", &ip[i].precio);

                printf ("\n");
        }

        imprimir();

        return 0;
}

void imprimir(){
        printf ("\n Ok todo funciona...");
}

Código: You are not allowed to view links. Register or Login
#include <stdio.h>
#include <string.h>

void imprimir();

int main (int argc, char *argv[]){
        int i, ch=0;
        char *p=NULL;

    typedef struct{
                int codigo;
                char des[50];
                float precio;
        }producto;

        producto ip[5];


        for (i=0; i<5; i++){
                printf ("\n Ingrese codigo del producto........: ");
                scanf ("%d", &ip[i].codigo);
                if((p=strchr(ip[i].des, '\n'))){
                        *p='\0';
                }else{
                        while((ch = getchar()) !='\n' && ch!=EOF);

                }

                printf ("\n Ingrese descripcion del producto...: ");
                fgets (ip[i].des, 50, stdin);

                printf ("\n Ingrese precio del producto........: ");
                scanf ("%f", &ip[i].precio);

                printf ("\n");
        }

        imprimir();

        return 0;
}

void imprimir(){
        printf ("\n Ok todo funciona...");
}

Si queres no hace falta que le pases parámetros a la función main.
No sé si algun compilador se queje. Pero no creo.

Saludos,
« Última modificación: Mayo 23, 2018, 11:02:26 pm por Solid Water »

Not for the money, not for the fame. Not for the power, just no more games.

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 51
  • Sexo: Masculino
    • Ver Perfil
Re:Pasar estructura a función, dentro de main no funciona, global si.
« Respuesta #2 en: Mayo 24, 2018, 12:49:51 pm »
Hola, desconocía que conocieras los 2 lenguajes, me alegra.
Ahora tal vez lo entiendas mejor. Por una cuestión de costumbre declaro la estructura fuera de la función principal, como tengo que imprimir lo ingresado dentro de la función main le paso a la función imprimir como parámetro la estructura y me da un montón de errores. -

Prototipo:
Código: You are not allowed to view links. Register or Login
void imprimir (struct ip[]);
Llamada:
Código: You are not allowed to view links. Register or Login
imprimir(ip);
Función:
Código: You are not allowed to view links. Register or Login
void imprimir (struct ip[]){
int i;

for (i=0; i<MAX; i++){
printf ("\n Producto...: codigo %d producto %s precio %f", ip[i].codigo, ip[i].des, ip[i].precio);
}
}
Espero puedas entender el porque no me compila, igual voy a seguir leyendo los errores y si logro
que funcione antes de que contestes, lo posteo.
Saludos.


Desconectado Solid Water

  • Yo vivo en CPH
  • ***
  • Mensajes: 1133
  • Sexo: Masculino
  • Vuelvan Hackers!
    • Ver Perfil
Re:Pasar estructura a función, dentro de main no funciona, global si.
« Respuesta #3 en: Mayo 24, 2018, 02:33:46 pm »
Código: You are not allowed to view links. Register or Login
void imprimir (producto ip2[]);

Según leí (Yo estoy compilando como C++) si estas en C a secas tenes que agregarle struct antes de producto. Pero la verdad que no lo comprobé.

Y en imprimir() usas ip2 en vez de ip.

Aunque si ip es global no haría falta pasarla como parámetro.

También podes pasarla por referencia así:

void imprimir (producto *ip2);

Pero en ambos casos como te dije es innecesario siendo ip global.

Saludos,

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 51
  • Sexo: Masculino
    • Ver Perfil
Re:Pasar estructura a función, dentro de main no funciona, global si.
« Respuesta #4 en: Mayo 24, 2018, 03:11:27 pm »
Logre que funcione, pero no logro que me limpie el buffer de teclado, si alguien tiene noción de como solucionarlo desde ya muchas gracias, -

Código: You are not allowed to view links. Register or Login
#include <stdio.h>
#include <string.h>
#define MAX 2

typedef struct{
int codigo;
char des[50];
float precio;
}producto;

void escribir_datos (producto param[]);
void imprimir_datos (producto param[]);
   
int main(){
producto datos[MAX];
escribir_datos(datos);
imprimir_datos(datos);
    return 0;
}


void escribir_datos (producto param[]){
int i, ch=0;
char *p=NULL;


for (i=0; i<MAX; i++){
printf ("\n Ingrese codigo del producto........: ");
scanf ("%d", &param[i].codigo);

printf ("\n Ingrese descripcion del producto...: ");
fgets (param[i].des, 50, stdin);

if((p=strchr(param[i].des, '\n'))){
*p='\0';
}else{
while((ch = getchar()) !='\n' && ch!=EOF);
}

printf ("\n Ingrese precio del producto........: ");
scanf ("%f", &param[i].precio);

printf ("\n");
}

printf ("\n Codigo %d", param[0].codigo);
}

void imprimir_datos (producto param[]){
int i;
printf ("\n ========== Productos ==========");

for (i=0; i<MAX; i++){
printf ("\n codigo %d producto %s precio %f", param[i].codigo, param[i].des, param[i].precio);
}
}
Saludos.

Desconectado jep

  • Night Elf Druid
  • Colaborador
  • ****
  • Mensajes: 1773
  • Sexo: Masculino
    • Ver Perfil
Re:Pasar estructura a función, dentro de main no funciona, global si.
« Respuesta #5 en: Mayo 24, 2018, 03:55:25 pm »
Para evitar que quede basura en el buffer de entrada es mejor simpre leer toda la linea con fgets, y despues sacar de ahi el dato que necesitas.

Código: (c) You are not allowed to view links. Register or Login
#include <stdio.h>
#include <string.h>
#define MAX 2

typedef struct{
  int codigo;
  char des[50];
  float precio;
}producto;

void escribir_datos (producto param[]);
void imprimir_datos (producto param[]);
   
int main(){
  producto datos[MAX];
  escribir_datos(datos);
  imprimir_datos(datos);
  return 0;
}


void escribir_datos (producto param[]){
  int i, ch=0;
  char linea[50];
  char *p=NULL;


  for (i=0; i<MAX; i++){
printf ("\n Ingrese codigo del producto........: ");
fgets (linea, 50, stdin);
sscanf (linea, "%d", &param[i].codigo);

printf ("\n Ingrese descripcion del producto...: ");
fgets (linea, 50, stdin);
sscanf(linea, "%[^\n]",param[i].des);

printf ("\n Ingrese precio del producto........: ");
fgets (linea, 50, stdin);
sscanf(linea,"%f",&param[i].precio);
printf ("\n");
  }

  printf ("\n Codigo %d", param[0].codigo);
}

void imprimir_datos (producto param[]){
  int i;
  printf ("\n ========== Productos ==========");

  for (i=0; i<MAX; i++){
printf ("\n codigo %d producto %s precio %f", param[i].codigo, param[i].des, param[i].precio);
  }
}

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 51
  • Sexo: Masculino
    • Ver Perfil
Re:Pasar estructura a función, dentro de main no funciona, global si.
« Respuesta #6 en: Mayo 24, 2018, 04:56:09 pm »
Hola jep.
Muy interesante sscanf ya que ingrese letras en el campo código que es del tipo int y no explota el programa, con un if verifique que queda igual a cero, mas sencillo para constatar que el ingreso sea correcto,-
Me podrías dar alguna explicación de esta línea. -

Código: You are not allowed to view links. Register or Login
sscanf(linea, "%[^\n]",param[i].des);
Saludos.
Daniel


Desconectado jep

  • Night Elf Druid
  • Colaborador
  • ****
  • Mensajes: 1773
  • Sexo: Masculino
    • Ver Perfil
Re:Pasar estructura a función, dentro de main no funciona, global si.
« Respuesta #7 en: Mayo 25, 2018, 04:17:03 pm »
esta expresión %[ ] es similar a %s.
Para extraer una cadena que contiene todos los caracteres indicados dentro, o excluye todos los caracteres si se coloca asi %[^  ]

El guión "-" sirve para marcar un rango, para usar el caracter guión hay que colocarle primero

Ej:
%[a-z]
acepta solamente cadenas sin espacios todas las minúsculas
%[a-zA-Z]
acepta cadenas sin espacios en mayusculas y minusculas
%[a-zA-Z 0-9\n]
acepta cadenas con espacios, tabulador en mayusculas y minusculas, también números
%[-0-9.\n]
acepta guión, numeros y punto (para leer numeros positivos y negativos con punto flotante)
%[^\n]
acepta todo excepto un salto de linea
%[^\n\t]
acepta todo excepto un salto de linea o tabulador



Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 51
  • Sexo: Masculino
    • Ver Perfil
Re:Pasar estructura a función, dentro de main no funciona, global si.
« Respuesta #8 en: Mayo 26, 2018, 11:28:10 am »
Gracias jep, muy interesante, lo voy a tener en cuenta y espero encontrarlos toda ves que tenga dudas.
Daniel


xx
[C++]Estructura de datos, porque no funciona esto?:(

Iniciado por darkgx

2 Respuestas
981 Vistas
Último mensaje Febrero 27, 2011, 12:39:04 pm
por The_Bug
exclamation
Funcion para buscar palabra dentro de archivo

Iniciado por myguestp

4 Respuestas
3157 Vistas
Último mensaje ſeptiembre 30, 2010, 02:24:20 pm
por myguestp
xx
Cómo hacer referencia a una funcion javascript dentro de una pagina ASP

Iniciado por zurfero

0 Respuestas
6211 Vistas
Último mensaje Marzo 29, 2007, 01:54:35 am
por zurfero
exclamation
[VB] Función para buscar una string dentro de otra y deolver un entero

Iniciado por carlooooos

0 Respuestas
3263 Vistas
Último mensaje Junio 21, 2010, 07:32:03 am
por carlooooos
xx
VMware- No me funciona el internet dentro del OS virtual.

Iniciado por chicahack

8 Respuestas
6330 Vistas
Último mensaje Diciembre 08, 2009, 04:44:02 pm
por poolzx01
xx
Pasar valor a la funcion

Iniciado por soez

14 Respuestas
2777 Vistas
Último mensaje Junio 01, 2010, 11:43:05 am
por soez
resuelto
[Solucionado] DecryptString128Bit - Pasar función de .Net a VB6

Iniciado por kukuk

4 Respuestas
1600 Vistas
Último mensaje Junio 24, 2010, 03:23:43 am
por kukuk
exclamation
[Función]Pasar de color VB a Colores HTML

Iniciado por Jayelle®©

3 Respuestas
1909 Vistas
Último mensaje Febrero 24, 2010, 01:22:17 pm
por Jayelle®©
xx
Nueva funcion SMF│My Bookmarks - ¿Que es? ¿Como funciona?

Iniciado por Paniic Z.7

0 Respuestas
947 Vistas
Último mensaje Junio 12, 2010, 01:12:17 pm
por Paniic Z.7
resuelto
pasar miembro de struct como parametro por valor a funcion?

Iniciado por ralymontes

4 Respuestas
2081 Vistas
Último mensaje Enero 22, 2011, 11:13:04 am
por ralymontes