Array/ Pointerschreibweise < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Aufgabe | huhu,
ich hab da en problem und zwar folgende Aufgabenstellung :
es soll ein 4x4 Array zuerst mit nullen belegt werden und dann werden an irgendwelchen koordinaten innerhalb dieses feldes einsen eingefügt.
dann soll man 8 mal raten können wo in dem 4x4 array einsen stehen.
am ende wird ausgegeben wieviele einsen man erraten hat.
Alles kein Problem , hab das fix gelöst. Jedoch ist gefordert die pointerschreibweise zu benutzen ( gibt bonuspunkte) . ich habs mittels der array schreibweise realisiert.
als ich dann auf pointerschreibweise gewechselt bin , bekomme ich andauernd ne fehlermeldung vom debugger ,daß das was ich vorhabe nich geht ( invalid indirection)
hier ein ausschnitt des codes mit array schreibweise :
//---------------------------------------------------------------------------
#pragma hdrstop
#include <conio.h>
#include <windows.h>
#include <iostream.h>
#include <math.h>
#include <stdio.h>
#include <iomanip.h>
#include <ctype.h>
#include <time.h>
using namespace std;
void belegung( int zufallsmatrix[][4]);
void zufallseinsen(int zufallsmatrix[][4]);
void raten(int ratematrix[][2]);
int vergleichen(int zufallsmatrix[][4],int ratematrix[][2]);
int main()
{
int zufallsmatrix[4][4],ratematrix[8][2];
belegung(zufallsmatrix);
zufallseinsen(zufallsmatrix);
raten(ratematrix);
if (vergleichen(zufallsmatrix,ratematrix)>=4)
cout<<"Sie haben 4 oder mehr Einsen korrekt erraten! Glückwunsch!";
else cout<<"Sie haben leider nicht mehr als 4 Einsen erraten =(";
getch();
}
void belegung(int zufallsmatrix[][4])
{
int z,s,i,j;
z=4;
s=4;
for(i=0; i<=z; i++)
for(j=0; j<=s; j++)
{
zufallsmatrix[i][j]=0;
}
}
und jetzt in pointerschreibweise:
//---------------------------------------------------------------------------
#pragma hdrstop
#include <conio.h>
#include <windows.h>
#include <iostream.h>
#include <math.h>
#include <stdio.h>
#include <iomanip.h>
#include <ctype.h>
#include <time.h>
using namespace std;
void belegung( int *zufallsmatrix);
void zufallseinsen(int *zufallsmatrix);
void raten(int *ratematrix);
int vergleichen(int *zufallsmatrix,int *ratematrix);
int main()
{
int zufallsmatrix[4][4],ratematrix[8][2];
belegung(zufallsmatrix);
zufallseinsen(zufallsmatrix);
raten(ratematrix);
if (vergleichen(zufallsmatrix,ratematrix)>=4)
cout<<"Sie haben 4 oder mehr Einsen korrekt erraten! Glückwunsch!";
else cout<<"Sie haben leider nicht mehr als 4 Einsen erraten =(";
getch();
}
void belegung(int *zufallsmatrix)
{
int z,s,i,j;
z=4;
s=4;
for(i=0; i<=z; i++)
for(j=0; j<=s; j++)
{
*(*(zufallsmatrix+i)+j)=0;
}
}
|
wie ist in diesem fall die korrekte pointerschreibweise für 2 dimensionale felder ?
er meckert immer an der stelle *(*(zufallsmatrix+i)+j)=0;
und ich versteh nich warum =(
laut meinem schlauen buch ist alles korrekt (Informatik für Ingenieure)
ich raste noch aus
|
|
|
|
Hallo,
dann versuch es doch mal im Funktionsheader mit:
void belegung(int **zufallsmatrix)
Es müssen schon zwei Dimensionen sein.
Du kannst ja mal schauen, ob sich danach noch weitere Schwierigkeiten ergeben...
Gruß
Martin
|
|
|
|
|
Dies müßte ich dann auch auf die Prototypen der Functions anwenden oder ?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:19 Do 15.11.2007 | Autor: | NetCowboy |
ok ich hab die funktions-header umgeschrieben
void belegung( int *zufallsmatrix); //function prototyp
belegung(*zufallsmatrix); // function Aufruf
void belegung(int **zufallsmatrix) // die function selber
{
int z,s,i,j;
z=4;
s=4;
for(i=0; i<=z; i++)
for(j=0; j<=s; j++)
{
*(*(zufallsmatrix+i)+j)=0;
}
}
so bekomme keine fehlermeldungen mehr, aber dafür krepiert der linker =)
[Linker Error] Unresolved external 'belegung(int *)' referenced from [mm] C:\PROGRAMME\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ
[/mm]
[Quelltext Ansicht aktivieren!!!]
|
|
|
|
|
Ja, genau!
Deswegen krepiert der Linker ja auch. Denn die von dir deklarierte Funktion (mit dem einfachen Pointer) existiert ja nicht. Es gibt nur die mit dem Doppelpointer.
Gruß
Martin
|
|
|
|
|
ok ich habe das soweit korrigiert.
jetzt glaube ich aber das es bei mir eher an der deklaration des arrays liegt
ich habe nämlich wie folgt deklariert
int** zufallsmatrix[4][4];
int** ratematrix[8][2];
----------------------------------------------------------
ich glaube ich muß es eher so machen (?)
int zufallsmatrix[4][4],ratematrix[8][2];
int **zmatrix,**rmatrix;
zmatrix=zufallsmatrix; //zmatrix zeigt auf zufallsmatrix
rmatrix=ratematrix; //rmatrix zeigt auf ratematrix
---------------------------------------------------------
denn wenn ich die funktionen in der art funktion(**variable)
aufrufe und der funktionsheader die form
void belegung(int **zufall)
hat, dann übergebe ich der funktion ja nur einen wert. ich will jedoch der funktion den zeiger auf das zeigerarray übermitteln. oder?
|
|
|
|
|
> jetzt glaube ich aber das es bei mir eher an der deklaration des arrays liegt
Ja.
> ich glaube ich muß es eher so machen (?)
> int zufallsmatrix[4][4],ratematrix[8][2];
> int **zmatrix,**rmatrix;
> zmatrix=zufallsmatrix; //zmatrix zeigt auf zufallsmatrix
> rmatrix=ratematrix; //rmatrix zeigt auf ratematrix
Ja, aber warum nicht gleich:
int **zufallsmatrix = new int[4][4];
int **ratematrix = new int[8][2]
?
Dann erzeugst du einen Pointer mit deinem Wunschnamen und weist ihm die Adresse des "anonym" erzeugten Arrays zu. Außerdem ist es kürzer...
> denn wenn ich die funktionen in der art funktion(**variable)
> aufrufe und der funktionsheader die form
> void belegung(int **zufall)
> hat, dann übergebe ich der funktion ja nur einen wert. ich will jedoch der > funktion den zeiger auf das zeigerarray übermitteln. oder?
Wenn im Header (int **zufall) steht, dann heißt es nicht, dass du die Funktion per funk(**zeigervariable) aufrufst, sondern, dass die Funktion einen Zeiger erwartet und du sie mit funk(zeigervariable) aufrufst.
Eine andere Möglichkeit in C++ ist die Parameterübergabe per Referenz, aber ich glaube, das könnte zu weit führen.
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 13:19 Fr 16.11.2007 | Autor: | NetCowboy |
jo ich habs heut in der vorlesung gesehen
oh man in pascal war des früher einfacher =)
trotzdem danke
|
|
|
|