Ist das legal?



  • Hi,

    ist das legal oder sollte man daran irgendwas verbessern bzw. kann man was verbessern?

    float *bar (void)
    {
    	float my[16];
    	return my;
    }
    
    void foo (const float *x)
    {
    	// mach irgendwas mit x indem das array aus 16 floats drin ist.
    }
    
    int main (void)
    {
    	foo(bar());
    
    	return 0;
    }
    

    Achja, wie kann ich testen ob in X wirklich 16 floats drin sind oder nicht?



  • Das ist illegal da my bei verlassen der Funktion nicht mehr existent ist.

    Ausnahme: Du machst es static. Aber selbst dann sollte man das meiden.

    Aber das sollte man nur machen wenn man mit dem Rücken an der Wand steht und ein Messer an der kehle hat (oder nen Singleton 🤡 )



  • illegal. rückgabe einer lokalen adresse



  • und wie kann ich das richtig machen? so das es legal ist und auch noch gut ist für jeden?



  • habs mal so gemacht, hoff das es nun legal ist:

    float* bar (float *blub) 
    { 
    	if (blub)
    		for (int i=0; i<16; i++)
    			blub[i] = (float)i;
    
    	static float my[16];
    
    	for (int i=0; i<16; i++)
    		my[i] = (float)i;
    
    	return my;
     } 
    
    void foo (const float *x) 
    { 
    	// ...
    } 
    
    int main (void) 
    { 
        foo(bar(NULL)); 
    
    	float matrix[16];
    
    	bar (matrix);
    
        return 0; 
    }
    


  • *kotz*



  • ich würde es so machen:

    void foo(float* in, float* out)
    {
    	//...
    }
    
    //oder
    
    struct a
    {
    	float b[16];
    
    };
    
    a foo(float* in)
    {
    	//...
    	a o = {1,2,3,4,5}; //usw
    	return o;
    }
    


  • 1. Du benutzt C-Casts(abstoßend)
    2. Wärs nicht besser eine Klasse zu bauen, die ein Float-Array als public-Elemenmt hat(ich weiß, dass es auch häßlich ist, aber besser, als das Obere(in meinen Augen)). Dann baust du dir ne Smart_ptr-Klasse (oder benutzt die aus Boost...). Und dann baust du dir ne std::list, oder nen std::vector, der smart_ptr<Klasse> aufnehmen kann, dann machst du alles wie gehabt(du musst aber nicht selbst Casten, das tut C++ von allein. Du baust eine Insatnz von Klasse, manipulierst das Array, packst die Klasseninstanz in einen Smart_ptr, der in die Liste/ den Vector gesperrt wird.

    (Diese Möglichkeit müsste zwar möglich sein, ist aber bestimmt einfacher zu machen, das Design hab ich nur so ausm Stehgreif genommen)

    mfg
    Glamdring



  • Wärs nicht besser eine Klasse zu bauen, die ein Float-Array als public-Elemenmt hat

    Dann nimmt man für gewöhnlich eine Struktur und keine Klasse, wobei eine Klasse, die nur public-Elemente hat, eigentlich sowieso eine Struktur ist. 😉


Anmelden zum Antworten