Oppure

Loading
26/02 13:00
Carlo
Uso i compilatori C/C++ della Microsoft e MinGW, nella rete si trovano molti codici che usano le istruzioni non standard: gotoxy() textcolor() textbackground() clrscr().
Ho letto che tali istruzioni sono implementate nel compilatore C/C++ della Borland e simili.
Con i compilatori che non le supportano, in Windows sono facilmente replicabili, ho scritto un breve codice test che le raggruppa:
#include <stdio.h>
#include <windows.h>

/****************************************************************************
   codice che replica le istruzioni:
   gotxy(); textcolor(); textbackground(); clrscr();
   presenti nella libreria <conio.h> del compilatore Borland C/C++ e simili

   Per rendere compatibili i codici che usano tali istruzioni con i compilatori:
   CGwin, MinGW, MSVC e altri, è sufficiente eseguire le seguenti modifiche:

   1) aggiungere le variabili globali: fore, back e handle
   2) aggiungere nel main():  handle=GetStdHandle(STD_OUTPUT_HANDLE);
   3) modificare tutti i cprintf() in printf()
   4) aggiungere le quattro void:
                              gotxy(int x, int y)
                              textcolor(int f)
                              textbackground(int b)
                              clrscr()
*****************************************************************************/

int fore = 7; // variabile globale colore primo piano
int back = 0; // variabile globale colore secondo piano
HANDLE handle; // variabile globale che contiene l'HANDLE della console

void gotoxy(int x, int y){ // equivalente in Borland C/C++
    COORD cursore; // angolo superiore sinistro = 0,0
    cursore.X=x-1; // i codici Borland usano la base 1
    cursore.Y=y-1; // i codici Borland usano la base 1
    SetConsoleCursorPosition(handle, cursore);
}

COORD getxy(){ // può far comodo
    CONSOLE_SCREEN_BUFFER_INFO buff;  // buffer info schermo
    GetConsoleScreenBufferInfo(handle, &buff); // lettura info console
    /* info disponibili:
    dwCursorPosition     COORD
    dwMaximumWindowSize  COORD
    dwSize               COORD
    srWindow             SMALL_RECT
    wAttributes          WORD
    */
    return buff.dwCursorPosition; // angolo superiore sinistro = 0,0
}

void textcolor(int f){ // equivalente in Borland C/C++
    // se f non è compreso tra 0 e 15, i colori ciclano
    fore=f; // right 4 bit
    SetConsoleTextAttribute(handle, fore+back*16);
}

void textbackground(int b){ // equivalente in Borland C/C++
    // se b non è compreso tra 0 e 15, i colori ciclano
    back=b; // left 4 bit
    SetConsoleTextAttribute(handle, fore+back*16);
}

void clrscr(){
    system("cls");
}

// Test routine
int main(){

    handle=GetStdHandle(STD_OUTPUT_HANDLE); // lettura dell'HANDLE

    for (int i=0; i<16; i++) printf("foba "); // intestazione fo=foreground, ba=background

    for (int ba=0; ba<16; ba++){ // 16 colori di background
        for (int fo=0; fo<16; fo++){ // 16 colori di foreground
            gotoxy(ba*5+1,fo+2); // ogni colore al suo posto
            textcolor(fo); textbackground(ba);
            printf("%02d%02d", fo, ba);
        }
    }
    textcolor(7); textbackground(0); // colori default
    printf("\n");
    COORD cursore=getxy(); // lettura coordinate cursore in base 0
    printf("_<- qui il cursore e' in colonna %d riga %d ", cursore.X, cursore.Y);
    cursore=getxy(); // lettura coordinate cursore in base 0
    printf("_<- qui colonna %d riga %d \n", cursore.X, cursore.Y);

    return 0;
}

La void getxy(), non so se esiste nel compilatore Borland, ma l'ho aggiunta perché potrebbe essere utile sapere le coordinate correnti del cursore in base 0.

Al solito, commenti e considerazioni sono gradite.
Ultima modifica effettuata da Carlo 04/03 19:17
in programmazione tutto è permesso
26/02 14:07
Mikelius
Se cerchi la libreria conio che racchiude tutte (e anche altre) le funzioni richieste,

Ci sono diverse implementazioni in rete, tipo:

github.com/thradams/…,

Basta scaricarla e includerla nella stessa cartella dei tuoi progetti. (mettendo L header conio.h tra doppi apici e non parentesi angolari, affinchè cerchi nella stesssa cartella)

Cmq anche se non l ho provato mi sembra un buon lavoro che hai fatto.
Ultima modifica effettuata da Mikelius 26/02 14:10
aaa
26/02 15:15
Carlo
Grazie Mikelius, testata la "conio.h" che mi hai proposto, funziona e finalmente ho il codice per replicare il comportamento di <windows.h> in linux.

Peccato che la tua "conio.h" usa una sintassi diversa e coordinate in base 0, comunque utile da studiare e facile da modificare.

EDIT:
Non sono un Linuxxiano, in tutto ci ho passato 2 o 3 ore da quando l'ho installato 5 mesi fa, finalmente posso padroneggiare la console di Linux, rigrazie Mikelius :k:
Ultima modifica effettuata da Carlo 26/02 18:31
in programmazione tutto è permesso
26/02 18:30
Mikelius
Postato originariamente da Carlo:

Grazie Mikelius, testata la "conio.h" che mi hai proposto, funziona e finalmente ho il codice per replicare il comportamento di <windows.h> in linux.

Peccato che la tua "conio.h" usa una sintassi diversa e coordinate in base 0, comunque utile da studiare e facile da modificare.


Si, avendo il codice e un po' di dimestichezza, non è difficile da modificare.
Se cerchi forse rieci a trovare anche altre versioni, implementate più o meno differentemente, forse più adatte alla versione che avevi fatto tu. Io ho postato la prima che ho trovato
aaa
26/02 18:35
Carlo
@ Mikelius, come ti ho postato sopra, è andata bene così, perché la conio.h che mi hai proposto ha il codice anche per Linux, e mi ha permesso di vedere come si gestisce la console in Linux, con il poco tempo che ci avevo dedicato non ne ero arrivato a capo. :heehee:
in programmazione tutto è permesso
27/02 7:30
nessuno
La conio e' una libreria non standard utilizzata con MSDOS e quindi obsoleta.

Nello specifico, con Linux si usa la libreria ncurses

it.m.wikipedia.org/wiki/…

invisible-island.net/ncurses/

pluto.it/sites/default/files/ildp/traduzioni/ncurses-intro/…
Ultima modifica effettuata da nessuno 27/02 7:34
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità;) chiamava il gioco del Lotto Tassa sulla stupidità.
27/02 14:34
Carlo
Postato originariamente da nessuno:

La conio e' una libreria non standard utilizzata con MSDOS e quindi obsoleta.

Nello specifico, con Linux si usa la libreria ncurses

it.m.wikipedia.org/wiki/…

invisible-island.net/ncurses/

pluto.it/sites/default/files/ildp/traduzioni/ncurses-intro/…

Grazie le guarderò, ma come avrai capito più che usare la libreria, ero interessato a come fa quello che fa, e quella postata da Mikelius è scritta in mododo facilmente comprensibile e riproducibile. In XTerm/UXTerm funziona alla grande, nella finestra Bash ha dei comportamenti indesiderati, controllerò se ncurses è più compatibile, con la speranza che il codice non sia troppo complesso.
in programmazione tutto è permesso
28/02 17:39
nessuno
Io ho risposto alla tua domanda con lo stato dell'arte. Poi puoi anche usare librerie e metodi obsoleti a tua scelta
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità;) chiamava il gioco del Lotto Tassa sulla stupidità.