Wenn ich das richtig sehe, definierst Du dir in der ersten Funktion ein Array BlockData[4] mit also 4 Elementen. In der darauffolgenden for-Schleife schreibst Du aber ab Index 5 hinein. D.h. Du schreibst in irgendwas, was im Speicher hinter deinem BlockData liegt.
ich nehme halt die Werte aus einem anderen Array (printarray[]), und es sind genau die Stellen die ich brauche.
ich habe mal ein Debug hinzugefügt ,um zu das Array unmittelbar nach der Deklarierung zu vergleichen.
komischerweise hat es sich die Werte eines Telegramm geholt, die ich meinem Sensor gesendet hatte.
int RFID::pruefung(){
if (pruef == true){
Serial.println("second print");
int *a;
unsigned char Block[7];
for (int i=0; i<7; i++){
Serial.println(Block[i], HEX);
}
a=Print_Block();
Serial.println("second print");
for (int i=0; i<4; i++){
Block[i]=*(a+i);
Serial.println(Block[i], HEX);
}
pruef= false;
}
}
debug
⸮aah⸮first print
0
0
0
0
second print
AA
7
7
68
8
E2
95
second print
49
D5
FC
8
⸮aah╪aah
pispa:
ich nehme halt die Werte aus einem anderen Array (printarray[]), und es sind genau die Stellen die ich brauche.
Fürs Lesen mag das ja in Ordnung sein ( ich weiß nicht, wie dein printarray definiert ist ). Aber fürs Schreiben in dein BlockData kannst Du dann nicht den gleichen Index nehmen. So wie Du das definiert hast, sind nur 0..3 als Index erlaubt. Und Du liest ja auch hinterher ab Index 0. Dann musst Du auch ab Index 0 hineinschreiben.
pispa:
ich habe mal ein Debug hinzugefügt ,um zu das Array unmittelbar nach der Deklarierung zu vergleichen.
Dein Array 'Block' legst Du dynamisch auf dem Stack an. Was da drin steht, bevor Du selbst was reingeschrieben hast ist reiner Zufall.
MicroBahner:
Fürs Lesen mag das ja in Ordnung sein ( ich weiß nicht, wie dein printarray definiert ist ). Aber fürs Schreiben in dein BlockData kannst Du dann nicht den gleichen Index nehmen. So wie Du das definiert hast, sind nur 0..3 als Index erlaubt. Und Du liest ja auch hinterher ab Index 0. Dann musst Du auch ab Index 0 hineinschreiben.
ich habe das mal anders gemacht, sodass ich nichts mehr reinschreiben muss. es hilft immer noch nicht.
Einfach weglassen hilft doch nicht. Was gibst Du denn dann als Array-Pointer zurück?
Das wäre z.B. eine Möglichkeit:
for (int i=5; i<9; i++){
BlockData[i-5]=printArray[i]; // <--in BlockData mit einem negativen Offset
// reinschreiben, so dass es da ab 0 losgeht
Serial.println(BlockData[i], HEX);
}
Natürlich würde es auch andersrum gehen: For-Schleife ab 0, und für printArray einen positiven Offset verwenden
geworden?
Ausserdem fehlt deine Test-Umgebung
setup, loop , globale Variable
Vielleicht findest du deinen Fehler sogar selbst, wenn du ein Beispiel (minimal aber komplett) zusammenstellst, das nur dazu dient, das Problem zu zeigen.
geworden?
Ausserdem fehlt deine Test-Umgebung
setup, loop , globale Variable
Vielleicht findest du deinen Fehler sogar selbst, wenn du ein Beispiel (minimal aber komplett) zusammenstellst, das nur dazu dient, das Problem zu zeigen.
BlockData war überflüssig.
das ist die minimierte Version, um den Fehler zu finden
ich benutze halt dieses Array ausserhalb der Bibliothek, deswegen soll es aus der Funktion zurückgegeben werden. das Unterprogramm Pruefung dient eigentlich nur zum Testen.
so möchte mein Programm eigentlich verwenden
in der cpp Datei
combie:
OK, mag sein, vielleicht ist das eine Philosophie...
Aber spätestens, wenn der Dolch im Rücken steckt, könnte man daran denken, dass so manche Philosophie schon zu praktischer Anwendung gekommen ist.
So wie die anfängliche Array Bereichsüberschreitung.
Auch so ein Dolch.
Und hier noch:
(nur auf den Irrtum reduziert)
byte* RFID::Print_Block() {
return printArray;
return -2;
return -4;
}
Alle meine Nackenhärchen stellen sich dabei auf.
Insgesamt (aus meiner Sicht) 3 fette Böcke (NoGos) in ca 20 Zeilen Code
Ja, hier könnte eine etwas weiter entwickelte Philosophie Wirkung zeigen.
du könntest mir einfach verraten wie ich den beheben soll.
es kann ja sein, dass mein Wissen zu dem Thema nicht so breit ist und die Fehler, die du findest , für mich nicht offensichtlich sind.
void PrintBlocks(){
int Pruefbyte;
Pruefbyte=RFID.Print_Block();
if (Pruefbyte==(-4))
return NULL;
Auch der Abschnitt ist eher seltsam.
void und return NULL passen nicht gut zusammen.
Auch Pruefbyte==(-4) erscheint mir sehr seltsam.
In meiner bescheidenen Weltsicht, kann ein Byte niemals negative Werte annehmen.
Das sind hier aber eher philosophische Fragen.
:o :o :o
Ja, vielleicht......
du könntest mir einfach verraten wie ich den beheben soll.
es kann ja sein, dass mein Wissen zu dem Thema nicht so breit ist und die Fehler, die du findest , für mich nicht offensichtlich sind.
Nein, kann ich nicht!
Bisher zeigst du nur untestbare Fragmente.
Auch liegt das Gesamtkonzept noch im dunklen.
byte* RFID::Print_Block() {
return printArray;
return -2;
return -4;
}
Hier sagt die Filosofie ganz klar:
Ein Pointer ist ein Pointer und muss ein Pointer bleiben.
Man darf ihn NULL setzen, oder nullptr, aber nicht auf -2 oder -4.
Es sei denn, man hat extrem gute Gründe dafür.
z.B. Absolute Hardware Adressierung, aber dafür fehlt dann noch das volatile.
Das unterdrückt vielleicht Warnungen (wenn sie denn überhaupt aktiviert sind), aber ist immer noch sinnlos. Zeiger sind Adressen. Was ist eine negative Adresse? Da wird sowieso ein Überlauf/Unterlauf statt finden