
Jonas de Abreu
Membros-
Total de itens
137 -
Registro em
-
Última visita
Tudo que Jonas de Abreu postou
-
Para escrever (ou ler) um arquivo binario, voce deve abrir o arquivo passando a opcao "b" para o fopen (em sistemas Unix não precisa, mas em Windows faz uma boa diferenca...). Dai para ler ou escrever voce pode usar as funcoes fread e fwrite (todas essas funcoes são da stdio.h, padrão ANSI). Mas o mais importante é voce saber a estrutura do arquivo .dat . Afinal, não adianta nada voce ler centenas de bytes sem saber o que eles significam (ou o que eles representam...)
-
A ideia de usar um inteiro é contar os centavos. Dai voce não vai ter valores depois da virgula (não existe, por exemplo, meio centavo, ao contrario do que os postos de gasolina dizem...)
-
A solucao que eu tenho não é exatamente em C++, mas em C (que funciona em C++ do mesmo jeito). A biblioteca time.h (padrão ANSI) possui uma funcao que devolve o numero de clocks (ciclos de processamento) que foram gastos desde o inicio da aplicacao e o momento atual. Com isso e a constante CLOCKS_PER_SEC da pra fazer o que voce quer. Exemplo: #include <time.h> clock_t tInicio, tFim, tDecorrido; tInicio = clock(); /*seu codigo vem aqui*/ tFim = clock(); /*calcula aproximadamente o tempo em milisegundos gasto entre as duas chamadas de clock()*/ tDecorrido = ((tFim - tInicio) / (CLOCKS_PER_SEC / 1000));
-
O problema de voz metalizada geralmente esta associado ao algoritmo de compressao de audio que voce esta usando. Uma menor compressao pode gerar um audio de melhor qualidade. Quanto ao problema de ser possivel identificar quando a pessoa esta falando ou não, isso ocorre porque voce esta encriptando algo que possui muita redundancia, o "silencio". Isso provavelmente ocorre com qualquer algoritmo de criptografia. Para resolver esse problema, voce pode escolher uma sequencia de bits especifica e tratar essa sequencia como sendo sinal de silencio. Assim, sempre que voce detectar que um parou de falar, voce envia essa sequencia de bits e comeca a enviar bits aleatorios para o receptor. O receptor reconhece essa sequencia de bits e ignora a sequencia de bits aleatorios. Dessa forma voce não tem os gaps de silencio, que são o que prejudica sua critografia. Outra coisa, o DES já esta praticamente quebrado. Para as chaves de tamanho padrão, existem equipes que quebram em cerca de alguns minutos (usando um cluster). De preferencia para o AES (Acho que RSA não seria muito bom para criptografar fluxo continuo...), que é o sucessor do DES e possui mais ou menos a mesma complexidade de implementacao.
-
Bom, o que pode estar acontecendo é a condicao do if nunca ser verdadeira. Voce pode ter esquecido de inicializar o vetor vLeitos, por exemplo. Caso não seja isso, poste um pouco mais do codigo que vem antes e depois desse if, para termos algo a mais para ver.
-
não sei se esse é o problema, mas encontrei um outro erro no seu codigo. Nos seus if (onde voce verifica qual opcao foi usada), voce esta comparando um int com um char (em C, um char é representado pelo caractere entre aspas simples (')). Mas como cada caractere tem um valor associado (por exemplo, 'A' == 67) seus if nunca serao verdade. O que voce quer, na verdade é comparar a variavel opcao com o numero 1 e não com o caractere '1' (o mesmo vale para as outras opcoes). Talvez depois dessas modificacoes ele funcione.
-
Voce pode usar uma variavel global para isso. Basta declarar uma variável fora (e antes) das funções e utilizá-la dentro das funções como se fosse uma variável local. Ah, e um conselho: Evite usar float para representar dinheiro. Use um inteiro que marca quantos centavos custa algo. Dessa forma você evita problemas com a perda de precisão do float e com as dízimas periódicas em binário (que fazem com que centavos sumam misteriosamente....)
-
Você cometeu dois erros. Um sintático e o outro conceitual. Em C, uma string deve ser sempre representada entre aspas duplas (") e não aspas simples ('). Isso é um erro que o compilador deveria ter te avisado. (veja o manual do seu compilador e ative as flags que mostram os Warnings e forçam o padrão ANSI). O outro erro é conceitual. Onde você está comparando as strings, na verdade o que você está fazendo com aquilo é comparar se a posição de memória onde estão as strings são iguais, o que nunca será verdade. Para comparar o valor das strings, use a função strcmp(), da string.h. Essa função devolve 0 se as duas strings forem iguais, > 0 se a primeira for maior que a segunda e < 0 se a primeira for menor que a segunda. SINTAXE: int strcmp(const char *a, const char *b ); Então seu if fica mais ou menos assim: if (strcmp(nome, "joao") && strcmp(sobrenome, "santos")){ printf("Voce é o cara!!!\n"); } Se você quiser imprimir o nome e o sobrenome também, sua chamada ao printf deve ser feita da seguinte forma: printf("Voce é o cara, %s %s\n", nome, sobrenome); E um aviso: No seu if você usou o operador bitwise & no lugar do operador booleano &&. O bitwise & tem comportamento diferente do &&. O bitwise verificará bit por bit do valor devolvido pelas funcoes e se em alguma posição os bits dos dois valores forem 1, ele marcará um naquela posição. Caso contrário marcará 0. Ex: 00100111 & (verdadeiro) 11010010 resulta em (verdadeiro) 00000010 (verdadeiro) mas se for nesse exemplo: 10101010 & (verdadeiro) 01010101 resulta em (verdadeiro) 00000000 (falso) Portanto, use o operador && nesse caso, pois dessa forma ele trata os valores como booleanos (verdadeiro e falso) e não como sequencias de bits.
-
Verdade.... é isso que da so ver se o programa compila e nem chegar a rodar ele hahahaha
-
Voce esta usando a funcao getch() da conio.h, que é uma biblioteca exclusiva da Borland e portanto, não faz parte das bibliotecas padrão da linguagem. Substitua-a por getchar() da stdio.h, que possui comportamento semelhante.
-
Progama Mudo, Como Posso Descubrir O Problema ?
pergunta respondeu ao Inufelipe de Jonas de Abreu em C, C++
Eu não entendi direito a sua duvida.... Porque a funcao get vai precisar do return (porque voce quer que ela devolva a sua string, não é?). então voce vai dar um return no vetor cnt (que agora foi alocado dinamicamente com o malloc). Quando voce aloca memoria dinamicamente ela não esta limitada ao escopo (tipo... eu to falando de escopo de variavel e não sei se voce sabe o que é isso, se for o caso pergunte e eu te explico) da funcao onde foi criada. Desde que voce tenha o ponteiro voce pode acessa-la atravez dele. (e o ponteiro pode ser passado para outras funcoes sem problemas com o escopo) O new e delete cumprem mais ou menos a mesma funcao do malloc e free. A diferenca é que os dois primeiros usam os dois ultimos e funcionam apenas para classes. Um array de caracteres não é uma classe (pelo menos em C++). Voce pode usar a classe string do C++ no lugar do vetor de char e usar new e delete. Mas como voce usou um char* (mesmo o char[] tambem é um ponteiro, mas restrito) voce precisa usar malloc e free. -
Desculpe. Tem um pequeno erro no meu codigo. como eu tinha digitado direto aqui, coloquei um " a mais em uma das linhas. o codigo correto é : #include <stdio.h> int main() { char nome[100]; char sobrenome[100]; printf("Digite seu nome\n"); scanf("%s\n", nome); printf("Digite seu sobrenome\n"); scanf("%s\n", sobrenome); printf("Seu nome é: %s %s\n", nome, sobrenome); return 0; }
-
Embora o tipo string não exista em C, representamos uma string como um vetor de caracteres terminado em '\ 0' (null terminated strings). Da para fazer o seu programa assim: int main(){ char nome[100]; char sobrenome[100]; printf("Digite seu nome\n"); scanf("%s\n", nome); printf("Digite seu sobrenome\n"); scanf("%s\n", sobrenome"); printf("Seu nome é: %s %s\n", nome, sobrenome); return 0; }
-
Voce pode usar a funcao srand() e rand() da stdlib. A srand() tem mais ou menos a mesma funcao da Randomize do pascal. Dai, para voce gerar um numero aleatorio (entre 0 e RAND_MAX) voce faz uma chamada para a funcao rand(). #include <stdio.h> #include <time.h> #include <stdlib.h> int main(){ srand(time(NULL)); while (1) printf("%d\n", rand()); return 0; } Se voce quiser gerar um numero entre linf (limite inferior) e lsup (limite superior) (dois valores que voce escolhe), voce pode fazer assim: int rvalue = linf + (rand() % (lsup - linf));
-
Progama Mudo, Como Posso Descubrir O Problema ?
pergunta respondeu ao Inufelipe de Jonas de Abreu em C, C++
Voce coloca dentro da funcao get(). O malloc é uma funcao para fazer alocacao dinamica de memoria. Quando voce declara algo como char[256], voce esta indicando que voce quer que ele aloque (de forma estatica) 256 posicoes de char pra voce, certo? Eu fiz de forma semelhante mas de forma dinamica usando o malloc. O malloc devolve um ponteiro do tipo void*. Por isso, para usalo como um vetor de char (char*) eu usei precisei mudar o tipo dele dando um cast. Quando voce coloca um tipo entre parenteses como eu fiz, voce esta indicando pro compilador que a partir daquele momento o que estiver a direita deve ser tratado como o tipo que esta dentro dos parenteses. O sizeof() é uma funcao do preprocessador do C. O preprocessador é o responsavel por pegar seus #defines e inseri-los no codigo antes do processamento. A funcao sizeof() me devolve o numero de bytes que tem qualquer tipo ou variavel que eu coloque dentro dela. (Voce precisa saber o numero de bytes pois o malloc aloca um determinado numero de bytes para voce) O * 256 foi usado porque eu queria 256 posicoes no vetor. Uma simples conta: se o tipo que eu quero tem 4 bytes e eu quero um vetor com 100 posicoes, eu preciso de 400 bytes. Foi essa ideia que eu usei. Lembrando que como eu não sei o numero de bytes do char, eu usei a funcao sizeof() para isso. Espero ter esclarecido um pouco as coisas. -
Progama Mudo, Como Posso Descubrir O Problema ?
pergunta respondeu ao Inufelipe de Jonas de Abreu em C, C++
Voce precisa alocar de forma dinamica a variavel cnt pois o escopo dela é local e ela vai desaparecer assim que a funcao get terminar. Use: char *cnt; cnt = (char *) malloc(sizeof(char) * 256); Depois use-a normalmente como voce faria se ela fosse um vetor. Apenas não esqueca de liberar a memoria dela quando ela não for mais usada, com a funcao free. -
Bom, o exemplo do post 2 é em C++ e por isso funciona. Em C (o codigo que voce postou) não funciona porque a constante "abc" que voce declarou possui escopo local (ela so existe dentro daquela funcao). Em C++ o que ele faz é criar um novo objeto string e devolver esse objeto. Em C, voce deveria fazer algo assim: char *get(){ char *res; res = (char *) malloc (sizeof(char)*4);/*deve ser 4 pois em C todas as strings são terminadas com '\ 0'*/ strcpy(res, "abc"); return res; } Pois dessa forma voce esta devolvendo o ponteiro para onde esta o vetor de caracteres e não o vetor de caracteres em si. Sem contar que voce fez alocacao dinamica de memoria, que não esta restrita ao escopo da funcao.
-
O problema é que voce esta utilizando a biblioteca conio.h, utilizada em seu arquivo alunos.c . A conio.h é uma biblioteca da Borland e voce dificilmente vai encontrar alguma implementacao dela para um sistema Unix (como o linux, onde voce aparentemente voce esta compilando seu programa). Mas, todas as funcoes da conio.h podem ser ou implementadas na mao ou substituidas por outras de bibliotecas padrão. Por exemplo: (Estou partindo do principio que seu SO é o Linux) A funcao clrscr() pode ser substituida por system("clear") - system() é da stdlib.h getch() pode ser substituido por getchar() - da stdio.h Acho que com isso seu programa deve compilar. Mas ele ainda não vai rodar, a não ser que voce modifique o lugar em que estao seus arquivos. O sistema de arquivos no linux utiliza uma forma diferente de acesso. c:\\aulasc\\t18\\nomes.t18 isso acima é o seu (que funciona para windows). Em linux ele tera que ser algo do tipo ~/aulasc/t18/nomes.t18 Dai falta apenas retirar a conio.h dos seus includes e tentar compilar de novo.
-
Acredito qeu a OpenGL não possua suporte nativo a tratamento de imagens (geralemente voce vai usar uma biblioteca como o GLUT ou GLU para fazer isso). Mas se voce é iniciante no assunto, eu recomendo a biblioteca SDL (Simple Direct Layer) que é bem simples de usar e não possui uma curva de aprendizado tão demorada quanto a GL.
-
não, porque o operador new faz alocacao dinamica de memoria. Cada objeto em C++ possui seu proprio alocador de memoria. é realmente util e eficiente.
-
Voce pode usar a funcao sprintf da stdio.h . Ela possui uma sintaxe muito semelhante a do fprintf, com a diferenca de que ao invez de um FILE* voce passa um ponteiro para um string.
-
Nesse caso pequeno não tem muita vantagem mesmo. Mas quando voce usa grandes quantidades de memoria, se ela não for alocada dinamicamente, pode comprometer a pilha que a linguagem usa para chamada de funcoes, etc. (declaracoes estaticas são mantidas nessa pilha). Tenho um tutorial explicando a pilha do C em http://vidageek.net/2007/03/02/dia-c-pilha-do-c/ .
-
Primeiramente preencha o vetor com os numeros em ordem (de 0 ateh 51). Depois faca um for que vai de 0 ateh 51 (ou seja, é executado 52 duas vezes). Dentro desse for, sorteie duas posicoes aleatorias e faca a troca delas. Isso lhe dara um vetor com os numeros embaralhados uniformemente (Da pra provar estatisticamente que isso funciona, mas não lembro direito como se faz)
-
Existe um projeto chamada bochs que emula praticamente de qualquer maquina com MacOS, MacOS X, Windows, Linux ou Unix para qualquer outra desses tipos. Tambem existe o cygwin, que é um emulador de Linux para windows.
-
Se voce é iniciante em C, recomendo a SDL que é muito simples e poderosa.