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. Oi Marvin,

    Acho que idade não tem grilo algum. Tá tudo certo.

    Sobre entrar para a área de segurança, acho que o caminho é por computação tradicional, senão fica muito inconsistente. Recomendo você buscar um curso de Ciência da Computação. É bem capaz que no terceiro ano você já consiga um emprego na área. Aí você continua os estudos e vai ter uma formação forte para uma carreira sólida. ?

    Vale também dar uma olhada no nosso Guia de Estudos e Profissões em https://menteb.in/guia também, para se guiar no que estudar no auto-estudo.

    Conta com a gente!

    Abraço!

  2. Opa, a instrução não tá completa aí.. falta o segundo argumento do MOV, mas é o seguinte:

    A sintaxe Intel, que é essa que você usou o exemplo, funciona assim:

    instrução argumento1, argumento2, argumento3...

    No caso do MOV, que é uma instrução de cópia de dados e por isso possui dois argumentos, o destino vem primeiro e a origem depois. Então é:

    mov destino, origem

    Então no seu exemplo:

    mov dword ptr ds:[eax + 0x30]

    Ou seja, você colocou só o destino, por isso a instrução tá incompleta, mas tudo bem, talvez sua dúvida seja no destino mesmo. Esse destino aí diz o seguinte:

    Copie uma DWORD (palavra dupla, ou seja, 32-bits/4 bytes) para o endereço apontado pelo registrador EAX, mas some 0x30 (48 em decimal) a este endereço antes. Ou seja, suponha que tenhamos o valor 0x950000 no registrador EAX e a instrução completa seja:

    mov dword ptr ds:[eax + 0x30], 0xffffffff

    Após executar essa instrução, o valor 0xffffffff será copiado para o endereço 0x950030 (que é o tal EAX + 0x30). O ds vem de data segment e já dá a dica que este é um segmento de dados. No caso de executáveis de Windows, provavelmente este endereço estará na seção .data, já que está sendo usado para escrita (o valor é copiado para lá) e esta seção em geral possui permissão de escrita quando mapeada em memória.

    Abraço,

    Fernando

  3. Ué, mas você usa loops for e while em várias partes do teu código. Não entendi...

    De qualquer forma, ignorando tudo que pode ser corrigido e/ou melhorado, no caso da sua implementação das opções 4 e 5, só faltou imprimir na tela o número do cacifo, dentro do loop. Então ao invés de:

    cout << "O cacifo esta " << cacifo[i] << endl;

    Você pode fazer:

    cout << "O cacifo " << i << " esta " << cacifo[i] << endl;

    Abraço.

  4. Olá, @herculespt, beleza?

    Acho que antes de implementar as opções 4 e 5, precisamos acertar o seu código. Do contrário, vai ficar cada vez mais difícil. ?

    Vejo os seguintes problemas:

    1. main() precisar retornar int

    A função main() não pode retornar um float. Tem que ser int. Falta também um return 0 no fim do seu código.

    2. A variável que vai abrigar a opção não precisa ser um array

    Você declara essa variável int op[6], mas como ela só vai abrigar uma opção por vez, ou seja, um número por vez, basta que seja int op.

    3. Provavelmente era pra você criar um tipo cacifo

    Pela estrutura do programa, me parece que a resposta mais correta seria criar uma struct ou class do tipo cacifo, ou seja, seu próprio tipo. Até dá pra fazer com as propriedades do cacifo (nome e estado - ocupado ou vazio), em variáveis independentes, mas seria mais complicado e menos eficiente. A não ser que você não precise do nome, aí basta um array de strings mesmo ou, mais eficiente, de inteiros (você pode usar 0 para vazio e 1 para ocupado). Se for nesta última opção, você só vai precisar declarar como int cacifos[20], mas acho que antes vale verificar se estes cacifos não precisam de nome ou de outras propriedades. Se precisarem, aí é melhor criar uma struct ou class (depende do que seu professor, ou professora, ensinou).

    4. Você precisa usar mais loops

    Ao invés de fazer:

       cout << "\nCacifo " << i << cacifo[0] << endl;
        cout << "Cacifo 1: " << cacifo[1] << endl;
        cout << "Cacifo 2: " << cacifo[2] << endl;
        cout << "Cacifo 3: " << cacifo[3] << endl;
        cout << "Cacifo 4: " << cacifo[4] << endl;
        cout << "Cacifo 5: " << cacifo[5] << endl;
        cout << "Cacifo 6: " << cacifo[6] << endl;
        cout << "Cacifo 7: " << cacifo[7] << endl;
        cout << "Cacifo 8: " << cacifo[8] << endl;
        cout << "Cacifo 9: " << cacifo[9] << endl;
        cout << "Cacifo 10: " << cacifo[10] << endl;
        cout << "Cacifo 11: " << cacifo[11] << endl;
        cout << "Cacifo 12: " << cacifo[12] << endl;
        cout << "Cacifo 13: " << cacifo[13] << endl;
        cout << "Cacifo 14: " << cacifo[14] << endl;
        cout << "Cacifo 15: " << cacifo[15] << endl;
        cout << "Cacifo 16: " << cacifo[16] << endl;
        cout << "Cacifo 17: " << cacifo[17] << endl;
        cout << "Cacifo 18: " << cacifo[18] << endl;
        cout << "Cacifo 19: " << cacifo[19] << endl;

    Você pode fazer:

    for (int i=0; i<20; i++) {
      cout << "Cacifo " << i + 1 << ":" << cacifo[i] << "\n";
    }

    Sempre que estiver repetindo linhas como essas no seu código, substitua por um loop. Você vai errar muito menos assim

    Faz essas correções aí, porque pra avançar precisaremos delas. Aí a gente continua a conversa. ?

    Um abraço!

  5. Bem lembrado. Mas tem um ponto.. Eu acho que a gente deve considerar o que o aluno está estudando (admitindo que isso é um exercício de um curso de programação). Normalmente, em enunciados deste tipo, que miram a lógica, considerar tabulações verticais e outros caracteres é um pouco "demais". Usar a isspace() provavelmente vai na mesma linha. Mas concordo que sua consideração é mais completa. Se quem passou o exercício falou de outros caracteres, e/ou falou da isspace() - o que pode ter acontecido vide a inclusão do ctype.h pelo @lucas costa da cruz -, você está certíssimo. Do contrário, comparar com ' ' deve ser suficiente. ?

    Um abraço,

    Fernando

  6. Bom dia, @lucas costa da cruz, tudo bem?

    Eu precisei editar seu post original pra formatar o código como código (é só clicar no botão <> aqui do editor na hora de postar). Pode fazer isso da próxima vez que postar código, por gentileza? ?

    Também fiz as seguintes edições no seu código, para melhorar a visualização:

    • Indentação: aninhei os códigos dentro dos blocos {}
    • Espaços: pus espaços entre coisas como include<arquivo> e for (i=0;i<...;i++), etc.
    • Coloquei os comentários das declarações de variáveis alinhados.
    • Adicionei também um espaço depois do caractere ":" (dois pontos) na linha "Digite sua frase: ". 

    Tudo isso foi pra deixar o código melhor pra quem for te ajudar, inclusive pra você mesmo ler.

    Agora em relação à lógica do programa em si, me parece que você modificou um programa que já contava vogais para agora contar espaços, foi isso? Achei inteligente fazer isso, parabéns! ?

    A sua contagem está certa. Só faltou imprimir o valor da variável ContadorEspacos. E nem precisa usar um condicional (if) pra testar se é maior que zero. Basta imprimir o valor dela, mesmo que seja zero.

    Mais uma coisa: você aloca um vetor de apenas 12 posições com char texto[12]. Isso vai fazer com que sua frase não possa ter mais do que 11 caracteres. Eu usaria pelo menos uns 255. ?

    NOTA: O seu programa possui um bug de segurança ao combinar um buffer que pode ser facilmente estourado com o uso da função gets(), mas este assunto foge do tema da lógica de programação em si, e acredito que este exercício seja para treinar sua lógica, então abrir este assunto com seus professores pode desviar muito, mas se quiser saber mais sobre o assunto, é só googlar por "buffer overflow".

    Um abraço!

  7. Opa, bem vindo!

    Tá um pouco embolado isso... Pra começar, queria pedir que você edite seu post e use o bloco de código no seu código, usando o realce de sintaxe em C. Olha só a diferença. ?

    Sem realce:

    printf("Digite a %d%c nota do %d%c Aluno --: ",j+1,166,i+1,167);

    Com realce (na tela de edição do post, seleciona seu código, clica no botão <>, escolhe C na caixa de seleção no canto inferior direito e clica em Inserir?

    printf("Digite a %d%c nota do %d%c Aluno --: ",j+1,166,i+1,167);

    Aí você corrige a indentação pra facilitar pra gente também. Fica melhor pra gente ver e tentar entender teu código.

    Abraço!

  8. Humm.. do jeito que você fez essa alocação aí, não sei, acho que vai precisar de uma função que receba ambas as matrizes por referência, mas também seus números de linhas e colunas. E retorne uma matriz. Algo assim:

    float **mult_mat(float **a, int linA, int colA, float **b, int linB, int colB)

    Mas pode haver soluções melhores que não pensei. Alguém mais? ?

    Abraços!

×
×
  • Criar Novo...