miércoles, 7 de diciembre de 2011

Eliminar archivos innecesarios de los proyectos

0

Hace tiempo, haciendo una copia de seguridad completa de mi carpeta de "programación" vi que ocupaba demasiado, que era hora de eliminar por ejemplo archivos ".obj" o ".o" que se generan al compilar y que solo son necesarios en ese momento. El IDE que mas archivos innecesarios genera es el Visual Studio, que por ejemplo, para un pequeño programa de unos pocos kilobytes genera una base de datos de 23 megabytes, esto es útil mientras trabajas en ese programa, pero cuando lo dejas por un tiempo largo, esos megas ocupan espacio junto con los de otros proyectos, y pueden ser borrado, ya que lo genera el automáticamente el Visual Studio cada vez que abres el proyecto.

Para Borrar estos archivos fácilmente cada cierto tiempo cree un archivo por lotes ".bat" que se encargue de esto. Con forfiles borro carpetas y con el comando del /F /S /Q borro los archivos de determinada extensión en todas las subcarpetas y sin pedir confirmación. La ultima linea sirve para ejecutar otros archivos similares a este llamados clear.bat que uso para borrar en determinados subdirectorios, por ejemplo si quiero borrar la extensión ".exe" de la carpeta "pruebas" tendré que colocar en dicha carpeta un archivo "clear.bat" con del /F /S /Q *.exe.

Ver / Descargar

forfiles /m "obj" /s /c "cmd /c rd /S /Q @path"
forfiles /m "Backup" /s /c "cmd /c rd /S /Q @path"
forfiles /m "_UpgradeReport_Files" /s /c "cmd /c rd /S /Q @path"

del /F /S /Q *.o
del /F /S /Q *.obj
del /F /S /Q *.res
del /F /S /Q *.resources
del /F /S /Q *.sdf
del /F /S /Q *.ncb
del /F /S /Q *.pch
del /F /S /Q *.ipch
del /F /S /Q *.cdf
del /F /S /Q *.idb
del /F /S /Q *.ilk
del /F /S /Q *.pdb
del /F /S /Q *.cache
del /F /S /Q *.aps
del /F /S /Q *.tlb
del /F /S /Q *.tli
del /F /S /Q *.tlh
del /F /S /Q *.tmp
del /F /S /Q *.rsp
del /F /S /Q *.pgc
del /F /S /Q *.pgd
del /F /S /Q *.meta
del /F /S /Q *.tlog
del /F /S /Q *.exp
del /F /S /Q *.rep
del /F /S /Q *.xdc
del /F /S /Q *._manifest
del /F /S /Q *.bsc
del /F /S /Q *.sbr
del /F /S /Q *.vshost.exe
del /F /S /Q *.vshost.exe.config
del /F /S /Q *.vshost.exe.manifest
del /F /S /Q UpgradeLog.XML
del /F /S /Q File_id.diz
del /F /S /Q thumbs.db
del /F /S /Q Desktop.ini
del /F /S /Q *.layout
del /F /S /Q *.depend
del /F /S /Q *.user

forfiles /m "clear.bat" /s /c "cmd /c @path"

OJO! puede ser peligroso, ya que puede eliminar archivos que no quieres que sean borrados, estate seguro que no tienes nungun archivo valioso con estas extensiones.

Si sabes de algún tipo de archivo mas o nombre de carpeta que suele ser borrada coméntalo aquí o en el código de Google Code, estaré agradecido. También si sabes como seria un equivalente para sistemas operativos tipo Unix

Comparte o puntua esta publicación ▼

viernes, 25 de noviembre de 2011

lunes, 14 de noviembre de 2011

Dominio propio

0

Mas novedades, como dice el titulo, ya tengo un dominio propio, acabo de comprar el dominio davidXL.es también he contratado un servidor (webhostingpad) que promete no tener limites en capacidad de disco y cantidad de datos transferidos, pero esto no es del todo cierto, ya que en los términos de uso "ilimitado" limitan el numero de archivos a 10.000, y si te pasas en cuanto a transferencia te envían un email para que te pases al plan plus.

La verdad es que he contratado uno de los mas baratos, mi intención no es alojar grandes webs, sino que principalmente lo usare para hacer algunas pruebas, lo necesario para el blog y algunos proyectos pequeños. En algún futuro, posiblemente cuando finalize el contrato, si me veo apurado de recursos o capacidades me cambio, posiblemente a Bluehost, ya que me lo recomendaron y leí buenas criticas por la red.

Comparte o puntua esta publicación ▼

sábado, 22 de octubre de 2011

domingo, 2 de octubre de 2011

Trucos de divisibilidad para números enteros

1

Creo que a todos nos han enseñado alguna vez estos trucos, seguramente en primaria. A mi ya se me habían olvidado, y la verdad es que resultan útiles en algunas ocasiones.

Numero Regla
2 Si el numero es par
3 Si la suma de sus dígitos es múltiplo de 3
4 Si los últimos 2 dígitos es un numero divisible por 4
5 Si el ultimo numero es 5 o 0
6 Si el numero es par y divisible por 3
8 Si el numero es divisible por 4 y el resultado es par
9 Si la suma de sus dígitos es divisible por 9
10 Si el ultimo dígito es 0

Para el 7 y 13, que son algo mas complicados: http://www.smartick.es/blog/index.php/criterios-de-divisibilidad-del-7-y-del-13/

Podréis encontrar algo mas de información en:

  • http://rocky-marciano.lacoctelera.net/post/2007/10/12/trucos-divisibilidad-numeros-enteros
  • http://es.scribd.com/doc/7049650/trucosmatematica

Comparte o puntua esta publicación ▼

martes, 13 de septiembre de 2011

Grandes cambios

0

¡Hola de nuevo! después de estar casi todo el verano sin publicar nada y en general, este ultimo año solo he publicado unos dos post al mes, muchísimo menos de lo esperado, y no es por que tenga pocas ideas o material, sino que cuando termino un programa y me dispongo a compartirlo no se me ocurre nada para escribir, me da pereza subirlo, veo que no esta del todo completo o el código no es muy claro.

Para evitar que esto no siga estando cada vez mas inactivo me he puesto manos a la obra y realizando unas serie de cambios que me permitirán publicar con mas comodidad, he borrado todo lo que tenia en el repositorio de Google Code, ya que no tenia ningún orden y lo he sincronizado con la carpeta mía del ordenador, por lo que los enlaces a códigos de ejemplo no estarán disponibles temporalmente.

Logo del repositorio

Con la nueva organización del repositorio me sera muy fácil ir publicando frecuentemente códigos nuevos, para empezar ya están disponibles todos los problemas de http://projecteuler.net/ que he conseguido resolver.

Comparte o puntua esta publicación ▼

domingo, 24 de julio de 2011

Como ocultar el cursor

0

Este pequeño código escrito en C es útil sobretodo si estas desarrollando juegos, protectores de pantalla o algún tipo de aplicación en el que desees que no se muestre la flechita del raton.

case WM_SETCURSOR:
    SetCursor(NULL);
    return TRUE;

Deberá estar junto con el resto de casos en el procedimiento de proceso de mensajes de ventana de la "winapi".

Comparte o puntua esta publicación ▼

domingo, 12 de junio de 2011

Programa que abre cierto tipo de archivo

0

Un ejemplo de como obtener el nombre, dirección del ejecutable entre otras cosas de un tipo de archivo, protocolo, clsid, etc.

#include <windows.h>
#include <Shlwapi.h>
#include <stdio.h>
#pragma comment(lib, "shlwapi.lib")

char* assocStr[] =
{
    "ASSOCSTR_COMMAND",
    "ASSOCSTR_EXECUTABLE",
    "ASSOCSTR_FRIENDLYDOCNAME",
    "ASSOCSTR_FRIENDLYAPPNAME",
    "ASSOCSTR_NOOPEN",
    "ASSOCSTR_SHELLNEWVALUE",
    "ASSOCSTR_DDECOMMAND",
    "ASSOCSTR_DDEIFEXEC",
    "ASSOCSTR_DDEAPPLICATION",
    "ASSOCSTR_DDETOPIC",
    "ASSOCSTR_INFOTIP",
    "ASSOCSTR_QUICKTIP",
    "ASSOCSTR_TILEINFO",
    "ASSOCSTR_CONTENTTYPE",
    "ASSOCSTR_DEFAULTICON",
    "ASSOCSTR_SHELLEXTENSION",
    "ASSOCSTR_DROPTARGET",
    "ASSOCSTR_DELEGATEEXECUTE",
    "ASSOCSTR_MAX"
};


int main()
{
    char buffer[256];
    DWORD bufferLen = 256;
    HRESULT hres;

    int i;
    for (i = 0; i < 20; i++)
    {
        hres = AssocQueryString(0, i, ".doc", NULL, buffer, &bufferLen);
        if (S_OK == hres)
            printf("%s\n%s\n\n", assocStr[i], buffer);
        bufferLen = 256;
    }

    return 0;
}

Comparte o puntua esta publicación ▼

sábado, 28 de mayo de 2011

Ejemplo de grafica lineal en c

0

El siguiente código es un ejemplo de como crear una gráfica lineal como la del administrador de tareas de windows (taskmgr.exe). Para cambiar el tipo de gráfica haz clik sobre ella con el botón izquierdo del ratón.

#include <windows.h>
#include <math.h>

#define WIDTH 400
#define HEIGHT 125

HWND win = NULL;
DWORD timer = 0;
HDC specdc = 0, hdc = 0;
HBITMAP bmp = 0;
BYTE *pixels;
HPEN hPen;
unsigned int mode = 0, time = 0, pos = 0, v0, v1 = HEIGHT, grid = 0, a, b;

int sine_rand()
{
    static unsigned int values[10] = {0}, avg = 0;;
    int rn = (rand()%HEIGHT/2+sin(++time/31.416)*HEIGHT/2+HEIGHT/4);
    int index = time % 10;
    if (rn >= HEIGHT) rn = HEIGHT-1;
    else if (rn < 0) rn = 0;
    avg += rn - values[index];
    values[index] = rn;
    return avg / 10;
}

void CALLBACK Update(UINT id, UINT m, DWORD u , DWORD v, DWORD w)
{
    v0 = HEIGHT - 1 - sine_rand();

    if (mode == 0)
    {
        for (a = pos+1; a < HEIGHT * WIDTH; a += WIDTH)
            pixels[a] = 0, pixels[a+1] = 1;

        MoveToEx(specdc, pos, v1, NULL);
        LineTo(specdc, ++pos, v0);

        pos %= WIDTH;
    }
    else if (mode == 1)
    {
        BitBlt(specdc, 1, 0, WIDTH - 1, HEIGHT, specdc, 0, 0, SRCCOPY);
        for (a = 0; a < HEIGHT * WIDTH; a += WIDTH)
            pixels[a] = 0;

        MoveToEx(specdc, 1, v1, NULL);
        LineTo(specdc, 0, v0);
    }
    else //if (mode == 2)  windows taskmgr style
    {
        for (a = 0; a < HEIGHT * WIDTH; a += WIDTH)
        {
            memcpy(pixels + a, pixels + a + 1, WIDTH - 1);
            pixels[a + WIDTH - 1] = 0;
        }

        b = (grid++ % 11) ? 12*WIDTH : WIDTH;
        for (a = 0; a < HEIGHT * WIDTH; a += b)
            pixels[a+WIDTH-1] = 2;

        MoveToEx(specdc, WIDTH - 2, v1, NULL);
        LineTo(specdc, WIDTH - 1, v0);
    }
    v1 = v0;
    BitBlt(hdc, 0, 0, WIDTH, HEIGHT, specdc, 0, 0, SRCCOPY);
}

long FAR PASCAL WProc(HWND h, UINT m, WPARAM w, LPARAM l)
{
    switch (m)
    {
    case WM_PAINT:
    {
        RECT r;
        if (!GetUpdateRect(h, &r, 0)) return 0;
        PAINTSTRUCT p;
        HDC dc = BeginPaint(h, &p);
        if (!dc) return 0;
        BitBlt(dc, r.left, r.top, r.right-r.left, r.bottom-r.top,
               specdc, r.left, r.top, SRCCOPY);
        EndPaint(h, &p);
        return 0;
    }
    case WM_LBUTTONUP:
        mode = (mode + 1) % 3;
        memset(pixels, 0, WIDTH*HEIGHT);
        return 0;

    case WM_CREATE:
        win = h;
        hdc = GetDC(win);

        BYTE data[sizeof(BITMAPINFOHEADER) + 4*sizeof(RGBQUAD)] = {0};
        BITMAPINFO* bh = (BITMAPINFO*)data;
        RGBQUAD* pal = (RGBQUAD*)(data + sizeof(*bh));
        *bh = (BITMAPINFO){sizeof(*bh), WIDTH, HEIGHT, 1, 8, BI_RGB, 0,0,0,4,4};

        pal[0] = (RGBQUAD){0,0,0,0};
        pal[1] = (RGBQUAD){255,255,255,0};
        pal[2] = (RGBQUAD){0,100,0,0};
        pal[3] = (RGBQUAD){0,255,0,0};

        bmp = CreateDIBSection(0, bh, DIB_RGB_COLORS, (void**)&pixels, NULL, 0);
        specdc = CreateCompatibleDC(0);
        SelectObject(specdc, bmp);

        hPen = CreatePen(PS_SOLID, 1, RGB(0,255,0));
        SelectObject(specdc, hPen);

        timer = timeSetEvent(50, 20, (LPTIMECALLBACK)&Update, 0, TIME_PERIODIC);
        break;

    case WM_DESTROY:
        ReleaseDC(win, hdc);
        if (timer) timeKillEvent(timer);
        if (specdc) DeleteDC(specdc);
        if (bmp) DeleteObject(bmp);
        if (hPen) DeleteObject(hPen);
        PostQuitMessage(0);
        break;
    }
    return DefWindowProc(h, m, w, l);
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev,LPSTR lpCmd, int nCmdShow)
{
    WNDCLASS wc = {0, WProc, 0, 0, hInst, 0, 0, 0, 0, "Spectrum"};

    if (!RegisterClass(&wc) || !CreateWindow("Spectrum","Ejemplo - DavidXL",
            WS_POPUPWINDOW | WS_CAPTION | WS_VISIBLE, 300, 200,
            WIDTH + 2 * GetSystemMetrics(SM_CXDLGFRAME), HEIGHT +
            GetSystemMetrics(SM_CYCAPTION) + 2*GetSystemMetrics(SM_CYDLGFRAME),
            NULL, NULL, hInst, NULL))
    {
        return 0; //Error
    }

    ShowWindow(win, SW_SHOWNORMAL);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

Comparte o puntua esta publicación ▼

jueves, 26 de mayo de 2011

Capturar pantalla en c

1

Ayer busque como hacer capturas de pantalla en C y guardarlas después en un archivo bmp, pero todos los snippets que encontré me hacían únicamente un "Screenshot" de la pantalla principal, esto quiere decir que si usamos mas de un monitor no serviría. He escrito este código que captura el área del escritorio virtual (todas las pantallas), generando una imagen como la de la tecla ImprimirPantalla o PrintScreen.

No creo que ha falta decirlo pero por si acaso, para elegir donde guardar el archivo bmp se modifica en la linea 24..
#include <windows.h>

int main()
{
    int width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
    int height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
    int top = GetSystemMetrics(SM_YVIRTUALSCREEN);
    int left = GetSystemMetrics(SM_XVIRTUALSCREEN);
    int size = width * height * 3;
    int headerSize = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER);

    BITMAPFILEHEADER bmFile = {0x4D42, headerSize + size, 0, 0, headerSize};
    BITMAPINFO bmInfo = {{sizeof(BITMAPINFOHEADER), width, height, 1, 24, BI_RGB, 
                        size, 0, 0, 0, 0}};
    LPBYTE pixels;

    HDC hdc = CreateCompatibleDC(0);
    HBITMAP hBMP = CreateDIBSection(hdc, &bmInfo, DIB_RGB_COLORS, (LPVOID*)&pixels, 
                   0, 0);
    SelectObject(hdc, hBMP);
    BitBlt(hdc, 0, 0, width, height, GetDC(0), left, top, SRCCOPY);
    DeleteDC(hdc);

    HANDLE hFile = CreateFile("c:\\Screenshot.bmp", FILE_WRITE_DATA, 0, 0, 
                   CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    if (hFile != INVALID_HANDLE_VALUE)
    {
        DWORD dwOut;
        WriteFile(hFile,&bmFile, sizeof(BITMAPFILEHEADER), &dwOut, NULL);
        WriteFile(hFile,&bmInfo, sizeof(BITMAPINFOHEADER), &dwOut, NULL);
        WriteFile(hFile, pixels, size, &dwOut, NULL);
        CloseHandle(hFile);
    }

    DeleteObject(hBMP);

    return 0;
}

Comparte o puntua esta publicación ▼

lunes, 11 de abril de 2011

Leer los tags id3v1 de un mp3

0

La mayoría de los archivos mp3s guardan en su interior una serie de etiquetas que informan de quien es el artista, el titulo, album, etc. mediante las etiquetas ID3. Existe 2 versiones principales de etiquetas, ID3V1 y ID3V2 que es bastante mas difícil y complicado extraer su información que en su primera versión. Leer los tags ID3V1 de los mp3s es muy fácil, solo tenemos que extraer los últimos 128 bytes del mp3.

En la versión 1.1 se añade información de numero de pista

De los ultimos 128 bytes, los 3 primeros deben de ser "TAG", sino la cancion no tiene este tipo de tags.
Title: 30 bytes (caracteres)
Artist: 30 bytes (caracteres)
Album: 30 bytes (caracteres)
Year: 4 bytes (caracteres 0-9)
Comment: 30 bytes (caracteres)
Genre: 1 byte representado como numero sin signo
Numero de pista: si el byte 28 de los comentarios es 0, no el caracter '0', entonces el byte 29 o ultimo (rango 0-29) sera un byte representado como numero sin signo que corresponde con el numero de pista.

Código de ejemplo

#include <iostream>
#include <fstream>

using namespace std;

struct id3v1
{
    1];
    char artist[31];
    char album[31];
    char year[5];
    char comment[29];
    char track;
    char genre;
};

char * genre[256] =
{
    "Blues", "Classic Rock", "Country", "Dance", "Disco",
    "Funk", "Grunge", "Hip-Hop", "Jazz", "Metal", "New Age", "Oldies", "Other",
    "Pop", "R&B", "Rap", "Reggae", "Rock", "Techno", "Industrial", "Alternative",
    "Ska", "Death Metal", "Pranks", "Soundtrack", "Euro-Techno", "Ambient",
    "Trip-Hop", "Vocal", "Jazz+Funk", "Fusion", "Trance", "Classical", "Instrumental",
    "Acid", "House", "Game", "Sound Clip", "Gospel", "Noise", "Alt. Rock", "Bass",
    "Soul", "Punk", "Space", "Meditative", "Instrumental Pop", "Instrumental Rock",
    "Ethnic", "Gothic", "Darkwave", "Techno-Industrial", "Electronic", "Pop-Folk",
    "Eurodance", "Dream", "Southern Rock", "Comedy", "Cult", "Gangsta Rap", "Top 40",
    "Christian Rap", "Pop/Funk", "Jungle", "Native American", "Cabaret", "New Wave",
    "Psychedelic", "Rave", "Showtunes", "Trailer", "Lo-Fi", "Tribal", "Acid Punk",
    "Acid Jazz", "Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock", "Folk",
    "Folk/Rock", "National Folk", "Swing", "Fast-Fusion", "Bebob", "Latin", "Revival",
    "Celtic", "Bluegrass", "Avantgarde", "Gothic Rock", "Progressive Rock",
    "Psychedelic Rock", "Symphonic Rock", "Slow Rock", "Big Band", "Chorus",
    "Easy Listening", "Acoustic", "Humour", "Speech", "Chanson", "Opera",
    "Chamber Music", "Sonata", "Symphony", "Booty Bass", "Primus", "Porn Groove",
    "Satire", "Slow Jam", "Club", "Tango", "Samba", "Folklore", "Ballad", "Power Ballad",
    "Rhythmic Soul", "Freestyle", "Duet", "Punk Rock", "Drum Solo", "A Cappella",
    "Euro-House", "Dance Hall", "Goa", "Drum & Bass", "Club-House", "Hardcore", "Terror",
    "Indie", "BritPop", "Negerpunk", "Polsk Punk", "Beat", "Christian Gangsta Rap",
    "Heavy Metal", "Black Metal", "Crossover", "Contemporary Christian", "Christian Rock",
    "Merengue", "Salsa", "Trash Metal", "Anime", "JPop", "Synthpop",0
};

//genre[255] = (char*)("Unknown");

id3v1 getTags (char * file)
{
    char * buffer = new char[128];
    ifstream mp3("c:\\1.mp3");
    mp3.seekg(-128, ios::end);
    mp3.read (buffer,128);

    id3v1 tag;

    if (buffer[0] != 'T' || buffer[1] != 'A' || buffer[2] != 'G')
    {
        cout << "No tiene tags id3v1" << endl;
        return tag;
    }

    // copia a la estructura
    copy(buffer+3, buffer+33, tag.title);
    copy(buffer+33, buffer+63, tag.artist);
    copy(buffer+63, buffer+93, tag.album);
    copy(buffer+93, buffer+97, tag.year);
    copy(buffer+97, buffer+125, tag.comment);
    copy(buffer+126, buffer+127, &tag.track);
    copy(buffer+127, buffer+128, &tag.genre);

    // indico el final
    tag.title[30] = '\0';
    tag.artist[30] = '\0';
    tag.album[30] = '\0';
    tag.year[4] = '\0';
    tag.comment[28] = '\0';

    return tag;
}

int main()
{
    id3v1 tag = getTags ("c:\\1.mp3");
    cout << "Artist: " << tag.artist << endl;
    cout << "title: " << tag.title << endl;
    cout << "album: " << tag.album << endl;
    cout << "year: " << tag.year << endl;
    cout << "comment: " << tag.comment << endl;
    cout << "track: " << (unsigned int)tag.track << endl;
    cout << "genre id: " << (unsigned)(tag.genre) << endl;
    cout << "genre: " << ((unsigned)(tag.genre) > 147 ? "-" : genre[(unsigned)(tag.genre)]);
    cout << endl;

    return 0;
}

Comparte o puntua esta publicación ▼

lunes, 28 de marzo de 2011

Centrar ventana en windows

0

Una manera fácil de centrar la ventana en Windows, usando la siguiente función, cuyo único parámetro de entrada es el "manejador" (handle) de la ventana. Retorna verdadero si todo fue bien.

bool centerWindow(HWND hWnd)
{
    RECT rc;
    GetWindowRect(winHandle, &rc);

    int x = (GetSystemMetrics(SM_CXSCREEN) - (rc.right - rc.left))/2;
    int y = (GetSystemMetrics(SM_CYSCREEN) - (rc.bottom - rc.top))/2;

    return SetWindowPos(hWnd, 0, x, y, 0, 0, SWP_NOZORDER|SWP_NOSIZE);
}

Acuérdate de incluir windows.h

Comparte o puntua esta publicación ▼

viernes, 25 de marzo de 2011

Significado de los pitidos del ordenador

0

Normalmente, cuando encendemos nuestro ordenador suele emitir un pequeño pitido al principio que nos indica que todo esta bien, el problema es cuando pita mas de una vez, quizás parpadeen algunos leds y no se encienda la pantalla, entonces es cuando algo va mal.
Para saber el significado de los pitidos de la placa base al encender el ordenador solo tienes que continuar leyendo, la información esta sacada de un foro, y es una copia de hard-h2o.com (codigos post pitidos nada mas encender).

Significado de los pitidos:

Códigos genéricos

  • Ningún pitido: no hay suministro eléctrico.
  • Pitido ininterrumpido: fallo en el suministro eléctrico.
  • Pitidos cortos seguidos: placa base dañada.
  • Pitidos largos seguidos: Memoria dañada o CMOS corrupta.
  • 1 pitido largo: la memoria no funciona o no está presente.
  • 1 largo y 1 corto: fallo en la placa base o en la basic ROM.
  • 1 largo y 2 cortos: fallo en la tarjeta de video o no está presente.
  • 1 largo y 3 cortos: fallo en la tarjeta EGA.
  • 2 largos y 1 corto: fallo en la sincronización de imagen.
  • 2 pitidos cortos: fallo en la paridad de la memoria RAM.
  • 3 pitidos cortos: fallo en los primeros 64 KB de la memoria RAM.
  • 4 pitidos cortos: temporizador o contador defectuoso.
  • 5 cortos: el procesador o tarjeta de vídeo no pasan el test (dan problemas).
  • 6 cortos: fallo en el controlador del teclado. (Error frecuente cuando se desenchufa el teclado con el equipo encendido)
  • 7 cortos: modo virtual de procesador AT activo, error de excepción/identificador del procesador.
  • 8 cortos: fallo de escritura en la RAM de video.
  • 9 cortos: error de checksum de la ROM BIOS.
  • 10 pitidos cortos: error CMOS.

Códigos de IBM

  • 2 pitidos cortos: detalle del error mostrado en el monitor.
  • Pitido ininterrumpido: igual que los códigos genéricos: fallo en el suministro eléctrico.
  • 3 pitidos largos: fallo en el teclado.

Códigos de las BIOS AMI

  • 1 corto: error de refresco en la DRAM.
  • 2 cortos: error de paridad.
  • 3 cortos: error en los primeros 64 KB de la memoria RAM.
  • 4 cortos: error de reloj.
  • 5 cortos: error del procesador.
  • 6 cortos: error de teclado; similar a los códigos genéricos.
  • 8 cortos: error en la memoria gráfica.

Códigos de las BIOS Award

  • 1 pitido corto y 1 largo: error de vídeo.
  • 1 corto y 3 largos: error de teclado.

Códigos de las BIOS Phoenix (Los guiones son pausas)

  • 1-1-2: Fallo en la comprobación del procesador.
  • 1-1-2: Tono grave. Fallo en la placa base.
  • 1-1-3: Fallo en el acceso a la CMOS.
  • 1-1-3: Tono grave. Fallo en la memoria extendida de la CMOS.
  • 1-1-4: Error en la suma de control de la propia Bios.
  • 1-2-1: Error en el PIT (Intervalo Programable del Temporizador).
  • 1-2-2: Fallo en el controlador DMA.
  • 1-2-3: Fallo en el acceso a DMA.
  • 1-3-1: Error de refresco de la memoria RAM.
  • 1-3-2: Fallo en la comprobación de los primeros 64 KB de RAM.
  • 1-3-3: Error en los primeros 64 KB de RAM.
  • 1-3-4: Fallo en la lógica de control de los primeros 64 KB de RAM.
  • 1-4-1: Fallo en la línea de direccionamiento de los primeros 64 KB de RAM.
  • 1-4-2: Error de paridad en los primeros 64 KB de RAM.
  • 1-4-3: Fallo en la comprobación del temporizador del bus EISA.
  • 1-4-4: Fallo en la comprobación del puerto 462 para el bus EISA.
  • 2-1-1 a 2-1-4: Fallo en alguno de los bits de los primeros 64 KB de RAM.
  • 2-2-1 a 2-2-4: Fallo en alguno de los bits de los primeros 64 KB de RAM.
  • 2-3-1 a 2-3-4: Fallo en alguno de los bits de los primeros 64 KB de RAM.
  • 2-4-1 a 2-4-4: Fallo en alguno de los bits de los primeros 64 KB de RAM.
  • 3-3-1: Fallo en el registro del DMA secundario.
  • 3-1-2: Fallo en el registro del DMA primario.
  • 3-1-3: Fallo en el registro de la interrupción primaria.
  • 3-1-4: Fallo en el registro de la interrupción secundaria.
  • 3-2-2: Error en el vector de interrupción.
  • 3-2-3: Reservado.
  • 3-2-4: Fallo en el controlador del teclado.
  • 3-3-1: Fallo de alimentación en la memoria CMOS.
  • 3-3-2: Error de configuración en la CMOS.
  • 3-3-3: Reservado.
  • 3-3-4: Fallo en la memoria de vídeo.
  • 3-4-1: Fallo en la inicialización de la tarjeta gráfica.
  • 4-2-1: Fallo en el temporizador del sistema.
  • 4-2-2: Fallo de apagado.
  • 4-2-3: Fallo en la puerta A20 del controlador del teclado.
  • 4-2-4: Interrupción inesperada en el modo protegido.
  • 4-3-1: Fallo en la comprobación de la memoria RAM.
  • 4-3-3: Fallo en el segundo canal del temporizador.
  • 4-3-4: Fallo en el reloj del sistema.
  • 4-4-1: Error en el puerto serie.
  • 4-4-2: Error en el puerto paralelo.
  • 4-4-3: Fallo en el coprocesador matemático (MPU).

Códigos comunes

1 pitido agudo y 1 grave repitiéndose en forma de sirena: No es realmente un código de error del POST. Este tipo de "sirena" indica que el procesador está muy caliente. Es una alarma acústica para indicar que el procesador ha llegado o ha pasado de la temperatura de alarma fijada por el usuario o el fabricante en la BIOS. En algunas ocasiones, viene acompañado de un repentino bloqueo y posterior apagado del equipo (temperatura de apagado, fijada por el usuario en la BIOS).

1 pitido ni largo ni corto: como bien he dicho al inicio, este pitido indica que el POST ha concluido con éxito. La BIOS comenzará a buscar una unidad con un sistema operativo o con el instalador del mismo y lo iniciará.

Otros pitidos

3 pitidos cortos con pausas: algunas BIOS pueden dar 3 pitidos después de borrar la CMOS. A parte, muestran un mensaje en pantalla por si quieres cargar los valores por defecto o entrar en la configuración de la misma.

1 pitido ni largo ni corto, como el del POST: las BIOS de algunas tarjetas de red pueden hacer sonar el altavoz antes de que el sistema operativo arranque para indicar que funcionan. Suele aparecer un mensaje en pantalla.

Comparte o puntua esta publicación ▼