Ir ao conteúdo
  • Cadastre-se

arfneto

Membros Plenos
  • Total de itens

    799
  • Registro em

  • Última visita

  • Qualificações

    N/D
  1. Estive procurando um exemplo de como endereçar uma área para acessar com 1 índice ou 2 ou talvez mais e não encontrei quase nada, exceto por umas notas no conhecido C FAQ em http://c-faq.com/about.html Então escrevi um exemplo e vou postar aqui. Talvez ajude alguém em algo que eu acho um inferno: como acessar algo assim. Não há razão para uma classe aqui: basta uma struct e assim pode ser usado em C também o mesmo código, ou quase. A estrutura é uma bobagem, só para exemplo, e é algo como uma variante, ou tagged union como se lê às vezes: struct multiD { int len; union { int(*x1D)[60]; int(*x2D)[4][15]; int(*x3D)[3][4][5]; int(*x4D)[2][3][2][5]; int(*x5D)[1][2][2][3][5]; }; }; É só para mostrar como declarar ponteiros para vetores como usar uma union anônima --- sem nome --- para acessar a mesma área na memória com variáveis alternativas, o tal registro variante O programa é bem linear: aloca o vetor com 60 posições, int, e numera todas de 00 a 59 acessa o vetor como uma matriz de 1 a 5 dimensões e mostra como acessar os valores usando os operadores tradicionais []. Usando ponteiros é mais simples e tem um programa aqui no forum que mostra isso, de umas semanas atrás. Pesquise por Tanenbaun + índices + arfneto e deve aparecer. O objetivo aqui era usar os colchetes. mostra todos os valores nas possíveis dimensões mostra o último valor em cada matriz para ver que é o mesmo 59 Veja o final da saída do programa O ultimo elemento, visto com 1 a 5 indices, deve ser o mesmo: 1D v[59] = 59 2D v[3][14] = 59 3D v[2][3][4] = 59 4D v[1][2][1][4] = 59 5D v[0][1][1][2][4] = 59 ARFNETO 2020 O programa é simples, e gira em torno da struct e dessa função void mostra(multiD* matriz, int planos){}; que recebe uma struct e acessa com os índices certos para o número de planos passado... Veja o caso para uma dimensão, usando ponteiros porque eu esqueci que ia usar só índices e agora não vou mudar mais case 1: // int(*x1D)[60]; for (int i = 0; i < matriz->len; i += 1) { std::cout << setw(2) << i << ": " << setw(2) << *(*(matriz->x1D) + i) << " "; if (i % 10 == 9) cout << endl; }; // for break; E para 3 case 3: // int (*x3D)[3][4][5]; for (int i = 0; i < 3; i += 1) for (int j = 0; j < 4; j += 1) for (int k = 0; k < 5; k += 1) std::cout << "(" << setw(2) << i << "," << setw(2) << j << "," << setw(2) << k << ") = " << (*matriz->x3D)[i][j][k] << endl; break; E um trecho do programa principal // exemplos de vetores xD int v1D[60]; int v2D[4][15]; int v3D[3][4][5]; int v4D[2][3][2][5]; int v5D[1][2][2][3][5]; multiD teste; // estrutura de teste teste.len = 60; teste.x1D = &v1D;// so testes, para mostrar o acesso teste.x2D = &v2D;// so testes, para mostrar o acesso teste.x3D = &v3D;// so testes, para mostrar o acesso teste.x4D = &v4D;// so testes, para mostrar o acesso teste.x5D = &v5D;// so testes, para mostrar o acesso // preenche usando o vetor v1D teste.x1D = &v1D; // for (int i = 0; i < teste.len; i += 1) *(*(teste.x1D) + i) = i; // igual for (int i = 0; i < teste.len; i += 1) (*teste.x1D)[i] = i; // mostra a mesma area de 1 a 5 dimensoes for (int i = 1; i <= 5; i += 1) mostra(&teste, i); // nada a liberar: so usamos valores estaticos // agora mostra o ultimo elemento de cada vetor cout << "\nO ultimo elemento, visto com 1 a 5 indices, deve ser o mesmo:\n" << endl; cout << "1D v[59] = " << (*teste.x1D)[59] << endl; cout << "2D v[3][14] = " << (*teste.x2D)[3][14] << endl; cout << "3D v[2][3][4] = " << (*teste.x3D)[2][3][4] << endl; cout << "4D v[1][2][1][4] = " << (*teste.x4D)[1][2][1][4] << endl; cout << "5D v[0][1][1][2][4] = " << (*teste.x5D)[0][1][1][2][4] << endl; Se alguém precisar, o programa pode ser baixado aqui, ou lido lido aqui O que importa é só como declarar e como acessar as diferentes matrizes, e o lance da variante, que é um conceito muito útil para quando você vai receber um registro que tem um certo número de formatos, dependendo muitas vezes de algum prefixo identificador
  2. Não sei se entendi, mas você pode gerar o código em HTML no arquivo de saída do seu programa em C e assim não ter que mexer em nada para colar do outro lado, se é disso que precisa
  3. Não. Windows 10 é mais esperto apenas. Algo que não é estranho já que Windows 7 foi lançado em 2009 Talvez pudesse explicar o que não está conseguindo. Seu IDE vai usar o compilador externo para gerar um arquivo executável. Só isso. Ele fez isso? Achou o executavel? Achou onde abrir a janela do prompt de comando? Viu a imagem que te mostrei com as 3 janelas abertas?
  4. Dev C++ é um ambiente de desenvolvimento. Ele usa um compilador externo, tipo gcc ou mingw ou algo assim. Eu não uso esse ambiente. Mas o fato é que ele acaba gerando um executável, um arquivo que deve ter o mesmo nome que seu programa em c. pgm.c gera pgm.exe por exemplo. Esse pgm.exe você pode levar para qualquer computador e rodar. Só digitando o nome. Afinal é para isso que a gente um programa: para rodar em outras máquinas. Dev C++ já cumpriu seu papel quando seu programa ficou pronto. Você pode rodar o programa direto no executar do Windows, e no seu caso serviria até. Mas em geral você abre uma janela de comando, rodando Windows+R e CMD e ENTER. Isso porque a janela de execução de seu programa fecha ao final do programa e isso pode deixar o usuário inseguro. Um outro caminho, mais comprido, aperta iniciar e escreve "prompt de comando" claro que não precisa escrever tudo. Já vai apareer na tela: Na janela que vai abrir, a tal "Prompt de comando" você digita o nome do seu programa. O nome completo. É essa sua dúvida? Viu a janela que eu postei com a imagem do terminal rodando isso?
  5. Viu o exemplo que te mostrei? É só isso. Você põe seu código no programa que eu mostrei, no lugar daquele for que imprime as linhas de teste. E seu programa gera o arquivo com o nome que voce quiser e o notepad abre em seguida o arquivo novo... ch-testec arquivo.txt && notepad arquivo.txt Assim. Viu a imagem da tela?
  6. Entendo. A documentação diz que esses mecanismos de acesso à área de transferência são reservados para projetos do tipo desktop e não para programas de console, mas acho que ao menos em C++ deve ser possível replicar o funcionamento. Testei algumas das funções e parece que todas funcionam no ambiente da console. Mas é um processo complicado para de fato criar um teste completo. Se eu tiver tempo de criar um programa eu posto aqui. Em essência o problema é que a área de transferência é uma área global de transferência, e pode conter um número enorme de coisas diferentes, algumas até criadas pelo usuário. E pode ter apenas um "dono" por vez na hora de gravar. E tem que alocar um recurso global e pode conter por exemplo um texto, ou uma foto, ou uma lista de arquivos, como quando você arrasta um ícone de um programa para a janela do compilador e ele abre o arquivo --- não sei se o compilador que usa faz isso., mas acho que entendeu o exemplo: drag & drop se chama. Programas de console vivem em um ambiente mais ou menos separado no Windows, e fica difícil e muitas vezes impossível usar coisas dos projetos desktop. Em C# você tem uma classe clipboard que tem essas funções facinho. Em C++ usando aplicações de console precisaria testar mais com a documentação que te passei antes. Para desktop seria tranquilo. De todo modo, para o seu problema talvez não precise passar por isso. Sugiro não rodar programas do prompt do compilador. Não faz sentido. Arrume seu programa e gere um executável. Não há razão para compilar e gerar o mesmo código toda vez que faz um orçamento. Mude seu programa para gerar, além da saída na tela que já te atende, uma saída em um arquivo de texto, via fprintf() que é igualzinho ao printf(). E nesse arquivo gere exatamente no formato que quer importar pro mercado livre. Gere um atalho para rodar o seu programa e um atalho para abrir por exemplo o Bloco de Notas com o seu texto. Clica no atalho de seu programa e gera o orçamento Clica no atalho do notepad e abre o novo arquivo gerado No bloco de notas, control A seleciona o texto todo, Control C copia. E vai tudo certo já que foi você que escreveu o programa No mercado livre, control V copia o orçamento E a vida segue Um exemplo mais integrado: Claro, não use telas maximizadas no Windows. São muito pouco produtivas e não vai conseguir fazer o que estou explicando. E quando são produtivas o próprio programa terá um atalho para isso. Meu compilador usa Alt-Shift-Enter, o Windows em geral usa F11, como o navegador Edge, o navegador Chrome... Na tela do prompt de comando: para rodar o programa de novo para um próximo orçamento basta usar a seta para cima --- veja na imagem abaixo No notepad control-O abre um novo arquivo, mas pode só fechar o programa e abrir com o atalho que ele abre na mesma posição na janela... E no fundo nem precisa do atalho porque pode abrir o bloco de notas com o arquivo gerado pelo programa usando o próprio prompt de comando Se você tiver um programa de orçamento C chamado ch-testec.c vai gerar um executável ch-testec.exe. Se seu programa exigir um argumento com o nome do arquivo de teste pode abrir o orçamento direto no NotePad assim por exemplo ch-testec arquivo.txt && notepad arquivo.txt O efeito do "&&" é chamar o comando seguinte --- notepad arquivo.txt --- se o comando anterior --- ch-testec arquivo.txt --- retornou ok. Ou seja, o seu programa retornou 0 em main(). E aí o orçamento gerado já abre no bloco de notas... Se for importante você pode até usar um arquivo .BAT e ir numerando os orçamentos, como arquivo1.txt, arquivo2.txt ... de modo a não perder nenhum se for importante. Aberto no bloco de notas você usa Control-A, Control-C e vai no mercado livre com alt-TAB se já está com o site aberto, e já cola o orçamento com control-C claro Veja uma tela assim, depois de rodar o programa: E um protótipo do programa #define _CRT_SECURE_NO_WARNINGS #include "stdio.h" #include "stdlib.h" int main(int argc, char** argv) { if (argc < 2) { fprintf(stderr, "\nCancelando: Faltou o nome do arquivo de saida\n\n"); return -1; } FILE* saida = fopen(argv[1], "w"); if (saida == NULL) { fprintf(stderr, "Nao conseguiu abrir [%s]\n", argv[1] ); return -1; } fprintf(stderr, "Criado [%s]\n", argv[1]); fprintf(saida, "gerado pelo programa\n"); for (int i = 1; i <= 10; i += 1) fprintf(saida, "Orcamento linha %02d\n", i); fclose(saida); }; // main() E para rodar o programa de novo basta voltar no prompt e usar a seta para cima... Acha que serve?
  7. Não consegui entender printf() é uma função,o resultado vai para a saída padrão. control C é uma combinação de teclas, e dependendo da configuração e do sistema pode gerar uma interrupção, um sinal no Linux que você pode interceptar e associar a uma função em seu programa. No Windows não funciona assim. Estaria usando Windows e quer copiar um texto para a área de transferência? Se for esse o caso a documentação está toda aqui em https://docs.microsoft.com/en-us/windows/win32/dataxchg/about-the-clipboard
  8. Porque em java seria mais simples? Tem um exemplo? Porque não usou strings em C++? Em java não poderia alocar nada, e então não precisaria liberar nada. Mas não fez isso em seu programa então não faria muita diferença, eu acho. Foi a diferença que me ocorreu. Não sei se consegui entender ao certo o que quer fazer mas parece ser um tema útil para outros também, então escrevi um programa de exemplo "retornar um array 2D de funções" --- o que está no título --- Seria como retornar uma matriz MxN de endereços de funções. Não é o que seu programa faz e acho que não é o que pretende. Mas vou mostrar esse caso. "passar arrays 2D de char por funções" Pelo seu código char** createTable(int m, int n) { int total = m*n; arr = new char* [m]; for (int i = 0; i < m; i++) { arr[i] = new char[n]; for (int j = 0; j < n; j++) { arr[m][n] = '0'; } } return arr; } parece pretender retornar um array de strings, como o argv do C/C++, com uma string para cada linha. Ou seria o caso de retornar uma matriz (MxN) de char com '0'? Considere M = 6 e N = 4 nesse exemplo adiante. 1: Como sua rotina parece fazer: O resultado aparentemente esperado para createTable() seria então 000 000 000 000 000 000 onde arr[0] até arr[5] seriam strings e temos 4 bytes para cada uma. Como tem que ter um null para terminar a string restam 3 para colocar o '0' cujo valor é 48 na tabela, e o 0 vem depois. seu programa cancela por isso (ou pela falta disso: o null ao final)... Assim funcionaria: char** createTable(int m, int n) { char** arr; arr = new char* [m]; for (int i = 0; i < m; i++) { arr[i] = new char[n]; for (int j = 0; j < n - 1; j++) arr[i][j] = '0'; arr[i][n - 1] = 0; }; return arr; } 2: Uma matriz de char MxN Esse é o caso mais comum. O resutado esperado seria uma coisa assim, usando '0' como fez para preencher: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Assim funcionaria: char* createTableXY(const int m, const int n) { char* arr = new char[m*n]; memset(arr,'0', m*n); return arr; } E poderia chamar assim, e mostra a matriz a seguir: char* coisa = createTableXY(m,n); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cout << *(coisa + i*n + j) << " "; }; // for (j) cout << endl; }; // for(i) // game over: apaga os caras delete coisa; O que importa aqui é isso: *(coisa + i*n + j); // para acessar o elemento (i,j) da matriz (Dias atrás teve uma discussão aqui nesse forum de como acessar um elemento para uma matriz com qualquer número de índices, e tem lá um programa de teste e referências.) 3: Um array 2D de funções Esse é mais raro e mais enjoado. É absolutamente essencial em C, C++, java e o diabo, mas em geral é transparente para quem usa. No caso de java e C++ é a maneira de se implementar funções virtuais, classes abstratas, aquelas coisas. É criada uma tabela de funções, chamada VFT --- virtual function table --- que define qual função vai ser chamada para uma certa classe virtual. Postei um exemplo disso aqui um dia desses. Vou dar um exemplo aqui pra ficar mais completo, ainda que poucos tenham paciência de ler. Respostas curtas são tão mais legais! Em C/C++ Isso declara pFteste como o endereço de uma função que retorna int e recebe dois int como argumentos int (*pFteste)(int, int); Então você pode escrever typedef int (*pF)(int, int); E pF** cria_vetor_2D(const int, const int); E esse poderia ser o protótipo de uma função que retornaria um vetor 2D de ponteiros para função. Você chamaria assim, no nosso exemplo: pF** teste_v2D = cria_vetor_2D(M,N); Para não complicar, considere essa função int modelo(int a, int b) { cout << "funcao(" << a << "," << b << ")" << endl; return a * b; }; // modelo() Ela recebe dois int mostra os valores e retorna o produto deles. E serve para o nosso pF. Claro que normalmente se usa (void*) para as funções e depois converte para o que for preciso, como o qsort() no C por exemplo. Veja uma implementação de cria_vetor_2D() que preenche a matriz de funções com o endereço dessa aí e retorna o endereço da tal matriz // cria vetor 2D de funcoes pF** cria_vetor_2D(const int x, const int y) { pF** v2D = new pF* [x]; for (int i = 0; i < x; i++) { v2D[i] = new pF[y]; for (int j = 0; j < y; j++) v2D[i][j] = modelo; }; // for (i) pF a = modelo; (*a)(1, 2); return v2D; }; // cria_vetor_2D() E Como chama um trem desses? Simples. No exemplo MxN que temos essas 3 linhas criam a matriz e chamam a primeira e a última função na matriz, só para testar: pF** teste_v2D = cria_vetor_2D(M,N); (*teste_v2D[0,0])(3,8); (*teste_v2D[M - 1, N - 1])(M - 1, N - 1); Como apagar essas coisas? Atente para o fato de que ao alocar um array em C++ depois PRECISA usar colchetes no delete. Então para apagar a matriz por exemplo precisa escrever assim: // game over: apaga os caras for (int i = 0; i < M; i++) delete[] arr[i]; delete arr; Eis o resultado do programa exemplo, que usa as 3 opções Testando para M = 6 e N = 4 1: uma string por linha linha: 0 [000] linha: 1 [000] linha: 2 [000] linha: 3 [000] linha: 4 [000] linha: 5 [000] 2: matriz MxN de caracteres 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3: array 2D de funcoes funcao(3,8) retornou 24 funcao(5,3) retornou 15 E o programa #define _CRT_SECURE_NO_WARNINGS // https://www.clubedohardware.com.br/forums/topic/ // 1427656-retornando-array-2d-de-fun%C3%A7%C3%B5es/ // ?tab=comments#comment-7699344 #include <iostream> #include <string.h> typedef int (*pF)(int, int); char** createTable(int, int n); char* createTableXY(const int, const int); pF** cria_vetor_2D(const int, const int); int modelo(int, int); using namespace std; int main(int argc, char** argv) { int M = 6; int N = 4; cout << "Testando para M = " << M << " e N = " << N << endl; cout << "\n1: uma string por linha\n\n"; char** arr = createTable(M, N); for (int i = 0; i < M; i++) { cout << "linha: " << i << " [" << arr[i] << "]" << endl; } // game over: apaga os caras for (int i = 0; i < M; i++) delete[] arr[i]; delete arr; // cout << "\n2: matriz MxN de caracteres\n\n"; char* coisa = createTableXY(M, N); for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { cout << *(coisa + i * N + j) << " "; }; // for (j) cout << endl; }; // for(i) // game over: apaga os caras delete coisa; cout << "\n3: array 2D de funcoes\n\n"; pF** teste_v2D = cria_vetor_2D(M, N); int r = (*teste_v2D[0, 0])(3, 8); cout << "retornou " << r << endl; r = (*teste_v2D[M - 1, N - 1])(M - 1, N - 1); cout << "retornou " << r << endl; for (int i = 0; i < M; i++) delete[] teste_v2D[i]; delete teste_v2D; return 0; }; // main() char** createTable(int m, int n) { char** arr; arr = new char* [m]; for (int i = 0; i < m; i++) { arr[i] = new char[n]; for (int j = 0; j < n - 1; j++) arr[i][j] = '0'; arr[i][n - 1] = 0; }; return arr; }; //createTable() char* createTableXY(const int m, const int n) { char* arr = new char[m * n]; memset(arr, '0', m * n); return arr; }; // createTableXY() pF** cria_vetor_2D(const int x, const int y) { int (*pFteste)(int, int); pF** v2D = new pF * [x]; for (int i = 0; i < x; i++) { v2D[i] = new pF[y]; for (int j = 0; j < y; j++) { v2D[i][j] = modelo; }; // for (j) }; // for (i) return v2D; }; // cria_vetor_2D() int modelo(int a, int b) { cout << "funcao(" << a << "," << b << ")" << endl; return a * b; }; // modelo()
  9. postei aqui --- no ano pasado --- nesse forum duas soluções para números primos que pode adaptar para esse exercicio, afinal basta contar os fatores. Uma usava o crivo de eratostenes e a outra era convencional. pode pesquisar aqui por esse tema
  10. A resposta curta é sim. Note que em C++ objetos são chamados classes então uma classe inteira de objetos seria uma classe. Só isso. E que poderia conter outras classes, que poderiam conter outras classes e tal. E você não passa uma classe inteira de objetos, passa uma instância da classe --- ou do objeto, se preferir chamar assim. Hoje não posso escrever um exemplo, mas entenda que ao usar algo como void funcao_carro( carro um_carro ){ return; }; vai estar copiando a variável para outro local e então construtores serão invocados, e você precisa entender os custos e os efeitos colaterais disso. Apenas usando ponteiros vai deixar de usar esses mecanismos --- construtores --- e nem sempre a lógica permite usar ponteiros, então é preciso se acostumar com esses casos.
  11. arfneto

    C Lista encadeada em C

    Esqueci de comentar isso, mas ao inserir em uma lista você parece ter optado pelo caminho curto, inserir no início. Mas no propósito geral de usar uma lista encadeada muitas vezes se espera manter a ordem de inserção --- a lista é dita estável --- de modo que ao percorrer a lista você vê os elementos na ordem em que foram inseridos. O primeiro listado será o primeiro inserido e assim por diante. manter a lista ordenada --- e se usa claro algum campo e uma função de comparação --- de modo que ao percorrer a lista os elementos vem classificados, por ordem crescente, por CEP, por endereço de entrega, por algo útil na aplicação que usa sua lista. E nesses casos você precisaria inserir de acordo...
  12. arfneto

    C Problemas com VS Code

    Ainda não tenho uma máquina com windows 7 pra rodar isso. Mas nesse computador que eu uso em geral para acessar o forum configurei o VSCode sem problemas para compilar no Ubuntu, no SUSE, e no Windows hoje. É uma máquina antiga mas que roda WIndows 10 e o tal WSL2, o subsistema para Linux da Microsoft. Para compilar no Windows não precisa de muito. Para usar para compilar C e C++ em Windows no Windows 7 você pode usar qualquer compilador. O VS Code não tem um. Tudo o que precisa fazer é ver o caminho certinho para seu compilador e colocar no arquivo c_cpp_properties.json que é um formulário assim { "configurations": [ { "name": "Win32", "defines": ["_DEBUG", "UNICODE", "_UNICODE"], "compilerPath": "Compilador", "windowsSdkVersion": "10.0.17763.0", "intelliSenseMode": "msvc-x64", "cStandard": "c11", "cppStandard": "c++17" } ], "version": 4 } JSON --- JavaScript Object Notation --- é um formato comum para texto em pares chave/valor e em compilerPath você coloca o caminho completo para o compilador que quer usar e preenche o resto de acordo. Para usar o compilador da Microsoft você precisa segundo a documentação chamar o vscode a partir de um prompt de desenvolvedor do Windows. Para ter isso você tem duas opções: ou instala o Visual Studio ou apenas o kit de build da Microsoft para o seu sistema. É de graça. Está em https://visualstudio.microsoft.com/pt-br/downloads/ e deve rodar no windows 7. Não se esqueça que precisa também do .Net A documentação mais precisa está em https://code.visualstudio.com/docs/cpp/config-msvc adicionado 4 minutos depois Pode ser uma vantagem para poder testar programas de console em C ou C++ em distribuições Linux E no Windows usando o novo Terminal e a nova API sem sair do VS Code. Bem moderno achei.
  13. arfneto

    C Lista encadeada em C

    Mude a declaração de Inserir() para retornar o novo endereço do início da lista ou ele vai se perder... Use Valor* Inserir(Valor*, int ); Declare a lista em main(), mais seguro. Declare apenas estruturas e protótipos fora de main(). Imprima a lista lista antes de inserir. É um bom começo saber que pode listar uma lista vazia Com algo assim você progride mais depressa: int main(void) { Valor* aLista = NULL; imprimeEncadeada(aLista); for(int i=0; i<5; i+=1) { aLista = Inserir(aLista, i); imprimeEncadeada(aLista); } return 0; } Escreva a função que apaga a lista toda, com o mesmo protótipo que inserir()
  14. Tem um exemplo aqui e mais documentação https://docs.microsoft.com/pt-br/windows/win32/psapi/enumerating-all-processes E o programa que eu postei para ajudar foi em 12/dez. Ele faz o seguinte: Cria o que se chama de snapshot que deve ter visto na documentação, e grava em uma estrutura bem simples: struct snapshot { int total; time_t hora; PROCESSENTRY32** processo; }; typedef struct snapshot Snapshot; Depois espera um ENTER e cria uma nova lista e compara. Eis o final de uma execução O programa pode ver visto visto aqui ou baixado aqui Eu acho que postei um outro mais sofisticado mas ainda não consegui me lembrar dos detalhes nem da linguagem. Eu aviso se me lembrar e achar algo adicionado 19 minutos depois Achei o outro, mas foi escrito em C também. Rodar em C++ é trivial no entanto. Acho que não vi nenhuma razão na época para escrever em C++. A diferença entre os dois é que esse roda continuamente e vai comparando as listas de processos para mostrar os que foram encerrados ou iniciados no intervalo, e mostra com umas cores na tela porque eu queria deixar as funções como exemplo para escrever assim, já que muitos aqui neste forum parecem gostar de escrever assim na console então deixei as funções de exemplo disponíveis. E esse programa também usa alarmes e timers e eventos e sei que é difícil achar exemplos disso Eis um trecho O programa esta aqui adicionado 33 minutos depois minha memória está voltando Esse segundo programa inclui também uma função de exemplo cls() para limpar a tela da console do jeito oficial no Windows, ao invés do ingênuo system("cls") E uma função mostra_grade_256_cores() que... mostra a grade de cores para a antiga console do Windows --- o novo terminal tem 16.7 milhões de cores. Ela mostra isso para se saber como seria escrever em 15 sobre 3, por exemplo: texto branco sobre fundo azul claro, como está no gabarito aí acima. E uma função void gotoYX(l, c); que afinal escreve texto na linha l e coluna c afinal ao invés da gotoxy() dos anos 80 que vem sendo preservada nos programas de console aqui no forum
  15. A fonte mais comum desse tipo de informação é a PSAPI, Process Status API documentada em https://docs.microsoft.com/en-us/windows/win32/psapi/process-status-helper e C ou C++ seriam bem adequadas para ler essas coisas. Sugiro ler as informações sobre as estruturas e a lista de funções e escrever alguns programas de teste, assim vai se acostumando e pode postar aqui se algo sair errado. Acho que no ano passado eu postei nesse forum alguns programas que usavam isso, mas agora não sei o que era

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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...

Aprenda_a_Ler_Resistores_e_Capacitores-capa-3d-newsletter.jpg

ebook grátis "Aprenda a ler resistores e capacitores", de Gabriel Torres

GRÁTIS! BAIXE AGORA MESMO!