Compiler Fehler"Wrong Numbers..." [(un)gelöst]

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]

Beitrag von mse »

mtbf40 hat geschrieben: gibt es eine Möglichkeit auf die Variablen in der Funktion zurück zugreifen?
Wie wäre es in ein Pascal Grundlagenbuch zu gucken und vielleicht sogar ein paar Seiten zu lesen? ;-)

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]

Beitrag von MAC »

ja mir fallen gerade 3 Möglichkeiten ein wie du das realisieren kannst.
Schreib allerdings mal wieso du 2 Externe Programme aufrufen musst.
Ich glaub das lässt sich auch in dein Programm einbauen so das du nicht externe Programme starten musst...

1. Möglichkeit
Globale Variable

2. Möglichkeit
Du machst eine Funktion raus und gibst einen record zurück

Code: Alles auswählen

type // weit oben
  meinrecord = record
  Count:integer;
  output:integer;

Code: Alles auswählen

function Test(pfad:string):meinrecord
3. Möglichkeit
var-Parameter in Procedure

Code: Alles auswählen

Procedure Test(pfad:string; var {DAS VAR BEDEUTED DAS DER WERT ÜBERNOMMEN WIRD...) count,output:integer);
begin
//machwas
count := 2;
output := 3;
end;
Aufruf dann wie folgt:

Code: Alles auswählen

var
  a,b
begin
Test('Hallo',a,b);
// jetzt steht in a und b die verte die in der procedure an count und output gegeben werden, also hier im fall 2 und 3

Code: Alles auswählen

Signatur := nil;

mtbf40
Beiträge: 72
Registriert: Do 3. Nov 2011, 16:39

Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]

Beitrag von mtbf40 »

MAC hat geschrieben:ja mir fallen gerade 3 Möglichkeiten ein wie du das realisieren kannst.
Schreib allerdings mal wieso du 2 Externe Programme aufrufen musst.
Ich glaub das lässt sich auch in dein Programm einbauen so das du nicht externe Programme starten musst...
das sind selbst geschriebene CLI-Programme - keine Systemprogramme - die fragen Datenbanken ab und geben das Ergebnis auf der Kommanozeile aus.
2. Möglichkeit
Du machst eine Funktion raus und gibst einen record zurück
habe ich ausprobiert und folgenden Fehler erhalten:
Error: Incompatible types: got "untyped" expected "AnsiString"

Code: Alles auswählen

function get_process_outp(aufruf: AnsiString): AnsiString;
var
   proc : TProcess;
   otp : TStringList;
begin
  otp := TStringList.Create;
  proc := TProcess.Create(nil);
  proc.CommandLine := mapper_D+aufruf;
	proc.Options := proc.Options + [poWaitOnExit, poUsePipes];
	proc.Execute;
  get_process_outp := otp.LoadFromStream(proc.Output);
//Fehlermeldung hier bei opt. - wenn ich <get_process_outp :=> weglasse gibt es keinen Fehler - es wird aber auch nichts übergeben
  proc.Free;
end;
Aufruf: Variable par := 'C:\prog\cli.exe ...';

Code: Alles auswählen

AStringList.Add(get_process_outp(par));
3. Möglichkeit
var-Parameter in Procedure
habe ich ausprobiert - funktioniert
Zuletzt geändert von mtbf40 am Mi 23. Nov 2011, 14:46, insgesamt 3-mal geändert.

mtbf40
Beiträge: 72
Registriert: Do 3. Nov 2011, 16:39

Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]

Beitrag von mtbf40 »

mse hat geschrieben:
mtbf40 hat geschrieben: gibt es eine Möglichkeit auf die Variablen in der Funktion zurück zugreifen?
Wie wäre es in ein Pascal Grundlagenbuch zu gucken und vielleicht sogar ein paar Seiten zu lesen? ;-)
Danke für den Tip!! :roll: ich werde auf jeden Fall diese Investition tätigen - ...aber dann wären doch solche Foren überflüssig :!: :?:

mtbf40
Beiträge: 72
Registriert: Do 3. Nov 2011, 16:39

Re: Compiler Fehler"Wrong Numbers..." [gelöst]

Beitrag von mtbf40 »

so - habe mir jetzt gleich 2(zwei) Bücher gekauft!!
Mein erstes Projekt ist fertig und funktioniert sehr gut. Danke für eure Hilfe... bis zum nächsten...

Jetzt habe ich das nächste Projekt gestartet: FreePascal in Vebindung mit Metatrader. Dazu möchte ich eine DLL erstellen die mir meine Trades aus der History von MT4 ausliest. Habe auch schon ersten "Gehversuche" gemacht, die aber bis jetzt voll in die Hose gingen.

Ziel:
Die DLL bekommt die Daten von MT4 und schreibt diese in eine Datei - zu mindest vorerst

Resultat:
Die Datei wird erstellt und schreibt Tonnen von whiteSpaces rein (0x20).

Ich wäre dankbar für wichtige Denkanstöße...
Wenn jemand sich mit FPC und MT4 auskennt, dann poste ich den Code. Oder zeigt mir wie ich allgemein aus einer DLL in eine Datei schreiben kann.

mtbf40

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6837
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]

Beitrag von af0815 »

Laut der Beschreibung hier ist das Interface im C++ Style. Ich nehme an, das der MT4 die Applikation ist, in die die dll (zukünftig mit Pascal erstellt) eingebunden werden soll.

Habe ich das soweit richtig verstanden ?

Vielleicht ist das hier ftp://ftp.freepascal.org/fpc/docs-pdf/CinFreePascal.pdf für dich von Interesse. Es zeigt vor allen die Probleme mit C++ Interface, das meistens in ein 'flaches' C Interface umgesetzt wird.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mtbf40
Beiträge: 72
Registriert: Do 3. Nov 2011, 16:39

Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]

Beitrag von mtbf40 »

af0815 hat geschrieben:Laut der Beschreibung hier ist das Interface im C++ Style. Ich nehme an, das der MT4 die Applikation ist, in die die dll (zukünftig mit Pascal erstellt) eingebunden werden soll.

Habe ich das soweit richtig verstanden ?
das ist richtig - die DLL soll in MT4 eingebunden werden. Das ganze funktioniert ja soweit - beim Aufruf des mql-Skriptes (in MT4) wird die Prozedur in der DLL aufgerufen und diese legt dann die Datei an - schreibt aber nur 0x20 Zeichen rein und das tonnenweise. Ich habe keinen blassen Schimmer warum. Habe das ganze mal mit dem PE Monitor (Sysinternals) verfolgt - da sieht man wie die Zeichen in nano-Sekunden reinschießen. Ich muß dann MT4 schließen um nicht meinen Server lahm zu legen.

Was vielleicht noch wichtig wäre:
- MT4 ist eine 32bit Applikation
- mein Server ist 64bit
- die DLL ist 32bit kompilliert

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6837
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]

Beitrag von af0815 »

Schaut so aus, als wäre das Interface nicht 100% pro kompatibel programmiert. Kannst du die Interfacedefinition (von MT4 und von Lazarus) mal hier reinstellen. Ausserdem wäre ein neuer Thread mit der richtigen Überschrift sinvoll.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mtbf40
Beiträge: 72
Registriert: Do 3. Nov 2011, 16:39

Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]

Beitrag von mtbf40 »

af0815 hat geschrieben:Schaut so aus, als wäre das Interface nicht 100% pro kompatibel programmiert. Kannst du die Interfacedefinition (von MT4 und von Lazarus) mal hier reinstellen. Ausserdem wäre ein neuer Thread mit der richtigen Überschrift sinvoll.
...ja macht Sinn dafür einen neuen Thread zu eröffnen...

so weiter gehts hier:
http://www.lazarusforum.de/viewtopic.php?f=10&t=5639

mtbf40
Beiträge: 72
Registriert: Do 3. Nov 2011, 16:39

Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]

Beitrag von mtbf40 »

habe noch eine Erweiterung in mein Programm einzuarbeiten:

das Programm kann 2 "Zustände" annehmen - je nachdem wie die User aggieren:
1. Start - beenden - Start - beenden ...
2. Start - läuft endlos - reboot - Start - läuft endlos - reboot ...

Im Programm ist eine Prozedur eingebaut die Dateien älter als 30-Tage löscht. Ich möchte jetzt irgend etwas einbauen, was diese Dateien nach 30 Tagen löscht, wenn das Programm länger als 30 Tage läuft - eine Art Zeitschalter - d.h. es muß ein Zeit-Trigger(Cycle Time) eingebaut werden der einmal am Tag anspringt und die entsprechende Prozedur aufruft. Wie realisiert man das? - dies gilt für den zweiten Zustand
Das ganze muß im Hintergrund ablaufen - ohne die reguläre Bedienung zu unterbechen.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]

Beitrag von MAC »

du nimmst einfach ein Timer den du dann auf irgendein wert stellst, da das alter einer Date ein Gleitkommawert mit Uhrzeit ist ist es sinvoll auch in abständen die kleiner als 1 Tag sind aufgerufen zu werden.
Ein Beispiel Einfach einen TTimer nehmen und ihn auf 1000*60*60*6 stellen sodas er alle 6 Stunden aufgerufen wird...
Andere möglichkeit wäre ein 2ten Thread laufen zu lassen in dem du sozusagen die Zeit abzählst, würde dann nicht die Rechen-Reccourcen des Hauptprogramms verbrauchen (also du kannst wärend der Arbeitet weiter Knöpfchen drücken , fals das löschen 2 Minuten dauert oder so.. :D)
Oder du verwendest Application.OnIdle das er es macht wenn der Application langweilig ist,bzw sie nichts zu tun hat :D

Das 2te Umsetzen ist ganz einfach: Gar nicht. Eine Endlosschleife kann man nicht abbrechen da sie dann nicht mehr Endlos ist, also musst du das wohl etwas genauer schildern

Code: Alles auswählen

// vlt sowas ?
while True do
  begin
  Form1.Caption := 'Hallo' + InttoStr(random(19999));
  Application.ProcessMessages; 
  if random(1000000) = 0 then exit;
  sleep(100);
  end;

Code: Alles auswählen

Signatur := nil;

mtbf40
Beiträge: 72
Registriert: Do 3. Nov 2011, 16:39

Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]

Beitrag von mtbf40 »

mtbf40 hat geschrieben:
2. Start - läuft endlos - reboot - Start - läuft endlos - reboot ...
mit endlos ist das Programm gemeint - d.h. es wird gestartet und "irgend wann" beendet - es könnte Wochen oder Monate offen sein - bis es jemand beendet oder bei einem reboot - das ist der Grund für den Timer

Antworten