mikrocontroller.net

Forum: Compiler & IDEs Zeiger, struct Problem


Autor: mathias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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? */
void ProcessMenuList(MenueItem *ItemList, MenueItem *SelItem)//, unKeys)
{
    //Select next Item
    if(get_key_press(DOWN))   
    {
        SelItem->flags &= ~(SELECTED); //Delete flag from actual item
        
        SelItem = SelItem->next; //Zeiger manipulieren, Zeile wird nicht übernommen bzw. bei neum Aufruf nich erkennbar
        
        while(((SelItem->flags) & SELECTABLE) == 0)
        { 
            SelItem = SelItem->next;
        }
        
        SelItem->flags = SelItem->flags | (SELECTED); //Set new Selected Item as SELECTED
        
        
        DrawMenuList(ItemList);  //Zeichne die aktuelle Menüliste
    } 

    
    /*
  else
  if ((Keys & evKeyUp) != 0)
  {
    // ähnl. wie vorher
    SelItem = SelItem->Prev;  
    // ähnl. wie vorher
  }
  else
  if (Keys & evKeyEnter) !=0)
  {
    SelItem = SelItem.Child;
  }  
    */
}


void processMenu(void)
{
    ProcessMenuList(myMenue, selectedItem);

}


Autor: Florian Demski (code-wiz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du veränderst die lokale Kopie Deines Pointers (call by value).
void ProcessMenuList(MenueItem *ItemList, MenueItem **SelItem)//, unKeys)
{
    //Select next Item
    if(get_key_press(DOWN))   
    {
        (*SelItem)->flags &= ~(SELECTED); //Delete flag from actual item
        
        *SelItem = (*SelItem)->next; //Zeiger manipulieren, Zeile wird nicht übernommen bzw. bei neum Aufruf nich erkennbar
        
        while((((*SelItem)->flags) & SELECTABLE) == 0)
        { 
            *SelItem = (*SelItem)->next;
        }
        
        (*SelItem)->flags = (*SelItem)->flags | (SELECTED); //Set new Selected Item as SELECTED
        
        
        DrawMenuList(ItemList);  //Zeichne die aktuelle Menüliste
    } 
}

ProcessMenuList(myMenue, &selectedItem);

Unter C++ lässt sich Folgendes kompilieren und gibt yz aus:
#include <stdio.h>

void x( char * &y )
{
        y++;
}

int main(void )
{
        char *p = "xyz";

        x(p);
        printf("%s\n", p);
}


EDIT: Ich hatte oben ein paar Klammern vergessen.

Zur Vollständigkeit mein Bsp noch als C-Version:
#include <stdio.h>

void x( char **y )
{
        (*y)++;
}

int main(void )
{
        char *p = "xyz";

        x(&p);
        printf("%s\n", p);
}

Autor: mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
void ProcessMenuList(MenueItem *ItemList, MenueItem *(*SelItem))//, unKeys)

Ne noch nicht ganz klar.

Autor: mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.