mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Dynamisches Array


Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tag,

ich bräuchte eine Art Dynamisches Array, welches ständig auf seine 
belegte Größe(alle Einträge ungleich null) überprüft wird. In diesem 
Array sollen Daten gespeichert werden, die später dann der Reihe nach 
abgeholt werden.

Ungefähr so:

void Save_Data()
{
//Wenn Daten da
if(!(Daten == 0))
{
  uc_8 i = 0;

  //solange bis ein leeres Feld gefunden wird und der Eintrag noch nicht
  //vorhanden ist
  while(!(Array[i] == 0)) && (!(Daten == Array[i])))
  {
    i++;
  }

  //Daten ins Feld schreiben
  Array[i] = Daten;
}
}

void Data_Process
{
 uc_8 e = 0;

 while(!(Array[e] == 0))
 {
 e++;
 }
}

Könnte das so ungefähr Funktionieren? Ich bräuchte ca. 20 Einträge im 
Array. In diesem Fall könnte das Array aber beliebig groß? Und e zeigt 
mir  immer die aktuelle belegte Größe im array an....

Oder hat einer ne bessere Idee?

Vielen Dank und Gruß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Toni wrote:
> Tag,
>
> Array sollen Daten gespeichert werden, die später dann der Reihe nach
> abgeholt werden.

Ist die Reihenfolge im Array wichtig?

>
> void Save_Data()
> {
> //Wenn Daten da
> if(!(Daten == 0))
> {
>   uc_8 i = 0;
>
>   //solange bis ein leeres Feld gefunden wird und der Eintrag noch nicht
>   //vorhanden ist
>   while(!(Array[i] == 0)) && (!(Daten == Array[i])))
>   {
>     i++;
>   }
>
>   //Daten ins Feld schreiben
>   Array[i] = Daten;
> }
> }
>
> void Data_Process
> {
>  uc_8 e = 0;
>
>  while(!(Array[e] == 0))
>  {
>  e++;
>  }
> }
>
> Könnte das so ungefähr Funktionieren?

Ja, könnte es.
Kommt drauf an, welche Nebenbedingungen du noch nicht genannt hast.
Aber grundsätzlich spricht nichts dagegen.

> Ich bräuchte ca. 20 Einträge im
> Array. In diesem Fall könnte das Array aber beliebig groß?

Wie lautet die Frage?

> Und e zeigt
> mir  immer die aktuelle belegte Größe im array an....

Ja. Ist aber unter Umständen einfacher, wenn du beim Einfügen
einfach dein e hochzählst und beim 'rauslöschen' (auf
0 setzen) wieder runter.

> Oder hat einer ne bessere Idee?

Kommt drauf an wofür du das Teil brauchst.

Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ist die Reihenfolge im Array wichtig?

Ja, die sollte schon so ein wie die Daten auch reingekommen sind.

Also ich erläuter mal kurz. Ich habe ein Steuerpult an dem sich Geräte 
über UART anmelden und Daten austauschen können. Die Geräte besitzen 
bestimmte ID's(Kennungen) mit denen sie sich am Steuerpult anmelden. Nur 
wenn die ID vom Gerät mit der aktuell eingestellten ID am Steuerpult 
übereinstimmt, kann eine Verbindung aufgebaut werden.

Nehmen wir mal den Start an. Das Array ist noch leer, also das 
Steuerpult hat noch keine Verbindung mit irgendwas hergestellt und ist 
auf Empfangsmodus geschaltet. In diesem Modus besitzt das Pult eine 
Standard_ID, welche auch den Geräten bekannt. Bei einer ersten 
Verbindung wird die Standard_ID benutzt, welche sich aber direkt nach 
dem erfolgreichen Verbinden in die bestimmte ID des Gerätes ändert. Das 
Gerät bleibt von nun an nur noch auf dieser ID und versucht nun alle 10 
Sekunden sich über diese ID mit dem Steuerpult zu verbinden.

Nun sollen sich mehrere Geräte beim ersten mal mit der Standard_ID 
angemeldet werden, und später über ihre bestimmte ID, welche vom 
Steuerpult im Array gespeichert wird, erreichbar sein. Mit dem 
Steuerpult kann ich dann durch die  verschiedenen "bekannten" ID's 
wechseln, oder über die Standard_IP weitere Geräte hinzufügen. Eine 
gewisse Reihefolge sollte dabei schon gegeben sein.

So, dass ist es was ich vorhabe. Wollte mal hören ob ich mit dem Ansatz 
dass hinbekommen könnte, oder ob einer ne bessere Idee hat.

Gruß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Toni wrote:
>> Ist die Reihenfolge im Array wichtig?
>
> Ja, die sollte schon so ein wie die Daten auch reingekommen sind.

Dann wirst du nicht umhin kommen, im Array die 'Löcher' zu stopfen
wenn eine neue ID dazukommt. Also alle dahinterliegenden Ids
nach vorne zu verschieben.

>
> Nun sollen sich mehrere Geräte beim ersten mal mit der Standard_ID
> angemeldet werden, und später über ihre bestimmte ID, welche vom
> Steuerpult im Array gespeichert wird, erreichbar sein. Mit dem
> Steuerpult kann ich dann durch die  verschiedenen "bekannten" ID's
> wechseln, oder über die Standard_IP weitere Geräte hinzufügen. Eine
> gewisse Reihefolge sollte dabei schon gegeben sein.

Dazu brauchst du aber keine bestimmte Reihenfolge im Array.
Du musst nur dafür sorgen, dass dieselbe Id nicht ein 2-tes
mal vergeben wird. In welcher Reihenfolge diese Id im Array
stehen ist doch Jacke wie Hose.

> So, dass ist es was ich vorhabe. Wollte mal hören ob ich mit dem Ansatz
> dass hinbekommen könnte, oder ob einer ne bessere Idee hat.

Wenn du nicht auf eine dynamische Datenstruktur (Liste)
ausweichen willst, ist das so ok. Das heist die Frage lautet
eigentlich: Kannst du damit leben, dass eine gewisse maximale
Anzahl an Geräten möglich ist, die fix vorgegeben ist, oder
möchtest du das vermeiden.
Im ersten Fall ist ein Array mit einer 'Array-Index nicht vergeben'
Kennung keine schlechte wahl. Im zweiten Fall müsste man auf
etwas dynamisches (dynamisch allokiertes Array, Liste, ...)
ausweichen.


Ob die Reihenfolge im Array wirklich die Reihenfolge der Anmeldung
wiederspiegeln soll, würde ich mir noch gut überlegen. Wenn
es keinen triftigen Grund dafür gibt, lass diese Anforderung
fallen (OK. Bei 20 Einträgen spielt ein bischen Array Umsortieren
noch keine grosse Rolle).

  Bsp. Es haben sich 7 Stationen angemeldet
       und zwar in der Reihenfolge: 5, 8, 2, 1, 10, 12, 3

  Dein Array sieht dann so aus
  +---+---+---+---+---+---+---+---+---+
  | 5 | 8 | 2 | 1 | 10| 12| 3 |   |   |
  +---+---+---+---+---+---+---+---+---+

  meldet sich nun Station 2 ab, dann muss das Array nach
  der Abmeldung so aussehen:
  +---+---+---+---+---+---+---+---+---+
  | 5 | 8 | 1 | 10| 12| 3 |   |   |   |
  +---+---+---+---+---+---+---+---+---+

  * Es sind nur noch 6 angemeldete Stationen
  * Die Stationen 1, 10, 12, 3  wurden im Array um jeweils
    eine Stelle nach vorne kopiert, damit die Lücke, die durch
    den Ausfall von 2 entstanden ist, geschlossen wird.

 Dafür hast du aber den Vorteil, dass du bei einer Neuanmeldung
 nicht lange suchen brauchst. Du weist (in einer extra Variablen),
 dass 6 Stationen im Array sind, ergo muss eine Neuanmeldung
 an Arrayposition 6 kommen:

 4 meldet sich an
  +---+---+---+---+---+---+---+---+---+
  | 5 | 8 | 1 | 10| 12| 3 | 4 |   |   |
  +---+---+---+---+---+---+---+---+---+


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.