Forum: Compiler & IDEs Zeiger, struct Problem


von mathias (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Ich Arbeite gerade, an einem Display Menue und habe ein Problem bei der 
Darstellung. Im Anhang ist die ganze Source.

Die Methode processMenu() wird zyklisch aufgefrufen. Ich habe einen 
HilfsZeiger definiert der auf den selektierten Item zeigt, jedoch ist 
dieser nach jedem Aufruf wieder auf dem Default Wert. Ich verändere den 
Zeiger jedoch so wie es scheint nicht richtig.

Im Ahnag sind die 4 Files
kann vielleicht mal jemand einen Blick drauf werfen.


/*So funtkioniert es nicht, bei jedem Aufruf von ProcessMenuList ist 
SelItem auf dem alten Wert
 * SelItem = SelItem->next wird ignoriert wiso? */
1
void ProcessMenuList(MenueItem *ItemList, MenueItem *SelItem)//, unKeys)
2
{
3
    //Select next Item
4
    if(get_key_press(DOWN))   
5
    {
6
        SelItem->flags &= ~(SELECTED); //Delete flag from actual item
7
        
8
        SelItem = SelItem->next; //Zeiger manipulieren, Zeile wird nicht übernommen bzw. bei neum Aufruf nich erkennbar
9
        
10
        while(((SelItem->flags) & SELECTABLE) == 0)
11
        { 
12
            SelItem = SelItem->next;
13
        }
14
        
15
        SelItem->flags = SelItem->flags | (SELECTED); //Set new Selected Item as SELECTED
16
        
17
        
18
        DrawMenuList(ItemList);  //Zeichne die aktuelle Menüliste
19
    } 
20
21
    
22
    /*
23
  else
24
  if ((Keys & evKeyUp) != 0)
25
  {
26
    // ähnl. wie vorher
27
    SelItem = SelItem->Prev;  
28
    // ähnl. wie vorher
29
  }
30
  else
31
  if (Keys & evKeyEnter) !=0)
32
  {
33
    SelItem = SelItem.Child;
34
  }  
35
    */
36
}
37
38
39
void processMenu(void)
40
{
41
    ProcessMenuList(myMenue, selectedItem);
42
43
}

von Florian D. (code-wiz)


Lesenswert?

Du veränderst die lokale Kopie Deines Pointers (call by value).
1
void ProcessMenuList(MenueItem *ItemList, MenueItem **SelItem)//, unKeys)
2
{
3
    //Select next Item
4
    if(get_key_press(DOWN))   
5
    {
6
        (*SelItem)->flags &= ~(SELECTED); //Delete flag from actual item
7
        
8
        *SelItem = (*SelItem)->next; //Zeiger manipulieren, Zeile wird nicht übernommen bzw. bei neum Aufruf nich erkennbar
9
        
10
        while((((*SelItem)->flags) & SELECTABLE) == 0)
11
        { 
12
            *SelItem = (*SelItem)->next;
13
        }
14
        
15
        (*SelItem)->flags = (*SelItem)->flags | (SELECTED); //Set new Selected Item as SELECTED
16
        
17
        
18
        DrawMenuList(ItemList);  //Zeichne die aktuelle Menüliste
19
    } 
20
}
21
22
ProcessMenuList(myMenue, &selectedItem);

Unter C++ lässt sich Folgendes kompilieren und gibt yz aus:
1
#include <stdio.h>
2
3
void x( char * &y )
4
{
5
        y++;
6
}
7
8
int main(void )
9
{
10
        char *p = "xyz";
11
12
        x(p);
13
        printf("%s\n", p);
14
}


EDIT: Ich hatte oben ein paar Klammern vergessen.

Zur Vollständigkeit mein Bsp noch als C-Version:
1
#include <stdio.h>
2
3
void x( char **y )
4
{
5
        (*y)++;
6
}
7
8
int main(void )
9
{
10
        char *p = "xyz";
11
12
        x(&p);
13
        printf("%s\n", p);
14
}

von mathias (Gast)


Lesenswert?

Genau, ich brauche Call by Ref. --> Super danke geht, aber ich begreife 
es noch nicht ganz mit dem **. Ich schreibe es mal  mit Klammern im 
Funktionskopf.
1
void ProcessMenuList(MenueItem *ItemList, MenueItem *(*SelItem))//, unKeys)

Ne noch nicht ganz klar.

von mathias (Gast)


Lesenswert?

Okay, ich glaube ich verstehe es jetzt ich habe übersehen, dass ich ja 
einen Zeiger der auf einen Zeiger zeigt übergebe. Dann würde das mit den 
** doch Sinn machen. Und mit (*SelItem)->next auch.

von Simon K. (simon) Benutzerseite


Lesenswert?

mathias wrote:
> Okay, ich glaube ich verstehe es jetzt ich habe übersehen, dass ich ja
> einen Zeiger der auf einen Zeiger zeigt übergebe. Dann würde das mit den
> ** doch Sinn machen. Und mit (*SelItem)->next auch.

Jou, Zeiger auf Zeiger auf MenueItem. Selbst ich mache mir manchmal 
einen Knoten in den Kopf bei solchen Sachen... Zum Glück braucht man 
Pointer auf Pointer relativ selten. (Nur halt häufig im Falle von 
Call-by-Ref Pointern wie hier)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.