Pointer aka Zeiger - kleines Verständnisproblem bei Arrays

Tackleberry

Mitglied
Hi,
folgendes Problem bei Pointern:
Mein Programm funktioniert mit
Code:
float f[10];
float *zf;
zf=f;

wunderbar...

Kann ich aber auch irgendwie mit
Code:
float f[10];
float *zf[10];

arbeiten oder ist das Blödsinn (besonders das *zf[10])?
Code:
*zf[10] = f[10] wäre ja eher eine Wertzuweisung oder?

Es geht darum das wir "call by reference" anwenden sollen, was dann so ausschaut:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

float summe(int anzahl, float feld[])// feld[]:Uebergabe des Feldes
{ float s=0;
int i;
for (i=0; i<anzahl; i++)
s+=feld[i];
return s;
}

int main()
{
float f[10];
float *zf;
zf = f;
int i;
float ergebnis;

srand(time(0));

for (i = 0; i < 10; i++) {
f[i]=rand()%100;
printf("i: %i - f = %f\n", i, f[i]);
}
ergebnis = summe(i, zf);
printf("Summe: %f\n", ergebnis);

// Zusaetzlich: Funktion summe erweitern:
// groesste Zahl bestimmen
system("Pause");
return 0;
}

Meine Komilitonen basteln nämlich die ganze Zeit irgendwas mit float *zf[10]; nerven mich aber damit das ihr Programm nicht funktioniert. Ich war während der Übung irgendwie auch mit anderem beschäftigt, während der nette Herr Pointer erklärt hatte... ;)
 
float *zf[10];
Bedeutet du hast ein Array an 10 (float*) == float pointern und keine Floats;


*zf[10] ist der 11te Float poiinter , da du jedoch nur 10 reserviert hast ist es schon ausserhalb des Bereichs.
 
basd hat gesagt.:
float *zf[10];
Bedeutet du hast ein Array an 10 (float*) == float pointern und keine Floats;


*zf[10] ist der 11te Float poiinter , da du jedoch nur 10 reserviert hast ist es schon ausserhalb des Bereichs.

Ah ok.
Also ist mein
Code:
float f[10];
float *zf;
zf=f;
korrekt, nicht?
Mit Arrays (Indizes) komme ich dank Delphi und PHP klar nur Pointer sind halt neu.


Das nächste Problem ist das wir die Funktion Summe so erweitern sollen, das die größte Zahl ermittelt wird.
Aber wie bekomme ich die größte Zahl aus der Funktion Summe ins Hauptprogramm wenn ich mit return schon etwas anderes zurückgebe?

Mein Algorithmus zum Ermitteln der größten Zahl, lässt das Programm beim Aufruf abstürzen. Ich denke mal es liegt u.a. an den falschen Vorzeichen der Pointer:
Code:
float summe(int anzahl, float feld[])//  feld[]:Uebergabe des Feldes
{ float s=0;
  float *zahl = 0;
  int i;
  for (i=0; i<anzahl; i++) {
    s+=feld[i];

// start
    if (feld[i] > *zahl) {*zahl = feld[i];}
    printf("Groesste Zahl: %f\n", *zahl); //Test um festzustellen das Werte reingeschrieben werden
    }
// ende

  return s;
}

*edit*
Scheinbar liegt es an der Initialisierung von *zahl.
Mit
Code:
  float *zahl;
  zahl = &feld[0];
Geht es. Wie kann ich zahl ohne feld[] intialisieren oder geht das nicht?
 
Zuletzt bearbeitet:
Du must in jedem Fall Speicher für dein *zahl anlegen.

Code:
float *zahl;
zahl = new float;

..

// Speicher freigeben
delete zahl;

Pointer zeigen auf einen Adressbereich. also kannst du einen
Pointer auf einen anderen Pointer zeigen lassen, der schon initialiesiert
ist, oder du mußt ihn selber initialisieren (sprich: Speicher anlegen).

Hinweis: zf[10] ist auch nur ein Pointer, aber mit einer festdefinierten Größe
im Speicher.*zf ist dasselbe wie zf[0]. *(zf + 1) ist dasselbe wie zf[1]. Willst
du zf dynamisch anlegen müßtest du schreiben

Code:
float *zf;
zf = new float[10];

..
und den Speicher natürlich wieder freigeben:
delete []zf;

Ich hoffe, das hilft. In deinem Programm fehlt wohl wirklich nur das
anlegen von Speicher für *zahl. Wenn du das nicht tust, dann zeigt dein
Zeiger ins Nirvana.

BadMourning
 
Ich dachte, es geht um Parameterübergabe 'by reference'? Sollte das Prog dann nicht so aussehen:
Code:
float summe(int anzahl, float feld[], float &max)
        {
         float s=0.0;
         int i;
         max = 0.0;
         for (i=0; i<anzahl; i++) {
       	s+=feld[i];
       	if (feld[i] > max) {max = feld[i];}
     }
       return s;
 }
Das Dumme ist nur, ich weiß nicht mehr, ob es den &-Operator (Referenz-Operator) schon in C gegeben hat oder ober von C++ ist. Sollte es mit Pointern gemacht werden, dann sollte es so aussehen:
Code:
float summe(int anzahl, float feld[], float *max)
         {
          float s=0.0;
          int i;
      *max = 0.0;
          for (i=0; i<anzahl; i++) {
        	s+=feld[i];
        	if (feld[i] > *max) {*max = feld[i];}
      }
        return s;
 }
Bitte beachten: Durch das Initialisieren des max-Wertes mit 0 funktioniert die Maximumberechnung natürlich nur mit positiven Zahlen. Um auch negative Zahlen mit einzubeziehen, sollte max mit dem kleinstmöglichen (negativen) Wert initialisiert werden. Welche Zahl das ist, überlasse ich Dir herauszufinden :-) (Ich weiß es nämlich icht aus dem Kopf)

EDIT: Ich hab nen Kollegen gefragt, den Referenzoperator gab es auch schon in C. Also, wenn's um Parameterübergabe 'by reference' geht, dann das erste Beispiel.
 
Zuletzt bearbeitet:
Also nach den Libaries, die er einbindet programmiert er in c und nicht in c++. Demnach kein new und delete sondern zB:

Code:
   char *p;
   p = (char *) malloc(10);

   /* blabla */

   free(p)

Call by Reference ist dann auch nicht SO moeglich, wie oben geschrieben ....
 
Also ich hab's raus

Funktioniert so

main...
float i;
rechnen(para1, para2, &i);

float rechnen(float a, float b, float *zeiger)
{
*zeiger = 1;
}

Dann nimmt i im Hauptprogramm (main) den Wert Eins an. Hab's wohl ein wenig doof erklärt.
Dadurch sind nun all meine Probleme gelöst. ;)
 
Ist allerdings Parameterübergabe als Zeiger und nicht als Referenz. Die Wirkung ist allerdings die gleiche.
 
Zurück