|
481
|
Programación / Programación C/C++ / Re: Necesito ayuda con mi código marca errores que no comprendo
|
en: 26 Noviembre 2018, 06:26 am
|
main.c:87:26: warning: passing argument 2 of ganador1 makes pointer from integer without a cast [-Wint-conversion] ganador=ganador1(ganador,tablero1[j]); ^ main.c:4:9: note: expected int (*)[7] but argument is of type int int ganador1(int n,int tablero[6][7]);
Es un warning no es un error te avisa de que algo no esta bien, y realmente no lo esta. Es un solo numero Entero, aque que esta en la posicion [j], pero la funcion quiere recibir todo el arreglo. Para corregir esto deberias de cambiar o la funcion o lo que le estes mandando a la funcion.
Ejemplo mandandole toda el arreglode numeros a la funcion ganandor1, y no solo un solo valor entero.
ganador=ganador1(ganador,tablero1); prinft("El jugador 1 es el que gana"); Es printf lo escribiste mal main.c:136:30: warning: passing argument 2 of ganador2 makes pointer from integer without a cast [-Wint-conversion] validacion2=ganador2(ganador,tablero1[j]); ^ main.c:5:9: note: expected int (*)[7] but argument is of type int int ganador2(int n,int tablero[6][7]); ^
Mismo error del primero system("cls"); No uses SYSTEM solo para borrar la Pu74 pantalla, en lugar de usar funciones fancy para borrra la pantalla, deberias de aprender a programar y quitarle los adornos al programa. ^ main.c:18:1: warning: ignoring return value of scanf, declared with attribute warn_unused_result [-Wunused-result] scanf("%i",&opciones); ^ main.c:23:5: warning: ignoring return value of system, declared with attribute warn_unused_result [-Wunused-result] system("cls"); ^ main.c:54:1: warning: ignoring return value of scanf, declared with attribute warn_unused_result [-Wunused-result] scanf("%i",&jugador1); ^ main.c:93:1: warning: ignoring return value of system, declared with attribute warn_unused_result [-Wunused-result] system("cls"); ^ main.c:103:1: warning: ignoring return value of scanf, declared with attribute warn_unused_result [-Wunused-result] scanf("%i",&jugador2); ^ main.c:142:1: warning: ignoring return value of system, declared with attribute warn_unused_result [-Wunused-result] system("cls"); ^ main.c:155:1: warning: ignoring return value of scanf, declared with attribute warn_unused_result [-Wunused-result] scanf("%i",&volverajugar); ^ /var/tmp/ccOyAiBU.o: In function `main': main.c:(.text.startup+0xb0): undefined reference to `prinft' main.c:(.text.startup+0x503): undefined reference to `prinft' collect2: error: ld returned 1 exit status
Puedes omitir todos los errores del Scanf son simples warning. Saludos
|
|
|
483
|
Programación / Programación C/C++ / Re: Duda cstdlib y srand (C++)
|
en: 25 Noviembre 2018, 08:11 am
|
A mi me da error: C:\codigos>g++ -o t.exe t.cpp t.cpp: In function 'int main()': t.cpp:12:21: error: 'time' was not declared in this scope srand(time(NULL));
C:\codigos>g++ -v Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/6.3.0/lto-wrapper.exe Target: mingw32 Configured with: ../src/gcc-6.3.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --with-gmp=/mingw --with-mpfr=/mingw --with-mpc=/mingw --with-isl=/mingw --prefix=/mingw --disable-win32-registry --target=mingw32 --with-arch=i586 --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-pkgversion='MinGW.org GCC-6.3.0-1' --enable-static --enable-shared --enable-threads --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --with-tune=generic --enable-libgomp --disable-libvtv --enable-nls Thread model: win32 gcc version 6.3.0 (MinGW.org GCC-6.3.0-1)
A de ser algo de tu compilador que la incluye, alguna vez me paso algo similar que sin incluir explícitamente en biblioteca de funciones, el compilador no marcaba errores y generaba el exe sin problemas. Saludos
|
|
|
484
|
Programación / Programación C/C++ / Archivar directorio completo en un solo archivo.
|
en: 25 Noviembre 2018, 07:06 am
|
Realice un programa que pueda recibir parámetros desde la linea de comandos, dicho programa recibirá un directorio en el disco duro o un archivo Si es Directorio.. - Comprobar que el directorio sea valido.
- Comprobar que sea distinto al directorio actual.
- Listar los archivos y pesos en bytes en el directorio mencionado.
- Realizar una copia de seguridad de dichos archivos, con las siguientes características
- Todos lo archivos del directorio se deben de guardar en un unico archivo llamado directorio.dir donde directorio se debe sustituir por el nombre del directo indicado en primer lugar. Ejemplo "C:\temp\codigos\" el archivo se debe de llamar codigos.dir
- Se debera de tener un registro también en archivo (index.dat), que contenga Nombre, donde comienza y cuando espacio ocupa cada archivo del directorio en el nuevo.
- Se debera realizar también una validación tipo checkum de cada archivo, utilice el sistema Hash de su preferencia para hacer esta validación.
Si es archivo, deberá de ser alguno en terminación .dir - Comprobar que exista
- Que este completo segun la lista de archivos que previamente guardamos en el index.dat
- Debera de Extraerlo en un directorio indicado por el usuario (En un segundo parametro al programa) distinto al directorio Original.
El programa podrá ser creado en C o C++ Deberá de utilizar en cualquier momento la menor cantidad de memoria posible y ser lo bastante rápido para pode competir con otros. El post es solo para darle un poco mas de movimiento a este subforo de programación en C/C++. Si tienen dudas sobre una parte en especifico, pueden de preferencia abrir un nuevo tema, con la duda en especifico. Si alguno quiere participar comentelo aqui, asi mismo también pueden sugerir mas features para el programa. Ya que opciones hay varias. La intención no es reinventar la rueda, programas similares ya existen Tipo (TAR), la intención es que quien este aprendiendo C o C++ pueda retarse asi mismo con algo que en un futuro pueda reutilizar. Y no se diga la experiencia. Saludos
|
|
|
485
|
Programación / Programación C/C++ / Re: ¿Queda algo en el Buffer de Entrada stdin?
|
en: 25 Noviembre 2018, 00:02 am
|
A raíz de este post me he puesto a pensar en todo esto. Ya que C viene del UNIX y en UNIX todo son archivos y por tanto stdin es un archivo ¿qué tal si llevamos el puntero de stdin hasta el final y nos saltamos todo lo que hay dentro?
Incluso acepta una única pulsación de intro.
 No habia intentado eso, pero funciona muy bien!, yo intente con la funcion feof para tratar de determinar si estabamos en el final del archivo, pero no funciono para STDIN. Con fseek si funciona!!! #include<stdio.h> int main() { char temporal[10]; printf("Ingrese una cadena: "); fgets(temporal ,10,stdin ); printf("Cadena Leida: %s\n",temporal ); fseek(stdin , 0, SEEK_END ); printf("Ingrese otra cadena: "); fgets(temporal ,10,stdin ); printf("Cadena Leida: %s\n",temporal ); }
 Saludos!
|
|
|
486
|
Programación / Programación C/C++ / Re: ¿Queda algo en el Buffer de Entrada stdin?
|
en: 24 Noviembre 2018, 22:16 pm
|
Realmente no importa lo que queda en el buffer. Ya que si vaciamos el buffer de stdin no se volvera a llenar hasta que volvamos a llamar a una funcion tipo fgets, gets, scanf... etc. Ejemplo: #include<stdio.h> #include<string.h> int main() { int len,i = 0; char temporal[10]; char c; printf("Ingrese una cadena: "); fgets(temporal ,10,stdin ); printf("Cadena Leida: %s\n",temporal ); if(temporal[len - 1 ] != 0xA) { } printf("Ingrese otra cadena: "); fgets(temporal ,10,stdin ); printf("Cadena Leida: %s\n",temporal ); }
Salida:  Saludos
|
|
|
487
|
Programación / Programación C/C++ / Re: ¿Queda algo en el Buffer de Entrada stdin?
|
en: 24 Noviembre 2018, 21:50 pm
|
Tengo que decirles que después de meditarlo un poco, encontre la solución, se puede deducir leyendo la memoria que acabamos de leer, esto en el caso de Usar Fgets Si bien han usado en su momento fgets, recordaran que este guarda en la misma cadena que acaba de leer el "Enter" esto es un byte de valor 0xA (10 en decimal) Esto siempre y cuando la longitud del texto leído no supere el tamaño del arreglo donde vamos a guardar nuestra cadena leida. Vemos un ejemplo con Codigo: #include<stdio.h> #include<string.h> int main() { int len,i = 0; char temporal[10]; printf("Ingrese una cadena: "); fgets(temporal ,10,stdin ); printf("Cadena Leida: %s",temporal ); printf("La longitud de la cadena leida es de %i\n",len ); while(i <10) printf("%.2X",temporal [i ++]); }
Aqui unas cuantas salidas.  1er caso de la imagen: ingresar mas de 9 letras "A", obvio hay datos en el buffer de stdin esperando ser leeidos, 2do caso de la imagen: Al ingresar exactamente 9 letras A, el ultimo byte del buffer el byte 10 es el valor nulo '\0' En este caso queda un Enter en el buffer de datos de stdin 3er caso de la imagen: Al ingresar exactamente 8 letras A, strlen sigue considerando 9 espacios usados ya que el Enter (0xA) esta el la posición temporal[8] y en temporal[9] esta el byte nulo '\0' 4to caso de la imagen: Al ingresar exactamente 7 letras A, strlen marca una longitud de 8 espacios mismo caso que el anterior sigue considerando el "Enter" como un valor valido de la cadena. En conclusión, si al usar fgets correctamente, el valor de nuestro arreglo en su posición strlen(temporal) - 1 es igual 0xA entonces no queda nada en nuestro buffer de STDIN, en caso contrario si queda Algo, ya sea solo el Enter o Texto restante + Enter. En cualquier caso después de realizar esta evaluación si detectamos el caso de que aun quede buffer pendiente por leer, podemos leerlo asi:
Saludos
|
|
|
488
|
Programación / Programación C/C++ / ¿Queda algo en el Buffer de Entrada stdin? (Solucionado)
|
en: 24 Noviembre 2018, 18:54 pm
|
SoluciónSe encontraron 2 soluciones - Detectar en la memoria previamente leida por fgets si el buffer de destino tiene el retorno de linea, si esi ya no hay nada en STDIN, en caso contrario aun quedan datos.
- realizar fseek al stdin para que avance hasta el final del archivo. (Solucion gracias a MAFUS)
#include<stdio.h> #include<string.h> int main() { int len,i = 0; char temporal[10]; char c; printf("Ingrese una cadena: "); fgets(temporal ,10,stdin ); printf("Cadena Leida: %s\n",temporal ); if(temporal[len - 1 ] != 0xA) { } printf("Ingrese otra cadena: "); fgets(temporal ,10,stdin ); printf("Cadena Leida: %s\n",temporal ); }
con fseek: #include <stdio.h> int main() { char c; while(1) { fseek(stdin , 0, SEEK_END ); } }
Post Original Muy buen dia aun que la pregunta en el titulo de este post parece una pregunta totalmente N00b. No lo es. El objetivo del post es Dejar de utilizar fflush
Yo no lo utilizo, o por lo menos trato de nunca recomendarlo, solo que ayer se lo recomendé a alguien y no me convence su implementación.  La verdad es que quiero dar por terminado el tema de la función fflush para el Buffer de entrada. Todo esto en Lenguaje C  La idea de este post viene de preguntas hechas en el foro similares a ¿Como filtrar todo tipo de datos de entrada en un programa?Revisando algunas links en internet me encuentro con: https://es.stackoverflow.com/questions/82431/saber-si-el-b%C3%BAfer-de-entrada-stdin-est%C3%A1-vac%C3%ADo-en-c-est%C3%A1ndarhttp://man7.org/linux/man-pages/man3/fflush.3.htmlhttp://www.cplusplus.com/reference/cstdio/fflush/Sin embargo en todos ellos hablan de que el comportamiento de fflush para el stdin es Inesperado, por lo cual repetidamente dicen que no se debe de usar.¿Cual es la solución para limpiar el buffer de entrada, si es que realmente queda algo en el?Intente con feof, sin embargo al parecer NUNCA llega el fin del archivo para STDIN #include<stdio.h> #include<string.h> int main() { char temporal[10]; printf("Ingrese menos de 10 o mas de 10 caracteres\npara ver el comportamiento de feof(stdin): "); fgets(temporal ,10,stdin ); temporal [strcspn(temporal ,"\n\r")] = '\0'; printf("Valor leido %s\n",temporal ); printf("stdin llego al final del archivo\n"); } else { printf("stdin NO llego al final del archivo\n"); } }
El problema de todo esto radica que cuando estamos leyendo multiples valores desde el teclado, aun que lo delimitemos con fgets para la cantidad de datos que se guardaran en cada variable, el fgets , al igual que otras funciones de entrada deja los caracteres restantes en el buffer de entrada y son tomados automaticamnete por cualquier funcion de entrada de texto.  Como ven en la imagen, en la segunda entrada de las AAAAAAAAAAAAA, se salto el segundo "Ingrese una cadena." #include<stdio.h> #include<string.h>
int main() { char temporal_1[10]; char temporal_2[10]; printf("Ingrese una cadena: "); fgets(temporal_1,10,stdin); temporal_1[strcspn(temporal_1,"\n\r")] = '\0'; printf("Ingrese una cadena: "); fgets(temporal_2,10,stdin); temporal_2[strcspn(temporal_2,"\n\r")] = '\0'; printf("Valor leido %s\n",temporal_1); printf("Valor leido %s\n",temporal_2); }
Este problema tambien se presenta en C++ con funciones de entrada tipo cin>> Ejemplo:  Codigo: #include<iostream> using namespace std; int main() { int numero_1,numero_2; cout<<"Ingrese un numero: "; cin>>numero_1; cout<<"Ingrese un numero: "; cin>>numero_2; cout<<"Valor leido "<<numero_1<<endl; cout<<"Valor leido "<<numero_2<<endl; }
Entonces pregunto: ¿Cual es la solución para limpiar el buffer de entrada, si es que realmente queda algo en el?¿Como se si es que realmente queda algo en el buffer de entrada, sin consumirlo.?https://albertobsd.blogspot.com/2018/11/queda-algo-en-el-buffer-de-entrada-stdin.html
|
|
|
|
|
|
|