| Autor |
Nachricht |
RajHid
Unregistrierter
|
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
|
Unregistrierter
17:45:21 28.05.2012 Titel: |
|
Zitieren |
|
 |
icarus2
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.09.2009
Beiträge: 1359
|
icarus2 Mitglied
17:48:32 28.05.2012 Titel: |
Re: mehrdimensionales Array ansprechen |
Zitieren |
Das muesste dann aber doch
sein, nicht? |
|
|
|
 |
DirkB
Unregistrierter
|
DirkB Unregistrierter
17:53:05 28.05.2012 Titel: |
|
Zitieren |
|
 |
icarus2
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.09.2009
Beiträge: 1359
|
icarus2 Mitglied
17:58:19 28.05.2012 Titel: |
|
Zitieren |
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
|
SeppJ Moderator
18:02:36 28.05.2012 Titel: |
|
Zitieren |
|
 |
Unregistrierter
|
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
|
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
|
Unregistrierter
20:38:35 28.05.2012 Titel: |
|
Zitieren |
Hm, ok. |
|
|
|
 |
Wutz
Mitglied
Benutzerprofil
Anmeldungsdatum: 15.04.2010
Beiträge: 2689
|
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
|
|
 |
|
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.
|
|
|
|
|