Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C (C89, C99 und C11) ::  mehrdimensionales Array ansprechen     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
RajHid
Unregistrierter




Beitrag RajHid Unregistrierter 17:37:22 28.05.2012   Titel:   mehrdimensionales Array ansprechen            Zitieren

hallo

ich Habe ein Mehrdimensionales Array und will die einzelnen Elemente des Arrays ansprechen. Ich weiß aber leider nicht wie die Syntax dafür ist.
der Ansatz mit *screen[i][j] so wie es die Logische Erweiterung bei einem eindimensionalen Array wäre bringt eine Fehlermeldung im Compiler --> subscript value is nether array nor pointer. verschiedenen Klammerungen bringen auch keine besserung.

übergeben tue ich die erste Speicheradresse meines Arrays an eine Funktion, innerhalb der Funktion will ich das Array dann mit werten bestücken, indem ich die Speicherbereiche anspreche,

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
void schiffupdate(char *screen,int *HorizontalMove,int *VerticalMove){
    int i=0,j=0,k=0,up=20,left=0;
    int zeileabsolut=0,spalteabsolut=0;
//---Ausgabe Leerraum vor Raumschiff
    for(i=1;i<=ZEILENZAHL-*VerticalMove;i++){
        for(j=1;j<=SPALTENZAHL;j++){
            //printf(" ");
            *(screen+i+j)='v';// hier versuche ich die einzelnen Ellemente anzusprechen weis aber nicht ob das so richtig ist
        }
        //printf("\n");
        //*(screen+i+j)='\n';
    }
}
Unregistrierter





Beitrag Unregistrierter 17:45:21 28.05.2012   Titel:              Zitieren

screen[i][j]
icarus2
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.09.2009
Beiträge: 1359
Beitrag icarus2 Mitglied 17:48:32 28.05.2012   Titel:   Re: mehrdimensionales Array ansprechen            Zitieren

Das muesste dann aber doch
C++:
char **screen

sein, nicht?
DirkB
Unregistrierter




Beitrag DirkB Unregistrierter 17:53:05 28.05.2012   Titel:              Zitieren

Nein.
icarus2
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.09.2009
Beiträge: 1359
Beitrag icarus2 Mitglied 17:58:19 28.05.2012   Titel:              Zitieren

DirkB schrieb:
Nein.

Aber das kompiliert doch sonst gar nicht?
C++:
void schiffupdate(char *screen,int *HorizontalMove,int *VerticalMove)
{
    int i = 0, j = 0;
    screen[i][j] = 'a'; // Compilation Error
}
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17931
Beitrag SeppJ Moderator 18:02:36 28.05.2012   Titel:              Zitieren

Zum tausendsten Mal: Ein Array ist kein Zeiger und ein zweidimensionales Array ist erst recht kein Zeiger auf einen Zeiger.

_________________
Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List
Unregistrierter





Beitrag Unregistrierter 18:03:33 28.05.2012   Titel:   Re: mehrdimensionales Array ansprechen            Zitieren

Wenn du unbedingt Pointerarithmetik machen willst, versuche mal folgendes:

C++:
for(i=1;i<=ZEILENZAHL-*VerticalMove;i++){
        for(j=1;j<=SPALTENZAHL;j++){
            *(screen + (i * SPALTENZAHL) +j)='v';
        }
    }
}

Und überprüfe nochmals, ob die Zählvariablen wirklich bei 1 anfangen sollen. Das ist nämlich ungewöhnlich...

Ansonsten würde ich auch sagen, dass das char **screen heißen muss.
DirkB
Unregistrierter




Beitrag DirkB Unregistrierter 19:42:25 28.05.2012   Titel:              Zitieren

Steffo schrieb:
Ansonsten würde ich auch sagen, dass das char **screen heißen muss.
Das kommt auf die Definition der Variablen an.

Wenn du ein screen[ZEILENZAHL][SPALTENZAHL]; nimmst, bekommst du einen zusammenhängenden Speicherbereich von ZEILENZAHL*SPALTENZAHL Elemente.
Das ist das gleiche wie screen[ZEILENZAHL*SPALTENZAHL];
Nur bei der 2D-Definition kannst du (in dem Scope, wo die Deklaration bekannt ist) auch mit screen[i][j] darauf zugreifen.

Bei der Übergabe an eine Funktion als Zeiger ist jedoch die Dimension nicht bekannt. Darum dann *(screen + (i * SPALTENZAHL) +j)

Wenn du dagegen ein char *screen[ZEILENZAHL]; nimmst und jedem Zeiger des Arrays einen Speicher zuweist, dann kannst du da auch in der 2D-Array-Schreibweise zugreifen: screen[i][j] . Das ist dann aber *(screen[i]+j). bzw *(*(screen+i)+j). Also etwas ganz anderes.
Unregistrierter





Beitrag Unregistrierter 20:38:35 28.05.2012   Titel:              Zitieren

Hm, ok. :)
Wutz
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.04.2010
Beiträge: 2689
Beitrag Wutz Mitglied 20:49:58 28.05.2012   Titel:   Re: mehrdimensionales Array ansprechen            Zitieren

RajHid schrieb:
verschiedenen Klammerungen bringen auch keine besserung.

So?
Dann hast du aber nicht genügend 'Klammerungen' ausprobiert.
Es sieht so aus, dass du mit ZEILENZAHL+SPALTENZAHL schon Compilezeitkonstanten vorliegen hast, die kannst du für die Parameter nutzen,

C++:
void schiffupdate(char screen[][SPALTENZAHL],int *HorizontalMove,int *VerticalMove)
oder äquivalent
void schiffupdate(char screen[ZEILENZAHL][SPALTENZAHL],int *HorizontalMove,int *VerticalMove)


Dann kannst du einfach mit screen als Array hantieren,
C++:
screen[zeilenindex][spaltenindex]


Deine Laufbereiche sind falsch,
C++:
    for(i=1;i<=ZEILENZAHL-*VerticalMove;i++){
        for(j=1;j<=SPALTENZAHL;j++){

Arrayindexe beginnen immer bei 0 und nicht bei 1.

_________________
Java, the best argument for Smalltalk since C++. -- Frank Winkler
c++.de :: C (C89, C99 und C11) ::  mehrdimensionales Array ansprechen   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.