Arrayeintrag ändern



  • Hallo,

    schon mal vor weg die erklärung ist nicht sehr gut und den kompletten
    Codeeinzufügen zu viel.
    Ich habe ein Array in dem ich verschiedene einträge festgelegt hab jeder
    Arrayeintrag hat nochmal 3 untereinträge

    Array[] = {
      Eintrag(1, 1,int variable_1),
      Eintrag(2, 1,char variable_2),
    ...
    };
    

    jetzt hab ich eine funktion die z.b. in dem 2 eintrag die variable_2 ändern
    soll dafür bekommt sie einen poniter der auf den Arrayeintrag zeigt pArray
    (wird von einer anderen funkion gesucht) und einen poniter der auf ein 2byte
    großes array zeigt in dem die neuen werte stehen pNeu.
    jetzt hab ich gedacht ich könnte es einfach so machen:

    pArray->Variable=pNeu;
    

    und der eintrag ist geändert, stimmt aber nicht wenn ich denn eintrag jetzt
    wieder auslese ist er null.
    Hab auch noch ein paar andere möglichkeiten ausprobiert.

    Vielen Dank.

    Edit by c.rackwitz: [code] Tags sind was Feines



  • Nett, daß Du so allgemein bleibst, aber wenn Du etwas konkreter werden würdest (möglichst: minimalen compilierbaren Quelltext), dann könnte man auch Antworten finden, bei denen man nicht die Glaskugel bemühen muß.



  • ok stimmt schon war etwas zu wenig hoffe das ich jetzt mehr habe. kann sein das ich ein paar sachen wie Klammern vergessen hab mit zu kopieren. Das Problem ist halt nur warum ich den neuen Wert nicht abgespeichert bekomme der alte wird zwar überschrieben aber mit null und nciht dem richtigem Wert.

    typedef struct {
     int	Index;
     char	Subindex;  
     void*  pData;
    } tsArrayEntry;
    
    char variable_2=10;
    
    #define Eintrag(Index, Subindex, Variable)\
          {Index, Subindex, sizeof(Variable), (void*)&Variable}
    
    tsArrayEintrag Array[] = {
     Eintrag(1, 1,int variable_1),
     Eintrag(2, 1,char variable_2),
     ...
    }; 
    
    void RxCanMessage() { 							
     char message[2];
     GetCANs(&Cob,&rtr,&length,message);
     void RSO(char* pMessage) {
    

    Diese Funktion sucht den Arrayeintrag und bibt einen pointer auf ihn zurück
    damit hab ich auch keine probleme

    tsArrayEintrag* FindEintrag(int index, char subindex){
      tsArrayEintrag* pEintrag; 
        if(index == pEintrag->Index){
          if(subindex == pEintrag->Subindex){
    	return pEintrag;
          }
        }
        pEintrag++;
    }
    

    Diese Funktion soll jetzt meinen Eintrag ändern was leider nicht klappt.

    void Eintragaendern( tsArrayEintrag* pEintrag, cahr* pData) {
        pEintrag->pData=pData;
    }
    

    Edit by c.rackwitz: [code] Tags sind was Feines



  • Erstmal sieht dein Eintrag()-Makro seltsam aus - du versuchst vier Werte in ein dreielementiges Struct zu initialisieren.
    Zweitens sieht die Anwendung des Makros noch katastrophaler aus - eine Variablendeklaration mitten in einer Inititialisierungsliste, tztztz.

    Und drittens: Was klappt an deiner Funktion denn nicht?



  • stimmt bei #define Eintrag muß das sizeof weg das wollte ich erst später erweitern. Ich will in meinem Array die Variablen ändern. Die neuen Daten stehen in dem Array Message. Das Problem liegt in diesem Teil:

    void Eintragaendern( tsArrayEintrag* pEintrag, cahr* pData) {
        pEintrag->pData=pData;
    }
    

    Die 2 Byte aus meinem Array Message die neuen Daten werden nicht in meiner variablen_1 oder variablen_2 gespeichert, weiß einfach nicht wie ich das machen soll. Wenn ich das mache wie in dem obigen Programmteil wird mein alter Wert überschrieben den ich vorher richtig auslesen konnte und es steht Null drin.

    Weiß nicht wie ich es gut beschreiben soll.



  • pData ist ein Zeiger auf einen bestimmten Datenbereich. Wenn du den neu zuweist, wird der Inhalt des Speichers nicht verändert, sondern der Zeiger selbst zeigt in einen anderen Bereich. Du brauchst vermutlich memcpy() oder "*(pEintrag->pData)=...", um die Inhalte hinter dem Zeiger zu verändern.

    PS: Und schau mal etwas weiter unten ins Magazin, da gibt es einen sehr hilfreichen Artikel über Pointer 😉



  • Danke mit memcpy() gehts diese funktion war mir nicht bekannt. 🙂


Anmelden zum Antworten