Error bei Array benutzung

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
e445697
Beiträge: 11
Registriert: Fr 22. Jun 2012, 11:46

Error bei Array benutzung

Beitrag von e445697 »

Hallo Leute,
Ich bräuchte mal eure Hilfe.
Bei der Array Benutzung gibt Lazarus mir immer den Fehler ( Incompatible types: got "TTranslateString" expected "Char") raus.
Ich ahbe schon lange überlegt komme aber nicht auf den Fehler.

Danke für die Schnelle Hilfe.

Quelltext:

Code: Alles auswählen

unit Unit3;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
 
 
 
  { TForm3 }
 
  TForm3 = class(TForm)
 
//Hier sind 30 Edit Fenster
 
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
   type
    TSchueler = record
      Schueler: String;
  end;
 
    type
      TKlasse = record
        Kurs1: TSchueler;
        Kurs2: TSchueler;
        Kurs3: TSchueler;
        Kurs4: TSchueler;
        Kurs5: TSchueler;
        Kurs6: TSchueler;
      end;
 
var
  Form3: TForm3;
  Klasse:TKlasse;
  Schueler:TSchueler;
 
implementation
 
uses
  Unit1, Unit2, Unit6;
 
{$R *.lfm}
 
{ TForm3 }
 
procedure TForm3.Button1Click(Sender: TObject);
begin
 
  {--------------------Namen in die Arrays Speichern-------------------------}
   SetLength(Klasse.Kurs1.Schueler,3);
 
   Klasse.Kurs1.Schueler[1]:=Edit1.Text)
   Klasse.Kurs1.Schueler[2]:=Edit2.Text;
   Klasse.Kurs1.Schueler[3]:=Edit3.Text;
   Klasse.Kurs1.Schueler[4]:=Edit4.Text;
   Klasse.Kurs1.Schueler[5]:=Edit5.Text;
   Klasse.Kurs1.Schueler[6]:=Edit6.Text;
   Klasse.Kurs1.Schueler[7]:=Edit7.Text;
   Klasse.Kurs1.Schueler[8]:=Edit8.Text;
   Klasse.Kurs1.Schueler[9]:=Edit9.Text;
   Klasse.Kurs1.Schueler[10]:=Edit10.Text;
   Klasse.Kurs1.Schueler[11]:=Edit11.Text;
   Klasse.Kurs1.Schueler[12]:=Edit12.Text;
   Klasse.Kurs1.Schueler[13]:=Edit13.Text;
   Klasse.Kurs1.Schueler[14]:=Edit14.Text;
   Klasse.Kurs1.Schueler[15]:=Edit15.Text;
   Klasse.Kurs1.Schueler[16]:=Edit16.Text;
   Klasse.Kurs1.Schueler[17]:=Edit17.Text;
   Klasse.Kurs1.Schueler[18]:=Edit18.Text;
   Klasse.Kurs1.Schueler[19]:=Edit19.Text;
   Klasse.Kurs1.Schueler[20]:=Edit20.Text;
   Klasse.Kurs1.Schueler[21]:=Edit21.Text;
   Klasse.Kurs1.Schueler[22]:=Edit22.Text;
   Klasse.Kurs1.Schueler[23]:=Edit23.Text;
   Klasse.Kurs1.Schueler[24]:=Edit24.Text;
   Klasse.Kurs1.Schueler[25]:=Edit25.Text;
   Klasse.Kurs1.Schueler[26]:=Edit26.Text;
   Klasse.Kurs1.Schueler[27]:=Edit27.Text;
   Klasse.Kurs1.Schueler[28]:=Edit28.Text;
   Klasse.Kurs1.Schueler[29]:=Edit29.Text;
   Klasse.Kurs1.Schueler[30]:=Edit30.Text;
 
  Form3.Close;
 
end;
 
end.
 

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: Error bei Array benutzung

Beitrag von Linkat »

Bei SetLength werden nur 3 Felder angelegt. Wahrscheinlich hast du die 0 vergessen. Außerdem musst du die Felder von Index 0 bis 29 ansprechen.

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

e445697
Beiträge: 11
Registriert: Fr 22. Jun 2012, 11:46

Re: Error bei Array benutzung

Beitrag von e445697 »

Das ich nur 3 Felder anspreche ist mir Bekannt und soll auch nur zum Testen sein.
Wenn ich bei 0 anfange, gibt er mir einen weiteren Fehler raus den ich mit dem starten bei 1 umgehen kann.

Gruß

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Error bei Array benutzung

Beitrag von baumina »

Laut Deklaration hat so jeder Kurs genau nur einen Schüler (Kurs1: TSchueler;), du hast keine Arrays definiert.

Edit: Arrays werden so definiert : array [<startindex> .. <endindex>] of <Datentyp>;
.

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Error bei Array benutzung

Beitrag von theo »

Wie Baumina schon sagt, du hast zwar das Wörtlein "Array" im Titel dieses Threads aber nicht im Code. :wink:

https://www.google.de/search?q=freepascal+wiki+array

wp_xyz
Beiträge: 5174
Registriert: Fr 8. Apr 2011, 09:01

Re: Error bei Array benutzung

Beitrag von wp_xyz »

Da du keine Arrays deklarierst, sprichst du mit der linken Seite von "Klasse.Kurs1.Schueler[1]:=Edit1.Text" das 1. Zeichen es Strings "Klasse.Kurs1.Schueler" an. Das ist ein "char". "Edit1.Text" ist ein String. Einem einzelnen Zeichen kann man keinen ganzen String zuweisen. Daher ist die Fehlermeldung absolut logisch. Aus demselben Grund kannst du auch das Element 0 nicht ansprechen, weil die Nummerierung der Zeichen eines Strings bei 1 beginnt.

ruewa
Beiträge: 153
Registriert: Sa 12. Apr 2014, 14:43

Re: Error bei Array benutzung

Beitrag von ruewa »

Hallo e445697,

wie baumina schon sagte, greifst Du auf ein Array zu, das nirgendwo existiert bzw. definiert ist. Dein Fehler ist, daß Du Records und Arrays gedanklich in einen Topf geworfen hast und der Meinung warst, mit der Definition von Records könntest Du auf sie als Arrays zugreifen. Das sind aber zwei ganz unterschiedliche Datenstrukturen.

Schau Dir nochmal in der Hilfe bzw. im Internet die Anwendungzwecke von Records und Arrays an. Denn sowohl Deine Definition von TKlasse (ich nenn das lieber mal "TSchulKlasse", um die Verwechslungsmöglichkeit mit dem Klassenbegriff von Pascal auszuschließen) als auch die von TSchueler sind so erstmal unsinnig und wären besser als Array definiert, also z.B. so:

Code: Alles auswählen

type
 
  TSchueler = String;
  TKurs = Array of TSchueler;
  TSchulKlasse = Array of TKurs;
 
var
  MeineSchueler : TSchulKlasse;
  // oder : MeineSchueler : Array of TSchulKlasse;
Das wäre die flexible, "dynamische" Variante von Arrays. Warum ist das besser als Deine Record-Definition? Weil Records den Sinn haben, unterschiedliche Datenelemente zu einem Paket zusammenzuschnüren, während Arrays Ansammlungen gleichartiger Elemente darstellen. Deine SchulKlasse(n) besteht/bestehen aus Kursen, diese Kurse enthalten Schüler - das sind jeweils gleichartige Elemente. Was jetzt Sinn machen würde, wäre, die Schüler z.B. mit Namen, Vornamen, Note etc. zu erfassen - dann würde dort ein Record das Mittel der Wahl sein:

Code: Alles auswählen

type
  TSchueler = Record
    Nachname,
    Vorname   : String;
    Note : Integer;
  end;
Dann wären eine SchulKlasse ein Arrayelement (der Gesamtheit aller Klassen) mit Arrays (TKurs) von Array of Record (TSchueler). Das Ganze nennt sich dann "Multidimensionales dynamisches Array", darüber kannst Du z.B. hier nachlesen: http://wiki.freepascal.org/Array/de

Okay, das ist in dieser Form ziemlich sperrig zu handhaben, sowohl was das Initialisieren aller Unterelemente mit SetLength angeht (siehe z.B. hier), als auch das Ansprechen der Einzelelemente in der Art von "MeineSchueler[3, 2, 7].Vorname := 'Alfred';"... Ich nehme an, Du hast deshalb zu Records gegriffen, um diese kryptische Zugriffsweise etwas besser in den Griff zu bekommen?

Um das nun übersichtlicher (wenn auch weniger flexibel) zu bekommen, könntest Du stattdessen mit statischen Arrays arbeiten und die einzelnen Elemente als Aufzählungstypen deklarieren:

Code: Alles auswählen

type
  TSchueler = Record
    Nachname,
    Vorname   : String;
    Note : Integer;
  end;
 
  TKurs = (Kurs1, Kurs2, Kurs3, Kurs4, Kurs5, Kurs6);
  TSchulKlasse = (Klasse1, Klasse2, Klasse3);
 
var
  MeineSchueler : Array[TSchulKlasse] of Array[TKurs] of Array of TSchueler;
Hier hast Du nun ein mehrdimensionales Array, das gewissermaßen "halbstatisch / halbdynamisch" ist: Die Gesamtheit der Klassen (1-3) enthält jeweils 6 Kurse - das ist der statische Teil der Gesamtstruktur - der Speicherbereich ist schon angelegt, hier brauchst Du kein SetLength mehr. Die Schüler allerdings sind als dynamisches Array definiert, für die mußt Du den Speicherbereich schon noch extra anfordern:

Code: Alles auswählen

SetLength(MeineSchueler[Klasse1, Kurs3], 30);
Eine Zuweisung erfolgt dann z.B. so:

Code: Alles auswählen

MeineSchueler[Klasse1, Kurs3, 15].Vorname := 'Alfred';
Zugegeben: Das ist erstmal ziemlich verwirrend. Aber da must Du durch. Du kommst einfach nicht darum herum, für Deine Daten saubere Datenstrukturen zu definieren.

Sorry, falls ich das hier allzu grob skizziert habe. Aber versuche, Dich in diese Logik einzuarbeiten, auch wenn Du erstmal versucht bist, Dir die Haare zu raufen...

Gruß Rüdiger

PS: Kann übrigens gut sein, daß ich das mit den Kursen mißverstanden habe. Denn was ein Kurs denn nun (anderes als ein Synonym für Schüler) sein soll, kann man aus Deiner Definition nicht wirklich herauslesen.

Antworten