Ir ao conteúdo
  • Cadastre-se

V!OLADOR

Membro Pleno
  • Posts

    437
  • Cadastrado em

  • Última visita

Tópicos solucionados

  1. O post de V!OLADOR em Rotacionar, transladar e escalar um objeto no OpenGL foi marcado como solução   
    Bom, mas esta parte não tá claramente errada? O que eu tô lendo ai acima: transladamos o objeto pro ponto (-centerX, -centerY), em seguida transladamos novamente pra posição inicial (4, 4), aplicamos uma rotação e então transladamos novamente pra posição aleatória (-4, -4).
     
    De qualquer maneira, assumindo que o polígono já esteja inicialmente centrado na posição (4, 4), pelos valores dos próprios vértices, faça uma translação pra origem do sistema de coordenadas, ou seja (0, 0), aplique a rotação ali e translada o objeto novamente pra posição inicial (4, 4). Talvez funcione.
  2. O post de V!OLADOR em como fazer GUI em C foi marcado como solução   
    Além das dicas dos colegas você pode já ter ouvido falar da ótima biblioteca Dear ImGui, né? bom, o projeto cimgui disponibiliza wrappers pra outros projetos escritos em C.

    Dear ImGui: https://github.com/ocornut/imgui
    cimgui: https://github.com/cimgui/cimgui

    Dear ImGui (e portanto cimgui) é famosa por GUIs rápidas e interativas sem (muita) retenção do estado da UI (dai o nome Im de imediato). Basicamente, ela é a primeira ferramenta de qualquer vídeo game feito nos dias de hoje.
  3. O post de V!OLADOR em Gráfico para comparação de algoritmos foi marcado como solução   
    Bom, veja que o contador não tá sendo atualizado dentro do bloco do if, como você gostaria. Então, o primeiro a fazer é usar { e } pra especificar um escopo no qual você faz a troca e atualiza o contador:
     
    if (arr[j] > arr[j+1]) { swap(&arr[j], &arr[j+1]); counter++; }
    Segundo, ao retornar pra função main(), você tá imprimindo um contador não inicializado e, pior, que não recebeu uma copia do resultado guardado pelo contador interno da função bubleSort(). Então, na main() certifique-se de que
     
    int counter = bubbleSort(arr, n);  
  4. O post de V!OLADOR em Converter o que um sensor de distancia le foi marcado como solução   
    Aaaah, muito mais claro agora. Parece simples. Assim como na minha primeira resposta, vamos usar float pra representar números reais com baixa precisão (mais ou menos entre 4 e 6 dígitos). Caso o sensor forneça números mais precisos (mais de 8 dígitos) e você precise dessa precisão na porcentagem, utilize double.

    Bom, vou utilizar d pra representar a distância recebida do sensor e definir duas constantes, d_min e d_max, com os respectivos mínimos e máximos da escala, seguindo a descrição que você deu acima:
     
    float d = 0.0f; const float d_max = 30.0f; const float d_min = 220.0f;  
    Em seguida, você disse que não tem interesse em distâncias menores do que 30 cm. Então, você poderia descartar todos os valores de d menores que d_max, por exemplo:
     
    if (d < d_max) d = d_max;  
    A linha acima vai garantir d = 30 sempre que o sensor fizer uma medida abaixo disso. Você pode então, opcionalmente, decidir mostrar essa informação ou não.
     
    Quando o valor de d for maior que 30, e menor que 220, você aplica aquela fórmula pra converter o sinal do sensor pra uma escala entre 0 e 1 (100%):
     
    d = (-d_min + d)/190.0f;  
    Agora d está normalizado em [-1, 0] porque, no teu problema esquisito, a escala tá invertida. Basta então pegar o valor absoluto de d:
     
    d = fabs(d);   
    Ou, mais facilmente, apenas multiplicando d por -1 🤭:
     
    d = -d;  
    Agora o resultado tá normalizado em [0, 1]. Você pode multiplicá-lo por 100.0f pra ficar com mais cara de porcentagem.

    Veja se consegue resolver o problema com esses passos. Qualquer enrosco e só perguntar.
  5. O post de V!OLADOR em é possivel 2 fopen ao mesmo tempo no mesmo arquivo? foi marcado como solução   
    A resposta curta é sim. Agora, faria sentido? depende do problema.

    Um disco é um recurso físico e inerentemente sequencial, independente do modelo de programação utilizado ou do número de processos/threads executando ao mesmo tempo. Não há como ler duas coisas ao mesmo tempo. Num disco rígido por exemplo, ou a agulha tá num local ou noutro. Num SSD há acesso direto e virtualmente sem tempo de resposta mas ainda assim um processo físico de escritura. O sistema operacional vai tentar otimizar a tarefa utilizando algum tipo de cache e que permite uma ilusão de que vários processos/threads tão utilizando o disco em paralelo.

    Na pior das hipóteses, tentar escrever ao mesmo tempo vai destruir a performance do programa porque as threads vão precisar sincronizar-se numa fila. Um resultado contra intuitivo se tá tentando usar várias threads exatamente pra aumentar a velocidade do programa.

    Geralmente, é mais eficiente e inteligente criar um modelo de utilização. Se você for fiel ao próprio modelo, tudo vai funcionar sem problemas. Por exemplo, criar uma cache na RAM pra cada thread, guardar informações ali por enquanto e apenas transferir cada cache pro disco a posteriori sequencialmente. Vira e mexe, sempre que lidamos com largura de banda e latência, sai mais barato transferir um pedaço grande de informação uma vez do que vários pedaços pequenos. Outra ideia seria ter uma "thread-escrivã" e apenas ela seria responsável por escrever no disco. As demais mandariam informações pra escrivã e essa trata de escrever quando achar apropriado. O mesmo pra leitura e/ou ler-escrever. 
  6. O post de V!OLADOR em Jogo jan-ken-pon em C foi marcado como solução   
    Aparentemente a lógica se perde porque você condiciona um caso else a um caso if externo e isso não gera o comportamento esperado. Ao invés de um if-else dentro de outro if-else, utilize um if-else-if. Ou seja, na função resultado
     
    if () { } else if () { } else if () { } /* ...as 7 possibilidades de a e b */ else { /* caso empate */ return 1; } return 0;  
    Por sinal, nas duas funções anteriores o mesmo comportamento errático pode acontecer.
  7. O post de V!OLADOR em Problema com saída em C - Em relação a saída do programa. foi marcado como solução   
    Em C os elementos de um array são indexados a partir do zero, ou seja, o intervalo pra cinco elementos seria entre count = 0 e count = 4. Então, no for
     
    for (count=1; count<=5; count++)  
    count deveria iniciar em 0 e o loop não deveria terminar enquanto count < 5, totalizando 5 elementos.
  8. O post de V!OLADOR em Ler tamanho da entrada para criar vetores foi marcado como solução   
    Há vários errinhos. Primeiro, se A e B vão ter tamanhos variáveis determinados pelo usuário, você deve usar ponteiros e alocar memoria dinamicamente, por exemplo,
     
    int *A = new int[tam]; int *B = new int[tam];  
    E lembre-se de liberar os recursos alocados ao final,
     
    delete[] A; delete[] B; return 0;  
    Segundo, os vetores no seu caso estariam vazios -- ou, sendo muito otimista, com lixo oriundo da memoria alocada (dependendo do compilador). Em nenhum momento você atribuiu valores. Os elementos aleatórios produzidos por rand devem ser dados a ambos, A e B, por exemplo,
     
    A[i] = rand();  
    O mesmo pra B. A inicialização de números aleatórios, feito por srand, pode ser feito apenas uma vez, fora do for. Você pode utilizar, por exemplo,
     
    srand(time(NULL));  
    Ou seja, usar o retorno de time como inicializador. Apenas certifique-se de que está gerando números aleatórios diferentes pra cada caso, A e B.
  9. O post de V!OLADOR em Ler tamanho da entrada para criar vetores foi marcado como solução   
    Há vários errinhos. Primeiro, se A e B vão ter tamanhos variáveis determinados pelo usuário, você deve usar ponteiros e alocar memoria dinamicamente, por exemplo,
     
    int *A = new int[tam]; int *B = new int[tam];  
    E lembre-se de liberar os recursos alocados ao final,
     
    delete[] A; delete[] B; return 0;  
    Segundo, os vetores no seu caso estariam vazios -- ou, sendo muito otimista, com lixo oriundo da memoria alocada (dependendo do compilador). Em nenhum momento você atribuiu valores. Os elementos aleatórios produzidos por rand devem ser dados a ambos, A e B, por exemplo,
     
    A[i] = rand();  
    O mesmo pra B. A inicialização de números aleatórios, feito por srand, pode ser feito apenas uma vez, fora do for. Você pode utilizar, por exemplo,
     
    srand(time(NULL));  
    Ou seja, usar o retorno de time como inicializador. Apenas certifique-se de que está gerando números aleatórios diferentes pra cada caso, A e B.
  10. O post de V!OLADOR em Algoritmo C em ranksort para ordenação de vetores. foi marcado como solução   
    Numa lista, no caso A, com N elementos fora de ordem, pra ordená-los (R) em ordem crescente, uma técnica pouco eficiente mas bem popular é o "rank sort". Pro n-ésimo elemento (n := 1, 2, ..., N) da lista, basta compará-lo com todos os demais e contar quantos são menores que ele. O total de valores menores que o elemento n é o seu rank, ou seja, sua posição numa lista devidamente ordenada, no caso R.

    No trecho de código que você postou, a função compute_rank( ) testa o k-ésimo elemento de A (a.k.a elem) contra todos os demais e conta cada ocorrência (rank++) de valores menores que ele. Terminado o calculo do rank, na ultima linha de compute_rank( ), copia-se o k-ésimo elemento para a lista ordenada, R, usando agora o rank do elemento k.
     
    O "rank sort" é da família de algorítimos nos quais a complexidade do calculo aumenta com ~ O(N^2).
     
    Edit: aparentemente falta um void na definição do retorno da função compute_rank( ).
  11. O post de V!OLADOR em C e programação paralela foi marcado como solução   
    O enunciado diz que o vetor deve ser criado sequencialmente. Então você não precisaria usar OpenMP aqui:
     
    #pragma omp parallel shared(V, tam, i, mult) { #pragma omp for for(i = 0; i < tam; i++) { V[i] = i * mult; } }  
    Entretanto note um detalhe: você declarou i como uma variável compartilhada. Normalmente, em laços como o for, o índice do passo, no caso i, é uma variável privada. Isso porque você não gostaria que mais de uma thread modifique i ao mesmo tempo. Cada thread deve possuir uma copia unica de i, e assim acessar diferentes elementos de V ao mesmo tempo. Então, seria mais correto o seguinte
     
    #pragma omp parallel shared(V, tam, mult) private(i) { #pragma omp for for(i = 0; i < tam; i++) { V[i] = i * mult; } }  
    De qualquer forma, como o enunciado disse pra criar o vetor sequencialmente, você pode fazê-lo da maneira tradicional. Uma maneira de executar varias porcões do código ao mesmo tempo, como requisitado pelo problema, seria através dos construtores OpenMP sections. No seu caso o enunciado pediu pra executar três tarefas: 1) somar todos os elementos de V; 2) achar o menor elemento de V; e, 3) achar o maior elemento de V. Com OpenMP sections, a sintaxe (simplificada) seria assim:
     
    #pragma omp parallel sections { #pragma omp section { /* soma-se todos os elmentos de V aqui */ } #pragma omp section { /* encontra-se o menor elemento de V aqui */ } #pragma omp section { /* encontra-se o maior elemento de V aqui */ } }  
    Então, bastaria implementar cada porcão de código, especifico pra cada tarefa, no respectivo bloco { }. Quando executar, se houver até três threads disponíveis, cada uma vai executar um bloco independentemente e ao mesmo tempo. Se por acaso apenas duas threads estão disponíveis, dois blocos seriam executados ao mesmo tempo e o terceiro apenas quando uma delas terminasse suas tarefas.
     
  12. O post de V!OLADOR em Recebendo vetor como parâmetro foi marcado como solução   
    Tecnicamente não há diferença. De fato a notação com [] também significa receber um ponteiro que, no caso, aponta pro primeiro elemento (de muitos mais) ao invés de apenas um. O código fica mais descritivo e fácil de ler.

    Mas há, talvez, uma situação na qual escrever usando o formato com [] seja efetivamente incorreto: quando o objeto em questão é opaco e portanto não é possivel criar um array, apenas ponteiros pra um elemento. Nestes casos o formato [] induz o compilador a um erro.
  13. O post de V!OLADOR em Problema de arquivo pra classe foi marcado como solução   
    Eu também faria algo assim. Simples e eficiente.
  14. O post de V!OLADOR em Estruturas em C foi marcado como solução   
    A diferença é que no segundo caso você define a estrutura de um tipo chamado 'pessoa' e declararia objetos desse tipo com
    struct pessoa Micael;
    Ou seja, um objeto chamado 'Micael' do tipo 'pessoa'.
    Mas no primeiro caso, usando a palavra chave typedef, você definiu um apelido, 'pessoa', para a estrutura chamada 'pessoa'. Sendo assim você pode declarar objetos usando apenas o apelido,
    pessoa Micael;
    Se ao invés, o apelido fosse 'p', você poderia declarar objetos do tipo 'pessoa' com
    p Micael;
    A palavra chave typedef define novos nomes, ou apelidos se preferir, para os tipos. Tanto os fundamentais como int e double como aqueles definidos pelo usuário como 'pessoa'.
  15. O post de V!OLADOR em Problema ao concatenar strings em c++ foi marcado como solução   
    Em C++ a melhor maneira de lidar com cadeias de caracteres é usando objetos do tipo std::string ao invés do tipo char diretamente. Assim você pode concatenar de maneira até mais elegante, usando operadores aritméticos. Alem de possuir uma infinitude de funções de busca, substituição, etc.
     
    EDIT: Não esqueça de incluir a biblioteca <string>. Alem disso, no exemplo, a função c_std() é usada apenas pra fazer com o que o objeto se comporte como um char*. A função open() só aceita char*. 
     
    Por exemplo,
    //// Processando o nome do arquivo://std::string dir = "/home/user/";std::string file = "teste.txt";std::string path = dir + file; // path = /home/user/teste.txt//// Agora basta abrir o arquivo://std::ostream output;output.std::ostream::open(path.std::string::c_str());output << "olá mundo";

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