Variable als Array definieren

MPP

Neues Mitglied
25. Feb. 2009
15
0
0
Schwarzenberg / Erzgebirge
Sprachen
  1. BascomAVR
Hallo allerseits,

folgendes Problem ist beim deklarieren einer Variablen aufgetreten:

Bsp.
dim B as byte : B = 10
dim Array(b) as string * 20

Beim kompilieren kommt dann folgende Fehlermeldung:
Error : 377 Line : xxx Unexpected non numeric characters found

Wenn ich b als Konstante definieren klappt's...

Kann ich wirklich kein Array einfach mit einer Variablen definieren? - oder habe ich jetzt einen "Blackout"!?

Gruß

Mario
 
Code:
dim Array(b) as string * 20


Hallo Mario!

So weit mir bekannt ist, funktioniert das nicht!

Wie soll BASCOM aus der Anweisung heraus auch einen definierten Speicherbereich reservieren, wenn die Größe des Arrays doch gar nicht definiert ist. :wink:


Wozu benötigst du das denn überhaupt? :hmmmm:
Kannst du keine feste Arraygröße verweden?
Und wenn Nein, warum nicht?


Grüße,
Cassio
 
Hallo Cassio!

Danke erstmal für die schnelle Antwort.
Naja, mit
Dim B as byte : B = 10
müsste eigentlich BASCOM wissen, wie groß das Array werden soll (in diesem Fall b - also 10) ....
Das Ganze soll für eine änderbare Telefonummernliste angewendet werden.
Also:
Standardmäßig sind dort 3 Einträge vorgesehen (b=3).
Nun soll es aber die Möglichkeit geben (z.B. per ext. Kommunikationssoftware), noch x-beliebige (in Summe max. 255) Telefonnummern hinzuzufügen welche dann in Anzahl und Inhalt als ERAM-Variablen gespeichert werden sollen.
Klar, ich könnte b pauschal auf auf 255 setzen - aber ich halte das für "Speicherverschwendung".
Mir wäre es "angenehmer", nur so viel Speicher für die Größe des Array zu reservieren wie benötigt wird.
Eine (aufwändigere) Lösung wäre eventuell:

select case Anzahl_Telefonnummer

case 1 : dim Array(1) as string * 20

case 2 : dim Array(2) as string * 20

case....

end select

Vielleicht gibt es doch noch eine andere (einfachere) Lösung...

Gruß Mario
 
Hi,

ich kenn mich in Basecom zwar leider nicht aus, aber da hätte jede Programmiersprache seine Probleme damit.


Du machst in deinem Sourcecode eine Angabe die dein Compiler übersetzen will in Maschinen Code. Der Compiler/Linker vergibt dazu dann festen Adressen (rcals ...).

Wenn du jetzt aufeinmal etwas Variabel machst, kann dein Compiler ja nicht mehr sagen "okey ich brauche die Adresse hier und da und dahinter kommt nun eine andere Variable" .

Du musst etwas nutzen wie in "C" malloc. Hier wird es grob beschrieben http://www.rn-wissen.de/index.php/Bascom_Speicherstrukturen


Hoffe das hilft dir weiter,

Gruß,
 
Hallo allerseits und Danke für die Hinweise.
Nach reichlichen Überlegungen und der Auseinandersetzung mit eueren Antworten ist mir klar geworden, dass das so, wie ich es mir vorstellte, nicht funktionieren kann.
Deshalb habe ich das Problem wie folgt gelöst:

- eine Konstante für die maximale Anzahl der Telefonbucheinträge (z.B. Const Max_entry = 20)
- Definition der Telefonnummern mit maximal 20 Ziffern: Dim Telefonnr(Max_entry) as string * 20

Ist zwar etwas "starr" aber mit diesem Kompromiss kann ich leben...

Gruß und Danke nochmals für eure Mühe...

Mario
 
Hi Mario
Wenn ich dich richtig verstanden habe, möchtest du im EEProm Telefonnummern hinterlegen, die du vom PC aus dort abspeicherst. Das soll variabel gestaltet sein. Nun, ich hab so etwas ähnliches mal für eine Alarmanlage gemacht, allerdings in Assembler. Der Weg sollte aber der gleiche sein.
Du kannst bspw. Im EEProm eine Speicherzelle für die Anzahl der Strings und eine Speicherzelle für die Länge hinterlegen. Wenn du nicht im Controller die Telefonnummern einträgst, sondern über eine Schnittstelle, ist das kein Problem. Wenn du eine geeignete Eingabemöglichkeit am Controller hast, eigentlich auch nicht.
Angenommen, du möchtest auf den 3. Eintrag zugreifen, dann ist die Adresse 3 * Stringlänge+Offset (Startadresse der Einträge) Ob du dort einen Eintrag findest, ergibt der Vergleich mit „Anzahl Einträge“. Fügst du einen Eintrag hinzu, erhöhst du einfach den Wert in der Variablen für die Anzahl der Einträge. Ein anderer Weg wäre eine verkettete Liste oder ein String, der ein Steuerzeichen enthält. Der Vorteil, die Einträge können unterschiedlich lang sein. Nachteil, eine etwas komplizierte, aber lösbare Berechnung eines Eintrages. Daher schau dir das mal an:
15434*055145555*2354*024313452390*01803423*…
Eintrag 1 ist 15434. Willst du auf den 4. Eintrag zugreifen, dann suchst du die „*“ und zählst einen Index hoch, bis du bei 3 bist. ( der Zähler fängt bei 0 an) Die Zeichenkette bis zum nächsten „*“ ist der gesuchte Eintrag. Natürlich solltest du dir die Anzahl der Einträge merken, um einen Überlauf des Zählers abzufangen. Schwierig wird es, wenn du einen Eintrag im Controller löschen willst. Solange du die Daten vom PC aus überträgst, ist das kein Problem, aber ist die Bedienung im Controller eingebaut, dann brauchst du den Platz vom EEProm auch im Speicher.
Zuerst den EEProminhalt in den Variablenspeicher. Dann den Eintrag suchen und die Länge ermitteln. Also das nächste Steuerzeichen suchen. Danach ein Blockmove, also die Start-Adresse auf das 2. Steuerzeichen, die Zieladresse auf das erste Steuerzeichen und dann soviele Zeichen verschieben, wie noch nach dem 2. Steuerzeichen vorhanden sind. Danach den Bereich bis zum letzten Steuerzeichen entfernen
Vielleicht hilft dir eine kleine Skizze
.

Gruß oldmax
 

Anhänge

  • Dyn_Speicher.PNG
    Dyn_Speicher.PNG
    4,1 KB · Aufrufe: 11
Hallo oldmax,

danke erstmal für die ausführliche Antwort.
Das ist ein sehr guter Lösungsansatz und da die Telefonnummerverwaltung vom NUR vom PC geplant ist, ist das Löschen von Telefonnummer auch kein Problem:
Bei jeder Änderung der Telefonnummer wird das alte (vorherige) Sting aus dem EEProm gelöscht und der neue (aktuelle) String in den EEProm geschrieben.

Da ich aber momentan aus beruflichen Gründen sehr wenig "AVR"-Zeit übrig habe, wird diese Telefonnummerverwaltung noch etwas auf sich warten müssen...
Ich werde meine Erfahrungen aber auf jeden Fall hier niederschreiben...

Gruß aus dem Erzgebirge

Mario
 
Hi
Ja, ja, der dumme Beruf... Eigentlich können wir froh sein, wenn unsere Arbeit zum Leben dient und wenn's obendrein auch noch ein wenig Spaß macht. Ich hab auch sooo viel zu tun, aber auch mir bleibt nix erspart. Auch wenn der Tag kurz nach 4 beginnt, so manches bleibt trotzdem aus Zeitmangel liegen.
Gruß oldmax
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)