Array an Funktion übergeben (Referenzieren)

Guten Tag!

Ich bin schon seit einigen Tagen an einem Problem dran in C. Ich möchte ein Array, in dem ein Bild abgespeichert ist, in einer Funktion verändern in dem ich rote Punkte einsetze. Da ich bei Zeigern und Pointern noch immer leichte Verständnisprobleme habe, wollte ich mich euch da kurzschließen, weil mein Latein schon ziemlich am Ende ist.
Die Fehlermeldung die ich bekomme ist eine Zugriffsverletzung beim Schreiben an der Stelle, wo ich das 'r' einsetzen will...

Code:
void set_points(struct town ort[],static char * xmp[])
    {
    int breite=0, hoehe=0,i,k,u;
        for (i=0; i<20; i++)
        {
        if (ort[i].name!="")
            {
            breite=suche_b_punkt(stadt,i);
            hoehe=suche_h_punkt(stadt,i);
                for (k=-2; k<=2; k++)
                {
                    for (u=-2; u<=2; u++)
                    {
                    xmp[hoehe+10+k][breite+u]='r'; // Fehler tritt an dieser Stelle auf
                    }
                }
            }
        }
    }
Wie schafe ich es, dass ich das Array innerhalb der Funktion verändern kann und es später in main dann ausgeben kann?

Wäre euch echt dankbar für ein paar Anregungen oder Links...

Grüße
Hawkzfan
 
Hi.

Der Fehler tritt auf, da du die Grenzen des Arrays nicht eingehalten hast. Wie ist das Array denn deklariert? Hast du denn wirklich ein Array von Zeigern? Oder hast du ein 2-dimensionales Array deklariert?

Deine Frage hat dann damit eigentlich nichts zu tun. Ein Array wird immer als Zeiger auf das erste Element des Arrays übergeben, so das sich Änderungen in der Funktion immer auf das übergebene Array auswirken.

Gruß
 
An das Array habe ich eigentlich net gedacht:

Also das Array ist so aufgebaut: / (max. Zeilen 820 max. Spalten 636)

Code:
static char * ger_xpm[] = {
"635 810 9 1",
"     c #000000",
".    c #FFFFFF",
"+    c #201E59",
"@    c #A3A7A7",
"#    c #3C4238",
"$    c #5B6254",
"%    c #787E6C",
"&    c #ECED3D",
"r    c #FF0000",
"+++++++++++++++++++++++++++++++++++++++...",
//usw.
im index ist breite und hoehe korrekt (hab ich kontrolliert), das +10 soll die Deklerationen überspringen, die du oben siehst und k und u geht ja jeweils von -2 bis +2.

Ich weiß ehrlich gesagt nicht, warum ich die Grenzen des Arrays nicht einhalte?

Ich hoffe jmd. hat ne Idee...


Grüße
Hawkfan
 
Hi.

Aha, das Problem ist, das Stringliterale konstant sind. Die kannst du nicht ändern.

Wieso verwendest du überhaupt static bei dem Parameter? Das ist eigentlich gar nicht erlaubt. Was für einen Compiler verwendest du denn?

Gruß
 
Das heißt, wenn ich das Array ändern will muss ich es schon beim Zusammensetzen ändern? Würde bedeuten, ich mach ein temp[] Array und füll an den Stellen, wo ich was ändern will das Neue ein?

P.S: Compiler ist von Microsofts Visual Studio 2008

Grüße Hawkzfan
 
Das heißt, wenn ich das Array ändern will muss ich es schon beim Zusammensetzen ändern? Würde bedeuten, ich mach ein temp[] Array und füll an den Stellen, wo ich was ändern will das Neue ein?
Ich weiß nicht genau was du damit meinst. Es wäre evtl. sinnvoll gleich anfangs änderbare Strings in dem Array zu verwenden.
P.S: Compiler ist von Microsofts Visual Studio 2008
Aha. Und warum verwendest du das Schlüsselwort bei dem Parameter nun? Was hat das für eine Wirkung?

Gruß
 
Das Array ist ein Bild File im XMP Format die ich einbinde, dass heißt das Array ist schon als static vorgegeben.

Aha. Und warum verwendest du das Schlüsselwort bei dem Parameter nun? Was hat das für eine Wirkung?

Was gemau meinst du?

Ziel des Programmes ist in einem Bild, einen roten Punkt an einer bestimmten Stelle einzufügen.

Grüße Hawkzfan
 
Zuletzt bearbeitet:
Das Array ist ein Bild File im XMP Format die ich einbinde, dass heißt das Array ist schon als static vorgegeben.
Das mag ja sein. Aber um die Arrayvariable geht es gar nicht.
Was gemau meinst du?
Ich meine den Parameter namens xmp der Funktion set_points bei dem du das Schlüsselwort static verwendet hast - was normalerweise gar nicht erlaubt wäre. Jetzt würde mich interessieren warum du es dort verwendest und was das Schlüsselwort dann dort überhaupt für eine Wirkung hat.

Gruß
 
Ich habs jetzt weggelassen, dachte nur das muss ebenfalls static sein, wenn es zuvor so definiert wurde. Die Fehlermeldung bleibt aber erstmal dieselbe, aber das wird wohl noch mit dem Array zu tun haben...

Code:
void set_points(struct town ort[],char * xmp[])
    {
    int breite=0, hoehe=0,i,k,u;
        for (i=0; i<20; i++)
        {
        if (ort[i].name!="")
            {
            breite=suche_b_punkt(stadt,i);
            hoehe=suche_h_punkt(stadt,i);
                for (k=-2; k<=2; k++)
                {
                    for (u=-2; u<=2; u++)
                    {
                    xmp[hoehe+10+k][breite+u]='r'; // Fehler tritt an dieser Stelle auf
                    }
                }
            }
        }
    }
Ich habe beim Debuggen, einige Breakpoints gesetzt und überprüft ob er das richtige Array Element aussucht.
in der Zeile
Code:
xmp[hoehe+10+k][breite+u]='r'; 
// im ersten Durchlauf folgende Werte:
// xmp[143+10+(-2)][293+(-2)]=$
Das Element existiert definitiv! Aber darf ich überhaupt eine Variable vom Typ char in eine Funktion einbinden und dort verändern?

Vielen Dank aber schon Mal für deine Mühe bis hierhin...

Grüße Hawkzfan
 
Die Fehlermeldung bleibt aber erstmal dieselbe, aber das wird wohl noch mit dem Array zu tun haben...
Ja, vermutlich.
Code:
        if (ort[i].name!="")
So kann man keine Strings vergleichen. Um Strings zu vergleichen muß man die Stringfunktion strcmp verwenden, oder in dem Fall
C:
if (ort[i].name[0] == '\0')
Das Element existiert definitiv! Aber darf ich überhaupt eine Variable vom Typ char in eine Funktion einbinden und dort verändern?
Grundsätzlich darf man in C so ziemlich alles. Hast du denn nun die Daten im Array veränderlich gemacht?
\edit: Darfst du denn die Deklaration von ger_xpm ändern?

Gruß
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück