Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - class_OpenGL

#1
Hola, muy buenas.

En un foro de LXDE pregunte una cosa, pero como tengo algo de prisa y no he encontrado solucion en las horas que lo he preguntado, lo preguntare aqui tambien (siento no poner tildes, pronto podre)

Recientemente he instalado ArchLinux cuyo entorno grafico es LXDE.

Este es mi problema: tengo un portatil con un touchpad. Cuando deslizo el dedo desde la parte de arriba hacia abajo, la ventana que tiene el foco se minimiza. Esto se torna mucho mas molesto de lo que ayuda, asi que me gustaria desactivarlo, pero no se como. Si alguien sabe como hacerlo, podria explicarnos como hacerlo?

Muchas gracias de antemanno
#2
Hola, muy buenas.

Hace tiempo sabía de un comando, en Arch Linux, que te servía para obtener las rutas de inclusión de cabeceras y librerías compiladas.

La sintaxis del comando era:
comando --include <nombre-librería>
o
comando --libs <nombre-librería>

El caso es que no recuerdo el nombre de ese comando. He tratado de buscarlo en internet sin mucho éxito. ¿Alguien sabe el nombre de ese comando?

Muchas gracias por adelantado
#3
Hola, muy buenas.

Siguiendo un tutorial de Java, he llegado a un capítulo el cual trata sobre la creación de aplicaciones web usando JSP. El problema que tengo es que para poder 'ejecutar' los archivos .JSP, el tutorial hace uso de NetBeans, y preferiría no usarlo. En vez de usar NetBeans estoy usando la consola y un editor de texto (Emacs) para la creación de los ejercicios. Por lo tanto, he intentado 'ejecutar' estos archivos manualmente. Investigando por Internet, he visto que se requiere de un servidor, en este caso, Apache, y una especie de extensión llamada Tomcat.

El problema que me ha surgido ha sido al intentar iniciar Tomcat (la verdad, creo que doy palos de ciego). Cuando trato de iniciar Tomcat usando el sigueinte comando:
Citar# systemctl start tomcat8.service
me sale el siguiente error:
CitarJob for tomcat7.service failed because the control process exited with error code.
See "systemctl status tomcat7.service" and "journalctl -xe" for details.

Ejecutando los comandos que me recomienda, me sale el siguiente error:
Citarsystemctl status tomcat7.service   Loaded: loaded (/usr/lib/systemd/system/tomcat7.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Mon 2018-04-02 02:41:37 CEST; 46s ago
  Process: 2978 ExecStop=/usr/bin/jsvc -pidfile /var/run/tomcat7.pid -stop org.apache.catalina.startup.Bootstrap (code=exited, status=255)
  Process: 2969 ExecStart=/usr/bin/jsvc -Dcatalina.home=${CATALINA_HOME} -Dcatalina.base=${CATALINA_BASE} -Djava.io.tmpdir=/var/tmp/tomcat7/temp -cp /usr/share/java/commons-daemon.jar:/usr/share/java/eclipse-ecj.>
Main PID: 2974

abr 02 02:41:37 carlos-pc systemd[1]: Starting Tomcat 7 servlet container...
abr 02 02:41:37 carlos-pc jsvc[2969]: Cannot find any VM in Java Home /usr/lib/jvm/default-runtime
abr 02 02:41:37 carlos-pc systemd[1]: tomcat7.service: Can't open PID file /var/run/tomcat7.pid (yet?) after start: No such file or directory
abr 02 02:41:37 carlos-pc systemd[1]: tomcat7.service: Supervising process 2974 which is not our child. We'll most likely not notice when it exits.
abr 02 02:41:37 carlos-pc jsvc.exec[2973]: 2018-04-02 02:41:37 2974 jsvc.exec error: Cannot find any VM in Java Home /usr/lib/jvm/default-runtime
                                           2018-04-02 02:41:37 2974 jsvc.exec error: Cannot locate JVM library file
abr 02 02:41:37 carlos-pc systemd[1]: tomcat7.service: Control process exited, code=exited status=255
abr 02 02:41:37 carlos-pc systemd[1]: tomcat7.service: Killing process 2974 (n/a) with signal SIGKILL.
abr 02 02:41:37 carlos-pc systemd[1]: tomcat7.service: Killing process 2974 (n/a) with signal SIGKILL.
abr 02 02:41:37 carlos-pc systemd[1]: tomcat7.service: Failed with result 'exit-code'.
abr 02 02:41:37 carlos-pc systemd[1]: Failed to start Tomcat 7 servlet container.

Cabe destacar que tengo JDK instalado

Muchas gracias
#4
Hola, muy buenas.

He instalado en una tablet Arch Linux (x86_64). Estoy tratando de compilar el driver de sonido para una tablet llamada Chuwi Hi12, cuyo código fuente se puede descargar de:
https://github.com/kernins/linux-chwhi12/tree/master/sound/soc/codecs
El caso es que lo he descargado y compilado con el Makefile correspondiente. El problema que tengo es a la hora de hacerlo funcionar, porque no tengo mucha idea.

¿Podrían indicarme más o menos los pasos que he de realizar una vez tengo el .ko generado?

Gracias
#5
Hola, muy buenas, me preguntaba si podrían explicarme una expresión regular que me encontré en un Makefile:

Citars/$(BOARD).$(1)=\(.*\)/\1/p

$(BOARD)=mega
$(1)=build.mcu

Esa expresión la ejecuta el siguiente comando:

Citarsed -ne "s/$(BOARD).$(1)=\(.*\)/\1/p" <ruta>

donde <ruta> es la ruta de un archivo de texto (si de paso me explican bien qué hace sed estupendo)

Muchas gracias
#6
Hola, muy buenas. Tengo una pregunta. ¿Cómo puedo indicarle al comando Java, el cual ejecutará una clase, que busque los archivos indicados con rutas relativas, en una ruta que yo le diga?

Pongo un ejemplo: en java quiero abrir un archivo. Como parámetro, le paso la ruta "cosas/texto.txt". Ahora bien, yo tengo una carpeta que contiene a la carpeta 'cosas', pero esta no está donde está la raiz del proyecto (digamos que esa ruta es /home/usuario/res). Entonces yo ejecuto el comando:

Citarjava OP /home/usuario/res [...]

Donde OP es la opción que pregunto y [...] es el resto del comando

Muchas gracias
#7
Hola, muy buenas.

He estado investigando cómo leer un carácter de la consola (saltándose los espacios, leyendo un carácter, y parar), pero no he encontrado nada que sea exáctamente eso. Quiero leer exactamente uno porque estoy leyendo posiciones en un tablero de ajedrez, las cuales se dan con la siguiente sintaxis: <columna><fila>, donde <columna> es una letra que va desde la 'a' hasta la 'h', y <fila> es un número del 1 al 8. Por ejemplo, la posición d5 indica la fila 5, columna 5 (empezando desde 1). La forma más típica que encuentro en internet es la siguiente:

Código (java) [Seleccionar]
scanner.next(".").charAt(0);

El problema, es que al poner d5, me salta la siguiente excepción:

CitarException in thread "main" java.util.InputMismatchException
   at java.base/java.util.Scanner.throwFor(Scanner.java:860)
   at java.base/java.util.Scanner.next(Scanner.java:1497)
   at java.base/java.util.Scanner.next(Scanner.java:1428)
   at Ejercicio_08.main(Ejercicio_08.java:16)

Lo cual no tiene mucho sentido, porque '.' en la regexp significa un solo carácter.

Espero que puedan ayudarme, gracias
#8
Hola, muy buenas.

Recientemente me he instalado Arch Linux, y posteriormente GNOME. El problema que tengo es que cada vez que cierro el portátil, se me cierra la sesión (cerrándose así abruptamente las aplicaciones que hubiera abiertas), lo cual es muy molesto. ¿Cómo podría cambiar esto? Muchas gracias
#9
Hola, muy buenas. Quería saber si hay manera de obtener el stdout de C (FILE *) en ensamblador. Lo necesito para hacer flush a este, sin tener que hacerlo con los demás manejadores. Muchas gracias!
#10
Hola, muy buenas.

Mi duda es la siguiente: imaginemos que tenemos una clase con un solo constructor, que necesita parámetros. ¿Podríamos crear e instanciar un arreglo de objetos tipo <esa clase> con algo parecido a la siguiente sintaxis?

Código (cpp) [Seleccionar]
Objeto objetos[NUM_OBJETOS] = {0};

En este caso, el constructor del objeto recibiría como parámetro un entero, por lo que se haría 'conversión' implícita.

Muchas gracias
#11
Hola, muy buenas. Estoy desarrollando para la facultad una clase llamada Cronologia y otra como FechaHistorica, y tengo problemas con la salida del FechaHistorica. En esta clase, he definido una sobrecarga de operador amigo así:

Código (cpp) [Seleccionar]
std::ostream& operator<<(std::ostream &os, const FechaHistorica &fecha) {
    // PRUEBAS
    for(int i = 0; i < (int)fecha.acontecimientos.size(); i++)
        os << fecha.acontecimientos[i] << std::endl;
   
    os << "________________________________" << std::endl;
   
    for(int i = 0; i < (int)fecha.acontecimientos.size(); i++) {
        for(int j = 0; j < (int)fecha.acontecimientos[i].size(); j++)
            os << '(' <<(int)fecha.acontecimientos[i][j] << ',' << fecha.acontecimientos[i][j] << ") ";
       
        os << std::endl << "___" << std::endl;
    }
   
    // CÓDIGO REAL
    os << fecha.año;
   
    for(const std::string &elemento : fecha.acontecimientos)
        os << FechaHistorica::TERMINADOR << elemento;
   
    return os;
}


La parte etiquetada como 'PRUEBAS' significa que no pertenece al código final. FechaHistorica tiene un año (int) y un conjunto de acontecimientos (std::vector de std::string). Pues bien, cuando yo ejecuto ese operador obtengo la siguiente salida:

CitarApriori algorithm developed by Rakesh Agrawal and Ramakrishnan Srikant
Nada en especial
Algo
________________________________
(65,A) (112,p) (114,r) (105,i) (111,o) (114,r) (105,i) (32, ) (97,a) (108,l) (103,g) (111,o) (114,r) (105,i) (116,t) (104,h) (109,m) (32, ) (100,d) (101,e) (118,v) (101,e) (108,l) (111,o) (112,p) (101,e) (100,d) (32, ) (98,b) (121,y) (32, ) (82,R) (97,a) (107,k) (101,e) (115,s) (104,h) (32, ) (65,A) (103,g) (114,r) (97,a) (119,w) (97,a) (108,l) (32, ) (97,a) (110,n) (100,d) (32, ) (82,R) (97,a) (109,m) (97,a) (107,k) (114,r) (105,i) (115,s) (104,)  (110,n) (97,a) (110,n) (32, ) (83,S) (114,r) (105,i) (107,k) (97,a) (110,n) (116,t) (13,
___
(78,N) (97,a) (100,d) (97,a) (32, ) (101,e) (110,n) (32, ) (101,e) (115,s) (112,p) (101,e) (99,c) (105,i) (97,a) (108,l)
___
(65,A) (108,l) (103,g) (111,o)
___
#Nada en especial#Algo developed by Rakesh Agrawal and Ramakrishnan Srikant

Como podeis ver, el vector de string contiene los string

  • Apriori algorithm developed by Rakesh Agrawal and Ramakrishnan Srikant
  • Nada en especial
  • Algo

Después he impreso el valor numérico de cada carácter.

El ERROR está en la siguiente parte:
Citar#Nada en especial#Algo developed by Rakesh Agrawal and Ramakrishnan Srikant

En el código, tengo que se imprima primero el año, y luego el conjunto de sucesos, pero por alguna razón, parece ser que la posición del cursor (columna) vuelve a 0, y sobreescribe los datos de la línea ya impresos. Espero haberme explicado bien.

He probado en cada iteración a hacer un flush de 'os', pero no ha resultado.

Muchas gracias!
#12
Java / (Consulta) Posible BUG en Java
2 Octubre 2017, 09:16 AM
Hola, buenas.

Estoy haciendo ejercicios de un libro de Java. En un ejercicio, se me pedía el uso de archivos:

CitarRealiza un programa que nos diga si hay probabilidad de que nuestra pareja
nos está siendo infiel. El programa irá haciendo preguntas que el usuario
contestará con verdadero o falso. Cada pregunta contestada como verdadero
sumará 3 puntos. Las preguntas contestadas con falso no suman puntos. Utili-
za el fichero
test_infidelidad.txt
para obtener las preguntas y las conclusiones
del programa.

El problema que tengo no es de compilación (compila bien), sino de ejecución. Cuando lo ejecuto, se lee la primera línea del archivo, se imprime, y se pausa el programa para la entrada (como es de esperar). El problema es que al introducir un valor de entrada (booleana, por ejemplo, true), en una nueva línea se imprime true y el programa se para de nuevo. Si introduzco la entrada de nuevo, el programa hace lo que debería, pero en cada entrada hay que introducir dos entradas. Ejemplo:

¿Ha sido fiel a su pareja? true          # Ese true lo introduje por teclado. Pulso enter
true                                      # Se imprime mágicamente
true                                      # Tengo que introducir de nuevo la respuesta
¿Quiere a su pareja?


Los "# [...]" son comentarios que os hago para entender la ejecución.

Este es el código que tengo:

Código (java) [Seleccionar]
import java.io.RandomAccessFile;
import java.io.IOException;
import java.util.Scanner;

public class Ejercicio_16 {
   public static void main(String[] args) {
       try {
           RandomAccessFile archivo =
               new RandomAccessFile ("test_infidelidad.txt", "r");
           Scanner scanner = new Scanner(System.in);
           String linea;
           boolean respuesta_correcta;
           boolean respuesta;
           int puntuacion, puntuacion_maxima;
           
           puntuacion = 0;
           puntuacion_maxima = 0;
           
           while(null != (linea = archivo.readLine())) {
               respuesta_correcta = archivo.readBoolean();
               
               System.out.print(linea + " ");
               respuesta = scanner.nextBoolean();
               
               if(respuesta == respuesta_correcta)
                   puntuacion += 3;
               
               puntuacion_maxima += 3;
           }
           
           System.out.println("Ha sacado " + puntuacion + "/" + puntuacion_maxima + " de puntuación");
           
           archivo.close();
       } catch (IOException e) {
           System.out.println(e);
       }
   }
}


test_infidelidad.txt
¿Ha sido fiel a su pareja?
true
¿Quiere a su pareja?
true
¿Tiene su pareja o sus hijos algún entrenador personal?
false
¿Pone su pareja excusas para acostarse?
false


Gracias por leer.
#13
Hola, muy buenas.

Antes de formatear, tenía, en emacs un paquete que me permitía seleccionar la ruta con las flechas del ratón (ver imagen abajo), pero ahora no encuentro dicho paquete (porque no me acuerdo de su nombre). Si alguien sabe el nombre del paquete, por favor, dígalo. El navegador se puede ver en la parte de abajo

#14
Hola a tod@s. Estoy introduciéndome en el mundo de la programación concurrente usando los hilos de POSIX. Estoy intentando implementar de forma segura lo siguiente:

Thread 1 (hilo POSIX): actualizar framebuffer (búfer de pantalla)
Thread 2 (hilo principal): actualizar imagen con una proveniente de una cámara.

El framebuffer se actualiza con la imagen leida de la cámara. Entonces, una secuencia de ejecución sería algo parecido a:

|-----Actualizar imagen-----|-----Actualizar imagen-----|-----Actualizar imagen-----|
|--------Actualizar framebuffer--------|--------Actualizar framebuffer--------|--------Actualizar framebuffer--------|

Es posible que actualizar el framebuffer ocupe menos tiempo que actualizar la imagen, no se sabe.

Entonces mi pregunta es: ¿cuál creen que es la mejor forma de actualizar el framebuffer sin que haya tearing (se mezcle el frame anterior con el actual)?

Lo ideal sería que fuera lo más eficientemente posible, es decir, que si ya se ha leido una imagen, el actualizador del framebuffer no tenga que esperar a que se lea otra imagen.

No pido que me den código, solo pregunto cual sería la idea de implementación (no sé si me explico)
#15
Hola, muy buenas.

Leyendo el manual de referencia de la librería libusb, no entiendo la función libusb_control_transfer. Podéis verlo aquí: http://libusb.org/static/api-1.0/group__syncio.html#gadb11f7a761bd12fc77a07f4568d56f38

Lo que no entiendo muy bien son los parámetros. Por ejemplo, querría leer datos de un pen drive. Muchas gracias
#16
Hola, muy buenas. Tengo Arch Linux con la arquitectura x86_64 y GNOME 3.22.2. El problema que tengo es que si una aplicación intenta modificar la posición del cursor cuando este es visible, básicamente el sistema operativo/GNOME ignora la orden. Este problema se puede ver en BLENDER o con una sencilla aplicación de OpenGL/GLFW. Si llamo a la función de GLFW glfwSetCursorPos cuando el ratón está visible, la orden se ignora, y cuando la llamo con glfwSetInputMode(ventana, GLFW_CURSOR, GLFW_CURSOR_HIDDEN) entonces si que tiene efecto la función glfwSetCursorPos. Otro caso que reafirma mi teoría es cuando juego a PayDay 2, puesto que la cámara funciona, y para que funcione se tiene que modificar la posición del cursor.

No estoy acostumbrado a solucionar problemas que me ocurren en sistemas Linux, pero me gustaría empezar a solucionarlos por mi mismo. Tengo conocimientos de C/C++, y supongo que GNOME está escrito en C. Entonces, si no saben el error, pero sabrían por dónde empezar, por favor, díganme :D Muchas gracias
#17
Hola, muy buenas. Hoy quería preguntar si hay alguna forma de modificar una constante en la sobrecarga del operador igual. Ejemplo:


Código (c++) [Seleccionar]
class Foo {
   private:
      const int VARIABLE;
   
   public:
      [...]
      Foo & operator=(const Foo &foo) {
         VARIABLE = foo.VARIABLE; // Aquí marcaría error
      }
      [...]
};



Muchas gracias
#18
Hola, muy buenas. Estoy haciendo una clase 'Vector' en C++ (tamaño dinámico, pero se asigna una sola vez). El caso es que uno de los constructores acepta una initializer_list, donde puedes poner todos los componentes del vector. Este es el código:

Código (c++) [Seleccionar]
template<typename TipoComponente>
class Vector {
   [...]
   public:
      [...]
      Vector(const std::initializer_list<TipoComponente> &componentes)
         : Vector(componentes.size())
      {
         typename std::initializer_list<TipoComponente>::const_iterator iterador = componentes.begin();
         int i = 0;
         
         while(iterador != componentes.end()) {
            vector[i] = *iterador;
            i++;
            iterador++;
         }
      }
      [...]
};


LA pregunta es: ¿por qué el compilador me obliga a poner la palabra 'typename' antes de la declaración del iterador? Este es el error que sale si no la pongo:

||=== Build: Debug in Reversi (compiler: GNU GCC Compiler (x86_64)) ===|
..\Reversi\reversi\herramientas\vector.hpp||In constructor 'Vector<TipoComponente>::Vector(const std::initializer_list<_Tp>&)':|
..\Reversi\reversi\herramientas\vector.hpp|22|error: need 'typename' before 'std::initializer_list<_Tp>::const_iterator' because 'std::initializer_list<_Tp>' is a dependent scope|
..\Reversi\reversi\herramientas\vector.hpp|22|error: expected ';' before 'iterador'|
..\Reversi\reversi\herramientas\vector.hpp|25|error: 'iterador' was not declared in this scope|
..\Reversi\reversi\herramientas\vector.hpp||In instantiation of 'Vector<TipoComponente>::Vector(const std::initializer_list<_Tp>&) [with TipoComponente = float]':|
C:\Users\Carlos\Desktop\Programacion\Proyectos\Reversi\main.cpp|43|required from here|
..\Reversi\reversi\herramientas\vector.hpp|22|error: dependent-name 'std::initializer_list<_Tp>::const_iterator' is parsed as a non-type, but instantiation yields a type|
..\Reversi\reversi\herramientas\vector.hpp|22|note: say 'typename std::initializer_list<_Tp>::const_iterator' if a type is meant|
||=== Build failed: 4 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|


No me entero muy bien de lo que me queire decir el compilador. Espero que me puedan ayudar. Muchas gracias!
#19
Hola, muy buenas. Estoy realizando un árbol binario en C++. Lo estoy encapsulando en una clase. Como cualquier árbol binario, este tiene un dato, un puntero a la izquierda y otro a la derecha. El problema es que al llamar al destructor (el cual lo elimina), el programa finaliza brúscamente. El constructor es el siguiente:

Código (cpp) [Seleccionar]
template <typename T>
class ArbolBinario {
   private:
      T dato;
      ArbolBinario *izda;
      ArbolBinario *dcha;
     
      void Eliminar(ArbolBinario *rama) {
         if(NULL != rama->izda)
            Eliminar(rama->izda);
         
         if(NULL != rama->dcha)
            Eliminar(rama->dcha);
         
         delete rama;
      }
     
   public:
      [...]
     
      ~ArbolBinario() {
         EliminarRamaIzda();
         EliminarRamaDcha();
      }
     
      [...]
     
      void EliminarRamaIzda() {
         if(NULL != izda) {
            Eliminar(izda);
            izda = NULL;
         }
      }
     
      void EliminarRamaDcha() {
         if(NULL != dcha) {
            Eliminar(dcha);
            dcha = NULL;
         }
      }
     
      [...]
};


Este es la función main:

Código (cpp) [Seleccionar]
int main() {
   ArbolBinario<int> arbol;
   
   arbol.SetDato(7, "");
   arbol.ReemplazarRamaIzda(20, "");
   arbol.ReemplazarRamaIzda(5, "0");
   arbol.ReemplazarRamaDcha(7, "00");
   arbol.ReemplazarRamaDcha(4, "0");
   arbol.ReemplazarRamaIzda(1, "01");
   arbol.ReemplazarRamaDcha(2, "01");
   arbol.ReemplazarRamaDcha(8, "");
   arbol.ReemplazarRamaIzda(10, "1");
   
   cout << arbol.ToString();
   
   return 0;
}


Cuando uso el depurador, pongo un punto de ruptura en el destructor, y obtengo lo siguiente:

Breakpoint 1, ArbolBinario<int>::~ArbolBinario (this=0x28fddc, __in_chrg=<optimized out>) at main.cpp:84
84               EliminarRamaIzda();
(gdb) continue
Continuing.

Breakpoint 1, ArbolBinario<int>::~ArbolBinario (this=0x720fb0, __in_chrg=<optimized out>) at main.cpp:84
84               EliminarRamaIzda();
(gdb) continue
Continuing.

Breakpoint 1, ArbolBinario<int>::~ArbolBinario (this=0x7212f0, __in_chrg=<optimized out>) at main.cpp:84
84               EliminarRamaIzda();
(gdb) continue
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x004099bb in ArbolBinario<int>::Eliminar (this=0x0, arbol=0x726f58)
    at main.cpp:13
13            void Eliminar(ArbolBinario *arbol) {


Lo que no sé es: ¿por qué se llama 3 veces al constructor? En la última llamada, ¿por qué el puntero this vale 0 (supongo que por esto el programa crashea)?

Muchas gracias
#20
Hola, muy buenas! Estoy estableciendo una comunicación serial entre mi Arduino y mi PC, pero me doy cuenta de que pierdo a veces algún byte. Entonces creo que usar un sistema de paquetes evitaría este problema en mayor medida (lo he supuesto, no demostrado). Me baso en que la transmisión de datos por red se hace por paquetes.

Entonces la pregunta es: ¿qué estructura de paquete me aconsejan que tenga? Principalmente espero enviar variables tipo entero pero quizás envíe otras cosas.

Sé que la estructura básica (y lógica) de estos es:

Cabecera
Datos
Cola

Lo que no sé es cuantos bytes debería ocupar cada cosa, sobre todo los datos. En la cabecera no tengo ni idea de qué debería incluir, y en la cola tampoco.

Muchas gracias!
#21
Hola, muy buenas. En mi afán por preservar Windows, pero a su vez poder usar Ubuntu sin una molesta máquina virtual, decidí instalar Ubuntu desde Windows. Después de una serie de problemas (básicamente Ubuntu no detectaba Windows 8.1), desde Windows creé una partición para Ubuntu, creé desde el instalador de Ubuntu las particiones swap, el directorio raíz, y un MB de partición para (supongo) la MBR (seleccioné algo de BIOS). El caso es que no esperaba que directamente me dejara la opción de seleccionar sistema operativo, pero lo que si esperaba es que el ordenador arrancara desde Windows. No es un problema grave (creo), porque no he perdido mis datos.

En resumidas cuentas, me gustaría saber cómo puedo instalar algo parecido (sino este) al Dual-Boot desde Ubuntu. Muchas gracias!

______________________________________

Cuando ejecuto "sudo fdisk -l | grep sda", me sale:

Disk /dev/sda: 465,8 GiB, 500107862016 bytes, 976773168 sectors
/dev/sda1       2048    616447    614400   300M Windows recovery environment
/dev/sda2     616448    821247    204800   100M EFI System
/dev/sda3     821248   1083391    262144   128M Microsoft reserved
/dev/sda4    1083392 554534911 553451520 263,9G Microsoft basic data
/dev/sda5  554534912 554536959      2048     1M BIOS boot
/dev/sda6  970913792 976771071   5857280   2,8G Linux swap
/dev/sda7  554536960 970913791 416376832 198,6G Linux filesystem
#22
Hola, muy buenas. Antes de nada, quiero aclarar que no voy a pedir que se me haga el ejercicio. Simplemente me gustaría que se me explicase una parte del enunciado que, sinceramente, no entiendo.

El enunciado es el siguiente:
Sea X = {1, 2, 3, 4, 5, 6, 7}, e Y = X x X x X. Consideramos en X el orden lexicográfico.
Dadas las siguientes parejas x,y pertenecientes a Y determina quien es mayor, y encuentra
el conjunto de todos los elementos de Y comprendidos entre x e y.

* x = (4, 2, 1), y = (5, 6, 2)
* x = (1, 4, 7), y = (7, 4, 1)
* x = (6, 4, 5), y = (2, 4, 1)


El ejercicio lo tengo que hacer en wxMaxima, el cual es un programa para el manejo de varios objetos matemáticos, como conjuntos, listas, funciones (aplicaciones)...

Bien, la parte que no entiendo que quiere decir es esta: Consideramos en X el orden lexicográfico

¿Qué quiere decir con que consideremos en X el orden lexicográfico? Sé lo que es el orden lexicográfico, pero no sé qué quiere decir eso de "consideremos en X ..."

¡Muchas gracias por su ayuda!
#23
Hola, muy buenas. Querría saber cómo iniciaizar un arreglo de estructura. Lo que hago es esto:

typedef struct {
   float coord[3];
} vec3;

...

vec3 vertices[4] = {
    {-size, -size, 0.0f},
    { size, -size, 0.0f},
    {-size,  size, 0.0f},
    { size,  size, 0.0f}
};


Pero el compilador me lanza los siguientes avisos:

../src/model.c: In function 'load_quad':
../src/model.c:8:9: warning: missing braces around initializer [-Wmissing-braces]
         {-size, -size, 0.0f},
         ^
../src/model.c:8:9: note: (near initialization for 'vertices[0]')
../src/model.c:9:9: warning: missing braces around initializer [-Wmissing-braces]
         { size, -size, 0.0f},
         ^
../src/model.c:9:9: note: (near initialization for 'vertices[1]')
../src/model.c:10:9: warning: missing braces around initializer [-Wmissing-braces]
         {-size,  size, 0.0f},
         ^
../src/model.c:10:9: note: (near initialization for 'vertices[2]')
../src/model.c:11:9: warning: missing braces around initializer [-Wmissing-braces]
         { size,  size, 0.0f}
         ^
../src/model.c:11:9: note: (near initialization for 'vertices[3]')
../src/model.c:7:24: warning: missing braces around initializer [-Wmissing-braces]
     vec3 vertices[4] = {
                        ^
../src/model.c:7:24: note: (near initialization for 'vertices')


Querría saber como initcializar adecuadamente ese arreglo. Muchas gracias
#24
Hola, muy buenas. Me está pasando una cosa muy extraña. Estoy intentando compilar un programa con codeblocks el cual tiene varios ficheros .c El problema que tengo es que cada .c compila bien (no me marca ningún error), pero luego me dice que no se puede encontrar el archivo .o Cuando voy a la carpeta obj/Debug, efectivamente, no hay ningún fichero objeto...

Este es el log de compilación:
gcc -Wall -g  -c /home/carlos/Escritorio/Programación/Proyectos/Juego/camera.c -o obj/Debug/camera.o
gcc -Wall -g  -c /home/carlos/Escritorio/Programación/Proyectos/Juego/gl_math.c -o obj/Debug/gl_math.o
gcc -Wall -g  -c /home/carlos/Escritorio/Programación/Proyectos/Juego/main.c -o obj/Debug/main.o
gcc -Wall -g  -c /home/carlos/Escritorio/Programación/Proyectos/Juego/model.c -o obj/Debug/model.o
gcc -Wall -g  -c /home/carlos/Escritorio/Programación/Proyectos/Juego/shader.c -o obj/Debug/shader.o
gcc -Wall -g  -c /home/carlos/Escritorio/Programación/Proyectos/Juego/system.c -o obj/Debug/system.o
gcc -Wall -g  -c /home/carlos/Escritorio/Programación/Proyectos/Juego/texture.c -o obj/Debug/texture.o
gcc -Wall -g  -c /home/carlos/Escritorio/Programación/Proyectos/Juego/tools.c -o obj/Debug/tools.o
g++  -o bin/Debug/Juego obj/Debug/camera.o obj/Debug/gl_math.o obj/Debug/main.o obj/Debug/model.o obj/Debug/shader.o obj/Debug/system.o obj/Debug/texture.o obj/Debug/tools.o   
g++: error: obj/Debug/camera.o: No existe el archivo o el directorio
g++: error: obj/Debug/gl_math.o: No existe el archivo o el directorio
g++: error: obj/Debug/main.o: No existe el archivo o el directorio
g++: error: obj/Debug/model.o: No existe el archivo o el directorio
g++: error: obj/Debug/shader.o: No existe el archivo o el directorio
g++: error: obj/Debug/system.o: No existe el archivo o el directorio
g++: error: obj/Debug/texture.o: No existe el archivo o el directorio
g++: error: obj/Debug/tools.o: No existe el archivo o el directorio
g++: fatal error: no input files
compilation terminated.


Es algo muy extraño o no veo la obviedad... Gracias por su ayuda
#25
Hola, muy buenas. Me gustaría saber si los marcadores que tenía en un dispositivo están asociados a mi cuenta de correo. De ser así, ¿cómo podría recuperar esos marcadores sin usar Chrome (desde Mozilla Firefox, en Ubuntu)?
#26
Hola, muy buenas. El caso es que tengo un Jiayu G4. De repente, mientras estaba jugando un juego de puzles, la pantalla se pone en negro (pero retroiluminada). A partir de ese momento, la pantalla no ha respondido más. El móvil sigue funcionando porque los sonidos siguen funcionando, y el ordenador lo reconoce como dispositivo USB.

Sé que no soy demasiados datos, pero no sé que más podría decir. Muchas gracias de antemano.
#27
Hola, muy buenas. Estaba viendo cómo se hacía una unidad de arranque desde ensamblador (NASM), pero tengo problemas con el registro DS. Muestro este código para mostrar mi duda:

Código (asm) [Seleccionar]
BITS 16

start:
xor ax, ax                 ; Set data segment to where we're loaded
mov ds, ax

mov ax, text_string
add ax, 7C00h
mov si, ax                 ; Put string position into SI
call print_string          ; Call our string-printing routine

jmp $                      ; Jump here - infinite loop!


text_string: db 'This is my cool new OS!', 0


print_string:                      ; Routine: output string in SI to screen
mov ah, 0Eh                ; int 10h 'print char' function

.repeat:
lodsb                      ; Get character from string
cmp al, 0
je .done                   ; If char is zero, end of string
int 10h                    ; Otherwise, print it
jmp .repeat

.done:
ret


times 510-($-$$) db 0      ; Pad remainder of boot sector with 0s
dw 0xAA55


Es un código sencillito, pero funciona. El problema está en que si hago que el registro DS valga 0x07C0, el ordenador no arranca con esta unidad de arranque, pero si calculo manualmente la dirección de la cadena de texto y hago que DS valga 0, el ordenador si que arranca con esta unidad.

Código con el que funciona:
Código (asm) [Seleccionar]
BITS 16

start:
xor ax, ax                 ; Lo ponemos como 0
mov ds, ax

mov ax, text_string        ; Calculo manualmente la dirección de la caedna
add ax, 7C00h
mov si, ax                 ; La guardo en SI
       
       ...


Código con el que no funciona:
Código (asm) [Seleccionar]
BITS 16

start:
mov ax 0x07C0          ; Lo ponemos como 0
mov ds, ax

mov ax, text_string    ; El cálculo debería ser DS * 0x10 + SI, lo que es lo mismo que
                              ; 0x07C0 * 0x10 + SI, lo que es lo mismo que 0x7C00 + SI, que
                              ; a su vez es lo mismo que el cálculo manual antes expuesto
mov si, ax             ; La guardo en SI
       
       ...


O hay algo que se me escapa, o es muy extraño todo... Gracias de antemano!




Vale, me he dado cuenta de que xor limpia parte/todo el registro FLAGS

He obtenido el registro con LAHF. Antes de usar xor, LAHF retornaba, en binario, 01000110, y después de usar xor, LAHF retornaba 00000000. He intentado hacer lo siguiente, pero sigue sin funcionar:

Código (asm) [Seleccionar]
mov ah, 0x00
SAHF
CLC
CLD
CLTS
mov ax, 0x07C0
mov ds, ax


Pero con este código si que funciona (algo hace XOR de lo que no me doy cuenta...):
Código (asm) [Seleccionar]
xor ax, ax            ; Algo más tiene que hacer XOR, porque aun reemplazando el valor de ax, sin XOR no funciona
mov ax, 0x07C0        ; Aquí reemplazamos todo ax
mov ds, ax


Espero que me puedan ayudar :D
#28
Hola, muy buenas, me explico. La pregunta que tengo es dónde se guardan las variables. Yo tenía entendido que se guardan en un especie de bloque de memoria asignado para cada programa llamado 'pila', pero según estoy leyendo por ahí, las variables pueden ser guardadas entre código y código del ejecutable. En ensamblador, por ejemplo, podríamos escribir 'mylabel: db 'Message here', 0' (ejemplo de Internet). En ese espacio del ejecutable, se guarda una serie de bytes que contienen "Message here", por lo que podrías decir que esa memoria está entre código y código, no en la 'pila'

Espero que mi duda se haya entendido, no sabía muy bien como explicarla... ¡Muchas gracias de antemano!
#29
Si eres como esas personas que codifican sin poner tabulaciones, espacios, deja los códigos super comprimidos y la gente no le gusta tu estilo, ¡¡aquí te traigo la forma de seguir con tu estilo y además de una forma bonita!!

          #include<stdio.h>




                 int
                main(
               ){float
              rad=0.0f;
             float peri;
            float   areac
           =.0f;     const
          float       pi_2=
         1.5707f;char*areas=
        "Area";fprintf(stdout
       ,"Radio: ");scanf("%f",
      &rad);              peri=
     4.00f                 *pi_2
    *rad;                   areac
   =2.0f                     *pi_2
  *rad*                       *&rad
;fprintf                     (stdout,




"Perimeter: %f\n",peri);fprintf(stdo\
ut,"%s: %f",areas, areac); return 0;}


Para aquel que se lo pregunte, como si no estuviera claro, este código te pide un radio para calcular su perímetro y área asociado

¡Espero que adoptéis este estilo tan maravilloso de programación!
#30
Hola, muy buenas. Dado un tema reciente decidí implementar en C una estructura que funcione como cola y otra como pila (estructuras FIFO y LIFO respectivamente). Bueno, parece que son muchas líneas, pero entre comentarios, y saltos de líneas "innecesarios", el código no es tan largo. Aquí se los dejo.

NOTA: Ya sé que ya se ha subido la implementación de estas estructuras, pero eso fue en C++, no en C.

#include <stdlib.h>
#include <stdio.h>

// Para generalizar, uso un tipo de datos predefinido, así puedo
// cambiar entre int y el tipo de datos que quiera
typedef int tipo;

typedef struct ElementoLista{
tipo dato;
struct ElementoLista *siguiente;
} Elemento;

// En la estructura de una pila, solo necesitamos la referencia al
// último elemento agregado
typedef struct {
Elemento *ultimo;
unsigned int num_elementos;
} Pila;

// Pero en la estructura de una cola, también necesitaremos la
// referencia del primer elemento
typedef struct {
Elemento *primero;
Elemento *ultimo;
unsigned int num_elementos;
} Cola;

// Si alguna de estas dos funciones retorna 0, significa que
// ha ocurrido un error, de lo contrario, retornará un valor
// diferente de 0
int agregar_a_pila(Pila *pila, tipo dato);
int agregar_a_cola(Cola *cola, tipo dato);

// Destruye el último elemento y retorna los datos almacenados en el
tipo quitar_a_pila(Pila *pila);
tipo quitar_a_cola(Cola *cola);

// Para demostrar el uso de 'quitar_a_pila' y 'quitar_a_cola'
// estas funciones destruyen la pila y la cola respectivamente
// al mostrarlas
void mostrar_pila(Pila *pila);
void mostrar_cola(Cola *cola);

int main() {
// No hay que olvidarse de inicializar, porque si no,
// no hay manera de determinar si un puntero a memoria
// dinámica es válido o no...
Pila pila = {NULL, 0};
Cola cola = {NULL, NULL, 0};
tipo dato;

// Para probar que todo funciona perfectamente, hacemos que el
// usuario introduzca enteros para almacenarlos tanto en una cola
// como en una pila.
fprintf(stdout, "Introduzca una serie de numeros (0 para acabar): ");
fscanf(stdin, "%d", &dato);
while(0 != dato) {
agregar_a_pila(&pila, dato);
agregar_a_cola(&cola, dato);
fscanf(stdin, "%d", &dato);
}

// Mostramos la pila y la cola (destruyendo a su vez los datos
// de las mismas)
mostrar_pila(&pila);
fputc('\n', stdout);
mostrar_cola(&cola);

return 0;
}

int agregar_a_pila(Pila *pila, tipo dato) {
Elemento *elemento;

// Creamos elemento y guardamos datos...
elemento = malloc(sizeof(Elemento));
if(NULL == elemento)
return 0;

elemento->dato = dato;

// Reconfiguramos pila...
if(NULL == pila->ultimo) {
elemento->siguiente = NULL;
pila->num_elementos = 1;
pila->ultimo = elemento;
} else {
elemento->siguiente = pila->ultimo;
pila->num_elementos += 1;
pila->ultimo = elemento;
}

return 1;
}

int agregar_a_cola(Cola *cola, tipo dato) {
Elemento *elemento;

// Creamos elemento y guardamos datos...
elemento = malloc(sizeof(Elemento));
if(NULL == elemento)
return 0;

elemento->dato = dato;
elemento->siguiente = NULL;

// Reconfiguramos cola...
if(NULL == cola->primero) {
cola->num_elementos = 1;
cola->primero = elemento;
cola->ultimo = elemento;
} else {
cola->ultimo->siguiente = elemento;
cola->num_elementos += 1;
cola->ultimo = elemento;
}

return 1;
}

tipo quitar_a_pila(Pila *pila) {
Elemento *temp;
tipo dato;

if(NULL != pila->ultimo) {
dato = pila->ultimo->dato;
temp = pila->ultimo;
pila->ultimo = pila->ultimo->siguiente;
pila->num_elementos -= 1;
free(temp);
} else {
dato = -1;
}

return dato;
}

tipo quitar_a_cola(Cola *cola) {
Elemento *temp;
tipo dato;

// Hacemos esta asignación, porque si el primer elemento de la cola y
// el último son iguales, destruiremos el primer elemento, dejando al último
// sin memoria asignada, por lo que directamente al último elemento le
// asignamos NULL para que no haya errores
if(cola->primero == cola->ultimo)
cola->ultimo = NULL;

if(NULL != cola->primero) {
dato = cola->primero->dato;
temp = cola->primero;
cola->primero = cola->primero->siguiente;
cola->num_elementos -= 1;
free(temp);
} else {
dato = -1;
}

return dato;
}

void mostrar_pila(Pila *pila) {
tipo dato;

while(NULL != pila->ultimo) {
dato = quitar_a_pila(pila);
fprintf(stdout, "%d ", dato);
}
}

void mostrar_cola(Cola *cola) {
tipo dato;

while(NULL != cola->primero) {
dato = quitar_a_cola(cola);
fprintf(stdout, "%d ", dato);
}
}
#31
Hola, muy buenas. Por razones que no vienen a cuento, puse que se vieran todos los archivos ocultos del sistema de Windows 8.1. Cuando hice esto, en el escritorio aparecieron varios archivos, pero ya me lo esperaba. Lo que no me esperaba es que dos de esos dos archivos tuvieran el mismo nombre, pero con tamaños diferentes. Entonces, la duda que se me presenta es, desde la consola, ¿cómo es posible referirse a uno de esos dos archivos en concreto?. Captura de pantalla de los dos archivos:



Sé que es una duda un poco tonta, pero tengo la curiosidad. Gracias de antemano
#32
Hola, muy buenas. La duda que tengo viene de que yo creía que una cadena en C++ (con std::string) se almacenaba en el heap (en el montón), pero con el código que voy a mostrar ahora parece que se almacena en la pila. Por eso pregunto, ¿std::string guarda la cadena en el heap o en la pila?

Código por el que pienso que una cadena se almacena en la pila
Código (cpp) [Seleccionar]
#include <iostream>
#include <string>
#include <memory>

int main() {
std::string cadena = "Hola";
const char *cadena_c = (const char *)(addressof(cadena));
unsigned int i = 0;

std::cout << std::hex;
for(i = 0; i < sizeof(cadena); i++)
std::cout << (unsigned int)cadena_c[i] << " - " << cadena_c[i] << std::endl;

return 0;
}


Esta es la salida que obtengo con MinGW-w64 (resultado similar con g++ de Ubuntu):
10 - ►
fffffffe - ■
23 - #
0 -
0 -
0 -
0 -
0 -
4 - ♦
0 -
0 -
0 -
0 -
0 -
0 -
0 -
48 - H
6f - o
6c - l
61 - a
0 -
ffffffff -  
ffffffff -  
ffffffff -  
fffffff5 - §
18 - ↑
40 - @
0 -
0 -
0 -
0 -
0 -


Como ven, se ve claramente que está en la pila (al menos yo lo veo así, quizás me equivoque).

Si se almacena en la pila, es raro porque según la página de cplusplus, incluso el constructor lanza una excepción si falla a la hora de asignar memoria. Que yo sepa, el stack ya lo tenemos asignado...

A bad_alloc exception is thrown if the function fails when attempting to allocate storage.

Espero que me puedan aclarar la duda :D Muchas gracias de antemano
#33
Hola, muy buenas. Hoy quería poner una solución que quizás no se haya tenido en cuenta. Por ejemplo, es una solución para los problemas como: ¿por qué a veces cuando leo datos de la consola se salta alguna toma de datos? Bueno, la respuesta a eso es que probablemente al introducir datos en algún paso anterior, se han introducido datos de más y esos datos están esperando a salir, por lo que en la siguiente toma de datos, se toman datos del paso anterior.

Bueno, entonces, la solución que he descubierto (yo no la conocía) es usar el método std::istream::sync. Lo que hace este método es sincronizar el búfer interno en el que se almacenan esos datos de pasos anteriores con la toma de datos actual. Entonces, lo que habría que hacer es colocar ese método antes de cualquier toma de datos:

Código (cpp) [Seleccionar]
#include <iostream>

int main() {
// Aquí llenaremos el búfer de datos innecesarios para demostrar el uso de std::cin.sync
std::cout << "Introduzca datos: ";
std::cin.get();

// ... Código

std::cout << "Introduzca datos de nuevo: ";
std::cin.sync();
// Pedimos un carácter y lo imprimimos:
std::cout << (char)std::cin.get();

return 0;
}


Este código tendría la siguiente salida (en este ejemplo):
Introduzca datos: aaaaaaaaaaaaaaaaa
Introduzca datos de nuevo: r
r


Como ven, a pesar de haber llenado el búfer con el carácter 'a', se ha impreso el último carácter leído. Eso demuestra que funciona. Lo que no me queda del todo claro es cómo funciona este método, así que quizás sea ineficiente o algo por el estilo.

Sabiendo esto, ¿alguien sabe si usar todo el rato std::istream::sync tiene algún inconveniente? Gracias!
#34
Hola, muy buenas. Estoy mirando un poco sobre C++, aunque esté centrado en C, por diversión, cuando de repente me fijé en que se podría sobrecargar el operador de & (operador para sacar la dirección de una variable/objeto). Entonces, la duda es, si una clase tiene sobrecargada el operador &, ¿cómo puedo sacar la dirección de esa clase? La única manera que se me ocurre es hacer un método que retorne 'this', pero debería haber otra manera, ¿no?

Código de ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>

class Foo {
public:
int operator &();
};

int main() {
Foo foo;

std::cout << &foo << std::endl;

return 0;
}

int Foo::operator &() {
return 5;
}


La salida, efectivamente será:
5

Muchas gracias
#35
Hola, me preguntaba si se puede pasar argumentos nulos a las funciones fscanf para que se ignore tal argumento.

Código de ejemplo donde se ilustra como ignorar una línea. Solo funcionaría si se pueden pasar argumentos nulos:

#include <stdio.h>

int main() {
       fscanf(stdin, "%s[^'\n']", NULL);
       fprintf(stdout, "Linea ignorada");

       return 0;
}


Esto lo he probado bajo Linux (Debian) y me ha funconado sin que se produzcan errores. Eso si, el compilador me ha advertido. Lo que no sé si es estándar o me ha funcionado de casualidad.

P.D.: En el caso que esto no funcione como debiera, ¿hay alguna forma de que fscanf ignore lo que yo quiera?

Muchas gracias
#36
Hola, muy buenas. Ante todo gracias por pasarlos, y por leer mi duda. El problema que tengo es con el siguiente código:

void funcion(const char * const * cadenas) {
cadenas = 0xFFFFFFFF;
}


Si yo compilo este código, no me dará un error como tal (simplemente una advertencia). Lo que me resulta raro es que si este código compila, significa que el último puntero es el que está tomando prioridad, porque el const opera sobre lo que tiene a su izquierda (a no ser que esté a la izquierda del todo, que en cuyo caso, opera sobre lo que tiene a la derecha). Es decir:

void funcion(const char * const * cadenas)
              ^


Este const opera sobre el char

void funcion(const char * const * cadenas)
                       ^   ^


Este const opera sobre el puntero señalado

Entones de esto deducimos que el único puntero no constante es el último. Al poder modificar en la función el valor del puntero dado, eso quiere decir que el último puntero es el que está tomando prioridad, mientras que debería tomar prioridad el primer puntero, es decir, este:

void funcion(const char * const * cadenas)
                       ^


La duda final podría ser: por lo visto no entiendo/sé muy bien las reglas de prioridad, porque yo creía que al ser el mismo operador (*), tenía prioridad el de más a la izquierda, pero según lo expuesto, y en este caso, tiene más prioridad el de más a la derecha...
#37
Hola, muy buenas. No estoy seguro de por qué pasa el problema, así que os vengo a preguntar. El caso es que vi una pregunta en este foro sobre C y quise crear un código para ver si yo sería capaz de hacerlo (tengo que hacer ejercicios xD). El caso es que el programa parece que realiza su cometido salvo por un aspecto: al final, al imprimir el resultado, a parte de imprimirse el resultado, se imprime un carácter de fin de archivo (0xFF o -1). Código:

#include <string.h>
#include <limits.h>
#include <stdio.h>
#include <ctype.h>

void get_longest_prefix(char dest[], char *strings[], unsigned int num_strings);

int main() {
char *strings[3][2] = {{"Planeta", "Platano"}, {"planetoide", "Platino"}, {"planetario", "Placenta"}};
char result[16];

get_longest_prefix(result, (char **)strings, sizeof(strings)/sizeof(char *));

/*unsigned int i;
for(i = 0; i < 16; i++)
fprintf(stdout, "%u\n", result[i]);*/

fprintf(stdout, "Longest common prefix: %s", result);

fgetc(stdin);
return 0;
}

void get_longest_prefix(char dest[], char *strings[], unsigned int num_strings) {
// No pongo el contenido de la función para no spoilear al que preguntó sobre  el ejercicio xD
}


Salida:
Longest common prefix: pla _
NOTA: El guión simboliza el guión de la consola, eso no se imprime por el programa

Dense cuenta de que se imprime un espacio entre el último carácter y el guión de la consola.

Lo más extraño de todo es que si descomento el fragmento de código que me muestra la cadena en su valor numérico, este carácter de fin de archivo no se imprime. Si descomento el fragmento la salida queda:

112
108
97
0
0
0
0
0
5
0
0
0
0
0
0
0
Longest common prefix: pla_


Como ven, ahora no hay espacio entre la última a y el guión.

_______________________
NOTA ACLARATORIA. Sé que es un carácter de fin de archivo porque copié de la consola el carácter y lo pegué en un documento con la misma codificación que la consola (OEM-850), y luego abrí el archivo con HxD (visor hexadecimal) y vi que el carácter era 0xFF
#38
Hola, muy buenas. Resulta que estaba haciendo un test sobre C que había en Internet y me encontré con la siguiente pregunta:

Cita de: http://www.indiabix.com/¿Cuál será la salida del siguiente programa?

#include<stdio.h>
int main()
{
   int i=0;
   for(; i<=5; i++);
       printf("%d", i);
   return 0;
}

Les animo a descubrir la trampa xD
#39
Hola, muy buenas. Primero quiero aclarar que ya sé que este no sea el foro más adecuado para preguntar cosas sobre este programa, pero creo que serán capaces de responder :D

La duda es la siguiente: yo estoy escribiendo un documento relativamente largo, por lo que le puse un índice (es un índice manual, es solo texto). Lo que quiero hacer es que cuando exporte ese documento a PDF, este tenga disponible un índice o "tabla de contenidos" para poder saltar a esa sección del documento.

¡Muchas gracias!
#40
Hola, muy buenas. Quería preguntar en base al siguiente código:

#include <stdio.h>

int main() {
char cadena[16];

fscanf(stdin, "%s[^16]", cadena);
fprintf(stdout, cadena);

return 0;
}


En este código, uso %s[^16] para delimitar los caracteres que puede tener la cadena, pero al probar este código y probando con cadenas mayores a 16 caracteres, el programa me daba error de segmentation fault (me lo ha dicho el debugger del MinGW-w64). Esto me lleva a la siguiente pregunta: ¿usar esta manera para delimitar los caracteres es ANSI, o solo está disponible para solo ciertos compiladores?

Gracias :D
#41
Hola, muy buenas. Os traigo una pregunta que me intriga demasiado. Tengo esta función:

void ignore_line(FILE *file) {
if(NULL != file) {
fprintf(stdout, "Ignoring line...");
while(0 == feof(file) && '\n' != fgetc(file));
/* Null instruction */;
fprintf(stdout, "[OK].\n");
}
}


Pues resulta que al cabo de algunos usos me tira un segmentation fault (lo sé por el depurador de MinGW-w64). Esta es parte de la consola:

Ignoring line...[OK].
Ignoring line...[OK].
Ignoring line...[OK].
Ignoring line...[OK].
Warning: unrecognized command 'que'.
Material file name: material.mtl.
This model loader is not complete.
Ignoring line...[OK].
Warning: unrecognized command 'map_Ka'.
Material file name: material.mtl.
This model loader is not complete.
Ignoring line...[OK].
Ignoring line...
Program received signal SIGSEGV, Segmentation fault.
0x00007fffe971c49d in msvcrt!feof () from C:\WINDOWS\system32\msvcrt.dll


Como veis, hay un 'Ignoring line...' que no tiene su OK, por lo que tiene que ser en esta función donde se produce el error. También podéis observar que ya se había usado esta función sin que diera errores.



____________________________________________________
Nota posiblemente irrelevante:

Creo que el error se produce en esta parte del archivo:
# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware
# File Created: 13.12.2013 19:23:54

newmtl Material__29
Ns 10.000000
Ni 1.500000
d 1.000000
Tr 0.000000
Tf 1.000000 1.000000 1.000000
illum 2
Ka 0.588000 0.588000 0.588000
Kd 0.588000 0.588000 0.588000
Ks 0.000000 0.000000 0.000000
que 0.000000 0.000000 0.000000
map_Ka C:\Users\kakamaka\Desktop\TurboSquid\Minecraft\SabieDiamant\Textures\Blue5.png
map_Kd C:\Users\kakamaka\Desktop\TurboSquid\Minecraft\SabieDiamant\Textures\Blue5.png
"<<<<< AQUÍ. LA PARTE ENTRECOMILLADA NO ESTÁ EN EL ARCHIVO"
newmtl Material__27



Espero que haya dado todos los datos relevantes y que me puedan ayudar... Muchas gracias :DD
#42
Hola. Quería preguntar si el hecho de que un arreglo se apunte a si mismo es coincidencia o es una característica de ANSI C, es decir, la dirección del arreglo y la dirección a la que apunta el arreglo es la misma (al menos eso me pasa con MinGW-w64).

int arreglo[4];

if(arreglo == &arreglo) { // Siempre me da 'true'
    ...
}


Gracias
#43
Hola, hoy tengo una duda que me gustaría solventar.

¿ANSI C nos asegura que cuando un programa que finaliza bruscamente (con return en la función main), el programa libera la memoria dinámica, o eso solo ocurre dependiendo del sistema operativo?

Espero que se comprenda mi duda. Muchas gracias.
#44
Hola, muy buenas. Para entender la duda, primero hay que mirar el trozo de código:

GLchar *(source[1]);

La duda que se me presenta es: ¿por qué la variable 'source' es un arreglo a punteros?

Digo por qué afirmo esto:
Si hago la siguiente asignación con el código de antes no me da error:
source[0] = data;

Pero si hago esta asigación con la variable creada con
GLchar (*source)[1];

Si que me da error. Más concretamente, el siguiente error:
error: assignment to expression with array type source[0] = data;

Les agradezco su ayuda. Estoy trabajando en C y a veces es un lío xD
#45
Hola, muy buenas. Me gustaría saber cómo eliminar una carpeta en Windows. Al intentar eliminarla, sea con el típico 'Delete' o a través de la consola (con rmdir /q /s) no puedo eliminar una carpeta llamada Windows Journal.

Esta carpeta es de un programa preinstalado en Windows 8.1. No quiero esa aplicación en mi equipo, aunque pese poco, no la quiero porque es mi equipo. Digo todo esto para que no me pidan explicaciones de por qué quiero eliminarla.

He probado a ejecutar la consola con permisos de administrador pero aun así no funciona. Todo el rato me dice acceso denegado. También he intentado modificar los permisos de la carpeta, y aun siendo administrador, se supone que no puedo modificarlos. Aquí hay una captura:


(Siento si la imagen se cae...)

Lo curioso es que puedo CORTAR la carpeta a donde yo quiera (excepto a unidades extraibles, como no xD)

De verdad, no me gusta que siendo administrador, no pueda hacer algo tan trivial como eliminar un programa que no me gusta...

Muchas gracias