Ir ao conteúdo
  • Cadastre-se

vangodp

Membro Pleno
  • Posts

    1.752
  • Cadastrado em

  • Última visita

posts postados por vangodp

  1. não da certo usar strlen depois de passar uma string por "parâmetro" quando em realidade o que o programa passa é um ponteiro de forma não transparente ao usuário. Me explico...

    Quando você passar uma string assim:
     

    #include <stdio.h>
    
    void foo( char str[100] ) {
        printf("foo->%s\n", str);
        
    }
    
    int main(){
        char frase[100] = {"Ola mundo!"};
        printf("main->%s\n", frase);
        
        foo(frase);
        
        
        return 0;
    }
    

    Você deve estar achando que é passado uma "copia" de frase que esta em main para a str que esta em foo, mas de fato não é assim, o que esta acontecendo é que você esta passando um ponteiro e por isso strlen n vai funcionar, não vai funcionar porque strlen precisa da string e não de um ponteiro a string.

    Para verificar si o que digo é verdade basta com imprimir as direções de memória da primeira casinha da string desta forma tanto em main quanto na função...:
     

    #include <stdio.h>
    
    void foo( char str[100] ) {
        printf("foo->%s\n", str);
        printf("foo->%p\n", &str[0]);
    }
    
    int main(){
        char frase[100] = {"Ola mundo!"};
        printf("main->%s\n", frase);
        printf("main->%p\n", &frase[0]);
        foo(frase);
        
        
        return 0;
    }
    

    Você vai poder conferir que as direções são as mesmas, o que isso indica que o que foi passado não é uma copia e sim um ponteiro. Ou seja... não foram passados todos os bytes e sim a direção onde começa a string em main. Por que acontece isso? Em C passar copias tem um custe, esse custe é tempo e espaço em ram, não é o mesmo passar um ponteiro que uma "tripa" de bytes por dar um exemplo, que em alguns casos pode chegar a ser bem grandinha XDD. Solução? Passar a direção... e isso é o que o compilador faz, assumindo que isso você é consciente disso, porém si ignorar isso vai dar erros.

     

    O que acontece é que de forma não transparente o que é passado é um ponteiro e essa é a causa de seu programa n funcionar quando você chama strlen dentro da função, porque passar copias são custosas tanto em tempo como em memoria.

    O que pode ser feito é realizar todo o processo de forma manual, contando byte a byte até chegar no \0 que indica o fim da string, ou algo como isso:
     

    #include <stdio.h>
    #include <string.h>
    
    void foo( char str[100] ) {
        char aux[100];
        strcpy(aux, str);
        printf("%lld", strlen(aux));
    
    }
    
    int main(){
        char frase[100] = {"Ola mundo!"};
        printf("main->%s\n", frase);
    
        foo(frase);
        
        
        return 0;
    }
    

    Neste caso é reservado uma copia local dentro da função foo e então sim ja funciona, porém com tudo isso anulamos o mecanismo que faz com que seu programa seja eficiente já que todo o tempo será feito copias, e dependendo do tamanho da string seu programa será menos eficiente. Menos eficiente porque vai levar mais tempo em realizar essas copias, e seu programa usará mais RAM do que o necessário para funcionar.

    você também pode passar o tamanho pelos parâmetros dentro do main, mas ai deixo a seu critério.

  2. 6 horas atrás, JorgeGus disse:

    Tente usar:

    getchar();

    O system("pause") é na verdade uma chamada ao sistema operacional onde o comando pause é executado, então só vai funcionar no Windows ou no antigo DOS, no Linux e outros sistemas operacionais o pause não será reconhecido ou pode ser reconhecido errado.

     

    Com o getchar será necessário pressionar Enter.

    O getchar pode não funcionar si tiver caracteres indesejados no bufer(n vou falar lixo si não arfneto fica nervoso XDD) . veja o seguinte exemplo:

    #include <stdio.h>
    
    int main() {
        int n;
        printf("Entre com um numero: ");
        scanf("%d", &n);
        getchar();
        return 0;
        
    }


    Por outro lado se tiver o bufer vazio e bem controlado o getchar pode sim servir para pausar:
     

    #include <stdio.h>
    
    int main() {
        int n;
        printf("Entre com um numero: ");
        scanf("%d%*c", &n);
        getchar();
        return 0;
        
    }

     

    • Curtir 2
    • Obrigado 1
  3. 12 minutos atrás, Higor Allan disse:

    comecei a pouco tempo, não sei qual plataforma e melhor que outras kk, eu vi alguns videos de que a pessoa antes de colocar o codigo ja aparecia algumas opções pra digitar... achei ***** isso, mas não sei como botar, qual plataforma voce me recomendaria?@vangodp

    Isso no codeblocks se chama abbreviations.
    Screenshot_1.png.23808cd30aae7f47f7e9742ed7c06a84.png


    Tipo eu criei uma abreviação chamada "c", passo seguinte é pulsar ctrl + j e automaticamente o codeblocks inseri tudo isso que você ve no quadro preto. Tenho abreviaçoes para muitas coisas como você pode ver na lista, algumas vem com o codeblocks e outras eu criei. Sei que devc++ tem algo parecido mas acho o do codeblocks mais versatil. Praticamente todos os programas tem isso entre outras coisas.

    Se quiser umas dicas sobre codeblocks e o sfml entra ai-> https://discord.gg/j4Mnffk

    • Curtir 2
  4. 2 horas atrás, André Rafael disse:

    extern int errno;

    Para que serve essa linha? errno basicamente é um arquivo cheio de defines e nele não há nenhum int errno declarado como int.

    E você ainda nem chama perror para fazer comprovações para saber se abriu ou n os arquivos.

    • Curtir 1
  5. Tambem não se trata só de diferentes funções para a mesma coisa, você também pode pegar dados de scaners, teclados, arquivos, streams e por aí vai. O que você se refere é pegar o imput desde o teclado, para isso ja tem as respostas dos outros companheiros.

    Sorte

    • Curtir 3
  6. Podia dar mais informação tipo ide que usa etc. Acredito que seja também o tipo de  projeto errado.

    Tem um montão de variáveis não declaradas  que são usadas... isso é tão fácil como ir seguindo os erros que vai soltando o compilador para ir solucionando.

     

    arrume esses erros e volte.
    Screenshot_3.png.4a77ccedb448ab80c27db4e17bbcff06.png

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