Funktion vereinfachen, brauche Hilfe



  • Moin,
    ➡ Kann man diese Funktion vereinfachen?
    ➡ Vielen Dank schonmal für eure Hilfe

    void SAVE_and_PUT_Handler (int mode)
    {
        int address = (int)evaluate_ex();
        word var_position;
        word len;
    
        if (mode == DO_SAVE)
          address = address % DF_USERSPACE_MAX_LENGTH + DF_USERSPACE_BASE;    
    
        switch (ReadByteCodeSegByte())
        {
          // Mikes extensions
    
          case DT_FUNCTION:
          ReadByteCodeSegByte();  // Skip ID_ANSI
          switch (ReadByteCodeSegByte())
          {
            case IK_TIMES:
            {
                char *string = (char*)HEAP_calloc (heap_ptr, 1,STRVAR_DEFAULT_SIZE);
                TIMES_Handler (string);
    #ifdef WIN32
                printf ("saving TIME$\n");
    #else
                if (mode == DO_SAVE)
                  DF_Write (address, (uchar_t*)string, strlen(string));
                else
                  LastBasicError = CMD_FWrite (address, (uchar_t*)string, strlen(string));
    #endif
                HEAP_free (heap_ptr, string);
            }
            break;
    
            case IK_DATES:
            {
                char *string = (char*)HEAP_calloc (heap_ptr, 1,STRVAR_DEFAULT_SIZE);
                DATES_Handler (string);
    #ifdef WIN32
                printf ("saving DATE$\n");
    #else
                if (mode == DO_SAVE)
                  DF_Write (address, (uchar_t*)string, strlen(string));
                else
                  LastBasicError = CMD_FWrite (address, (uchar_t*)string, strlen(string));
    #endif
                HEAP_free (heap_ptr, string);
            }
            break;
    
          }
          break; // Case DT_FUNCTION
    
          case DT_FULLARRAY:
          {
             struct arraylist *alp;
    
             switch (ReadByteCodeSegByte())
             {
               case DT_INTEGER:
               ReadByteCodeSeg (&var_position,2);
               alp = &intarray[var_position];
    #ifdef WIN32
               printf ("saving integer array\n");
    #else
               if (mode == DO_SAVE)
                  DF_Write (address, alp->value, alp->size*sizeof(int));
               else
                  LastBasicError = CMD_FWrite (address, alp->value, alp->size*sizeof(int));
    #endif
               break;
    
               case DT_BYTE:
               {
                 ReadByteCodeSeg (&var_position,2);
                 alp = &intarray[var_position];
    #ifdef WIN32
                 printf ("saving byte array\n");
    #else
                 if (mode == DO_SAVE)
                    DF_Write (address, alp->value, alp->size);
                 else
                    LastBasicError = CMD_FWrite (address, alp->value, alp->size);
    #endif
               }
               break;
             }
          }
          break;  // DT_FULLARRAY
    
          case DT_ARRAY:
          {
             int idx;
             int i;
             byte b;
    
             switch (ReadByteCodeSegByte())
             {
                case DT_INTEGER:
                ReadByteCodeSeg (&var_position,2);
                idx = (int)evaluate_ex();
                i = (int)*((int*)(intarray[var_position].value)+(arrshift[var_position]+idx));
    #ifdef WIN32
                printf ("saving integer value from array\n");
    #else
                if (mode == DO_SAVE)
                  DF_Write (address, (uchar_t*)&i, sizeof(int));
                else
                  LastBasicError = CMD_FWrite (address, (uchar_t*)&i, sizeof(int));
    #endif
                break;
    
                case DT_BYTE:
                ReadByteCodeSeg (&var_position,2);
                idx = (int)evaluate_ex();
                b = *((byte*)(intarray[var_position].value)+(arrshift[var_position]+idx));
    #ifdef WIN32
                printf ("saving byte value from array\n");
    #else
                if (mode == DO_SAVE)
                  DF_Write (address, (uchar_t*)&b, 1);
                else
                  LastBasicError = CMD_FWrite (address, (uchar_t*)&b, 1);
    #endif
                break;
             }
          }
          break;
    
          case DT_CONST:
          {
             uchar_t b;
             float f;
    
             switch (ReadByteCodeSegByte())
             {
                case DT_BYTE:
                b = ReadByteCodeSegByte();
    #ifdef WIN32
                printf ("saving byte constant: %d\n", b);
    #else
                if (mode == DO_SAVE)
                  DF_Write (address, &b, 1);
                else
                  LastBasicError = CMD_FWrite (address, &b, 1);
    #endif
                break;
    
                case DT_SINGLE:
                ReadByteCodeSeg (&f, 4);            
    #ifdef WIN32
                printf ("saving float constant: %f\n", f);
    #else
                if (mode == DO_SAVE)
                  DF_Write (address, (uchar_t*)&f, 4);
                else
                  LastBasicError = CMD_FWrite (address, (uchar_t*)&f, 4);
    #endif
                break;
             }
          }
          break;  // case DT_CONST
    
          case DT_STRING:
             ReadByteCodeSeg (&var_position,2);
             {
                char *string = (char*)HEAP_calloc (heap_ptr, 1,STRVAR_DEFAULT_SIZE);
                len = (word)strlen(charstack[var_position]);
                strncpy(string, charstack[var_position], len+1);
    #ifdef WIN32
                printf ("saving string constant\n");
    
    #else
                if (mode == DO_SAVE)
                  DF_Write (address, (uchar_t*)string, strlen(string));
                else
                  LastBasicError = CMD_FWrite (address, (uchar_t*)string, strlen(string));
    #endif
                HEAP_free (heap_ptr, string);
             }
             break;
    
          case DT_SINGLE:
              ReadByteCodeSeg (&var_position,2);
              {
                float single_num = (float)*intstack[var_position];
    #ifdef WIN32
                printf ("saving float variable\n");
    #else
                if (mode == DO_SAVE)
                  DF_Write (address, (uchar_t*)&single_num, 4);
                else
                  LastBasicError = CMD_FWrite (address, (uchar_t*)&single_num, 4);
    #endif
              }
              break;
       }
    }
    


  • Gegenfrage: Was soll die Funktion überhaupt machen?

    Auf jeden Fall könntest du die ständig gleichen Blöcke "if(mode==do_save)...else..." aus dem gewaltigen switch() auslagern oder in eine Unterfunktion packen. Und die "#ifdef WIN32" Abschnitte sehen auch nach einer Notlösung aus.



  • Danke, CStoll. Das Auslagern der Schreibfunktion ist schon mal eine sehr gute Idee!!!
    Die Funktion ist Teil einer Virtual Machine. Sie speichert Variablen und Konstanten entweder auf eine SD-Karte oder in einen fest angeschlossenen Flash-Speicher.
    Läßt sich noch was vereinfachen?



  • Die WIN32 Abschnitte sind nur zum Debuggen. Der Code läuft auf einem Embedded System.



  • Fred vom Jupiter schrieb:

    Sie speichert Variablen und Konstanten entweder auf eine SD-Karte oder in einen fest angeschlossenen Flash-Speicher.

    Und auf Windows-Systemen gibt es keins von beidem? oder was sollen die "#ifdef WIN32"-Blöcke bewirken?

    btw - was auffällt ist, daß du anscheinend viel mit globalen Daten arbeitest. Dadurch geht einiges an Struktur verloren.



  • CStoll schrieb:

    Fred vom Jupiter schrieb:

    Sie speichert Variablen und Konstanten entweder auf eine SD-Karte oder in einen fest angeschlossenen Flash-Speicher.

    Und auf Windows-Systemen gibt es keins von beidem? oder was sollen die "#ifdef WIN32"-Blöcke bewirken?

    Unter Windows möchte ich nur sehen ob die Funktion richtig verzweigt. Ist nur eine Debugging-Hilfe.

    CStoll schrieb:

    btw - was auffällt ist, daß du anscheinend viel mit globalen Daten arbeitest. Dadurch geht einiges an Struktur verloren.

    Ja. Aber das sind Daten, die Ich überall in dem Modul brauche. Sollte ich die an die verschiedenen Funktionen übergeben? Würde das den Code nicht aufblähen?


Anmelden zum Antworten