AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Makro-Ersatz

Ein Thema von FAlter · begonnen am 24. Nov 2007 · letzter Beitrag vom 25. Nov 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.095 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Makro-Ersatz

  Alt 24. Nov 2007, 16:24
Hi,

wie kann ich ungefähr sowas realisieren, wo Delphi ja keine Makros kennt (ohne einen Präprozessor zu benutzen):

Delphi-Quellcode:
procedure foo;
var
  bar: Integer;

  procedure foo2; inline;
  begin
    inc(bar);
  end;

begin
  ...
  foo2;
  ...
end;
Zitat:
[Pascal Fehler] foobar.pas(123): E2449 Verschachtelte Inline-Routine 'foo2' kann nicht auf Variable 'bar' außerhalb des Gültigkeitsbereichs zugreifen
Nun ja, ich könnte inline entfernen, aber da da nur inc drinsteht, ist das ein wenig überladen. Da der Name foo2 allerdings aussagekräftiger ist, möchte ich nicht direkt inc schreiben, zumal foo2 keinen Parameter verlangt. Mit Makros wäre mein Problem ja lösbar, einfach sirekt an der Stelle foo2 stattdessen inc(bar) einsetzen. Aber das macht Delphi nicht mit. An der Stelle, wo foo2 aufgerufen wird, gibt es kein anderes SP, damit sollte es also keine Probleme geben.

Gibt es also eine bessere Lösung als direkt inc(bar) reinzuschreiben oder nicht-inline-procs?

Mfg
FAlter
Felix Alter
Japanurlaub 2015
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Makro-Ersatz

  Alt 24. Nov 2007, 16:35
Ich würde erstmal bei Codegear einen enhancement-request im QC eintragen das solche Konstrukte auch als inline möglich wären. Ich würde einfach sagen das hier der Compiler einfach zu vorsichtig arbeitet.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#3

Re: Makro-Ersatz

  Alt 24. Nov 2007, 17:14
funktioniert INLINE überhaupt wieder?

Zitat von D7-OH:
Das reservierte Wort inline und die Direktive assembler werden aus Gründen der Abwärtskompatibilität beibehalten. Sie haben keine Auswirkungen auf den Compiler.

nja, jedenfalls ohne das inline kann ich es porblemlos kompilieren/verwenden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.095 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

Re: Makro-Ersatz

  Alt 24. Nov 2007, 17:23
Hi,

sowas steht in der Hilfe zu TurboDelphi nicht drin, im Gegenteil lässt sich herauslesen, dass es durchaus eine Funktion hat:

Zitat:
Beim Delphi-Compiler ermöglicht zur Verbesserung der Leistung, Funktionen und Prozeduren mit der Direktive inline zu versehen. Wenn eine Funktion oder Prozedur bestimmten Kriterien entspricht, fügt der Compiler Code direkt ein anstatt einen Aufruf zu generieren. Das Ergebnis dieser Leistungsoptimierung ist schnellerer Code, der jedoch mehr Speicherplatz in Anspruch nimmt. Der Compiler produziert dabei eine größere Binärdatei. Die Direktive inline wird in Funktions- und Prozedurdeklarationen und -definitionen, genau wie andere Direktiven, verwendet.
Weiter unten steht:

Zitat:
{$INLINE AUTO} Verhält sich wie {$INLINE ON}; zusätzlich werden Routinen ohne die Direktive inline für das Inlining vorgesehen, wenn ihr Code weniger oder genau 32 Bytes umfasst.
Werd mal probieren, was passiert, wenn ich in meinem Beispiel (was ja entsprechend klein sollte) [$INLINE AUTO} einfüge, wass die Assembler-Ansicht dann sagt.

[edit]

Die CPU-Ansicht sagt:

Code:
...
FooBar.pas.345: foo2;
...
00477F0E E809FFFFFF      call foo2;
...
Klappt also offensichtlich nicht.
[/edit]

Mfg
FAlter
Felix Alter
Japanurlaub 2015
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Makro-Ersatz

  Alt 24. Nov 2007, 17:31
Hallo himitsu,

Zitat von himitsu:
funktioniert INLINE überhaupt wieder?
INLINE <> INLINE!

Zu Turbo-Pascal-Zeiten wurde das Schlüsselwort "INLINE" anfangs benötigt, um Maschinencode direkt in das Compilat einzuflechten. Einen eingebauten Assembler brachte erst Turbo Pascal 6.0 mit, wenn ich mich richtig erinnere. Der von dir zitierte Ausschnit aus der Online-Hilfe bezieht sich wohl auf diese ursprüngliche Verwendung.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.095 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

Re: Makro-Ersatz

  Alt 24. Nov 2007, 17:40
Hi,

ich habe mich jetzt erstmal entschieden, foo2 auszukommentieren und weiter unten inc(bar){foo2} zu schreiben. Dann weiß ich erstmal, dass mit inc(bar) foo2 gemeint ist, und es hat den gewünschten Effekt, nämlich, dass nicht der Prozeduraufruf, sondern deren Code eingebaut wird. Schade, dass es nicht noch schöner geht (außer mit nem Präprozessor, aber TurboDelphi und IDE-Erweiterungen...).

Mfg
FAlter
Felix Alter
Japanurlaub 2015
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#7

Re: Makro-Ersatz

  Alt 24. Nov 2007, 17:47
OK schön, dann geht dat ja wieder ^^

hast du es schonmal mit Assembler versucht?

Delphi-Quellcode:
procedure foo2; inline;
asm
  inc &bar
end;

@Hawkeye219
ich weiß, und das von dir zitierte INLINE funktioniert auch immernoch ... zumintestens in etwa
Delphi-Quellcode:
{$L Dateiname}
{$LINK Dateiname}
für Pascalcode:
Delphi-Quellcode:
{$I Dateiname}
{$INCLUDE Dateiname}
aber ich bezog mich auf die Compilierdirektiven für Funktionen/Prozeduren

INLINE sagte (und sagt jetzt wieder), daß der Funktions-/Prozedurinhalt in den aufrufenden Code direkt eingebunden werden soll.
Nja und ASSEMBLER sagte dem Kompiler, daß er gleich eine ASM-Funktion vorfindet (find ich irgendwie sinnlos, weil das sollte der ja och so sehn, aber was solls)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.095 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

Re: Makro-Ersatz

  Alt 24. Nov 2007, 18:14
Hi,

laut OH vertragen sich inline und Assembler nicht. Auch bei Auto wird laut CPU-Fenster immer noch ein call ausgeführt.

Mfg
FAlter
Felix Alter
Japanurlaub 2015
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#9

Re: Makro-Ersatz

  Alt 24. Nov 2007, 20:26
Zitat von FAlter:
Auch bei Auto wird laut CPU-Fenster immer noch ein call ausgeführt.
Wenn ich das da oben richtig verstanden hab, dann schaut auto auch nur was möglich ist.
Un da es nicht geht wenn du explizit INLINE befiehlst, dann war's ja wohl klar daß die Automatik das auch nicht hinbekomm ._.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Makro-Ersatz

  Alt 25. Nov 2007, 10:05
Wieso lässt du das 'inline' nicht einfach weg? Ich verwende lokale Prozeduren und Funktionen zuhauf. Es erhöht die Übersichtlichkeit enorm (wenn man es nicht übertreibt). Mir persönlich ist es fast immer egal, wenn dadurch ein paar Nanosekunden flöten gehen. Wichtiger sind Eigenschaften wie Übersichtlichkeit, Lesbarkeit, Wartbarkeit.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz