Archief - [Delphi] Error: Incompatible types: 'Real' and 'String'

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Flava

Legacy Member
programma: Borland Delphi 6.0

Als ik de code wil Runnen, krijg ik volgende foutmelding:
[Error] GEMIDDELDEDYNAMISCHEARRAY.pas(61): Incompatible types: 'Real' and 'String'.

Ik ben een beginneling in programmeren en zit hier vast, zou niet weten wat ik moet veranderen (de code heb ik van een handboek, maar die klopt blijkbaar niet?). Als iemand mij zou kunnen verderhelpen :).

Het is dus deze lijn dat telkens roodkleurt: 'Geef de score voor student' + IntToStr(StudentenNummer+1)+':',''); (vind je onderaan de code)
(Ik hoop dat dit het juiste subforum is?)

Code:
unit GEMIDDELDEDYNAMISCHEARRAY;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TFormGemiddelde = class(TForm)
    Label1: TLabel;
    EditNummer: TEdit;
    ButtonGemiddelde: TButton;
    MemoOutput: TMemo;
    procedure ButtonGemiddeldeClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormGemiddelde: TFormGemiddelde;

implementation

{$R *.dfm}

procedure Vergelijk(Student:integer; Score, Gemiddelde:Real);
  var
  LijnOutput:String;

  begin
  Lijnoutput:= 'Student' + IntToStr(Student);

  If (Score>gemiddelde)
  Then LijnOutput:=LijnOutput+'scoorde boven het gemiddelde van'
  Else
  If (Score<Gemiddelde)
  Then LijnOutput:=LijnOutput+'scoorde onder het gemiddelde van'
  Else LijnOutput:=LijnOutput+'scoorde juist het gemiddelde van';
  LijnOutput:=LijnOutput+FloatToStr(Gemiddelde);
  FormGemiddelde.MemoOutput.Lines.Add(LijnOutput);
  end;{Procedure vergelijk}

procedure TFormGemiddelde.ButtonGemiddeldeClick(Sender: TObject);
 var
  AantalStudenten, StudentenNummer:Integer;
  Score: Array of Real;
  Totaal, GemiddeldeScore:Real;
 begin
 AantalStudenten:=StrToInt(EditNummer.Text);
 If(AantalStudenten>0)
 Then
  begin
  SetLength (Score, AantalStudenten);
  Totaal:=0;
  For StudentenNummer:=0 to (AantalStudenten-1) do
   begin
    Score[StudentenNummer]:=InputBox('Geef de score in',
    'Geef de score voor student' + IntToStr(StudentenNummer+1)+':','');
    Totaal:=Totaal + Score[StudentenNummer];
   end;{For}
  GemiddeldeScore:= Totaal/AantalStudenten;
  MemoOutput.Clear;
  MemoOutput.Lines.Add('De gemiddelde score: '+ FloatToStr(GemiddeldeScore));
  For StudentenNummer:=0 to (AantalStudenten-1) do
   begin
   Vergelijk((StudentenNummer+1); Score[StudentenNummer], GemiddeldeScore);
   end; {For}
  end; {lf}
 end; {procedure TformGemiddelde.ButtonGemiddeldeClick}
end.

Kreek

Legacy Member
Het type van StudentenNummer moet een Integer zijn (een geheel getal), maar is om een of andere reden een Real (een kommagetal), volgens die errorcode. Een array is geindexeerd met gehele getallen, en niet met reals. Dus dat kan je volgens mij al niet accessen.

Ook gebruik je de methode IntToStr, die een geheel getal omzet naar een String. Als je hier dan een Real (dus een kommagetal) aan meegeeft, dan kan deze methode het argument niet omzetten naar een string.

Zorg ervoor dat
Code:
AantalStudenten:=StrToInt(EditNummer.Text);

zeker enkel integers bevat.

Flava

Legacy Member
Kreek zei:
Het type van StudentenNummer moet een Integer zijn (een geheel getal), maar is om een of andere reden een Real (een kommagetal), volgens die errorcode. Een array is geindexeerd met gehele getallen, en niet met reals. Dus dat kan je volgens mij al niet accessen.

Ook gebruik je de methode IntToStr, die een geheel getal omzet naar een String. Als je hier dan een Real (dus een kommagetal) aan meegeeft, dan kan deze methode het argument niet omzetten naar een string.

Zorg ervoor dat
Code:
AantalStudenten:=StrToInt(EditNummer.Text);

zeker enkel integers bevat.

Bedankt voor de aangeboden hulp :). Heb wat proberen te veranderen aan de source (Heb vooral met de variabelen geprutst), maar spijtig genoeg niet met het gehoopte resultaat. Maar zal waarschijnlijk liggen aan het feit dat ik u uitleg fout begrijp :p.

Kreek

Legacy Member
Mja, ik ken geen Delphi, maar die code is wel heel makkelijk te begrijpen. Ik zou iets met die types proberen te veranderen. Dat studentennummer moet normaal altijd een int zijn.

Kan je niet nakijken of de inputvan het type Real is, zoja rond je dit af naar een integer ofzo?:p

dJeez

Legacy Member
Het probleem is dat de InputBox functie een String teruggeeft en geen reëel getal. Uiteraard kan je de return value dan ook niet rechtstreeks toewijzen aan een element in de Score array. Dat had je overigens makkelijk zelf kunnen zien door als je met de cursor ergens op de InputBox functie staat Ctrl-F1 te tikken.

http://www.delphibasics.co.uk/RTL.asp?Name=InputBox
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan