pointer in anderen Funktionen aufrufen

ElMadridano

Mitglied
An der Uni hatten wir eine Aufgabe, die ich nicht ganz lösen konnte. Ich war schon denke ich weit gekommen, aber ich konnte es nicht zu ende bringen.

Folgende Gleichung war gegeben: y= Wurzel(5*x^3 +128)+x^8 -e^x
Es sollen für ganzzahlige x werte alle Ergebnisse für einen variablen Wertebereich bestimmt werden, in diesem fall von -17 bis +7. Alle Ergebnisse für y sollen in einem Array abgespeichert werden. Erstmal sollte ich eine Funktion schreiben die die Grenzen für den Wertebereich einliest und abspeichert. In der nächsten Funktion sollen alle x werte bestimmt und in einem Array abgespeichert werden.
Bis hierhin hab ich es glaub ich richtig gemacht, aber ich bin mir nicht sicher. Jetzt aber war mein Problem, das ich die Funktionen in meinem main Programm nicht aufrufen konnte. Außerdem sollte ich noch die Werte des Arrays ausgeben lassen.

Also das ist mein 1.Semester in C und deshalb bin ich noch ein Anfänger. Aber wie kann ich die Funktionen in meinem Main Programm aufrufen? Ich hab auch kein Rückgabewert, weil mir gesagt wurde, das es mit Pointern einfacher ist.

Könnt ihr das Programm zu ende führen oder mir erklären wie es weiter geht?
Danke sehr

Hier mein bisheriges Programm:

int function1(int *x_1, int *x_2)
{
scanf("%i\n", x_1);
scanf("%i\n", x_2);
}
int function2(int *x_1, int *x_2)
{
int y;
int x;
int Array[25];
int n=0;
for(x = *x_1; x < *x_2 ; x++ )
{
y = sqrt(5*pow(x, 3)+128)+pow(x, 8)-exp(x);
Array[n]=y;
n=n+1;
printf("Wert%i:%i\n", n,y);
}
return 0;
}
int main()
{
int *x_1;
int *x_2;
function1(x_1, x_2);
function2(x_1, x_2);
}
 

Robat

Top Contributor
Hier mal ein paar Anreize:
- das Daten-Array in der main erstellen und als Zeiger an function2(int* data, int lower, int upper) übergeben (malloc)
- x_1 und x_2 in der main nicht als Pointer erstellen
- x_1 und x_2 an function1(int* lower, int* upper) übergeben (mittels &-Operator)
- x_1 und x_2 an function2(int* data, int lower, int upper) übergeben, hier brauchst du keine Zeiger auf die beiden Variablen sondern nur dessen Werte
- function2(int* data, int lower, int upper) und function1(int* lower, int* upper) brauchen beide keinen Rückgabewert .. also void statt int
- die for-Schleife in function2(int* data, int lower, int upper) lässt sich vereinfachen:
C:
int count = 0;
for(; lower <= upper; lower++) {
    data[count++] = sqrt( 5 * pow(lower, 3) + 128) + pow(lower, 8) - exp(lower);
    printf("Wert[%i] = %i\n", count, data[count-1]);
}
 

ElMadridano

Mitglied
Hallo,
Vielen Dank für deinen Beitrag, aber ich bin noch ein Blutiger Anfänger und ich komme ehrlich gesagt mit deinem Programmier Stil nicht mit. wahrscheinlich ist viel zu hoch für mich.
Ich hab was versucht, aber ich geh mal davon aus, das es komplett daneben ist, diese upper und lower bringen mich irgendwie durcheinander.

C:
void function1(int* lower, int* upper)
{
    scanf("%i\n", lower);
    scanf("%i\n", upper);
}
void function2(int* data, int lower, int upper)
{
    int Array[25];
    int n=0;
    int count = 0;
    for(; lower <= upper; lower++)
    {
    data[count++] = sqrt( 5 * pow(lower, 3) + 128) + pow(lower, 8) - exp(lower);
    printf("Wert[%i] = %i\n", count, data[count-1]);
    }
    return 0;
}
int main()
{
    int lower, upper;
    function1(&lower, &upper);
    function2(&lower, &upper);
}

Danke
 
Zuletzt bearbeitet von einem Moderator:

Robat

Top Contributor
Vorab: Ich habe einige Stellen versucht nochmal zu vereinfachen. Hatte am Anfang zu viel in die Aufgabe reininterpretiert was scheinbar nicht nötig war. Alles mit malloc kannst du also vergessen :)

Das sieht doch an sich schon mal gar nicht so schlecht aus. Vielleicht mal ein paar Erklärungen.

Der Adressoperator (&) wird dazu benötigt um die Adresse einer Variable zu bekommen.

Die Variablen lower und upper (was vorher bei dir x_1 und x_2 waren) aus der main-Methode sind nichts anderes als die obere und untere Grenze, die der Nutzer eingeben soll.
Es sollen diese Variable in einer anderen Methode geändert werden, daher muss die Adresse der Variablen an die Methode übergeben werden, damit der Inhalt der Adresse verändert wird. Würden wir nur den Wert übergeben, würde eine Kopie erstellt werden und die eigentlichen Variablen in der main-Methode würden von der Änderung nichts mitbekommen.

Ich würde dir einfach mal ein Beispielcode reinstellen. Schau ihn dir mal in Ruhe an und guck was du alles nachvollziehen kannst.
C:
void function1(int* lower, int* upper) {
    scanf("%i", lower);
    scanf("%i", upper);
}
void function2(int lower, int upper) {
    // ist der Abstand zwischen oberer und unterer Grenze, also die Größe des Arrays
    int amount = abs(upper-lower);
    int data[amount];
 
    int count = 0;
    for(; lower <= upper; lower++) {
        data[count++] = sqrt( 5 * pow(lower, 3) + 128) + pow(lower, 8) - exp(lower);
        printf("Wert[%i] = %i\n", count, data[count-1]);
    }
}
int main() {
    int upper, lower;
    function1(&lower, &upper);
    function2(lower, upper);
}
Fragen die du dir stellen solltest:
- Wenn deine Methode function2 zwei int-Werte erwartet, macht es dann Sinn function(&lower, &upper); aufzurufen? Wie oben beschrieben würde der & - Operator hier die Adresse zurückgeben, nicht aber den Wert.
- Macht es Sinn bei einer void-Methode return 0 zu schreiben? Wenn nein, warum nicht?
 

ElMadridano

Mitglied
Also Vielen Dank, das funktioniert einwandfrei. Ist mit Methode eine Funktion gemeint? Tut mir leid für die blöde Frage, aber das Wort Methode konnte ich bis jetzt noch nicht mit C Programmierung verknüpfen. Also in einer Void Funktion, soll man kein Rückgabewert benutzen, weil es eine Void Funktion ist, deshalb verwendet man dort Pointer, weil die Muss man nicht zurückgeben, weil die in einer Adresse gespeichert werden.
Den &-Operator benutzen wir nur wenn wir uns die Adresse der Variable anzeigen lassen wollen, stimmts.

Dein Programm gefällt mir richtig gut, aber ich verstehe nicht, was das bedeutet " int amount = abs(upper-lower);"
Was heißt abs und warum muss man die Grenzen miteinander subtrhieren? Wie sehe eine alternative Schreibweise aus?

Desweiteren verstehe ich die for Schleife nicht, was bedeutet "for(; lower <= upper; lower++)"? Warum ist dort ein semicolon ";" , muss dort für den Lower kein Wert zugewiesen werden? In meinen alten Übungsaufgaben war das meistens 0.

Ich danke dir vielmals
 

Robat

Top Contributor
Naja der Begriff Methode kommt eher aus dem OOP Bereich und ist eine Funktion die über einem Objekt aufgerufen wird. Tut aber an sich nichts zur Sache.

Naja wenn du 2 Zahlen x und y hast dann ergibt sich der Abstand beider Werte aus betrag(x-y). Die Betragsfunktion heißt abs(..) und liefert den Betrag des Wertes zurück. -5 wird also zu 5.
Die Grenzen subtrahieren wir um die Größe des Arrays herauszufinden. Wenn du lower = -17 und upper = 7 hast dann steht da abs(-17 - 7) = abs(-24) = 24. Daher wissen wir, dass unser Array 24 Elemente haben muss.

for(initialisierung;bedingung;anweisung) .. ist die allgemeine Schreibweise für eine for-Schleife. Wenn ich for(;bedingung;anweisung) schreibe, lass ich die Initialisierung einfach weg.
 

Ähnliche Java Themen

Neue Themen


Oben