Return value vs. Adressübergabe



  • Hallo,

    ich habe eine Funktion AtoF, die einen String in ein Float umwandelt.

    Wenn ich die Funktion jetzt das Resultat zurück geben lasse, sie also
    deklariere als

    float AtoF (char* s) {

    float z;

    (...Berechnung des Resultats in z...)

    return z;
    }

    und in main aufrufe mit

    float f=0;

    f= AtoF ("123,123");

    steht in f ein völlig falscher Wert (die Funktion arbeitet einwandfrei,
    kann also nur an der Übergabe liegen).

    Wenn ich die Funktion jedoch so deklariere, dass eine Adresse für das
    Ergebnis übergeben wird, funktioniert es:

    void AtoF (char* s, float* f) {

    (...Berechnung des Resultats in *f...)

    }

    Aufruf in main:

    AtoF ("123,123", &f); //richtiger Wert in f

    Kann mir jemand sagen, wo der Fehler liegen könnte? Kann es ein Problem
    mit dem Stack geben?

    Eine ähnliche Funktion AtoI auf Integer-Basis funktioniert übrigens mit Rückgabe.



  • Das Probelm liegt in deiner Funltion.
    Zeig mal den genauen Code und benutze dabei die Code-Tags:

    // <-- Das ist ein Code-Tag
    

    Es besteht zwar eine minimale Chance, dass deine Funktion richtig arbeitet und dein Computer kaputt ist, aber das kann man erst beurteilen, wenn man deine Funktion gesehen hat.

    Gruß
    Don06



  • wenn du einen stack overflow o.ä. vermutest, versuch mal:

    [b]static[/b] float f = AtoF ("123,123");
    

    geht das auch?



  • Mit static float habe ich den selben Fehler.

    Hier die beiden Versionen der Funktion:

    void AtoF(char* s, float* z) 
    {
    	float hilf=0.1;
    	while (*s != '\0' && * s!= ',')
    	{
    		*z= 10 * *z + (*s - '0');
    		s++;
    	}
    
    	if (*s==',')
    	{	
    		s++;
    		while (*s != '\0' && hilf != 0.0001)
    		{
    			*z= *z + hilf * (*s - '0');
    			s++;
    			hilf/=10;
    		}
    	}
    
    }
    
    float AtoFF(char* s) 
    {
    	float z=0;
    	float hilf=0.1;
    	while (*s != '\0' && * s!= ',')
    	{
    		z= 10 * z + (*s - '0');
    		s++;
    	}
    
    	if (*s==',')
    	{	
    		s++;
    		while (*s != '\0' && hilf != 0.0001)
    		{
    			z= z + hilf * (*s - '0');
    			s++;
    			hilf/=10;
    		}
    	}
    	return z;
    }
    


  • void AtoF(char* s, float* z) 
    {
    	float hilf=0.1;
    	*z = 0.0;   // <<------ das fehlte
         while (*s != '\0' && * s!= ',')
    	{
    		*z= 10 * *z + (*s - '0');
    		s++;
    	}
    
    	if (*s==',')
    	{	
    		s++;
    		while (*s != '\0' && hilf != 0.0001)
    		{
    			*z= *z + hilf * (*s - '0');
    			s++;
    			hilf/=10;
    		}
    	}
    
    }
    


  • Nö, denn z wird in der main-Funktion auf null gesetzt und dann übergeben. Außerdem funktioniert ja die Funktion AtoF, aber eben die Funktion AtoFF (mit return value) nicht.



  • Also bei mir funktioniert AtoFF.
    Nebenbei wäre der Parameter besser const char*

    float AtoFF(const char* string);
    

    Da du ja sonst den String intern verändern könntest (Zeichen ersetzen usw.).
    Das gibt besonders bei Konstanten Probleme.

    Warum die Funktion bei dir nicht funktioniert... Keine Ahnung.

    Gruß
    Don06



  • Bei mir gehts jetzt auch, hatte vergessen die Funktionsprototypen einzubinden. Warum da der Compiler aber nicht gemeckert hat ist ne andere Frage...



  • seventh_son schrieb:

    Bei mir gehts jetzt auch, hatte vergessen die Funktionsprototypen einzubinden. Warum da der Compiler aber nicht gemeckert hat ist ne andere Frage...

    Weil wir hier bei C sind und nicht bei C++

    In C ist es kein "Muss" den Prototypen zu definieren... in C++ hingegen schon.

    http://www.it-academy.cc/article/1446/ANSI+C99+Grundlagen.html
    -> Der Prototyp 20



  • codefrag schrieb:

    In C ist es kein "Muss" den Prototypen zu definieren... in C++ hingegen schon.

    'muss' nicht, aber man kann ohne ganz schön auf die nase fallen (wie wir gesehen haben).

    btw: in C++ geht's doch auch ohne prototyp (will ich meinen).
    ...aber wen interessiert schon C++? :p



  • pale dog schrieb:

    btw: in C++ geht's doch auch ohne prototyp (will ich meinen).

    Nur, wenn stattdessen die komplette Definition bekannt ist. Bei einem (z.B.) printf ohne stdio.h sagt der Compiler höchstens "Wat? Wer bist Du denn?" 😉


Anmelden zum Antworten