www.mikrocontroller.net

Forum: PC-Programmierung Array in C/C++ initialisieren


Autor: Sebastian Halle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

würde gern die Daten von einem CCD-Array am PC abspeichern. Für jedes
Pixel eine Wort. Nur leider stehe ich gerade irgendwie auf dem
Schlauch.
Wie intialisiere in denn in C/C++ ein Array mit der Größe von zB.
500x500. Kann mir jemand einen Tip geben?

Gruß Sebastian

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
statisch:
unsigned int ar[500][500];

dynamisch:
unsigned int *p_ar;
p_ar = malloc( sizeof(unsigned int) *500*500 );

oder c++ mässig

unsigned int *p_ar = new unsigned int[sizex][sizey];

Autor: Martin Hofmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein zweidimensionales Array definieren und initialisieren Sie so:

    unsigned values[500][500] = { v_00, v_01, ..., v_499499 };

Die Werteliste in geschweiften Klammern kann dabei auch kürzer
als 500 * 500 sein; fehlende Werte werde mit 0 initialisiert. Um
also ein vollständig mit 0 gefülltes Array zu definieren:

    unsigned values[500][500] = { 0 };

In den üblichen PC-Implementierungen von C ist der Typ 'unsigned'
32 Bit groß, das Array damit 250000 * 4 Byte = 1 MB groß. Wenn der
Wertebereich ausreicht, wäre als Elementtyp also 'unsigned short'
empfehlenswert (ich nehme an, daß die Pixelwerte kein Vorzeichen
haben).

Datenobjekte dieser Größe sollten nicht mit automatischer Lebensdauer,
also lokal in Funktionen, angelegt werden, sondern global außerhalb
von Funktionen:

    unsigned values[500][500] = { 0 };

    void foo(void)
    {
        /* ... */
    }

oder als 'static' - dann werden sie nicht auf dem Stack angelegt -:

    void foo(void)
    {
        static unsigned values[500][500] = { 0 };
    }

oder am besten dynamisch allokiert werden:

    #include <stdlib.h> /* wegen malloc() */

    unsigned (*values)[500];

    void foo(void)
    {
        /* "values" initialisieren */
        values = malloc(500 * sizeof values[500]);
        if (values == NULL) {
            /* Oha, nicht genug Speicher! */
        }
        /* ... */
    }

Hilft das bei Ihrer Frage weiter?

Gruß
Martin

Autor: Sebastian Halle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist genau was ich gesucht habe!
Herzlichen Dank!

Gruß Sebastian

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

bei der Verwendung von malloc (bzw. new in C++) muß man aber darauf
achten den Speicher auch wieder freizugeben.

Matthias

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kann man ein 2 Dimensionales Array an einer Funktion übergeben?

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
einfach einen pointer drauf. wenn die dimensionen variabel sind musst du
diese als extra parameter mitübergeben (mindestens dimensionen-1
stück):

void fnk(int* zweiDarray, int dim1)

zugriff:

int i = *(zweiDarray + (y_position*dim1)+ x_position;

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nachtrag:
denk dir in der letzten zeile noch die klammer zu. und falls der
compiler meckert noch nen cast

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> oder c++ mässig
> unsigned int *p_ar = new unsigned int[sizex][sizey];

Das geht? staun

Unter "C++-mäßig" versteh ich sowas:
std::vector<std::vector<unsigned int> > array(sizex);
Das würde ich in dem Fall wahrscheinlich bevorzugen, weil man sich a)
nicht mit Zeigern herumschlagen muss und b) es trotzdem praktisch
genauso schnell ist.

Oder wenns unbedingt Zeiger und dynamischer Speicher sein müssen:
unsigned int** array = new unsigned int*[sizex];
for(unsigned int i = 0; i < sizex; ++i) array[i] = new unsigned
int[sizey];
Das Freigeben des Speichers wird dann aber etwas eklig und wird gerne
vergessen.

Deswegen ist das hier wohl besser (aber immer noch schlechter als die
Vector-Lösung oder statisches Array):
unsigned int* array = new unsigned int[sizex * sizey];

Korrekterweise sollte man auch posten, wie man das array wieder
freigibt:
delete[] array;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.