Array Eintrag löschen

Hi ich schon wieder,

Ich hab ein Tastenpad 1,2,3,4,5,6,7,8,9,0 und möchte, dass man damit einen Array beschreiben und das Ergebnis als variable abspeichern kann. Den Array zu beschreiben ist ja nicht schwer.

myarray[index] = eine_Zahl;
index++;

Das problem ist aber das löschen, wenn man sich vertippt hat. Anfangs dachte ich das hier:

index--;
myarray[index] = 0;

Aber dann hab ich ja das Problem, das dort später ein Null ausgelesen wird. Ich hätte den index-slot aber gerne komplett leer, damit beim zusammenfügen nur die beschriebenen slots eine Zahl ergeben

Wie mach ich das?

Schreibe eine -1 hinein

1 Like

Wenn das Löschen sofort nach der Eingabe erfolgt, dann genügt das Vermindern des Indexes. Ansonsten alle nachfolgenden Elemente um 1 Position nach vorn kopieren.

Gruß Tommy

1 Like

Ich ahne, dass Du nur mit der Hälfte der Aufgabe rausrückst....
Eigentlich wäre der Tipp von @Tommy56 schon richtig, aber Du wirst vermutlich den Inhalt des Array irgendwo weiterverwenden wollen und stolperst jetzt darüber, dass da ja was drin steht und weiter verarbeitet wird.

Das passiert Dir aber immer, wenn Du das Array als numerisch definierst.
Das Ding ist mit 0 gefüllt.
Du musst also bei der Verarbeitung darauf achten, dass Du die Grenze von index nicht überschreitest.

Definierst Du das Array als char, könnte es helfen an der Stelle ein '\0' reinzuschreiben.
Das funktioniert aber nicht, wenn Du eine Korrektur machen willst und die Zahlen dahinter erhalten bleiben müssen.

1 Like

Für (rationale) Zahlen würde ich ein integer (eventuell ein unsigned Integer) verwenden.

bei Eingabe einer Ziffer

  • Ziffer entgegennehmen
  • bestehende Zahl mit 10 multiplizierend, Ziffer addieren.

beim Löschen (der letzten Ziffer):

  • bestehende Zahl durch 10 dividieren.
1 Like

myarray[] belegt RAM. Da steht einfach irgendwas drin. Das kannst du nicht verhindern.
Du kannst einen Wert für "Hier ist kein Inhalt" definieren und dann bei der Datenverarbeitung darauf prüfen.

Oder du sorgst dafür, das du nicht auf myarray[index] und höhere indexe zugreifst.

1 Like

Ein Array kann man nicht löschen.
Auch einzelne Elemente eines Arrays kann man nicht löschen.
Man kann definieren, dass ein bestimmter Wert "gelöscht" bzw. "undefiniert" bedeuten soll.
Ob man dafür 0 oder -1 oder 999 nimmt, hängt davon ab, was gültige Werte sind und aus welchem Datentyp das Array besteht.

Es gibt auch andere Datencontainer als Arrays.
Was ein Tastenpad mit einem Array zu tun hat, wäre für das Verständnis deines Problems auch interessant. (Was verstehst du unter einem Array?)

1 Like

Hi vielen Dank erstmal für die ganzen Antworten. Ja, war vielleicht etwas ungenau mit meiner Beschreibung (@my_xy_projekt) . Die der Plan ist, den Array (@michael_x ) also so wie ich es verstehe einen Strang an (in meinem Fall) Zahlen am ende zusammenzufügen zu einer Zahl (Die Eingabe vom User). Aber das was @Tommy56 sagt ist schon logisch, dann verschwindet ja die letzte Nummer im Array (oder?). Am Ende würde ich gerne den Array zusammenfügen und eine Zahl erhalten. Die Idee von @noiasca ist aber auch brilliant! Ich probier mal etwas rum, vielen vielen Dank, dieses Forum rettet mich!

Du hast so eine 4x4 Folientastatur oder irgendwie einzelne Tasten?
Wie löst Du das mit der Stelle und dem wieder zurück?
Und wo zeigst Du den Inhalt während der Eingabe an?

Ich hatte sowas mal für irgendjemanden geschrieben, da wurde auf einem Display angezeigt, was eingegeben und korrigiert wurde.

Ich würde das ja Zeichenweise mit einem char Array machen....

Du hast so eine 4x4 Folientastatur oder irgendwie einzelne Tasten?

Es ist eine 3x4 Tastertur, ähnlich einer folientastertur von softPath (Tastatur 12 Tasten 3 Pins, für Arduino & esp32, Keypad, Keyboard, Beschriftbar | eBay)

Wie löst Du das mit der Stelle und dem wieder zurück?

Ich Löse das mit einer CursorX variable, und setze nach Eingabe den Cursor einfach zurück.

Und wo zeigst Du den Inhalt während der Eingabe an?

Auf einem I2C LCD 2004. Hier ist mal der code aktuell:

#include <SoftPathElectronics.h>

CustomKeyboard keyboard;

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

  int a;
  int cursorX = 0;
  int old_inp;

void setup() {

    // Setup Keyboard
  Serial.begin(115200);

  String key = "3 12 6 1 1022 315 186 511 241 158 340 195 136 255 164 120 0 0 0 0";
  keyboard.setupKey(key);

  // Setup LCD
  lcd.init();
  lcd.backlight();

  lcd.blink();

}

void loop() {

  int inp = keyboard.getKeyPressed();
  
  if (inp > 0) {

    if (inp < 10 || inp == 11) {
      lcd.setCursor(cursorX, 0);
      lcd.print(inp);

      a = a * 10 + inp;
      cursorX ++;

      Serial.print(a);
      Serial.print(",");

      old_inp = inp;

      delay(250);
    }

    if (inp == 10 && cursorX > 0) {
      cursorX --;
      lcd.setCursor(cursorX, 0);
      lcd.print(" ");
      
      a = (a - old_inp) / 10;
      

      Serial.print(old_inp);
      Serial.print(",");

      Serial.print(a);
      Serial.print(",");

      delay(250);
    }

  }
  
}

Wie würdest du das mit einem Array lösen? (Größe ist 20)

1 Like

Ich hab mal geschaut, was die lib da macht.
Ok, das ist eine 3-Pin Tastatur, die auf einem Analogin Deine 12 Tasten abbildet.
Wenn Du jetzt 12 Tasten hast, dann wären die Tasten 0-9 Deine Ziffern.
Du könntest jetzt mit * und # nach links und rechts wandern.
Oder Du wanderst mit jedem Tastendruck immer nach rechts und gehst mit * zurück und löscht mit #
Bist Du am Ende der Zeile (20 auf dem Display) wird daraus eine Zahl gemacht.
Aber.....
Du hast schon bemerkt dass da nicht das passiert, was Du vor hast :slight_smile:
Wenn Du aus int a einen unsigned long a machst, kannst Du größere Zahlen darstellen.

Ich überleg mal, wie ich das mit der Editiermöglichkeit löse würde und schau mal, was die lib so hergibt, wenn ich später Ruhe habe.

1 Like

ich nehme an du bekommst für 0 - 9 exakt auch 0 bis 9 in dein int inp.
Frage: Was bekommst du in die Variable, wenn du # oder * drückst?

also 1 - 9 ist auch 1 - 9 aber #, 0 und * sind 10, 11 und 12

long war tatsächlich die Lösung... manchmal ist es so einfach. Der Code funktioniert jetzt soweit! * ist die Löschen-Taste und # ist Enter

Kann die Zahl negativ werden? Wenn nicht, dann wäre unsigned long besser.

Gruß Tommy

1 Like

ok, aber dann macht der in #10 gezeigte Sketch eh das was du ursprünglich machen wolltest oder gibt es jetzt noch einen offenen Punkt?

1 Like

Ich hab ihn nochmal umgeschrieben und hab jetzt deine Rechnung-Lösung benutzt! Vielen dank nochmal für die Idee !!

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.