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 3 4 [5] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 86
41  Programación / Bases de Datos / Re: Extraño: select con offset y limit devuelve datos duplicados en: 6 Diciembre 2020, 02:45 am
el problema es que el SP_CLIENTE_BUSCAR devuelve registros duplicados y en orden inverso durante la paginacion, ademas que se omite 4 o 5 de los 12 registros.
Lo que me devuelve el sp_cliente_buscar:
Código:
paginacion se realiza por cada 5 registros:

PAGINA1:
1 maria    2020-12-05  17:31:19
2 julio    2020-12-05  17:31:19
3 antonio  2020-12-05  17:31:19
4 marlon   2020-12-05  17:31:19
5 mariela  2020-12-05  17:31:19

PAGINA2:
6 carmen   2020-12-05  17:31:19
7 ramiro   2020-12-05  17:31:19
5 mariela  2020-12-05  17:31:19
4 marlon   2020-12-05  17:31:19
3 antonio  2020-12-05  17:31:19
2 julio    2020-12-05  17:31:19

PAGINA 03:
2 julio    2020-12-05  17:31:19
1 maria    2020-12-05  17:31:19
La bd esta en un servidor de hosting, el gestor es phpMyAdmin.
Alguien sabra por que ocurre esto, esta mal mi codigo o esta fallando el servidor?

No tengo demasiada experiencia en bases de datos pero creo que sería una buena idea incluir con qué argumentos se está llamando al procedimiento.
Además veo que dices que la paginación se hace por cada 5 registros pero la Página 2 tiene 6 registros. Esto te ocurre así o ha sido un error al escribirlo aquí??
42  Programación / Programación C/C++ / Re: Esta bien elaborado este codigo? en: 5 Diciembre 2020, 18:19 pm
A grandes rasgos el programa está bastante bien:
  • Uso de constantes para hacerlo fácilmente escalable.
  • Nombres de variables/funciones significativos.
  • Bien estructurado.
...

Sin embargo, hay algunas cosas corregibles y algunos consejos siempre se pueden dar:

ALGUNOS ERRORES O COSAS IMPORTANTES:
  • En la función main() mezclas el uso de <orden> y <menu>. Guardas el valor en <orden> pero utilizas el switch con <menu>. Dudo que esto te esté funcionando por lo que supongo que será un error de formateo.
  • El programa finaliza al crear todos los drones. ¿Una vez que los he almacenado todos ya no puedo consultarlos? Es mejor que la condición de (numDrones < MAX_DRONES) se ponga dentro del case para crear un dron. Que no permita crear más pero que sí permita seguir consultando los creados.
  • Además la condición de (menu != 0) nunca llega a usarse. El <return 0> de la línea 77 hace que acabe el programa sin que llegue a comprobarse la condición. Es mejor que elimines el <case 0:>. Cuando sea 0 no hagas nada especial y ya se encarga el do-while() de hacer que el bucle acabe.
  • En la línea 94 vas a tener problemas si se introduce una cadena demasiado larga. La forma correcta y recomendada de leer cadenas de caracteres en C es mediante fgets(). Además después de cada scanf() (o al menos justo antes de usar fgets()) tendrás que limpiar el buffer para que funcione correctamente.
Código
  1. #define SIZE 100
  2. char cadena[SIZE];
  3. // Guarda como mucho SIZE-1 caracteres de la entrada estandar (stdin) en el array (cadena)
  4. // La ultima posicion se reserva para el caracter de fin de cadena: \0
  5. fgets(cadena, SIZE, stdin);
  6. // El Enter que introduzcas al final tambien se guardara (si hay espacio) entonces:
  7. if(cadena[strlen(cadena)-1] == '\n') cadena[strlen(cadena)-1] = '\0'; // Si se ha guardado lo eliminamos
  8. else while(getchar() != '\n'); // sino, es que quedan caracteres en el buffer. Asi se limpia el buffer de entrada

  • En la función mostrarDatosDron(), qué pasa si el número de serie no existe?? Muestras el último. Si yo busco el dron 123 quiero ver el dron 123 o un aviso de que ese dron no existe, no que el programa me enseñe los datos del 321. Supongo que se entiende, no? Además es mejor asignar siempre un valor a todas las variables de forma explícita y en tu caso contador no tiene un valor inicial explícito.
ALGUNOS CONSEJOS:
  • Puedes utilizar typedef para no tener que repetir la palabra struct.
Código
  1. // Para hacer referencia a Persona hay que escribir siempre: struct Persona
  2. struct Persona {
  3.  char *nombre;
  4.  int edad;
  5. };
  6. struct Persona miPersona;
  7.  
  8. // En este otro caso basta con utilizar solo el nombre de la struct: Persona
  9. typedef struct {
  10.  char *nombre;
  11.  int edad;
  12. } Persona;
  13. Persona miPersona;

  • Yo no usaría la palabra tipo en cada struct. Da a entender que hace referencia al tipo de fecha, de coordenada o de Dron. Piensa que en C no están definidos los tipos primitivos como: tipoInt, tipoFloat,... Es mejor usar solo: Fecha, Coordenada, Dron,...
  • El modelo del Dron puedes definirlo como un puntero y utilizar memoria dinámica. Así cada array ocupará lo estrictamente necesario y no más. Esto complica un poco el programa pues tratar con memoria dinámica no siempre es muy sencillo.
  • En los parámetros de las funciones no es necesario especificar el tamaño de la primera dimensión del array. Puedes ahorrar texto y además imagina que en un momento dado le pasas un array con una longitud diferente. Y cuando no se utilizan parámetros no es necesario especificar "void" (se puede y se suele dejar vacío). De igual manera las funciones con retorno void tampoco suelen especificar el return (se añade implícitamente siempre al final de una función).
  • En las definiciones de las funciones no es necesario especificar tampoco el nombre. El nombre solo hay que especificarlo en la implementación y así si lo cambias no tendrás que cambiarlo en 2 sitios, sino solo en 1. Resultado:
Código
  1. //Declaraciones de funciones
  2. void  mostrarDronesARevisar(Dron[], int numDrones);
  3. void mostrarDatosDron (Dron[], int numDrones);
  4. struct tipoDron leerDatosDron();
  5. void mostrarFlota(Dron[],int numDrones);
  6. void mostrarDronesEnReparto(Dron[], int numDrones);

  • También puedes utilizar la palabra const en parámetros para especificar que estos no pueden ser modificados durante la ejecución de la función. Aunque es típico pensar "qué más dará usar const si yo no voy a cambiar el valor?" En códigos grandes es posible que sin querer o queriendo lo cambies llegado un punto y no lo tengas en cuenta. Así evitas este posible problema.
  • La línea 138 es demasiado enrebuscada. No digo que esté mal pero se puede simplificar. Recuerdo en el colegio cuando me decían "antes de operar hay que convertir todo a la misma unidad". Pues eso es lo que hay que hacer, convertir la fecha a meses ¿quedará algo más sencillo no?:
Código
  1. (year * 12 + mes) > (dron.year * 12 + dron.mes)

  • Una mejor manera para buscar un dron (o cualquier elemento en un array) es con un flag de salida por ejemplo. Aprovecha al máximo cada variable:
Código
  1. int dronBuscado = -1; // Suponemos que no existe
  2. for(int i = 0; i < numDrones && dronBuscado == -1; ++i){
  3.  if(dron[i].numSerie == numSerie) dronBuscado = i;
  4. }
  5. // Ya tienes la posicion del dron buscado o -1 si no existe
  6. if(dronBuscado != -1){
  7.  // ...
  8. } else printf("El dron %d no existe\n", numSerie);

  • Además la eficiencia del algoritmo para buscar un dron es lineal O(n). Puedes modificar el programa para guardar siempre los drones en orden según el numSerie y así tener una eficiencia de búsqueda mejor O(log n).
  • En la función mostrarFlota() quitaría la parte final de mostrar un dron. Imagina que automatizas un programa para que muestre 200 arrays diferentes de drones y tienes que tener a una persona ahí pulsando una tecla cada vez que terminas de mostrar un array. La función tiene que hacer lo que tiene que hacer: mostrar los drones. Luego cuando llames a esta función desde fuera tú sabrás si quieres añadir lo otro o no pero que esto no se añada siempre.

Creo que esto es todo. Al menos todas las cosas que yo cambiaría o que se podrían cambiar para mejorarlo.
43  Programación / Programación C/C++ / Re: Diferencia entre la compilación MT y MTd en: 5 Diciembre 2020, 03:51 am
Personalmente lo desconozco pero una rápida búsqueda por Google y...

Espero que alguno de los enlaces te aporten algo de información. :-X
44  Programación / Programación C/C++ / Re: ayudaa con pr0grama en c en: 5 Diciembre 2020, 00:27 am
El error era un poco rebuscado. Y aunque lo que voy a decir no tiene importancia en este caso, cuando se tienen problemas y sobre todo cuando no se sabe de dónde provienen, es preferible copiar y pegar el código tal cual. Muchas veces hay errores tontos que al volver a escribir el programa en el mensaje no se cometen.

En este caso el error está en la función rellenar_lista(). Recibes un puntero a la lista (*l) por lo que llamas a esta función con &l como argumento. Ahora llamas a insertar() que recibe un puntero a la lista pero le pasas como argumento: &l (teniendo en cuenta que l ya es &l), es decir no le estás pasando el puntero a la lista sino la propia dirección de memoria en la que está el puntero, equivaldría a (&&l).
Es por esto que falla. Aunque me parece raro que lo hayas compilado y ejecutado sin problemas ya que a mí me ha saltado un warning al compilar y el programa se ha cerrado en la primera inserción.

Algunos otros consejos:
  • Puedes asignar el valor de evaluar una condición directamente a un int. Así ahorras líneas de if-else:
Código
  1. int insertado = (l->tam < N);
  2. int acabar = (f.dia == 0 && f.mes == 0 && f.año == 0);
Esto asignará un 1 si la condición es cierta y un 0 si es falsa.
  • En la función insertar_lista() creas una variable Fecha que luego pasas a insertar donde la deshaces para insertarla valor por valor. Puedes asignar la variable completa:
Código
  1. int insertar(struct Lista *l, struct Fecha f){
  2.  int insertado = (l->tam < N);
  3.  if(insertado){
  4.    l->vectorFechas[l->tam] = f;
  5.    l->tam++;
  6.  }
  7.  return insertado;
  8. }
45  Programación / Programación C/C++ / Re: ayudaa con pr0grama en c en: 4 Diciembre 2020, 12:54 pm
Especifica qué problemas tienes para poder ayudarte.
46  Programación / Programación C/C++ / Re: Ayuda con un programa de C++ de resistencias de bandas 4, 5, 6 bandas en: 4 Diciembre 2020, 06:08 am
Problemas que le veo a ese programa:
  • Los nombres de las variables no ayudan a entender el código.
  • Siempre hay que suponer que un usuario se puede equivocar por lo que cuantas menos veces dependamos de él mejor. Con esto quiero decir que las líneas 21-29 es mejor evitarlas. Es un cálculo que puedes hacer internamente sin necesidad del usuario.
  • La condición de la línea 38 se puede simplificar: (n >= 5) && (n >= 10) es lo mismo que: (n >= 10). Siempre que la segunda condición sea cierta, la primera también lo será y es imposible que la segunda sea cierta sin serlo la primera también. De todas formas este bloque de if-else no tiene mucho sentido tal y como está planteado.
  • En la línea 40 utilizas 4 en vez de n4.

No sé mucho de resistencias (recuerdo un poco de cuando estudiaba física o tecnología) y mirando por Internet veo que hay diferentes tablas de medida sobre todo para el porcentaje final.
Por lo tanto es importante que especifiques las necesidades que tiene que suplir tu código.

De momento te puedo ayudar en lo siguiente, si quieres hacer el programa válido para un número diferente de bandas, haz lo siguiente:
Código
  1. // Definimos una constante para el maximo de bandas:
  2. const int MAX_BANDAS = 6;
  3.  
  4. int main(){
  5.  // Creamos un array para guardar el valor de cada banda:
  6.  int bandas[MAX_BANDAS]; // Pueden sobrar espacios pero la solucion mas correcta requiere de memoria dinamica y es mas avanzado
  7.  int numeroBandas;
  8.  // Con este do-while evitas que el usuario pueda introducir numeros fuera del rango indicado en el while() -> [4, 6]
  9.  do {
  10.    cout << "Introduce el numero de bandas de la resistencia: ";
  11.    cin >> numeroBandas;
  12.  } while(numeroBandas < 4 || numeroBandas > 6);
  13.  // la ultima banda es diferente pero las demas son iguales por lo que repetimos lo de preguntar color numeroBandas-1 veces:
  14.  // AQUI muestras los colores como lo haces ahora...
  15.  for(int i = 0; i < numeroBandas - 1; ++i){
  16.    // Con este do-while evitas que introduzcan valores no validos
  17.    // PD: He estado revisando algunas tablas y el negro corresponde al 0, no al 1
  18.    do {
  19.      cout << "Introduce el valor numerico de la banda " << (i+1) << ": ";
  20.      cin >> bandas[i];
  21.    } while(bandas[i] < 0 || bandas[i] > 9);
  22.  }
  23.  // Una vez que llegas aqui ya tienes todos los colores menos el ultimo
  24.  // Este tendras que hacerlo por separado segun los colores que consideres validos
  25.  // El ultimo lo guardas en bandas[numeroBandas-1] que es la ultima posicion valida del array
  26.  
  27.  // Ahora toca calcular el valor:
  28.  int resistencia = 0;
  29.  for(int i = 0; i < numeroBandas - 1; ++i){
  30.    resistencia = bandas[i] * pow(10, i); // Para usar pow() tienes que incluir la biblioteca cmath al principio: #include <cmath>
  31.    // La funcion pow() en este caso es innecesaria pero es para que veas la operacion
  32.    // Tambien puedes usar un multiplicador que empiece en 1 y en cada vuelta se multiplique por 10 <- Mas eficiente, intentalo
  33.  }
  34.  
  35.  // Ahora toca calcular el minimo y maximo del rango segun el porcentaje de la ultima banda:
  36.  // Esto lo puedes hacer con un switch-case o guardando todos los valores posibles en otro array: porcentajes
  37.  // Suponiendo la segunda opcion, utilizas el valor del array guardado en la posicion elegida por el usuario al mostrarle las opciones
  38.  float variacion = resistencia * porcentajes[bandas[numeroBandas-1]];
  39.  float resistenciaMinima = resistencia - variacion;
  40.  float resistenciaMaxima = resistencia + variacion;
  41. }

Aunque el código parece bastante grande, hay muchos comentarios y fragmentos que tienes que completar tú.
Si tienes algún problema, coméntalo teniendo en cuenta los comentarios que he ido haciendo a lo largo del código.
47  Programación / Programación C/C++ / Re: Pregunto , quien me podria ayudar en la traduccion de un lenguaje c++ a java en: 4 Diciembre 2020, 03:42 am
He eliminado el otro tema pues era lo mismo que este.

Antes que nada decir que no se hacen tareas por lo que no te vamos a dar el trabajo hecho. Si tan solo dejas el código no te lo vamos a dar traducido al 100%. Como mucho te podremos dar alguna indicación de por dónde salir.

Si quieres ayuda más concreta será mejor que intentes tú traducir el programa y publiques las partes en las que tienes problemas.

PD: Puedes modificar un mensaje ya publicado en vez de crear uno nuevo si no hay respuestas de por medio. Normas del foro.
48  Foros Generales / Foro Libre / Re: No se como titular esto. en: 3 Diciembre 2020, 05:20 am
Desde luego que tomarte la justicia por tu cuenta no es la solución. Eso sería una lucha interminable. Dentro de lo que cabe España no funciona tan mal en este tipo de casos y suelen ofrecer protección a familias en la misma situación por lo que mi recomendación como la del resto de usuarios es que tomes medidas legales.

Por desgracia estas situaciones se dan más de lo que pensamos y aunque desde fuera parece fácil acabar con ellas, desde dentro no es tan sencillo. Nadie aguanta estas situaciones por gusto y los afectados muchas veces no se atreven a dar el paso por todo lo que pueden perder si sale mal. Seguramente si vas a la policía o a algún organismo especializado en este tipo de casos te podrán aconsejar mejor que nadie.

Como ya te han dicho, en caso de juicio necesitarás cuantas más pruebas mejor (informes médicos, grabaciones, conversaciones, testigos) para que las acusaciones sean irrefutables y se asegure la mayor protección posible para vosotros. Recalco lo de testigos porque aunque no tengas pruebas tangibles, los testimonios también son una prueba. Si hay personas que puedan y quieran declarar que son conocedores de los hechos y que no se trata de una situación aislada es más fácil que la justicia esté de vuestro lado.

Otra opción, dependiendo de los recursos y posibilidades que tengáis, es hacer las maletas y marcharos. El problema es que mientras él tenga total libertad, no podréis vivir realmente tranquilos y tendréis que vivir mirando siempre hacia atrás.
Es por esto que lo mejor es llevarlo por lo legal y que se apliquen los métodos que se consideren oportunos para daros la mayor seguridad de vida.
En conclusión, infórmate en la policía o similares (no van a pasar de ti pues este es un tema muy serio) y escucha sus consejos que al final son los que conviven con estos problemas a diario y más te pueden ayudar. Una vez dado el primer paso todo es seguir para adelante y si el proceso va a ser largo llevarlo con el mayor sigilo posible para que él no sospeche nada.

Mucha suerte.
49  Programación / Programación C/C++ / Re: Algo más, Además de Code::Blocks? en: 2 Diciembre 2020, 23:19 pm
Prácticamente cualquier IDE se puede adaptar para programar en C/C++ (mediante plugins) y teniendo un compilador como los proporcionados en MinGW o Cygwin.
Algunas de las opciones más conocidas pueden ser Visual Studio (o su versión Visual Studio Code) o Eclipse, pero como ya digo puedes probar con cualquiera.

No tengo mucha experiencia porque siempre que programo en C/C++ lo hago tan solo con un editor de texto y compilando/ejecutando directamente desde la Consola/Terminal. Si quieres usar un editor de texto para modificar el código fuente tienes opciones muy interesantes como Sublime Text, Gedit (en Linux), Notepad++, etc.
50  Sistemas Operativos / GNU/Linux / Re: ¿qué sistema operativo recomiendan? en: 2 Diciembre 2020, 22:43 pm
Las tareas que quieres hacer no tienen requisitos muy especiales (un navegador y un reproductor de vídeo) por lo que yo creo que cualquier distribución puede suplir esos objetivos.

Una vez dicho eso, recomendaría algunas de las distros más populares (Ubuntu, Linux Mint, ...) más que nada por la compatibilidad y la cantidad de documentación que puedes encontrar en Internet.
De las dos mencionadas antes (que he probado ambas durante unos cuantos años), recomiendo Linux Mint sobre todo para personas que no tengan mucha experiencia en entornos Linux. Está basado en Ubuntu por lo que la documentación de esta distro también te servirá en la inmensa mayoría de los casos y me parece algo más sencilla de utilizar por personas que están acostumbradas a Windows.

Por último decir que cada versión de Linux Mint cuenta con varios entornos: Cinnamon, Mate, Xfce (ordenados de más pesados y personalizables a más livianos y simples). Cualquiera de ellas creo que podrá correr en tu máquina pero si tienes problemas de rendimiento siempre puedes pasar a un entorno más ligero que el actual.

PD: Existen muchas distros "alternativas" centradas en la sencillez y la optimización de recursos aunque no he probado ninguna por lo que no puedo recomendarte nada.
Páginas: 1 2 3 4 [5] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 86
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines