Programmierstil...



  • so, dann will ich mal meinen allerersten thread hier im forum aufmachen... 😃

    worum geht es mir?
    ich will mich ein bissel anpassen... 😃
    und zwar habe ich eine function aus diesem tutorial (für pascal-umsteiger) ein bissel modifiziert, um daran zu üben...

    jetzt sieht das ganze so aus:

    enum TMemoryCopyMethodVariant {mcmvFast, mcmvSlow};
    
    void *MemoryCopy(void *ADestination, void *ASource, unsigned int AByteCount);
    void *MemoryCopyEx(void *ADestination, void *ASource, unsigned int AByteCount, TMemoryCopyMethodVariant AMemoryCopyMethodVariant);
    
    void *MemoryCopy(void *ADestination, void *ASource, unsigned int AByteCount)
    {
      return MemoryCopyEx(ADestination, ASource, AByteCount, mcmvFast);
    }
    
    void *MemoryCopyEx(void *ADestination, void *ASource, unsigned int AByteCount, TMemoryCopyMethodVariant AMemoryCopyMethodVariant)
    {
      if (AMemoryCopyMethodVariant == mcmvFast)
      {
        char *ByteDestination = (char *) ADestination;
        char *ByteSource = (char *) ASource;
        unsigned int Index = 0;
    
        for (Index = 0; Index < AByteCount; Index++)
          ByteDestination[Index] = ByteSource[Index];
    
        return ADestination;
      }
      else
      {
        if (AMemoryCopyMethodVariant == mcmvSlow)
        {
          for (unsigned int Index = 0; Index < AByteCount; Index++)
            ((char *) ADestination)[Index] = ((char *) ASource)[Index];
    
          return ADestination;
        }
      }
    
      return ASource;
    }
    

    jetzt ist meine frage, benutzt man in c++ eigentlich eher solche -Ex - varianten von funktionen, oder baut man einfach einen standard-parameter ein?
    ich habe es nämlich mit solchen -Ex - varianten gelernt...

    p.s.: noch eine frage am rande, wie kommt es, dass wenn ich über ASource irgendeinen pointer übergebe (z.b. den einer variable eines anderen programmes), dass ich da dann nicht an die daten rankomme?

    wfg,
    ShiKai



  • Ja, dann herzlich Willkommen.

    Ja, pass dich an, oder Du wirst von uns gebrochen. 😉
    Der besten Stil ist der, den man selber durch Erfahrung gewonnen hat.

    Die -Ex Varianten sind kein C++ Stil, nein.
    Deshalb gibt es Standard-Parameter und Überladung.

    Was meinst Du damit, du kommst nicht an die Daten von ASource ran?
    Du weißt, dass du den Pointer casten und dereferenzieren musst?

    int i = *(int*)ASource;
    

    Oder sind es Variablen aus einem anderen (laufenden) Programm?
    Dann solltest Du dir den Typqualifizierer volatile ansehen.



  • also, ich habe...

    "Programm: Test"

    char Values[10];
    
      for (Index = 0; Index < 10; Index++)
        Values[Index] = '9';
    
      cout << "Adress: " << (void *) Values << "\n";
    

    (damit kenn ich den wert vom pointer "(void 😉 Values" und kann ihn in meinem anderen programm per hand eingeben)

    "Programm: Memory"

    char CopiedMemory[10];
      int CopyPos;
    
      for (CopyPos = 0; CopyPos < 10; CopyPos++)
        CopiedMemory[CopyPos] = '0';
    
      cout << "Bitte geben sie an, wo aus dem Speicher kopiert werden soll: ";
      cin >> CopyPos;
    
      try
      {
        MemoryCopy(CopiedMemory, (void *) CopyPos, 10);
    
        cout << "\n\n";
        for (CopyPos = 0; CopyPos < 10; CopyPos++)
          cout << CopiedMemory[CopyPos];
        cout << "\n\n";
      }
      catch(...)
      {
        cout << "\n\nAn Error Has Occured: Chosen Memory-Adress Not Accessable\n\n";
      }
    

    (hier wird die speicher-adresse eingegeben, diese und die adresse von CopiedMemory wird and MemoryCopy übergeben, die ja jetzt eigentlich nur im speicher die bytes auslesen und kopieren sollte, egal was dort eigentlich steht.)

    hier tritt aber der fehler auf, denn anstatt der "9999999999" steht in CopiedMemory dann irgendwelches anderes zeugs...

    wfg,
    ShiKai



  • Sag mal, programmierst du unter MS-Dos ?

    Falls nicht:
    Weißt du, was virtueller Adressraum bedeutet?



  • das gibt als antwort ein doppel-FALSE... 😃
    ich arbeite unter Linux (Suse Linux 8.2 Prof) und Windows (Windows 2000 Prof)...
    was ist ein virtueller adressraum? 😕

    wfg,
    ShiKai



  • Jedes Programm hat seine eigenen Adressen von 0 bis ??

    D.h. Programm 1 legt seine Daten nicht an der Stelle ab, wo Programm 2 sie mit der selben (virtuellen) Adresse lesen würde.
    Starte mal dein Test-Programm mehrere Male gleichzeitig und du wirst trotzdem immer dieselben Adressen haben.

    Aber wo ist der Unterschied zw. mcmvFast und mcmvSlow? Auch blöd ist, dass ich für diese Bezeichner erst copy & paste machen musste 😉 In C++ gibts zB. Klassen oder Namespaces wo man keine Namenskollisionen bekommt.

    Abgesehen davon, könnte man diese If-Abfrage auf jeden Fall auch gut umgehen. Was du da machst, ist eigentlich nur:

    void func(x) {
      if(x == 1) func_1();
      if(x == 2) func_2();
    }
    

    Also ziemlich unnötig.



  • der unterschied ist, dass bei der mcmvSlow - variante die untypisierten pointer ADestination und ASource bei jedem schleifen-durchlauf erst zu einem char-pointer gecastet werden.
    dadurch fallen zwar 2 variablen weg, aber insgesamt werden mehr taktzyklen verbraucht (oder? 😃 )...
    und da ich noch am rumprobieren bin, ist das für mich die ideale lösung, um mal einfach so ein bissel rumzuprobieren...

    die enumerator mcmvFast und mcmvSlow hab' ich eingefügt, um meinem Object Pascal - stil ein bissel treu zu bleiben...
    dat sieht nämlich viel schöner mit nem eigenen parameter-typ als mit nem schnöden int - parameter aus... 😃

    und wie mache ich es dann, dass ich die korrekte speicheradresse kriege (und darauf zugreifen kann)?
    ich hatte nämlich versucht eine kreuzung zu machen.
    ich habe mir mit einem delphi-programm nen echten speicher-pointer besorgt und habe versucht, den zu benutzen.
    allerdings löst das ne exception auf.
    deswegen habe ich auch den try-catch-block (nennt man dat so?) eingefügt...

    wfg,
    Shikai



  • ich meinte eher, direkt fastcopy() und slowcopy() zu schreiben. Es sei denn, man braucht wirklich einen numerischen Wert...

    Naja, dein copy-Beispiel Beispiel ist ziemlich daneben 😉


Anmelden zum Antworten