Array in Array kopieren mit BASCOM-AVR?

pcprofi

Neues Mitglied
12. Apr. 2008
90
0
0
Sprachen
Hallo,

ist es nicht möglich, ein Array direkt komplett in ein anderes zu kopieren?

Code:
dim array1(10) as string * 20
dim Array2(10) as string * 20

Array2 = Array1

Wenn ich das nämlich so mache, dann kommt folgende Fehlermeldung:

Error 261: Line... Array expected [Array2]
Error 261: Line... Array expected [Array1]

Geht das nicht, oder mach ich nen Fehler?

Gruß Rainer
 
Hallo Rainer,

ich programmiere selber nicht mit BascomAVR. Ich vermute aber, dass man hier die Speicherbereiche kopieren muss, entweder manuell über eine Schleife oder eleganter mit MEMCOPY.

Grüße,
Dirk
 
Über diesen Ansatz habe ich auch bereits nachgedacht - aber ich weiß nicht, wo die Variable ja genau angelegt wird...

VOn daher komm ich da uach nicht weiter, ist vermutlichzu hoch für einen Anfänger... Ich les mir ja alles im INet an und suche erstmal wenn ich nicht weiter komme...

Gruß Rainer
 
Hallo Rainer,

prinzipiell bietet BASCOM schon funktionen über die man abfragen kann, an welcher Adresse im Speicher eine bestimmte Variable liegt. Das wird z.B. bei "call by reference" benötigt, wenn Du den Inhalt einer Variable direkt, quasi via Pointer, im Speicher verändern möchtest.

Ich glaube nur, dass Dir ein solcher Ansatz bei Deinem Problem nicht wirklich weiterhilfe, da Du alles "von Hand" machen muss. Ist sicherlich spannend wenns dann funktioniert aber .....

Leider ist BASCOM bzgl. kopieren von Arrays nicht so komfortabel ausgesattet, bzw. ist mir keine passende Funktion bekannt mit der Du so etwas machen kannst. Auch bei C oder Pascal oder Assembler wäre mir jetzt aus dem Stehgreif keine Funktion bekannt. Das einzige wo ich mir schon vorstellen könnte das es funktioniert wäre der objektorientiert Ansatz. Man definere sich ein Objekt und eine entsprechende Klasse, überlade den Operator "=" ...... ich weiß, hilft hier auch nicht weiter.

Ich glaube der einfachst und schnellste Ansatz ist wirklich über eine FOR-Schleife die String von Array1 nach Array2 zu kopieren.

Code:
For Index = 1 To 10
     Array2(Index) = Array1(Index)
Next Index
Wenn Du in BASCOM nur ein einziges Statement in der For-Schleife hast dann reicht auch

Code:
For Index = 1 To 10  Array2(Index) = Array1(Index)

Da muss dann aber der gesamte Code in einer Zeile stehen, sonst funzt es nicht.


Grüße,
Markus
 
Naja - für ein Array mit 3 Inhalten lohnt sich die FOR-Schleife net - zu Speicherplatzintensiv, also grad von Hand.

Irgendwie wundert mich das aber, dass BascomAVR als - ja mehr oder weniger - eine Hochsprache der µC-Technik eine solche Möglichkeit nicht so einfach hat.

Wäre ma so ein Verbesserungsvorschlag... Oder hängt das wieder an der doofen Demo ( ich will uch endlcih die Vollversion, aber als gerade-Abiturient...)

Gruß Rainer
 
Hallo Rainer,

ich kann Dich beruhigen. Ich habe die Vollversion und die kann es auch nicht. Ich bin mir aber auch ziemlich sicher, wie ich schon geschrieben habe - bitte korregiere mich wer es besser weiß - das es andere sehr mächtige Hochsprachen wie z.B. C oder C++ in der Basisvariante ohne eigene Klassen und überladenen Operatoren oder Pascal oder Lisp auch nicht kann. Ich habe einige Jahre als Systemprogrammierer unter C und Assembler programmiert und ich kann mich nicht erinnern eine Funktion zur Verfügung gehabt zu haben die Arrays einfach so via "=" umkopiert haben.

Und ob Du von Hand so viel schneller und Ressourcen-schonender bist als in der FOR-Schleife das wage ich zu bezweifeln. In der Regel sind FOR-Schleifen nach der Optimierung nix anderes als bedingte Sprünge mit einem Dekrement. Du solltest Dir das mal genauer ansehen. Es gibt sicherlich Tools im Internet mit dem man die Binär-Files debugen und in lesbare Mnemonic umwandeln kann. Auf diesem Weg kannst Du Dir in Assembler sehr genau ansehen was der Compiler macht.

Wenn nicht dann machs mal so und mal so und lasse Dir das Detailergebnis des Codes abzeigen. Dann siehtst Du gleich was kleiner - größer - besser - schneller ist.

Grüße,
Markus
 
Hallo Markus,

Pascal/TurboPascal/Delphi können das, das weiß ich, weil ichs in der Schule gelernt habe. Sogar das uralte DOS-Pascal.

Naja, es ist letztenendes auch egal, ob mehr oder weniger ressourcen - ein Ladegerät ist ja schließlich Zeitunkritisch.

Mein Problem ist mehr, dass ich endlich die Vollversion bräuchte, damit ich meine Projekte weiterführen kann - 4kB Code sind ja nichts... ATMega8 halb leer und ich komm net weiter wegen dem blöden Compiler... Aber wo nimmt man mal eben so viel Geld her.

Naja, Geduld isses halt...

Gruß Rainer
 
Hi Rainer,

prima wenn Du es unter C und Pascal geschafft hast. Ich habe Interesse an dem Code-Ausschnitt da ich es nämlich nicht geschafft habe. Bei mir wird immer nur die nullte Stelle bei einer Zuweisung Array2 = Array1 kopiert.

Ich hatte auch schon mit meinen Entwicklern gesprochen ob es direkte Zuweisungen gibt und alle haben mir die FOR-Schleife geraten.

Aber ich lerne gerne dazu wenns denn so einfach in C geht. Würde mich also freuen wenn Du mir den SW-Teil zur Verfügung stellen könntest mit der Du Arrays "umkopierst".

Danke dafür im voraus!

Grüße,
Markus
 
Hallo zusammen,

ein Array zu kopieren ist nicht so einfach wie wenn man eine Variable kopiert. In Delphi-Pascal ist es zum Beispiel so, dass array1 := array2 nur die Wirkung hat, dass array1 ein Synonym für array2 ist (man kann sich das so vorstellen, dass die Startadresse des Arrays im Speicher kopiert wird). Es ist das selbe Array, hat nur einen anderen Namen.

Arrays kopiert man zum Beispiel so:
Code:
array1 := Copy(array2);   // komplette array kopieren
array1 := Copy(array2, 3, 4); // kopiert 4 Elemente beginnent mit index 3
... oder eben in einer Schleife.

Wenn das Array bei Bascom zusammenhängend im Speicher abgelegt ist (wovon ich ausgehe), müsste es dann auch mit MEMCOPY gehen.

Grüße,
Dirk
 
@Markus: Dirk hat die Lösung für Delphi bereits geschrieben mit Erklärung - genau so macht man das da, C kann ihc leider nicht, habe ich auch noch nie benutzt.

@Dirk: Mit dem MEMCOPY kann ich leider nicht viel Anfangen. Die Theorie des Befehls ist klar, allerdings steht in der BASCOM Hilfe, dass er Adressen verlangt. Meinen die damit jetzt einen Variablennamen (der ja letztenendes nicht mehr als genau das ist, ein Pointer eben) oder meinen die die direkte Adresse im Speicher? Die Anzahl derzu kopierenden Bytes ist nicht schwer auszurechnen - ist abhängig vom Variablentyp * der Anzahl der Elemente.

Gruß Rainer
 
Hallo Rainer.
Meinen die damit jetzt einen Variablennamen (der ja letztenendes nicht mehr als genau das ist, ein Pointer eben) oder meinen die die direkte Adresse im Speicher? Die Anzahl derzu kopierenden Bytes ist nicht schwer auszurechnen - ist abhängig vom Variablentyp * der Anzahl der Elemente.

Normalerweise müsste es gehen, da der Variablenname direkt dem Pointer auf die Speicherstelle des Array-Anfangs entspricht. Aufpassen müsste man natürlich auf den Datentyp, da hast du recht.

Ich würde das wie Markus vorgeschlagen hat über eine For-Next-Schleife machen. Es könnte sein, dass Memcopy hier schneller und speichersparender ist als wenn du es zu Fuss machst (Bascom wird bei memcopy sicherlich die indirekte Adressierung mit postincrement nutzen - Assembler: ld Rd, X+).

Vielleicht auch einmal beide Versionen ausprobieren, ist ja schnell getestet.

Grüße,
Dirk
 
Also, ich habe es gerade mal getestet:

Von Hand kommt folgendes heraus:
ROMIMAGE : F28 hex -> Will fit into ROM
ROMIMAGE : 3880 dec
FLASH USED : 47 %
BAUD : 9600 Baud
XTAL : 1000000 Hz
BAUD error : 6.99%

Bei einer For-Schleife: (Man muss dazu sagen, dass eine vorhandene Byte-Variable MITGENUTZT wurde - wenn man eine anlegen muss ist es noch mehr!)
ROMIMAGE : F3E hex -> Will fit into ROM
ROMIMAGE : 3902 dec
FLASH USED : 47 %
BAUD : 9600 Baud
XTAL : 1000000 Hz
BAUD error : 6.99%

mit dem Memcopy das geht bei mir nicht durch den Compiler, da werde ich die Tage noch mal genauer mich mit beschäftigen.

Wenn man also das Vergleicht, dann stellt man fest: Bei größeren Array lohnt sich die FOR-NEXT-Variante auf jeden Fall.
Bei 3 Werten (wie bei mir) ist "von Hand" offenbar am Ressourcensparendsten.

Ich hoffe, ich kann den Wert für die MEMCOPY-Variante dann die Tage noch nachliefern.

Gruß Rainer
 
Hallo Rainer,

Dein Projekt hat ja bei den Analyse-Umfängen schon bald den Umfang einer Diplomarbeit :p

Hab mal noch in meinem graue Hirnkasten nachgesucht und bin auf die Funktion

Code:
Varptr()

gestoßen. Mittels dieser Funktion ist es unter BASCOM möglich "auszulesen" an welcher Speicherstelle im Speicher eine entsprechende Variable steht.

Vielleicht hilfts Dir beim MEMCOPY weiter. :D

Grüße ud gute Nacht,
Markus
 
Hallo Rainer,

Dein Projekt hat ja bei den Analyse-Umfängen schon bald den Umfang einer Diplomarbeit :p

Naja - ich programmiere halt schon lange, und habe immer versucht so effektiv wie möglich zu arbeiten. Dazu komm halt, dass ich nur die BASCOM-Demo habe und mir die 4kB dauernd zu eng werden - da schaut man dann schon mal genauer hin.

Hab mal noch in meinem graue Hirnkasten nachgesucht und bin auf die Funktion

Code:
Varptr()

gestoßen. Mittels dieser Funktion ist es unter BASCOM möglich "auszulesen" an welcher Speicherstelle im Speicher eine entsprechende Variable steht.

Vielleicht hilfts Dir beim MEMCOPY weiter. :D

Grüße ud gute Nacht,
Markus

Ich werds versuchen - abr nicht mehr heute....

Gruß und bis morgen

Rainer
 

Ü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)