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

 

 


Tema destacado:


  Mostrar Mensajes
Páginas: 1 ... 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 [42] 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 ... 102
411  Programación / Programación C/C++ / Re: QUIERO COMPILAR MI CODIGO EN C/C++ Y ME APARECE ID RETURNED 1 EXIT STATUS en: 1 Abril 2020, 01:04 am
Estás llamando a funciones que no están en el código... Además tienes errores en el formato de algún scanf().
Y para otras consultas: no utilices mayúsculas (eso no va a hacer que te contesten antes) y pon tu código entre etiquetas de Código GeSHi. No hay manera de ver el código. Aparte de eso, utilizar nombres de variables más descriptivos ayudaría bastante a seguir el funcionamiento.
PD: Puedes estar accediendo a posiciones inválidas del array.
Y las etiquetas son una mala opción de programación, su uso debería limitarse a los switch-case.
:-X
412  Programación / Programación General / Re: Cómo evaluar el tipo de una variable en C++ en: 30 Marzo 2020, 03:53 am
Algo de eso había visto. Y no me quedaba claro. A ver si entendí ¿Las funciones de esa biblioteca válida los caracteres de un string?
Exacto. Son funciones que permiten validar caracteres y por lo tanto permiten recorrer un string y validar los caracteres uno a uno. Por ejemplo:
Código
  1. #include <iostream>
  2. #include <cstring>
  3. #include <cctype>
  4.  
  5. using namespace std;
  6.  
  7. int main(){
  8.    string frase = "3ST4 ES UNA FRA5E P4R4 BU5C4R NUM3R0S";
  9.    int contadorNumeros = 0;
  10.  
  11.    // Recorremos el string caracter a caracter...
  12.    for(int i = 0; i < frase.length(); ++i){
  13.        if(isdigit(frase[i])){  // ...y si el caracter actual es un numero (decimal), incrementamos el contador
  14.            ++contadorNumeros;
  15.        }
  16.    }
  17.    cout << "La frase tiene: " << contadorNumeros << " numeros" << endl;
  18. }

El resto de funciones puedes verlas en el enlace del mensaje anterior. Lo vuelvo a poner aquí: http://www.cplusplus.com/reference/cctype/
413  Programación / Programación C/C++ / Re: Imprimir bien la matriz en: 28 Marzo 2020, 04:36 am
Utiliza las etiquetas de Código GeSHi para insertar tu código. Las puedes seleccionar encima del cuadro de texto en el desplegable que dice Código GeSHi (selecciona las del lenguaje de programación apropiado, en tu caso C). Si te fijas has creado listas y tachados en tu código por utilizar letras entre corchetes sin ponerlo dentro de etiquetas de Código GeSHi. Así es muy complicado poder ver bien tu código.

Veo varias cosas importantes:
  • Deberías utilizar nombres de variables descriptivos. Así no hay manera de acordarse de qué representa cada variable.
  • Primero muestras el mensaje para introducir los valores de A y después compruebas que las matrices sean válidas. Hazlo mejor en el orden inverso.
  • Utiliza constantes para guardar los números sueltos que aparezcan en el programa. Harán tu código más fácil de modificar.
Código
  1. #include <stdio.h>
  2. //...
  3. #define MAX_SIZE 20
  4. //...
  5. int main(){ // LA FUNCION MAIN RETORNA UN VALOR ENTERO (INT) NORMALMENTE 0 CUANDO TODO VA BIEN
  6.    //...
  7.    int matriz1[MAX_SIZE][MAX_SIZE]; // Uso de la constante para los tamaños
  8.    //...
  9.    return 0;
  10. }

  • Los índices en C/C++ (y en otros lenguajes de programación) empiezan en 0. El primer elemento de un array o de una matriz es el elemento 0, no el 1.
  • Con respecto al anterior punto, el último elemento de un array de longitud n, no es array[n] sino array[n-1]. En tus bucles estás accediendo a posiciones fuera de memoria.

Ejemplo de programa con matriz:
Código
  1. #include <stdio.h>
  2.  
  3. #define MAX_SIZE 20
  4.  
  5. int main(){
  6.    int matriz[MAX_SIZE][MAX_SIZE];
  7.    int filasUtiles = 10, columnasUtiles = 10; // Lo defino aqui aunque lo suyo seria pedirlo por teclado ya que se presupone que no conocemos la longitud util de la matriz aun
  8.    // Si se pide por teclado seria conveniente comprobar que dichos valores no son superiores a MAX_SIZE ya que sino tendriamos un problema
  9.  
  10.    for(int i = 0; i < filasUtiles; ++i){
  11.        for(int j = 0; j < columnasUtiles; ++j){
  12.            printf("Introduce el valor del elemento [" + i + "][" + j + "]: ");
  13.            scanf("%d", &matriz[i][j]);
  14.        }
  15.    }
  16.  
  17.    printf("\n***** Matriz resultante: *****\n");
  18.    for(int i = 0; i < filasUtiles; ++i){
  19.        for(int j = 0; j < columnasUtiles; ++j){
  20.            printf("%d\t", matriz[i][j]); // \t indica un tabulador. Tambien puedes usar un espacio simplemente
  21.        }
  22.        printf("\n");
  23.    }
  24.  
  25.    return 0; // Si esta linea no se pone, se pondra implicitamente. Pero la funcion main() siempre devolvera un int.
  26. }
414  Programación / Programación C/C++ / Re: Duda Makefile en: 26 Marzo 2020, 21:42 pm
Los makefiles tienen la siguiente característica. Cuando tú ejecutas: make, sin nada más, el makefile busca la etiqueta "all:" y crea los archivos que se indican ahí siguiendo las dependencias necesarias para ello (crear primero los códigos objeto *.o y enlazar las librerías).
En cambio si escribes otra palabra después de "make" buscará y realizará las instrucciones que se indiquen en esa etiqueta. Si escribes: make clean, irá a la etiqueta "clean" y lo que hará en tu caso es eliminar todos los códigos objeto: rm -f *.o

Entonces lo que tienes que hacer es otra etiqueta, por ejemplo:
Código:
# El resto del makefile
# ...
info:
    echo "Se pueden construir los ejecutables ejer1 y ejer2"
Esta sería una versión simple en la que escribes a mano el nombre de los ejecutables. Si cambias el nombre de alguno de ellos, tendrías que cambiarlo ahí también.

Una opción sería utilizar variables (como lo son CC, CFLAGS, LIBS, EJ1, EJ2,...) para guardar los nombres de los ficheros y así podrías tener por ejemplo las variables: SRCS, OBJS, BINS,...
Y solo tendrías que cambiar el nombre en BINS para que el makefile esté completamente actualizado.

PD: Te recomendaría usar subdirectorios para los ficheros. Por convención se suelen crear dentro de tu directorio con el proyecto, los subdirectorios: src (contendrá los .cpp o .c), include (contendrá los .hpp o .h), obj (contendrá los .o), bin (contendrá los ejecutables) y doc (contendrá la documentación de tu proyecto en caso de que la quieras generar).
Así en el propio makefile puedes hacer que cada fichero se cree en su lugar correspondiente.
415  Programación / Programación C/C++ / Re: Duda Makefile en: 26 Marzo 2020, 21:01 pm
Lo suyo sería que crearas unas variables para guardar los nombres de los ficheros fuente, objeto y ejecutables y así podrías mostrar luego la variable que guarda los ejecutables cuando ejecutes: make info
416  Programación / Programación C/C++ / Re: error, bucle infinito, alguien que me ayude a evitar el bucle infinito en: 26 Marzo 2020, 20:45 pm
Sin ser ningún lince...

Lees de un archivo sin previa apertura del mismo. Además donde esta la función isalnum?
El "archivo" del que lee es stdin, es decir, la entrada estándar (teclado) y la función isalnum() está en la librería <ctype.h>
Sin ser un lince tampoco... :rolleyes: :rolleyes:

El problema como ya dijo @ThunderCls es que sobra el else de ese condicional para que siempre se pueda ingresar un nuevo carácter al finalizar cada vuelta.
417  Programación / Programación General / Re: Cómo evaluar el tipo de una variable en C++ en: 23 Marzo 2020, 01:44 am
Otra opción posible sería guardar la entrada en un string y a partir de ahí validar esa entrada antes de convertirla al dato que quieres.
Te recomendaría echar un vistazo a la biblioteca <cctype>: http://www.cplusplus.com/reference/cctype/
418  Programación / Programación C/C++ / Re: Segmentation Fault ayuda en: 23 Marzo 2020, 01:18 am
Bueno... encontrado el error, te comento lo que he hecho para que en otra ocasión puedas encontrar el problema tú solo.
Primero he comentado todo el contenido del main() excepto las primeras líneas hasta la llamada a LeerFichero() para ver si el problema estaba en esa función o en las siguientes. El error está ahí así que he ido a LeerFichero(). Una vez aquí, he añadido una línea para ver el contenido en cada iteración:
Código
  1. while ( getline(fich_in, linea) ){
  2.    cout << "\n#Contenido linea: " << linea << endl;
  3.    Estudiante e;
  4.    if ( StrToEstudiante(linea,e) )
  5.        v.push_back(e);
  6. }
Si compilas y ejecutas verás que sólo se llega a mostrar el contenido de la primera línea del fichero por lo que el error está en la primera iteración. Vamos entonces  a la función StrToEstudiante(). En esta función añadimos otra línea para ver cada token.
Código
  1. dato = ExtraerToken(texto);
  2. cout << "#Dato extraido: " << dato << endl;
  3. if ( dato.length() != 0 )
Vemos que todos los tokens se extraen correctamente por lo que el problema está en asignarValores(). Comentamos las líneas intermedias y las vamos descomentando una por una y ejecutando el programa con cada cambio. Aquí verás que el problema ocurre al descomentar setCurso() por lo que vamos ahí y... Resulta que estás haciendo una llamada recursiva a setCurso() desde setCurso() por lo que tenemos una recursividad infinita.



Te comento, asignValores() lo piden así en el enunciado. Lo de las funciones me lo apunto, pero vamos nace de que la tarea es una tontería y la he querido hacer rápido cpy/paste de funciones iguales. El problema se da al leer de fichero en el main. Con un main más sencillo no da error, como este por ejemplo:

EDIT: Una duda que me surge, ¿sería más óptimo utilizar los set en el constructor o modificar los atributos privados directamente?

El tema de copiar funciones que ya tienes al final hace que te limites a un estilo de programación siempre igual que puede resultar en ocasiones ineficiente. Cada situación puede ocasionar una solución mejor.
Y respecto a tu otra duda, diría que sí, es habitual en el constructor modificar directamente los atributos privados. Así generas menos dependencias y un error en un set() no va a hacer que todos tus objetos se creen de forma incorrecta. Además ya habrás visto que al ir llamando funciones dentro de funciones, cuando tienes un problema tienes que empezar a buscar hacia dentro y cuantas más tengas, más laborioso será llegar al final.
PD: Otro tip es que uses siempre nombres de variables significativos. Si otra persona tiene que leer tu código (y nunca sabes cuando puede pasar eso) o tú mismo cuando tengas códigos con mucho tiempo de desarrollo detrás y los veas después de mucho tiempo, siempre será más complicado saber qué es esto:
Código
  1. string dato;
  2. unsigned int campo;
  3. string id, a, n;
  4. char s;
  5. int e, h, w;
  6. string tit;
  7. int curs;
Que esto:
Código
  1. string dato;
  2. unsigned int campo;
  3. string id, apellidos, nombre;
  4. char sexo;
  5. int edad, height, weight;
  6. string titulo;
  7. int curso;
419  Programación / Programación C/C++ / Re: Segmentation Fault ayuda en: 22 Marzo 2020, 20:39 pm
Es mucho código como para buscar en qué parte se produce el error así que una de dos:
Mandas el fichero que estés utilizando tú también para que podamos ejecutarlo.
Lo ejecutas y nos copias el error que te salga para saber por lo menos en que línea o función se está produciendo.

De primeras te diría que el vector de la STL está implementado para que el programador se olvide de trabajar directamente con la memoria por lo que es raro (no digo imposible porque no voy a afirmar algo que desconozco) que el error se produzca por eso.
Yo diría que el error se produzca en algún parámetro que no se esté pasando como debiese o que se esté pasando por referencia y por tanto se esté modificando el contenido original. También puede ser memoria no reservada pero a simple vista no he visto ningún puntero ni reservas de memoria dinámicas.

Como consejos te diría que:
  • Las funciones asignarValores() tienen muchas papeletas para ser constructores parametrizados. Existe la sobrecarga, aprovéchala.
  • Veo cierta afición al bool ok y return ok. No te limites a mantener siempre una misma estructura ya que muchas veces será contraproducente. Las funciones que siempre devuelven true como lo son tus sets() o no devuelven nada porque sabemos que siempre van a ser true o si necesitas que devuelvan algo pon un <return true> directamente para indicar que la función ha llegado a su fin.
Las funciones que asignan un valor booleano en base a unas condiciones y devuelven ese valor, pueden devolver directamente el resultado de la condición. ¿Cuál te parece mejor?
Código
  1. // Opcion 1
  2. bool esPositivo(int num){
  3.  bool ok = false;
  4.  if(num >= 0){
  5.    ok = true;
  6.  }
  7.  return ok;
  8. }
  9.  
  10. // Opcion 2
  11. bool esPositivo(int num){
  12.  return (num >= 0);
  13. }

  • En los ficheros de cabecera (.h o .hpp) no se recomienda añadir cabeceras que utilizaremos en el fichero .cpp al igual que tampoco se recomienda definir un namespace por defecto. Puede parecer incómodo pero es mejor que en los ficheros de cabecera utilices la nomenglatura std::<lo_que_sea> (por ejemplo: std::string). Además como imagino que es algún tipo de tarea de clase, te recomendaría que incluyeses las cabeceras justas y necesarias. Así haces notar que sabes lo que haces y que no incluyes cabeceras porque sí, por si las moscas.
Igual me estoy confundiendo y cumples con estas cosas que te digo. Como ya he dicho lo he mirado muy por encima.

Yo creo que como consejos básicos ya tienes para entretenerte un rato. Y respecto al problema, lo dicho.
PD: Si utilizas las etiquetas de Código GeSHi específicas para C++ además de disfrutar el espectacular resaltado de sintaxis también te numerará las líneas de tu código por si alguna otra persona quisiera hacer referencia a una línea concreta.
420  Programación / Bases de Datos / [Resuelto] Insertar Xml con DTD interno en SQL Server en: 21 Marzo 2020, 21:03 pm
Mi problema, como dice el asunto es el siguiente: tengo un fichero xml muy sencillo con un dtd interno y quiero pasar su contenido a una tabla de SQL Server. (Estoy utilizando SSMS 2014). Lo primero que había intentado era:
Código
  1. DECLARE @doc xml
  2. SELECT @doc = (CAST x AS xml) FROM OPENROWSET(BULK 'ruta', SINGLE_BLOB) AS T(x)
  3.  
Pero al intentar ejecutarlo me aparecía el siguiente error:
Código:
No se permite analizar XML con DTD de un subconjunto interno. Utilice CONVERT con la opción de estilo 2 para habilitar la compatibilidad limitada con DTD de subconjuntos internos. 

Investigué un poco el uso de CONVERT y cambié la sentencia anterior por:
Código
  1. SELECT @doc = CONVERT(xml, x, 2) FROM OPENROWSET(BULK 'ruta', SINGLE_BLOB) AS T(x)
Parece que se ejecuta correctamente mostrando el siguiente mensaje:
Código:
Se ha quitado del DTD XML uno o más fragmentos XML. Se han omitido los subconjuntos externos existentes. 

Pero a la hora de intentar trabajar con la variable @doc me sale el siguiente error:
Código:
Debe declarar la variable escalar "@doc". 


Ya de paso aprovecho para preguntar si conocéis de alguna guía sobre SQL Server ya que voy buscando información según la voy necesitando pero no llego a consolidar nada de forma teórica. Muchas gracias desde ya.

PD: El documento xml es válido y como es lógico pero por si acaso lo digo: donde he ido poniendo 'ruta' obviamente es la ruta completa de mi fichero xml pero para no copiarla entera...  :-X


EDIT RESUELTO: Vale, problema resuelto. Tengo el día tonto y estaba ejecutando únicamente la última sentencia. He seleccionado desde el DECLARE hasta el final y ya funciona correctamente... :rolleyes: :rolleyes:
Páginas: 1 ... 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 [42] 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 ... 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines