Überprüfen ob array leer ist!



  • Hallo,
    ich möchte eine Überprüfung einbauen, ob das array Werte enthält.
    Hatte eigentlich an folgendes gedacht.

    unsigned char ID_numbers[MAX_ID_X][MAX_ID_Y]={0}; //initialisierung des 
                                                       //Feldes mit nullen
    
    //1 uberprufung, habe auch an folgendes gedacht
    if(memcmp(ID_numbers[0][0],"000000000000",12)==0);//falls nullen drin, 
    {
    ...
    }
    

    nur das Problem ist, wenn ich jetzt in dem Array eine zwölfstellige Zahl speichere, dann wird die Schleife trotzdem ausgeführt.
    geht es vllt. einfacher, oder eher gesagt auf diesem Weg funktioniert es leider nicht.



  • Hier ist so ziemlich alles falsch, was man in einer Zeile falsch machen kann:
    Du vergleichst mit ASCII '0' statt mit '\0' usw...
    Grübele mal ein bisschen über folgender Variante, ich glaube das ist dringend notwendig neben der Lektüre guter Fachliteratur:

    /* Initialisierung des Feldes */
    unsigned char ID_numbers[MAX_ID_X][MAX_ID_Y]={0};
    
    void *tmp;
    if( memcmp( ID_numbers,
                tmp=calloc(X_ID_X*MAX_ID_Y,sizeof**ID_numbers),
                X_ID_X*MAX_ID_Y*sizeof**ID_numbers) )
      puts("nicht leer");
    else
      puts("leer");
    free(tmp);
    


  • Wutz schrieb:

    Hier ist so ziemlich alles falsch, was man in einer Zeile falsch machen kann:
    Du vergleichst mit ASCII '0' statt mit '\0' usw...
    Grübele mal ein bisschen über folgender Variante, ich glaube das ist dringend notwendig neben der Lektüre guter Fachliteratur:

    /* Initialisierung des Feldes */
    unsigned char ID_numbers[MAX_ID_X][MAX_ID_Y]={0};
    
    void *tmp;
    if( memcmp( ID_numbers,
                tmp=calloc(X_ID_X*MAX_ID_Y,sizeof**ID_numbers),
                X_ID_X*MAX_ID_Y*sizeof**ID_numbers) )
      puts("nicht leer");
    else
      puts("leer");
    free(tmp);
    

    🙄



  • Das wäre mit einer statischen Konstante besser, aber ansonsten ist der Ansatz nicht blöd, sofern Geschwindigkeit wichtiger als Speicher ist und MAX_ID_X * MAX_ID_Y nicht allzu groß wird:

    static unsigned char const ID_numbers_empty[MAX_ID_X][MAX_ID_Y] = { 0 };
           unsigned char       ID_numbers      [MAX_ID_X][MAX_ID_Y] = { 0 };
    
    if(0 != memcmp(ID_numbers, ID_numbers_empty, sizeof(ID_numbers))) {
      puts("nicht leer");
    } else {
      puts("leer");
    }
    

    Allerdings geht der Geschwindigkeitsvorteil gegenüber einer einfachen Schleife mit calloc mehr als verloren.



  • alles klar, danke für die Tipps. Ich hatte nur angenommen (laut meinem C Buch), dass wenn ich das Feld mit Nullen initialisiere, dann kann ich einfach den Vergleich mit Nullen durchführen, und wenn die Nullen überschrieben wurden durch eine andere Nummer, dann könnte ich das feststellen. Anscheinend ist es doch net so einfach wie ich dachte.

    Gruß



  • Wutz schrieb:

    Hier ist so ziemlich alles falsch, was man in einer Zeile falsch machen kann:
    Du vergleichst mit ASCII '0' statt mit '\0' usw...
    Grübele mal ein bisschen über folgender Variante, ich glaube das ist dringend notwendig neben der Lektüre guter Fachliteratur:

    /* Initialisierung des Feldes */
    unsigned char ID_numbers[MAX_ID_X][MAX_ID_Y]={0};
    
    void *tmp;
    if( memcmp( ID_numbers,
                tmp=calloc(X_ID_X*MAX_ID_Y,sizeof**ID_numbers),
                X_ID_X*MAX_ID_Y*sizeof**ID_numbers) )
      puts("nicht leer");
    else
      puts("leer");
    free(tmp);
    

    Der Code ist ja nicht nur furchtbar, sondern auch gefährlich. calloc kann auch NULL zurück liefern... 👎



  • #include <stdio.h>
    #include <limits.h>
    
    #ifndef CHAR_BITS
    # define CHAR_BITS 8
    #endif
    
    int isEq(void *data,size_t ll,unsigned char c){
      size_t l = ll%sizeof(unsigned);
      if(l){
        unsigned char *d = data;
        ll-=l;
        while(l--)
          if(*d++ != c)
            return 0;
        data = d;
      }
      if(ll){
        unsigned mask = 0;
        unsigned *d = data;
        size_t l = sizeof(unsigned);
        while(l--){
          mask<<=CHAR_BITS;
          mask |=c;
        }
        ll/=sizeof(unsigned);
        while(ll--)
          if(*d++ != mask)
            return 0;
      }
      return 1;
    }
    int main()
    { char arr[5]={2,2,2,2,0};
      printf("%d",isEq(arr,5,2));
      return 0;
    }
    

    ο



  • :p



  • snoopy9134 schrieb:

    Hallo,
    ich möchte eine Überprüfung einbauen, ob das array Werte enthält.

    es ist sinnlos, da es die Zustände "leer/befüllt" gar nicht gibt. Eine Variable (und somit auch ein Array) hat/speichert immer einen Wert.


Anmelden zum Antworten