2011-10-19 13 views
0

MISE À JOURcomment créer un tableau vide

La description originale ci-dessous présente de nombreuses erreurs; gawk lint ne se plaint pas des tableaux non initialisés utilisés comme RHS de in. Par exemple, l'exemple suivant ne donne aucune erreur ou avertissement. Je ne supprime pas la question parce que la réponse que je suis sur le point d'accepter donne une bonne suggestion d'utiliser split avec une chaîne vide pour créer un tableau vide.

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"; 
    } 
} 

Original Question

Beaucoup de mes scripts awk ont ​​une construction comme suit:

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

Avec gawk --lint qui se traduit par

warning: reference to uninitialized variable `thread_start'

Donc, je initialise dans le bloc BEGIN comme suit. Mais cela semble kludge-y. Existe-t-il un moyen plus élégant de créer un tableau à zéro élément?

BEGIN { LINT = 1; thread_start[0] = 0; delete thread_start[0]; } 
+0

Pas que je sache. –

Répondre

0

Résumé

La méthode idiomatiques de creating an empty array in Awk est d'utiliser split().

Détails

Pour simplifier votre exemple ci-dessus pour se concentrer sur votre question plutôt que vos fautes de frappe, l'erreur fatale peut être déclenchée avec:

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

qui produit l'erreur suivante:

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

Donner thread une valeur avant de l'utiliser pour rechercher dans threads_start passes peluchage:

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

produit:

not if

Pour créer une erreur de peluchage avec un tableau uninitialised, nous devons tenter d'accéder à une entrée inexistante:

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

produit:

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

Donc, vous n'avez pas vraiment besoin pour créer un tableau vide dans awk, mais si vous voulez de le faire, et répondre à votre question, utilisez split():

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

produit :

not if

+0

Merci de m'avoir ramené à cette question stupide. Merci d'ignorer les erreurs et de toujours fournir une réponse utile. –

1

Je pense que vous avez peut-être fait quelques fautes de frappe dans votre code.

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

Vous recherchez l'index thread dans le tableau threads_start.

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

Mais ici vous imprimer l'index thread_start dans le tableau threads! Notez également les différents sthread/threads et threads_start/thread_start. Gawk vous avertit correctement de l'utilisation de thread_start (sans s) sur la deuxième ligne.

Il y a aussi une erreur dans votre format printf.

Lorsque vous modifiez l'avertissement de ces peluches disparaît:

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

Mais peut-être que je l'ai mal compris ce que votre code est censé faire. Dans ce cas, pourriez-vous poster un échantillon de code autonome minimal qui produit l'avertissement de la fibre parasite?

+0

Pas peu, trop de fautes de frappe. Laissez-moi essayer et retravailler. –