Ir para conteúdo

Fernando Mercês

Administradores
  • Postagens

    1.510
  • Registro em

  • Última visita

  • Dias Ganhos

    164

Posts postados por Fernando Mercês

  1. Hi @Mohsen. Welcome to our community. 🙂

    A few things you should consider:

    1. Please edit your current post and format your C code as code by selecting it and clicking the <> button in the text editor. 😉
    2. To your main problem: you are returning a pointer to a local (stack-allocated) buffer that only exists while get_time() is running. You can't do that. In C, you have a few options:

    Declare you return variable in the function that calls the desired function (in your case, it'd be in main()) and pass it to the desired function as reference. Here's an example:

    void get_time(char *currentTime) { // 3. receive the buffer as reference
    	snprintf(currentTime, 80, "%s", "my text"); // 4. write to the buffer
    }
    
    int main(void)
    {
    	char currentTime[80]; // 1. declare/allocate the buffer before calling the function
    	get_time(_timstamp, dt, currentTime); // 2. pass a reference to the buffer
    	printf("current time: %s \n", currentTime); // 5. buffer contains the string set by get_time()
    	return 0;
    }

    As you will notice, I didn't complete the exercise for you. Instead, I've pointed out one way to solve it. 😉

    You could also use a global variable or a dynamically-allocated buffer, but your solution depends on what you've studied. If you never studied pointers, then use a global variable. If you didn't study dynamic memory allocation, then use the pointer reference as shown.

    Other important fixes in your code:

    1. You mixed C and C++ headers and functions and this can become very messy very quickly. For example, string is different from char*. Mixing them will thrown errors. So, choose one language and stick with it. In your case, I recommend choosing C. Here's the fixes you need for that:
      1. Replace <string> by <string.h>.
      2. Remove <iostream>.
      3. Remove <cstring>.
      4. Remove the using directive.
      5. Don't use string. Use char* instead.
      6. Replace main() by main(void).
    2. sprintf() is insecure and decprecated. Use snprintf() instead. The latter needs the maximum number of characters to write (use the same size you've declared the buffer with).

    Surely there's more room for improvement, but I'll stop here for now. 🙂

    Good luck!

  2. @edummoreno se entendi bem, você quer copiar todos os arquivos de uma pasta para uma pasta um nível acima. Neste caso, não precisa descobrir os nomes de arquivos com força bruta (tentar todas as possibilidades até acertar), nem mesmo entrar na pasta. A partir da pasta destino dos arquivos, você faz (em batch):

    copy pasta1\*.* .
    copy pasta2\*.* .

    O “asterisco ponto asterisco” expande para todos os arquivos do diretório. Já o "ponto" significa "diretório atual".

    Isso resolve seu problema?

    Abraço!

  3. O endereço MAC da máquina não. No entanto, as seguintes informações podem estar disponíveis, dependendo do formato de exeuctável em uso e das opções configuradas no compilador e linker:

    • Caminho completo de onde os arquivos de código-fonte estão armazenados, o que pode conter o nome de usuário da máquina.
    • Versão do compilador e do linker utilizado, seja em texto puro, ou seja por padrões que permitam identificação, como os utilizados pelo DIE. Por exemplo, este arquivo contém a lógica que o DIE utiliza para identificar versões do Visual Studio.
    • Data e hora que o arquivo executável foi gerado (somente em PE).
    • Idioma de resources, o que pode sugerir o idioma do Windows de quem compilou o binário (somente em PE).

    Em tempo, sempre que postar código aqui, use o botão <> para formatar seu código como código. Olha a diferença:

    Sem formatação:

    #include <stdio.h>

    printf("Olá, mundo!\n");

    Com formatação:

    #include <stdio.h>
    
    printf("Olá, mundo!\n");

    Valeu!

  4. Olá!

    Bom, tem algumas coisas para serem esclarecidas aí 🙂

    1. Em C, a função strlen() aceita um char* (não um char) como argumento. Este é um ponteiro para um tipo primitivo e é o jeito oficial de se implementar strings em C.
    2. Já em C++, a classe std::string é completamente diferente. Para determinar seu tamanho, ela possui uma função (método) length(). Aqui tem um exemplo de como utilizá-la.
    3. O trecho de código que você postou declara um array de objetos string com dez elementos (e não uma única string). Sendo assim, cada elemento do seu array pode ser uma string com tamanho diferente.

    PS.: C++ também trabalha com os tipos primitivos e com C strings.

    Abraço!

  5. Olá! Considere o seguinte:

    1. Inclua a <stdio.h>.
    2. Use uma função por linha. Fica melhor pra ler o código.
    3. Você não usa nenhuma função da <stdlib.h> nem da <string.h>. Pode remover esses includes. ?
    4. A variável flag é testada no while mas não é inicializada antes. Recomendo utilizar do/while, o que vai fazer com que sua condição fique no final. Alternativamente, você pode inicializar a variável flag com 1 na declaração.
    5. Você usou a variável aux para contar quantos produtos foram inseridos. O problema é que você a incrementa fora do for. Uma solução rápida é colocar i<4 na condição do for (já que tem um if com break no fim dele) e o incremento da aux logo após a leitura do produto, antes da chamada à printf().

    Isso deve ser suficiente para corrigir o programa seguindo a sua lógica. Uma vez corrigido, se quiser saber mais, eu teria outras sugestões. Dá pra resolver a leitura com um loop só ao invés de dois e tem outras melhorias também.

    Abraço.

     

    • Agradecer 1
  6. Que pergunta boa. ?

    Eu só consigo responder de forma leviana pois tenho zero experiência na programação de compiladores, engines, etc. O que sei é que em JavaScript os arrays são objetos, logo, não são simplesmente tipos primitivos em sequência na memória como em C.

    Agora a parte que eu acho (por não conhecer os internals do JavaScript):

    Quando você declara um array em JS, você está criando um objeto (alocando memória para ele) da classe Array. Portanto, provavelmente quando você coloca nele algum elemento, você tá na real chamando um método dessa classe. A diferença é que o programador faz isso sem ver. Por exemplo:

    frutas = ['melão', 'maçã']

    O código acima cria um objeto, uma instância da classe Array.  Acredito que seja equivalente ao seguinte (passando os elementos para o método construtor):

    frutas = Array('melão', 'maçã')

    Poderia também usar o método push:

    frutas = Array()
    frutas.push('melão')
    frutas.push('maçã')

    No entanto, é mais comum utilizar a notação como no primeiro código, o que pode dar a ilusão de que o array é similar ao do C, mas não é.

    Em todos os casos, se você fizer typeof(frutas), vai ver que o retorno é object. Agora, os detalhes internos dessa implementação eu não faço ideia - e também imagino que depende do engine usado, porque poderia ser feito de diferentes maneiras, com diferentes estruturas de dados (listas encadeadas, hashmaps, etc) para armazenar o endereço dos tipos primitivos e objetos que são elementos do array.

    Aqui tem detalhes da classe Array, mas ainda não responde sua dúvida. Recomendaria você:

    1. Implementar, em C, um tipo Array que suporte push e pop de elementos. Pode ser só do tipo int ou só do tipo char* pra ficar mais legal. Você pode usar ponteiro para funções para simular os métodos.
    2. Buscar o código-fonte de algum engine de JavaScript pra ver como eles fazem. Certamente vai ser diferente de como você fez, mas o fato de você ter feito o seu próprio "gerenciador de arrays" vai te dar uma solidez no assunto, mesmo que você escolha caminhos pouco otimizados e tal.

    Isso pelo menos seria o que eu faria se eu quisesse entender isso profundamente, mas pode ser que alguém com conhecimento no assunto ajude mais aqui.

    De qualquer forma, adoraria ver aqui o teu progresso neste estudo, para todos podermos aprender contigo. ?

    Um abraço e boa sorte!

    • Agradecer 1
  7. Olá!

    Tem muitos erros que você precisa corrigir. Vamos por partes, ok? ?

    Você declara a variável aleatorio e a utiliza para ler a opção digitada pelo usuário, mas antes mesmo que ela assuma qualquer valor, você verifica se seu valor é menor que 1 ou maior que 6 e isso está errado. Você não pode comparar o valor de uma variável com nada antes de inicializá-la com algum valor. Te recomendo:

    1. Renomear essa variável para opcao, que faz mais sentido já que ela vai conter a opção digitada pelo usuário.
    2. Usar um bloco do...while ao invés de while. Na verdade você pês um do...while dentro de um while, o que também é desncessário neste caso.

    Tem muitos outros erros, mas é preciso corrigir um por vez. Aplica aí as sugestões no código e responde este tópico com o código atualizado que a gente segue. ?

    Boa sorte!

  8. Seria o caso de essa conta custom_123 não ter privilégios administrativos no Windows? A opção anterior deve utilizar a conta SYSTEM, que é de sistema e é usada pela maioria dos serviços. Eu imagino que o serviço do MySQL requeira privilégios administrativos. Por que não você não quer usar a opção anterior (Standard System Account)?

    Abraço!

    • Agradecer 1
×
×
  • Criar Novo...