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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Mensajes
Páginas: 1 ... 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 34 35 36 37 38 39 ... 102
231  Programación / Programación C/C++ / Re: Marca error en sintaxis en: 10 Noviembre 2020, 09:34 am
El error como tal está en las cabeceras.
Estás incluyendo dos veces <string.h> cuando no la usas para nada y no estás incluyendo <stdlib.h> que es la que contiene las funciones malloc() y free().

Supongo que es un programa de prueba porque digamos que no sirve de mucho imprimir el valor de un puntero cuando ya lo has liberado.

Además es aconsejable castear el valor de retorno de malloc() ya que es <void*>:
Código
  1. int *p = (int*)malloc(sizeof(int));

Y en el caso de que no haya espacio para reservar el puntero, el trozo del if-else funcionará bien pero al llegar a la línea 14, intentarás liberar una memoria que no está reservada... -> Error.
232  Programación / Programación C/C++ / Re: Muy buenas ,C:\Users\matia\Desktop\c++\collect2.exe[Error] ld returned 1 exit status en: 9 Noviembre 2020, 19:44 pm
Antes que nada, para futuras publicaciones introduce tu código entre etiquetas de Código GeSHi seleccionando el lenguaje adecuado.
En este caso ya lo he modificado yo, pero como digo, para otra ocasión.

En un primer vistazo veo:
  • La función <piladebusqueda(int, int)> no está implementada, sólo está definida.
  • Y la función <anadir()> más de lo mismo.

Como consejos te diría que:
  • Las variables globales no son recomendables.
  • No utilices la biblioteca <conio.h> de no ser estrictamente necesario (tu caso no lo parece). No es estándar.

Y como consejo para las publicaciones en este o cualquier otro foro:
  • Asegúrate de que el código es fácil de entender. Tanto en cuanto a nombres de variables/funciones como a identación.
  • Especifica tu error. Copia el error que te aparezca o comenta la situación concreta en la que el programa falla. Acota el error lo máximo posible para que quien te ayude pueda ir directo a una zona.

Si pegas tu código diciendo que hay un error y que alguien te lo solucione, no creo que haya muchos dispuestos a hacerlo. En cambio si dices: "me sale el siguiente error al compilar: <copias el error>" o "para el caso ... funciona bien pero para el caso ..., no"; seguramente haya más personas dispuestas a ayudar.



EDIT: Después de responder ya he visto el mensaje de error (en el asunto del tema).
Puede ser que tengas el mismo programa ejecutándose y no lo hayas finalizado. Comprueba eso.
233  Programación / Programación C/C++ / Re: Círculo para dibujar una luna en: 5 Noviembre 2020, 21:09 pm
y como se metería esa ecuación dentro de un for? porque lo que se me da mal de c es usar lenguaje matemático
No vamos a darte la tarea hecha.
Intenta hacerlo tú y será entonces cuando aprendas.

Si no lo consigues, adjunta tu código usando las etiquetas de Código GeSHi y el problema concreto que tienes y entonces será más fácil que alguien intente ayudarte.
234  Programación / Programación C/C++ / Re: Círculo para dibujar una luna en: 5 Noviembre 2020, 18:42 pm
Ya te adelanto que no vas a conseguir unos círculos perfectos pero es lo que se puede hacer.

Para dibujar un círculo tienes que aprovechar la propiedad de que un círculo de radio r está formado por todos los puntos que se encuentran a una distancia de r desde el centro.
La distancia entre dos puntos A(xa, ya) y B(xb, yb) se calcula como: d(A,B) = raiz((xa - xb)^2 + (ya - yb)^2).

PD: Cuanto mayor sea el círculo mejor se verá. Para "círculos" muy pequeños, el resultado serán cuadrados  :-\
235  Programación / Programación C/C++ / Re: Algoritmo en: 5 Noviembre 2020, 00:44 am
Como ya te comenté, depende mucho de cómo tengas estructurado tu código. Pero a grandes rasgos, aunque la función sea de tipo void puedes poner un return y hacer que termine.
Código
  1. void func(){
  2.  printf("Hola ");
  3.  return;
  4.  printf(" Mundo!");
  5. }

SALIDA:
Código:
Hola 


También puedes usar una variable de control que mientras sea válida, sigue y cuando no lo sea, termine.
236  Programación / Programación C/C++ / Re: Algoritmo en: 4 Noviembre 2020, 19:50 pm
Eso es porque no puedes usar el operador de módulo (%) entre un número decimal y un entero.
Código
  1. producto1 += digito * ((int)pow(2,i) % 11);
Con esto haces un casting a int de la potencia de 2 truncando su parte decimal y después obtienes el resto de dividir ese número entre 11.
237  Programación / Programación C/C++ / Re: Ayuda con arreglo char en: 4 Noviembre 2020, 18:45 pm
Los problemas que tienes son los siguientes:
  • No inicializas las cadenas por lo que tienen basura y por eso te aparecen caracteres extraños.
En el ejemplo que te puse solo usé strcat() para que vieras su uso pero si la cadena no está inicializada hay que usar primero strcpy() para copiar el contenido y borrar la posible basura que haya y luego ya strcat().
Código
  1. int main(){
  2.  char frase[] = "Hola";
  3.  int n = 3;
  4.  char fraseN[strlen(frase) * n + 1]; // Se suma 1 para el caracter final '\0'
  5.  strcpy(fraseN, frase); // Copias el contenido de frase en fraseN eliminando la basura que pudiera tener
  6.  for(int i = 1; i < n; ++i){ // Empiezas el contador en 1 en vez de en 0 para no concatenar el contenido una vez mas
  7.    strcat(fraseN, frase); // Elimina el '\0', concatena la cadena e incluye otro '\0' al final
  8.  }
  9.  printf("%s\n", fraseN); // Resultado: HolaHolaHola
  10. }
  • En las líneas 72 y 73 no puedes usar strlen() porque esto te devuelve la longitud que tiene la cadena y no tienes ninguna cadena guardada. Lo que necesitas es que te devuelva la capacidad total del array y eso se consigue con sizeof().
  • En la línea 73 tienes que multiplicar por n2, no por n.
  • Las líneas 89-93 son innecesarias pues estás haciendo lo mismo que en las líneas 77-81.
238  Programación / Programación C/C++ / Re: Algoritmo en: 4 Noviembre 2020, 16:02 pm
Si lo que quieres hacer es para cada dígito d, calcular: d * ((2^posicion) % 11); ya lo estás haciendo en la línea 64...
No sé dónde está el problema... :huh:

Lo que sí veo son varias cosas:
  • Utiliza constantes para guardar los números que aparecen sueltos. Así tu programa será más fácil de modificar y de entender.
  • Los bucles do-while() no los aprovechas. Si metes un exit(), el programa terminará y no te dejará elegir otro número hasta que introduzcas uno válido.
Código
  1. const int MIN = 0; // lo que sea
  2. const int MAX = 1000; // lo que sea
  3. int main(){
  4.  int valido = 1; // variable entera usada como bool (0/1)
  5.  int numero;
  6.  do {
  7.    printf("Introduce un numero entre [%d, %d]: ", MIN, MAX);
  8.    scanf("%d", &numero);
  9.    valido = (numero >= MIN && numero <= MAX); // valdra 1 si es cierto y 0 en caso contrario
  10.    if(!valido){
  11.      printf("El numero no es valido\n");
  12.    }
  13.  } while(!valido);
  14.  //...
  15. }

  • Las comparaciones se hacen con el operador de comparación ==, no con el operador de asignación =. En los últimos condicionales estás asignando los valores y como son distintos a 0, siempre te dará true esa condición.
Código
  1. int numero = 10;
  2. if(numero == 10)  // Si el numero es igual a 10...
  3.  printf("El numero es 10\n"); // ...muestras ese mensaje
  4. if(numero = 5) // Asignas el valor 5 a numero y como es != 0, es true...
  5.  printf("El numero es 5\n"); // ...muestras ese mensaje tambien
  6. if(numero = 0) // Asignas el valor 0 a numero y como es == 0, es false...
  7.  printf("El numero es 0\n"); // ... no se muestra este mensaje

Al final numero valdrá 0 y la SALIDA será:
Código:
El numero es 10
El numero es 5
239  Programación / Programación General / Re: script & codigo en: 4 Noviembre 2020, 04:57 am
Normalmente cuando se habla de script se está haciendo referencia a un fichero que contiene instrucciones para ser interpretadas. En cambio, los "códigos" (o cualquier otro nombre que se utilice) suele hacer referencia a ficheros con instrucciones que van a ser compiladas.

Si estás empezando igual no conoces la diferencia entre los lenguajes compilados e interpretados.
Los lenguajes compilados usan un compilador para convertir el código fuente (código) en otro fichero con lenguaje máquina. Este lenguaje máquina es el que ejecuta el ordenador sin necesidad de tener el código fuente.
Por otro lado, los lenguajes interpretados usan un intérprete que se encarga de traducir a código máquina y ejecutar cada línea del código (script) una por una. Aquí es necesario tener siempre a mano el script pues en ningún momento se genera un fichero con el código máquina.

Algunos scripts bastante utilizados son los .sh (de Linux) o los .bat (de Windows) que suelen usarse para automatizar tareas agrupando varias instrucciones del sistema que quieres que se ejecuten juntas. También tienes lenguajes interpretados muy utilizados como Python cuyos ficheros se suelen denominar scripts.
240  Programación / Programación C/C++ / Re: Cadenas en: 4 Noviembre 2020, 02:02 am
A mí me funciona bien el código. Puede ser porque estés introduciendo cadenas demasiado largas o valores inválidos que hacen que queden restos en el buffer. De todas formas te comento algunas mejoras y seguro que si las implementas funciona correctamente:

  • Utiliza constantes para los tamaños.
Código
  1. const int SIZE_CADENA = 500;
  2. const int SIZE_PALABRA = 50;
  3.  
  4. int main(){
  5.  char cadena[SIZE_CADENA];
  6.  char palabra[SIZE_PALABRA];
  7.  //...
  8. }

  • Utiliza nombres de variables más descriptivos.
Código:
x -> longitudCadena
w -> longitudPalabra
z -> indiceBusqueda

  • La función gets() no debe usarse. Es más seguro utilizar fgets():
Código
  1. printf("Introduce una cadena: ");
  2. fgets(cadena, SIZE_CADENA, stdin); // guarda como mucho SIZE_CADENA-1 caracteres porque reserva el ultimo para '\0'

  • La función fflush() está implementada para limpiar el buffer de salida (stdout), no el de entrada (stdin). Tampoco se recomienda usarlo. Además cuando se usa gets()/fgets(), también se guarda el Enter ('\n') al final de la cadena.
Con el siguiente código puedes limpiar el buffer de entrada y al mismo tiempo eliminar el salto de línea al final de la cadena. Dos pájaros de un tiro (esto debe ir justo después del fgets() anterior):
* Para usar strlen() hay que importar <string.h>. Esta función devuelve la longitud de la cadena sin contar el '\0' (strlen("hola\0") = 4)
Código
  1. if(cadena[strlen(cadena)-1] == '\n') cadena[strlen(cadena)-1] = '\0'; // Si el ultimo caracter es el Enter, lo eliminamos con '\0'
  2. else while(getchar() != '\n'); // sino, significa que la cadena no cabia entera y quedan restos en el buffer. Lo limpiamos.

Después de usar scanf() también quedará un '\n' en el buffer. Lo puedes limpiar de nuevo con el while():
Código
  1. scanf("%d", &repetir);
  2. while(getchar() != '\n'); // Limpia todo el buffer de entrada

Si sigue sin funcionarte comenta qué pruebas estás haciendo o porque sabes que no te está leyendo la segunda cadena.
Páginas: 1 ... 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 34 35 36 37 38 39 ... 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines