ATmega328 Classen

Antworten
Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

ATmega328 Classen

Beitrag von Mathias »

Bei folgendem Mini-Code, bleibt der Programmablauf bei Create hängen.
Man sieht es, weil die LED an BP5 nicht an geht.

Code: Alles auswählen

type
  TMyClass = class
  end;
var
  MyClass: TMyClass;
begin
  MyClass := TMyClass.Create;
  DDRB := 1 shl BP5;
  PORTB := 1 shl BP5;


Soll ich da einen Bugreport schreiben ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: ATmega328 Classen

Beitrag von Timm Thaler »

Du möchtest keine Klassen auf dem AVR verwenden.

Man kann das machen, aber es bringt im Code überhaupt nichts und bläht das Hexfile unnötig auf.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ATmega328 Classen

Beitrag von Mathias »

Du möchtest keine Klassen auf dem AVR verwenden.
Schlussendlich nicht, obwohl auch Arduino mit Classen arbeitet.
Das ich eine Classe verwenden wollte, ich hatte eine Classe für eine LCD-Anzeige, welche I²C auf dem PC verwendete, da musste ich nur eine kleine Änderung für den ATmega328 machen. Mit Object anstelle von Classe geht es. On es Sinn macht, auch auf das Object zu verzichten, kann ich noch nicht sagen. Besonders dann, wen man mehrere LCD-Anzeigen in Betrieb nehmen will. In dem Object hat es mehrere Variablen, welche den Zustand der Anzeige und die I²C Adresse speichert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: ATmega328 Classen

Beitrag von kupferstecher »

Dynamische Klassen (class) dürften nicht funktionieren, das setzt ja eine dynamische Speicherverwaltung voraus. Bei Create wird der Speicher angefordert, ich kann mir aber irgendwie nicht vorstellen, dass ein Speichermanager implementiert ist.

Statische Objekte (object) funktionieren aber. Ich verwende das auch sehr gern, macht den Code oft lesbarer. Auf dem Desktop ist object eher ungewöhnlich, obwohl die Nutzung eigentlich komfortabler ist als bei Klassen, solange man eben die Instanzen zum Zeitpunkt des Programmierens schon zuweisen kann. Create gibts entsprechend nicht, der Speicher wird bei der Variablendeklaration reserviert (im Beispiel nach "var").

Z.B.

Code: Alles auswählen

 
Type TUART = object
  Procedure Init(UARTChannel: Byte);
  Procedure Send(AValue: Byte);
  Procedure Send(AValue: UInt32);
end;
 
var
  UART1, UART2: TUART;
 
begin
  UART1.Init(1);
  UART2.Init(2);
 
  UART1.Send(123);
end;

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ATmega328 Classen

Beitrag von Mathias »

Dynamische Klassen (class) dürften nicht funktionieren, das setzt ja eine dynamische Speicherverwaltung voraus.

Das wird wohl auch der Grund sein, wieso das eine dynamische Array nicht geht.

Auf dem Desktop ist object eher ungewöhnlich, obwohl die Nutzung eigentlich komfortabler ist als bei Klassen, solange man eben die Instanzen zum Zeitpunkt des Programmierens schon zuweisen kann.
Da muss ich zustimmen, ein Object ist vergleichbar mit den Classen von C++, man kann es statisch und dynamisch verwenden,
Eine Pascal-Classe funktioniert nur dynamisch.
C++ kennt nur Classen und keine Objecte.
Das ist eines der wenigen Vorteile, die C++ gegenüber Pascal hat.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: ATmega328 Classen

Beitrag von kupferstecher »

Mathias hat geschrieben:
Dynamische Klassen (class) dürften nicht funktionieren, das setzt ja eine dynamische Speicherverwaltung voraus.

Das ist eines der wenigen Vorteile, die C++ gegenüber Pascal hat.

Wo siehst du einen Vorteil?
C++ kenn ich nicht, aber es scheint, dass man dynamische Instanzen immer mit Pointern verwalten muss (eher hässlich).

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ATmega328 Classen

Beitrag von Mathias »

C++ kenn ich nicht, aber es scheint, dass man dynamische Instanzen immer mit Pointern verwalten muss (eher hässlich).

Das ist aber bei Objecten von Pascal auch der Fall. Hier einen Ausschnitt aus Turbo-Vison von TP:

Code: Alles auswählen

var
  Window: PMeinFenster;
  Dialog: PMeinDialog;
begin
  Window := New(PMeinFenster, Init(R, 'Das erste Fenster von Koala',  wnNoNumber));
  DeskTop^.Insert(Window);

Hier braucht es auch ^ .
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten