elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / Re: Error en programa de C en: 29 Octubre 2017, 05:21 am
Las direcciones de memoria son del mismo tamano, no importa a que dato apunten.
Lo malo es que los datos si tienen tipo.
3 soluciones posibles.

Solucion 1:
Haz 2 funciones, una que lee un int, otra que lee float y RETORNA el valor leido

luego en tu programa haces

Código
  1. mivariable = funcionqueleeint();

y la funcionqueleeint() hace de todo, lee, chequea, itera, y devuelve el dato listo.
Haz lo mismo con otra funcion que lee float.

Solucion 2a:
Te gusta, quieres aprender o necesitas usar punteros.
Define 2 funciones, 1 que lee floats, otra que lee int. Hace lo mismo que lo anterior, pero en vez de retornar los valores, los asigna a la variable que se pasa como parametro.

Invocalas de manera separada de acuerdo al tipo de dato que quieres leer.

Quieres leer un int ?

Código
  1. void mifuncionlectoraparaint( int * punteroaint)  {
  2.  printf("Ingrese int" );
  3.  scanf("%d", punteroaint);
  4.  int valoringresado = *punteroaint;
  5.  
  6.  // mas logica usando el valor ingresado, que se obtiene usando valoringresado
  7. }

se usa desde otro lados, al estilo scanf

Código
  1. ...
  2. mifuncionlectoraparaint( & mivariableint )

Lo mismo con float

Solucion 2b.
Alternativa: Usas una variable local a la funcion para leer y solo asignas al final:

Código
  1. void mifuncionlectoraparaint( int * punteroaint)  {
  2.  int variablelocal;
  3.  printf("Ingrese int" );
  4.  scanf("%d", &variablelocal);
  5.  
  6.  // agregar logica aqui que use la variable local
  7.  
  8. ...
  9.  
  10.  // y al final
  11.  *punteroaint = variablelocal;
  12. }

Solucion 3a:
1 sola funcion que lee ints y floats

Código
  1. void mifuncionlectoraparatodos( void * punteroadato, int esEntero)  {
  2.  if( esEntero == 1 ) {
  3.     printf("Ingrese int" );
  4.     scanf("%d", (int *) punteroadato);
  5.     int valoringresado =*(int *) punteroadato;
  6.     // logica especifica para int, usando valoringresado
  7.  } else {
  8.     printf("Ingrese float" );
  9.     scanf("%f", (float *) punteroadato);
  10.     float valoringresado = *(float *) punteroadato;
  11.     // logica especifica para float, usando valoringresado
  12.  }
  13. }

Se invoca de todos lados indicando si lo que se quiere leer es int o no, mas la direccion de memoria

Solucion 3b.
Lo mismo anterior, pero usar una variable local, y solo asignar al final, parecido a la solucion 2b.




Grandee hermano!!!! me pondré a estudiar duro con eso!!

Muchísimas gracias!!!
2  Programación / Programación C/C++ / Re: Error en programa de C en: 29 Octubre 2017, 04:41 am
que tipo de dato es precUni ?
que tipo de dato es el primer parametro de tu funcion restriccion?
Calzan?

En C existe el paso por valor, en C++ existe el paso por referencia. Por lo que veo estas usando paso por valor, y luego en tu funcion restriccion usas la direccion de memoria de la copia que esta siendo creada, no la direccion de memoria de la variable original, no hay manera que la variable original cambie:

- haz que los tipo de los datos que pasas calcen
- pasa direcciones de memoria a las funciones si quieres que las funciones cambien los datos, al estilo de la funcion scanf.






Buenas noches, Muchas gracias por tu respuesta!!!

Tenias razón que descuido el mio! tipos incompatibles de variables!

Como solución, ya que con esa función estoy capturando dos tipos diferenrtes de variables,  se me ocurrió agregarle a la función dos parámetros mas, uno para las variables float y otro para controlar que tipo de dato voy a capturar por vez.

Pero ahora me surgió otra cuestión y ojala puedas ayudarme también, la cosa es que aun me da un error, creo que no puedo usar parámetros de diferente naturaleza, seria genial si pudiera aclarar eso.

Por otra parte aun estoy aprendiendo sobre el tema de los puntos y las direcciones, en este caso para pasar las direcciones creo que deberia usar el & en los parametros y quitarlos en el scanf que esta en la funcion?

Disculpa mi ignoracion y muchas gracias por tu ayuda, te dejo dos imagenes para que chekee lo que intente hacer.



3  Programación / Programación C/C++ / Error en programa de C en: 29 Octubre 2017, 02:33 am
Buenas noches.

Estoy a medias tratando de hacer un programa simple en C, se trata de listar los materiales de varias sucursales y cada item tiene su restricción para poder ser agregado al sistema, el problema es cuando estoy ingresando me genera un error y de verdad no entiendo que es lo que pasa, si alguien me puede ayudar muchas gracias!





Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

# define N 50
# define M 2000000000

typedef struct
{
int  sucursal;
int codItem, cant;
float precUni, precVent ;
char descItem[50];
int lleno;
}fac;

fac inventario[10];

void admitir () ;
void agregar();
void caracteres();
void consultar();
void normalizar();
void vaciar() ;
void restriccion();

int op ;
int i ;


int main( void ) {


void vaciar() ;

aqui :

/*Swich para ingresar una opcion */

printf("Ferreteria Algo me gano: \n\n");
printf(" 1. Finalizar\n");
printf(" 2. Agregar\n");
printf(" 3. Consultar\n");
printf(" 4. Modificar\n");
printf(" 5. Listar\n");
printf(" Selecione una opcion: "); scanf("%i", &op);

printf("\n\n");

switch(op)
{
case 1:  {exit(1); break;}
case 2:  {agregar(); goto aqui;}
case 3:  {consultar(); goto aqui;}
case 4:  { break;}
case 5:  { break;}

default : {system("cls");goto aqui;}
}


printf("\n");
getchar();
return 0; }


void agregar()
{
int op2 ;

/*Aqui agregamos los elementos de la estructura y restrigimos con una funcion */
system("cls");

printf("Ingrese la cantidad de elementos que desea agregar: "); scanf("%i", &op2);

for ( i = 0; i < op2; ++i)
{

if (inventario[i].lleno == 0)
{
printf("\n\nPara el elemento #%i \n", i+1  );

printf("Ingrese Codigo de Item:  "); scanf("%i",&inventario[i].codItem);

printf("Ingrese Desc Item:  "); caracteres(inventario[i].descItem);

printf("Ingrese Cantidad : ");
restriccion(inventario[i].cant, M , 12);

printf("Ingrese Precio Unitario: ");
restriccion(inventario[i].precUni, M, 10000);

printf("Ingrese Precio de Venta: ");
restriccion(inventario[i].precVent, M, 15000);

printf("Ingrese la Sucursal :");
restriccion(inventario[i].sucursal, 24, 1);

inventario[i].lleno = 1 ;
printf("\n");
}
}
system("cls");
}

void caracteres(char k[N])
{

/* Aqui aseguramos que no se ingresen cadenas de caracteres vacias */
cvacia:
fflush(stdin);
fgets(k,N,stdin);
normalizar(k);
    if (strlen(k) == 0)
{
printf("Llenar este campo es obligatorio\n");
goto cvacia;
}
}


void vaciar()
{
/* Con la variable .lleno pordemos controlar que registro ya ha sido usado */

for ( i = 0; i < 10; ++i)
inventario[i].lleno = 0 ;

}

void normalizar(char k[N])
{
int i;

/* Aqui quitamos el problema del fgets que termina las cadenas con \n */

for (i = 0; i < N; ++i)
{
if( k[i] == '\n' )
{
k[i] = '\0';
}
}
}

void consultar()
{

/* funcion para consultar los items ya agregados previamente */

int op3, z = 0 ;

printf("Ingrese el codigo del elemento: "); scanf("%i", &op3);

printf("Codigo Item | Desc-Item | Cantidad | Prec Unitario | Prec Venta | Sucursal |\n");

for ( i = 0; i <10 ; ++i)
{
if (inventario[i].codItem == op3)
{
printf("     %i          %s          %i          %.2f          %.2f          %i     \n", inventario[i].codItem,
inventario[i].descItem,inventario[i].cant, inventario[i].precUni,inventario[i].precVent, inventario[i].sucursal);
++z ;

}
}

if (z == 0)
printf("\n\nNo se encontro el item seleccionado\n\n");

system("pause"); system("cls");

}

void restriccion(int var, int max, int menor)
{

/* Aqui paso por parametro las restricciones para los datos de cada registro*/

iterar:

fflush(stdin); scanf("%i",&var);

/*En la restriccion para precio unitario deberia pasar por el primer if
ya que max == M pero no lo hace */

if (max == M)
{
if (var <= menor)
{
printf("Ingrese un Valor mayor a %i \n", menor);
goto iterar ;
}
}
else if (var < menor || var > max)
    {
printf("Ingrese un valor entre %i & %i\n", menor, max );
goto iterar ;
}
}

4  Programación / Programación C/C++ / Re: Problema con Matrices de memoria Dinamica en: 20 Julio 2017, 20:02 pm
 :o !!!

Listo ya pude arreglarlo, quedo perfecto!!

Muchisimas gracias  ;D
5  Programación / Programación C/C++ / Problema con Matrices de memoria Dinamica en: 20 Julio 2017, 06:02 am
Buenas :)

Antes que nada muchas gracias a todo el que se tome el tiempo de leer y/o intentar ayudarme.

Estoy haciendo un ejercicio bastante sencillo sobre crear Matrices con memorias dinámicas desde funciones, pero empezando el ejercicio me tope con un problema curioso!

Resulta que cuando intento devolver la dirección de memoria desde la función para asignárselo a las matrices el compilador me lanza un error diciendo que no puedo asignar con "="

Claro esto ya lo probé luego con el Dev-C++ porque el tutorial que estoy haciendo trabajan con ello y en efecto el programa corrio (igual marco los avisos pero corrio) la cosa es que yo no uso Dev-C porque me parece altamente permisivo y lo dicho con el minGW no me corre y de verdad no se como solucionarlo ya busque por la web y termine mas enredado que al inicio con el tema de los punteros, dicho esto aclaro que aun estoy bastante novato en esto de programar.

Sin mas que decir dejo el codigo para que lo examineis.

Código:

#include <stdio.h>
#include <stdlib.h>

/*Crear un programa que compare si dos matrices son iguales y haga todo con funciones*/

int espacioM();

int **A,**B;
int i,j,k;
int filas,col;

int main( void ) {

printf("Introduce el numero de filas\n");
scanf("%i",&filas);
printf("Introduce el numero de columnas\n");
scanf("%i",&col);

/*-----------Aqui es donde esta el presunto error ------ */

        A = espacioM(filas,col);
B = espacioM(filas,col);

/*----------------------------------------------------------*/

printf("Que lo que menol\n");


getchar();
return 0; }

int espacioM (int filas, int col)
{
int **mtz;

mtz = (int**)malloc(filas*sizeof(int*));
if (mtz==NULL)
{
printf("EPA La memoria no se asigno!\n");
exit(1);
}
for (i = 0; i < filas; ++i)
{
mtz[i] = (int*)malloc(col*sizeof(int));
if (mtz[i]==NULL)
{
printf("EPA La memoria no se asigno!\n");
exit(1);
}
}

return **mtz;}




Aqui el copy/paste del error que deja el compilador

Código:

16-. Comparar Matrices D con funciones.c: In function 'main':
16-. Comparar Matrices D con funciones.c:19:4: error: assignment makes pointer from integer without a cast [-Wint-conversion]
  A = espacioM(filas,col);
    ^
16-. Comparar Matrices D con funciones.c:20:4: error: assignment makes pointer from integer without a cast [-Wint-conversion]
  B = espacioM(filas,col);
    ^
[Finished in 0.9s]


A todos gracias por su tiempo.




6  Programación / Programación C/C++ / Re: Libreria Math de C fuera del Dev-C++ en: 1 Julio 2017, 23:56 pm
Ahora si corrio xD!
Pero es mas bien extraño xD!



servidores de imagenes
7  Programación / Programación C/C++ / Re: Libreria Math de C fuera del Dev-C++ en: 1 Julio 2017, 21:49 pm
Saikilito no intentes entenderlo XD

no vale mentira... si estás empezando carecerá de pie y cabeza, avanza un poco y lo revisas...

el define una directiva de preprocesador para escribir menos

Código
  1. #define obj2bin(obj) execobj2bin(&#38;#38;#obj, sizeof(#obj))

lo que hace eso, es convertir todas las apariciones del codigo de

Código
  1. obj2bin(una_variable)

en

Código
  1. execobj2bin(*una_variable, sizeof(una_variable))

luego usa la función para recorrer el largo en bytes (que lo obtuvo de sizeof)
Código
  1. for(int i = size - 1; i >= 0; --i)

y luego recorrer los 8 bit de cada byte
Código
  1. for(int j = 7; j >= 0; --j)

mostrando si es 0 o 1
Código
  1. printf("%d", ((char*)obj)[i]>>j & 1); //si, así se ve más complicado que explicado






Como dice engel lex no intentes entenderlo, por ahora, úsalo como una caja negra. Algo como printf que simplemente usas.


Chicos disculpen la ausencia estoy un poco atareado con la universidad, aun así sigo aprendiendo poco a poco algunas cosas.  ;)

Ahora, pues xD aun con la explicación sigue siendo bastante confuzo jaja asi que supongo que ya llegara mi momento de entenderlo xD! pero tengo el archivo bien respaldadito en la nube para releerlo al 100%  cuando ya sea capas. Muchas gracias por eso.

Ahora lo otros ps si estoy bastante apenado la verdad es que cuando probé el código no me corrió :/ no se si es que tenga un problema con mi compilador o es que tengo mis entendederas bien cerrada pero no me corre mas bien me da un error, así que mas difícil aun se me hace comprender como es eso de usarlo tipo depurador xD! les dejo un capture, y pues de verdad muchísimas gracias por tomarse el tiempo de enseñarme.

[/url]
8  Programación / Programación C/C++ / Re: Libreria Math de C fuera del Dev-C++ en: 27 Junio 2017, 03:22 am
a mi me da bien, aunque usualmente es un problema relacionado a coma flotante, pow es una función que retorna un valor de tipo double y lo estás asignando en un int, por la forma en que el compilador trabaja la conversión pierde precisión...

declara z como double

 :o :o :o :o :o :o

Engel tenias toda la razon, declare Z como double y ahora funciona perfectamente

Muchísimas gracias!!   :rolleyes:


Usa algo así para depurar. Convierte las variables a double a ver que te da el programa cuando falla.
Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define obj2bin(obj) execobj2bin(&#38;#obj, sizeof(#obj))
  5.  
  6. static void execobj2bin(void *obj, size_t size) {
  7.    for(int i = size - 1; i >= 0; --i)
  8.        for(int j = 7; j >= 0; --j)
  9.            printf("%d", ((char*)obj)[i]>>j & 1);
  10. }
  11.  
  12. int main( void ) {
  13.    int x = 10;
  14.    int y = 2;
  15.    int z = pow(x,y);
  16.  
  17.    printf("10 al cuadrado es igual a %i \n", z );
  18.    printf("x = "); obj2bin(x); puts("");
  19.    printf("y = "); obj2bin(y); puts("");
  20.    printf("z = "); obj2bin(z); puts("");
  21.  
  22.    getchar();
  23. }

Mafus la verdad es que soy tan novato con esto que no entiendo tu codigo  :huh:
Pero lo voy a probar e investigare hasta entenderlo muchas gracias por tu ayuda!   ;D

9  Programación / Programación C/C++ / Re: Libreria Math de C fuera del Dev-C++ en: 27 Junio 2017, 00:05 am
Aquí lo dejo, solo me da correcto con el dev-c++

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int main( void ) {
  5. int x,y,z;
  6.  
  7. x = 10;
  8. y= 2;
  9. z = pow(x,y);
  10.  
  11. printf("10 al cuadrado es igual a %i \n", z );
  12.  
  13.  
  14. return 0; }
  15.  

Y aqui unos captures  ;D




fotos gif


· No hacer doble post
>aquí las reglas del foro
-Engel Lex
10  Programación / Programación C/C++ / Libreria Math de C fuera del Dev-C++ en: 26 Junio 2017, 00:07 am
Hola! buenas tardes a todos, para empezar quiero decir que es primera ves que posteo en este foro y pues la verdad es que soy muy muy muy muy nuevo en esto de aprender a programar pero estoy bastante interesado.

Mi pregunta es, estaba viendo unos tutoriales y en una parte el sujero uso una funcion que me parecio bastante útil.

Se trataba de la la función pow(x,y) de la librería math.h

Lo que hace esta funcion es (en este caso) elevar la variable x a la potencia y

El problema que se dio es que yo uso sublimetext3 y uso el prompt de windows para compilar con minGW, probe con pow(10,2) y me dio como resultado 99, luego probe con varios numeros y la verdad es que algunos me daban bien pero otros por el contrario me daban un numero menos tal como el 10**2=99 cuando deberia ser 100

Entonces le comente a un amigo (el usa dev-c++) y le funciono de maravillas, entonces probe con bajarme ese IDE y abri el mismo archivo desde ahi y la funcion se ejecutaba a la perfección. Pero como a mi no me gusta Dev-c++ pensé en descargarme el mismo compilador así que me baje TDM-GCC que es el mismo compilador que vi que usaba el Dev-c cambie lo parámetros necesarios, comprobé su funcionamiento y sorpresa! cuando usaba la funcion pow me volvia a dar el mismo error  >:D

Por ultimo entre en las carpetas del dev-c busque en el include la libreria math.h y haciendo los respaldos convenientes sobre escribí esa libreria dentro de la carpeta del TDM-GCC y ps mate la librería pero con el respaldo la restaure aunque con el mismo error del 10**2=99

Alguien sabe que puedo hacer ? o el porque me pasa esto?
De antemano muchas gracias :)
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines