Ir ao conteúdo

C Estou tentando usar a Função WriteConsoleOutput mas não consigo


Ir à solução Resolvido por Ansi C,

Posts recomendados

Postado

Olá eu estou tentando fazer um relogio junto com uma data sair no console mas que não afete o cursor ai descobri a função da biblioteca windows.h que é o WriteConsoleOutput() e estou usando em modo thread para não afetar o programa principal, mas n sai nada na tela

 

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <process.h>
#include <windows.h>

int i;

void timeagr();

HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

int main(int argc, char const *argv[])
{

	char teste;

	_beginthread(timeagr,0,NULL);

	printf("\n\n\n\n\n");
	scanf("%c", &teste);

	system("pause");
	return 0;
}

void timeagr()
{
	CHAR_INFO charbufferdata[9];
	CHAR_INFO charbufferhora[9];
	COORD bufsize = {1, 8};
	COORD bufcoorddata = {1, 1};
	COORD bufcoordhora = {1, 70};
	SMALL_RECT writearea = {0, 79, 24, 79};

	time_t rawtime;
	struct tm *timeinfo;

	char chartrocar1[3];
	char chartrocar2[3];
	char chartrocar3[3];
	char totaltroca[9];

	int s, m, h;
	int dd, mm, aa;


	for (;;)
	{
		time(&rawtime);
		timeinfo = localtime(&rawtime);

		s = timeinfo->tm_sec;
		m = timeinfo->tm_min;
		h = timeinfo->tm_hour;

		dd = timeinfo->tm_mday;
		mm = timeinfo->tm_mon + 1;
		aa = timeinfo->tm_year + 1900;

		totaltroca[0] = '\0';

		sprintf(chartrocar1, "%i", h);
		sprintf(chartrocar2, "%i", m);
		sprintf(chartrocar3, "%i", s);

		strcat(totaltroca, chartrocar1);
		strcat(totaltroca, ":");
		strcat(totaltroca, chartrocar2);
		strcat(totaltroca, ":");
		strcat(totaltroca, chartrocar3);

		for (i = 0; i < 9; ++i)
		{
			charbufferhora[i].Char.AsciiChar = totaltroca[i];
		}

		WriteConsoleOutput(hConsole, charbufferhora, bufsize, bufcoordhora, &writearea);

		totaltroca[0] = '\0';

		sprintf(chartrocar1, "%i", dd);
		sprintf(chartrocar2, "%i", mm);
		sprintf(chartrocar3, "%i", aa);

		strcat(totaltroca, chartrocar1);
		strcat(totaltroca, "/");
		strcat(totaltroca, chartrocar2);
		strcat(totaltroca, "/");
		strcat(totaltroca, chartrocar3);

		for (i = 0; i < 9; ++i)
		{
			charbufferdata[i].Char.AsciiChar = totaltroca[i];
		}

		WriteConsoleOutput(hConsole, charbufferdata, bufsize, bufcoorddata, &writearea);

		sleep(1);
	}
}

 

Postado

Olá@Gabriel Paulucci

 

1 hora atrás, Gabriel Paulucci disse:

0, 79, 24, 79

― Verifique as coordenadas da área de escrita, para mim, isso não são coordenadas retangulares. Cartesianamente, os dois pontos devem formar um segmento de reta oblíquo. "(0; 79), (24; 79)" essas coordenas dão um segmento de reta paralelo. Paralela ao eixo x | (y == y'), ou seja, não há retângulo para escrever !!!

 

 

  *    Você entendeu isso? Tem alguma pergunta??
  *    Pode falar O.k!

 

Postado
55 minutos atrás, AnsiC disse:

"(0; 79), (24; 79)"

 eu coloquei desse modo mais n mudou nada

SMALL_RECT writearea = {(0;79), (24;79)};

tentei colocar desse modo também mas n foi 

SMALL_RECT writearea;
writearea.Top = 0;
writearea.Left = 79;
writearea.Bottom = 24;
writearea.Right = 79;

 

Postado

*** Foi o que eu disse 🤣

 

1 hora atrás, AnsiC disse:

― Verifique as coordenadas da área de escrita, para mim, isso não são coordenadas retangulares. Cartesianamente, os dois pontos devem formar um segmento de reta oblíquo. "(0; 79), (24; 79)" essas coordenas dão um segmento de reta paralelo. Paralela ao eixo x | (y == y'), ou seja, não há retângulo para escrever !!!

 

79 == 79. Esse pode ser um dos erros.

Postado

então para fazer um retângulo 

 

   80
<------->
╔═══════╗/\
       25
╚═══════╝\/

eu teria que colocar (0, 0, 79, 25) ?

writearea.Top = 0;
writearea.Left = 0;
writearea.Bottom = 24;
writearea.Right = 79;

tentei e n deu certo

SMALL_RECT writearea = {0, 0, 24, 79};

a mesma coisa

WriteConsoleOutput(hConsole, charbufferhora, bufsize, bufcoordhora, &writearea)

sera que tem algo errado aqui ?

Postado

*** Fui compilar teu código e apareceram muitos erros (7 erros para ser exato). E não compilou.

 

adicionado 2 minutos depois

― Amanhã farei um revisão de cada um dos 7 erros e por último verei o caso da rotina.

  • Solução
Postado

Olá@Gabriel Paulucci

Agora com todas as 7 correções.

 

Imagem Ilustrativa

image.thumb.png.2122c73b9b8d8915d5726ad846732543.png 

Relógio

#include <windows.h>
#include <process.h>
#include  <stdlib.h>
#include  <string.h>
#include    <time.h>
#include   <stdio.h>

static int i= 0;
static HANDLE hConsole= ((HANDLE)0);
void timeagr(void *param);


int main(int argc, char const *argv[])
{
  hConsole= GetStdHandle(STD_OUTPUT_HANDLE);
    
  char teste= ((char)0);

  _beginthread(timeagr, 0, ((void*)0));

  printf("%s", "\n\n\n\n\n");
  scanf(" %c", &teste);

  system("PAUSE");
  return EXIT_SUCCESS;
}


void timeagr(void *param)
{
  time_t rawtime= ((time_t)0);
  struct tm *timeinfo= ((struct tm *)0);
    
  CHAR_INFO charbufferdata[sizeof((char[]){"DD/MM/YYYY"})]= {0};
  SMALL_RECT writeareadata = {0, 0, 12, 1};
  COORD bufsizedata= {11, 1};
  COORD bufcoorddata= {0, 0};
	
  unsigned DD, MM, YYYY;
  char tempo_DD[4]= {0};
  char tempo_MM[4]= {0};
  char tempo_YYYY[5]= {0};
  char tempo_DDMMYYYY[11]= {0};

  CHAR_INFO charbufferhora[sizeof((char[]){"hh:mm:ss"})]= {0};
  SMALL_RECT writeareahora = {11, 0, 23, 1};
  COORD bufsizehora= { 9, 1};
  COORD bufcoordhora= {0, 0};
    
  unsigned hh, mm, ss;
  char tempo_hh[4]= {0};
  char tempo_mm[4]= {0};
  char tempo_ss[4]= {0};
  char tempo_hhmmss[9]= {0};
    
  for(;/* ciclo infinto */;){
    time(&rawtime);
    timeinfo= localtime(&rawtime);

    DD=   timeinfo->tm_mday;
    MM=   timeinfo->tm_mon + 1;
    YYYY= timeinfo->tm_year + 1900;
        
    sprintf(tempo_DD, "%02u",   DD);
    sprintf(tempo_MM, "%02u",   MM);
    sprintf(tempo_YYYY, "%u", YYYY);

    strcat(tempo_DDMMYYYY, tempo_DD);
    strcat(tempo_DDMMYYYY, "\\");
    strcat(tempo_DDMMYYYY, tempo_MM);
    strcat(tempo_DDMMYYYY, "\\");
    strcat(tempo_DDMMYYYY, tempo_YYYY);
        
    for(i= 0; tempo_DDMMYYYY[i] != '\0'; ++i){
      charbufferdata[i].Char.AsciiChar= tempo_DDMMYYYY[i];
      charbufferdata[i].Attributes= FOREGROUND_BLUE |
                                    FOREGROUND_GREEN;
    }
    WriteConsoleOutput(hConsole, charbufferdata, bufsizedata, bufcoorddata,
                                                              &writeareadata);
    tempo_DDMMYYYY[0]= '\0';                                  

    hh= timeinfo->tm_hour;
    mm= timeinfo->tm_min;
    ss= timeinfo->tm_sec;
    
    sprintf(tempo_hh, "%02u", hh);
    sprintf(tempo_mm, "%02u", mm);
    sprintf(tempo_ss, "%02u", ss);
        
    strcat(tempo_hhmmss, tempo_hh);
    strcat(tempo_hhmmss, ":");
    strcat(tempo_hhmmss, tempo_mm);
    strcat(tempo_hhmmss, ":");
    strcat(tempo_hhmmss, tempo_ss);
        
    for(i= 0; tempo_hhmmss[i] != '\0'; ++i){
      charbufferhora[i].Char.AsciiChar= tempo_hhmmss[i];
      charbufferhora[i].Attributes= FOREGROUND_BLUE |
                                    FOREGROUND_GREEN;
            
    }    
    WriteConsoleOutput(hConsole, charbufferhora, bufsizehora, bufcoordhora,
                                                              &writeareahora);
    tempo_hhmmss[0]= '\0';


    Sleep(5);
    }
}
  • Curtir 1
Postado

valeu cara mas o que exatamente esta com erro ? so pra eu n errar novamente caso eu tente fazer de novo ?

 

char teste= ((char)0);
_beginthread(timeagr, 0, ((void*)0));
time_t rawtime= ((time_t)0);
struct tm *timeinfo= ((struct tm *)0);
CHAR_INFO charbufferdata[sizeof((char[]){"DD/MM/YYYY"})]= {0};
sprintf(tempo_DD, "%02u",   DD);

você poderia por gentiliza explicar esse parâmetros ? nunca utilizei eles assim e nem vi em nenhum lugar 

 

por exemplo porque você utilizou char teste = "((char)0)" isso muda algo ?

Postado

Olá@Gabriel Paulucci

char teste= ((char)0);
_beginthread(timeagr, 0, ((void*)0));
time_t rawtime= ((time_t)0);
struct tm *timeinfo= ((struct tm *)0);

― Todas as expressões em parentes + 0, equivalem ao macro NULL.

É puramente cultural. Usualmente vera o NULL!

 

 

14 horas atrás, Gabriel Paulucci disse:

por exemplo porque você utilizou char teste = "((char)0)" isso muda algo ?

― Sim, mais não tem que se preocupas com isso. teste= 0; E vera que o código funcionara do mesmo jeito. Os seus maiores erros foram nas dimensões e nos tamanhos dos arranjos. É só comparar e verá.

 

CHAR_INFO charbufferdata[sizeof((char[]){"DD/MM/YYYY"})]= {0};

― Esta expressão retorna dentro o tamanho da string literal "DD/MM/YYYY".

Verá na internet o equivalente a usando a função strlen(char *str); da biblioteca <string.h>

Exemplo:

/** 
 *	Declarando um arranjo variável - VLA
 *	Usando a Função strlen(char *str) de string.h
 *    
 *	Referência http://www.cplusplus.com/reference/cstring/strlen/
 */
const size_t DDMMYYYY_LEN= strlen("DD/MM/YYYY") + 1; /*< Instancia: tamanho da string. */
CHAR_INFO charbufferdata[DDMMYYYY_LEN]; /*< Instancia: arranjo variável em tempo de execução. */
/* Em outras palavras "DD/MM/YYYY" == 11 caracteres. */

 

 

― Você entendeu isso? Tem alguma pergunta??

Pode falar O.k!

 

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!