Ir ao conteúdo

arfneto

Membro Pleno
  • Posts

    6.526
  • Cadastrado em

  • Última visita

Tudo que arfneto postou

  1. Talvez tenha ido duas vezes por um caminho muito complicado. A primeira vez Foi na leitura. Para sua sorte não são 45 campos ,mas apenas 7 strtok() não foi uma boa opção. csv é um arquivo formatado, muito bem definido. Deve ter imaginado quando escreveu aquilo que deveria ter outra maneira... Registros e Campos Na terminologia de scanf() e de banco de dados, cada linha é um registro e cada registro tem N campos, 7 no seu caso. O loop O mais simples seria usar um loop de leitura até o fim do arquivo, e para cada registro lido --- linha --- criar um registro na estrutura e incrementar um contador. Só isso. um arquivo csv é uma tabela, uma matriz MxN de M campos com N colunas cada um. E scanf() foi escrita para consumir esse tipo de entrada. Seria bem mais fácil. Avise se quiser ver um exemplo. A segunda vez Foi o sort. Provavelmente não precisava incluir funções de sort. Podia usar muito bem o qsort() que já está em stdlib. Mas, imaginando que o sort que usou está ok para um vetor de int, sem problemas, sort é sort. Eis o que se faz nesses casos: cria um vetor de int com um int para cada linha que leu do csv. 1500 linhas, 1500 int. Aí você numera essas linhas de 0 a N-1. O óbvio. leu 10 registros, 0 a 9. E chama o sort. Só que na função ou no momento de comparação do sort, ao invés de comparar o valor de int no vetor, tipo vetor[ i ], você compara as struct correspondentes. E inverte os índices. Nada original porque o sort() do C++ faz isso, o qsort() do C faz isso e praticamente todo algoritmo genérico de sort faz isso. Ao final do sort o vetor vai estar em ordem de seja lá qual for o campo que você escolheu do csv para ordenar. As vezes se usa isso para classificar por critérios externos à struct. Um exemplo: classificar um cadastro de pacotes a despachar pela posição em que o caminhão que cobre o destino de entrega estacionou nas bais do estacionamento. E aí você usa o vetor classificado para imprimir os dados e tudo sai certinho. Sem por a mão no cadastro. E pode ter vetores distintos para listar por ano e mes de referencia, ou por potência instalada e tal... Espero que tenha entendido. É um conceito importante: usar o vetor como uma tabela de referência.
  2. Esse é um programa em C praticamente. Esse define é bobagem. O #include é desnecessário e de qualquer maneira teria que tirar todos #include Mas em C++ ou C [n+2] tem que ser uma constante em tempo de compilação. Está errado em C++ ou C
  3. Praticamente o mesmo problema, praticamente a mesma solução. Não devia abrir dois tópicos com o mesmo problema. Espero que tenha entendido o que eu te expliquei (no outro tópico). Acho que está tendo mais trabalho do que o normal com esse programa e talvez seja por ter misturado muitas coisas no programa desde o início. Bom que afinal está conseguindo concluir.
  4. Não despreze o for
  5. //---------------------------------------------------------- //função verifica placa int verifica_placa(int n) { Talvez concorde que esse comentário não é assim muito esclarecedor if (n == 0) { return 0; } else { return 1; } Estaria melhor como return (n!=0); Esse código é curioso: para que zerar todos os campos? void excluir(int i) { carro.placa == 0; carro.modelo == 0; carro.marca == 0; carro.cor == 0; carro.entrada.hora == 0; carro.status == 0; } Basta um campo afinal. Quando outro carro entrar na vaga vai redefinir tudo afinal. Escolha um. Note que: se usa assim os carros podem estar em qualquer lugar no vetor de 10. Só está marcando como disponível a vaga. placa é um char[8]. Porque acha que pode escrever placa = 0? é o mesmo erro de antes. carro é um vetor de struct cad_carro. não existe carro.placa o que existe é carro[ i ].placa e mesmo assim não pode atribuir 0 porque são sete letras. está bem ruim. O que você queria fazer era passar o número da vaga e excluir da struct. Só isso. Até acho que tentaram passar o índice da vaga como parâmetro. Mas mesmo isso já era exagero. O simples é escrever no programa: carro[ i ].status = 0 por exemplo, e assumir que as vagas com status 0 estão livres. Muito mais simples. E essa função: // Função verifica se o estacionamento esta vazio int verifica(int n) { if (n == 0) { return 0; } else { return 1; } } Muito útil o comentário. Ou não. Mas se tem uma variáveis global --- repito: não use variáveis globais --- para isso não seria o caso de usar apenas return nvei == 0; Ou simplesmente usar essa variável no programa ao invés de escrever uma função? E verifica() não é um nome ingênuo para uma função dessas? Que tal tudo_vazio() //Procedimento para inserir dados dos veículos void inserir(int i) { Mais um comentário importante. Ou não Procure sempre retornar algo. É um desperdício cada vez que retorna void(). Por outro lado, não escreva esse tipo de rotina assim. Procurem usar sempre int inserir(Carro* um); É mais esperto. Preste atenção a isso. É importante. Vou mostrar um exemplo depois. Escrevam o programa em torno dos dados. Sempre. Pensem antes de tudo nos dados. Um estacionamento tem vagas clientes carros Porque tem uma estrutura cad_cliente em main? structs devem ser globais. Variáveis não. Porque não tem uma estrutura para as vagas? Considerem os dados: os carros tem donos e os donos tem carros. Os carros ficam em vagas. As vagas podem ter números, os carros podem ter prismas com números, os carros saem e pagam pela estadia. É a realidade. Se você chegar mais perto da realidade seu programa fica mais fácil e não mais difícil. Crie um campo na struct de cliente que vincula ao carro. Crie um campo na struct carro que vincula ao cliente. Crie uma struct para as vagas. Pode ser só um vetor de dez char, para controle. É o simples. Porque permite vincular tudo com tudo. Responder todas as perguntas. Um campo tipo ID Exemplo Sem intenção de escrever seu programa, apenas para mostrar como pode ser diferente e mais simples entenda: Se declarou assim: struct Tempo { char hora[10]; }; typedef struct { char cor[10]; struct Tempo entrada; char modelo[20]; char marca[20]; char placa[10]; int status; } Carro; E considerando que status > 0 indica a vaga onde está o carro, então: const Carro carro1 = { "prata", "12:11:10", "DBS", "Aston Martin", "ABC-4321", 1 }; const Carro carro2 = { "azul", "12:11:10", "DBS", "Aston Martin", "ABC-4325", 2 }; Esse já são dois carros legais para estacionar. Completos. Todos os campos. Imagine uma função assim: int mostra_um_carro(Carro* c); Que mostra na tela o óbvio: um carro. Todos os campos. E um programa sofisticado assim: int main() { Carro carro[10]; int no_patio = 0; carro[0] = carro1; no_patio += 1; carro[8] = carro2; no_patio += 1; // mostra os carros no patio for (int v = 0; v < 10; v += 1) if (carro[v].status > 0) mostra_um_carro(&carro[v]); printf("%d carros no patio\n", no_patio); }; Ele já mostra os carros que estão no pátio e a vaga de cada um: Aston Martin DBS Cor: prata Placa: ABC-4321 Entrada: 12:11:10 Aston Martin DBS Cor: azul Placa: ABC-4325 Entrada: 12:11:10 2 carros no patio Entende a diferença? Eis um programa de teste inteiro, usando recortar e colar de seu programa... #include <stdio.h> #include <stdlib.h> #include <time.h> struct Tempo { char hora[10]; }; typedef struct { char cor[10]; struct Tempo entrada; char modelo[20]; char marca[20]; char placa[10]; int status; } Carro; const Carro carro1 = { "prata", "12:11:10", "DBS", "Aston Martin", "ABC-4321", 1 }; const Carro carro2 = { "azul", "12:11:10", "DBS", "Aston Martin", "ABC-4325", 2 }; int mostra_um_carro(Carro*); int main() { Carro carro[10]; int no_patio = 0; carro[0] = carro1; no_patio += 1; carro[8] = carro2; no_patio += 1; // mostra os carros no patio for (int v = 0; v < 10; v += 1) if (carro[v].status > 0) mostra_um_carro(&carro[v]); printf("%d carros no patio\n", no_patio); }; int mostra_um_carro(Carro* c) { printf("%s %s Cor: %s Placa: %s Entrada: %s \n", c->marca, c->modelo, c->cor, c->placa, c->entrada.hora ); return 0; }; // fim Eu não fiz nada. Nem pensei no enunciado. Mas já posso testar várias coisas...
  6. void inicializa() { int i; for (i = 0; i < 10; i++) carro.status = 0; } Se até declarou i variando de 0 a 9 imagino que pretendia zerar o contador de carros, e são 10. Assim como escreveu vai repetir 10 vezes a mesma coisa para a mesma variável. Que nem existe na verdade, já que status é um campo de cad_carro e carro é um vetor de struct... void inicializa() { for (int i = 0; i < 10; i++) carro[i].status = 0; } Se a variável só serve como índice é melhor se acostumar a declarar dentro do for... Não use variáveis globais. Use parâmetros. E em C passe endereços. Escreva seus programas em torno dos dados. A partir dos dados. Use constantes e não menus durante o desenvolvimento e vai gastar uma fração do tempo. main() deve ser a primeira função de seu programa. Sempre. E se possível em um arquivo separado. Assim fica mais fácil dividir o trabalho, por exemplo. E entender o programa. E não ter que compilar o programa todo toda hora. E incorporar o que cada um do grupo fez. É a realdidade. Declarações assim: struct Tempo{ char hora[7]; }; typedef struct { char cor[10]; struct Tempo entrada; char modelo[20]; char marca[20]; char placa[8]; int status; } Carro; Carro carro[10]; São mais expressivas e comuns na prática.
  7. Recomendo NUNCA editar posts anteriores a menos de algum erro de ortografia ou esquecimento... Ao fazer isso em geral a conversa toda perde o sentido, porque os leitores não vão entendem respostas a perguntas e coisas que não estão mais lá Exemplo Aqui pode ser inofensivo, se apenas colocou o código dentro do "box" code. Mas aí a própria mensagem dizendo para você fazer isso já perde o sentido certo? eu já disse isso, mas repito aqui agora que o código está mais legível: NUNCA use variáveis globais. Não sei se entendeu o que eu disse antes. Nada perguntou então vou imaginar que sim. Seu programa não parece muito bom. Vou dar uma olhada depois do almoço Um programa com mais de 300 linhas não devia mas ter erros como esse: struct cad_carro { char placa[8], modelo[20], marca[20], cor[10]; int status; struct Tempo entrada; }carro[10]; //variavel global int nvei = 0; //contador de veículos cadastrados char pesq[8]; //Procedimento inicializa void inicializa() { int i; for (i = 0; i < 10; i++) carro.status = 0; } carro é um vetor de 10 estruturas...
  8. Sugiro sempre começar por um bom livro. E usar um ambiente moderno de desenvolvimento. E ter paciência para ler muito. É uma linguagem "enorme".
  9. Já programou alguma fila antes, ao menos? Estudou o que é uma fila com prioridades? Está de fato falando da estrutura de dados Priority Queue? Ou é apenas um exercício em que tem uma fila com prioridades? São coisas distintas. Uma Priority Queue tem propriedades distintas e os problemas que usam essa estrutura são implementados através dessas funções. Uma fila usando uma estrutura de pilha ou uma lista ligada pode ter uma prioridade acrescentada na hora de inserir ou retirar elementos. Como é o enunciado?
  10. Use o botão code lá no menu para postar o código. Assim como fez dá muito trabalho para alguém ler e eventualmente baixar para compilar. Não use variáveis globais. Isso só dá problema e vai sempre cair na sua cabeça. Todos os autores falam isso, os professores ensinam isso, muitas empresas proíbem isso, muitas diretrizes de programação começam por isso. Então não deve ser só minha opinião... Poste algo objetivo sobre o que está havendo com seu programa ou qual dúvida você tem. "Está dando erro" é muito genérico
  11. Talvez ajude ler isso https://docs.microsoft.com/en-us/windows/win32/winsock/windows-sockets-start-page-2 adicionado 1 minuto depois Acho que é muito bem escrito. Tem uma introdução em https://docs.microsoft.com/en-us/windows/win32/winsock/getting-started-with-winsock
  12. Um ponteiro contém o endereço de algo. é só isso. O conteúdo do ponteiro é um endereço. Então não é que ele permite mudar o valor ou não. Ele apenas contém um endereço. A partir daí uma atribuição é só uma atribuição. int a = 12; int* p = &a; *p = a + 1; a = *p + 1; // aqui 'a' vale 14 p = p + 1; // problema, mas nao da em nada *p = 12; // ate voce tentar usar... Veja esse caso: p foi declarado como um ponteiro para int e em p foi carregado o endereço de a. Então *p é um int, e as duas atribuições são equivalentes. O valor de a vai ficar como 14. Mas aí vem o incremento em p que é um ponteiro, e ele deixa de apontar para a. E aí vem a atribuição para voltar a para 12 e vai cancelar seu programa porque p mudou... Pense nisso.
  13. Essa parte foi gentileza do enunciado porque seria um inferno contar as letras acentuados como elas sem acento Apenas filtre a entrada pelo que quer tratar: as letras. Por onde começar? Sempre pelos dados. Vai gerar uma tabela de 26 totais, um para cada letra. A partir de um universo de coisas que se pode ler em um char. Que não são necessariamente letras mas se forem letras podem ser maiúsculas ou não. E é só. De 52 para 26. Então para cada valor lido você vai por na posição da tabela na posição certa, se for uma das 26. As outras coisas não importam. Uma linha de pontos não vai gerar nada: tudo zero. "%%%%ab--" vai contar um a e um b. Basta um loop e uma tabela. Dentro do loop um if. Entre 'a' e 'z' ou entre 'A'e 'Z' vai para a tabela na posição da letra, que pode ser o simples, de 0 para 'a' até 25 para 'z'. Tem certeza que não sabe programar isso?
  14. Como o problema é simples, a solução pode ser simples int quantidade = 0; printf("digite a quantidade do produto A:"); scanf("%d", &quantidade); int total = quantidade * 4; printf("digite a quantidade do produto B:"); scanf("%d", &quantidade); total = total + quantidade * 3; printf("digite a quantidade do produto C:"); scanf("%d", &quantidade); total = total + quantidade * 5; printf("o resultado da venda eh %d", total);
  15. Uma parcela é o que temos desde o ensino fundamental: um dos componentes da soma. O total é a soma das parcelas. Eu li o enunciado. Pense num ticket de supermercado. Cada parcela é a soma de um produto vezes a quantidade correspondente. Nada mais. No caso desse programa, basta uma quantidade e um total. Na verdade como o enunciado é bem simples, nem precisaria de A B e C. Bastaria quantidade e total...
  16. Lendo isso e lendo int main(void) { int total,A=4,B=3,C=5; printf("o digite o valor do produto A:"); scanf("%d",&A); printf("o digite o valor do produto B:"); scanf("%d",&B); printf("o digite o valor do produto C:"); scanf("%d",&C); total=A+B+C; printf("o resultado da venda eh",total); return 0; } Acho que esses 3 usuários que você listou vão estranhar o fato de você ler os valores do que deveriam ser as quantidades vendidas bem em cima das variáveis onde estão os preços. Não acha que o total deveria ser conseguido multiplicando as quantidades pelos valores e somando as parcelas?
  17. Elas são separadas ao nascer. Exemplo: void separa_filas(TFila* f, TFila* par, TFila* impar) { TFila* mil_filas[1000]; ... } f, par, impar e mil_filas são 1.003 filas. typedef struct fila TFila; TFila* inicializa (void); TFila* insere (TFila *f, int elem); int retira (TFila *f); void libera (TFila *f); int vazia (TFila *f); Declarando assim não é algo muito útil, mas se é fornecido tem que aceitar afinal. Isso não tem nada de especial. Imaginando que essas funções façam o óbvio: retira() devolve o primeiro da fila a cada chamada vazia() retorna zero se a fila não está vazia insere insere o elemento na fila Então TFila* PrimeiraFila = inicializa(); TFila* SegundaFila = inicializa(); for (int i = 0; i < 10; i += 1) insere(PrimeiraFila, i); while (vazia(PrimeiraFila) == 0) insere(SegundaFila, retira(PrimeiraFila)); Esse trecho cria duas filas, coloca os números de 0 a 9 na primeira, depois transposta para a segunda e ao final a primeira está vazia e a segunda tem os 10 elementos...
  18. Esse é um autor famoso de livros sobre diversas linguagens e escreve desde os '80. Já escreveu dezenas de livros, boia parte deles sobre C. A lista deles hoje na Amazon tem 3 páginas (!) https://www.amazon.com.br/Livros-Herbert-Schildt/s?rh=n%3A6740748011%2Cp_lbr_books_authors_browse-bin%3AHerbert+Schildt Parâmetros formais são isso: parâmetros e formais. São os parâmetros do lado da função chamada. Eles ditam as regras, forma/formato dos argumentos da função. Só isso. Os protótipos listam os parâmetros formais, mas em geral se omite o nome das variáveis, e assim na descrição formal dos parâmetros em geral se escreve algo. Se na função você declara Lista* insere( Node* node, Lista* lista); Esses são os parâmetros formais, node e lista. Mas no header ou nos protótipos o normal é estar só Lista* insere( Node*, Lista*); Porque o protótipo existe mais para o compilador do que para o leitor.
  19. Tem um loop dentro da função que fica insistindo até o cara acertar cada senha. O que pode fazer por exemplo é mudar para retornar assim que ele digitar, retornando por exemplo 0 se o cara errou a senha, e no programa principal pegar as senhas na sequência como antes, mas dentro de um loop, algo assim como int main() { int tentativas = 3; int senhas = 5; int ok = 0; const int senha[5] = { 1, 99, 17, 57, 50 }; // vai ter 'x' tentativas de acertar as 'y' senhas for (int t = 0; t < tentativas; t = t + 1) { ok = 0; printf("\nTentativa %d de %d\n\n", 1 + t, tentativas); for (int f = 0; f < senhas; f = f + 1) { // se o cara errou tenta ate 'tentativas' if (fase(f, senha[f]) == 0) break; ok = ok + 1; // passou mais uma }; if (ok != senhas) continue; // outra tentativa printf("\nPORTA LIBERADA!\n\n"); return 0; }; printf("\nTente outra vez. Encerrando!...\n\n"); return 0; }; Nesse exemplo ele poderia tentar 3 vezes. 'ok' soma um pra cada senha certa. a variável 'senhas' tem o total de senhas então é só comparar. Agora a função fica sem aquele loop, certo? int fase(int etapa, int alvo) { int numero = -1; printf("[Etapa %d de 5] Digite o numero: ", 1+etapa); scanf("%d", &numero); /*while (numero != alvo) { printf("\nVoce digitou um numero incorreto!\n"); printf("Tente novamente\n\n"); printf("[Etapa %d de 5] Digite o numero: ", etapa); scanf("%d", &numero); };*/ if (numero != alvo) return 0; printf("voce passou pela etapa %d! Continue...\n\n", 1+etapa); return 1; }; deixando como comentário o que tinha antes: retorna 0 se o cara errou ou o alvo se ele acertou. Rodando seria algo assim Tentativa 1 de 3 [Etapa 1 de 5] Digite o numero: 1 voce passou pela etapa 1! Continue... [Etapa 2 de 5] Digite o numero: 12112 Tentativa 2 de 3 [Etapa 1 de 5] Digite o numero: 1 voce passou pela etapa 1! Continue... [Etapa 2 de 5] Digite o numero: 99 voce passou pela etapa 2! Continue... [Etapa 3 de 5] Digite o numero: 17 voce passou pela etapa 3! Continue... [Etapa 4 de 5] Digite o numero: 57 voce passou pela etapa 4! Continue... [Etapa 5 de 5] Digite o numero: 50 voce passou pela etapa 5! Continue... PORTA LIBERADA! Claro que há muitas maneiras de fazer isso, mas assim da pra rodar. Talvez pudesse dar umas chances dentro da fase() pro cara tentar umas vezes cada senha ao invés de uma só, ou não?
  20. //Número de strings scanf("%d", &n); lista = (char **)malloc(n * sizeof(char *)); Esse é um exemplo de complicar sem razão. Seu programa não tem memória entre uma linha e outra. Não há razão para alocar um vetor de linhas se você processa uma de cada vez e o resultado de uma nada tem a ver com a próxima ou a anterior. E se fez isso deveria ao final ter liberado a memória correspondente a cada alocação, o que não fez. Então pode perder pontos por ter feito de modo incompleto algo que nem precisava ter feito... E não é uma boa solução, apenas desperdiça tempo e memória. Isso aqui já serviria para testar seu programa por exemplo const char exemplo[4][80] = { "grafo.c,AVL.java,lista.c,bubbleSort.java,ABB.java,matriz.cpp", "fila.py,quick_sort.py,Hashing.java,digrafo.c,pilha.jl", "knn.R,AVRubroNegra.cpp,busca_binaria.py,heapSort.cpp", "." }; const char* final = "."; E um programa simples assim e na linha 21 você põe o código ou chama a função que faz o serviço. Para UMA linha. Só uma. Quando estiver ok com os exemplos basta trocar o strcmp() pela leitura por exemplo via gets() e o programa continua funcionando. Só muda uma linha. E a função pode ser algo besta como // linha, tamanho, extensao, tamanho int resolve_para(const char*, int, const char*, int); Que devolve o número de arquivos na listagem com a extensão procurada, como abaixo int n = 0; while (strcmp(exemplo[n], final) != 0) { printf("\"Listagem\": '%s'\n", exemplo[n]); printf(" Extensao: '%s'\n", exten[n]); int res = resolve_para( exemplo[n], strlen(exemplo[n]), &exten[n][1], strlen(exten[n])-1); printf("Resultado: %d\n\n", res); n = n + 1; }; // while() return 0; Que se imagina mostre algo assim "Listagem": 'grafo.c,AVL.java,lista.c,bubbleSort.java,ABB.java,matriz.cpp' Extensao: '.java' Resultado: 3 "Listagem": 'fila.py,quick_sort.py,Hashing.java,digrafo.c,pilha.jl' Extensao: '.jl' Resultado: 1 "Listagem": 'knn.R,AVRubroNegra.cpp,busca_binaria.py,heapSort.cpp' Extensao: '.c' Resultado: 0 A diferença de escrever assim é que é mais seguro. Mais simples de testar e mais fácil de ler e de mudar depois. Mas e a tal função resolve() ? Vou repetir o que eu sempre escrevo: escreva seu programa em torno dos dados. Sempre a partir dos dados. Nesse caso a única linha e a extensão. Eis o que importa: você vai processar todos os caracteres da entrada. Todos. Então o mais simples é um loop até o fim da linha. Não precisa de um do/while(1) por exemplo, como no exemplo acima de @devair1010 porque o final é conhecido. Como você vai processar até uma linha que tenha um '.' apenas, é mais legível usar um while e testar logo no início ao invés de no final do loop. Usar do{}while() e testar a condição de saída no início do loop é algo que em geral se pode evitar , e fica estranho de ler. Você pode escrever assim, como está no exemplo acima: do { printf("uma Linha "); scanf("%s", linha); if (strcmp(linha, ".") == 0)break; ... } while (1); // Loop Eterno Mas a realidade é: while (strcmp(linha, final) != 0) { ... }; // while() E é mais legível. E você não tem que procurar pelo código dentro do loop as condições de saída possíveis. o usuário pode entrar com '.' logo no início só pra ver se você pensou nisso... fique alerta para casos como o do exemplo 3, procurando arquivos .c e vem dois arquivos .cpp o delimitador entre os arquivos é a vírgula ou o '\n'. Cuidado!. Esse é o caso do exemplo 2. Uma pegadinha sutil
  21. Pois é. Foi o que eu disse. Windows funciona através e somente através do loop de mensagens. Essa rotina avisa o sistema de que um determinado retângulo de uma determinada janela foi invalidado e o sistema oportunamente vai ver se esse pedaço está visível e atualizar a tela. O normal é usar InvalidadeRect() e deixar por conta do sistema, porque ele escolhe a hora e a necessidade e gera WM_PAINT para a janela correspondente, se ela estiver visível. Mais uma vez estou escrevendo de memória, mas acho que por exemplo RedrawWindow() recria a imagem da janela mesmo que ela não esteja visível, e sempre da janela toda. E InvalidadeRect() vai levar a mostrar só o que mudou e só se está numa região visível da tela Um pouco off-topic, mas recomendo usar um framework para tratar essas coisas. É mais flexível. Algo como WxWidgets ou SDL ou GTK+ ou Qt.
  22. A gente sempre desconhece mais do conhece... BOOL InvalidateRect( HWND hWnd, const RECT *lpRect, BOOL bErase ); Estou escrevendo sem pensar muito, mas talvez deva chamar essa rotina pra avisar o sistema de que algo mudou na janela, se isso não aconteceu por si
  23. De qualquer modo alguém vai ter que enviar WM_PAINT ou a tela não vai mudar...
  24. Você pode usar tantas mensagens quanto precise pra se orientar. Apenas quando o programa estiver pronto você tira... Você entendeu o que eu te expliquei? acho que está escrevendo algo muito complicado. Assim como achei complicados os exemplo que vi aqui. O problema é mais simples
  25. Teste isso em separado, se ainda não o fez. Apenas rode as funções e crie os bitmaps no micro

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!