Ir ao conteúdo

isrnick

Membro Pleno
  • Posts

    1.558
  • Cadastrado em

  • Última visita

posts postados por isrnick

  1. 7 horas atrás, devair1010 disse:

    e na linguagem c, diferente de outras , não existe o comando "elseif" , mas apenas o "else" e o "if" ,   se usados em linhas separadas evita erros de interpretação

     

    Existe "else if" na linguagem C sim, e o @Heitor.Bruns usou corretamente.

     

    Usar "else" e o "if" aninhados em vários níveis como você fez é muito mais confuso, e fica praticamente ilegível se adicionar mais alguns níveis de "else"s e "if"s quando há várias condições que devem ser verificadas.

    • Obrigado 1
  2. Seu código foi escrito em C não em C++, ou seja você indicou a linguagem errada na tag do título do tópico.

     

    E tem vários problemas no seu código, sendo que o mais óbvio é que fica abrindo o arquivo, escreve uma frase, fecha o arquivo, abre o arquivo novamente, escreve outra frase, fecha o arquivo novamente, etc etc... Seria melhor abrir o arquivo 1 vez, escrever no arquivo tudo que precisa, e então fechar o arquivo.

     

    • Obrigado 1
  3. Você entende inglês? Se souber inglês fica muito mais fácil aprender a programar, eu recomendo aprender.

     

    Tem muito mais recursos online em inglês para aprender a programar, e as próprias linguagens de programação são em inglês, e as documentações das linguagens e de suas bibliotecas sempre são escritas em inglês (mas raramente em português), e pesquisar e tirar dúvidas online em inglês é muito mais fácil pois tem gente do mundo inteiro postando online em inglês.

     

    16 horas atrás, Obama1617 disse:

    Bom rapaziada, queria algo grátis, não estou com moral pra ficar gastando muito.

    O site do Curso em Vídeo diz que os cursos de Python são grátis, então poderia fazer lá.

     

    16 horas atrás, Obama1617 disse:

    Tenho um notebook muito velho aqui😅 Será que teria como adaptar pra usar ele como secundario?

    Sim, não tem motivo por que não poderia usá-lo. Você assiste ou lê em um computador, e programa no outro computador pra exercitar o que aprendeu.

     

    • Obrigado 1
  4. O seu VSCode provavelmente está usando outra instalação do Python do seu computador... Talvez um Python em um ambiente virtual.

     

    Dentro do próprio VSCode você pode acessar um terminal, ou seja você pode acessar o Powershell dentro do VSCode. Se deseja saber qual o caminho da pasta do Python que o seu VSCode está usando você pode digitar no terminal:

     

    py -c "import os, sys; print(os.path.dirname(sys.executable))"

     

     

    E no terminal do VSCode você também pode instalar o numpy nesse outro Python usando aquele comando.

     

    pip install numpy

     

  5. Ok, agora cheque a variável de ambiente PATH e verifique se existem 2 pastas do Python a lista de pastas.

    Uma é a pasta do executável do Python (acabando em "\Python313\") e a outra é a pasta dos Scripts do Python (acabando em "\Python313\Scripts\")

     

    Para ver as pastas do PATH no Powershell você pode usar:

    $env:Path -split ';'

     

    Ou no Command Prompt digite:

    echo off
    for %A in ("%path:;=";"%") do echo %~A
    echo on

     

  6. Parece que os caminhos para as pastas do executável do Python e de seus scripts não foram adicionados a Variável de Ambiente PATH do seu Windows, por isso não conseguiu executar o pip pelo terminal, pois o executável não foi encontrado na pasta onde está, nem em nenhuma pasta inclusa na variável PATH....

     

    O instalador do Python deveria ter adicionado o caminho do Python a variável PATH automaticamente, uma maneira que poderia corrigir isso seria reinstalando o Python e se certificando que a opção para adicionar o caminho no PATH está selecionada (se a opção existir).

    • Curtir 2
  7. Em C usamos as funções malloc, calloc e realloc para alocar(reservar) ou realocar memória dinamicamente, mas estas funções podem falhar, logo sempre é necessário analisar o retorno destas funções para verificar se a memória foi alocada com sucesso.

     

    Então, uma solução para não ter que ficar repetindo a verificação seria encapsular estas funções dentro de outra funções que tratam o caso de falha e nunca retornam um ponteiro nulo (NULL). Como em:

     

    #include <stdio.h>
    #include <stdlib.h>
    
    void *allocateMemory(size_t size) {
        void *pointer = malloc(size);
    
        if(!pointer)
        {
            fprintf(stderr, "Could not allocate\n");
            exit(EXIT_FAILURE);
        }
    
        return pointer;
    }

     

     

    Mas essa função não ajudaria a diagnosticar onde o problema ocorreu no programa, logo uma melhoria seria fazer a função indicar o nome do arquivo e a linha do código onde o erro ocorreu.

     

    E com isso em mente segue uma solução completa, com funções que verificam os casos de falha na alocação e indicam onde o erro ocorreu, e macros para chamar as funções usando os mesmos parâmetros das funções originais (malloc, calloc e realloc):

     

    #include <stdio.h>
    #include <stdlib.h>
    
    
    #define VMALLOC(Size) allocateMemory(__FILE__, __LINE__, Size)
    
    void *allocateMemory(const char *file, long line, size_t size) {
        void *pointer = malloc(size);
    
        if(!pointer)
        {
            fprintf(stderr, "Could not allocate: %zu bytes (%s:%ld)\n", size, file, line);
            exit(EXIT_FAILURE);
        }
    
        return pointer;
    }
    
    
    #define VCALLOC(NumberOfElements, ElementSize) allocateCleanMemory(__FILE__, __LINE__, NumberOfElements, ElementSize)
    
    void *allocateCleanMemory(const char *file, long line, size_t numberOfElements, size_t elementSize) {
        void *pointer = calloc(numberOfElements, elementSize);
    
        if(!pointer)
        {
            fprintf(stderr, "Could not allocate: %zu bytes (%s:%ld)\n", numberOfElements * elementSize, file, line);
            exit(EXIT_FAILURE);
        }
    
        return pointer;
    }
    
    
    #define VREALLOC(MemoryBlock, NewSize) reallocateMemory(__FILE__, __LINE__, MemoryBlock, NewSize)
    
    void *reallocateMemory(const char *file, long line, void *memoryBlock, size_t newSize) {
        void *pointer = realloc(memoryBlock, newSize);
        
        if(!pointer)
        {
            fprintf(stderr, "Could not allocate: %zu bytes (%s:%ld)\n", newSize, file, line);
            free(memoryBlock);
            exit(EXIT_FAILURE);
        }
    
        return pointer;
    }

     

     

    E para usá-las basta chamar o respectivo macro do mesmo modo que faria com a função original, com a diferença de que não há a necessidade de verificar o retorno.

     

    Por exemplo:

    size_t bytes = 10 * sizeof(int);
    int forceFailure = 0;
    int *anArray = NULL;
    
    /* 
        Mude o respectivo 'forceFailure' para um valor diferente
        de zero para verificar como cada função se comporta quando
        não consegue alocar memória.
    */
    
    // Verified malloc
    forceFailure = 0;
    if(forceFailure)
        bytes = -1;
    
    anArray = VMALLOC(bytes);
    free(anArray);
    
    // Verified calloc
    forceFailure = 0;
    if(forceFailure)
        bytes = -1;
    anArray = VCALLOC(1, bytes);
    
    // Verified realloc
    forceFailure = 0;
    if(forceFailure)
        bytes = -1;
    else
        bytes = 10 * bytes;
    anArray = VREALLOC(anArray, bytes);
    free(anArray);

     

     

    OBS: Vale notar que as funções propostas aqui apenas geram a mensagem de erro e encerram o programa em caso de falha na alocação, mas há situações em que seria preferível tratar o erro de outra maneira que não faça com que o programa seja encerrado abruptamente, logo estas funções não são adequadas para esses casos e precisariam ser adaptadas.

     

    • Obrigado 3
    • Amei 1
  8. 26 minutos atrás, Swalls disse:

    a opção E de /DCOPY não existe para mim.

    @SwallsNão?

     

     

    Ah, encontrei isto na documentação do robocopy:

    Citação

    O sinalizador /DCOPY:E solicita que a cópia de atributo estendido seja tentada para diretórios. O Robocopy continuará se os EAs do diretório não puderem ser copiados. Esse sinalizador não está incluído em /COPYALL.

     

  9. @Swalls Não, eu apenas li a documentação do robocopy ("robocopy /?"), e sugeri as opções que parecem ser mais relevantes.

     

    Para arquivos:

     

    /COPYALL é o mesmo que /COPY:DATSOU
    
    Onde:
    D = Dados
    A = Atributos
    T = Carimbos de data/hora
    S = Segurança=ACLs NTFS
    O = Informações do proprietário
    U = Informações de auditoria

     

     

    E para diretórios:

    /DCOPY:DATE
    
    Onde:
    D = Dados
    A = Atributos
    T = Carimbos de Data/Hora
    E = Atributo estendido

     

  10. #include <stdio.h>
    #include <math.h>
    
    int main()
    {
        double A = 0.0, B = 0.0, C = 0.0;
        double *hipotenusa;
        double *cateto_maior;
        double *cateto_menor;
        
        printf("Digite o tamanho do lado A do triangulo retangulo: ");
        scanf("%lf", &A);
        printf("Digite o tamanho do lado B do triangulo retangulo: ");
        scanf("%lf", &B);
        printf("Digite o tamanho do lado C do triangulo retangulo: ");
        scanf("%lf", &C);
        
        if (A <= 0.0 || B <= 0.0 || C <= 0.0) {
            printf("\nUm ou mais dos valores fornecidos são invalidos.\n\n");
            return 0;
        }
        
        if (A >= B+C || B >= A+C || C >= A+B) {
            printf("\nOs lados não formam um triangulo.\n\n");
            return 0;
        }
        
        hipotenusa = &A;
        if (*hipotenusa < B) hipotenusa = &B;
        if (*hipotenusa < C) hipotenusa = &C;
        
        cateto_menor = &A;
        if (*cateto_menor > B) cateto_menor = &B;
        if (*cateto_menor > C) cateto_menor = &C;
        
        cateto_maior = &A;
        if (cateto_maior == hipotenusa || cateto_maior == cateto_menor) cateto_maior = &B;
        if (cateto_maior == hipotenusa || cateto_maior == cateto_menor) cateto_maior = &C;
        
        // printf("\n%lf %lf %lf\n\n", *hipotenusa, *cateto_maior, *cateto_menor);
        
        if (fabs((*hipotenusa) * (*hipotenusa) - (*cateto_maior) * (*cateto_maior) - (*cateto_menor) * (*cateto_menor)) > 0.00001){
            printf("\nOs lados fornecidos não formam um triangulo retangulo.\n\n");
            return 0;
        }
        
        printf("\nA maior altura do triangulo retangulo eh: %lf\n\n", *cateto_maior);
        
        return 0;
    }

     

    • Curtir 1
    • Obrigado 1
  11. Estou configurando um computador para usar como NAS para casa, cuja principal função é para armazenar e assistir videos via PLEX/Emby/Jellyfin, mas também para as funções típicas de um NAS como armazenamento de backups, substituir Dropbox/One Drive/etc...

     

    Até agora a configuração é:

     

    Processador Intel Pentium Gold G7400 3.7GHz, 2-Cores, 4-Threads, LGA 1700

    placa-mãe ASUS PRIME H610M-E D4, CHIPSET H610, INTEL LGA 1700, MATX, DDR4

    MEMÓRIA DDR4 GEIL ORION, 16GB (2X8GB) 3200MHZ

    M.2 ngff b-chave sata para sata 5 porta placa de expansão 6gbps placa de expansão jmb585 chipset suporte SSD e hdd

     

    O processador foi escolhido por ter UHD Graphics 710 para fazer transcode, pois minha coleção de vídeos está principalmente no formato H265/HEVC, e por ter baixo consumo de energia (já que é um servidor pra ficar sempre ligado).

     

    placa-mãe escolhida por ter dois M.2 permitindo usar uma para um SSD NVMe, e a outra para colocar a placa de expansão de portas SATA. (O PCI-e pode ficar livre para ser usado para colocar uma placa Ethernet 2.5Gbits no futuro.)

     

    Ainda não defini a fonte, nem o gabinete, mas por enquanto pretendo usar um gabinete velho que tenho disponível e que caberia várias HDs de 3.5" (umas 8 ou 9 HDs), até achar uma opção melhor.

     

    A ideia é colocar entre 6 a 8 HDs de 4TB. E usar TrueNAS como sistema operacional no SSD NVMe, para montar RAIDZ2 (ZFS com 2 discos de paridade).

     

    Peço que deem suas sugestões e opiniões.

  12. 26 minutos atrás, Lucca Rodrigues disse:

    @isrnick

    Funciona só se o buffer não estiver vazio.

    Mas aí você pode tentar garantir que sempre sobre pelo menos o caractere nova linha na entrada antes de chamar a função para limpar a entrada.

     

    Do contrário vai ter que usar algo que nunca deixe nada sobrando na entrada, como a função getline do padrão PÒSIX, ou minha função nscanf:

     

    OBS: getline não é uma função padrão ISO da linguagem C, então se não estiver disponível no seu compilador pode ter que achar uma implementação pronta na internet, ou implementar você mesmo.

    • Curtir 1
  13. @thefill Não use o primeiro método de "limpar" entrada desse link, está usando fflush para algo que ele não foi feito (ele é apenas para fluxos de saída) logo terá comportamento indefinido, ou seja não dá pra garantir que funcione. Use apenas o segundo pois funciona em todas as situações.

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!