Array de alguma forma vazio no END

0

Estou tentando criar um simples cruzado solucionador, mas não consigo nem ler a leitura dos dados. Entrada são dois arquivos, legenda e principal. Da lenda eu crio um array simples com palavras (que funciona). No entanto, quando tento criar uma matriz 2D de letras do próprio quebra-cabeça, acabo com uma matriz vazia na seção END.

{
   if(FILENAME=="legend") {
      l[NR]=$1
   }

   else{
      mw=NF
      for(i=1;i<=NF;i++)
         m[i,NR]=$i
      mh++

      for(i=1;i<=NF;i++)
         printf "%s ", m[i,NR]
   }
}

END{
   print "LEGEND:"
   for(i=1;i<length(l);i++)
      print l[i]

   print "MAIN:"
   for(h=1;h<=mh;h++){
      print "For line ",h
      for(w=1;w<=mw;w++){
         print "For element ",w
         if(m[w,h]!=""){
            print m[w,h]
         }
      }
   }
}

Edit: Criar apenas um leitor de matriz funciona corretamente, mas não funciona corretamente quando em um código com o outro leitor. Ele funciona, porque a impressão no código funciona linha por linha. O array só esvazia na seção END e eu simplesmente não consigo entender por quê ... Eles estão interferindo de alguma forma? A "legenda" é lida primeiro e, no entanto, a matriz permanece intocada no END. O "main" fica em segundo lugar, é lido e escrito corretamente e depois desaparece no END. Tem alguma ideia do porquê?

    
por MintSam 07.05.2018 / 16:04

1 resposta

1

Você usa NR como um índice quando coloca dados em m :

m[i,NR]=$i

Depois de ler o arquivo legend , NR não é redefinido, o que significa que o índice não começa em 1,1 . Você pode usar FNR ou mh + 1 .

Eu não olhei para o resto do código.

Algumas sugestões de melhorias:

Eu não sei como são seus dados, então estou adivinhando. NF e FNR são deixados inalterados da última linha de entrada no bloco END , então enquanto a última linha do último arquivo estiver correta e totalmente especificada, isso deve trabalhos. Isso elimina as variáveis mh e mw .

A maneira fácil de fazer um loop em um array simples é usar for (i in arr) . Isso define i para cada índice no array, por sua vez. Note, porém, que os índices podem ser apresentados ao loop "fora de ordem".

O primeiro bloco lê o arquivo legend . Isto significa que este tem que ser o primeiro operando de arquivo na linha de comando.

NR == FNR { l[FNR] = $1; next }

{
    for (i = 1; i <= NF; i++) {
        m[i,FNR] = $i
    }
    print
}

END {
    print "LEGEND:"
    for (i in l) print l[i]

    print "MAIN:"
    for (h = 1; h <= FNR; h++) {
        printf("For line %d\n", h)
        for (w = 1; w <= NF; w++) {
            printf("For element %d\n", w)
            if (m[w,h]) print m[w,h]
        }
    }
}

Para o último loop duplo, você também pode fazer

for (i in m) print i, m[i]

mas você sente falta do pedido e da saída extra informativa.

    
por 07.05.2018 / 16:37

Tags