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.


Anmelden zum Antworten