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 - SARGE553413

#1
Hola a todos.

Tengo que acceder a los registros de la UART del puerto com1 mediante ensamblador, trabajo con C++ builder en windows 98.

Lo primero que hago es conseguir la dirección del COM1 leyendo de la zona BIOS, consigo la dirección de memoria 0x3F8, que entiendo que es la dirección base de la UART del COM1.

Con esta dirección base, usando distintos desplazamientos, accederé a los registros de la UART, ¿es correcto?

Mi problema es que al intentar hacer esto, obtengo un error:

raised Exception class EAccessViolation with message 'Access violation at address 00401300. Read of address FFFFFFFF'

Esto es lo que he intentado:


[...]
asm{
   push es;
   mov ax, 3f8h;
   mov es, ax;          //ERROR
   mov ax, es:[0h]
}
[...]


También he intentado acceder a esa posición de memoria de más formas, usando el registro bx, escribiendo directamente la dirección (literal) pero no consigo acceder, siempre el mismo error:

raised Exception class EAccessViolation with message 'Access violation at address 00401300. Read of address FFFFFFFF'


 
#2
Hola a todos.

Necesito crear una librería dinámica escrita en C++ , pero necesito crear versiones tanto para windows como para linux (.DLL y .so).

Actualmente estoy desarrollándola en windows usando mingw.

Se generar el DLL pero no el .so, como puedo hacerlo? Gracias.
#3
Programación C/C++ / Duda con extern "C"
2 Febrero 2015, 11:20 AM
Hola a todos.

Tengo una duda respecto a extern "C", entiendo lo que hace y como funciona, es para forzar el linkado de C aun cuando se intenta compilar en c++.

Mi pregunta es exactamente para qué o en qué situaciones se requiere hacer esto. La única utilidad que le veo es  que los nombres no estén "mangled" a la hora de crear y usar un dll con dichas funciones.

¿Alguien me puede explicar en qué situaciones se debe usar, y por qué/qué problema evita?

Saludos, gracias.
#4
Redes / Problema con Wake on lan [SOLUCIONADO]
21 Diciembre 2014, 20:50 PM
Hola a todos.

Estoy intentando activar el wake on lan en mi pc, para ello de momento envío los magic packets por la red local interna.

En casa tengo 3 PCs, uno de ellos es desde el que mando los magic packets, para los otros 2:

Ya he activado la opción del wake on lan en la BIOS.
Ambos tienen IPs estáticas.
Para mandar los magic packets utilizo WakeMeOnLan.

El problema es que con uno de los 2 PCs ya he conseguido encenderlo, pero el otro no y no entiendo el por qué. El que NO funciona tiene una placa base Asus p5nsli, insisto en que ya he activado el wake on lan en la BIOS.

Ya he probado a encenderlo, mandarle el magic packet y verlo con el wireshark, por eso se que el PC recibe los magic packets.

He probado con 2 IPs de broadcast, 192.168.0.255 y 255.255.255.255.

Para encender remotamente el PC que sí puedo encender, tengo que enviarle varios magic packets (le envío 100). Para el PC que me da problemas he probado a enviarle 1, 100 y 1000.

Nada de lo anterior funciona. ¿Qué puedo hacer?
Saludos, gracias.

EDITO: [SOLUCIONADO]
Ya he encontrado el problema. Además de activar el WOL en la BIOS hay que hacerlo también dentro de las propiedades del adaptador de red. Estas propiedades están en administrador de dispositivos. Ahí buscar el adaptador de red, doble click y avanzadas.
Saludos.
#5
Redes / Problema con red local [SOLUCIONADO]
21 Diciembre 2014, 19:14 PM
Hola a todos.

Tengo un problema con una red local, supongamos que tenemos un pc A (windows 8.1) y otro B (windows 7):

La IP de A es dinámica, no puedo ponerla estática porque al intentar configurarla me da error "Para configurar TCP/IP debe instalar y habilitar una tarjeta adaptadora de red", pero la miro con ipconfig.

Ambos PCs tienen conexión a internet.

IP de A ahora mismo: 192.168.0.195
IP de B siempre: 192.168.0.2

Mi problema es que B ve a A, pero A no ve a B.
Puedo hacer ping de B a A, y de A a sí mismo pero no de A a B. Ya he creado excepciones de entrada y salida para la IP de B, y he probado a deshabilitar el firewall y nada.

¿Qué puede estar pasando?

Saludos, gracias.

EDITO: Ya he conseguido ponerle IP estática al PC A.
Puerta de enlace: 192.168.0.1
PC A: 192.168.0.3 | Máscara: 255.255.255.0
PC B: 192.168.0.2 | Máscara: 255.255.255.0

(*)También he activado en el firewall "Archivos e impresoras compartidos  (petición eco: ICMPv4 de entrada)"

EDITO 2: [SOLUCIONADO]
Ye está hecho, el problema era que la regla de firewall mencionada anteriormente(*) no la había activado en el PC B, solo en el A.
#6
Hola a todos. Estoy desarrollando una aplicación en la que, entre otras cosas, tengo que leer y escribir por el puerto seria. Para ello uso la WinAPI.

No consigo configurar bien los timeouts (SetCommTimeouts), yo lo que quiero es que si al intentar leer del puerto serie no hay nada, éste espere un tiempo razonable (500 ms, 1 sec.) y luego continúe con la ejecución.

He leído la documentación de microsoft, y lo que entiendo es:

- El ReadIntervalTimeout es el tiempo max. que transcurre desde que llega un byte hasta que llega el siguiente.

- El ReadTotalTimeoutMultiplier: en cada operación de lectura, la cantidad de bytes a leer se multiplica por este valor. No entiendo para que sirve esto.

- El ReadTotalTimeoutConstant: este valor se suma al resultado de multiplicar el número de bytes a leer por el ReadTotalTimeoutMultiplier. No entiendo para que sirve esto.

De lo mencionado, ¿hay algo correcto?

¿Qué valores debo dar a las variables anteriores para tener por ej. 500 milisegundos de timeout en total?

Saludos, gracias.



#7
Hola a todos.

Estoy haciendo una clase en C++ con funcionalidad para leer y escribir de distintas maneras en el puerto serie (con la Win32 API).
Como no tengo nada que use puerto serie, para hacer las pruebas estoy usando un emulador de puertos serie (com0com).

Estoy intentando implementar un método que lea todo lo que hay actualmente en el buffer del puerto serie, y si no hay nada, que no se quede bloqueado esperando.

He intentado hacerlo con OVERLAPPED pero, aparte de que no me ha funcionado, no me gusta la idea de tener que lanzar un hilo cada vez que quiero hacer esta opración.

Aquí el código que he escrito:

port = CreateFile(
string2LPCTSTR(this->portName), //\\\\.\\COM4"
GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // default security attributes
OPEN_EXISTING,
0,
NULL
);
if (port == INVALID_HANDLE_VALUE)
throw SerialPortNativeIOException("Port value is INVALID_HANDLE_VALUE");

DCB portConfig;
if (GetCommState(port, &portConfig) == 0){
closeConnection();
this->port=INVALID_HANDLE_VALUE;
throw SerialPortNativeIOException("Error trying to get comm state");
}

setPortConfig(portConfig); //Esto simplemente asigna valores...

if(SetCommState(port, &portConfig)==0){
closeConnection();
this->port=INVALID_HANDLE_VALUE;
throw SerialPortNativeIOException("Error trying to set comm state");
}

setTimeoutConfig(); //Esto simplemente asigna valores...

if(SetCommTimeouts(port, &timeoutConfig)==0){
closeConnection();
this->port=INVALID_HANDLE_VALUE;
throw SerialPortNativeIOException("Error trying to set comm timeout config.");
}
this->connected=true;

...

std::string SerialPortNative::readExisting(){
ulong readBytes=0;
OVERLAPPED oR = {0};
oR.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(!ReadFile(this->port,this->buffer,READEXISTING_BUFFER_SIZE,&readBytes,&oR))
if(GetLastError() != ERROR_IO_PENDING)
throw SerialPortNativeIOException("Error reading from serial port");
return string(this->buffer,0,readBytes);
}


Al usar el método 'readExisting()' la lectura da error y no es ERROR_IO_PENDING, es el error con código 3 (ERROR_PATH_NOT_FOUND).

Ya he leído la documentación y ejemplos de msdn.microsoft y he googleado, pero no consigo hacerlo funcionar.

¿Qué puedo hacer? Gracias, saludos.
#8
Hola a todos.

Tengo que hacer un proyecto en python que sea compatible con la versión 2.7. hasta ahora usaba esta versión pero he llegado a un punto del código en el que me vendría genial poder usar @abstraclassmethod que solo está en la versión 3 en adelante.

Lo que quiero hacer es, dentro del código, tener en una variable la versión del intérprete y, en función de si es mayor o menor que 3, hacer una cosa u otra.

Aquí un fragmento de código:

#dentro de ModuloA.py

__INTERPRETER_VERSION = float(sys.version.split(" ")[0])
if(__INTERPRETER_VERSION >= 3):
    from abc import abstractclassmethod

class AAA(object):
....
     if(__INTERPRETER_VERSION < 3):
        @classmethod
        def createPacket(cls, bArray, escaped):
            raise NotImplementedError("This method is not implemented in this class. See inheritance.")
    else:
        @abstractclassmethod
        def createPacket(cls, bArray, escaped):
            pass


El problema es que al ejecutar el código me dice que la variable _ModuloA__INTERPRETER_VERSION no está definida. Esto ya se que es por los dos guiones bajos.

Mis preguntas son:
1 - ¿Es buena idea hacer lo que estoy haciendo? ¿pongo simplemente la versión del 2.7 y ya está?

2 - ¿Cómo hago para definir una variable privada dentro del módulo y accederla dentro de las clases de dicho módulo?

Gracias, saludos.
#9
Hola a todos.

Tengo que usar la función BitBlt() en código C++/CLI. Lo he intentado de muchas formas y no consigo que funcione. Me da el error código 6 (invalid handle).
He leído bastantes posts etc. por internet, y para empezar veo que nadie que use esta función tiene que hacer un casting de IntPtr a HDC. Adjunto el código (comentado en inglés)


/*
1 - Get a bmp image from hard drive( i have it).

2 - Copy it to byte array, or get its internal array, i have tested both ways (method1 and method2 in comments).

3 - Prepare a PicutreBox and obtain from it my context device.

4 - Use BitBlt function to copy only first 50 lines of the initial bitmap.

5 - Display it in a windows form.
*/

#include "stdafx.h"
#include <Windows.h>
#include "MyForm.h"
#include "string.h"

using namespace System;
using namespace System::Runtime::InteropServices;
using namespace System::Runtime::CompilerServices;
using namespace System::IO;
using namespace System::Windows::Forms;
using namespace System::Drawing;
using namespace System::Drawing::Imaging;

using namespace ConsoleApplication1;

[DllImport("gdi32.dll", CallingConvention = CallingConvention::StdCall, SetLastError = true)]
extern bool BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight,
IntPtr hdcSrc, int nXSrc, int nYSrc, long dwRop);

int main(array<System::String ^> ^args){
Graphics ^gph = nullptr;
try{
//Get a test image and it's parameters
Bitmap ^image = gcnew Bitmap("./img/Simple_tux0.bmp");
int iWidth = image->Width;
int iHeigth = image->Height;
PixelFormat pxF = image->PixelFormat;


//Prepare a PictureBo, whici will be given as parameter to Windows Form.
PictureBox ^pb = gcnew PictureBox();
pb->SizeMode = PictureBoxSizeMode::StretchImage;
pb->Size = Drawing::Size(iWidth + 10, iHeigth + 10);
pb->Location = Drawing::Point(3, 3);

//Get bitmap
IntPtr prueba = image->GetHbitmap();

//Create my device context, where i will paint my lines.
gph = pb->CreateGraphics();
IntPtr deviceContext = gph->GetHdc();


//Paint only 50 lines of the source Bitmap.
BOOL b = BitBlt((HDC)deviceContext.ToPointer(), 0, 0, iWidth, 50,
(HDC)prueba.ToPointer(), 0, 0, SRCCOPY);

//Get the error:
unsigned long err = GetLastError();
Console::WriteLine("error: {0}", err); //error 6 : Invalid Handle

//Create windows form with the PictureBox to display my 50 lines.
MyForm ^f = gcnew MyForm(pb);
Application::Run(f);
Application::Exit();
}
finally{
if (gph != nullptr){
gph->ReleaseHdc();
delete gph;
}

}
return 0;
}


He intentado usar también esto:


[DllImport("coredll.dll", EntryPoint = "CreateCompatibleDC")]
extern IntPtr CreateCompatibleDC(IntPtr hdc);

[DllImport("coredll.dll", EntryPoint = "GetDC")]
extern IntPtr GetDC(IntPtr hwnd);

int main(){
//...
//...
IntPtr dc = GetDC(deviceContext);
IntPtr compDc = CreateCompatibleDC(dc);

//Paint only 50 lines of the source Bitmap.
BOOL b = BitBlt((HDC)compDc.ToPointer(), 0, 0, iWidth, 50,
(HDC)prueba.ToPointer(), 0, 0, SRCCOPY);


La primera pregunta que me surge es por qué yo tengo que hacer esto:

(HDC)deviceContext.ToPointer()

Y en todos los post que leo nadie lo hace.

Saludos, gracias.
#10
Hola a todos.

Tengo un método en C# que actualiza el contenido de un PictureBox que recibe como parámetro, algo así:

void fun(PictureBox pb){
   pb.Image = (Image)this.bitMap; //bitMap es un objeto Bitmap.
}

El caso es que esa función la uso de callback en un Timer, para ir cambiando la imagen cada cierto tiempo.
Si todo el código anterior lo meto en el mismo Windows.Form donde está el PictureBox todo va bien.
El problema es que quiero sacar todo ese código a otra clase, y usar esta clase desde mi Windows.Form. Es cuando hago esto cuando todo falla.

El error que me da es: Unexpected "Bitmap Region is already Locked".

He buscado bastante por internet y he intentado varias cosas:
1 - He probado con Timers.Timer y con Windows.Forms.Timer .
2 - He usado el keyword 'lock' en el método de callback.
3 - He leído algo de Invoke e InvokeRequired. PictureBox tiene el InvokeRequired a 'false' así que imagino que no tiene nada que ver con usar invoke.

¿Alguien sabe qué puedo hacer?

Gracias, saludos.
#11
Hola a todos, expongo mi problema:

Estoy desarrollando una aplicación en C# que controla una cámara y un motor con un espejo. La cámara siempre apunta al espejo. El espejo se va moviendo y así la cámara va viendo distintas cosas. Lo que tengo que hacer es:

Ir mostrando por pantalla las fotos que saca la cámara, 1 por 1, de manera que al final quede una especie de "vídeo". Son fotos de 1600x1200 píxels.

He buscado en google como hacerlo pero lo único que encuentro es como convertir una secuencia de imágenes en un fichero .avi o cosas así. Yo no tengo que convertirlo en un fichero, tengo que mostrar las imágenes en streaming para "ver lo que ve la cámara".

¿Cómo puedo hacerlo?

Saludos, Gracias.
#12
Scripting / Problema con Python en pydev
4 Octubre 2014, 13:08 PM
Hola a todos.

Estoy desarrollando un script python con pydev. Puede ejecutarlo normalmente, pero no debugearlo, la traza de lerror es:


pydev debugger: starting (pid: 1488)
Traceback (most recent call last):
 File "C:\No_congelada\eclipse\plugins\org.python.pydev_3.8.0.201409251235\pysrc\pydevd.py", line 2183, in <module>
   globals = debugger.run(setup['file'], None, None)
 File "C:\No_congelada\eclipse\plugins\org.python.pydev_3.8.0.201409251235\pysrc\pydevd.py", line 1622, in run
   pydev_imports.execfile(file, globals, locals)  # execute the script
 File "C:\No_congelada\eclipse\plugins\org.python.pydev_3.8.0.201409251235\pysrc\_pydev_imps\_pydev_execfile.py", line 11, in execfile
   stream = tokenize.open(file)
AttributeError: 'module' object has no attribute 'open'


He probado con un simple "hola mundo" y me da el mismo error al intentar debugear, aunque, denuevo, sí se puede ejecutar sin debug:

# -*- coding:utf-8 -*-
if __name__=="__main__":
   print("HELLO")


He probado a reinstalar eclipse y pydev y con dos intérpretes, en windows 8.1:
Python 3 64 bits
Python 2.7 32 bits

Nada funciona, ¿qué puedo hacer?
Gracias, saludos.
#13
Hola a todos.
Tengo un determinado texto con caracteres que van desde el 0 hasta el 255, codificados en ascii (al imprimir por pantalla salen muchos símbolos "raros")

Quiero guardar ese texto tal cual en un fichero, el problema es que al guardarlo y abrirlo con cualquier editor de texto me sale en una codificación distinta (no está disponible una "codificación ascii" para guardar)

¿Qué puedo hacer?

Gracias, saludos.

EDITO:
El texto a escribir es una contraseña cifrada. Creo que me valdría con, teniendo la cadena cifrada, codificarla con alguna codificación válida, pero no se cual usar.
Intento hacerlo con utf-8 y el error que me da es:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xb3 in position 0: ordinal not in range(128)
#14
Hola a todos.

Tengo un problema con un programa de C++. En un momento dado intento reservar memoria mediante el operador 'new', pero este lanza 'bad_alloc' y no entiendo por qué, ya que la cantidad de memoria que quiero reservar es relativamente baja para lo que tiene mi PC (3 GB).
Adjunto código, errores etc:

Cantidad de bytes (unsigned char) que intento reservar: 455282688 - 455,282,688 bytes

Datos extraídos del admin. de tareas durante el error:
Memoria física (KB)
Total: 3145068
Disponible: 1300596 - 1301394
Caché sistema: 1100432 (+ o -)

Mensaje de error por pantalla (con std::exception::what)
bad allocation

Código (indico el error):

...
typedef unsigned char uchar;
...

uchar* FrameLinkCamThread::getAttachedCapturedFrames(ulong &_totalSize){
ulong tSize=0;
for(uint i=0;i<this->numFramesCaptured;i++) tSize+=this->framesLegths[i];
uchar *res=NULL;
try{
res=new uchar[tSize];  //<==== Aquí esta el error
}catch(bad_alloc &e){
cout<<e.waht()<<endl;
char buff[256];
cin.getline(buff,256);
}
uint k=0;
for(uint i=0;i<this->numFramesCaptured;i++){
memcpy(&res[k],this->frames[i],this->framesLegths[i]);
k+=this->framesLegths[i];

}
_totalSize=tSize;
return res;
}


Nota: He intentado reservar en el main un vector igual que 'res' (que es el que da el error) y lo reserva sin problemas.

No entiendo cuál es el problema, ¿alguien puede ayudarme por favor?

Gracias, saludos.
#15
.NET (C#, VB.NET, ASP) / ¿Qué es este warning?
31 Agosto 2014, 19:07 PM
Hola a todos.

Estoy compilando un programa escrito en C++/CLI y me sale un warning que no entiendo:


a firma de un miembro no privado contiene un tipo privado de ensamblado de 'X'
vea la declaración de 'X'


No entiendo por qué sale este warning, por más que miro no veo ningún atributo ni método private que esté siendo usado como public.

¿Alguien sabe que ocurre?

Saludos, gracias.
#16
Hola a todos.

Hace poco, para instalar un programa que necesito, he tenido que reiniciar windows 8.1 con una determinada configuración.

Mi pregunta es como puedo cambiar las opciones de inicio del SO para que siempre se inicie con esa configuración.

Gracias, saludos.

PD: La configuración de inicio de la que hablo es la que permite instalar drivers "no seguros".
#17
Hola a todos. Escribo para comprobar si yo he entendido bien lo que son los destructores y los finalizadores en C++/CLI y cuál es su cometido.

Entiendo que el finalizador borra los recursos no administrados y el destructor borra los administrados y llama al finalizador (borra todo vamos).

Tengo dudas con variables estáticas y clases Singleton, expongo un pequeño ejemplo y me corregís.


ref class A{
public:
static A^ getInstance(){
if(INSTANCE==nullptr)
INSTANCE=gcnew INSTANCE();
return INSTANCE;
}

void destroyInstance(){
delete INSTANCE;
}

...
private:
int n;
char **c;
unsigned char *d;
String ^str;
Int32 ^intptr;
array<String^> ^aS;
Int32 num;

A(){
this->n=0;
this->c=new char*[10];
for(int i=0;i<10;i++) this->c[i]=new char[100];
this->d=new unsigned char[20];
this->str=gcnew String("A");
this->intptr=gcnew IntPtr();
this->aS=gcnew String^[100];
for(int i=0;i<100;i++) this->aS[i]=gcnew String();
this->num=1;
}

!A(){
for(int i=0;i<10;i++){
delete[] this->c;
this->c=NULL;
}
delete[] this->c;
this->c=NULL;
delete[] this->d;
this->d=NULL;
}

~A(){
this->!A();
delete this->str;
this->str=nullptr;
delete this->intptr;
this->intptr=nullptr;
for(int i=0;i<100;i++){
delete this->aS[i];
this->aS[i]=nullptr;
}
}
}


PD. Para recursos estáticos, tanto administrados como no, ¿exactamente igual?

Gracias, saludos.
#18
Hola a todos.

Estoy intentando hacer una clase con la funcionalidad básica (abrir,cerrar,leer,escribir) para manejar el puerto serie.
Esto es debido a que el puerto serie que tengo que usar lo genera "virtualmente" un programa y la clase SerialPort del .NET Framework no consigue ni abrirlo. (Pregunté en foros de microsof (msdn) y me dijeron que tenía que hacerlo con la WINAPI).

Tras hacer la clase y probarla, he conseguido abrir el puerto y cerrarlo bien. El problema es que no consigo leer ni escribir. En ambas operaciones, si hago "GetLastError()" el error resultante es 997, que según microsoft es: ERROR_IO_PENDING - Overlapped I/O operation is in progress.
(http://msdn.microsoft.com/en-us/library/windows/desktop/ms681388(v=vs.85).aspx)

NOTA: si llamo a las funciones de lectura / escritura con el parámetro LPOVERLAPPED como NULL, el código de error (GetLastError) es 87 (el parámetro es incorrecto), el mismo error que tuve cuando traté de usar la clase Net Framework SerialPort.

Adjunto el código de la clase (solo el cpp, el .h no lo veo necesario):

#include "StdAfx.h"
#include "SerialPort_WINAPI.h"

/*** Atributos constantes definidos en el .h ***/
const wchar_t *const SerialPort_WINAPI::DEFAULT_PORT_NAME = L"COM6";
static const wchar_t *const DEFAULT_PORT_NAME; //Inicializado en el cpp.
static const DWORD BAUD_RATE = 9600;
static const BYTE STOP_BITS = 1;
static const BYTE PARITY = 0; //0==None
static const BYTE DATA_BITS = 8;
static const DWORD HANDSHAKE = 0x00;

SerialPort_WINAPI::SerialPort_WINAPI(void){

}

SerialPort_WINAPI::~SerialPort_WINAPI(void){

}

SerialPortErr SerialPort_WINAPI::openConnection(){
port = CreateFile(SerialPort_WINAPI::DEFAULT_PORT_NAME, //\\\\.\\COM4"
GENERIC_READ | GENERIC_WRITE,
0,    // exclusive access
NULL, // default security attributes
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL
);
if (port == INVALID_HANDLE_VALUE)
return Create_File_Err;

if (GetCommState(port, &portConfig) == 0){
closeConnection();
return Get_Comm_State_Err;
}

initData();
if (SetCommState(port, &portConfig) == 0){
closeConnection();
return Set_Comm_State_Err;
}

if (SetCommMask(port, EV_DSR) == 0){ //EV_CTS | EV_DSR
closeConnection();
return Set_Comm_Mask_Err;
}

initOverlapped();
portEvents.hEvent = CreateEvent(
NULL,   // default security attributes
TRUE,   // manual-reset event
FALSE,  // not signaled
NULL    // no name
);

return Exit_Success;
};

void SerialPort_WINAPI::initData(){
portConfig.BaudRate = BAUD_RATE;
portConfig.fRtsControl = HANDSHAKE;
portConfig.Parity = PARITY;
portConfig.ByteSize = DATA_BITS;
portConfig.StopBits = STOP_BITS;
};

void SerialPort_WINAPI::initOverlapped(){
portEvents.Internal = 0;
portEvents.InternalHigh = 0;
portEvents.Offset = 0;
portEvents.OffsetHigh = 0;
};

SerialPortErr SerialPort_WINAPI::closeConnection(){
SetCommMask(port,0);
if (CloseHandle(port) == 0)
return Close_Err;
return Exit_Success;
};

SerialPortErr SerialPort_WINAPI::read(char *buffer,int length,LPDWORD read){
if(!ReadFile(this->port,buffer,length,read,&this->portEvents)){
return Read_Err;
}
}

SerialPortErr SerialPort_WINAPI::write(char *buffer,int nBytesToWrite,LPDWORD write){
if(!WriteFile(this->port,buffer,nBytesToWrite,write,&this->portEvents)){
return Write_Err;
}
}


Y aquí el main:

int main(){
SerialPort_WINAPI sp;
char readBuffer[128];
DWORD read;
char writeBuffer[10];
DWORD write;
for(int i=0;i<10;i++) writeBuffer[i]='a';

SerialPortErr err=sp.openConnection();
if(err!=Exit_Success){
cout<<"open: "<<(int)err<<endl;
return -1;
}else{
cout<<"Openned..."<<endl;
}

err=sp.write(writeBuffer,10,&write);
if(err!=Exit_Success){
cout<<"write: "<<GetLastError()<<endl;
}

err=sp.read(readBuffer,128,&read);
if(err!=Exit_Success){
cout<<"read: "<<GetLastError()<<endl;
}


err=sp.closeConnection();
cout<<"close: "<<(int)err<<endl;
return 0;
}


He estado intentando aprender a usar esta API para el puerto serie, pero aunque he leído algunos ejemplos etc. hay muchas cosas que no entiendo.
Por ej. : ¿OVERLAPPED sirve para añadir funciones de callback a distintos eventos del puerto serie, como leer o escribir?

Gracias y saludos.
#19
Hola a todos.

Tengo una duda con destructores en C++, y es que en todos los tutoriales que he leído, en el destructor se borran solo aquellas variables miembro que son punteros, y no entiendo del todo por que no se borran todas las demás variables. ¿Es porque las variables no punteros no se reservan  mediante 'new' y por ello se borran automáticamente?

Ej.

class A{

private:
 int n;
 char *c;

public:
 A(){
      this->n=0;
      this->c=new char[20];
 }

 ~A(){
      delete[] this->c;
      this->c=NULL;
     //¿delete this->n? <== ¿Hay que hacer esto?
  }
}


Gracias, saludos.

PD. El operador 'delete' es para variables que se reservaron con el operador 'new', y 'delete[]' para las que se reservan mediante 'new[]', ¿esto es cierto SIEMPRE?

#20
Programación C/C++ / Duda con volatile
5 Agosto 2014, 19:10 PM
Hola a todos.
He estado leyendo acerca de para que sirve este keyword (volatile). Lo que he entendido es que sirve para que el compilador no haga ciertas optimizaciones de tipo "ignorar variables que no van a cambiar". Por ej. si tenemos:


bool aux=false;
while(!aux){
  //Hacer cosas sin usar aux.
}


Lo que he entendido es que el compilador detecta que con 'aux' ya no se hace nada más y deja de hacer comparaciones con aux, o bien se da cuenta de que va ha hacer muchas comparaciones y lo mete en un registro de la CPU.

De tal manera que si tenemos el bucle anterior ejecutado por un hilo A  en background y otro hilo B pone 'aux' a cierto, el hilo A no "se entera" porque el compilador ha optimizado código para que deje de hacer comparaciones. (O si lo hace otro proceso, hardware ... )

Esta situación es la que soluciona el modificador "volatile".

Sin embargo lo he probado y ese problema anteriormente mencionado no ocurre, entonces ¿para qué sirve "volatile"?

Esta es la prueba que he hecho:


#include <thread>
#include <mutex>
#include <iostream>

using namespace std;

bool shouldStop;

void pr1();

int main(){
thread th(pr1);
th.detach();
this_thread::sleep_for(chrono::milliseconds(3000));
shouldStop = true;
char *c;
cin >> c;
return 0;
}

void pr1(){
int i = 0;
while (!shouldStop){
cout<<"HOLA "<<i<<endl;
i++;
this_thread::sleep_for(chrono::milliseconds(1000));
}
}


Gracias y saludos.

#21
Hace poco estuve googleando en busca de alguna keyword similar al "synchronized" de java pero para variables, y pregunté en algún foro (no recuerdo si en este también).
El caso es que en principio parecía que no, pero encontré una manera un tanto farragosa de hacer algo similar, la aporto y de paso pido correcciones si no es correcto algo de lo que digo:

Citar
Lo hago mediante propertys, simplemente declaro un objeto extra en mi clase (de tipo Object por ej., llamado 'lock'), y luego declaro la variable que quiero "synchronized" como si fuera property, y defino sus métodos get y set haciendo Monitor::Enter/Exit(lock); (obviamente usando una variable auxiliar para no caer en recursividad infinita). Se ve perfectamente con un ejemplo:


//fichero de cabecera (.h)

ref class prPrty
{
public:
prPrty();

Thread^ thMethod();
void thAux();
int getA();

private:

property int a{
int get(){
Monitor::Enter(lock);
Thread::Sleep(3000);
return __a;
Monitor::Exit(lock);
}

void set(int _a){
Console::WriteLine("sin lock");
Monitor::Enter(lock);
Console::WriteLine("con lock");
Thread::Sleep(3000);
__a = _a;
Monitor::Exit(lock);
}
}

int __a;

Object ^lock;
};

/*********************************/

//Fichero fuente (.cpp)

#include "prPrty.h"


prPrty::prPrty(){
this->lock = gcnew Object();
}

Thread^ prPrty::thMethod(){
Thread ^th = gcnew Thread(gcnew ThreadStart(this, &prPrty::thAux));
th->Start();
return th;
}

void prPrty::thAux(){
this->a = 20;
}

int prPrty::getA(){
int aux;
Console::WriteLine("\tEsperando para el lock...");
Monitor::Enter(lock);
Console::WriteLine("\tlock obtenido");
aux = a;
Monitor::Exit(lock);
return aux;
}

/*********************************/

//main (.cpp)

int main(){
prPrty ^a = gcnew prPrty();
Thread ^th=a->thMethod();
Thread::Sleep(500);
Console::WriteLine("\t\t"+a->getA());
th->Join();
Console::ReadLine();
return 0;
}


Espero que le sirva a alguien de algo, saludos.
#22
Hola a todos.

Estoy intentando implementar un método que en un determinado caso debería lanzar una excepción de tipo ios_base::failure pero mi visual studio no reconoce esa excepcion, aunque sí la ios_base.

Tampoco me deja lanzar una ios_base porque es un "tipo incompleto".

¿Alguien sabe como hacerlo? Gracias.
#23
Hola a todos.

Mi pregunta es si es necesario o conveniente declarar e implementar destructores en clases administradas de C++/CLI (ref class) en caso de usar punteros nativos en éstas.

También me gustaría saber si el destructor de una clase administrada es llamado automáticamente al finalizar el main.

Gracias y saludos.
#24
Hola a todos.

Estoy intentando desarrollar un programa que básicamente lo que tiene que hacer es un memcpy() cada cierto tiempo (tiempo muy bajo, 10 milis por ej.). La cantidad de memcpy() que hago la controlo con un contador, y el tiempo entre uno y otro con Sleep(). Siempre copio exactamente la misma cantidad de datos a memoria.

He comprobado que un memcpy() (junto con incrementar el contador) concreto cuesta hacerlo "0". Lo he probado con la librería <ctime>. Hago clock antes y después y, al imprimir la diferencia, da 0. También he imprimido los dos instantes (antes y después del memcpy y el incremento) y los dos son iguales.

Entonces por ej. si quiero que se realice dicho memcpy() cada 10 milis, en 3 segundos deberían hacerse 300 (o muy cerca de 300), pues a mí me salen 260.

No entiendo por qué pasa esto, ¿alguien puede ayudarme?

Gracias y saludos.

EDITO:
Un dato: ahora tengo el bucle para que, como máximo, haga 1024 veces memcpy(). Bien, si quito todo el delay (borro el Sleep()) llega a los 1024.
Y si le pongo Sleep(10) solo 260. No tiene sentido.
#25
Hola a todos.

Tengo un problema con la función Sleep() y es que el argumento que se le pasa solo puede ser un 'int', y yo necesito "programar" una tarea con más precisión en el tiempo.
Por ello he pensado en usar System::Timers::Timer.

He leído y probado un ejemplo en el que imprimo por pantalla un "HOLA" cada 3.12 segundo. El problema es que la tarea que yo necesito hacer cada 'x' tiempo recibe 3 argumentos y esta es la parte que no se hacer.

¿Alguien me ayuda por favor?

EDITO:
Ya he conseguido hacerlo mediante atributos de clase pero ahora tengo otro problema.

Programo el Timer para que haga su tarea cada 10 milisegundos (Timer.interval=10), y lo pongo a trabajar durante 3 segundos. Es decir, tendría que realizar dicha tarea un total de 300 veces pero solo llega a 260. Con Sleep conseguía hace muchas mas.
¿Alguien saber por qué pasa esto y/o sabe que puedo hacer?

Gracias.
#26
Dudas Generales / Problema con un dll
21 Julio 2014, 18:03 PM
Hola a todos.

He buscado por todas partes el archivo 'imaq.dll', hasta con buscadores rusos y chinos, y no hay manera de conseguirlo.

¿Puede compartirlo alguien que lo tenga por favor? Gracias y saludos.
#27
Windows / Problema con un dll
18 Julio 2014, 15:33 PM
Hola a todos.

Estoy intentando ejecutar una aplicacióm y me da error porque no encuentra "nipalu.dll".

He estado buscando mucho, en dll-files no está. Me he bajado bastantes programas de estos que "reparan dlls" y nada. Con google no encuentro nada mas que gente con el mismo problema pero nadie con solución.

¿Alguien tiene esa librería o sabe donde cosneguirla?

Gracias, saludos.
#28
Hola a todos.

Estoy trabajando con una cámara que se conecta al PC mediante una tarjeta y un puerto FrameLink. Dicho puerto trae un software que permite emular un puerto serie para comunicarse con la cámara.

El caso es que abrir este puerto con .NET (clase SerialPort, método Open())  causa una IOException, más abajo adjunto el StackTrace.
Se qué el puerto "virtual" funciona porque lo he probado con HyperTerminal, además he probado "SerialPort::GetPortNames()" y aparece mi puerto serie "virtual".
Sé que el programa detecta que existe el puerto serie virtual porque, si no, la excepción sería distinta (comprobado).

Con HyperTerminal me conecto con los siguientes parámetros:
Bits/segundo = 2400; Bits de datos = 8; Paridad = Ninguno; Bits de parada = 1; Control de flujo: Hardware.

¿Alguien puede ayudarme por favor?

Gracias y saludos.

Adjunto la excepción (quitando el try..catch del código):


Excepción no controlada: System.IO.IOException: El parámetro no es correcto.

  en System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
  en System.IO.Ports.InternalResources.WinIOError()
  en System.IO.Ports.SerialStream.set_DtrEnable(Boolean value)
  en System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity
parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeou
t, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNul
l, Byte parityReplace)
  en System.IO.Ports.SerialPort.Open()
  en main(String[] args) en c:\documents and settings\administrador\escritorio\
dan\src\appcamarasmotor_v2\appcamarasmotor_v2\appcamarasmotor_v2.cpp:línea 20
  en mainCRTStartupStrArray(String[] arguments) en f:\dd\vctools\crt_bld\self_x
86\crt\src\mcrtexe.cpp:línea 309


Adjunto el StackTrace (caputrando la excepción y imprimiendo el StackTrace):

TargetSite: Void WinIOError(Int32, System.String)

StackTrace:
  en System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
  en System.IO.Ports.InternalResources.WinIOError()
  en System.IO.Ports.SerialStream.set_DtrEnable(Boolean value)
  en System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity
parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeou
t, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNul
l, Byte parityReplace)
  en System.IO.Ports.SerialPort.Open()
  en main(String[] args) en c:\documents and settings\administrador\escritorio\
dan\src\appcamarasmotor_v2\appcamarasmotor_v2\appcamarasmotor_v2.cpp:línea 27


y el código:

int main(array<System::String ^> ^args)
{
try{

SerialPort ^sp=gcnew SerialPort("COM2",9600,Parity::None,8,StopBits::One);
if(sp->IsOpen){
Console::WriteLine("Ya está abierto");
sp->Close();
}
sp->Open();
if(sp->IsOpen){
Console::WriteLine("OK");
sp->Close();
}else{
Console::WriteLine("PUERTO CERRADO");
}
}catch(System::IO::IOException ^ioe){
Console::WriteLine(ioe->TargetSite+"\n\n");
Console::WriteLine(ioe->StackTrace);
}
}
#29
Hola a todos.

Tengo que desarrollar un programa para controlar una cámara que se comunica con el PC mediante un puerto FrameLink. Para ello la cámara trae un .dll para poder trabajar con este puerto. Sin embargo no trae ni .h, ni .lib, ni documentación ni nada.

Mi pregunta es primero, como poder usarla desde un proyecto de c++/cli en visual studio.

Saludos.


PD. : La otra pregunta es si dentro del .dll puede haber algo que me ayude a saber que métodos hay y como usarlos
#30
Hola a todos.

Mi pregunta es: si tengo un método inline en una clase A, y lo utilizo desde otra clase B, ¿lo que ocurre literalmente es que se incrusta el código escrito en dicho método en donde hago la llamada? ¿Evito entonces la llamada a la pila?


class A{
  ...
  inline string read(){
    return algo->read();
  }

};



int main(){
  A a();
  string aux=a.read();
  while(aux==""){
    aux=a.read();
  }
}

//¿Es equivalente a?:
int main(){
  A a();
  string aux=a.read();
  while(aux==""){
    aux=(a.algo)->read();
  }
}


Gracias y saludos.
#31
Hola a todos, tengo problemas para conseguir interrumpir la ejecución de un hilo que está "sleeping" y no entiendo por qué, adjunto el código:
Código (C++) [Seleccionar]

void pr2(void){
try{
                       Object ^o=gcnew Object();
ParameterizedThreadStart ^ths=gcnew ParameterizedThreadStart(prueba2);
Thread th(ths);
th.Start(o);
th.Interrupt();
}catch(ThreadInterruptedException ^the){
//Hacer algo
}
}

void prueba2(Object ^o){
try{
Monitor::Enter(o);
for(int i=0;i<5;i++){
Thread::Sleep(1000);
}
}catch(ThreadInterruptedException ^thi){
throw gcnew ThreadInterruptedException();
}finally{
Monitor::Exit(o); //<==¿Esto está bien aquí?
}
}

El problema mas grave es que despues de "interrumpir" el hilo, el programa sigue en ejecución, lo tengo que terminar con el admin. de tareas.

El segundo problema es que en prueba2() capturo la excepción y la vuelvo a lanzar, pero pr2() no se entera y no entiendo por qué.

¿Qué es lo que hago mal?

Además, entiendo que lo de Monitor::Enter() es como el sychronized() de java, ¿me equivoco?.

En tal caso, para poder interrumpir la ejecución de un hilo sin que haya error, el hilo tiene que haber hecho Monitor::Enter() antes?

Gracias y saludos.
#32
Hola a todos.

Tengo un bloque 'try' dentro del cual hay 5 llamadas a metodos que lanzan InvalidOperationException.
Me gustaría saber, en el bloque 'catch', cuál de los 5 métodos ha lanzado la excepción, para imprimir el nombre del método por pantalla.

¿Cómo puedo saber que método ha lanzado la excepción, si todos lanzan la misma?

Gracias y saludos.
#33
Hola a todos.

Tengo una funcion en C que me devuelve un unsigned char *. Tengo que escribir esta cadena en un fichero binario, para lo cual uso cout.write().
Pero ese método solo admite char *, así que hago la conversión.
Mi pregunta es si debido a esta conversión habrá algunos bytes que cambien.

Gracias, saludos.
#34
ftp://Hola a todos.

Estoy intentando concatenar unos ficheros bmp en uno solo (sin cabeceras).
Lo que hago es:
- Leo todos los bytes de uno (a memoria, quitando la cabecera)
- Los escribo en el fichero destino.
- Paso al siguiente.

Bien, el problema es que al terminar de escribir un fichero, antes de pasar al siguiente , aparecen unos cuantos bytes extra (ýýýý concretamente).
Es decir, supongamos que A, B y C son los bytes de 3 ficheros, al final en lugar de quedar en el fichero destino ABC queda AýýýýBýýýýCýýýý.

He comprobado que el problema no es al leer los ficheros, porque he probado a leer solo 1 y volver a escribirlo, y escribe todos los bytes y al final el  ýýýý.

¿Qué puedo hacer?

Adjunto el código que uso PARA ESCRIBIR, (la función LoadBMP lee todos los bytes del fichero bmp sin cabeceras):

int RAWCreator::toRawFile(char *bmps[],int numBmps,const char *dstFile){
fstream aux(dstFile);
ofstream dst;

if(aux.good()){
aux.close();
return RAWCreator::ALREADY_EXIST;
}

dst.open(dstFile, ios::app);
for(int i=0;i<numBmps;i++){
dst<<LoadBMP(bmps[i],this->bih);
}
dst.close();
return SUCCESS;
}

#35
Hola a todos.

Tengo que hacer un programa (en c++/cli) que guarda imágenes capturadas por una cámara (varias de ellas).
Para poder guardarlas todas tengo que ir cambiándoles el nombre, es decir modificar una cadena de caracteres que tiene que ser char * (porque la función que guarda las imágenes recibe como nombre de fichero un char *)
Mi pregunta es cual es la manera más rápida de hacer esto en C++, ya que cuanto mas cueste menos imágenes bmp tendré, y peor será la imagen resulante.

Gracias y saludos.

#36
Hola a todos.

Quiero lanzar 2 hilos y que cada uno de ellos abra una ventana de consola y escriba en ella un mensaje.

He estado buscando por internet y no encuentro ningún sitio donde expliquen esto.

¿Cómo puede hacerse esto en C# o c++/cli?

Saludos y gracias.
#37
Hola a todos.

Tengo que hacer un proyecto en el cual debo usar un dll. Para las primeras pruebas creé un proyecto e importé el dll de forma "estática", es decir, haciendo simplemente
#include "nombreDLL.h".

El caso es que ahora he creado un proyecto nuevo, intento importar o incluir ese fichero de cabecera y el compilador me da este error:
error LNK2028: se hace referencia al símbolo (token) sin resolver (0A000017) ...
error LNK2019: símbolo externo "public: static class XCamera * __cdecl XCamer ...

No sé que hacer, ¿Alguien puede ayudarme por favor?
#38
Hola a todos.

Estoy haciendo un programa en C++ con visual studio 2008 express, y necesito usar una libería dll para controlar un dispositivo.

¿Cómo puedo "importar", "incluir" o "usar" esa dll?

Gracias y saludos.

EDITO: he intentado esto:
-Crear un directorio "lib" en mi projecto (donde esta el archivo .dll y su archivo .lib)
-Añadir este directorio a Propiedades>Vinculador>General>Dirs. de bibliotecas adicionales
-Añadir a Vinculador>Dependencias adicionales el nombre del fichero .lib.
Después de todo esto hago #unclude "fichero.dll" y me sigue dando error.

También he intentado hacer:
Proyecto>Referencias>Agregar nueva referencia y en examinar selecciono la dll, le doy a aceptar y me sale este error: "No se pudo agregar una referencia al archivo <ruta completa> porque no es ni un ensamblado .NET ni un control ActiveX regitrado."

¿Qué es lo que hago mal?
#39
Hola a todos.

Tengo que realizar un trabajo a partir de un código escrito en C++/CLI.

El caso es que voy a tener que usar 2 puertos USB y FrameLink.

Necesitaré usar .NET para manejar ambos puertos, y tengo que aprender a usarla.

Mi pregunta es si es lo mismo usar .NET en C# que en C++/CLI. (Salvo diferencias como los punteros y que en C# el separador es '.' y en C++/CLI es '::'), en ese caso debo buscar manuales de .NET no de C++/CLI, ¿cierto?


También me estoy planteando usar alguna API de Java o de Python para esta labor, ya que creo que C++ y .NET será mucho mas complicado que usar Java o Python.
¿Os parece buena idea?
¿Tendré problemas para llamar desde Python o Java a las funciones escritas en C++/CLI?

Gracias y saludos.
#40
Hola a todos.

Tengo que hacer un trabajo utilizando un código ya escrito en C++/CLI.
El caso es que al intentar compilar ese código en mi pc, con visual studio 2012, el compilador da error porque faltan un montón de cosas.

Diré la más sorprendete, parace que no tengo el namespace System::Windows::Forms.

Ya lo he descargado por internet (es un dll), ahora necesito saber donde descomprimirlo.

¿Alguien me ayuda por favor?

Saludos y gracias.
#41
Hola a todos, tengo que realizar un trabajo en el que tengo que utilizar un código ya escrito de C++ y aparecen cosas que no he visto nunca.

Por ejemplo esto:

ref class MiClase{
  ...
}

¿Eso se supone que usa el garbage collector de .NET?
¿Por descontado que no es C++ estándar no?
¿Que compilador es compatible con esa cosa?

Mi otra pregunta es si esto es un puntero:

static SerialPort^ _serialPort;

De nuevo saber que compilador se traga eso y sobre todo si es o no un puntero.

Gracias, saludos.
#42
Hola a todos, se trata de resolver el problema de, dado un tablero de ajedrez de 5x5, pisar todas las casillas con un caballo (sin pisar la misma casilla 2+ veces)

Estoy intentando averiguar por qué este código no funciona

def nextMovement(posActual, movedores, iter):
   """ Devuelve el siguiente movimiento a realizar
       posActual: vector de 2 comp. (coords x e y) ==> posicion actual del caballo
       movedores: matriz de 2x8 que indica los posibles movimientos que se pueden hacer con el caballo
       iter: número que indica que movedor aplicar
   """
   casilla = [None] * 2
   casilla[0] = posActual[0] + movedores[0][iter]
   casilla[1] = posActual[1] + movedores[1][iter]
   return casilla

def casillaAdmisible(tablero, casilla):
   x=casilla[0]
   y=casilla[1]
   tam=len(tablero)
   if(x>=tam or y>=tam or x<0 or y<0 or tablero[x][y]!=0):
       return False
   return True

def mover(casilla, tablero, etapa):
   tablero[ casilla[0] ][ casilla[1] ] = etapa
   
def anularMovimiento(casilla, tablero):
   tablero[ casilla[0] ][ casilla[1] ] = 0

def backTrackingChessHorse(tablero, posActual, etapa, movedores):
   exito = False
   for i in range(len(movedores[0])):
       if(exito):
           break
       casilla = nextMovement(posActual, movedores, i)
       if not casillaAdmisible(tablero, casilla):
           continue
       aux=posActual
       mover(casilla, tablero, etapa)
       posActual=casilla
       if(etapa == len(tablero)**2):
           exito = True
       else:
           exito = backTrackingChessHorse(tablero, posActual, etapa + 1, movedores)
           if(not exito):
               anularMovimiento(casilla, tablero)
               posActual=aux
   return exito

def printTablero(tablero):
   for i in range(len(tablero)):
       print(tablero[i])

Problema: se consigue llegar a la etapa 25 (la última), pero nunca devuelve True, entre en bucle infinito.
No veo el error, ¿alguien puede ayudarme?
#43
Hola a todos.

Estoy intentando usar el Google C++ testing framework con un pequeño código fuente pero no consigo hacerlo funcionar.

Ya he instalado el gtest, y he progado a hacer include de sus librerias en los ficheros de código que estoy compilando, y hasta ahí funciona.

El problema me surge cuando intento ya crear un test :

TEST(..., ...){
        EXPECT_GE(..., ...());
}


Intento compilar el fichero donde hago las pruebas con g++ <nombre_fichero> -o test y me da el siguiente error:
(Después de un montón de texto de error que no copio) collect2: ld devolvió el estado de salida 1

Alguien me ayuda por favor? Gracias.
#44
Hola a todos.

Estoy intentando decorar el método de una clase. El decorador en cuestión tiene un parámetro.
Dentro de la clase intento decorar la función A() con este decorador (pasándole como parámetro 'self'), pero al llamar al método A() me da error:

" NameError: name 'self' is not defined "

¿Qué hago mal?

Gracias
#45
Hola a todos

Tengo un formulario con una serie de datos a enviar (nombre, apellido etc.)
He metido el nombre, apellido etc. en tags <label>.
Bien seguido de cada <label> he puesto un <input> para introducir los datos pertientes, y a continuación, un <br>.
Ejemplo:

<form ...>
<fieldset>
<legend>Datos de la empresa</legend>
<label  ....>Razón social:*</label><input id="..."....><br>
                        .....
       </fieldset>
</form>


Mediante css, quiero hacer que todos los inputs queden sangrados igual, para ello necesito aumentar el width del label. Lo he intentado de 100000 maneras, he leido 2000 paginas y no lo consigo. ¿Cómo debería hacerse?

PD.
Esto es lo último que he intentado: (supongamos label id="l1")

labelt#l1{
   width: 500px;
}