Programmabsturz bei Array zuweisung

3Cyb3r

Erfahrenes Mitglied
Hallo
in meine Operator überschreite ich die Array Größe irgendwoe und das führt zu einem Programmabsturz, wenn ich micht nicht irre.
Doch ich finde gerade nicht die Stelle (irgnedetwas übersehe ich).
Ich wäre euch sehr verbunden, wenn ihr euch das ganze einmal anseht:

C++:
#define DISP_LENGTH		 16    // -- sichtbare Zeichen pro Zeile des Displays		||

void LCD_Display::operator >> (const char *s)	
{ 
	int  k = 0,
		 i, 
		 j, 
		 l,
		 LA = DISP_LENGTH - 1,
		 LE = 1,
		 len = strlen(s);
	char buffer[DISP_LENGTH + 1];
	do
	{
		for(i = 0; i < LA; i++)
			buffer[i] = ' ';
		for(j = 0; j < LE; j++)
		{
			if((LA + j) < DISP_LENGTH)
				buffer[LA+j] = s[j];
		}
		for(l = 0; l < LE; l++)
		{
			if(k >= len && (LA+len+l) < DISP_LENGTH)
				buffer[LA+len+l] = ' ';
		}
		buffer[DISP_LENGTH] = '\0';	
		home();
		_puts_delay(buffer);		

		LA--;
		LE++;
		k++;
	}
	while(k < (len + DISP_LENGTH));
}

Danke
 
Bracuhst du alle ausformulierten Funktionen die verwendet werd
Testprogramm ist z.B.
C++:
# include "LCD_Display.h"



int main()
{
    LCD_Display lcd;      
    lcd.init(DISP_ON);
    lcd.cls();
    lcd>>"LAUFSCHRIFT";
    while(true);    
    return 0;
}
EDIT:
Alle andern Funktionen arbeiten einwandfrei ist auch schon alles überüft es leigt zu 100% in diesem Operator
 
Ja, das denke ich auch. Der Stream-Operator will den Datenstrom entweder vom Stream A nach Stream B schreiben oder von Stream A von Stream B lesen.

Was du hier machen willst, ist die Ausgabe von lcd an den statischen String "LAUFSCHRIFT" schreiben. Das kann natürlich nicht funktionieren.

lcd<<"LAUFSCHRIFT" sollte eher funktionieren. Natürlich musst du den Operator in der Klasse auch umschreiben.
 
Neine den andren Operator habe ich schon in gebrauch.
Und die Laufschrift wird ja auch angezeigt nur dann eben entweder unendlich lange oder total absturz.
Und wieso sollte der Operator jetzt nicht funktionieren kannst du mri das bitte noch einmal erklären?

EDIT:
Hmm was du da geschriebn hast stimmt doch kein Stück!!
Ich definieren den Operator doch selber da wird nichts geschrieben....
Es wird nur das gemacht was ich sage und es leigt meiner Meinung nach an dem char Array

EDIT2:
Habe ich das ganze mit dem Operator überladen falsch verstanden oder du?
 
Zuletzt bearbeitet:
Ja, vergiss, was ich geschrieben habe...

Edit: Diese Prüfung halte ich für sinnlos:

C++:
            if(k >= len && (LA+len+l) < DISP_LENGTH)

Die zweite Kondition eigentlich immer false sein. LA+len+l ergibt hier 15+11+0, was 26 entspricht und damit nicht kleiner als 16 sein kann. Da ich nicht weiß, was du damit bezwecken willst, halte ich es erstmal für bedenklich. Ich sehe zwar, das du LA dekrementierst, und da ich den restlichen Code nicht verstehe, könntest du da sogar in einen Negativen Bereich laufen.
 
Zuletzt bearbeitet:
In Zeile 19:
C++:
if((LA + j) < DISP_LENGTH)
Du überprüfst hier, ob LA plus eine Zahl größer/gleich 0 kleiner als DISP_LENGTH (LA+1) ist.
D.h. der Code in Zeile 20 wird nur einmal ausgeführt (wenn j = 0).
Wofür brauchst du dann eine Schleife?

//Edit:
In Zeile 24 ist die zweite Bedingung (LA+len+l) < DISP_LENGTH auch nur einmal erfüllbar.

//Edit2: Sorry, hab übersehen, dass AL später noch verkleinert wird...
 
Zuletzt bearbeitet von einem Moderator:
Jo, der Code ist ziemlich verwirrend. Vielleicht könntest du ein paar Kommentare einfügen, was welcher Programm-Block machen soll. Das würde die Fehlersuche evtl. etwas erleichtern.
 
Ja ok Danke für eure Bemühungen.
Ich habe herausgefunden das der Code einwandfrei funktioneirt so wie er soll. Das Problem lag darin,
dass durch voherige Programmierung des Mikrocontrollers mit anderen Werten irgend wo im Speicher wohl etwas schiefgelaufen ist.

und zu erklärung des Codes wer es wissen möchte:
Das ganze ergibt Laufschrift auf dem LCD Display:

nun haben wir z.B. den String "Hallo"

äußerer Schleifen Durchlauf stehen vone
Stellen des LCD Displays
__0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1. " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "H"
2. " " " " " " " " " " " " " " " " " " " " " " " " " " " " "H" "a"
3. " " " " " " " " " " " " " " " " " " " " " " " " " " " "H"a" "l"
4. " " " " " " " " " " " " " " " " " " " " " " " " "H" "a" "l" "l"
5. " " " " " " " " " " " " " " " " " " " " " " "H" "a" "l" "l" "o"
6. " " " " " " " " " " " " " " " " " " " " "H" "a" "l" "l" "o" " "
.............
n-2. "l" "o" " " " " " " " " " " " " " " " " " " " " " " " " " " " "
n-1. "o" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "
n. " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "

Leider werden die doppelen Leerzeichen rausgenommen -.-
 
Zuletzt bearbeitet:
Zurück