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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


  Mostrar Mensajes
Páginas: [1] 2
1  Programación / PHP / Re: Duda sobre como resolver Inyección SQL en: 16 Abril 2017, 19:34 pm
Chicos, inmensamente agradecido, gracias a todos sus datos entendí que me hacía falta en mi código y ahora todo funciona. Muchas gracias!!! :)
2  Programación / Desarrollo Web / Re: Ordenar articulos con html5 en: 16 Abril 2017, 18:37 pm
Creo amigo que tienes una confunción entre muchos conceptos.

1º Una página web se divide en 2 tipos de tecnologías las que llamamos por un lado Front-end y por el otro back-end.

Front-end: todo lo que tu ves por tu pantalla al momento de cargar la página web (formas, colores, efectos de movimiento,etc).

En el front-end (lado del cliente), las herramientas más importantes son:

 - HTML: Las etiquetas que permiten dar estructura a tu página y crear formularios.

 - CSS: Hojas de estilos en cascada (nombre rebuscado pero oficial). De lo que se encargan este tipo de archivos es dar color (ej: del fondo de una página o parte de ella),tamaño (ej: imagenes) y formato (ej tipo de letra como times new roman u otros). Todas estas cosas y muchas más las hace CSS sobre alguna etiqueta que tu crees en un archivo html.

- javascript: Se encarga de permitir que las etiquetas tengan efectos visuales y de que la información que tu escribas en la página web viaje al back-end.

Ahora hablemos del back-end (lado del servidor):

Back-end: Hace refencia a todo lo que maneja la información que tu enviaste desde la página web. Por ejemplo cuando escribiste datos en un formulario para registrarte en la página que estas visitando y apretaste el botón "Registrarte", javascript envía la información al back-end y la recive otro tipo de tecnologías las cuales son:

- PHP: Lenguaje del lado del servidor que se encarga de recibir información de una página y decirle al SQL que se encargue de guardarla, eliminarla, modificarla o actualizarla en la base de datos según corresponda. Es PHP quien analiza los datos guardados en la base de datos y los ordena, compara, calcula algún dato de tu interes o lo que sea que el código le indique para devolverlo al Front-end.

-SQL: el lenguaje que se encarga de manejar las bases de datos (como ya se dijo anterioremente).

- Apache: este es el ambiente en donde deben estar instaladas las herramientas de manipulación de datos del back-end (PHP y SQL).  Apache es una herramienta que permite que el servidor (back-end) pueda hacer su trabajo con las herramientas antes mencionadas.

Esta es una estructura básica para entender cómo funcionan las páginas web

Asi que para hacer todo lo que quieres,primero debes saber manejar cada una de esas herramientas.

Saludos!
3  Programación / PHP / [Resuelto] Duda sobre como resolver Inyección SQL en: 16 Abril 2017, 18:12 pm
Hola Estimados/as. Junto con saludar me gustaría recurrir a su experiencia en inyección de bases de datos sql. Resulta que tengo que impedir que se pueda realizar una inyección SQL en una base de datos SQLite. Me piden ocupar específicamente el uso de prepared
statements.

Ejemplo:

Código
  1. SELECT * FROM Alumno WHERE rut = ​:rut​"
  2.  

El código que tengo (que funciona por cierto) es:

Código
  1. define("SQLITE_DB_PATH", "navegadorcito.db");
  2.  
  3. $connection = NEW SQLite3(SQLITE_DB_PATH) OR die("No se pudo Conectar con la base de Datos");
  4.  
  5. $sqlStr = "SELECT * FROM Alumno WHERE rut = " . $_GET["rut"];
  6.    echo $sqlStr;
  7.    $connection->query($sqlStr);
  8.    $query = $connection->query($sqlStr);
  9.    while($fila = $query->fetchArray()) {
  10.        print_r($fila);
  11.        echo "<br/>";
  12.    }
  13.  
  14.  

Me imprime por pantalla los datos del rut ingresado por medio del link del navegador. Pero como sabrán los más experimentados, a este código facilmente se le puede poner una inyección sql.

He encontrado código como el siguiente:

Código
  1.  
  2. //CONNECT this creates a NEW PDO object
  3. $db = NEW PDO('sqlite:/path/to/database.sdb');
  4.  
  5. //Build your SQL query WITH parameters :FIELD
  6. $sql = "SELECT * FROM sometable WHERE someCol=:field";
  7. //PREPARE the above query
  8. $statement = $db->prepare($sql);
  9. //Bind the VALUE received FROM the form OR such WITH the parameter place holder
  10. $statement->bindParam(':field', $_POST['someVal']);
  11. //EXECUTE the prepared query
  12. $statement->execute();
  13. //Fetch the RESULT
  14. $result = $statement->fetchAll(PDO::FETCH_ASSOC);
  15.  
  16.  
  17. //Treat the RESULT AS a pure array
  18. foreach ($result AS $row){
  19.    //do something
  20. }

El cual ocupa el método de prepare statements para evitar la injección SQL en una base de datos SQLite, pero no puedo adaptarlo al código que yo tengo. Cada cambio que le hago me lanza un error por pantalla.

Hasta el momento mi principal duda es qué pongo dentro del PDO en ---new PDO('sqlite:/path/to/database.sdb');---

Si bien la base de datos que ocupo se llama navegadorcito.db, cada vez que pongo ese nombre ahí salta un error al cargar el archivo en el navegador.


Ojala me pudieran dar una mano para entender qué pasa.

Agradecido de antemano por leer esto, me despido.
4  Programación / Java / Re: ¿Cómo eliminar un elemento de un vector y correr los espacios en java? en: 25 Agosto 2016, 16:32 pm
podrias vaciar todos los demas elementos a un nuevo array

Tienes toda la razón, que idiota fui. Bueno, tal vez haya sido producto de la presión mientras estaba realizando el certamen (pues eran muchas cosas) y luego de eso me segué en que no sabía.

Muchas gracias bro.

De todas formas acá dejo el código para quien no le hayan funcionado las neuronas como yo:

Código
  1. public static void main (String []args){
  2.  
  3. int bus[] = new int [10];
  4.  
  5. for (int i = 0; i <bus.length-2; i++){
  6.  
  7. bus[i]=i*2;
  8. }
  9. int cont =0;
  10. int prac[] = new int [10];
  11. int variableEliminar=8;
  12. for (int i = 0; i<bus.length-2; i++){
  13.  
  14. if(bus[i]!=variableEliminar){
  15.  
  16. prac[cont]=bus[i];
  17. cont++;
  18. }
  19. }
  20.  
  21. System.out.println();
  22.  
  23. for (int i = 0; i <bus.length; i++){
  24.  
  25. System.out.println(bus[i]);
  26. }
  27.  
  28. System.out.println();
  29.  
  30.    for (int i = 0; i <prac.length; i++){
  31.  
  32. System.out.println(prac[i]);
  33. }
  34.  
  35.    bus=prac;
  36.  
  37.    System.out.println();
  38.  
  39. for (int i = 0; i <bus.length; i++){
  40.  
  41. System.out.println(bus[i]);
  42. }
  43.  
  44. }
  45.  
  46.  

Tira por pantalla lo siguiente:

0
2
4
6
8
10
12
14
0
0

0
2
4
6
10
12
14
0
0
0

0
2
4
6
10
12
14
0
0
0
5  Programación / Java / ¿Cómo eliminar un elemento de un vector y correr los espacios en java? en: 24 Agosto 2016, 20:15 pm
Hola que tal estimados. Muchas gracias por ingresar a leer esta pregunta que me tiene algo confuso.

Verán, resulta que vi un ejercicio en un certamen en donde se debía eliminar un elemento de un vector y correr los elementos de las otras posiciones para que así no se perdiera espacio.

Ejemplo de lo que digo:

Código
  1.  
  2. public static void main (String []args){
  3.  
  4. int bus[] = new int [10];
  5.  
  6. for (int i = 0; i <bus.length-2; i++){
  7.  
  8. bus[i]=i*2;
  9. }
  10.  
  11.                bus[0]=1;
  12.  
  13. System.out.println();
  14.  
  15.    for (int i = 0; i <bus.length; i++){
  16.  
  17. System.out.println(bus[i]);
  18. }
  19.  
  20. }
  21.  
  22.  
  23.  


El código de arriaba es sumamente burdo. Simplemente llené las posiciones de un vector dejando las ultimas 2 vacías.

Lo que lanza por pantalla es lo siguiente:

1
2
4
6
8
10
12
14
0
0


Mi pregunta es, imaginándome que yo quiero borrar el numero 8 de ese vector, ¿cómo lo borro y muevo los otros números para que el vector aproveche esa posición eliminada?


Estoy practicando para una evaluación de fin de semestre y me topé con este ejercicio en donde te obligan a trabajar con vectores. Espero me puedan ayudar. De antemano muchas gracias!
6  Programación / Programación C/C++ / Pregunta Teorica - Programación C Linux en: 13 Noviembre 2015, 21:59 pm
Hola chicos! que tal les va? espero que bien. Bueno, les cuento, estoy realizando ejercicios del libro silverchatz de Sistemas Operativos para prepararme para mi evaluación de fin de año. En fin, resulta que uno de los ejercicios que hice era crear un programa en C (linux) que ejemplificara una impresora a la cual le iban llegando diversos trabajos (documentos) a una cola de impresión y estos los debe ir imprimiendo según la prioridad que tengan dichos documentos. Bueno el programa ya lo hice, pero me dejó intrigado la pregunta teórica que viene después de realizar el código:

Que consideraciones hay que tomar si existen varias impresoras disponibles?

En el libro no hay solucionario para esta pregunta y en lo personal, no llego a una respuesta que me convenza. me podrían dar su opinión de cual es la respuesta más acertada?

Acá dejo el código en caso de que no se haya atendido lo anterior.

Código
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <stdlib.h>
  5. #include <errno.h>
  6. #include <pthread.h>
  7. #include <semaphore.h>
  8. #define Max_Trabajo 60 // El número máximo de hebras Trabajos.
  9.  
  10.  
  11. // Prototipos de funciones...
  12.  
  13. void *Trabajos(void *num);
  14. void *servidor(void *);
  15. void rango_espera(int secs);
  16.  
  17.  
  18.  
  19. //Se definen los semaforos.
  20. //El semaforo colaimpresion pone el limite del numero de Trabajos que se permiten ingresar al cuarto de espera en un tiempo determinado.
  21. sem_t colaimpresion;
  22. // Ocupar_servidor asegura la mutua exclusividad en el acceso al uso del servidor.
  23. sem_t Ocupar_servidor;
  24. // DescansaServidor es usada para permitir que el servidor descanse hasta que llegue el Trabajo.
  25. sem_t DescansaServidor;
  26. // MantenerTrabajo es usada para hacer que el Trabajo espere hasta que el servidor haya imprimido el documento.
  27. sem_t MantenerTrabajo;
  28. // Bandera para la hebra del servidor cuando todos los Trabajos han sido atentidos.
  29. int Todohecho = 0;
  30. int TrabajosEsperandoServidor=0;
  31. int numEspacios=1;
  32.  
  33. int main(int argc, char *argv[])
  34. {
  35.    int i;
  36.    pthread_t btid;
  37.    pthread_t tid[Max_Trabajo];
  38.    int numTrabajos;
  39.    int Numero[Max_Trabajo];
  40.    printf("El &#324;umero maximo de Trabajos es 60. Ingresa el numero de Trabajos.\n");
  41.  
  42.    do{
  43.    scanf("%d",&numTrabajos);
  44.  
  45.    if(numTrabajos > Max_Trabajo)printf("El nº de Trabajos debe ser menor a %d, ingrese nº de Trabajos.\n",Max_Trabajo);
  46.  
  47.   }while(numTrabajos>Max_Trabajo);
  48.  
  49.    if (numTrabajos > Max_Trabajo) {
  50.       printf("El Maximo numero de Trabajos es %d.\n", Max_Trabajo);
  51.       /******system("PAUSE");*****************/
  52.       getchar();
  53.       getchar();
  54.  
  55.       return 0;
  56.    }
  57.    printf("Tenemos un servidor que imprime documentos.\n");
  58.    for (i = 0; i < Max_Trabajo; i++) {
  59.        Numero[i] = i;
  60.    }
  61.    // Se inicializa el semaforo con valores iniciales...
  62.    sem_init(&colaimpresion, 0, numEspacios);
  63.    sem_init(&Ocupar_servidor, 0, 1);
  64.    sem_init(&DescansaServidor, 0, 0);
  65.    sem_init(&MantenerTrabajo, 0, 0);
  66.  
  67.    // Se Crea el servidor.
  68.    pthread_create(&btid, NULL, servidor, NULL);
  69.  
  70.    // Se Crea el Trabajo.
  71.    for (i = 0; i < numTrabajos; i++) {
  72.        pthread_create(&tid[i], NULL, Trabajos, (void *)&Numero[i]);
  73.    }
  74.    // Se juntan las hebras a esperar que las otras terminen.
  75.    for (i = 0; i < numTrabajos; i++) {
  76.        pthread_join(tid[i],NULL);
  77.    }
  78.    // Cuando todos los Trabajos hayan terminado, se elimina la hebra servidor.
  79.    Todohecho = 1;
  80.    sem_post(&DescansaServidor); // Se despierta al servidor en la salida.
  81.    pthread_join(btid,NULL);
  82.    getchar();
  83.    getchar();
  84.    return 0;
  85. }
  86.  
  87. void *Trabajos(void *Numero) {
  88.     int num = *(int *)Numero; // periodo de tiempo aleatorio para llegar.
  89.     printf("hebra %d creada\n", num);
  90.     rango_espera(5);
  91.     if(numEspacios+1==TrabajosEsperandoServidor)printf("Trabajo %d intenta ingresar a la cola de impresion\nEl Trabajo desiste de ingresar a la cola porque hay muchos trabajos\n", num); // Espere hasta que sea prudente ingresar a la cola de impresion...
  92.     sem_wait(&colaimpresion);
  93.    printf("Trabajo %d intenta ingresar a la cola de impresion \nTrabajo %d entra a la cola de impresion.\n************************************Hay %d Trabajos esperando a ocupar el servidor \n", num, num,++TrabajosEsperandoServidor); // Esperar a que el servidor este libre..
  94.  
  95.     //printf("*****************************************\n");
  96.    // printf("**Hay %d Trabajos en la cola de impresion      **\n",TrabajosEsperandoServidor);
  97.    // printf("*****************************************\n");
  98.     sleep(10);
  99.     sem_wait(&Ocupar_servidor); // Si el servidor está libre entonces un trabajo aprovecha.
  100.     sem_post(&colaimpresion); // Despierta el servidor...
  101.     printf("Trabajo %d ocupa el servidor.\n", num);
  102.     sem_post(&DescansaServidor); // Espera a que el servidor termine de imprimir el trabajo.
  103.     sem_wait(&MantenerTrabajo); // Deja de ocupar el servidor.
  104.     sem_post(&Ocupar_servidor);
  105.   printf("Trabajo %d deja de ocupar el servidor.\n************************************Hay %d Trabajos intentando ocupar el servidor\n", num,--TrabajosEsperandoServidor);
  106.  
  107.    // printf("*****************************************\n");
  108.    // printf("**Hay %d Trabajos en la cola de impresion **\n",TrabajosEsperandoServidor);
  109.     //printf("*****************************************\n");
  110.     sleep(10);
  111. }
  112.  
  113. void *servidor(void *junk)
  114. {
  115. // Mientras todavía hayan Trabajos que atender... El servidor es omniciente y puede decir si hay Trabajos aún en el camino a su tienda.
  116.  
  117.  while (!Todohecho) { // Esperar hasta que alguien llegue y te despierte..
  118.    if( TrabajosEsperandoServidor==0 ) printf("el servidor esta esperando\n");
  119.    sem_wait(&DescansaServidor); // Omitir todo esto al final...
  120.    if (!Todohecho)
  121.    { // Tomar un monto aleatorio de tiempo para imprimir el Trabajo..
  122.     printf("el servidor esta imprimiendo el documento\n");
  123.     rango_espera(3);
  124.     printf("el servidor ha terminado de imprimir el documento.\n"); // Se libera al Trabajo cuando se haya imprimido el documento...
  125.     sem_post(&MantenerTrabajo);
  126.    }
  127.    else {
  128.         printf("El servidor ha terminado con la cola de impresion.\n");
  129.    }
  130.   }
  131. }
  132.  
  133. void rango_espera(int secs) {
  134.     int len = 1; // Se genera un numero arbitrario...
  135.     sleep(len);
  136. }
  137.  
  138.  

Gracias de Antemano!
7  Programación / Programación C/C++ / Re: Ayuda para compilar este código C en Linux (error referencia a "" sin definir) en: 13 Noviembre 2015, 19:18 pm
Ya lo solucioné. Recordé que el modo en el cual se compila cuando se usan hebras y semáforos es diferente. Por eso me daba error a cada rato.

Acá dejo la solución para quien tenga un problema similar al mio:

https://foro.elhacker.net/programacion_cc/consulta_referencia_a_pthreadcreate_sin_definir-t389918.0.html
8  Programación / Programación C/C++ / Ayuda para compilar este código C en Linux (error referencia a "" sin definir) en: 13 Noviembre 2015, 18:51 pm
Que tal chicos. muchas gracias de antemano por darse el tiempo de leer esto. Verán, quiero ejecutar un programa que hice hace 1 año (y que en ese tiempo funcionaba correctamente). Ahora cuando lo intento compilar me salen los siguentes errores (todos por lo visto haciendo referencia a lo mismo):

referencia a "sem_init" sin definir
referencia a "sem_post" sin definir
referencia a "pthread_create" sin definir
referencia a "pthread_join" sin definir
referencia a "sem_wait" sin definir

Esos son. Se repiten varias veces. Soy muy amateur en el tema y no se por qué ahora (en comparación al año pasado) no puedo compilarlo y no se qué debo hacer para ejecutarlo. Por cierto, estoy trabajando en Ubuntu.

Código
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <stdlib.h>
  5. #include <errno.h>
  6. #include <pthread.h>
  7. #include <semaphore.h>
  8. #define Max_Clientes 25 // El número máximo de hebras clientes.
  9.  
  10.  
  11. // Prototipos de funciones...
  12.  
  13. void *clientes(void *num);
  14. void *barbero(void *);
  15. void rango_espera(int secs);
  16.  
  17. //Se definen los semaforos.
  18. //El curto_espera pone el limite del numero de clientes que se permiten ingresar al cuarto de espera en un tiempo determinado.
  19. sem_t cuartoespera;
  20. // La SillaBarbero asegura la mutua exclusividad en el acceso a la silla del barbero.
  21. sem_t SillaBarbero;
  22. // AlmohadaBarbero es usada para permitir que el barbero descanse hasta que llegue el cliente.
  23. sem_t AlmohadaBarbero;
  24. // CinturonAsiento es usada para hacer que el cliente espere hasta que el barbero haya cortado su cabello.
  25. sem_t CinturonAsiento;
  26. // Bandera que para la hebra del barbero cuando todos los clientes han sido atentidos.
  27. int Todohecho = 0;
  28. int clientesBarberia=0;
  29. int numSillas;
  30.  
  31. int main(int argc, char *argv[])
  32. {
  33.    int i;
  34.    pthread_t btid;
  35.    pthread_t tid[Max_Clientes];
  36.    int numClientes;
  37.    int Numero[Max_Clientes];
  38.    printf("El &#324;umero maximo de clientes es 25. Ingresa el numero de clientes y sillas.\n");
  39.  
  40.    do{
  41.    scanf("%d",&numClientes);
  42.    scanf("%d",&numSillas);
  43.  
  44.    if(numClientes > Max_Clientes)printf("El nº de clientes debe ser menor a %d, ingrese nº de clientes y sillas nuevamente.\n",Max_Clientes);
  45.  
  46.   }while(numClientes>Max_Clientes);
  47.  
  48.    if (numClientes > Max_Clientes) {
  49.       printf("El Maximo numero de Clientes es %d.\n", Max_Clientes);
  50.       /******system("PAUSE");*****************/
  51.       getchar();
  52.       getchar();
  53.  
  54.       return 0;
  55.    }
  56.    printf("Una solucion al problema del barbero dormilon usando semaforos.\n");
  57.    for (i = 0; i < Max_Clientes; i++) {
  58.        Numero[i] = i;
  59.    }
  60.    // Se inicializa el semaforo con valores iniciales...
  61.    sem_init(&cuartoespera, 0, numSillas);
  62.    sem_init(&SillaBarbero, 0, 1);
  63.    sem_init(&AlmohadaBarbero, 0, 0);
  64.    sem_init(&CinturonAsiento, 0, 0);
  65.  
  66.    // Se Crea el Barbero.
  67.    pthread_create(&btid, NULL, barbero, NULL);
  68.  
  69.    // Se Crea el Cliente.
  70.    for (i = 0; i < numClientes; i++) {
  71.        pthread_create(&tid[i], NULL, clientes, (void *)&Numero[i]);
  72.    }
  73.    // Se juntan las hebras a esperar que las otras terminen.
  74.    for (i = 0; i < numClientes; i++) {
  75.        pthread_join(tid[i],NULL);
  76.    }
  77.    // Cuando todos los clientes hayan terminado, se elimina la hebra barbero.
  78.    Todohecho = 1;
  79.    sem_post(&AlmohadaBarbero); // Se despierta al barbero en la salida.
  80.    pthread_join(btid,NULL);
  81.    getchar();
  82.    getchar();
  83.    return 0;
  84. }
  85.  
  86. void *clientes(void *Numero) {
  87.     int num = *(int *)Numero; // Sale de la tienda y toma algún periodo de tiempo aleatorio para llegar.
  88.     printf("hebra %d creada\n", num);
  89.     rango_espera(5);
  90.     if(numSillas+1==clientesBarberia)printf("cliente %d llega a la barberia\nEl cliente abandona la barberia porque esta llena\n", num); // Espere hasta que haya espacio para abrir en la sala de espera...
  91.     sem_wait(&cuartoespera);
  92.    printf("cliente %d llega a la barberia \ncliente %d entra a la sala de espera.\n************************************Hay %d clientes en la barberia \n", num, num,++clientesBarberia); // Esperar a que la silla del barbero este libre..
  93.  
  94.     //printf("*****************************************\n");
  95.    // printf("**Hay %d clientes en la barberia       **\n",clientesBarberia);
  96.    // printf("*****************************************\n");
  97.     sleep(10);
  98.     sem_wait(&SillaBarbero); // Si la silla esta libre entonces abandona su lugar en la sala de espera..
  99.     sem_post(&cuartoespera); // Despierta el Barbero...
  100.     printf("cliente %d llama al barbero.\n", num);
  101.     sem_post(&AlmohadaBarbero); // Espera a que el barbero termine de cortar su pelo.
  102.     sem_wait(&CinturonAsiento); // Deja la silla.
  103.     sem_post(&SillaBarbero);
  104.   printf("cliente %d deja la barberia.\n************************************Hay %d clientes en la barberia\n", num,--clientesBarberia);
  105.  
  106.    // printf("*****************************************\n");
  107.    // printf("**Hay %d clientes en la barberia **\n",clientesBarberia);
  108.     //printf("*****************************************\n");
  109.     sleep(10);
  110. }
  111.  
  112. void *barbero(void *junk)
  113. {
  114. // Mientras todavía hayan clientes que atender... El barbero es omniciente y puede decir si hay clientes aún en el camino a su tienda.
  115.  
  116.  while (!Todohecho) { // Esperar hasta que alguien llegue y te despierte..
  117.    if( clientesBarberia==0 ) printf("el barbero esta jugando\n");
  118.    sem_wait(&AlmohadaBarbero); // Omitir todo esto al final...
  119.    if (!Todohecho)
  120.    { // Tomar un monto aleatorio de tiempo para cortar el cabello del cliente..
  121.     printf("el barbero esta cortando el cabello\n");
  122.     rango_espera(3);
  123.     printf("el barbero ha terminado de cortar el cabello.\n"); // Se libera al cliente cuando ya se le haya cortado el pelo...
  124.     sem_post(&CinturonAsiento);
  125.    }
  126.    else {
  127.         printf("El barbero ha terminado por el dia.\n");
  128.    }
  129.   }
  130. }
  131.  
  132. void rango_espera(int secs) {
  133.     int len = 1; // Se genera un numero arbitrario...
  134.     sleep(len);
  135. }


Esa es mi duda, de antemano muchas gracias!
9  Programación / Programación C/C++ / Por que ésta pequeña función de invertir una lista enlazda funciona? en: 24 Noviembre 2014, 23:59 pm
Hola chicos/as que tal? espero que estén bien. Vine nuevamente aquí porque uds siempre me sacan las dudas precisas que tengo, y debo aclarar que les estoy muy agradecido. Ahora bien necesito que por favor alguien me explique (si es posible con manzanitas o dibujitos xd) por qué ésta función de invertir lista funciona tan bien:





Código
  1.  
  2. typedef struct NODO{
  3.  
  4. char *nombre;
  5. struct NODO *sgte;
  6.  
  7. }nodo;
  8.  
  9. void invertirlista(nodo **inicio){
  10.  
  11. nodo *aux,*next;
  12.  
  13. aux=*inicio;
  14. *inicio=NULL;
  15.  
  16. while(aux!=NULL){
  17.  
  18. next=aux->sgte;
  19. aux->sgte=*inicio;
  20. *inicio=aux;
  21. aux=next;
  22.  
  23. }
  24. }


El typedef lo coloqué por si alguien siente necesario saber como fue hecha la lista (aunque verdaderamente no creo que importe para la pregunta que estoy haciendo).Sé como crear,mostrar y eliminar listas y nodos, he intentado esquematizar ésta función tan corta pero no he podido aclararle a mi cabeza como funciona. De antemano muchas gracias por su ayuda  :)

10  Programación / Programación C/C++ / Re: Dimensionar un vector dentro de un struct en: 8 Noviembre 2014, 23:18 pm
Bueno, me parece que usted sabe de lo que habla aun que no entiendo exactamente cual es su objectivo final, pero eso es como hacer el codigo para que compila bien. Eso imprima hasta 32.

La proxima vez, deberia poner su error de compilicaion y decir que quiere hacer "un array de int dentro de un array de struct" : ) suerte

Código:
typedef struct Humano
{
    int* Trabajos;          
} HUMANO, *PHUMANO;    
    
int main ()
{
       int CantidadDeTrabajos = 4; //
       int CantidadDePersonas = 8;    // personas
       int Cont = 0;
      
       // declarar espacio por un array de struct
       PHUMANO Primera = (PHUMANO)malloc(sizeof(HUMANO) * CantidadDePersonas);
      
       // por cada persona, declara un array dentro el struct
       for (int i = 0; i < CantidadDePersonas; i++)
           Primera[i].Trabajos = (int*)malloc(sizeof(int) * CantidadDeTrabajos);
      
       for (int i = 0; i < CantidadDePersonas; i++)
       {
           for (int j = 0; j < CantidadDeTrabajos; j++)
           {
               Cont += 1;
                  
               Primera[i].Trabajos[j] = Cont;
           }    
       }
      
       for (int i = 0; i < CantidadDePersonas; i++)
           for (int j = 0; j < CantidadDeTrabajos; j++)
               printf("Trabajo#%i\n", Primera[i].Trabajos[j]);
              
              
       //Primera[0].Trabajos[0] = 248;

       //printf("Primera->Trabajos = %i\n", Primera[0].Trabajos[0]);
      
      
       for (int i = 0; i < CantidadDePersonas; i++)
           free((int*)Primera[i].Trabajos);
      
       free(Primera);
       _getch ();
       return 0;
}


Modificacion - Al respecto a 1 - no estamos trabajando con los vectores, estos son arrayes (son parecidos pero hay diferencias). Todavia si estariamos trabajando con vectores, la alocacion dinamica no seria necesario por ese codigo. Tambien, los vectores son de C++, asi que si quiere usar vectores - seria mejor usar new/delete en vez de malloc/free (eso no va a cambiar el comportamiento de su programa, solo para notar la diferencia entre C y C++ y por que no es mejor practica a mezclarlos).

Generalmente, la alocacion dinamica es necesario solo cuando acepta algun tipo de input, sea de un archivo, stdin, socket, etc. Cuando hace un inicilizacion estatica (int i = 0), esa secion de memoria (los 4 bytes) SIEMPRE va a ser libre para manipular, si o si. 

Hermano, no sabes como te lo hipermegacontramuchoAGRADESCO!!! gracias a lo que hiciste entendí perfectamente que era lo que me hacía falta. Adapte lo que tu hiciste a mi código y mi error fundamental salió a la luz!! lo dejo aquí para que quien tenga éste problema pueda solucinarlo:

Mi código modificado según las apreciaciones de plataplomo2948 es éste:

Código
  1. #include <stdio.h>
  2.  
  3. typedef struct humano{
  4.  
  5. int *trabajos;
  6.  
  7. }persona;
  8.  
  9. int main(){
  10.  
  11. int i,j,cont=1;
  12. int cantidad_personas=8;
  13. int cantidad_trabajos=4;
  14. persona *primera;
  15. primera=(persona *)malloc(sizeof(persona)*cantidad_personas);
  16.  
  17.  
  18. for (i=0; i < cantidad_personas; i++){
  19. primera[i].trabajos=(int *)malloc(sizeof(int)*cantidad_trabajos);
  20. }
  21.  
  22.  
  23. for (i = 0; i < cantidad_personas; i++){
  24. for (j = 0; j < cantidad_trabajos; j++){
  25.  
  26. primera[i].trabajos[j]=cont;
  27. cont++;
  28. }
  29. }
  30.  
  31. for (i = 0; i < cantidad_personas; i++){
  32. for (j = 0; j < cantidad_trabajos; j++){
  33.  
  34. printf("%d ",primera[i].trabajos[j]);
  35. }
  36. printf("\n");
  37. }
  38.  
  39. for (i = 0; i < cantidad_personas; i++){
  40.  
  41. free((int *) primera[i].trabajos);
  42. }
  43.  
  44. free(primera);
  45.  
  46. return 0;
  47. }

Y él error fundamental que me permite ver toda la lógica de ésto era en ésta parte:

Código
  1. for (i=0; i < cantidad_personas; i++){
  2. primera[i].trabajos=(int *)malloc(sizeof(int)*cantidad_trabajos);
  3. }

Al momento de dimensionar esa parte nunca se me ocurrió hacerlo dentro de un for, y bajo lo que ahora al fin entendí (corrijame plataplomo2948 si estoy equivocado) es obligación dimensionar cada espacio de primera en consideración a la cantidad de trabajos que haya.

El código compila perfectamente y puedo dar por solucionada mi duda. Enserio  plataplomo2948 infinitas gracias, ahora puedo hacer lo que realmente quiero :).

Por último si me permites molestarte, en la parte donde liberas memoria:

Código
  1. for (int i = 0; i < CantidadDePersonas; i++)
  2.           free((int*)Primera[i].Trabajos);

por qué se pone (int *) dentro del free y no sólo
Código
  1. free(Primera[i].trabajos)?

Sólo esa pequeña duda me quedó, pero de antemano muchas gracias por todo bro, eres un crack!
Páginas: [1] 2
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines