AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Wer Hilft bei einer kleinen übersetzung Delphi > C ?
Thema durchsuchen
Ansicht
Themen-Optionen

Wer Hilft bei einer kleinen übersetzung Delphi > C ?

Ein Thema von EWeiss · begonnen am 2. Aug 2007 · letzter Beitrag vom 2. Aug 2007
Antwort Antwort
Seite 2 von 3     12 3      
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#11

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?

  Alt 2. Aug 2007, 16:34
Zitat von EWeiss:
Müßte das dann so aussehen ?
Code:
BOOL BASSVISDEF(BASSVIS_StartRecord)(*BASSVIS_PARAM Param, int SampleRate = 44100, int Channels = 2);
Fast, richtiger ist:
Code:
BOOL BASSVISDEF(BASSVIS_StartRecord)(BASSVIS_PARAM* Param, int SampleRate = 44100, int Channels = 2);
Also der Stern gehört auf die andere Seite bzw. kann auch direkt vor den Namen der Variablen geschrieben werden

Code:
int a, //kein Zeiger
    *b; // Zeiger
int* c; // ebenfalls Zeiger
Nur bei Funktions- bzw. Methodenzeigern wird der Stern nach links gesetzt (das unterscheidet die dann auch von der "normalen" Referenz auf eine Variable). Lässt Du den Stern weg, wird eine komplette Kopie und kein Zeiger übergeben, das würde also ein paar unerwünschte Effekte mit sich bringen.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#12

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?

  Alt 2. Aug 2007, 16:38
Zitat von Der_Unwissende:
Zitat von EWeiss:
Müßte das dann so aussehen ?
Code:
BOOL BASSVISDEF(BASSVIS_StartRecord)(*BASSVIS_PARAM Param, int SampleRate = 44100, int Channels = 2);
Fast, richtiger ist:
Code:
BOOL BASSVISDEF(BASSVIS_StartRecord)(BASSVIS_PARAM* Param, int SampleRate = 44100, int Channels = 2);
Also der Stern gehört auf die andere Seite bzw. kann auch direkt vor den Namen der Variablen geschrieben werden

Code:
int a, //kein Zeiger
    *b; // Zeiger
int* c; // ebenfalls Zeiger
Nur bei Funktions- bzw. Methodenzeigern wird der Stern nach links gesetzt (das unterscheidet die dann auch von der "normalen" Referenz auf eine Variable). Lässt Du den Stern weg, wird eine komplette Kopie und kein Zeiger übergeben, das würde also ein paar unerwünschte Effekte mit sich bringen.
Fein
Dann werde ich das schon mal alles ändern!
Bei den stellen wo der zeiger auf die Struct zeigt.

Die Optionalen werte sind so in Ordnung ?

gruss Emil
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#13

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?

  Alt 2. Aug 2007, 16:46
Zitat:
ahhh danke das hilft mir schon mal weiter war eines meiner größten Probleme deshalb habe ich auch das stdCall gelassen.
Denke das es aber in der Funktion selbst nicht übergeben werden muss oder gibt es das auch in C
Standardaufrufkonvention ist in C++ cdecl (woher wohl der Name kommt? ). _stdcall ist daher notwendig.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#14

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?

  Alt 2. Aug 2007, 16:47
Nochmal das geänderte Headerfile

Code:
#ifndef BASSVIS_H
#define BASSVIS_H

#include <wtypes.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef BASSVISDEF
#define BASSVISDEF(f) WINAPI f
#endif

typedef DWORD HVIS;
typedef unsigned __int64 QWORD;


// BASS_SONIQUEVIS_CreateVis flags
#define BASS_VIS_NOINIT            1

// BASS_SONIQUEVIS_SetConfig flags
#define BASS_SONIQUEVIS_CONFIG_FFTAMP         1
#define BASS_SONIQUEVIS_CONFIG_FFT_SKIPCOUNT   2 // Skip count range is from 0 to 3 (because of limited FFT request size)
#define BASS_SONIQUEVIS_CONFIG_WAVE_SKIPCOUNT  3 // Skip count range is from 0 to (...) try it out, whenever Bass crashes or does not return enough sample data
#define BASS_SONIQUEVIS_CONFIG_SLOWFADE           4 // Dim light colors to less than half, then slowly fade them out

// BASS_WINAMP_SetConfig flags
#define BASS_WINAMPVIS_CONFIG_FFTAMP   1

// BASS_VIS_FindPlugin flags
#define BASS_VIS_FIND_SONIQUE         1
#define BASS_VIS_FIND_WINAMP         2
#define BASS_VIS_FIND_RECURSIVE         4

//Plugin kind
#define BASSVISKIND_NONE    0 // no kind
#define BASSVISKIND_WINAMP  1 // Winamp
#define BASSVISKIND_SONIQUE 2 // Sonique


typedef int BASSVIS_KIND_T;

typedef struct {
    HVIS VisHandle;         // VisHandle
    DWORD VisWinHandle;      // Vis Window Handle        W2
    DWORD VisGenWinHandle;   // General Vis Window Handle W5
    BASSVIS_KIND_T Kind;     // Plugin kind   
} BASSVIS_PARAM;

typedef struct {
    char* AMP_SON_Pluginfile; // path to Plugin kind
    DWORD AMP_UseOwnW1;      // flags for Winamp (ownHDC)
    DWORD AMP_UseOwnW2;      // flags for Winamp (ownHDCW2)
    DWORD AMP_Moduleindex;   // Modul-index for Winamp
    DWORD SON_PaintHandle    // Painthandle for Sonique
    char* SON_ConfigFile;    // path to configfile Sonique
    DWORD SON_Flags;         // flags for Sonique
    int  Width;             // SrcWindow width
    int  Height;            // SrcWindow height
    int  Left;              // SrcWindow left
    int  Top;               // SrcWindow top
} BASSVIS_EXEC;

typedef struct { 
    char* SongTitle;         // songtitel
    char* Songfile;          // songTitle with path
    DWORD pos;               // stream position
    DWORD len;               // stream length
    DWORD PlaylistPos;       // playlist position
    DWORD Playlistlen;       // playlist entry
    int SampleRate;          // samplerate
    int BitRate;             // bitrate
    DWORD Duration;          // duration
    int Channels;            // channel default 2 (stereo)
} BASSVIS_INFO;

enum PlayState {
   psError = 99,         
   psStop = 0,             
   psPlay = 1,      
   psIsPlaying = 2,         
   psPause = 3,      
   psGetPlaylistPos = 4,         
   psSetPlaylistPos = 5,         
};


typedef void (_stdcall *BASSVIS_STATECALLBACK) (PlayState);

BOOL BASSVISDEF(BASSVIS_Init)(BASSVIS_KIND_T Kind, HWND AppHandle, HWND WinHandle, HWND PaintHandle);
BOOL BASSVISDEF(BASSVIS_RenderChannel)(BASSVIS_PARAM* Param, DWORD channel);
BOOL BASSVISDEF(BASSVIS_StartRecord)(BASSVIS_PARAM* Param, int SampleRate = 44100, int Channels = 2);
BOOL BASSVISDEF(BASSVIS_Config)(BASSVIS_PARAM* Param, int Entry = -1);
BOOL BASSVISDEF(BASSVIS_SetInfo)(BASSVIS_PARAM* Param, BASSVIS_INFO Infos);
BOOL BASSVISDEF(BASSVIS_Resize)(BASSVIS_PARAM* Param, int Left, int Top, int Width, int Height);
BOOL BASSVISDEF(BASSVIS_SetFullscreen)(BASSVIS_PARAM* Param, HWND SourceHandle, HWND DestHandle, int SourceLeft, int SourceTop, int SourceWidth, int SourceHeight, BOOL FullScreenFlag, int FullScreeWidth, int FullScreenHeight);
BOOL BASSVISDEF(BASSVIS_SetModulePreset)(BASSVIS_PARAM* Param, int index);
BOOL BASSVISDEF(BASSVIS_SetOption)(BASSVIS_PARAM* Param, int option, int value);
BOOL BASSVISDEF(BASSVIS_IsFree)(BASSVIS_PARAM* Param);
BOOL BASSVISDEF(BASSVIS_Free)(BASSVIS_PARAM* Param);

char* BASSVISDEF(BASSVIS_FindPlugins)(BASSVIS_KIND_T Kind, char *PluginPath, DWORD Searchflags);
char* BASSVISDEF(BASSVIS_GetModulePresetName)(BASSVIS_PARAM* Param, int index, char* PluginName = null);
char* BASSVISDEF(BASSVIS_GetModulePresetNameList)(BASSVIS_PARAM* Param, char* PluginName = null);

char* BASSVISDEF(BASSVIS_GetPluginName)(BASSVIS_PARAM* Param);
char* BASSVISDEF(BASSVIS_GetVersion);

BASSVIS_PARAM BASSVISDEF(BASSVIS_GetPluginHandle)(BASSVIS_KIND_T Kind, char *Pluginfile);

void BASSVISDEF(BASSVIS_ExecutePlugin)(BASSVIS_EXEC* Param, BASSVIS_PARAM out Base);
void BASSVISDEF(BASSVIS_Quit)(BASSVIS_PARAM* Param);
void BASSVISDEF(BASSVIS_SetGenParent)(HWND WindowHandle, HWND ContainerHandle, int Left, int Top, int Width, int Height);


int BASSVISDEF(BASSVIS_GetModulePresetCount)(BASSVIS_PARAM* Param, char* PluginName);
int BASSVISDEF(BASSVIS_GetOption)(BASSVIS_PARAM* Param, int option);
int BASSVISDEF(BASSVIS_SetPlayState)(BASSVIS_PARAM* Param, PlayState State, int value = -1);

//Spezial for Winamp
void BASSVISDEF(BASSVIS_WINAMP_SetStateCallback)(BASSVIS_STATECALLBACK callback);
void BASSVISDEF(BASSVIS_WINAMP_RemoveCallback);
BOOL BASSVISDEF(BASSVIS_SONIQUEVIS_Clicked)(HVIS handle, DWORD x, DWORD y);

#ifdef __cplusplus
}
#endif

#endif
Meine aktuellen probleme jetzt noch..
Code:
void BASSVISDEF(BASSVIS_WINAMP_SetStateCallback)(BASSVIS_STATECALLBACK callback);
auch der pointer bei BASSVIS_STATECALLBACK rechts oder links ?

Code:
void BASSVISDEF(BASSVIS_ExecutePlugin)(BASSVIS_EXEC* Param, BASSVIS_PARAM out Base);
Delphi-Quellcode:
procedure BASSVIS_ExecutePlugin(Param: PBASSVIS_EXEC;
    var Base: TBASSVIS_PARAM
); stdcall; external dllfile;
bin mir nicht sicher was ich von Delphi 'var' in C 'out' übergeben soll.
Denke das hier auch ein Problem vorliegt.

gruss Emil
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#15

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?

  Alt 2. Aug 2007, 16:49
Zitat von Apollonius:
Zitat:
ahhh danke das hilft mir schon mal weiter war eines meiner größten Probleme deshalb habe ich auch das stdCall gelassen.
Denke das es aber in der Funktion selbst nicht übergeben werden muss oder gibt es das auch in C
Standardaufrufkonvention ist in C++ cdecl (woher wohl der Name kommt? ). _stdcall ist daher notwendig.
Hmm cdecl ??
dann doch eher anstatt _stdcall , >> _cdecl oder ?

gruss Emil
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#16

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?

  Alt 2. Aug 2007, 16:53
Entweder in Delphi und C++ stdcall oder in beidem cdecl, wobei das Schlüsselwort in C++ weggelassen werden kann. Ich glaube, wir reden gerade aneinander vorbei.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#17

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?

  Alt 2. Aug 2007, 17:02
Zitat von Apollonius:
Entweder in Delphi und C++ stdcall oder in beidem cdecl, wobei das Schlüsselwort in C++ weggelassen werden kann. Ich glaube, wir reden gerade aneinander vorbei.
Danke dann ist _stdCall richtig da auch in Delphi so übergeben

gruss Emil
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#18

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?

  Alt 2. Aug 2007, 17:07
Zitat von Apollonius:
wobei das Schlüsselwort in C++ weggelassen werden kann. Ich glaube, wir reden gerade aneinander vorbei.
Weglassen ist immer so eine Sache, gerade bei C++. cdecl ist zwar die Standardkonvention, aber das heißt nicht viel, einige IDEs/Compiler verwenden da einfach mal Konfigurationen, bei denen man schnell die Standardkonvention ändern kann und es bei der Verwendung von DLLs/SOs dann kracht. Besser explizit angeben und auf der sicheren Seite sein! An sich ist stdcall nur der Standard unter Windows (die MS-Dlls greifen i.d.R: auf stdcall zurück).


Zitat von EWeiss:
Meine aktuellen probleme jetzt noch..
Code:
void BASSVISDEF(BASSVIS_WINAMP_SetStateCallback)(BASSVIS_STATECALLBACK callback);
auch der pointer bei BASSVIS_STATECALLBACK rechts oder links ?
Wenn BASSVI_STATECALLBACK schon per TypeDef zum Funktionszeiger gemacht wurde, brauchst Du hier keinen Stern mehr.

Zitat von EWeiss:
Code:
void BASSVISDEF(BASSVIS_ExecutePlugin)(BASSVIS_EXEC* Param, BASSVIS_PARAM out Base);
Delphi-Quellcode:
procedure BASSVIS_ExecutePlugin(Param: PBASSVIS_EXEC;
    var Base: TBASSVIS_PARAM
); stdcall; external dllfile;
bin mir nicht sicher was ich von Delphi 'var' in C 'out' übergeben soll.
Auf const, var und out solltest Du lieber verzichten, die schränken eben die Kompatiblität ein. Wenn Du einen Zeiger übergibst, dann hast Du automatisch den Effekt von var, sobald Du den dereferenzierst schreibst Du schließlich direkt in den "echten" Speicher der übergebenen Variable und veränderst keine Kopie. Für out gilt das gleiche, nur dass Delphi hier vorher den Bereich leeren würde, ist aber eben nur nice-to-have, nicht nötig!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#19

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?

  Alt 2. Aug 2007, 17:14
Weiss nicht ob ich das richtig rübergebracht habe

Delphi-Quellcode:
procedure BASSVIS_ExecutePlugin(Param: PBASSVIS_EXEC;
    var Base: TBASSVIS_PARAM
); stdcall; external dllfile;
Base gibt mir aus Delphi einen wert zurück über die Variable 'var'
Geschieht das in C automatisch ??

so wie ich deine Aussage verstanden habe benötige ich in C keine Varable vor Base.

Müßte dann so aussehen

Code:
void BASSVISDEF(BASSVIS_ExecutePlugin)(BASSVIS_EXEC* Param, BASSVIS_PARAM* Base);
Ist aber dann ein pointer(zeiger) auf die Structur soll aber einen wert der sich in Base befindet zurückgeben.

Vestehe ich jetzt nicht so richtig.

Gruss Emil

EDIT:
Code:
int BASSVISDEF(BASSVIS_SetPlayState)(BASSVIS_PARAM* Param, PlayState State, int value = -1);
Denke das wäre dann mein letztes problem
Playstate ist enum muss auch hier ein Stern übergeben werden?

Code:
int BASSVISDEF(BASSVIS_SetPlayState)(BASSVIS_PARAM* Param, PlayState* State, int value = -1);
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#20

Re: Wer Hilft bei einer kleinen übersetzung Delphi > C ?

  Alt 2. Aug 2007, 17:20
Wenn du in Delphi einen Parameter als var deklarierst, macht der Compiler dass, was du in C explizit hinschreiben musst: nicht der Wert der Variablen, sondern ihre Adresse wird übergeben. Somit ist die C-Deklaration in dieser Hinsicht korrekt, wenn man mal davon absieht, dass du anscheinend _stdcall vergessen hast (hinter das void).
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 17:48 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