Beachte auch, daß du für die Strings zwei Induirektionen via pgm_xxx drinne hast (die zeite wohl in deiner out-Routine, die nen Zeiger ins Flash bekommt.

Code:
void foo (uint8_t i)
{
	((void(*)(void)) pgm_read_word (& menu[i].Menu_Funkt)) ();
}
ergibt übrigens

Code:
foo:
	mov r30,r24
	clr r31
	ldi r24,3
1:	lsl r30
	rol r31
	dec r24
	brne 1b
	subi r30,lo8(-(menu+6))
	sbci r31,hi8(-(menu+6))
/* #APP */
	lpm r24, Z+
	lpm r25, Z
/* #NOAPP */
	movw r30,r24
	icall
	ret