Matrix mit pointern, ich steig nicht durch. [Akademisches Problem]

  • HI Leute,
    Ich hab folgende Aufgabe:

    Code
    Aufgabe 1:
    Modizieren Sie das Programm zum Einlesen und wieder Ausgeben einer Matrix  so, dass der Zugriff auf die Feldelemente nicht über den Indizierungsoperator [ ]
    erfolgt sondern über Zeigerarithmetik. Deklarieren Sie dazu eine Matrix wie im ursprünglichen
    Programm und setzen Sie einen Zeiger auf die Anfangsadresse der Matrix. In Ihrem Programm
    sollten daher die folgenden Deklarationen und Initialisierungen auftauchen:
    double a[N][M]; // einzulesende Matrix
    double *ap; // Zeiger
    ap = &a[0][0]; // Zeiger zeigt auf "Anfang" der Matrix


    Der Code als Vorraussetzung ist:


    Irgendwie fehlt mir voll der Sinn und das verständnis für Pointer.
    Wo setzt ich den überhaupt die drei zeilen ein. Unterprogramm oder Hauptprogramm?


    Echt kein Plan ich hoff ihr könnt mir helfen.

    mfg eimer


    VDR1: Debian 2.6.24.2 e-Tobi | AMD Mobile 3000+ (~50W Idle) | K8MM3-V | 256MB | 500GB Samsung | TT2300 DVB-C | KabelBW | lautlos | FUSI Scenic 600

  • So wie ich die Aufgabe verstehe würde ich sagen, die erste Deklaration ist bereits im Typedef enthalten (jede "matrix" ist ein double[ANZ][ANZ]). Du sollst in den jeweiligen Funktionen Zeiger statt Indizes anwenden. Nach der zweiten Deklaration soll die Funktion matrixeinlesen dann wohl so aussehen:



    Ich hoffe das reicht, damit Du weiterkommst (ich mache keine Hausaufgaben). Sinn der Sache ist hier, dass ap anfangs auf das erste Element der Matrix zeigt. Mit ++ap (oder auch ap++ oder ap = ap + 1) schiebst Du den Zeiger auf die nächste Spalte, nach ANZ Spalten wechselt der Zeiger auf das erste Element der folgenden Zeile, da in C mehrdimensionale Arrays hintereinander und lückenlos im Speicher liegen.


    EDIT: Akademische Probleme mit Programmiersprachen (vor allem solche die mit C beginnen) lassen sich gut auf c-plusplus.de/forum diskutieren. Ich denke der Hinweis ist ok, da es sich nicht um ein Konkurrenzforum handelt ;)

  • Hi,
    selber probieren sollte hier angesagt sein :o)


    Lass doch in dem Originalprogramm einfach mal den Pointer bei der Ausgabe der Matrix mitlaufen, also

    Code
    ap = &a[i][j]


    und gib den pointer ap mit Hilfe deines 'printf' statements mit aus (Hinweis: Ausgabe nicht als double sondern als pointer/addresse, also z.B. als LONG).
    Dann wird sich diese Adresse mit jedem 'j' um den Wert sizeof(double) aendern.
    Da deine Matrix aber mit 100x100 definiert ist, gibt es dann beim erhoehen von 'i' einen groesseren Adresssprung.
    Damit solltest du verstehen, wie deine Matrix im Speicher abgelegt ist...


    Gruss,
    - berndl

  • Danke.
    Ich werd beides mal aussprobieren. Es sind keine Hausaufgaben sowas hab ich schon seit ner weile nicht mehr. Ich will nur ein Schein in der FH bekommen und dazu sollte ich das koennen. Das meiste kann ich nur mir Pointer hab ich Probleme, weiss der Geier wo die herkommen.


    mfg eimer



    p.s. ich halt euch über meinen Erfolg am laufen.

    mfg eimer


    VDR1: Debian 2.6.24.2 e-Tobi | AMD Mobile 3000+ (~50W Idle) | K8MM3-V | 256MB | 500GB Samsung | TT2300 DVB-C | KabelBW | lautlos | FUSI Scenic 600

  • Hi,
    bau doch mal einfach die func matrixausgabe folgendermassen um:


    Mit der Groesse 3 und 4 sowie den Werten 1...12 bekommst du dann sowas:


    Du kannst also ganz klar sehen, an welchen (virtuellen) Adressen deine Daten liegen. Umbau auf Pointer-Arithmetik sollte dann nicht mehr schwierig sein. Der Offset von 800 (dez.) ergibt sich aus deiner Matrix-Definition mit 100x100 sowie der Feldlaenge eines double mit 8 Bytes.
    Alles klar?


    Gruss,
    - berndl

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!