Problem mit Struct Array
-
Hallo,
ich hab vor ca 2 Tagen angefangen C zu lernen. Fand das alles auch ganz lustig und ich denke ich hab das Grundprenzip von Pointer schon verstanden aber es scheint trotzdem irgenwas bei meinem Code falsch zu sein.
Ich versuche ein Script der in Delphi (oder Pascal, kenn mich da nicht aus), geschrieben ist, in C umzuwandel. Das ganze Funktioniert über eine DLL.
Ich habe die meiner meinung nach wichtigen Teile des Delphi Codes in mein C Programm eingefügt.#include <windows.h> #include <stdio.h> //TtsrPlayerInfo = packed record // PlayerID : Integer; // ChannelID : Integer; // NickName : Array [0..29] of Char; // PlayerChannelPrivileges : Integer; // PlayerPrivileges : Integer; // PlayerFlags : Integer; // end; struct TtsrPlayerInfo { int PlayerID; int ChannelID; char Nickname[30]; int PlayerChannelPrivileges; int PlayerPrivileges; int PlayerFlags; }; /* PtsrServerInfo = ^TtsrServerInfo; TtsrServerInfo = packed record ServerName : Array [0..29] of Char; WelcomeMessage : Array [0..255] of Char; ServerVMajor : Integer; ServerVMinor : Integer; ServerVRelease : Integer; ServerVBuild : Integer; ServerPlatform : Array [0..29] of Char; ServerIp : Array [0..29] of Char; ServerHost : Array [0..99] of Char; ServerType : Integer; ServerMaxUsers : Integer; SupportedCodecs : Integer; ChannelCount : Integer; PlayerCount : Integer; end; */ struct TtsrServerInfo { char ServerName[30]; char WelcomeMessage[255]; int ServerVMajor; int ServerVMinor; int ServerVRelease; int ServerVBuild; char ServerPlatform[30]; char ServerIp[30]; char ServerHost[100]; int ServerType; int ServerMaxUsers; int SupportedCodecs; int ChannelCount; int PlayerCount; }; typedef int (_stdcall *TSRCONNECT)(const char*); typedef int (_stdcall *TSRGETPLAYERS)(TtsrPlayerInfo *Players, int *Records); typedef int (_stdcall *TSRGETSERVERINFO)(TtsrServerInfo tsrServerInfo[]); typedef int (_stdcall *TSRGETSPEAKERS)(int Speakers[], int *Records); int main() { HMODULE dll = LoadLibrary ("TSRemote.dll"); if (!dll) { printf ("Error importing Dll!\n->%p", dll); } else { printf ("importing successfull\n->%p\n", dll); } //char module[5000]; //GetModuleFileName ( dll, module, sizeof(module)); //printf ("%s", module); TSRCONNECT tsrConnect; TSRGETPLAYERS tsrGetPlayers; TSRGETSERVERINFO tsrGetServerInfo; TSRGETSPEAKERS tsrGetSpeakers; //TSRGETPLAYERS tsrGetPlayers; tsrConnect = (TSRCONNECT)GetProcAddress (dll, "tsrConnect"); /* procedure DoGetPlayers; var PlayersInfo : Array[0..1023] of TtsrPlayerInfo; Records : Integer; I: integer; begin Records := 1024; if not DisplayResult( tsrGetPlayers(@playersInfo, @records) ) then exit; Writeln('PlayerCount: ',Records); if Records > 0 then for I :=0 to Records-1 do DisplayPlayerInfo(PlayersInfo[I]); end; */ tsrGetPlayers =(TSRGETPLAYERS)GetProcAddress (dll, "tsrGetPlayers"); tsrGetServerInfo = (TSRGETSERVERINFO)GetProcAddress (dll, "tsrGetServerInfo"); tsrGetSpeakers = (TSRGETSPEAKERS)GetProcAddress (dll, "tsrGetSpeakers"); int Speakers[30]; int Records; Records = 30; int LastSpeakerCount; LastSpeakerCount = 0; tsrGetSpeakers (Speakers, &Records); // das geht printf ("Speaker: %d\n", Records); struct TtsrPlayerInfo Players[500]; int Records2; Records2 = 500; tsrGetPlayers (Players, &Records2); // jetzt stürzt das Programm ab printf ( "Players: %s", Records);
Mfg Tom
-
Oh mein Gott!
Hab den Fehler selbst gefunden hab die Sache die ganze Zeit aus dem falschen Blickwinkel betrachtet. Hab ich doch das %s übesehen!Okay nächstes Problem
Hab jetzt den Code wie folgt geändert
struct TtsrPlayerInfo Players[500]; int Records2; Records2 = 500; tsrGetPlayers (Players, &Records2); // jetzt stürzt das Programm ab printf ( "Players: %d\n", Records2); for (int i = 0; i < Records2; i++) { printf ("Player #%d %s\n", Players[i].PlayerID, Players[i].Nickname); }
Als Ausgabe bekomm ich:
importing successfull ->00480000 Speaker: 1 Players: 4 Player #7 DarkSide Player #65536 ti Player #1 e Player #1546584064 /\/4
Es sollte aber eher aussehen wie:
importing successfull ->00480000 Speaker: 1 Players: 4 Player #7 DarkSide Player #8 Ati Player #9 Pote Player #10 /\/\0\/\/4
Es wird also irgenwas abgeschnitten. Woran kann das liegen?
Danke für eure Hilfe
-
in deiner nachgebauten struct 'TtsrServerInfo' ist 'WelcomeMessage' ein zeichen zu kurz, dadurch rutscht alles dahinter nach oben. wahrscheinlich erwartet 'tsrGetPlayers' ein anderes struct alignment. probiers mal mit #pragma pack(1) (für die anderen structs auch).
-
Danke die änderung an WelcomeMessage und ein alignment von 2 hats getan.