0

Ich erhalte einen Fehler unknown identifier 'start'Fehler beim Versuch, ein Array in Eiffel zu durchqueren

meinen Code:

visit_table(table: ETABLE) 
    local 
     t_array: ARRAY[ARRAY[ELEMENT]] 
     b_header: BOOLEAN 
     row_index: INTEGER 
    do 
     t_array := table.t_array 
     b_header := table.b_header 
     table.content := "<table>" 
     row_index := 0 

     from t_array.start 
     until t_array.off 
     loop 

      table.content := table.content + "<tr>" 
       from t_array.item.start 
       until t_array.item.off 
       loop 
        if row_index = 0 and b_header = TRUE then 
         table.content := table.content + "<th>" + t_array.item.content + "</th>" 
        else 
         table.content := table.content + "<td>" + t_array.item.content + "</td>" 
        end 
       end 
       table.content := table.content + "</tr>" 
       row_index := row_index + 1 
     end 

     table.content := table.content + "</table>" 
    end 

Ich mag nur durch die Objekte des 2D-Arrays analysieren und HTML-Tags um sie herum wickeln.
Stimmt etwas mit meiner Syntax nicht?

Antwort

1

Die Klasse ARRAY erbt nicht TRAVERSABLE die start Funktionen bietet, after, forth und item. Daher können Arrays mit diesen Features nicht durchlaufen werden. Stattdessen wird das Traversal normalerweise mit Item-Indizes ausgeführt, die von lower beginnen und um upper enden. So, im Code würde es zwei Variablen sein i und j (eine für die innere Schleife und eine andere für die äußeree Schleife) vom Typ INTEGER und die Schlaufen wie

from 
    j := t_array.lower 
until 
    j > t_array.upper 
loop 
    ... t_array [j] ... -- Use item at index `j`. 
    j := j + 1 -- Advance to the next element of the array. 
end 

Eine Alternative ist, eine Iteration Form der verwenden loop:

Der letztgenannte Ansatz ist näher an dem in Ihrem aktuellen Code verwendet, so dass Sie es möglicherweise mehr bevorzugen. Beachten Sie, dass in diesem Fall kein Aufruf von start, off und forth erforderlich ist, da dies automatisch erfolgt.

Schließlich ist es möglich, Ihren aktuellen Code zu verwenden, aber iterieren über linear_reprentation. Dazu würden Sie 2 weitere lokale Variablen und q der Typen LINEAR [ARRAY [ELEMENT]] bzw. LINEAR [ELEMENT] benötigen. Die erste würde mit p := t_array.linear_representation initialisiert werden und die äußere Schleife würde , p.after, p.item und p.forth verwenden. Der zweite würde mit q := p.item.linear_representation initialisiert werden. Dies ist die umständlichste Methode und ich lese sie nur der Vollständigkeit halber auf.

+0

Vielen Dank für die Antwort die zweite Option funktionierte wie ein Charme. –

Verwandte Themen