AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein C# Sehr komplizierter Code, was macht er? Profis gefragt!

Sehr komplizierter Code, was macht er? Profis gefragt!

Ein Thema von DieDolly · begonnen am 16. Mai 2019 · letzter Beitrag vom 17. Mai 2019
Antwort Antwort
Seite 1 von 3  1 23   
DieDolly

Registriert seit: 22. Jun 2018
812 Beiträge
 
#1

Sehr komplizierter Code, was macht er? Profis gefragt!

  Alt 16. Mai 2019, 10:10
Derzeit arbeite ich an der Umprogrammierung eines Projekts von C# nach Delphi. Das neue Delphiprogramm ist komplett OOP, klassenbasiert und fertig bis auf die Speicherung der im Programm zusammengeklickten Daten. Es gibt aber einen Code im Original den ich einfach nicht verstehe.

Die Rohdaten die ausgelesen werden sehen so aus
Code:
economy_event_queue : _nameless.140.cd47.d450 {
 data: 1234
 data[0]: _nameless.140.abfd.f040
 data[1]: _nameless.140.ea83.2220
 data[2]: _nameless.140.abfd.f070
 <noch viele mehr, bis 1235
Ein economy_event siehtr beispielsweise so aus
Code:
economy_event : _nameless.140.abfd.f040 {
 time: 11245387
 unit_link: company.volatile.ika_bohag.stockholm
 param: 1
}
Das da oben ist in einer Datei in der noch viele andere Dinge stehen. Aber alßle sind gleich aufgebaut und getrennt durch Doppelpunkte und Leerzeichen.

Der Originalcode ließt die Datei ein und geht sie zeilenweise durch. An einer Stelle steht dann der Code durch den ich um alles in der Welt nicht verstehe
Auslesen der daten
Code:
// hier oben steht noch eine äußere for-Schleife, die von Zeile 0 bis <letzte Zeile> der Datei geht. nu und num2 sind anfangs 0.
if (plik[i].StartsWith(" data[") && plik[i].Contains("nameless"))
{
   string text3 = plik[i].Split(' ')[2];
   economy_events_table[num, 0] = text3;
   num++;
}
if (!plik[i].StartsWith("economy_event : "))
{
   continue;
}
for (int j = 1; j < 5; j++)
{
   economy_events_table[num2, j] = plik[i + j - 1]; // Welche Magie findet hier statt und WARUM, obwohl man doch nur diese eine Zeile braucht?
   if (j == 2)
   {
      string text4 = economy_events_table[num2, j].Split(' ')[2];
      economy_events_table[num2, j] = text4;
   }
}
num2++;
Sobald auf den Speichern button gedrückt wird, geht das Originalprogramm nochmal durch alle Dateien durch und stellt diese Magie die ich nicht verstehe mit den economy_events_table an.
Code:
for (int i = 1; i < plik.Length; i++)
{
   streamWriter.WriteLine(plik[i]);
   string text = plik[i];
   for (int j = 0; j < write_company.Length; j++)
   {
      if (plik[i] == write_company[j])
      {
         flag = true;
         num2 = j;
         string text2 = plik[i];
      }
      if (plik[i].StartsWith("economy_event_queue :"))
      {
         streamWriter.WriteLine(plik[i + 1]);
         i++;
         int k;
         for (k = 0; k < economy_events_table.GetLength(0); k++)
         {
            streamWriter.WriteLine(" data[" + k + "]: " + economy_events_table[k, 0]);
         }
         i += k;
         streamWriter.WriteLine("}");
         streamWriter.WriteLine("");
         i += 2;
         for (int l = 0; l < economy_events_table.GetLength(0); l++) // Und was passiert hier? Wie wird time berechnet? Ist das rein zufällig?
         {
            for (int m = 1; m < economy_events_table.GetLength(1); m++)
            {
               if (m == 2)
               {
                  streamWriter.WriteLine(" time: " + economy_events_table[l, m]);
               }
               else
               {
                  streamWriter.WriteLine(economy_events_table[l, m]);
               }
            }
            streamWriter.WriteLine("}");
            streamWriter.WriteLine("");
            i += 6;
         }
      }
      if (flag && plik[i].StartsWith("job_offer_data : "))
      {
         string text3 = jobs_added[num2];
         string text4 = plik[i];
         streamWriter.WriteLine(jobs_added[num2]);
         i += 11;
         flag = false;
         num++;
      }
   }
}
Das ist viel Code aber ich habe alles reingeschrieben, damit der Kontext nicht fehlt.
Sieht das für euch nach schlechtem, undurchdachtem Code aus egal wie ans Ziel kommen soll? Oder steckt hier was dahinter?

economy_events_table's ist ein Array und soll alle Datensätze aus economy_event_queue enthalten. Aber warum so umständlich, zweidimensional und und und?
Speziell die Zeile wo "time: " ausgegeben wird macht mich etwas ärgerlich, da ich seit Tagen nicht dahinter komme, anhand welcher Daten (die mit welcher M;agie auch immer in die Arrays kommen) das berechnet wird.

Geändert von DieDolly (16. Mai 2019 um 10:13 Uhr)
  Mit Zitat antworten Zitat
Schokohase

Registriert seit: 17. Apr 2018
725 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Sehr komplizierter Code, was macht er? Profis gefragt!

  Alt 16. Mai 2019, 11:10
Es wäre nicht schlecht, wenn du ein komplettes Programm (in C#) zeigen würdest mit den Eingangsdaten, was daraus dann den gewünschten Output produziert.

Dann könnte dir auch (sinnvoll und schnell) geholfen werden.

Und ja, der Code ist schlecht geschrieben. Mag schnell sein, aber eben nur schwer verständlich.

Grundsätzlich gehe ich so etwas an, indem ich Klassen erstelle um die Eingangs- und Ausgangsdaten abzubilden. Dann gibt es eine Klasse, die die Eingangswerte lesen kann, eine Klasse die die Werte von Eingang zu Ausgang konvertiert und eine die die Ausgangsdaten ausgibt. Das ist dann sehr einfach nachzuvollziehen.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
812 Beiträge
 
#3

AW: Sehr komplizierter Code, was macht er? Profis gefragt!

  Alt 16. Mai 2019, 13:45
Es handelt sich hierbei um ein Programm, welches Konfigurationsdateien für ein Spiel verändert. Ich weiß nicht inwiefern ich sowas teilen darf.
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.377 Beiträge
 
Delphi 2010 Architect
 
#4

AW: Sehr komplizierter Code, was macht er? Profis gefragt!

  Alt 16. Mai 2019, 17:26
Code:
for (int l = 0; l < economy_events_table.GetLength(0); l++)
Zitat:
Und was passiert hier? Wie wird time berechnet? Ist das rein zufällig?
Nö da ist nichts zufällig.
Der wert für Time steht an der Position l, m wobei economy_events_table[l, m]); die zeit als String zurück gibt
In deinem Code ist leider nicht ersichtlich wie die economy_events_table gefüllt wird.
Die Schnipsel zeigen nur wie du sie darstellst.. wenn sie im Array schon vorhanden sind.. siehe "WriteLine"

Code:
streamWriter.WriteLine(" time: " + economy_events_table[l, m]);
Delphi-Quellcode:
var
  l, m, Len: Integer
   
begin

  Len := economy_events_table.GetLength(0);
  for l := 0 to Len - 1 do
    streamWriter.WriteLine(' time: ' + economy_events_table[l, m]);
  
end;
Code:
i += 2;
inc(i, 2); oder
i = i + 2;
Code:
if (m == 2)
if (m = 2)
Code:
num++;
inc(num);

streamWriter kannst du in etwa mit TMemoryStream oder TFileStream vergleichen.

Eigentlich ist das sehr einfach zu verstehen..
Starte VisualStudio mit dem CSharp Quelltext.. setze an den punkten wo du was nicht verstehst nen Breakpoint.
Starte gleichzeitig Delphi und versuche dann die werte wie sie berechnet werden in Delphi umzusetzen.

Zitat:
Aber warum so umständlich, zweidimensional und und und?
Da ist nichts umständlich.. Es ist gegeben und zwar abhängig von der Table wie sie gefüllt wird.

gruss

Geändert von EWeiss (16. Mai 2019 um 18:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
6.714 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Sehr komplizierter Code, was macht er? Profis gefragt!

  Alt 16. Mai 2019, 18:56
In deinem Code ist leider nicht ersichtlich wie die economy_events_table gefüllt wird.
Äh, doch:
Code:
// hier oben steht noch eine äußere for-Schleife, die von Zeile 0 bis <letzte Zeile> der Datei geht. nu und num2 sind anfangs 0.
if (plik[i].StartsWith(" data[") && plik[i].Contains("nameless"))
{
   string text3 = plik[i].Split(' ')[2];
   economy_events_table[num, 0] = text3;
   num++;
}
if (!plik[i].StartsWith("economy_event : "))
{
   continue;
}
for (int j = 1; j < 5; j++)
{
   economy_events_table[num2, j] = plik[i + j - 1]; // Welche Magie findet hier statt und WARUM, obwohl man doch nur diese eine Zeile braucht?
   if (j == 2)
   {
      string text4 = economy_events_table[num2, j].Split(' ')[2];
      economy_events_table[num2, j] = text4;
   }
}
num2++;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
812 Beiträge
 
#6

AW: Sehr komplizierter Code, was macht er? Profis gefragt!

  Alt 17. Mai 2019, 00:51
Für mich sieht das fast aus, als wisse der Urheber des Codes nicht was er da tut. Die Daten die er füllt (siehe Zitat Uwe Raabe) , sind völlig aus der Luft gegriffen und über mehrere Zeilen verteilt obwohl 1 Zeile = 1 Datensatz. Das ist es was ich nicht verstehe: was wird da gefüllt und warum ließt der über mehrere Zeilen aus, obwohl wie gesagt 1 Zeile = 1 Datensatz?
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.377 Beiträge
 
Delphi 2010 Architect
 
#7

AW: Sehr komplizierter Code, was macht er? Profis gefragt!

  Alt 17. Mai 2019, 04:09
in deinem code ist leider nicht ersichtlich wie die economy_events_table gefüllt wird.
äh, doch:
Ja du hast recht..

Zitat:
Für mich sieht das fast aus, als wisse der Urheber des Codes nicht was er da tut
Ich würde mich nur an das Ergebnis halten und den Original Code gar nicht erst versuchen 1 zu 1 übersetzen.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
6.714 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Sehr komplizierter Code, was macht er? Profis gefragt!

  Alt 17. Mai 2019, 07:29
Ich bin nun wirklich nicht so fit in C#, aber wenn nicht zwischendurch noch was mit den Arrays passiert, müsste das Ergebnis doch genauso aussehen wie das Original - oder ich übersehe da was.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.377 Beiträge
 
Delphi 2010 Architect
 
#9

AW: Sehr komplizierter Code, was macht er? Profis gefragt!

  Alt 17. Mai 2019, 07:57
Ich bin nun wirklich nicht so fit in C#, aber wenn nicht zwischendurch noch was mit den Arrays passiert, müsste das Ergebnis doch genauso aussehen wie das Original - oder ich übersehe da was.
jep..
Nur der TE hat Probleme den Code zu lesen bzw. zu übersetzen.

gruss
  Mit Zitat antworten Zitat
Schokohase

Registriert seit: 17. Apr 2018
725 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

AW: Sehr komplizierter Code, was macht er? Profis gefragt!

  Alt 17. Mai 2019, 08:38
Nur mal so zum kucken (sieht quasi so aus wie das Original und funktioniert auch so)
Delphi-Quellcode:
program SpielDaten;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

type
  TMultiArray = array of array [0 .. 4] of string;

procedure ReadData(const Plik: TArray<string>; var Economy_Events_Table:TMultiArray);
var
  i, j, num, num2: Integer;
  Text3: string;
begin
  SetLength(Economy_Events_Table, Length(Plik));
  num := 0;
  num2 := 0;
  for i := 0 to Length(Plik) - 1 do
  begin
    if Plik[i].StartsWith(' data[') and Plik[i].Contains('nameless') then
    begin
      Text3 := Plik[i].Split([' '])[2];
      Economy_Events_Table[num, 0] := Text3;
      Inc(num);
    end;
    if not Plik[i].StartsWith('economy_event : ') then
      Continue;
    for j := 1 to 4 do
    begin
      Economy_Events_Table[num2, j] := Plik[i + j - 1];
      if j = 2 then
      begin // das hier ist die Zeile mit ' time: ' da nehmen wir nur den Wert
        Economy_Events_Table[num2, j] := Economy_Events_Table[num2, j].Split([' '])[2];
      end;
    end;
    Inc(num2);
  end;
  SetLength(Economy_Events_Table, num);
end;

procedure Test;
var
  data: TArray<string>;
  res : TMultiArray;
begin
  data := [ //
    'economy_event_queue : _nameless.140.cd47.d450 {', //
    ' data: 1234', //
    ' data[0]: _nameless.140.abfd.f040', //
    ' data[1]: _nameless.140.ea83.2220', //
    '}', //
    'economy_event : _nameless.140.abfd.f040 {', //
    ' time: 11245387', //
    ' unit_link: company.volatile.ika_bohag.stockholm', //
    ' param: 1', //
    '}', //
    'economy_event : _nameless.140.ea83.2220 {', //
    ' time: 11245999', //
    ' unit_link: company.volatile.ika_bohag.oslo', //
    ' param: 1', //
    '}'];

  ReadData(data,res);
end;

begin
  try
    { TODO -oUser -cConsole Main : Code hier einfügen }
    Test;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.

Geändert von Schokohase (17. Mai 2019 um 08:49 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

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 04:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf