In einer Funktion auf ein Array aus einer anderen Funktion zugreifen!?
-
Hallo,
ich möchte in meiner Funktion max den größten Wert aus meinem Array bestimmen. Das Array wird in meiner Funktion read_values vorher initialisiert. Wie kann ich jetzt in max auf das Array in read_values zugreifen ?
Danke für eure Hilfe.
#define CRT_SECURE_NO_WARNINGS
#define MAX_VALUES 100
#include<stdio.h>
#include<stdlib.h>int read_values(void) {
int anzahl;
double value;
double measurement[MAX_VALUES];
int i;
scanf_s("%d", &anzahl);
if (anzahl > MAX_VALUES) {
printf("Zu viele Messwerte!");
}
else {
for (i = 0; i < MAX_VALUES; i++) {
scanf_s("%e", &value);
}
}
return anzahl;}
#define CRT_SECURE_NO_WARNINGS
#define MAX_VALUES 100
#include<stdlib.h>
#include<stdio.h>
#include"Header.h"double max(double measurement[], int anzahl) {
double max;
int i = 0;
int x = 1;
while (i < 100){
x++;
}
i++;
}
max = measurement[i];
return max;}
-
@furk in C übergibst du das (leere) Array an die Funktionen
Somit auch an read_values.
Nachdem eine Funktion beendet wird, existieren die funktions-lokalen Variablen schlicht nicht mehr.
Du liest nur in die Variable value ein.
Du benutzt dabei den falschen Formatspecifier. (Da warnt auch der Compiler - darum Compilerwarnungen aktivieren und beachten)
Zudem liest du alle Felder ein, nicht nur anzahl
-
@furk Indem du in main() das Array definierst und an beide Funktionen als Parameter inkl. der Länge übergibst.
-
@furk Schreibe bitte in eine Zeile vor deinem Code
```
und in eine Zeile nach deinem Code```
damit er ordentlich dargestellt wird. Du kannst Deinen Beitrag auch nachträglich bearbeiten. Den Menüpunkt "Bearbeiten" findest Du hinter dem Drei-Punkte-Menü rechts unter Deinem Beitrag.
-
@furk sagte in In einer Funktion auf ein Array aus einer anderen Funktion zugreifen!?:
Wie kann ich jetzt in max auf das Array in read_values zugreifen ?
du kannst auch das array außerhalb der funktion anlegen. dann kannst von überall (aus deiner .c -datei) darauf zugreifen.
-
@DirkB super danke schön ich probiere es mal so
-
Aber warum wird mir bei der Funktion read_value die Fehlermeldung "Hat bereits einen Funktionsrumpf" angezeigt?
-
@Bushmaster sagte in In einer Funktion auf ein Array aus einer anderen Funktion zugreifen!?:
du kannst auch das array außerhalb der funktion anlegen. dann kannst von überall (aus deiner .c -datei) darauf zugreifen.
Hör nicht auf diesen sinnfreien Kommentar, der Autor redet wirr.
-
@Wutz sagte in In einer Funktion auf ein Array aus einer anderen Funktion zugreifen!?:
Hör nicht auf diesen sinnfreien Kommentar, der Autor redet wirr.
probier es doch aus. wetten dass es kappt?
-
@furk sagte in In einer Funktion auf ein Array aus einer anderen Funktion zugreifen!?:
Aber warum wird mir bei der Funktion read_value die Fehlermeldung "Hat bereits einen Funktionsrumpf" angezeigt?
Ich kenne den aktuellen Code nicht.
Hast du die Funktion evtl. zweimal definiert?Wie sieht deine main aus?
Wie heißen deine Dateien?
-
@Bushmaster sagte in In einer Funktion auf ein Array aus einer anderen Funktion zugreifen!?:
@Wutz sagte in In einer Funktion auf ein Array aus einer anderen Funktion zugreifen!?:
Hör nicht auf diesen sinnfreien Kommentar, der Autor redet wirr.
probier es doch aus. wetten dass es kappt?
wetten, dass es auch ohne globale daten klappt?
-
@Bushmaster
Du hast keine Ahnung.
Du hast keine Ahnung wovon du redest.
-
@Wade1234 sagte in In einer Funktion auf ein Array aus einer anderen Funktion zugreifen!?:
wetten, dass es auch ohne globale daten klappt?
selbstverständlich, aber in so einem kleinen programm ist das völlig unproblematisch.
-
@Bushmaster sagte in In einer Funktion auf ein Array aus einer anderen Funktion zugreifen!?:
@Wade1234 sagte in In einer Funktion auf ein Array aus einer anderen Funktion zugreifen!?:
wetten, dass es auch ohne globale daten klappt?
selbstverständlich, aber in so einem kleinen programm ist das völlig unproblematisch.
Naja es ist insofern problematisch, als dass man Anfängern nicht solche Flöhe in den Kopf setzen sollte. Außerdem machst du dich damit unbeliebt und riskierst auf lange Sicht einen Forenbann.
-
@Wade1234 sagte in In einer Funktion auf ein Array aus einer anderen Funktion zugreifen!?:
Naja es ist insofern problematisch, als dass man Anfängern nicht solche Flöhe in den Kopf setzen sollte.
da kommen die doch irgendwann von selber drauf.
@Wade1234 sagte in In einer Funktion auf ein Array aus einer anderen Funktion zugreifen!?:
und riskierst auf lange Sicht einen Forenbann.
ernsthaft? ich will den fragesteller ja nicht trollen. ich meinte das aus voller überzeugung. ich selber mache sowas auch mal.
-
@Bushmaster Wenn Du weißt was Du tust kannst Du auch mit einer Bazooka Mäuse jagen gehen. Aber jemandem der gerade den Jagdschein macht drückt man keine Bazooka in die Hand. Klar soweit?
-
@Swordfish sagte in In einer Funktion auf ein Array aus einer anderen Funktion zugreifen!?:
@Bushmaster Wenn Du weißt was Du tust kannst Du auch mit einer Bazooka Mäuse jagen gehen. Aber jemandem der gerade den Jagdschein macht drückt man keine Bazooka in die Hand. Klar soweit?
okay, aber davon abgesehen sind sogar im windows kernel globale variablen.
https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/mm64bitphysicaladdressdas kann man natürlich zum anlass nehmen windows doof zu finden.
-
@Bushmaster Ommmm. Hör bitte auf mit deinem OT. In diesem Thread geht es um etwas anderes. Danke.
@furk Was Wutz da oben schon gesagt hat:
Indem du in
main()
das Array definierst und an beide Funktionen als Parameter inkl. der Länge übergibst.#define CRT_SECURE_NO_WARNINGS #include <assert.h> // assert() #include <stddef.h> // size_t #include <stdio.h> #include <stdlib.h> // max ist ein unguenstiger name fuer symbole beim microsoft-compiler weil die windows-header // die offenbar auch ab und an von den c standard library headern eingebunden werden ein makro // namens max definieren das mit deiner Funktion max() kollidiert. Darum: #undef max typedef enum { ERR_NONE, ERR_INPUT, ERR_AMOUNT, } error_t; size_t read_values(double *destination, size_t max_values, error_t *error) { assert(destination && max_values && error); *error = ERR_NONE; size_t num_values_requested; if (scanf_s("%zu", &num_values_requested) != 1) { // immer die rueckgabewerte pruefen! *error = ERR_INPUT; return 0; } if (num_values_requested > max_values) { *error = ERR_AMOUNT; return 0; } for (size_t num_values_read = 0; num_values_read < num_values_requested; ++num_values_read) { if (scanf_s("%le", &destination[num_values_read]) != 1) { *error = ERR_INPUT; return num_values_read; } } return num_values_requested; } double max(double const *source, size_t num_values) { assert(source && num_values); size_t max = 0; // erstes element als maximum annehmen for (size_t i = 1; i < num_values; ++i) // alle weiteren elemente durchgehen if (source[i] > source[max]) // und das alte (zuerst angenommene) maximum max = i; // mit dem aktuellen element vergleichen und ggf. // max neu aktualisieren. return source[max]; } int main(void) { enum { max_values = 100 }; double values[max_values]; error_t error; size_t values_read = read_values(values, max_values, &error); if (error != ERR_NONE) { switch (error) { case ERR_INPUT: fputs("Input Error :(\n\n", stderr); return EXIT_FAILURE; case ERR_AMOUNT: fputs("Too many values requested :(\n\n", stderr); return EXIT_FAILURE; default: fputs("An unknown error occured (shouldn't happen!?) :(\n\n", stderr); return EXIT_FAILURE; } } if (!values_read) puts("There is no maximum in a set of zero values.\n"); else printf("The maximum is %f.\n\n", max(values, values_read)); }