
j4m35_b0nd
Membros-
Total de itens
36 -
Registro em
-
Última visita
Sobre j4m35_b0nd

j4m35_b0nd's Achievements
0
Reputação
-
Pessoal. Uma ajudinha por favor. Eu criei uma classe que herda o TFileStream. No create da minha classe eu escrevo algumas coisas dentro do arquivo carregado, incluíndo o nome de um outro arquivo da seguinte forma: Quando eu quero ler o nome de arquivo gravado, eu faço o seguinte Quando eu instancio a minha classe criando um arquivo (fmCreate) pela primeira vez, eu consigo ler o nome gravado dentro dele sem problemas. Porém, quando eu instancio a minha classe abrindo para leitura (fmCreate) um arquivo criado anteriormente, ele não retorna o nome correto do arquivo (retorna coisas como "Arquivo de saoArquivo", ou então "Arquivo de"). Alguém sabe me dizer o que eu fiz de errado?
-
(Resolvido) Identificar teclas pressionadas
pergunta respondeu ao j4m35_b0nd de j4m35_b0nd em C, C++
Mesmo você não encontrando algo específico para isso, agradeço por ter tentado. Para consultas futuras, segue todas as teclas que consegui identificar através dessa solução improvisada. char tecla; tecla = getch(); if (tecla == -32){ tecla = getch(); switch(tecla){ case 82: // INSERT break; case 71: // HOME break; case 73: // PAGE UP break; case 83: // DELETE break; case 79: // END break; case 81: // PAGE DOWN break; case 75: //Seta para esquerda break; case 72: //Seta para cima break; case 77: //Seta para direita break; case 80: //Seta para baixo break; case -123: // F11 break; case -122: // F12 break; case 139: // ALT + F11 break; case 140: // ALT + F12 break; } } else if (tecla == NULL){ tecla = getch(); switch(tecla){ case 59: // F1 break; case 60: // F2 break; case 61: // F3 break; case 62: // F4 break; case 63: // F5 break; case 64: // F6 break; case 65: // F7 break; case 66: // F8 break; case 67: // F9 break; case 68: // F10 break; case 104: // ALT + F1 break; case 105: // ALT + F2 break; case 106: // ALT + F3 break; case 107: // ALT + F4 break; case 108: // ALT + F5 break; case 109: // ALT + F6 break; case 110: // ALT + F7 break; case 111: // ALT + F8 break; case 112: // ALT + F9 break; case 113: // ALT + F10 break; } } else{ // Todas as opções abaixo possuem valor na tabela ASCII, assim como letras e números. switch(tecla){ case 9: // TAB break; case 27: // ESC break; case 8: // BACKSPACE break; case 13: // ENTER break; case 1: // CONTROL + A break; case 26: // CONTROL + Z break; case 24: // CONTROL + X break; case 3: // CONTROL + C break; case 22: // CONTROL + V break; case 32: // BARRA DE ESPAÇOS break; } } -
Acho que está tudo esclarecido já. Podem fechar o tópico.
-
Eu usarei o realloc, pois desconheço uma lista encadeada. Eu até posso fazer um contador, mas acredito que daria muito trabalho. Estou desenvolvendo um editor de texto para a faculdade, e minha idéia é alocar posições na memória correspondentes a cada linha de texto, e, para cada linha, alocar posições para caracteres. Para mover o cursor, eu preciso saber o tamanho da linha em que ele está. Se eu fizer um contador, terei que fazer um contador para cada linha, e como não sei quantas linhas serão, terei que usar alocação dinâmica também para criar um vetor, onde cada posição corresponda a uma linha do texto, e em cada uma de suas posições, terei um contador diferente. Se ouver uma forma de saber a quantidade de memória alocada, eu posso dividir o tamanho da memória alocada, que vai ser N x CHAR, por 1 x CHAR. Acredito que, se isso for possível de ser feito, é bem mais simples do que gerar um vetor apenas para contadores. Caso não aja forma de fazer isso, ai farei os vários contadores individuais. PS: Eu agradeço se você puder me explicar o que é lista encadeada.
-
Olá. Estou usando alocação dinâmica de memória para criar, e ampliar conforme a necessidade, um vetor. Como não poderei fazer um contador para saber quantas posições tem esse vetor, minha intenção era fazer algo do tipo: tamanho_do_vetor = sizeof(ponteiro_para_o_vetor) / sizeof(tipo_de_variavel_do_vetor) Não consegui fazer conforme o exemplo acima. sizeof(ponteiro) retorna 4 (acredito que seja o tamanho do ponteiro) sizeof(*ponteiro) retorna o mesmo que sizeof(tipo_de_variavel_do_vetor) Alguém sabe o que posso fazer para saber o tamanho do vetor alocado? Obrigado.
-
(Resolvido) Identificar teclas pressionadas
pergunta respondeu ao j4m35_b0nd de j4m35_b0nd em C, C++
Encontrei uma solução improvisada que funcionou bem. tecla = getch(); if (tecla == -32){ tecla = getch(); /*Aqui faço a busca pelo atual número que está na variável tecla e verifico a qual tecla ele corresponde */ } Para as teclas que não são padronizadas pela tabela ASCII, a função getch() era executada 2 vezes seguidas, inserindo o valor -32 ou então NULL, e depois era inserido um número pertencente a outra tecla na tabela ascii. Essa solução que encontrei na internet resolveu o problema, e então dou por resolvido o meu próprio problema. -
Olá pessoal. Alguém sabe com identificar as teclas pressionadas no teclado? Eu estou desenvolvendo um editor de texto bem simples, sem interface gráfica, e preciso identificar teclas especiais que são pressionadas. Através da tabela ASC II, consegui identificar as teclas TAB, BARRA DE ESPAÇOS, BACKSPACE e ENTER, mas não consigo identificar as SETAS DIRECIONAIS, nem as teclas HOME, INSERT, PAGE UP, PAGE DOWN, END e DELETE. Alguém tem idéia de como proceder? Obrigado.
-
Obrigado por reabrir o tópico Jonathan. O código ainda é o mesmo que está postado. Também fiz umas alterações para testar a função free(); Com as alterações que fiz para teste, ficou assim #include <stdio.h> #include <conio.h> void erro(){ printf("Memória insuficiente para continuar\nO programa será encerrado\n"); printf("\nPressione uma tecla para encerrar."); getch(); exit(1); } int main(int argc, char *argv[]){ //Aplicativa inicia usando 384KB de mémoria char op; short int ver; long long int qnt=0; double *x=0, *y=0, valor_x, valor_y; do{//Laço do while infinito //Início de "Le valores X e Y" printf("X%d = ",qnt); scanf("%lf",&valor_x); printf("Y%d = ",qnt); scanf("%lf",&valor_y); qnt++;//Qnt de linhas que tem minha tabela //Fim de "Le valores X e Y" /* printf("Deseja inserir mais dados?\nDigite:\n"); do{ printf("[S] - Sim\n"); printf("[N] - Não\n"); op = getche(); printf("\n"); ver=((op!='s')&&(op!='S')&&(op!='n')&&(op!='N')); if (ver){ printf("Opção inválida. Digite novamente.\n"); } }while(ver); */ //Início da rotina que aumenta uma posição nos vetores if (x){ x=(double*)realloc(x,qnt*sizeof(double)); y=(double*)realloc(y,qnt*sizeof(double)); if (!(x&&y)) erro(); } else{ x=(double*)malloc(1); y=(double*)malloc(1); if (!(x&&y)) erro(); } //Fim da rotina que aumenta uma posição nos vetores x[qnt-1]=valor_x; y[qnt-1]=valor_y; //}while((op=='s')||(op=='S')); }while(qnt<50000); //Após 100.000 posições (50.000 para X e 50.000 para Y), a memória vai para 1.520KB getch(); free(x); free(y); //Após uso dessas funções, o uso cai para 1.128KB printf("\nPressione uma tecla para encerrar o programa.\n"); getch(); return 0; } Eu achei que, após liberar a memória com free(), o uso voltaria para algo próximo dos 384KB iniciais. Mesmo assm, diminuiu um pouco o uso após a função liberar memória
-
Desculpe-me a demora para responder. Meu computador está apresentando problemas. Para testar, eu inseri 100.000 (cem mil) elementos no array. Após usar a função free(), pelo menos através do gerenciador de tarefas do windows, o uso de memória não diminuiu.
-
Já voltei. Não consegui usar a função free() que você mencionou. Pelo menos acho que não. Eu observo o Gerenciador de tarefas do Windows para ver o uso de memória RAM do programa. No código que mandei, coloquei o seguinte. free(x); free(y); Após a execução dessas instruções, o uso de memória continua o mesmo. Será que eu estou usando a função de forma errada, ou estou vendo errado o gerenciador de tarefas?
-
Sim, o retorno é um ponteiro para void. Em C ao tentar atribuir uma variável que foi declarada como int* (ponteiro para inteiro, como no código que postei) para void* (ponteiro para void, que é o retorno da função malloc) o compilador faz uma conversão implícita. Ou seja, ele converte de um tipo para o outro sem que o programador tenha que fazer nada. Mas em C++ não há essa conversão implícita e o programador precisa fazê-la de forma explícita, colocando um casting. Portanto, na instrução (int*) estávamos simplesmente convertendo um void* para um int*. Como você está compilando em C não há problemas, mas eu gosto sempre de fazer a conversão explícita. Vou marcar o tópico como Resolvido. Qualquer coisa posta aí ! Edit: Achei um pequeno problema no seu programa. Olhe essa linha: if (!(x||y)) Você fez isso para verificar se a memória pôde ser realmente alocada. No entanto, o operador or irá ter resultado verdadeiro se pelo menos um valor for verdadeiro, ou seja, se alguma das duas alocações teve êxito. Mas esse valor é invertido pelo not e a função erro será chamada se e somente se nenhuma das alocações tiver êxito, mas o ideal é que a função seja chamada se qualquer uma alocação não for feita. Então o correto é assim: if (!(x&&y)) Ou: if ((!x) || (!y)) Mas não cheguei a analisar seu código completo. Muito obrigado por toda a ajuda.
-
Seu exemplo foi excelente. Era exatamente isso que eu estava tentando fazer e não conseguia. Eu só não entendi uma coisa nas linhas acima. O que significa o "(int*)". Você poderia, por favor, me explicar? Muito obrigado. Como prometido, segue o que eu estava tentando fazer. Agora está funcionando. Usei o que você me ensinou e também algumas coisas que li na internet sobre alocação dinâmica de memória. #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <math.h> void erro(){ printf("Memória insuficiente para continuar\nO programa será encerrado\n"); printf("\nPressione uma tecla para encerrar."); getch(); exit(1); } int main(int argc, char *argv[]){ char op; short int ver; long long int qnt=0; double *x=0, *y=0, valor_x, valor_y; do{//Laço do while infinito //Início de "Le valores X e Y" printf("X%d = ",qnt); scanf("%lf",&valor_x); printf("Y%d = ",qnt); scanf("%lf",&valor_y); qnt++;//Qnt de linhas que tem minha tabela //Fim de "Le valores X e Y" printf("Deseja inserir mais dados?\nDigite:\n"); do{ printf("[S] - Sim\n"); printf("[N] - Não\n"); op = getche(); printf("\n"); ver=((op!='s')&&(op!='S')&&(op!='n')&&(op!='N')); if (ver){ printf("Opção inválida. Digite novamente.\n"); } }while(ver); //Início da rotina que aumenta uma posição nos vetores if (x){ x=(double*)realloc(x,qnt*sizeof(double)); y=(double*)realloc(y,qnt*sizeof(double)); if (!(x||y)) erro(); } else{ x=(double*)malloc(1); y=(double*)malloc(1); if (!(x||y)) erro(); } //Fim da rotina que aumenta uma posição nos vetores x[qnt-1]=valor_x; y[qnt-1]=valor_y; }while((op=='s')||(op=='S')); printf("\nPressione uma tecla para encerrar o programa.\n"); getch(); return 1; }
-
Cara, to levando uma surra dessas funções. Não consegui aumentar minha matriz com ela. Será que você pode me dar um exemplo?
-
Estou usando C puro. Edito e compilo através do Dev C++. Comecei a aprender ponteiros recentemente. Acho que dá pra levar. Obrigado pela ajuda.
-
Essas funções parecem ser realmente o que eu estava procurando. Com elas, eu posso inserir novas posições em um vetor sempre que for necessário? Exemplo: Tenho um vetor de 1 posição inicial. Se o usuário for digitar um segundo valor, elas alocam uma segunda posição no vetor. Se o usuário for digitar um terceiro valor, elas alocam uma terceira posição no vetor. E assim sucessivamente, enquanto o usuário precisar. Obrigado.