"Inicializadores Designados" (espero que sea una traducción aceptable).
He buscado tanto acerca de este tema y son tan escasas las referencias que vale la pena publicar una.
En Ansi C tenía el siguiente problema:
Necesito una estructura (struct) con algunos de sus miembros constantes:
struct
{
int valor;
const int constante1;
const int constante2;
} mi_estructura;
El estándar no permite la inicialización de los elementos de una estructura, osea, si quiero que mis constantes sean 4 y 6:
struct
{
const int constante1 = 4;
const int constante2 = 6;
int valor;
} mi_estructura;
NO ESTA PERMITIDO
Buscando encontré la forma de inicializar los miembros de struct. Entonces para hacer lo anterior correctamente sería:
struct
{
const int constante1;
const int constante2;
int valor;
} mi_estructura = { 4, 6 };
PERMITIDO
Listo, ya hay una forma de hacerlo. Pero, aun no me gusta. La lista depende del orden en que coloco las variables miembro de struct. ¿que tal si muevo "int valor" al principio de la lista? ¿o si agrego una nueva variable? ¿o quito alguna?. Cuando lo haga debo ser muy cuidadoso en rehacer la lista de inicialización para respetar el nuevo orden (cuando alguien mas le haga mantenimiento a tu código después de tiempo, es MUY deseable que esto quede claro).
La solución (que escasamente pude encontrar) los "inicializadores designados" ("designed initializers"). Había sido tan simple como etiquetar cada elemento de la lista de inicialización anterior (un estilo muy similar a "enum"):
struct
{
const int constante1;
const int constante2;
int valor;
} mi_estructura = { .constante2 =6, .constante1=4 };
PERMITIDO
Ahora si está mucho mejor. Quien le de mantenimiento a mi código debe fijarse solo en que el elemento constante de la estructura tenga su inicializador en la lista. Ya no debe preocuparse del orden y ni de una posible asignación errónea de valores.
Aún me gustaría evitar la edición en dos lugares, pero parece que es lo mejor que el estándar del C puede dar.
Algunas de mis aventuras con la computadora y afines. Cosas que espero les sirvan a otros como a mi me sirvieron
jueves, 25 de octubre de 2012
Designated Initializers
Etiquetas:
ansi,
c,
const,
designated initializer,
inicializador,
list,
struct
viernes, 13 de abril de 2012
ubuntu temp
gracias a TeoBigusGeekus en http://ubuntuforums.org/showthread.php?t=1688948&page=2
A continuacion una transcripcion de su aporte:
1)Open flash video page (that you own of course) and let it load. Don't close the page.
2)Open terminal and give
code:
lsof | grep Flash
lsof: list open files
In my case (opera user) it gives
code:
operaplug 2840 teo 9u REG 8,8 6962837 392986 /tmp/FlashXXFfe85s (deleted)
Notice the 2nd (process id) and 4rth (file descriptor - without the letter) columns.
3)
code:
cp /proc/2840/fd/9 ~/Desktop/video
A continuacion una transcripcion de su aporte:
1)Open flash video page (that you own of course) and let it load. Don't close the page.
2)Open terminal and give
code:
lsof | grep Flash
lsof: list open files
In my case (opera user) it gives
code:
operaplug 2840 teo 9u REG 8,8 6962837 392986 /tmp/FlashXXFfe85s (deleted)
Notice the 2nd (process id) and 4rth (file descriptor - without the letter) columns.
3)
code:
cp /proc/2840/fd/9 ~/Desktop/video
lunes, 6 de febrero de 2012
Repositorio local de ubuntu con archivos descargados
Esta entrada está dedicada a las PC con Ubuntu, sin conexión a internet pero que quieren usar el synaptics como si estuvieran conectados.
Hay muchas ayudas al respecto sueltas en la red, pero de todas las que revisé ninguna me funcionó bien. Así que me puse a tantear pequeñas variaciones hasta que una me funcionó y es la que les describiré a continuación: (aparentemente la falla de las ayudas que encontré se deben a una mala traducción y a errores de tipeo, asi que seré cuidadoso al respecto).
(probado con Ubuntu 11.04 Natty 64 bits)
1.- CONSEGUIR LOS ARCHIVOS DE REPOSITORIO (*.deb)
Bueno, para esta parte se necesitará irremediablemente internet, talvez de otra computadora con conexión y misma versión de ubuntu.
Las instalaciones hechas desde el synaptics guardan una copia de todas las dependencias descargadas y empleadas en la carpeta /var/cache/apt/archives.
Entonces, una PC a la que ya le hayan instalado el o los paquetes deseados via synaptics, tendrá todas las dependencias necesarias (archivos .deb) en esta carpeta.
Copien todo el contenido de esta carpeta (excepto la subcarpeta "partial" y el archivo "lock" que son solo de trabajo). Estos archivos serán su repositorio local.
2.- PREPARANDO A LA PC SIN INTERNET.
Creen una nueva carpeta en cualquier lugar, por ejemplo:
cd /home/$USER
mkdir misrepositorios
Dentro de esta carpeta creen otra (ahora si deben usar el nombre "Packages")
cd misrepositorios
mkdir Packages
Dentro de la carpeta Packages copien todos los archivos ".deb" que extrajeron de la otra PC.
3. PREPARANDO NUESTRO REPOSITORIO PARA SU USO
Ahora se creará el índice de nuestro repositorio local:
cd /home/$USER/misrepositorios/
dpkg-scanpackages Packages /dev/null | gzip > Packages/Packages.gz
Ahora se le indicará al synaptics donde buscar nuestra lista de repositorios:
sudo gedit /etc/apt/sources.list
En la parte final del archivo que se abrirá deberán añadir la línea: (¡¡respetar los espacios!!) (esta era otra fuente de error: la edición del archivo no acepta la variable "$USER", asi que aqui si hay que poner el usuario que corresponda a su pc. Si alguien sabe como usar variables en este archivo de texto, háganmelo saber)
deb file:/home/mi_usuario/misrepositorios/ Packages/
Guardan y cierran
Eso es todo. Si ahora le dan "recargar" al synaptics, leerá todos los repositorios de la carpeta como si lo estuvieran haciendo desde internet, y podrán hacer las instalaciones que deseen, siempre y cuando todas las dependencias hayan estado en su carpeta.
Hay muchas ayudas al respecto sueltas en la red, pero de todas las que revisé ninguna me funcionó bien. Así que me puse a tantear pequeñas variaciones hasta que una me funcionó y es la que les describiré a continuación: (aparentemente la falla de las ayudas que encontré se deben a una mala traducción y a errores de tipeo, asi que seré cuidadoso al respecto).
(probado con Ubuntu 11.04 Natty 64 bits)
1.- CONSEGUIR LOS ARCHIVOS DE REPOSITORIO (*.deb)
Bueno, para esta parte se necesitará irremediablemente internet, talvez de otra computadora con conexión y misma versión de ubuntu.
Las instalaciones hechas desde el synaptics guardan una copia de todas las dependencias descargadas y empleadas en la carpeta /var/cache/apt/archives.
Entonces, una PC a la que ya le hayan instalado el o los paquetes deseados via synaptics, tendrá todas las dependencias necesarias (archivos .deb) en esta carpeta.
Copien todo el contenido de esta carpeta (excepto la subcarpeta "partial" y el archivo "lock" que son solo de trabajo). Estos archivos serán su repositorio local.
2.- PREPARANDO A LA PC SIN INTERNET.
Creen una nueva carpeta en cualquier lugar, por ejemplo:
cd /home/$USER
mkdir misrepositorios
Dentro de esta carpeta creen otra (ahora si deben usar el nombre "Packages")
cd misrepositorios
mkdir Packages
Dentro de la carpeta Packages copien todos los archivos ".deb" que extrajeron de la otra PC.
3. PREPARANDO NUESTRO REPOSITORIO PARA SU USO
Ahora se creará el índice de nuestro repositorio local:
cd /home/$USER/misrepositorios/
dpkg-scanpackages Packages /dev/null | gzip > Packages/Packages.gz
Ahora se le indicará al synaptics donde buscar nuestra lista de repositorios:
sudo gedit /etc/apt/sources.list
En la parte final del archivo que se abrirá deberán añadir la línea: (¡¡respetar los espacios!!) (esta era otra fuente de error: la edición del archivo no acepta la variable "$USER", asi que aqui si hay que poner el usuario que corresponda a su pc. Si alguien sabe como usar variables en este archivo de texto, háganmelo saber)
deb file:/home/mi_usuario/misrepositorios/ Packages/
Guardan y cierran
Eso es todo. Si ahora le dan "recargar" al synaptics, leerá todos los repositorios de la carpeta como si lo estuvieran haciendo desde internet, y podrán hacer las instalaciones que deseen, siempre y cuando todas las dependencias hayan estado en su carpeta.
Etiquetas:
repositorio local,
repositorios locales,
ubuntu
lunes, 2 de enero de 2012
detalles de compilacion de c++ en eclipse
Compilando en eclipse un programa hecho por otra persona en otra IDE se me presentaron los siguientes errores:
"multiple definition of _start"
el detalle en consola:
/build/buildd/eglibc-2.10.1/csu/../sysdeps/x86_64/elf/start.S:65: multiple definition of `_start'
Gracias a la publicación de Mario en un foro (http://stackoverflow.com/a/5528987) encontré la solución:
añadir el parametro -c a la compilación del g++ (en "other flags"). No volvió a aparecer el error.
Otro error que se me presentó a continuación:
" undefined reference to `pthread_create' "
a pesar de haberle añadido la opción -lpthread a la compilación con g++, me seguía arrojando el mismo error, hasta que caí en la cuenta que el eclipse trabaja por separado la compilación y el enlazado (link), así que el enlazado también debería incluir esta opción en "linker flags". Incluí de nuevo -lpthread en ese campo, y todo corrió perfecto.
Como siempre digo, aunque esta información es redundante, es mas fácil encontrarla en la web si está publicada en varios sitios y agrupada de forma distinta. Espero les sirva.
Saludos
"multiple definition of _start"
el detalle en consola:
/build/buildd/eglibc-2.10.1/csu/../sysdeps/x86_64/elf/start.S:65: multiple definition of `_start'
Gracias a la publicación de Mario en un foro (http://stackoverflow.com/a/5528987) encontré la solución:
añadir el parametro -c a la compilación del g++ (en "other flags"). No volvió a aparecer el error.
Otro error que se me presentó a continuación:
" undefined reference to `pthread_create' "
a pesar de haberle añadido la opción -lpthread a la compilación con g++, me seguía arrojando el mismo error, hasta que caí en la cuenta que el eclipse trabaja por separado la compilación y el enlazado (link), así que el enlazado también debería incluir esta opción en "linker flags". Incluí de nuevo -lpthread en ese campo, y todo corrió perfecto.
Como siempre digo, aunque esta información es redundante, es mas fácil encontrarla en la web si está publicada en varios sitios y agrupada de forma distinta. Espero les sirva.
Saludos
Etiquetas:
_start,
-c,
c++,
cdt,
compilacion,
cpp,
eclipse,
enlazado,
lpthread,
pthread_create
martes, 21 de junio de 2011
Instalar controlador/driver de tarjeta de video nvidia sin internet
Datos:
Procesador Core 2 duo
2GB RAM
tarjeta de video nvidia GeForce 7300 GT
Ubuntu 11.04
Procedimiento:
Hay muchas referencias al respecto en la web. Particularmente a mi me sirvió de base la siguiente: http://www.ubuntu-es.org/node/143352
Bueno, lo más directo es instalar el driver de nvdia usando "controladores adicionales" de ubuntu. Casi siempre funciona bien siempre y cuando haya conexión a internet.
Cuando no hay internet en la PC donde se desea empiezan los problemas, pero aquí están las soluciones.
1.- Descargar el driver de nvidia desde su página web: (obviamente será desde otra computadora que si tenga el acceso a internet)
http://www.nvidia.com/Download/index.aspx?lang=es
obtendrán un archivo de unos 50MB de un nombre similar a este: NVIDIA-Linux-x86_64-275.09.07.run
2.- Instalar los requisitos previos:
build-essential (ya viene por defecto en el ubuntu 11.04)
linux-headers (ya viene por defecto en el ubuntu 11.04)
ia32-libs (si se desea correr aplicaiones compatibles con 32bits como las de windows por ejemplo)
-Sobre como instalarlos sin internet será motivo de otro post o pregúntenmelo si es que aún no lo he hecho
3.- (En este paso algunos sugieren guardar una copia del archivo xorg.conf. Pero resulta que para versiones recientes de ubuntu este archivo ya está en desuso).
Si no se ha hecho, abrir una consola desde "accesorios" y crear la contraseña del usuario "root":
sudo passwd root
4.- Presionar CTRL+ALT+F1 para entrar en consola de texto (recuerden que pueden regresar a su entorno gráfico normal con CTRL+ALT+F7)
Logearse como root (para eso crearon la contraseña si es que no la tenían)
5.- Editar el archivo "blacklist.conf" con la siguiente linea de comandos:
sudo nano /etc/modprobe.d/blacklist.conf
Agregar en la parte final del archivo las siguientes lineas:
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv
CTRL+O (para guardar), Enter.
CTRL+X para salir.
6.- Detener el modo gráfico:
sudo service gdm stop
saldrá: gdm stop/waiting
7.- Desinstalar alguna posible instalación previa de algún driver de nvidia:
sudo apt-get --purge remove nvidia-*
8.- Ejecutar el instalador del driver que se descargaron de nvidia (en la ruta que lo guardaron claro)
sudo sh NVIDIA-Linux-x86_64-275.09.07.run
Entrarán a un diálogo de instalación en modo texto, hay que darle "si/aceptar" a todo.
El detalle es que en la primera ejecución de esta aplicación siempre me sale algo como que "el driver nouveau se está ejecutando aún pero que el instalador de nvidia intentará desactivarlo agregando un archivo especial". Se le da aceptar. Internamente el archivo será agregado pero saldrá un mensaje en el instalador diciendo "la instalación del driver ha fallado". No hay problema, hasta este punto ha hecho lo correcto, desactivar el "nouveau", ahora solo debemos reiniciar el sistema:
sudo shutdown -r now
9.- De nuevo entrarán al modo gráfico pero esta vez se verá un tanto diferente porque ya está deshabilitado el driver que impedía la instalación.
De nuevo CTRL+ALT+F1 para entrar en texto, se logean como root.
De nuevo detienen el modo gráfico:
sudo service gdm stop
De nuevo ejecutan el instalador de nvidia descargado:
sudo sh NVIDIA-Linux-x86_64-275.09.07.run
Y esta vez ya no motrará ningún inconveniente para proceder con la instalación. Dar "si/aceptar" a todas las pantallas (si instalaron ia32-libs denle también "aceptar" a la compatibilidad con 32bits cuando el instalador se los pregunte)
LISTO, cuando el instalador terminen de nuevo reinician:
sudo shutdown -r now
Y ya tendrán el driver de nvidia instalado junto con el administrador de configuraciones de pantalla "nvidia-settings".
NOTA: No se preocupen si "controladores adicionales" del ubuntu muestra su tarjeta como inactiva. En realidad está activa sino que esta aplicación no se ha enterado de que lo está.
Pueden comprobarlo con el comando:
glxinfo | grep rendering
si el resultado es: direct rendering: Yes
entonces la aceleración 3D de la tarjeta está activada.
otras fuentes:
ftp://download.nvidia.com/XFree86/Linux-x86/169.04/README/chapter-08.html
https://help.ubuntu.com/6.06/ubuntu/desktopguide/C/hardware.html
Procesador Core 2 duo
2GB RAM
tarjeta de video nvidia GeForce 7300 GT
Ubuntu 11.04
Procedimiento:
Hay muchas referencias al respecto en la web. Particularmente a mi me sirvió de base la siguiente: http://www.ubuntu-es.org/node/143352
Bueno, lo más directo es instalar el driver de nvdia usando "controladores adicionales" de ubuntu. Casi siempre funciona bien siempre y cuando haya conexión a internet.
Cuando no hay internet en la PC donde se desea empiezan los problemas, pero aquí están las soluciones.
1.- Descargar el driver de nvidia desde su página web: (obviamente será desde otra computadora que si tenga el acceso a internet)
http://www.nvidia.com/Download/index.aspx?lang=es
obtendrán un archivo de unos 50MB de un nombre similar a este: NVIDIA-Linux-x86_64-275.09.07.run
2.- Instalar los requisitos previos:
build-essential (ya viene por defecto en el ubuntu 11.04)
linux-headers (ya viene por defecto en el ubuntu 11.04)
ia32-libs (si se desea correr aplicaiones compatibles con 32bits como las de windows por ejemplo)
-Sobre como instalarlos sin internet será motivo de otro post o pregúntenmelo si es que aún no lo he hecho
3.- (En este paso algunos sugieren guardar una copia del archivo xorg.conf. Pero resulta que para versiones recientes de ubuntu este archivo ya está en desuso).
Si no se ha hecho, abrir una consola desde "accesorios" y crear la contraseña del usuario "root":
sudo passwd root
4.- Presionar CTRL+ALT+F1 para entrar en consola de texto (recuerden que pueden regresar a su entorno gráfico normal con CTRL+ALT+F7)
Logearse como root (para eso crearon la contraseña si es que no la tenían)
5.- Editar el archivo "blacklist.conf" con la siguiente linea de comandos:
sudo nano /etc/modprobe.d/blacklist.conf
Agregar en la parte final del archivo las siguientes lineas:
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv
CTRL+O (para guardar), Enter.
CTRL+X para salir.
6.- Detener el modo gráfico:
sudo service gdm stop
saldrá: gdm stop/waiting
7.- Desinstalar alguna posible instalación previa de algún driver de nvidia:
sudo apt-get --purge remove nvidia-*
8.- Ejecutar el instalador del driver que se descargaron de nvidia (en la ruta que lo guardaron claro)
sudo sh NVIDIA-Linux-x86_64-275.09.07.run
Entrarán a un diálogo de instalación en modo texto, hay que darle "si/aceptar" a todo.
El detalle es que en la primera ejecución de esta aplicación siempre me sale algo como que "el driver nouveau se está ejecutando aún pero que el instalador de nvidia intentará desactivarlo agregando un archivo especial". Se le da aceptar. Internamente el archivo será agregado pero saldrá un mensaje en el instalador diciendo "la instalación del driver ha fallado". No hay problema, hasta este punto ha hecho lo correcto, desactivar el "nouveau", ahora solo debemos reiniciar el sistema:
sudo shutdown -r now
9.- De nuevo entrarán al modo gráfico pero esta vez se verá un tanto diferente porque ya está deshabilitado el driver que impedía la instalación.
De nuevo CTRL+ALT+F1 para entrar en texto, se logean como root.
De nuevo detienen el modo gráfico:
sudo service gdm stop
De nuevo ejecutan el instalador de nvidia descargado:
sudo sh NVIDIA-Linux-x86_64-275.09.07.run
Y esta vez ya no motrará ningún inconveniente para proceder con la instalación. Dar "si/aceptar" a todas las pantallas (si instalaron ia32-libs denle también "aceptar" a la compatibilidad con 32bits cuando el instalador se los pregunte)
LISTO, cuando el instalador terminen de nuevo reinician:
sudo shutdown -r now
Y ya tendrán el driver de nvidia instalado junto con el administrador de configuraciones de pantalla "nvidia-settings".
NOTA: No se preocupen si "controladores adicionales" del ubuntu muestra su tarjeta como inactiva. En realidad está activa sino que esta aplicación no se ha enterado de que lo está.
Pueden comprobarlo con el comando:
glxinfo | grep rendering
si el resultado es: direct rendering: Yes
entonces la aceleración 3D de la tarjeta está activada.
otras fuentes:
ftp://download.nvidia.com/XFree86/Linux-x86/169.04/README/chapter-08.html
https://help.ubuntu.com/6.06/ubuntu/desktopguide/C/hardware.html
lunes, 20 de junio de 2011
/usr/bin/install: no se sobreescribirá el fichero «/usr/include/simgear/scene/tgdb/SGOceanTile.hxx» recién creado con «SGOceanTile.hxx»
Datos:
Ubuntu 11.04
instalando mi compilación de Simgear 1.9.1
Error:
Al ejecutar sudo make install sale:
/usr/bin/install: no se sobreescribirá el fichero «/usr/include/simgear/scene/tgdb/SGOceanTile.hxx» recién creado con «SGOceanTile.hxx»
make[4]: *** [install-includeHEADERS] Error 1
Solución:
Editar el archivo /SimGear-1.9.1/simgear/scene/tgdb/Makefile.am
Se puede usar un comando similar a este:
sudo gedit ./SimGear-1.9.1/simgear/scene/tgdb/Makefile.am
podrán comprobar que la línea 13 y la línea 17 llaman al mismo archivo. Borren una de las dos líneas, cualquiera la que menos les guste.
Guardan, cierran. Limpian toda la compilación:
sudo make distclean
Y vuelven a compilar todo desde el principio como si recién hubieran descargado el código fuente (autogen, configure, make...)
Ubuntu 11.04
instalando mi compilación de Simgear 1.9.1
Error:
Al ejecutar sudo make install sale:
/usr/bin/install: no se sobreescribirá el fichero «/usr/include/simgear/scene/tgdb/SGOceanTile.hxx» recién creado con «SGOceanTile.hxx»
make[4]: *** [install-includeHEADERS] Error 1
Solución:
Editar el archivo /SimGear-1.9.1/simgear/scene/tgdb/Makefile.am
Se puede usar un comando similar a este:
sudo gedit ./SimGear-1.9.1/simgear/scene/tgdb/Makefile.am
podrán comprobar que la línea 13 y la línea 17 llaman al mismo archivo. Borren una de las dos líneas, cualquiera la que menos les guste.
Guardan, cierran. Limpian toda la compilación:
sudo make distclean
Y vuelven a compilar todo desde el principio como si recién hubieran descargado el código fuente (autogen, configure, make...)
Suscribirse a:
Entradas (Atom)