Uso do Dredd

Atualizado pela última vez em outubro de 2021.

O que deve ser entregue

Somente o arquivo com código fonte em C++ (arquivo .cpp) deve ser entregue.

Quando Entregar

Depois de projetar, implementar e testar, quando houver boas evidências de que o programa está certo. Não gaste suas tentativas enviando o programa antes de fazer testes para ver se ele está funcionando.

Foco no enunciado do problema

As pessoas gostam de pensar em regras para usar o Dredd. Isso geralmente atrapalha o aproveitamento da disciplina, pois a atenção deve estar no problema sendo resolvido. É o problema (e não o Dredd) que determina se isso ou aquilo é importante. Solicite ao seu professor que melhore o enunciado de um problema toda vez que ele falhar em determinar o que é importante. É comum que os alunos tenham problemas em acertar uma resposta simplesmente por terem ignorado algum pedaço do enunciado.

Erros específicos mencionados pelo Dredd

Primeiramente, é bom mencionar que é muito difícil programar o Dredd para dar mensagens super explicativas e ainda por cima tentando não mostrar para o aluno qual a forma de corrigir o problema. Se o Dredd indicasse qual a correção, você não estaria treinando encontrar e corrigir erros em programas. Se dependesse só de mim, as mensagens do Dredd seriam bem mais vagas e menos significativas do que realmente são.

Na tentativa de agradar os outros professores do grupo, várias mensagens diferentes podem aparecer durante a correção do Dredd. Porém nem sempre elas são aquilo que o programador realmente deveria focar para corrigir seu programa. Tentar ser específico, trás um efeito colateral de aumentar os "falsos positivo", ou seja, direcionar a atenção do aluno para algum aspecto que não era realmente importante.

Apesar disso, ter mensagens específicas pode realmente ajudar os alunos a encontrar erros em muitas situações. Apenas não leve as mensagens para um lado de informação infalível e indiscutível. Se a mensagem não te ajuda a entender onde focar sua correção, simplesmente use a informação de que seu programa tem erros e faça uma correção geral dele.

Exemplos e explicações de algumas mensagens:

O programa não resolve todas as instâncias do problema
É mensagem mais comum. Significa que existem casos em que seu programa dá respostas erradas. Não há a menor intenção de informar quais casos pois aprender a testar e encontrar erros num programa é parte importante do aprendizado de programação. Com frequência os alunos acham que o programa está certo só porque funcionou com um ou dois casos que estão no enunciado. Testar só os casos do enunciado nunca é suficiente.
A quantidade de dados escritos pelo programa é diferente da quantidade de dados esperados
Indica que o Dredd não foi capaz de entender onde estão as várias partes da sua resposta. Por exemplo, se o seu programa precisa calcular e escrever a área de um retângulo, um programa que tem duas saídas impede o Dredd de entender onde está a resposta da área. Esse erro sempre aparece em programas que conversam com o usuário. Esse erro significa pouca coisa em problemas que têm quantidade variável de saídas, como acontece em repetições ou no processamento de vetores e matrizes, pois um erro numa repetição de saída de dados muda a quantidade de saídas e fica difícil para o Dredd saber se o erro está repetição ou nas operações de saída. Erros na formatação da saída também podem ligar esse aviso (a formatação deve sempre ser observada no enunciado e os exemplos de saída devem ser vistos apenas como ajuda no entendimento do enunciado). A seção sobre entradas e saídas tem mais informações úteis para esses erros.
Existem n trechos perigosos no código
Significa que umas partes do código podem estar erradas ou ainda que o planejamento do programa contém erros. A seção sobre trechos perigosos tem mais informações úteis para esses erros.
O uso de registros não atende o enunciado
Esse é bem direto: o enunciado mandou você usar registros de alguma forma que você não atendeu, releia o enunciado e confira se você fez tudo que foi pedido no seu programa. Existe um bug em aberto no Dredd que faz com esse erro apareça indevidamente nos programas em que há inicialização de campos de registros. Não use inicialização de campos de registro.
O programa pode acessar posições indevidas da memória
Esse erro é relativo aos assuntos de vetores e de ponteiros, diz que seu programa usa uma posição de memória que não deveria estar usando. É bom conferir valores de índices e de ponteiros no seu programa. Usar a classe vector dentro das limitações definidas na disciplina pode ajudar.
O programa pode realizar uma repetição sem fim de operações de escrita
Significa que isso pode ocorrer no seu programa. Confira o controle das repetições em que há operações de escrita.
O programa usa memória demais, verifique seus vetores
Além do que sugere a mensagem, a configuração do sistema operacional em que o Dredd está rodando pode causar o aparecimento desta mensagem de erro por outros problemas relacionados ao uso de memória. Exceções de execução não tratadas parecem ser eventualmente classificadas inadequadamente como este erro.
O programa não compila
Essa mensagem é bem auto explicativa, mas talvez seu programa tenha compilado quando você testou. Pode ser que você você esteja usando um compilador muito velho (possivelmente uma versão antiga do MinGW); experimente usar outro compilador, por exemplo um compilador online. Poder ser que você tenha usado caracteres "especiais" (como letras acentuadas) nos identificadores. Apesar da especificação da linguagem C++ permitir, a maioria dos compiladores não permite; retire a acentuação do código para ter um programa que funciona em qualquer lugar, inclusive no Dredd. Existe também a possibilidade de você ter enviado o arquivo errado para o Dredd; confira.

Entradas e saídas

As entradas e saídas devem obedecer o enunciado, considerando a ordem e a quantidade de informações. Se o enunciado diz para ler a idade e depois o peso, então essas duas informações e somente essas duas informações, nesta ordem, devem ser lidas. Os enunciados costumam ter uma seção específica para determinar quais são as entradas, as saídas e a ordem delas. Se o enunciado estiver ambíguo em relação a isso, peça ao seu professor que melhore o enunciado.

A relação de ordem entre as entradas e saídas geralmente não importa. Por exemplo: se um problema consiste em ler 10 palavras e escrever as palavras lidas que forem do gênero masculino, então não importa se serão lidas todas as 10 palavras antes das operações de escrita ou se as operações de escrita acontecem enquanto as operações de leitura estão acontecendo, afinal, não é preciso ler todas as 10 palavras para saber se a primeira é do gênero masculino. Se por algum motivo o criador do problema considera essa ordem importante, então ele deve deixar isso bem claro no enunciado.

Se as saídas devem atender o enunciado, então o programa não pode ser desenvolvido de forma que "converse com o usuário". Ou seja, o programa não pode escrever mensagens de interface que ajudam uma pessoa a saber quais dados o programa está esperando. Mensagens como "digite a altura:" são consideradas saídas do programa e só podem ser usadas se o enunciado (em especial a seção de saídas) exigir.

As saídas devem ser separadas. Por exemplo: se o enunciado manda escrever a altura e a largura, então deve haver algum tipo de separação entre as duas, se o enunciado não diz nada a respeito, essa separação pode ser algo bem comum como um espaço ou um fim de linha. Cuidado com indicações de unidade ou sufixos. É o enunciado que determina se eles devem ser escritos, se devem ser juntos ou separados, etc. Confira os exemplos de saída para ver se você entendeu direito.

Diferenças entre maiúsculas e minúsculas, uso de acentos ou não fazem a diferença entre uma resposta certa ou errada, esteja atento ao enunciado.

A formatação de números na saída geralmente não é importante. Quando for, não é exemplo de saída, mas sim o enunciado que determina o que deve ser feito. Para a grande maioria dos problemas não interessa se o valor foi escrito com mais ou menos casas decimais ou mesmo se o valor foi escrito em notação científica. Preocupe-se em produzir código bem feito e não em formatar números. Não é exemplo de saída que determina se um valor é real ou inteiro, se deve ser escrito com casas decimais ou não. O exemplo de saída serve para ilustrar as regras e não para determiná-las.

Para saber mais sobre leituras, escritas, entradas e saídas de dados, leia o material específico.

Trechos perigosos

Uma das mensagens que podem aparecer na justificativa de nota do Dredd é que o seu programa contém "trechos perigosos". Esses trechos perigosos podem ser coisas bem distintas como variáveis que foram usadas antes de ganhar valor ou funções que contém um caminho de execução sem return (dentro do assunto modularização, porém relacionado às recomendações para sequências de seletores), mas de qualquer forma são indicações de que o programa teve um planejamento inadequado. Dependendo da gravidade do problema, pode indicar um programa que funciona por acaso.

O Dredd não informa exatamente quais trechos do seu programa são perigosos mas o seu compilador informa. O Dredd não é capaz de encontrar (e nem procura) diversos problemas que seu compilador e seu professor são capazes de encontrar então simplesmente preste atenção às mensagens do compilador. Elas têm descrições do problema e informam a posição do código onde o problema foi encontrado. Vale lembrar que o compilador pode ser configurado para reclamar mais ou menos de trechos do código que podem ser compilados mas que são indícios de que algo está errado. Confira as configurações usadas durante o seu processo de compilação.

Se você conferiu com cuidado e está certo de que seu compilador está usando uma configuração adequada e mesmo assim não está reclamando de trechos que o Dredd considera perigosos, então é provável que você esteja usando uma versão muito antiga do compilador. Procure descobrir qual compilador você está usando e qual a versão dele para depois instalar uma versão mais recente. Lembre-se: IDE não é compilador.

Esta página é mantida por Bruno Schneider para a disciplina de IAlg