C Variablenzugriff

Fritzler

Captain
Registriert
Juni 2006
Beiträge
3.898
Meinem Hirn ist bei 33°C anscheinend zu warm, jedenfalls geht mir kein Licht auf.
Hab folgenden Code:
Code:
void init (xpixels, ypixels) {
	uint8_t bild[xpixels/8][ypixels]; //2 Dimensionales Array erstellen
}

void clear () {
	//ne Schleife die alle Variablen des Array auf 0 setzt
}

Wie schaffe ich es, dass das 2D Array Bild nach dem Ausführen der Prozedur init immernoch im Speicher ist und ich mit der Prozedur clear oder anderen darauf zugreifen kann?
 
Speicher in der init() mit malloc anlegen, den Pointer zurückgeben.
clear() nimmt dann als Parameter diesen Pointer.
Kannst den Pointer natürlich auch global deklarieren, aber das i.A. "nicht so sauber".
 
Nachdem du den Speicher nicht mehr brauchst solltest du ihn noch mit free() wieder freigeben.
Außerdem wäre es nicht schlecht, wenn du in der clear() Funktion den Pointer auf Richtigkeit überprüfst.

Gruß
BlackMark
 
Jo genau.

Zusätzlich ist bei echten Bildern mit nem globalen Array meist das Problem, dass es da obergrenzen gibt, wieviel Speicher man so mal eben durch nen Array bekommt.
Bei ~1megapixel und 24/32bit hörts schon auf soweit ich weiß. Daher ist sowas wie malloc leider nötig.
Es gibt aber natürlich auch bibliotheken, die einem sowas abnehmen. (OpenCV ist wohl für C und C++ verfügbar)

Wichtig ist dann noch zu bedenken, dass man den Speicher auch wieder freigeben
Code:
free((void *)myPic);
muss

edit: da war natürlich wieder jemand schneller ;)

Wenns doch C++ wird ist das Wort new natürlich das Stichwort. Allerdings muss man dann ans delete denken
 
Das Ganze soll auf nem AVR laufen, also mehr als 240 x 240 Pixel werdens nicht werden, Farbe sowieso nicht.
Die Idee mit malloc ist gut, aber eigentlich auch unnötig.
Ich glaube nicht, dass das Display so schnell gewchselt wird bei der Hardware.
Daher hab ich das Array jetzt mal statisch angelegt, nur im Compiler kann die größe geändert werden.
Code:
//----------------- Konfiguration ------------------------------------------
//Bilgröße:
//(x_Pixel muss ein vielfaches von 8 sein)
#define x_Pixel	128
#define y_Pixel	64
//------------------ Ende --------------------------------------------------

uint8_t bild[x_Pixel/8][y_Pixel]; //2 Dimensionales Array erstellen


void clear () {
	uint8_t x = 0;
	uint8_t y = 0;
	 for(x = 0;x<((x_Pixel/8)+1);x++) {
		for (y = 0;y<(y_pixel+1);y++) {
			bild[x][y] = 0;
		}
	}
}
 
Sind die beiden "+1" nicht Falsch für die Zählvariablen?
y nimmt jetzt die Werte 0 bis 64<64+1 an. Dh insgesamt 65 verschiedene Werte, obwohl es nur 64 Pixel sind.

Und wieso "x_Pixel/8" ? Du willst doch wahrscheinlich alle Pixel in der Zeile auf 0 setzen und nicht nur die ersten (128/8)+1 = 17
 
Ein 8 Bit Integer enthält 8 Pixel, also brauch ich Pixelanzahl/8 Variablen, die +1 sind wirklich falsch :evillol:.
Es sind 8 Bit, weil der AVR ein 8bitter ist.

Will ich zB Pixel 15/40 Ansprechen:
x Wert/8 -> Schonmal die Variable der Spalte raus
x Wert Modulo 8 -> Bit in der Variable raus
der y Wert wird 1zu1 übernommen.
 
Ach ich habe dein
Code:
uint8_t bild[x_Pixel[B]/8[/B]][y_Pixel]; //2 Dimensionales Array erstellen
übersehen.

Es handelt sich also nur um schwarz-weiß bilder und du gehst sicher pro Pixel nur 1 bit zu verwenden.
Die clear-Methode ist natürlich sehr schlau dann, weil du mit einem
Code:
bild[x][y] = 0;
gleich 8 Pixel auf einmal setzt.

Aber ich würde mir für andere Bildoperationen (Linien malen? Oder was hast du vor?) einmal effiziente (mit bitshift zur Stellenberechnung) Methoden schreiben zum lesen und schreiben einzelner Koordinaten. Also so Funktionen wie
Code:
void set(int x, int y, int value);
void flip(int x, int y);
int get(int x, int y);
...

Dann musst du nicht später in einer drawLine(startX, startY, endX, endY) Funktion wieder mühsam überlegen welches bit von welchem int nun gerede dran ist sondern kannst einfach immer an der entsprechenden Koordinate set(x, y, ...) machen :)


Ka ob sowas bei deinem AVR möglich ist, aber es gibt scheinbar auch fertige C-Header die einen "Bitset" (was du ja selbst nutzt) zur Verfügung stellen. (Hab nur ma gegoogelt - kenne keine guten)
 
Zuletzt bearbeitet:
Zurück
Oben