array über return schicken



  • Hallo Leute,
    Ich habe eine Frage an euch...
    Wie kriege ich mit einem return ein ganzes Array an eine andere Funktion?
    Ich mache hier ein kurzes Beispiel..
    danke schonmal für die Hilfe

    #include<stdio.h>
    
    float rechnung(int,int);
    
    int main(){
    	int a,b,feld[2];
    	printf("Bitte Geben Sie 2 Zahlen ein: ");
    	scanf("%i,%i",&a,&b);
    	feld[]=rechnung(a,b); //an dieser Zeile wird es mangeln...
    	return 0;
    }
    
    float rechnung(int a,int b){
    	float erg_y,erg_z;
    	int feld[2];
    	erg_y=a*b;
    	erg_z=a/b;
    	feld[0]=erg_y;
    	feld[1]=erg_z;
    
    	return*feld;
    }
    


  • In C werden Arrays i.d.R. als Zeiger an Funktionen übergeben, guckst du:

    void rechnung(int a,int b, float* feld){
    	feld[0]=a*b; 
        feld[1]=(float)a/b; // Mindestens eine Variable nach float konvertieren, sonst Integerdivision!
    }
    
    int main(void){
        int a,b;
    	float feld[2]; // Du möchtest das Ergebnis einer Divison speichern, wähle einen passenden Datentyp!
        printf("Bitte Geben Sie 2 Zahlen ein: ");
        if ( 2 == scanf("%i %i",&a,&b)) // Leerzeichen im Formatstring lassen!
    	{
    		rechnung(a,b,feld); // An dieser Zeile mangelt es nun nicht mehr.
    		printf("%f %f\n", feld[0], feld[1]);
    	}
    	else
    	{
    		printf ("%s\n", "Eingabefehler!");
    	}
    	return 0;
    }
    


  • so eingach geht es leider nicht
    du kannst:
    -ein struct zurückgeben
    -eine pointer auf deas ergebnis array beim aufruf mitgeben

    void rechnung(int a, int b, float *ergebnis); //ergebnis array muss min. länge 2 haben
    

    -mit malloc speicher für das ergebnis array reservieren und den zurückgeben (free nicht vergessen)
    -ein statisches array benutzen (besser nicht)

    float *rechnung(int a, int b) {
      static float erg[2];
      ....
      return erg;
    }
    


  • Geht nicht.
    Du musst der Funktion das Array schon mitgeben.

    void rechnung(float *feld, int a, int b);
    

    Du hast auch noch arge Probleme mit den Datentypen.



  • mr. c schrieb:

    In C werden Arrays i.d.R. als Zeiger an Funktionen übergeben, guckst du:

    void rechnung(int a,int b, float* feld){
    	feld[0]=a*b; 
        feld[1]=(float)a/b; // Mindestens eine Variable nach float konvertieren, sonst Integerdivision!
    }
     
    int main(void){
        int a,b;
    	float feld[2]; // Du möchtest das Ergebnis einer Divison speichern, wähle einen passenden Datentyp!
        printf("Bitte Geben Sie 2 Zahlen ein: ");
        if ( 2 == scanf("%i %i",&a,&b)) // Leerzeichen im Formatstring lassen!
    	{
    		rechnung(a,b,feld); // An dieser Zeile mangelt es nun nicht mehr.
    		printf("%f %f\n", feld[0], feld[1]);
    	}
    	else
    	{
    		printf ("%s\n", "Eingabefehler!");
    	}
    	return 0;
    }
    

    woher kriegt denn das printf die informationen über das feld???



  • DirkB schrieb:

    Geht nicht.

    Geht wohl.
    Wenn man das Array in eine Struktur einbettet.
    Macht man aber nicht, erst recht nicht bei großen Arrays, um unnötige Kopiervorgänge zu vermeiden.



  • coon schrieb:

    woher kriegt denn das printf die informationen über das feld???

    Vorher wird doch die Funktion aufgerufen und das Feld wird an die Funktion übergeben.



  • also wird feld[] in der funktion rechnung direkt überschrieben?



  • Bingo!



  • feld[2];



  • VIELEN DANK
    THEMA ABGESCHLOSSEN ❤



  • hier noch was mit struct

    struct rechnung {
    	float div;
    	float mult;
    };
    struct rechnung rechnung(int a,int b) {
    	struct rechnung erg;
    	erg.mult=a*b;
    	erg.div=(float)a/b;   
    	return erg;
    }
    


  • Also ich habe ganz gut verstanden was Ihr versucht hab mir zu vermitteln...
    Habe das jetzt versucht anzuwenden und bin da auf Schwierigkeiten gestoßen... Vielleicht könntet Ihr mir auch hier weiterhelfen...Ich kriege einfach einen komplett falschen wert für das feld und das mit dem typ hatte ich mir auch anders vorgestellt...

    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    
    float rechnung(int,int,int,int);
    
    int main(){
    	int x1,x2,y1,y2,zaehler;
    	float feld[3];
    	char const typ[]={"Euklidische" "Manhattan" "Maximum"};//FUNKTIONIERT AUCH NICHT
    	//typ[0]="Euklidische";
    	//typ[1]="Manhattan";
    	//typ[2]="Maximum";
    	printf("Geben Sie 2 Punkte in Form : x1,y1,x2,y2    ein: ");
    	scanf("%i,%i,%i,%i",&x1,&y1,&x2,&y2);
    	printf("%i-%i-%i-%i",x1,y1,x2,y2);
    
    	rechnung(x1,y1,x2,y2);
    	for(zaehler=0;zaehler<=2;zaehler++){
    		printf("\nDer %c Abstand betraegt %i",typ[zaehler],feld[zaehler]);
    	}
    	return 0;
    }
    
    float rechnung(int x1,int y1,int x2, int y2){
    	float erg_euk,erg_man,erg_max,feld[3];
    	erg_euk=sqrt(float((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));
    	//erg_euk=sqrt(pow((x1-x2),2)/pow((y1-y2),2));
    	//erg_man=max(1,2);
    	if(abs(x1-x2)>abs(y1-y2)){
    		erg_max=abs(x1-x2);
    	}
    	else{
    		erg_max=abs(y1-y2);
    	}
    	erg_man=abs(y1-y2)+abs(x1-x2);
    	feld[0]=erg_euk;
    	feld[1]=erg_man;
    	feld[2]=erg_max;
    	//printf("\n%f,%f",erg_euk,feld[0]);
    }
    


  • coon schrieb:

    Also ich habe ganz gut verstanden was Ihr versucht hab mir zu vermitteln...

    Du wendest aber keinen der Vorschläge an.

    coon schrieb:

    Habe das jetzt versucht anzuwenden und bin da auf Schwierigkeiten gestoßen... Vielleicht könntet Ihr mir auch hier weiterhelfen...Ich kriege einfach einen komplett falschen wert für das feld und das mit dem typ hatte ich mir auch anders vorgestellt...

    Wo übergibst du da feld an rechnung , bzw. wo ist der Rückgabewert?

    Wegen "//FUNKTIONIERT AUCH NICHT" mach mal

    char const *typ[]={"Euklidische" "Manhattan" "Maximum"};// Achte auf den *
    


  • Auf

    coon schrieb:

    also wird feld[] in der funktion rechnung direkt überschrieben?

    wurde mit

    mr. c schrieb:

    Bingo!

    geantwortet.
    Und das wurde hoffnungslos missverstanden.
    Coon, schau dir noch mal Gültigkeitsbereiche von Variablennamen an!



  • erstmal sorry für die später antwort....
    ich habe jetzt versuch´t das feld an die rechnung zu geben und auch den typ als array anzugeben....ich bekomme vom compiler jedoch bei dem typ wieder nichts und des feld scheint auch noch nicht übergeben worden zu sein:

    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    
    float rechnung(int,int,int,int,float*);
    
    int main(){
    	int x1,x2,y1,y2,zaehler;
    	float feld[3];
    	char const *typ[]={"Euklidische" "Manhattan" "Maximum"};//FUNKTIONIERT AUCH NICHT
    	//typ[0]="Euklidische";
    	//typ[1]="Manhattan";
    	//typ[2]="Maximum";
    	printf("Geben Sie 2 Punkte in Form : x1,y1,x2,y2    ein: ");
    	scanf("%i,%i,%i,%i",&x1,&y1,&x2,&y2);
    	printf("%i-%i-%i-%i",x1,y1,x2,y2);
    
    	rechnung(x1,y1,x2,y2,feld);
    	for(zaehler=0;zaehler<=2;zaehler++){
    		printf("\nDer %c Abstand betraegt %i",typ[zaehler],feld[zaehler]);
    	}
    	return 0;
    }
    
    float rechnung(int x1,int y1,int x2, int y2,float* feld){
    	float erg_euk,erg_man,erg_max;
    	erg_euk=sqrt(float((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));
    	//erg_euk=sqrt(pow((x1-x2),2)/pow((y1-y2),2));
    	//erg_man=max(1,2);
    	if(abs(x1-x2)>abs(y1-y2)){
    		erg_max=abs(x1-x2);
    	}
    	else{
    		erg_max=abs(y1-y2);
    	}
    	erg_man=abs(y1-y2)+abs(x1-x2);
    	feld[0]=erg_euk;
    	feld[1]=erg_man;
    	feld[2]=erg_max;
    	//printf("\n%f,%f",erg_euk,feld[0]);
    }
    


  • coon schrieb:

    char const *typ[]={"Euklidische" "Manhattan" "Maximum"};//FUNKTIONIERT AUCH NICHT
    

    Komma fehlt, Komma fehlt:

    char* const typ[]={"Euklidische", "Manhattan", "Maximum"};
    
    printf("\nDer %c Abstand betraegt %i",typ[zaehler],feld[zaehler]);
    

    %c gibt einen einzelnen Buchstaben aus, Du brauchst %s. %i gibt ein Integer aus, in Feld[] sind aber Float-Werte. So gehts erst einmal:

    printf("\nDer %s Abstand betraegt %f",typ[zaehler],feld[zaehler]);
    

    Weitere Fehler werden Dir in Form von Compiler-Warnungen (GCC) oder -Fehler (MSVC u.a.) ausgegeben.

    viele grüße
    ralph



  • ok danke das programm funktioniert nun ❤
    ich dachte das ich das feld faölsch übergeben... aber das es so ein trivialer datentypfehler ist hätte ich nicht gedacht 😉 :xmas1:


Anmelden zum Antworten