2017-02-11 1 views
1

Ich habe in den letzten Tagen ein Programm mit Processing 3 erstellt (das erste Mal ging ich zurück auf Processing seit Intro to Computer Science im Jahr 2009) und behielt dieses Problem :Eingebaute Variablen, die in bestimmten Fällen nicht verwendbar sind (Verarbeitung 3)

public class PolarMap { 
    ... 
    PVector[][] mapping = new PVector[width][height]; 
    PVector[][] cartesian = new PVector[width][height]; 
    PVector cart = new PVector(); 
    PVector polar = new PVector(); 

    /** 
    Maps every pixel on the cartesian plane to a polar coordinate   
    relative to some origin point. 
    */ 
    public void Map(float originX, float originY){ 
     for (int x=0; x < width; x++){ 
      for (int y=0; y < height; y++){ 
      ... 
      cart.add(x, y); 
      polar.add(r, theta); 
      mapping[x][y] = polar; *** 
      cartesian[x][y] = cart; 
     } 
    } 
    } 
    ... 
} 

Auf der Linie mit dem ***, würde ich immer ein Array Index Out Of Bounds geworfen bekommen. Ich suchte SO, Reddit und Processing eigene Dokumentation, um herauszufinden, warum. Wenn Sie mit der Verarbeitung nicht vertraut sind, sind Breite und Höhe beides eingebaute Variablen und entsprechen der Anzahl der Pixel hoch und über Ihre Zeichenfläche hinweg, wie in der setup() -Methode deklariert (in meinem Fall 800x800). Aus irgendeinem Grund wurden beide Arrays nicht auf diesen Wert initialisiert - stattdessen wurden sie auf den Standardwert dieser Variablen initialisiert: 100.

Also, weil es keinen Sinn machte, aber es war eine dieser Zeiten, ich versucht, neue Variablen zu deklarieren:

int high = height; 
int wide = width; 

und initialisiert das Array mit diesen Variablen. Und wusstest du das nicht, das hat das Problem gelöst. Ich habe jetzt zwei 800x800-Arrays.

Also hier ist meine Frage: WARUM waren die eingebauten Variablen nicht wie erwartet, wenn verwendet, um die Arrays zu initialisieren, aber tat genau das, was sie sollten, wenn sie einer definierten Variablen zugewiesen?

Antwort

1

Denken Sie darüber nach, wenn die Variablen width und height ihre Werte erhalten. Betrachten Sie diese Beispielskizze:

int value = width; 

void setup(){ 
    size(500, 200); 
    println(value); 
} 

Wenn Sie dieses Programm ausführen, sehen Sie, dass es 100 druckt, auch wenn das Fenster 500 Pixel breit ist. Dies ist, weil die int value = width; Zeile passiert ist vor die Breite eingestellt ist!

Damit dies funktioniert, wie man es erwarten würde, haben Sie die value Variable nach die size() Funktion aufgerufen wird eingestellt. So könnten Sie dies tun:

int value; 

void setup(){ 
    size(500, 200); 
    value = width; 
    println(value); 
} 

Verschieben Sie alle Initialisierungen innerhalb der setup() Funktion, nachdem die size() Funktion aufgerufen wird, und Sie werden in Ordnung.

+0

Der problematische Array-Initialisierer und die Deklaration der Arbeitsvariablen befinden sich beide in demselben Bereich, weit entfernt von der Methode setup() in der Hauptklasse. Allerdings .... Es ist mir gerade eingefallen, dass ich Map (originX, originY) mit einem Wert fütterte, der über der setup() -Methode in der Hauptklasse deklariert wurde. Basierend auf dem, was Sie gerade geschrieben haben, vermute ich * das * war der Ursprung meines Problems. Und nachdem Sie es getestet haben, haben Sie absolut Recht! Cool, danke! – pyansharp

+0

@pyansharp Ja, es hat nichts direkt mit dem Bereich zu tun, es ist alles in der Reihenfolge der Ereignisse. Eine einfache Möglichkeit wäre es, 'print()' Anweisungen hinzuzufügen, um zu sehen, was zuerst passiert, aber wenn 'width' und' height' '100' sind, dann wird 'size()' noch nicht aufgerufen. –

Verwandte Themen