Zeiger, struct Problem

Gast #597475
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
}
Angehängte Dateien:
#597532
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
}
Gast #597554
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.
Gast #597562
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.
Persönliche Seite #597578
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)

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.