Frage

AKTUALISIEREN

Die ursprüngliche Beschreibung unten hat viele Fehler. Gawk Lint beschwert sich nicht über nicht initialisierte Arrays, die als Rhs von verwendet werden in. Zum Beispiel gibt das folgende Beispiel keine Fehler oder Warnungen. Ich lösche die Frage nicht, weil die Antwort, die ich akzeptiere, einen guten Vorschlag für die Verwendung split mit einer leeren Zeichenfolge, um ein leeres Array zu erstellen.

BEGIN{
    LINT = "fatal"; 
    // print x; // LINT gives error if this is uncommented 
    thread = 0;
    if (thread in threads_start) { 
        print "if"; 
    } else {  
        print "not if"; 
    }
}

Originalfrage

Viele meiner awk -Skripte haben ein Konstrukt wie folgt:

if (thread in threads_start) {  // LINT warning here
  printf("%s started at %d\n", threads[thread_start]));
} else {
  printf("%s started at unknown\n");
}

Mit gawk --lint was in ... endet

WARNUNG: Verweis auf nicht initialisierte Variable "Thread_start"

Deshalb initialisiere ich im Beginnblock wie folgt. Aber das sieht klodge-y aus. Gibt es eine elegantere Möglichkeit, ein Array mit Nullelementen zu erstellen?

BEGIN { LINT = 1; thread_start[0] = 0; delete thread_start[0]; }
War es hilfreich?

Lösung

Zusammenfassung

Die idiomatische Methode von Erstellen eines leeren Arrays in awk ist zu verwenden split().

Einzelheiten

Um Ihr obiger Beispiel zu vereinfachen, um sich auf Ihre Frage und nicht auf Ihre Tippfehler zu konzentrieren, kann der tödliche Fehler ausgelöst werden:

BEGIN{
    LINT = "fatal"; 
    if (thread in threads_start) { 
        print "if"; 
    } else {  
        print "not if"; 
    }
}

was den folgenden Fehler erzeugt:

gawk: cmd. line:3: fatal: reference to uninitialized variable `thread'

Geben thread Ein Wert, bevor Sie ihn verwenden, um nach zu suchen threads_start Pässt LINTING:

BEGIN{
    LINT = "fatal"; 
    thread = 0;
    if (thread in threads_start) { 
        print "if"; 
    } else {  
        print "not if"; 
    }
}

produziert:

not if

Um einen Lining-Fehler mit einem nicht initialisierten Array zu erstellen, müssen wir versuchen, auf einen nicht existierenden Eintrag zuzugreifen:

BEGIN{
    LINT = "fatal"; 
    thread = 0;
    if (threads_start[thread]) { 
        print "if"; 
    } else {  
        print "not if"; 
    }
}

produziert:

gawk: cmd. line:4: fatal: reference to uninitialized element `threads_start["0"]'

Also nicht wirklich brauchen um ein leeres Array in awk zu erstellen, aber wenn Sie wollen Verwenden Sie dazu und beantworten Sie Ihre Frage split():

BEGIN{
    LINT = "fatal"; 
    thread = 0;
    split("", threads_start);
    if (thread in threads_start) { 
        print "if"; 
    } else {  
        print "not if"; 
    }
}

produziert:

not if

Andere Tipps

Ich denke, Sie haben vielleicht ein paar Tippfehler in Ihrem Code gemacht.

if (thread in threads_start) { // LINT warning here (you think)

Hier suchen Sie nach dem Index thread in Array threads_start.

  printf("%s started at %d\n", threads[thread_start])); // Actual LINT warning

Aber hier drucken Sie den Index thread_start in Array threads! Beachten Sie auch die verschiedenen s's thread/threads und threads_start/thread_start. Gawk warnt dich tatsächlich richtig vor der Verwendung von thread_start (ohne s) in der zweiten Zeile.

Es gibt auch einen Fehler in Ihrem printf Format.

Wenn Sie diese ändern, verschwindet die Lintwarnung:

if (thread in threads_start) {
  printf("%s started at %d\n", thread, threads_start[thread]));
} else {
  printf("%s started at unknown\n");
}

Aber vielleicht habe ich falsch verstanden, was Ihr Code tun soll. Könnten Sie in diesem Fall eine minimale, in sich geschlossene Code-Probe veröffentlichen, die die falsche Warnung erzeugt?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top