Mir fehlen 1KB Speicher

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Mir fehlen 1KB Speicher

      Moin!
      Folgende sub belegt 4% Speicher meines mega328p:

      Zeilen_auswahl:
      If La2 = 1 Or La2 = 9 Or La2 = 17 Or La2 = 25 Or La2 = 33 Or La2 = 41 Or La2 = 49 Or La2 = 57 Then
      Zeile = 1
      End If
      If La2 = 2 Or La2 = 10 Or La2 = 18 Or La2 = 26 Or La2 = 34 Or La2 = 42 Or La2 = 50 Or La2 = 58 Then
      Zeile = 3
      End If
      If La2 = 3 Or La2 = 11 Or La2 = 19 Or La2 = 27 Or La2 = 35 Or La2 = 43 Or La2 = 51 Or La2 = 59 Then
      Zeile = 7
      End If
      If La2 = 4 Or La2 = 12 Or La2 = 20 Or La2 = 28 Or La2 = 36 Or La2 = 44 Or La2 = 52 Or La2 = 60 Then
      Zeile = 15
      End If
      If La2 = 5 Or La2 = 13 Or La2 = 21 Or La2 = 29 Or La2 = 37 Or La2 = 45 Or La2 = 53 Or La2 = 61 Then
      Zeile = 31
      End If
      If La2 = 6 Or La2 = 14 Or La2 = 22 Or La2 = 30 Or La2 = 38 Or La2 = 46 Or La2 = 54 Or La2 = 62 Then
      Zeile = 63
      End If
      If La2 = 7 Or La2 = 15 Or La2 = 23 Or La2 = 31 Or La2 = 39 Or La2 = 47 Or La2 = 55 Or La2 = 63 Then
      Zeile = 127
      End If
      If La2 = 8 Or La2 = 16 Or La2 = 24 Or La2 = 32 Or La2 = 40 Or La2 = 48 Or La2 = 56 Or La2 = 64 Then
      Zeile = 255
      End If
      return

      Hat jemand eine Idee, wie man diesen Code so umschreiben kann, daß er weniger Speicher frisst?
      Das wäre grossartig!
      Vielen Dank
    • Ich habe da jetzt keinen fertigen Code aber immerhin eine nicht ausprobierte Idee.
      Von daher weiß ich nicht, ob das jetzt Speicher spart a_38_b45e201d

      Ich würde (eventuell in einer Sub den ersten Wert mit dem Befehl MOD durch 8 dividieren, wenn das Ergebnis (was ja dem Rest der Division entspricht) jeweils dem ersten Wert entspricht, trifft die Bedingung zu

      Also in etwa so (eventuell geht es ja sogar ohne Sub.
      Möglicherweise ist SELECT-CASE gegenüber IF THEN auch nicht so speicherhungrig.

      BASCOM-Quellcode

      1. If Check(La2) = 1 Then
      2. .
      3. .
      4. If Check(La2) = 2 Then
      5. .
      6. .
      7. Function Check(ByVal pValue As Byte) As Byte
      8. Check=pValue MOD 8
      9. End Function
    • Hatten wir das Problem nicht schon mal?
      Ich würde auch Richtung zitronenfalter gehen und mit mod 8 arbeiten. Das Ergebnis könnte man evtl gleich für das Ergebnis der Zeile verwenden. Da müsste ich aber das Denken beginnen und dazu ist es noch bisschen früh am Tag.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • @Trexis5
      select case ist in der Tat etwas Speicherschonender als if then. So jedenfalls meine Erfahrung. Sonst möge mich man korrgieren...
      Ich müßte dann in meinem Fall 64 cases schreiben- richtig? Oder wie bekommt man die Aufzählung hin, daß für Zeile = 1 acht verschiedene Werte gelten?

      select case La2
      case 1 : zeile = 1
      case 2 : zeile = 3
      case 3 : zeile = 7
      ****
      case 64 : zeile= 255

      Am schönsten wäre : case 1,9,17,25,33,41,49,57 : zeile = 1
      geht aber so nicht.
    • jetzt schau dir halt mal die Funktion 'mod' (modulo, der ganzzahlige Rest einer Division) an.
      Um zeile=1 zu erhalten hat La2 mod 8 immer das Ergebnis 1
      Auswahl =La2 mod 8
      select case auswahl
      case 1:Zeile=1
      case 2:Zeile=3
      ...
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      jetzt schau dir halt mal die Funktion 'mod
      hab ich gerade und es funktioniert!

      Zeilen_auswahl:
      Check = La2 Mod 8
      Select Case Check
      Case 0 : Zeile = 255
      Case 1 : Zeile = 1
      Case 2 : Zeile = 3
      Case 3 : Zeile = 7
      Case 4 : Zeile = 15
      Case 5 : Zeile = 31
      Case 6 : Zeile = 63
      Case 7 : Zeile = 127
      End Select
      Return

      Das spart mir 3% Speicher. Viel besser, als ich erhofft hatte!
      Vielen Dank Zitronenfalter/ tschoeatsch
      Das wars schon (für heute)
    • Jetzt hat es mich auch erwischt. Da hab ich heute Morgen eine Antwort geschrieben, während wahrscheinlich tschoeatsch geantwortet hat. Ich habe die Antwort normal abschicken können und auch im Thread gesehen. Auf der Hauptseite erschien meine Antwort auch bei den letzten Beiträgen. Jetzt bin ich wieder online und nichts von meinem Beitrag ist mehr zu sehen ?( ?( ?(

      Auch ein automatisches wiederherstellen geht nicht. Das war sonst möglich wenn die Antwort nicht abgesendet werden konnte. :cursing:

      Mein Ansatz wäre eventuell gewesen mit Datazeilen zu arbeiten. Die OR- Abfrage hätte dann weniger oft in´s Programm geschrieben werden müssen, was eigentlich eine Speichereinsparung bringen müßte,
      Wenn das die Lösung ist, möchte ich mein Problem wieder haben.
    • Yap, das hatten wir schon. Der Stil ist auch ungeeignet - Spagetti-Code. Schlecht zu lesen und schlecht zu warten.
      Die Vorschläge die kamen sind beide gut. Sofern keine Rechenregel dranhängt könnte man auch mit einer DATA-Liste arbeiten und mit LOOKUP() usw. suchen.

      PS: Auch mein Beitrag blieb hängen...
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
    • Der Wert für die Zeile kann man auch berechnen, wenn Zeile ein byte ist. Der Rechenweg wäre
      Zeile=La2 mod 8 'Wertebereich 0...7
      Zeile=2^Zeile 'Wertebereich 1,2,4,8,16,32,64,128
      Zeile=Zeile-1 'Wertebereich 0,1,3,7,15,31,63,127
      if zeile=0 then zeile=255
      Ob das jetzt platzsparender als die 8 case-Fälle sind, weiß ich nicht, müsste man checken.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tschoeatsch ()

    • tschoeatsch schrieb:

      Zeile=La2 mod 8 'Wertebereich 0...7
      Zeile=2^Zeile 'Wertebereich 1,2,4,8,16,32,64,128
      Zeile=Zeile-1 'Wertebereich 0,1,3,7,15,31,63,127
      if zeile=0 then zeile=255
      krass...auch DAS funktioniert! Auch dieser Code wird mir mit 3% Speicherersparnis angezeigt.
      So und jetzt habe ich einen kniffligen Fall, bei dem ich überhaupt keinen Lösungsansatz habe.
      Folgender Code frisst 5% Speicher vom Atmega 328:

      zaehler_loescher:
      Hb6 = Tt : Hb8 = Tt : Hb9 = Tt : Hb10 = Tt : Hb11 = Tt : Hb12 = Tt : Hb13 = Tt : Hb14 = Tt : Hb15 = Tt : Hb16 = Tt
      Hb17 = Tt : Hb18 = Tt : Hb19 = Tt : Hb20 = Tt : Hb21 = Tt : Hb22 = Tt : Hb23 = Tt : Hb24 = Tt : Hb25 = Tt : Hb26 = Tt
      Hb27 = Tt : Hb28 = Tt : Hb29 = Tt : Hb30 = Tt : Hb31 = Tt : Hb32 = Tt : Hb33 = Tt : Hb34 = Tt : Hb35 = Tt : Hb36 = Tt
      Hb37 = Tt : Hb38 = Tt : Hb39 = Tt : Hb40 = Tt : Hb41 = Tt : Hb42 = Tt : Hb43 = Tt : Hb44 = Tt : Hb45 = Tt : Hb46 = Tt
      Hb47 = Tt : Hb48 = Tt : Hb49 = Tt : Hb50 = Tt : Hb51 = Tt : Hb52 = Tt : Hb53 = Tt : Hb54 = Tt : Hb55 = Tt : Hb56 = Tt
      Hb57 = Tt : Hb58 = Tt : Hb59 = Tt : Hb60 = Tt : Hb61 = Tt : Hb62 = Tt : Hb63 = Tt : Hb64 = Tt : Hb65 = Tt : Hb66 = Tt
      Hb67 = Tt : Hb68 = Tt : Hb69 = Tt : Hb70 = Tt
      Return

      Wie kann man 64 Variablen platzsparender "gleich TT" setzen?
    • Verwende statt Einzelvariablen ein array. Dann kanst du mit den indizes und for..next-Schleifen arbeiten.
      Deine Variablen heißen dann nicht 'Hb59' sondern 'Hb(59)' als Beispiel.

      Was ist mit Hb7? Ein Sonderfall?
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • monkye schrieb:

      Yap, das hatten wir schon. Der Stil ist auch ungeeignet - Spagetti-Code. Schlecht zu lesen und schlecht zu warten.
      naja...bei aller Dankbarkeit für diese online-Hilfe...
      Ich muss mal hier eine Lanze brechen für alle Anfänger, Bastler,Tüftler, die hauptberuflich etwas völlig anderes machen und hin und wieder mal in Bascom programmieren:
      Da ist man schon froh, wenn ein Spaghetti- Code (Spaghetti mit "H" in der Mitte) ÜBERHAUPT zum Ziel führt. Die meisten Controller haben ja für die meisten Anwendungen mehr als genug Speicher.
      Die meisten Anwendungen sind nicht zeitkritisch- jedenfall nicht im MHZ-Bereich. Also was solls? Tschoeatsch schrieb mal: "gehender als gehen geht nicht". Wenns funktioniert, ist es legitim.
      Ich als Kaufmann kenne den Spruch: " Wer den Auftag bringt, hat Recht!"
      @monkeye "Der Stil ist ungeeignet". Ungeeignet ist er, wenn er nicht funktioniert oder den Speicher sprengt- ansonsten ist ein Code, der funktioniert überaus geeignet .
      @monkeye "Schlecht zu lesen und schlecht zu warten". Das ist gerade NICHT der Fall. Die Spaghetti- codes (wieder mit "H" in der Mitte) haben Nachteile:
      -Sie blähen das Programm auf
      - sind unübersichtlich (scrollen ohne Ende)
      - bremsen die Programmabarbeitung

      ABER: Sie sind hervorragend zu lesen und hervorragend zu warten, weil sie so geschrieben sind, wie wir Menschen denken: " wenn dies und das passiert, dann sollst Du jenes und solches machen".
      Ich bevorzuge die technische, abstrakte Variante. Ich kann mich begeistern für "klein- aber oho!" , kompakte Programme mit minimaler Hardware, die Riesen-Sachen machen.
      Hier ist ein Beitrag "Herr, schenke mir 6 bytes", oder so ähnlich. Was hat der Kerl nicht alles aus so einem kleinen, Attiny85 herausgekitzelt. Wahnsinn!
      Ich habe aber auch Respekt vor solchen Einsteigern, die schnell Ergebnisse haben wollen und so programmieren, wie sie logisch denken (Spaghetti-codes).
      Das war das Wort zum Sonntag ;)
      Gruß
    • Toll, jetzt will ich Antworten und mein Post von heute Morgen erscheint wieder a_27_b277ca12 a_28_2c02f089

      Spaghetti seh ich eher technisch als stranggepreßtes Hartweizengrießerzeugnis.

      Zurück zum Thema: Logisch (in menschlicher Denkweise) kann man auch ohne Spaghetticode programmieren. Zumindest mit einem strukturierten Hauptprogramm, welches einzelne Arbeitsschritte bei Bedarf über Gosub in Unterprogrammen abarbeitet.

      Ich bemühe mich beim Programmschreiben auch immer um Übersichtlichkeit. Ich vermeide es zum Beispiel konsequent Datenrichtungsregister kompakt zu beschreiben (sieht halt klug aus), sondern schreibe das fein säuberlich getrennt, so sehe ich mit einem Blick "was Sache ist". Ich kommentiere viel (meist mehr als auf den ersten Blick notwendig), damit ich mich später schnell in das Programm reindenken kann und strukturiere gerne mit optischen Linien (Kommentarzeilen: '------------------------------)

      Ich finde nichts verwerfliches daran auch mal einen ausführlicheren Weg zu wählen, vergebe jedem Ausgang, jedem Eingang und jeder Variablen einen eindeutigen Alias, der es mir erlaubt das Progamm sozusagen im "Klartext" zu lesen. Gerade bei umfangreichen Programmen, die mehr als eine LED blinken lassen wird es anderenfalls schnell unübersichtlich.

      All das geht dann ohne Spaghetticode und langes scrollen, weil ich jedes Unterprogramm über den Codeexplorer mit einem Mausklick aufrufen kann. Meine neueste Erkenntnis ist (man lernt ja nie aus), dass sich an einem Arbeitsplatz mit zwei Monitoren hervorragend programmieren läßt, da man auf dem zweiten Monitor immer Codeschnipsel, welche man per Copy & Past aus anderen Programmen übernehmen will im Blick hat.

      Gruß Christian
      Wenn das die Lösung ist, möchte ich mein Problem wieder haben.
    • @ichbinsmoin: Danke für Deine Sichtweise.

      Mein Geld verdiene ich nicht mit Programmieren. Dafür habe ich beruflich täglich mit den Wirkungen der Programmierungen zu tun. Die Ratschläge die im Forum von den erfahrensten Entwicklern gegeben werden sind oft nicht als „Züchtigung“ der Einsteiger gedacht, sondern als Anregung zum Verständnis und zum anstoßen eines kontinuierlichen Verbesserungsprozesses.

      Und das Schreiben von

      BASCOM-Quellcode

      1. Hb6=Tt:Hb7=Tt....
      ist für Dritte und nach vielleicht 2 Jahren für Dich selbst schwer zu durchsteigen.

      Also ich würde meine Arbeitsweise strukturiert nennen und kann es nur empfehlen, aber ich möchte Dich nicht missionieren. :saint:
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
    • monkye schrieb:

      nicht als „Züchtigung“ der Einsteiger gedacht
      schön gesagt! :)

      tschoeatsch schrieb:

      Was ist mit Hb7? Ein Sonderfall?
      ach...das ist Dir aufgefallen? Respekt! HB steht bei mir für "Hilfsbyte" und die 7 ist tatsächlich für andere Zwecke. Ist irgendwie so gewachsen. Da bin ich vielleicht nicht ganz so strukturiert wie Monkye ;)

      tschoeatsch schrieb:

      Verwende statt Einzelvariablen ein array.
      das hört sich genau nach dem an, was ich suche. Ohne genau zu wissen, was das ist, hat man das ja meist im Gefühl, ob einem das was bringt.
      Ich versuche mich da mal reinzufuchsen. Mit Arrays hatte ich bislang keine Berührungspunkte (außer mit dem codeschnipsel, den Du mir mal gepostet hast).
      Wenn ich nicht mehr weiter weiß, melde ich mich noch mal zum Thema array.
      ps.: so so...ein Franke! Meine Ex-Freundin ist Fränkin: "A scheißerla graigst!" aber das nur so nebenbei
    • ich bin einer von denen, die Wörter als Bilder abspeichern und beim Lesen vergleicht mein Gehirn den Speicherinhalt mit dem gelesenen Wort.
      Wenn da etwas nicht übereinstimmt, gibts "Alarm". Blöd nur, daß ich jetzt oft "MONKYE" gelesen habe. Mir würde wohl nicht mehr auffallen, wenn jemand tatsächlich
      den Affen meint, aber die Buchstaben vertauscht hat :D