Probleme mit der Übergabe von Array-Zeigern an Funktionen
-
Hallo,
ich habe Probleme mit der Übergabe von Array-Zeigern an Funktionen. Die Funktion "mtest" soll mit Zeigern zu Arrays aufgerufen werden. Sie soll die DLL-Funktion "GPxi3051_GetDriverInfo" mit der Struktur "StructDriverInfo" aufrufen und den Inhalt auf die Arrays zurückgeben. Diese Funktion soll später in eine DLL exportiert werden und einem älterem Prüfprogramm, welches nicht mit Strukturen umgehen kann, als Übersetzer dienen. Irgendetwas habe ich mit Arrays und Zeigern darauf noch nicht verstanden. Aber hier erst einmal der Code von "tcan.cpp":
#include "stdafx.h" #include "GPxi3051w.h" #pragma comment(lib,"GPxi3051w.lib") int main(int argc, char* argv[]) { int errornr = 0; unsigned long Version = 0; unsigned long DevCount = 0; unsigned long SW_XILINX[12] = {0,0,0,0,0,0,0,0,0,0,0,0}; unsigned long GeoAddress[12] = {0,0,0,0,0,0,0,0,0,0,0,0}; unsigned long SerialNumber[12] = {0,0,0,0,0,0,0,0,0,0,0,0}; unsigned long Revision[12] = {0,0,0,0,0,0,0,0,0,0,0,0}; int mtest(unsigned long *Version, unsigned long *DevCount, unsigned long *SW_XILINX[], unsigned long *GeoAddress[], unsigned long *SerialNumber[], unsigned long *Revision[]); errornr = mtest(&Version, &DevCount, &SW_XILINX, &GeoAddress, &SerialNumber, &Revision); return TRUE; } //extern "C" __declspec(dllexport) int mtest(unsigned long *Version, unsigned long *DevCount, unsigned long *SW_XILINX[], unsigned long *GeoAddress[], unsigned long *SerialNumber[], unsigned long *Revision[]) { int errornr=0; GPxi3051_StructDriverInfo StructDriverInfo; errornr = GPxi3051_GetDriverInfo(&StructDriverInfo); *Version = StructDriverInfo.Version; *DevCount = StructDriverInfo.DevCount; *SW_XILINX = StructDriverInfo.SW_XILINX; *GeoAddress = StructDriverInfo.GeoAddress; *SerialNumber = StructDriverInfo.SerialNumber; *Revision = StructDriverInfo.Revision; return errornr; }Und das Header-File "GPxi3051w.h":
/*------------------------------------------------------------------*/ /* Defines */ /*------------------------------------------------------------------*/ #define DEV_MAX 12 /*------------------------------------------------------------------*/ /* Typedefs */ /*------------------------------------------------------------------*/ typedef struct { unsigned long Version; unsigned long DevCount; unsigned long SW_XILINX[DEV_MAX]; unsigned long GeoAddress[DEV_MAX]; unsigned long SerialNumber[DEV_MAX]; unsigned long Revision[DEV_MAX]; } GPxi3051_StructDriverInfo; /*------------------------------------------------------------------*/ typedef struct { unsigned long Version; unsigned long DevCount; unsigned long SW_XILINX; unsigned long GeoAddress; unsigned long SerialNumber; unsigned long Revision; } GPxi3051_StructDriverInfo2; /*------------------------------------------------------------------*/ /* Functions */ /*------------------------------------------------------------------*/ #define DllImport extern "C" __declspec( dllimport ) DllImport int GPxi3051_DLL_Version(unsigned long *pVersion); DllImport int GPxi3051_DpramReadMonitor(unsigned long card, unsigned long port,void *data, unsigned long *length); DllImport int GPxi3051_DpramReadResponse(unsigned long card, unsigned long port, unsigned char data[], unsigned long *length); DllImport int GPxi3051_DpramWriteInstruction(unsigned char data[], unsigned long length); DllImport int GPxi3051_GetDriverInfo(GPxi3051_StructDriverInfo *pDriverInfo); DllImport int GPxi3051_ResetPort(unsigned long card, unsigned long port); DllImport int GPxi3051_XilinxDownload(unsigned long card, char *pFileName); DllImport int GPxi3051_XilinxWriteData(unsigned char data[], unsigned long length);Und die Fehlermeldung
Temporäre Dateien und Ausgabedateien für "tcan - Win32 Debug" werden gelöscht. --------------------Konfiguration: tcan - Win32 Debug-------------------- Kompilierung läuft... StdAfx.cpp tcan.cpp D:\Users\Pierre\Eigene Dateien\Visual C\tcan\tcan.cpp(26) : error C2664: 'mtest' : Konvertierung des Parameters 3 von 'unsigned long (*)[12]' in 'unsigned long *[]' nicht moeglich Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat Fehler beim Ausführen von cl.exe. tcan.exe - 1 Fehler, 0 Warnung(en)Bitte helft mir.
Mit freundlichen Grüßen
PierreOne
-
Mach ein typedef.

-
Dieser Thread wurde von Moderator/in estartu aus dem Forum MFC (Visual C++) in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Das sind alles eindimensionale Arrays, typedef's brauchste dafür nicht.
unsigned long SW_XILINX[12] = {0,0,0,0,0,0,0,0,0,0,0,0}; unsigned long* arrPtr = SW_XILINX;
-
Wenn ich micht richtig entsinne ist ArrayXYZ[] schon ein Zeiger und muss nicht mit * voran definiert werden.
gruss
Marcus
-
UserMarcus schrieb:
Wenn ich micht richtig entsinne ist ArrayXYZ[] schon ein Zeiger und muss nicht mit * voran definiert werden.
Richtig!