Ir ao conteúdo

C Design de programa em C


Ir à solução Resolvido por arfneto,

Posts recomendados

Postado

Boa noite a todos!

Estava navegando aqui na web e me deparei com o seguinte:

image.thumb.png.7b2b2d9f9f2cb2fcec8f42f28c69cc07.png

 

Achei bacana o design desse programa, me pergunto como poderia ser reproduzido...

Vi que do lado esquerdo tem um caractere que desconheço, de que se trata?

image.png.6821fe4e96fc655f7819f989499a7fc1.png

Também desconheço essa forma de divisão que foi feita imagino que a fim de separar os menus.

Outra questão seria como são lidas entradas como por exemplo o ESC para sair do programa (canto inferior esquerdo do console) mesmo quando já esta sendo lido algo, seria algum tipo de função getch() assíncrona?

Obrigado a todos.

  • Obrigado 1
  • Amei 1
  • Solução
Postado
34 minutos atrás, Lucca Rodrigues disse:

Achei bacana o design desse programa, me pergunto como poderia ser reproduzido...

Vi que do lado esquerdo tem um caractere que desconheço, de que se trata?

 

Esse é o visual típico dos programas de console dos anos 80.

Até as cores são familiares. :) 

Hoje em dia temos muito mais opções. Unicode tem hoje pouco mais de 1.1 milhão de cacteres.

 

Um pouco de história
 

Naquela época a tabela ASCII, que tinha ganho minúsculas poucos anos antes, foi estendida, e alguns caracteres foram criados antes do valor 32, o espaço, e depois de 127, o DELETE. Antes de espaço só ficavam caracteres de controle, como só ETX ACK NAK e tal, e eles só tinham sentido para o pessoal de telecomunicação. Não havia TCP/IP ou internet. Comunicação aí era em geral via linhas telefônicas e modems. E a comunicação era sinalizada por esses caracteres. ACK era a resposta positiva, NAK pedia retransmissão e coisas assim. Hoje não mudou tanto assim. Só tem mais camadas.

 

Foi então criado o conceito de CodePage no Windows e uma das primeiras foi a da IBM, 437, e ela tinha alguns caracteres especias que todo mundo passou a usar. Estavam abaixo de 32 e depois de 127 claro, e a tabela ASCII cresceu de 7 para 8 bits.
 

Alguns desses caracteres eram para desenho. Veja abaixo:

 

image.png.dc6abc263d23b7f2307835c80c2fbafe.png

 

Com eles se podia ter dois tipos de caixa, com linhas simples ou duplas. E as intersecções. Era o máximo :) porque antes só tinha barra ponto , traços e a imaginação. E apareceram algumas letrinhas novas no lugar dos caracteres de controle
 

image.png.612d22d088488e7275b25bba609c4c9d.png

 

Veja o 16 acima. É o que está no menu que mostrou. Aqui tem a página toda para ver:  https://en.wikipedia.org/wiki/Code_page_437#Character_set 

 

De volta ao programa

 

48 minutos atrás, Lucca Rodrigues disse:

Outra questão seria como são lidas entradas como por exemplo o ESC para sair do programa (canto inferior esquerdo do console) mesmo quando já esta sendo lido algo, seria algum tipo de função getch() assíncrona?

 

Não precisa ser nada assíncrono porque o programa está sempre lendo.  Veja que na imagem que postou está lendo uma matrícula. Na tela principal estaria lendo apenas 10 coisas: F1..F4 1..4 TAB ou ESC. E se entrar em um menu vai estar lendo dados relativos ao menu então vai poder tratar ESC ou TAB ou qualquer coisa. Esse tipo de programa está sempre lendo.

 

Em geral o que se faz hoje nos programas de console nada mudou. A lógica é simples:

  • separa a leitura da exibição. Você lê as teclas e aceita só as que fazem sentido. Mas não mostra e não move o cursor de jeito nenhum. Se for inválida pode enviar aquele clássico BEEP, o BEL o ASCII 7. Para o óbvio efeito. Note que o Beep até outro dia ia para o alto-falante do PC :) 
  • Se for o caso de mostrar, como a matrícula no exemplo, e o caracter for válido, aí sim você mostra a letra e avança o cursor 
  • Se for uma tecla de função ou um TAB você age de acordo e move o cursor. O clássico persiste até hoje na web: TAB avança campo, shift TAB volta o campo. E o formulário tem essa noção de TAB Order. É assim em java, em DELPHI, em dotNet

curses era uma biblioteca que ajudava bem a fazer esse tipo de coisa. Depois evoluiu para ncurses e está disponível até hoje. Não sei como é ncurses em Windows, nem se roda. Era uma coisa de Unix quando eu usava. O grande lance era que o Unix --- Linux OSX Android -- não tem essa noção de console que tem no Windows, e curses evitava que você tivesse que guardar a imagem da tela você mesmo. Porque alguém faria isso? Simples: se o terminal desligasse e ligasse de novo sumia tudo, mas o programa estava normal. No Windows não. Acende tudo igualzinho. Na verdade hoje o padrão do Windows é de pouco mais de 9000 linhas de memória.

 

Esse programa mostra esses caracteres. Os abaixo de 32 são um pesadelo e é melhor nem tentar a menos de um pagamento ou uma aposta ou uma nota.

 

Spoiler

#include <stdio.h>
#include <string.h>
#include "windows.h"


int main(int argc, char** argv)
{
    char lines[6] = { 200, 205, 188, 186, 187, 201 };
    char line [6] = { 192, 196, 217, 179, 191, 218 };
    char box[4] =   { 176, 177, 178, 219 };

    int save_page = GetConsoleCP();
    SetConsoleCP(437);

    for (int i = 0; i < 6; i = i + 1)
        printf("%c ", lines[i]);
    printf("\n");

    for (int i = 0; i < 6; i = i + 1)
        printf("%c ", line[i]);
    printf("\n");

    for (int i = 0; i < 4; i = i + 1)
    {
        printf("%c ", box[i]);
        printf("%c ", box[i]);
        printf("%c ", box[i]);
        printf("%c ", box[i]);
        printf("        ");
    };
    printf("\n");

    SetConsoleCP(save_page);

    return 0;
};  // main()

 

 

 

 

Dias atrás acho que eu postei um programa que faz essa "leitura assíncrona" como falou. É a solução para games, claro, porque você não pode usar um simples read() como deve imaginar.

 

Se tem interesse em ver me avise e eu procuro por ele. A lógica é simples. E não é assíncrono na verdade: você usa PeekConsole Input() e lê o buffer de teclado antes de ler via read() ou scanf() ou getc(0 ou sei lá. E então você age de acordo. Isso no Windows. Se tem algo para ler você já sabe o que é e pode até apagar ;)

Só que o programa continua rodando. Acho que deu pra entender.

 

No Linux é diferente: você manipula o tty, o terminal, usando acho que ioctl() e muda o timeout de leitura para 0. Asim o read sempre retorna na hora, tendo ou não algo pra ler.

 

Acho que eu também devo ter algum exemplo, mas nunca postei nada aqui relativo a Unix/Linux então teria que ver. :) 

 

 

 

 

  • Obrigado 2
Postado

@arfneto Obrigado pela explicação!

 

1 hora atrás, arfneto disse:

Esse programa mostra esses caracteres. Os abaixo de 32 são um pesadelo e é melhor nem tentar a menos de um pagamento ou uma aposta ou uma nota.

Funcionou sim, porém ainda vou dar uma pesquisada e reler sua resposta para entender por completo o programa porque tem algumas funções nele que desconheço tais como GetConsoleCP() e SetConsoleCP(). Eu até já dei uma pesquisada agora há pouco, mas tenho que me aprofundar mais, não entendi muito bem o parâmetro usado na função SetConsoleCP(), mas já obtive algum resultado que tem a ver com o que você tinha falado:

image.png.a784b423b3e444c3fb33a93b3bbfb3db.png

Enfim, ele imprimiu os caracteres que mencionou, inclusive consegui imprimir o 16º. Vou dar uma fuçada nesse link da Wikipédia que mandou, tem vários caracteres.

 

1 hora atrás, arfneto disse:

Dias atrás acho que eu postei um programa que faz essa "leitura assíncrona" como falou. É a solução para games, claro, porque você não pode usar um simples read() como deve imaginar.

 

Se tem interesse em ver me avise e eu procuro por ele. A lógica é simples. E não é assíncrono na verdade: você usa PeekConsole Input() e lê o buffer de teclado antes de ler via read() ou scanf() ou getc(0 ou sei lá.

Acho que me recordo disso, foi nesse post? Me lembro de ter lido mas não me atentei tanto assim, vou reler.

Postado
14 minutos atrás, Lucca Rodrigues disse:

Ele imprimiu os caracteres que mencionou, inclusive consegui imprimir o 16º. Vou dar uma fuçada nesse link da Wikipédia que mandou, tem vários caracteres

 

Os caracteres abaixo de 32 são problemáticos como eu disse. Vai depender de coisas como a codepage, a codepage de saida E a fonte em uso na console. Um inferno.

 

16 minutos atrás, Lucca Rodrigues disse:

Acho que me recordo disso, foi nesse post? Me lembro de ter lido mas não me atentei tanto assim, vou reler

 

Eu pensava em outro, que criava Snapshots dos processos rodando. Mas esse aí tem mais a ver porque o tópico tem mais detalhes, muito embora eu acho que não tenha conseguido explicar ao autor do tópico porque precisa de peek() afinal :( 

 

Ficou meio escuro na imagem e me esqueci de citar: na tabela tem 4 blocos para desenho que preenchem o espaço do cursor todo. São os que aparecem no fim. Eram bem legais em jogos. Eu escrevi um programa de demonstração desses blocos e dessas linhas. Não sei pra que mas também não achei :( :(  quando eu achar te mostro.

 

 

  • Obrigado 1
Postado

@arfneto

14 minutos atrás, arfneto disse:

Os caracteres abaixo de 32 são problemáticos como eu disse. Vai depender de coisas como a codepage, a codepage de saida E a fonte em uso na console. Um inferno.

De qualquer forma já é uma mão na roda, tem caracteres lá, os que estão no fim da tabela, que eu queria imprimir há um tempo, mas não sabia como.

Existem vários codepages, não é? Estava dando uma olhada nessa página. Realmente deve ter bastante coisa.

 

14 minutos atrás, arfneto disse:

Eu pensava em outro, que criava Snapshots dos processos rodando. Mas esse aí tem mais a ver porque o tópico tem mais detalhes, muito embora eu acho que não tenha conseguido explicar ao autor do tópico porque precisa de peek() afinal :( 

Acho que ta bem explicado. Talvez o autor desse post só estava buscando uma forma rápida de resolver o problema com o jogo dele e ignorou toda sua explicação.

  • Curtir 1
Postado
2 minutos atrás, Lucca Rodrigues disse:

De qualquer forma já é uma mão na roda, tem caracteres lá, os que estão no fim da tabela, que eu queria imprimir há um tempo, mas não sabia como.

Existem vários codepages, não é? Estava dando uma olhada nessa página. Realmente deve ter bastante coisa.

 

Sim. Mas só a codepage não é suficiente como eu falei. Pode ser que a fonte não tenha os caracteres e troque por outros. Pode sair diferente na tela da console ou na tela do IDE ou no Terminal do Windows. Um inferno.

 

E se comparar por exemplo com o mapa de carateres de uma fonte qualquer hoje em dia vai ver a diferença
 

image.png.dbe39d7b99aafe0fcd68001e89de9261.png

 

Veja tahoma por exemplo, só um pedaço :) 

 

Então pode usar o Terminal do Windows que tem aceleração gráfica e escrever em Unicode na codepage 65001.

 

Mas isso é algo estranho. Por um lado ninguém usa isso desde os 90. Mas o interesse nesses programas de console aumentou muito nesses últimos anos. Muito mesmo. A Microsoft gastou milhões e milhões nisso. Mas no desktop isso não tem interesse. O lance é que com as máquinas indo aos milhões para a nuvem ficou importante ter uma interface portável e segura porque as máquinas em geral são acessadas via web para qualquer uso. Menos para administração e precisam de algo portável a nível de caracter porque elas não tem interface gráfica.

 

  • Obrigado 1
Postado

Eu tenho essa função aqui que faz aquele tipo de moldura, com certeza da pra melhorar. Veja se ajuda.

 

#include <stdio.h>
#include <windows.h>

void gotoxy(int x, int y)
{
    HANDLE hCon;
    COORD dwPos;

    dwPos.X = x;
    dwPos.Y = y;
    hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hCon,dwPos);
}

void retangulo()
{
     // Linhas horizontais
     for(int i=2; i < 78; i++){
        gotoxy (i, 3); printf ("%c", 205);
        gotoxy(i, 23); printf ("%c", 205);
     }
     // Linhas verticais
     for(int v=4; v < 23; v++){
        gotoxy (2,v);  printf ("%c", 186);
        gotoxy(77,v);  printf ("%c", 186);
     }
     // Cantos
     gotoxy  (2,3);    printf ("%c", 201);
     gotoxy (2,23);    printf ("%c", 200);
     gotoxy (77,3);    printf ("%c", 187);
     gotoxy(77,23);    printf ("%c", 188);
}

int main()
{
    retangulo();
    return 0;
}

 

  • Curtir 1
Postado
20 horas atrás, Lucca Rodrigues disse:

Da pra fazer umas molduras legais, como a do programa que mostrou

 

21 horas atrás, Lucca Rodrigues disse:

GetConsoleCP() e SetConsoleCP()

 

Mudanças na configuração da console permanecem depois da execução do programa. Essa é a razão de chamar sempre aos pares Get e Set em programas de console: você tem que salvar tudo como era antes e depois restaurar.

E pode ter que mudar muito mais coisas, porque pode ter que garantir que a fonte em uso na console também tenha as letras que quer, pode não poder usar as barras de scroll na lateral da janela e coisas assim. Pode precisar de um tamanho mínimo ou máximo de janela. Pode ter que garantir que o cara não mudou o tamanho durante a execução do programa, ou reagir a uma mudança. Tudo que o Windows faz de graça.

 

E só pode usar uma codepage por vez. . .

 

Note que a página 437 tem as intersecções entre barras simples e duplas para poder usar dois níveis de linhas na tela. Veja alguns:
 

image.png.0e9a7e849fe16ed635c16381266be246.png

 

Para a época era bem esperto.

 

Encontrei o programa de que falei e está disponível em https://github.com/ARFNeto-CH/chc20-0722-box para baixar ou https://github.com/ARFNeto-CH/chc20-0722-box/blob/master/box.c para dar uma olhada.

 

Eis uma tela

 

1717564594_CapturadeTela(115).thumb.png.2586bb2ce83c40fb59b086209759931c.png

 

E outra
 

878739235_CapturadeTela(116).png.f5a0cb825be0611b0090b2a7dabfb3f9.png


Isso é na verdade um programa de teste de anos atrás. Era um pouco diferente e mais flexível porque gerava o trecho de código em C ou Pascal, mas assim serve para mostrar alguns desses detalhes. De uma olhada se se interessar.

 

Ele aceita os comandos que estão lá, de 0 a 5 para usar os 6 caracteres de desenho, c para mudar a cor e t para mudar o tempo. q para encerrar, h para help.

 

Mas ele não lê nenhum comando, como um jogo. E usa esses caracteres de box-drawing dos anos 80. E muda a fonte da console, a página de saída, retira a barra de scroll e coisas assim. É um exemplo.

 

 

 

  • Obrigado 2
Postado

Engraçado no TC da pra montar umas telinhas apenas passando os códigos ascii, tentei reproduzir o mesmo no Windows 10 com a conio2.h (implementação da antiga conio.h para sistemas Windows) e não funciona.

 

Mesmo passando os códigos certos o console do Windows parece não aceitar.

 

Aqui o código para rodar TURBO C++ 3.0 emulado com DOSBOX...  É fui longe com a arqueologia agora hehe... 

#include<stdio.h>
#include<dos.h>
#include<ctype.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>

void main()
{
	clrscr();
	_setcursortype(_NOCURSOR);
	textcolor(WHITE);
	cprintf("\n   ┌─────────────────────────────────────────────────────────────────────────┐  ");
	for(int i=0;i<17;i++)
	cprintf("   │                                                                         │  ");
	cprintf("   └─────────────────────────────────────────────────────────────────────────┘  ");
	cprintf("   ┌──────────────────────┐                                ┌─────────────────┐  ");
	cprintf("   │       J O G O        │   Pressione 'X' para Sair      │ PONTOS: 0       │  ");
	cprintf("   └──────────────────────┘                                │ VIDAS.: 2       │  ");
	cprintf("                                                           └─────────────────┘  ");
	while(1)
	{

		char ch=getch();
		switch(tolower(ch))
		{
			case 'x' : return;
		}
	}
}   // main

 

tc_000.png.853d06ccdd4e5f7a76468bdb2279f150.png

 

tc_001.png.a23cc7a0455cf8a90384c55f5fddd851.png

 

 

 

  • Curtir 1
  • Obrigado 1
Postado
6 horas atrás, Benjamin Breeg disse:

Aqui o código para rodar TURBO C++ 3.0 emulado com DOSBOX...  É fui longe com a arqueologia agora hehe

 

Acompanhou a discussão toda? São vários pre-requisitos para voltar no tempo. Não basta um programa e uma biblioteca.

 

Mesmo em 2020 um programa de console rodando no Terminal do Windows pode mostrar uma coisa e na tela do CMD outra e na tela do IDE outra. 

 

Você precisa controlar a fonte, a CodePage e a CodePage de saída que o DOSBOX usa...

adicionado 9 minutos depois

Voltando no tempo, acho que a primeira vez que escrevi isso foi em época anterior ao Turbo C, para escrever caixas de menu para mostrar na tela do terminal no tempo em que os terminais eram,digamos, terminais. E tinham teclado. E alguns, não todos, tinham tela.

E gerava um trecho de código depois para incorporar no programa. Isso  pra não ter que ficar editando o programa toda hora pra aumentar uma linha ou coluna. E podia gerar o código em C, Pascal ou Assembler para ir "direto" para a memória do vídeo, de uns poderosos 8 ou 16k --- quase tudo read-only --- de memória ou algo assim :) que o monitor de vídeo tinha. Assim o monitor podia mostrar aquelas telinhas de set-up com a moldura na tela, como o setup dos PCs anos depois. "direto" com aspas porque era preciso gravar na EPROM, um chip que levava o firmware do vídeo. E depois encaixar na placa lógica do vídeo. Então era bom ter certeza de que tinha testado :) antes de ir para produção.

Postado
Citação

Acompanhou a discussão toda? São vários pre-requisitos para voltar no tempo. Não basta um programa e uma biblioteca.

 

Sim... época diferente.. Não lembro onde li que os caixas eletrônicos nos anos 90 usavam essa conio para exibir as telas gráficas mas como você bem mencionou naquele tempo os programadores tinham acesso sem restrição ao hardware.

  • Curtir 1
Postado
39 minutos atrás, Benjamin Breeg disse:

Sim... época diferente.. Não lembro onde li que os caixas eletrônicos nos anos 90 usavam essa conio para exibir as telas gráficas mas como você bem mencionou naquele tempo os programadores tinham acesso sem restrição ao hardware

 

Não mudou nada. Apenas tem mais camadas e a cada camada uma "restrição. Se pude julgar que é mais fácil ou mais difícil, mas dá na mesma. Buffers, memória e registradores.

 

conio não é uma biblioteca gráfica. Eu até fazia isso nos 90 para a NCR.

 

  • Curtir 1
  • 4 semanas depois...
Postado
53 minutos atrás, Lucca Rodrigues disse:

@arfneto Por que não consigo imprimir os caracteres acima de 223 dessa code page 437 mesmo setando ela como no exemplo que mostrou?

 

Você não postou nenhum código então não sei o que dizer

 

Isso é o que deve aparecer no final da tabela
 

image.png.d2bac1dbc6f58cd1303be5a41371c79c.png

 

Em verde sobre preto como nos velhos tempos.

 

Como eu te disse não basta mudar a página de código. Depende daquelas coisas que eu listei. E você deve restaurar depois.

 

Coloquei esse loop no meio de um programa grande por isso não postei agora o código. Teste aí e se se não rodar mesmo me fale e mais tarde eu extraio só a parte que imprime a tabela e posto um programa funcional

 

 

    for (int i = 128; i < 255; i += 8)
    {

        printf("\n[%3d]\t", i);
        for (int j = 0; j < 8; j += 1)
        {
            printf("%4c", i+j);
        };
    };
    printf("\n");

Como eu sempre repito isso é um inferno e não vale a pena. Mas pode ser divertido então vale a pena ;)

 

Depende da fonte em uso na console ou no Terminal, da página de código da console e da página de código de saída da console, e sei lá o que mais

adicionado 18 minutos depois

Como nos velhos tempos, se estiver em uso a página 437 pode usar no teclado alt e o código e deverá ver as letras

 

image.png.599f89cb4005c9bde82283c928685ceb.png

 

Use o Terminal. É muito melhor e o recomendado.

 

image.png.25b233739039978631a5cdcd92bb87b9.png

 

248 é o sinal de grau.

 

Mas... 

 

o meu prompt na console sempre foi  sinal de integral, que usa duas linhas. No entanto nos tempos modernos o comando prompt não mostra isso, mesmo com a fonte Courier New que o mapa diz que devia imprimir:

image.png.5026d7f893768350960a51c1c4f8c0af.png

 

Como vê os sinais estão aí. Mas precisa de alguma leitura a mais pra entender, porque esses são os símbolos que aparecem no meu computador agora no meu computador:

image.png.50fe443f6bf8d2aef973eac7f6605405.png

 

Um inferno

 

  • Curtir 1
  • Obrigado 1
Postado

@arfneto Código com o loop que mostrou:

#include <stdio.h>
#include <string.h>
#include <windows.h>

int main(int argc, char** argv)
{
    int save_page = GetConsoleCP();
    SetConsoleCP(437);

    for (int i = 128; i < 255; i += 8)
    {

        printf("\n[%3d]\t", i);
        for (int j = 0; j < 8; j += 1)
        {
            printf("%4c", i+j);
        };
    };
    printf("\n");

    SetConsoleCP(save_page);

    return 0;
};

Saída:

image.png.79febc2025ad629833ef748cbb308e79.png

  • Curtir 1
Postado

? Você leu tudo que eu escrevi?  

 

Não definiu a fonte nem mostrou qual é. E a página de saída da console? 
 

38 minutos atrás, arfneto disse:

Depende da fonte em uso na console ou no Terminal, da página de código da console e da página de código de saída da console, e sei lá o que mais

 

SetConsoleOutputCP();

 

É como um videogame. Tem várias fases. 

  • Curtir 1
  • Obrigado 1
Postado

@arfneto

21 minutos atrás, arfneto disse:

Não definiu a fonte nem mostrou qual é

Pra redefinir a fonte eu teria que fazer manualmente? Não há uma forma de fazer isso no próprio código? Realmente não sei, testei aqui no CodeBlocks aquele código que mandei, e no computador de um amigo meu no DevC++, a saída foi a mesma, os mesmos caracteres, talvez a fonte seja a padrão de quando se instala, tenho que ver onde que é mostrada a fonte em uso...

 

21 minutos atrás, arfneto disse:

SetConsoleOutputCP();

No que isso implica? Tinha substituído SetConsoleCP() por esta daí, ou teria que usar ambas?

  • Curtir 1
Postado
3 minutos atrás, Lucca Rodrigues disse:

Pra redefinir a fonte eu teria que fazer manualmente? Não há uma forma de fazer isso no próprio código? Realmente não sei, testei aqui no CodeBlocks aquele código que mandei, e no computador de um amigo meu no DevC++, a saída foi a mesma, os mesmos caracteres, talvez a fonte seja a padrão de quando se instala, tenho que ver onde que é mostrada a fonte em uso...

 

Está programando em C, com a API do Windows, então pode fazer qualquer coisa

 

Eis um trecho que muda a fonte

 

    // muda a fonte para Courier New
    CONSOLE_FONT_INFOEX     fonte;
    fonte.cbSize = sizeof(CONSOLE_FONT_INFOEX);
    fonte.nFont = 0;
    fonte.dwFontSize.X = 10;
    fonte.dwFontSize.Y = 20;
    lstrcpyW(fonte.FaceName, L"Courier New");
    fonte.FontFamily = 54;
    fonte.FontWeight = 400;
    res = SetCurrentConsoleFontEx(config->o_handle, 0, &fonte);
    if (res == 0)
    {
        printf("SetCurrentConsoleFontEx() falhou: %d\n", GetLastError());
        return (-1);
    };  // if()

É só preencher um formulário, do jeito Windows de ser.

Mas entenda que deve salvar a fonte que estava em uso antes, e depois restaurar ao final.

 

6 minutos atrás, Lucca Rodrigues disse:

talvez a fonte seja a padrão de quando se instala, tenho que ver onde que é mostrada a fonte em uso

 

Eu já te mostrei isso...
 

image.png.9221c3ab1f02122315c390a92536153f.png

 

Está nas propriedades da janela
 

Não rode os programas no Dev-C++ ou qualquer IDE. É outro ambiente. Use o Terminal do Windows ou o CMD.

 

8 minutos atrás, Lucca Rodrigues disse:

No que isso implica? Tinha substituído SetConsoleCP() por esta daí, ou teria que usar ambas?

 

 

Leu a documentação na primeira tela do link que eu te mandei?     

 

Eu não me lembro da razão mas sempre uso ambas. Mas se vai usar uma só deve ser a da página de saída.

 

 

 

  • Curtir 1
  • Obrigado 1
Postado

@arfneto

56 minutos atrás, arfneto disse:

Está nas propriedades da janela

image.png.663f7194aaee65281f622253c2a488a5.png

 

55 minutos atrás, arfneto disse:

Não rode os programas no Dev-C++ ou qualquer IDE. É outro ambiente. Use o Terminal do Windows ou o CMD.

É que no caso eu queria tentar imprimir esses caracteres no console.

Postado
45 minutos atrás, Lucca Rodrigues disse:

É que no caso eu queria tentar imprimir esses caracteres no console.

 

????

 

Use o cmd ou o Terminal do Windows. Digite lá o nome de seu programa. Só isso.

 

A janela do IDE é um ambiente diferente. Seu programa pode mostrar um resultado lá e somente lá. Há programas que só rodam na janela do IDE. Compilados depois para produção ou na máquina do professor eles não rodam mais...

 

Existe o código de produção --- o tal Release Build --- que não faz tantos testes, não gera tanto código de diagnóstico e é muito mais compacto, rápido e otimizado. Só que é outro.

 

E é esse outro que você quer rodar, entregar ou vender. Ninguém mais vai compilar o seu programa. Em resumo, quando seu programa está ou parece ok, PARE de rodar no ambiente tosco do IDE.

 

E rode no Terminal do Windows. É o recomendado. É mais esperto, mais seguro e mais rápido.

  • Obrigado 1
Postado

@arfneto

2 horas atrás, arfneto disse:

Use o cmd ou o Terminal do Windows. Digite lá o nome de seu programa. Só isso.

Sim, entendi. É que no caso o programa seria compilado por outra pessoa, e o processo para rodar o programa é abrir o ambiente e rodar o programa, não poderia ser diferente.

 

5 horas atrás, arfneto disse:

Um inferno

Realmente é mesmo kkk, acho mais fácil perguntar pra quem for rodar qual é a fonte em uso pra saber o que eu posso usar, ou mesmo nem usar esses caracteres.

adicionado 5 minutos depois

Obrigado pela ajuda!

Postado
13 minutos atrás, Lucca Rodrigues disse:

Sim, entendi. É que no caso o programa seria compilado por outra pessoa, e o processo para rodar o programa é abrir o ambiente e rodar o programa, não poderia ser diferente

 

Fiquei confuso agora.

O programa em geral não é compilado por outra pessoa. A "outra pessoa" paga pelo programa e o recebe. Recebe o programa.
Quando uma pessoa escreve um enunciado descrevendo o programa esperado e o recebe uns arquivos aí é escola.

 

Em geral na máquina em que roda o programa não tem compiladores, IDE, linker, essas coisas. Programas são arquivos executáveis. São executados. Se dão erro o autor fica sabendo. Pode ser multado, perder um contrato, um emprego, ficar sem nota, ficar sem aquele ponto extra :)

 

O que estou tentado explicar é que um programa de console precisa levantar o ambiente em que está rodando, no início, e se garantir de que não vá usar um recurso que não tem na máquina em que ele está rodando, tipo Unicode ou uma fonte especial para escrever em grego.

 

E na saída precisa deixar tudo como achou porque não "está em sua casa".

 

Se a pessoa que vai receber o programa só sabe rodar o programa a partir de um IDE ou de um compilador aí temos uma inversão de papéis mesmo: nunca achei que as escolas poderiam gerar pessoas que só sabem rodar um programa compilando o código de novo.

 

13 minutos atrás, Lucca Rodrigues disse:

Realmente é mesmo kkk, acho mais fácil perguntar pra quem for rodar qual é a fonte em uso pra saber o que eu posso usar, ou mesmo nem usar esses caracteres

 

Não, não é. Achou complicado identificar a fonte da console mesmo eu tento te mostrado o código, que é um simples formulário, e que é apenas colocar dados em uma estrutura padrão cujos campos o windows já te mostra certinho e depois chamar uma função de dois parâmetros, o endereço da janela e a própria estrutura? E que retorna zero se deu certo?

 

 

 

 

 

 

 

  • Obrigado 1
Postado

@arfneto

1 minuto atrás, arfneto disse:

O programa em geral não é compilado por outra pessoa. A "outra pessoa" paga pelo programa e o recebe. Recebe o programa.
Quando uma pessoa escreve um enunciado descrevendo o programa esperado e o recebe uns arquivos aí é escola.

É esse segundo caso aí, o arquivo que envio é só a main.

 

5 minutos atrás, arfneto disse:

Achou complicado ver a fonte mesmo eu tento te mostrado o código, que é um simples formulário, e que é apenas colocar dados em uma estrutura padrão cujos campos o windows já te mostra certinho e depois chamar uma função de dois parâmetros, o endereço da janela e a própria estrutura? E que retorna zero se deu certo?

Isso meio que é novidade pra mim, API do Windows, etc. Eu sou iniciante.

Não conheço a seu respeito, mas se por acaso você ensina C ou C++, e seus alunos já sabem fazer isso, me faça seu aluno por favor haha :)

  • Haha 1
Postado

🤚

foi mal. São 3 parâmetros. Tem um boolean TRUE se a informação pedida é para a maior janela possível ou para o tamanho da janela atual. Isso porque a fonte tem um tamanho fixo e a janela pode mudar durante o uso do programa. Muita gente por exemplo tem a mania infeliz de maximizar a janela do programa. Qualquer programa. Window ao invés de Windows, mesmo que a janela seja só uma calculadora. E o programa muitas vezes precisa saber se a janela mudou de tamanho...

adicionado 1 minuto depois
2 minutos atrás, Lucca Rodrigues disse:

Isso meio que é novidade pra mim, API do Windows, etc. Eu sou iniciante.

Não conheço a seu respeito, mas se por acaso você ensina C ou C++, e seus alunos já sabem fazer isso, me faça seu aluno por favor haha

 

posso te ajudar. Provavelmente é o que importa.

adicionado 2 minutos depois
3 minutos atrás, Lucca Rodrigues disse:

É esse segundo caso aí, o arquivo que envio é só a main

 

Então ensine ao destinatário o que fazer com um programa. Onde rodar um programa de console. E não é no IDE por certo.

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...