Wie wäre es in ein Pascal Grundlagenbuch zu gucken und vielleicht sogar ein paar Seiten zu lesen?mtbf40 hat geschrieben: gibt es eine Möglichkeit auf die Variablen in der Funktion zurück zugreifen?
Compiler Fehler"Wrong Numbers..." [(un)gelöst]
-
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]
-
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]
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
3. Möglichkeit
var-Parameter in Procedure
Aufruf dann wie folgt:
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):meinrecordvar-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;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 3Code: Alles auswählen
Signatur := nil;Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]
das sind selbst geschriebene CLI-Programme - keine Systemprogramme - die fragen Datenbanken ab und geben das Ergebnis auf der Kommanozeile aus.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...
habe ich ausprobiert und folgenden Fehler erhalten:2. Möglichkeit
Du machst eine Funktion raus und gibst einen record zurück
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;Code: Alles auswählen
AStringList.Add(get_process_outp(par));habe ich ausprobiert - funktioniert3. Möglichkeit
var-Parameter in Procedure
Zuletzt geändert von mtbf40 am Mi 23. Nov 2011, 14:46, insgesamt 3-mal geändert.
Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]
Danke für den Tip!!mse hat geschrieben:Wie wäre es in ein Pascal Grundlagenbuch zu gucken und vielleicht sogar ein paar Seiten zu lesen?mtbf40 hat geschrieben: gibt es eine Möglichkeit auf die Variablen in der Funktion zurück zugreifen?
Re: Compiler Fehler"Wrong Numbers..." [gelöst]
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
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
- af0815
- Lazarusforum e. V.
- Beiträge: 6989
- 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]
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.
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).
Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]
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.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 ?
Was vielleicht noch wichtig wäre:
- MT4 ist eine 32bit Applikation
- mein Server ist 64bit
- die DLL ist 32bit kompilliert
- af0815
- Lazarusforum e. V.
- Beiträge: 6989
- 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]
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).
Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]
...ja macht Sinn dafür einen neuen Thread zu eröffnen...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.
so weiter gehts hier:
http://www.lazarusforum.de/viewtopic.php?f=10&t=5639
Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]
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.
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]
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..
)
Oder du verwendest Application.OnIdle das er es macht wenn der Application langweilig ist,bzw sie nichts zu tun hat
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
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..
Oder du verwendest Application.OnIdle das er es macht wenn der Application langweilig ist,bzw sie nichts zu tun hat
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;Re: Compiler Fehler"Wrong Numbers..." [(un)gelöst]
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 Timermtbf40 hat geschrieben:
2. Start - läuft endlos - reboot - Start - läuft endlos - reboot ...