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 ... 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [18] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ... 125
171  Programación / Programación C/C++ / Re: Punteros a estructuras...??? en: 11 Noviembre 2014, 21:10 pm
lo que creas con new, lo borras con delete y lo que creas con new[] lo tienes que borrar con delete[]:

Código
  1. int* ptr = new int;
  2. delete ptr;
  3.  
  4. ptr = new int[10];
  5. delete[] ptr;
172  Programación / Programación C/C++ / Re: Punteros a estructuras...??? en: 11 Noviembre 2014, 14:36 pm
Lo que te ha comentado ivancea96 es correcto.

Sin embargo creo que es conveniente hacer una matización:

* Si accedes a una estructura por valor, tienes que usar el operador de miembro '.' para acceder a sus elementos.
* Si accedes a una estructura a través de un puntero, entonces el operador que te permite acceder a los miembros de la estructura es el operador de puntero '->'.

Un ejemplo:

Código
  1. struct Estructura
  2. {
  3.  int dato;
  4. };
  5.  
  6. int main( )
  7. {
  8.  Estructura var1;
  9.  var1.dato = 5; // a var1 accedemos por valor.
  10.  
  11.  Estructura* ptr = &var1;
  12.  // ptr es un puntero, para acceder al miembro de la estructura tenemos que usar un el operador de puntero
  13.  std::cout << ptr->dato << std::endl;
  14.  
  15.  Estructura* lista = new Estructura[ 2 ];
  16.  
  17.  // "lista" es un puntero, pero "lista[x]" no, aquí estamos accediendo a la estructura por valor, necesitamos
  18.  // el operador de miembro
  19.  lista[ 0 ].dato = 44;
  20.  
  21.  Estructura** lista2 = new Estructura*[ 2 ];
  22.  lista2[ 0 ] = new Estructura( );
  23.  lista2[ 1 ] = new Estructura( );
  24.  
  25.  // "lista2" es un puntero doble, por tanto, "lista2[x]" es un puntero a una estructura. Para acceder a los
  26.  // miembros de dicha estructura necesitamos el operador de puntero.
  27.  lista2[ 0 ]->dato = 85;
  28.  
  29.  // Faltan los correspondientes "delete" para liberar la memoria reservada, pero no es lo que se
  30.  // está preguntando en este hilo.
  31. }
173  Programación / Programación C/C++ / Re: C-Punteros en: 7 Noviembre 2014, 08:48 am
Esta es la estructura del nodo, según lo que entiendo yo , en tNodo tengo el dato a guardar, y la dirección del siguiente nodo .  Y luego defino un alias tipo puntero (?) de tipo tNodo .

Código
  1. typedef struct Nodo { /* ... */  } tNodo;

Ahí estás definiendo una estructura, cuyo nombre oficial es "struct Nodo", a dicha estructura le asignas un alias, "tNodo". De esta forma "struct Nodo" y "tNodo" son equivalentes. Se podría hacer también en dos pasos (por si te resulta más claro):

Código
  1. struct Nodo { /* ... */  };
  2. typedef struct Nodo tNodo;

En la primera línea se define la estructura "Nodo" y en la segunda creamos el alias.

Código
  1. typedef tNodo *TipoLista;

Ahí estás creando un alias nuevo, "TipoLista", este alias es equivalente a "tNodo*", es decir, es un puntero a una estructura de tipo "tNodo"

Código
  1. nodo = (TipoLista) malloc(sizeof(TipoLista));

Si TipoLista es un alias de "struct Nodo*" entonces sizeof(TipoLista) devuelve el tamaño de un puntero, no de una estructura. La consecuencia es que no estás reservando la memoria suficiente para almacenar una estructura de tipo "Nodo". Hay que ser cuidadoso a la hora de usar alias, si en algún momento no tienes claro el uso del alias vas a meter la pata fijo.

Código
  1. nodo = (TipoLista) malloc(sizeof(tNodo));

Ahora, malloc reservará una cantidad de memoria suficiente para almacenar un "struct Nodo" y te devolverá el puntero correspondiente, que sí podrás usar sin problemas porque no vas a pisar memoria que no te pertenece.

no tengo que poner * primero, ejemplo *nodo->dato=carga_uno() ??

Hay dos formas de acceder a los elementos de una estructura a la que accedes a través de un puntero:

Código
  1. TipoLista nodo = FuncionQueMeDevuelveUnNodoValido( );
  2.  
  3. TipoLista siguiente1 = nodo->sig;
  4. TipoLista siguiente2 = (*nodo).sig;

"siguiente1" y "siguiente2" van a apuntar ambas al mismo sitio. En el primer caso hemos hecho uso del operador de referencia "->". Este operador indica que nuestra variable es realmente un puntero y que accedemos a sus elementos por referencia, no por valor. En el segundo caso estamos haciendo uso del operador "*" que nos permite acceder por valor a los elementos del puntero, como ya no estamos trabajando con punteros debemos usar el operador "." para acceder a sus elementos.

No se si con estas explicaciones te aclaro un poco el asunto. Si tienes más dudas no tengas inconveniente en preguntar.

Un saludo.
174  Programación / Programación C/C++ / Re: Problema - Registros y archivos en: 6 Noviembre 2014, 13:33 pm
Código
  1.        if(encontrado == 1)
  2.        {
  3.            printf("El legajo ya existe\n");
  4.            return;
  5.        }
  6.        else
  7.        {
  8.         fclose(archivo);
  9.            CargarRegistro();
  10.        }
  11.  

Si encuentra el legajo... ¿dónde es exactamente cuando se cierra el fichero abierto?

Y tienes otras fugas por ahí:

Código
  1.                switch(confirmar)
  2.                {
  3.                    case 1:
  4.                        datos.activo[0] = '0';
  5.                        fwrite(&datos, sizeof(registro), 1, archivo);
  6.                        fclose(archivo);
  7.                        return;
  8.                        break;
  9.  
  10.                    case 2: return; break; // <<<<------ AQUI!!!!
  11.                }

Además, no entiendo este código:

Código
  1. void Baja(registro datos)
  2. {
  3.    int legajo = 0;
  4.    int confirmar = 0;
  5.    FILE *archivo;
  6.  
  7.    printf("Ingrese un numero de legajo (0 para salir): \n");
  8.    scanf("%d", &legajo);
  9.  
  10.    while(legajo != 0) // <<<< ----- ESTO!!!
  11.    {
  12.    }
  13. }

Si "legajo" no va a cambiar de valor... por qué no pones un simple "if"??

No se, deberías revisar un poco más a fondo tu código.
175  Programación / Programación C/C++ / Re: Problema - Registros y archivos en: 6 Noviembre 2014, 13:00 pm
Si cada vez que entras en, por ejemplo "Altas", haces "fopen", deberías hacer también "fclose". Básicamente porque si no el fichero se queda abierto y te puede dar problemas si intentas abrirlo de nuevo (desde imposibilidad para poder abrirlo hasta almacenar en el fichero información aleatoria)
176  Programación / Programación C/C++ / Re: Problema - Registros y archivos en: 6 Noviembre 2014, 10:32 am
generalizando lo dicho por mDrinky... cada "case" de un "switch" necesita un "break" para que el código salga del "switch", si no pones dicho "break", se ejecuta el código del siguiente "case".

Te lo comento porque he visto que no has puesto un solo "break" en tu código... y tienes varios "switch"
177  Programación / Programación C/C++ / Re: Ayuda programa en C! en: 5 Noviembre 2014, 21:49 pm
No se me coló, lo puse así para ahorrar una línea por cada pareja de printf y scanf .  :rolleyes:

¿No debería ser un punto y coma en vez de solamente una coma? jejeje

;-) Y dale, ¡Ouggg Gran Maestro!, estando tú presente ni me atrevo a esas cosas.  :)

Gran maestro yo??? jajajaja, me halagas. Tampoco te creas que soy un gurú de las macros... de echo prefiero evitarlas salvo para cosas muy muy muy concretas. Yo personalmente pienso que las macros son uno de los cánceres de C++... la compilación de programas en C++ es lentísima en parte gracias a la existencia de las macros... no ofrecen ningún tipo de tipado... su código no se puede depurar...
178  Programación / Programación C/C++ / Re: Ayuda programa en C! en: 5 Noviembre 2014, 17:41 pm
leosansan, se te coló una coma entre el printf y el scanf.

Por un momento pensé que ibas a meter macros jejejeje
179  Programación / Programación C/C++ / Re: Duda tonta switch en: 4 Noviembre 2014, 08:37 am
Si todavía necesitas hacerlo de la forma " 'A' || 'a' " entonces puedes utilizar un else if para hacerlo.

No has leído las respuestas anteriores, ¿verdad?

Código
  1. switch(opcion){
  2.  
  3.    case 'a':
  4.    case 'A':
  5.          printf("La suma de %g + %g = %g ",num1,num2,num1+num2);            
  6.                 break;
  7.  
  8.  
  9.    }
180  Programación / Programación C/C++ / Re: Ayuda en un programa de c++ uso del strcmp :) en: 3 Noviembre 2014, 13:28 pm
Si utilizas ese codigo tendras muy poca seguridad.Solo bastara con analizar los strings del binario y hacer fuerza bruta al pass.Podrian depurar la aplicacion frenar en el strcmp y devolverle true y listo.

¿Y qué propones para evitar eso? Al final la decisión sobre si un acceso es válido o no la toma un salto condicional en ensamblador... cambiar ese código por su opuesto ( o cambiarlo por un salto incondicional) revienta totalmente el chequeo de usuario y contraseña.
Páginas: 1 ... 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [18] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ... 125
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines