AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein C# Record/Struct rückgabe by ref/var

Record/Struct rückgabe by ref/var

Ein Thema von EWeiss · begonnen am 22. Mai 2015 · letzter Beitrag vom 23. Mai 2015
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Record/Struct rückgabe by ref/var

  Alt 22. Mai 2015, 19:19
Seltsam bleibt jedoch warum in meinen samles für .NET alles auch ohne "ref" funktioniert.
Vielleicht weil dort praktisch fast Alles auf Referenzen (Objekten) bassiert?
Kannst du das näher erklären
So das ich es verstehe.. was damit gemeint ist.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Record/Struct rückgabe by ref/var

  Alt 22. Mai 2015, 19:33
C# und andere Spachen kapseln sogar einfache Typen, wie z.B. einen Integer, in je einem Objekt (bzw. sie können eventuell auch beide Modi)
Das ist z.B. ein Grund, warum JavaScript oder PHP in einer Variable "alles" halten können, ohne Diese typisieren zu müssen. (auch wenn man das intern "inzwischen" teilweise wieder "optimiert" und doch wieder versucht es nativ zu speichern, wenn es geht)

Ein Delphi-Objekt wird ja auch immer per Referenz übergeben, selbst wenn man die Variable nicht als Referenz (VAR) übergibt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Record/Struct rückgabe by ref/var

  Alt 22. Mai 2015, 19:45
Erklärt aber noch nicht den Unterschied zwischen MePo C# und meinem Sample C# sowie dem in VB_NET
Warum meine Anwendungen Funktionieren aber die andere nicht.

Ich kann mich ja nicht nach einer speziellen Anwendung richten sondern diese muss sich nach den Begebenheiten richten
die meine Dll exportiert.

Welche das sind habe ich ja aufgezeigt.
Würde es also überall fehlschlagen hätte ich ein Design Problem aber dem ist ja nicht so.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Record/Struct rückgabe by ref/var

  Alt 22. Mai 2015, 20:02
Selber verstehen und vorallem machen kann ich es nicht ... bin froh, wenn ich's halbwegs lesen/entziffern kann.

Aber vielleicht erklärt das es ja ein bissl.
https://msdn.microsoft.com/de-de/library/yz2be5wk.aspx
http://www.dotnet-tricks.com/Tutoria...-Unboxing-in-C

https://msdn.microsoft.com/de-de/library/dd264741.aspx
http://www.tutorialspoint.com/csharp...data_types.htm
http://stackoverflow.com/questions/2...ence-type-in-c
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (22. Mai 2015 um 20:04 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Record/Struct rückgabe by ref/var

  Alt 22. Mai 2015, 20:10
Danke
Habe mich im World Wide Web schon umgesehen.

Ich lasse es jetzt so wie es ist also ohne Rückgabe bei ref.
Maßgeblich sind meine Samples da funktioniert es ja so wie es soll.
Andere Anwendungen müssen sich halt die passende Lösung selber suchen.

Das ist was ich zurückgebe und das ist korrekt.
Delphi-Quellcode:
procedure BASSVIS_Free(var Base: TBASSVIS_PARAM); stdcall;
//......
BASSVISKIND_WMP:
begin
  BASSWMPVisAPI.WMPVIS_Free(Base.VisHandle);
  if BASSWMPVisAPI.WMPVIS_IsFree then
  begin
    Base.VisHandle := 0;
    Base.VisGenWinHandle := 0;
  end;
end;
gruss

Geändert von EWeiss (22. Mai 2015 um 21:03 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#6

AW: Record/Struct rückgabe by ref/var

  Alt 23. Mai 2015, 07:39
Bei Delphi ist das ein Rekord. Mit 'var' wird auf den Parameter per übergebener Referenz zugegriffen und Du kannst den Inhalt bearbeiten.

Bei C# wird die Referenz übergeben, weswegen das imho überhaupt erst funktioniert. Die Referenz an sich wird nicht verändert.

Wäre TBASSVIZ_PARAM eine Klasse, bräuchtest Du in Delphi das 'var' nicht, aber dann könntest Du von C# nicht drauf zugreifen.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Record/Struct rückgabe by ref/var

  Alt 23. Mai 2015, 08:31
Zitat:
Bei Delphi ist das ein Rekord. Mit 'var' wird auf den Parameter per übergebener Referenz zugegriffen und Du kannst den Inhalt bearbeiten.
Ja das ist mir schon klar

Zitat:
Bei C# wird die Referenz übergeben, weswegen das imho überhaupt erst funktioniert. Die Referenz an sich wird nicht verändert.
An dieser aussage kann irgend etwas nicht stimmen..
Oder aber ich bin schlichtweg zu blöd dafür.

2 Kriterien die dagegen sprechen.

In meinen beiden Samples C# und VB_NET. Funktioniert es ohne übergabe aus meiner WrapperDLL.
Also.
WrapperDLL.
Code:
//BASSVIS_Free
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("bass_vis.dll", EntryPoint = "BASSVIS_Free", CharSet = CharSet.Auto)]
public static extern void BASSVIS_Free(BASSVIS_PARAM param);
Funktioniert also..
Aber nicht mit MediaPortal.

übergebe ich aus dem Wrapper bei "ref"
Code:
//BASSVIS_Free
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("bass_vis.dll", EntryPoint = "BASSVIS_Free", CharSet = CharSet.Auto)]
public static extern void BASSVIS_Free(ref BASSVIS_PARAM param);
funktionieren meine Samples nicht mehr.
MediaPortal sowieso nicht.
Weil ich Probleme habe dein Beispiel umzusetzen.
Es gibt da mehr als ein Interface in der ich das kapseln muss.

Warum also funktionieren meine Samples ohne Übergabe bei "ref" und mit dann nicht mehr ?
Natürlich habe ich dann die Funktionen in den Samples Angepasst.
Code:
BassVis.BASSVIS_Free(ref mVisParam);
bFree = mVisParam.VisHandle == 0;
bFree ist dann immer False weil das Handle > 0 (mit "ref") ohne ist es 0.

Kann es sein das es nicht ausreicht nur param by ref zurückzugeben?
Müsste ich speziell für den Fall noch selbst für die Rückgabe der Handles aus dem Wrapper sorgen?
Obwohl das eigentlich mir "ref" erledigt sein sollte.

Deshalb mein Einwand!

gruss

Geändert von EWeiss (23. Mai 2015 um 08:42 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz