Pointer/Pointeraritmethik - wo ist hier der fehler?
-
Hallo Zusammen:
Ich belege grade einen C Kurs an einer VHS und soll ein ent. Programmm anfertigen.
Ich paste es erstmal hier und sage dann nach dem Code was dazu:#include "stdio.h" //---// int max(int array[], int zaehler1,int *zeiger) { int max = --zeiger; while (--zeiger>= 0) if ((zeiger) > max) max = zeiger; return max; } //---// int min(int array[], int zaehler1,int *zeiger) { int min = --zeiger; while (--zeiger>= 0) if ((zeiger) < min) min = zeiger; return min; } //---// void ausgabe (int max,int min) { printf("Maximum:\n%d\n",max); printf("Minumum:\n%d\n",min); } void main() { int array[3]; int *zeiger =&(array[0]); puts("Programm 3 \n\n"); puts("Bitte 3 int Werte eingeben\n\n"); for (int zaehler1=0;zaehler1<3;zaehler1++) { printf("Bitte Wert %d eingeben \n",zaehler1); scanf("%d",zeiger); zeiger++; } max(array,zaehler1,zeiger); min(array,zaehler1,zeiger); ausgabe(min(array,zaehler1,zeiger), max(array,zaehler1,zeiger)); getchar(); }
Also wir sollen ein Programm erstellen welches Maximum und Minimum eines int. Arrays ausgibt. Der Haken ist, der Zugriff auf das Array soll ausschlieslich durch Pointer erfolgen. Und hier liegt mein Problem, als ich in den Funktionen Min und Max direkt das array ansprach funktionierte alles einwandfrei doch bei den Pointern komme ich auch trotz Literatur und Recherche nicht weiter, vielleicht hab ich auch einfach nur Tomaten auf den Augen.
Das Konkrete Problem. Wie bringe ich die Funktionen Min und Max dazu mit den Pointern korrekt zu arbeiten bzw was hab ich der Anwendung und Uebergabe der Pointern falsch gemacht. Ich weis das der jetztige Code unter garantie nicht funktioniert aber ich hab bestimmt schon 20 Versionen des Programmes gemacht und jede schlug fehl (meistens bekomme ich einfach einen StackOverflow oder etwas aehnliches als Fehler zurueck)...
Wenn jemand mir behilflich sein könnte wäre ich ihm zutiefst verbunden irgendwie bin ich bei Pointern auf einem Auge Blöd
yours
gerald
-
hi!
while (--zeiger>= 0) if ((zeiger) > max) max = zeiger;
Du arbeitest permanent mit der Adresse die der Pointer gespeichert hat!! Dich interessiert aber wohl eher der wert, auf den dieser zeigt
=>while (*(--zeiger)>= 0) if ((*zeiger) > max) max = *zeiger;
Das hast du übrigends alle nase lang vergessen
-
@THE_FreaK :
Wenn ich mich nicht irre können die Klammern weg bleiben,
* "bindet" schwächer als die Dekrementierung.while (*--zeiger>= 0)
-
Ich versteh überhaupt nicht, wieso du zaehler und zeiger an die Funktion übergibst ... zaehler benutzt du nicht, und zeiger scheint eher ein Ersatz für eine lokale Variable zu sein. Versuchs doch mal so:
int max(int array[], int anzahl) { int *zeiger; int i; int temp_max = 0; for (zeiger = &array[0], i = 0; i < anzahl; ++zeiger, ++i) if (*zeiger > temp_max) temp_max = *zeiger; return temp_max; } int main() { int my_array[] = { 2, 5, 1, 7, 10, 1, 14, 5 } printf("Maximum: %d\n", max(my_array, 8)); return 0; }
temp_max mit 0 zu initialisieren ist nicht wirklich schlau, weil es das falsche Ergebnis liefert, wenn nur negative Zahlen im Array stehen. Ich würde stattdessen INT_MIN (aus <limits.h>) nehmen, aber dich auch nicht unnötig damit verwirren.
@dy: Die beiden Operatoren binden gleich stark, aber die Klammern können trotzdem weggelassen werden. Es gibt dort keinen Konflikt.
-
Ich hoffe das hilft, auch wenn es nicht sehr ellegant ist; hier ist dein leicht veränderter Quellcode:
#include <stdio.h> //---// int max(int anzahl ,int *zeiger) { int max = *zeiger; while (anzahl > 0) { if (*zeiger > max) { max = *zeiger; } ++zeiger; --anzahl; } return max; } //---// int min(int anzahl, int *zeiger) { int min = *zeiger; while (anzahl > 0) { if (*zeiger < min) { min = *zeiger; } ++zeiger; --anzahl; } return min; } //---// int main(void) /*main muss int sein(!) auch wenn's dein compiler mit void akzeptiert*/ { int array[3]; int *zeiger = array; /*das & ist unnötig, der Arrayname ist sowieso ein Zeiger auf das erste Element ist!*/ /* array == array[0] */ int anzahl = 0; puts("Programm 3 \n\n"); puts("Bitte 3 int Werte eingeben\n\n"); for (int i = 0; i < 3 ; i++) { printf("Bitte Wert %d eingeben \n",i); scanf("%d", zeiger); ++zeiger; ++anzahl; } zeiger = zeiger-anzahl; printf("Erstes Element: %d \n", *zeiger); printf("Zweites Element: %d \n", *(zeiger+1)); printf("Drittes Element: %d \n", *(zeiger+2)); printf("max: %d ,min: %d\n", max(anzahl, zeiger), min(anzahl, zeiger)); return 0; /*nicht vergessen !*/ }
bei Bashar fehlt bei int "my_array[] = { 2, 5, 1, 7, 10, 1, 14, 5 }" das
; und die Inkludierung der "stdio" bzw. <stdio>!
(das soll kein Vorwurf sein, aber vielleicht verwirrt es ja gerald_28)Ich hoffe das hilft dir.
Gruß ace
-
EDIT:
Es muss array == &array[0] heißen.