Ir para conteúdo
Fórum Script Brasil

j4m35_b0nd

Membros
  • Total de itens

    36
  • Registro em

  • Última visita

Sobre j4m35_b0nd

j4m35_b0nd's Achievements

0

Reputação

  1. 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?
  2. 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; } }
  3. Acho que está tudo esclarecido já. Podem fechar o tópico.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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
  9. 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.
  10. 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?
  11. 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.
  12. 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; }
  13. Cara, to levando uma surra dessas funções. Não consegui aumentar minha matriz com ela. Será que você pode me dar um exemplo?
  14. 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.
  15. 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.
×
×
  • Criar Novo...