C Array übergeben

Hallo Habo!
Ich habe folgende kleine Funktion geschrieben, mit der es möglich ist aus einem Array das arithmetische Mittel zu berechnen.
Irgendwie meckert GCC allerdings bei der Übergabe eines Arrays an die arith-Funktion.

arith.c: In Funktion ?arith?:
arith.c:10: Fehler: indizierter Wert ist weder ein Feld noch ein Zeiger
arith.c: In Funktion ?main?:
arith.c:23: Warnung: Übergabe des Arguments 1 von ?arith? erzeugt Ganzzahl von Zeiger ohne Typkonvertierung

Code:
#include <stdio.h>

void arith (int menge)
{
int i; //Zähler für Schleife
int ergebnis; //Ergebnis des arithmetischen Mittel

	for(i=0;i<=6;i++)
	{
	 ergebnis += menge[i] ; 
	}

ergebnis = ergebnis / 6;

printf("Das arithmetische Mittel lautet : \n %i", menge);
} 

int main (void)
{
//Array für Zahlenwerte
int menge[]={5,6,7,8,9,10};

arith(menge);

return 0;
}

Habe mich nie wirklich mit der Zeiger Programmierung beschäftig. Kann ich so mein Problem lösen bzw ist es in C nicht erlaubt direkt ein Array zu übergeben?

LG, weau
 
Du übergibst auch kein Array, sondern einfach nur einen Integer. Das das so nicht geht, sollte dir auch klar sein, selbst ohne irgendwelche Pointer-Geschichten.
 
Hi weau, ich habs dir mal schnell zusammengeschustert.

Code:
#include <stdio.h>

void arith (int *);

int main (void) {
  int menge[] = {5,6,7,8,9,10}; //Array für Zahlenwerte
  arith(&menge);
  return 0;
}

void arith (int *menge) {
  int i; //Zähler für Schleife
  int ergebnis; //Ergebnis des arithmetischen Mittel

  for(i=0;i<6;i++) {
    ergebnis += *(menge+i) ;
  }

  ergebnis /= 6;
  printf("Das arithmetische Mittel lautet: %i", menge);
}

Ich hoffe, es arbeitet wie es soll <:

EDIT: Schleife nochmal geändert, deine zählte sieben mal, sechs mal reicht aus, denke ich.

mfg
 
zaibl zu deiner Lösung :

int menge[] = {5,6,7,8,9,10}; //Array für Zahlenwerte
ist ja noch kein Zeiger

Für mich zum Verständnis

int *menge[]={5,6,7,8,9,10};
arith(&menge);


GCC sagt dazu folgendes :
arith.c:35: Warnung: Initialisierung erzeugt Zeiger von Ganzzahl ohne Typkonvertierung
arith.c:35: Warnung: Initialisierung erzeugt Zeiger von Ganzzahl ohne Typkonvertierung
arith.c:35: Warnung: Initialisierung erzeugt Zeiger von Ganzzahl ohne Typkonvertierung
arith.c:35: Warnung: Initialisierung erzeugt Zeiger von Ganzzahl ohne Typkonvertierung
arith.c:35: Warnung: Initialisierung erzeugt Zeiger von Ganzzahl ohne Typkonvertierung
arith.c:35: Warnung: Initialisierung erzeugt Zeiger von Ganzzahl ohne Typkonvertierung
arith.c:36: Warnung: Übergabe des Arguments 1 von ?arith? von inkompatiblem Zeigertyp

@lookshe

void arith (int menge[]) hat geholfen.
Allerdings bekomme ich für das Ergebnis einen negativen Wert raus.
Die Berechnung müsste aber soweit richtig sein oder?

Als nächstes werde ich mich wohl mit dem Zeiger Kapitel beschäftigen.


LG
 
int menge[] = {5,6,7,8,9,10}; //Array für Zahlenwerte < das ist ja ein array, wie es da steht <:

und mit &menge übergibts du die anfangsadresse des arrays (nur menge drüfte auch reichen)

void arith (int *menge) < da is der pointer

da du nur eine adresse an die funktion übergeben hast (int 4 byte lang) hast du jetzt in der variable "menge" der funktion arith nur die adresse, damit du auf die werte zugreifen kannst, muss man sie dereferenzieren: *(menge+i)

hoffe das ist verständlich.

vllt nimmst du mal zahlen wo du das ergebnis kennst und guckst welche lösung nun das korrekte ergibnis liefert.

mfg
 
Indem du Menge so deklarierst: int menge[]; Bekommst du automatisch einen Pointer auf das Array im Speicher.

Probier mal folgendes:
Code:
void foo(int *bar, int len)
{
   int i;

   for(i=0;i<len;i++)
      printf("%d\n", bar[i]);
}

int main(void)
{
   int menge[]={1,2,3,4,5,6,7};

   printf("%#x\n", menge);
   foo(menge, sizeof(menge)/sizeof(int));
   return 0;
}

ok, wurde schon geklaert, dass passiert, wenn man auf antworten klickt und erstmal Emails liest :)
 
Original von xrayn
Indem du Menge so deklarierst: int menge[]; Bekommst du automatisch einen Pointer auf das Array im Speicher.

Dito, sagte ich ja bereist, ein "menge" als parameter dürfte reichen, übergibt direkt die Anfangsadresse des arrays.
 
Code:
sizeof(menge)/sizeof(int)

hierbei ist zu beachten das sizeof(menge)/sizeof(int) bei arrays zur größenbestimmung nur funktioniert wenn sie im selben bereich deklariert wurden, sonst geht das ganze nach hinten los.( meistens :D )
 
Zurück
Oben