ein makro/funktion auf alle elemente eines struct anwenden?



  • hi leute,

    ich weiß weis das ihr fix seit und
    ich steh wie immer auf dem schlauch,
    hab leider keine vorstellung wie man das macht.

    also ganz einfaches beispiel:

    function blabla (x int) {
        return x+4;
    }
    
    struct test {
        int t1;
        int t2;
    }
    
    struct test teststruct;
    

    jetzt würde ich blabla blabla(teststruct.t1), blabla(teststruct.t2) aufrufen.
    bei 2 elementen geht das noch, aber bei 20 schon eher lästig,
    wie könnte ich denn das am besten lösen?

    danke schonmal.



  • das hat mit einem struct nicht viel zu tun... Statt 20 Variablen mit t1, t2, t3 usw. kannst du ein Array/Vector anlegen und dann per Index drauf zugreifen.

    int t[20];

    t[0], t[1], t[i] ...



  • denn ich brauche ein struct, das aus verschiedenen ints besteht.
    (das oben war nur ein beispiel)

    ich möchte alle daten in dem struct einem bitshift unterziehen (endian problematik), nun will ich aber nicht alle einzeln mit nem makro aufrufen,
    sondern das ganze nach möglichkeit auf das struct anwenden.

    hat jemand ne ahnung?



  • das geht nicht... naja, wenn du einen struct { int a,b,c; } hast, könnte man den zu nem array casten, aber schön is das nich



  • Was spricht denn gegen ein Array von Integern?



  • zeh++ schrieb:

    denn ich brauche ein struct, das aus verschiedenen ints besteht.

    wenn alles nur 'ints' sind, könntestes so machen:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct eine_struct
    {
    	int a;
    	int b; 
    	int c;
    };
    
    int func (int x)
    {
    	return x+4;
    }
    
    void for_each (struct eine_struct *t, int(*f)(int))
    {
    	unsigned int s;
    	for (s=0; s<sizeof(struct eine_struct)/sizeof(int); s++)
    	{
    		int *p = (int*)t + s;
    		*p = f(*p);
    	}
    }
    
    int main() 
    { 
    	struct eine_struct t = {1,2,3};
    	for_each (&t, func);
    	printf ("%d %d %d\n", t.a, t.b, t.c);
    	system ("pause");
    }
    

Anmelden zum Antworten