Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    dichiarazione di variabile fuori/dentro ciclo do...while

    non posso riportare il codice complessivo da cui è estratta questa funzione perchè è molto lungo ad ogni modo cercherò di essere il più possibile chiaro
    codice:
    function init()
    {
    readWords();
    
    var fontSize=200;
    var wordWidth=0;
    do
    {
    wordWidth=0;
    fontSize-=5;
    wordCtx.font=fontSize+"px sans-serif";
    for(var i=0;i<txt.length;i++)
    {
    var w=wordCtx.measureText(txt[i]).width;
    if(w>wordWidth) wordWidth=w;
    }
    } while(wordWidth>cw-50 || fontSize*txt.length > ch-50)
    
    wordCtx.clearRect(0,0,cw,ch);
    wordCtx.textAlign="center";
    wordCtx.textBaseline="middle";
    for(var i=0;i<txt.length;i++)
    {
    wordCtx.fillText(txt[i],cw/2,ch/2 - fontSize*(txt.length/2-(i+0.5)));
    }
    }
    in questa funzione è scritto un ciclo do...while. notate le variabili wordWidth e fontSize, scritte all'inizio della funzione e poi di nuovo in corrispondenza di do{}(attribuendovi un valore differente). ho provato a modificare questo codice dichiarando e attribuendo valori a fontSize e wordWidth una sola volta: ho provato sia a dichiarale all'inzio della funzione init, sia all'interno di do{}, in ogni caso le due variabili erano passate una sola volta e non due volte come nel codice che ho riportato sopra:
    codice:
    function init()
    {
    readWords();
    
    wordWidth=0; 
    fontSize=195; 
    do
    {
    wordCtx.font=fontSize+"px sans-serif";
    for(var i=0;i<txt.length;i++)
    {
    var w=wordCtx.measureText(txt[i]).width;
    if(w>wordWidth) wordWidth=w;
    }
    } while(wordWidth>cw-50 || fontSize*txt.length > ch-50)
    
    wordCtx.clearRect(0,0,cw,ch);
    wordCtx.textAlign="center";
    wordCtx.textBaseline="middle";
    for(var i=0;i<txt.length;i++)
    {
    wordCtx.fillText(txt[i],cw/2,ch/2 - fontSize*(txt.length/2-(i+0.5)));
    }
    }
    oppure così
    codice:
    function init()
    {
    readWords();
    
    do
    {
    wordWidth=0; 
    fontSize=195; 
    wordCtx.font=fontSize+"px sans-serif";
    for(var i=0;i<txt.length;i++)
    {
    var w=wordCtx.measureText(txt[i]).width;
    if(w>wordWidth) wordWidth=w;
    }
    } while(wordWidth>cw-50 || fontSize*txt.length > ch-50)
    
    wordCtx.clearRect(0,0,cw,ch);
    wordCtx.textAlign="center";
    wordCtx.textBaseline="middle";
    for(var i=0;i<txt.length;i++)
    {
    wordCtx.fillText(txt[i],cw/2,ch/2 - fontSize*(txt.length/2-(i+0.5)));
    }
    }
    la funzione così passata tuttavia sembra mandare in corto il browser e l'esecuzione di tutto lo script diventa molto più lenta, anzi in chrome non prende luogo il caricamento.
    come mai?

    mi ha sorpreso questo comportamento: questo porzione di codice e l'intero script non è mia opera, è per questo motivo che lo sto maneggiando e sto cercando di capirlo. ma nella fattispecie mi interessa capire come mai la funzione init e il ciclo do...while prende atto solo quando le due variabili wordWidth e fontSize sono dichiarate come nel primo codice che ho scritto, vale a dire due volte, fuori e dentro il ciclo do/while.

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,780
    Ciao,
    il problema sta nella condizione del ciclo do/while il quale, con le modifiche da te proposte, risulta essere un ciclo infinito.

    Nota la condizione:
    codice:
    wordWidth>cw-50 || fontSize*txt.length > ch-50
    Con questa condizione il ciclo viene ripetuto se wordWidth è maggiore di un certo valore, oppure se fontSize*txt.length è maggiore di un certo valore.

    Nello script originale tale condizione veniva resa falsa ad un certo punto per effetto del decrescere del valore fontSize.
    Infatti all'interno del ciclo avevi questa riga:
    codice:
    fontSize-=5;
    dove, con l'operatore decrementale -=, veniva sottratto 5 a tale variabile per ogni iterazione del ciclo.

    In conclusione, se fontSize mantiene un valore fisso che rende sempre vera la condizione del do/while, il browser non riesce ad uscire da quel ciclo e va in crash.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #3
    grazie! la tua indicazione è stata illuminante

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.