Wie prüfen ob Struktur leer ist



  • Moin,

    ich habe hier ein Array of Struktur, das bei Programmstart komplett auf 0 gesetzt wird.

    typedef struct _user_tools{
    	char		prog_name[LEN_PROGNAME];
    	char		path_exe[LEN_FILE];
    	char		cmd_line[LEN_FILE];
    	char		work_dir[LEN_FILE];
    	char		icon_path[LEN_FILE];
    	int		icon_index;
    }user_tools_t;
    
    extern	user_tools_t	utools[MAX_USERTOOLS];
    

    Jetzt wollte ich auf einfachem Weg prüfen welche Elemenete "utools[i]" leer sind und nur die gefüllten utools[i] Elemente speichern

    for(i = 0; i < MAX_USERTOOLS; i++){
    	for(j = 0; j < sizeof(utools[0]); j++){
    		if(utools[i][j] != '\0'){
    			Registry_WriteValue(......);
    			break;
    		}
    	}
    }
    

    der Compiler meckert nun über folgende zeile:

    if(utools[i][j] != '\0'){
    

    ich habs auch schon so probiert

    if(*(&utools[i] + j) != '\0'){
    

    Klar ist, daß ich die Elemente der Struktur auch einzeln prüfen könnte, ich möchte aber gerne wissen ob man es prinzipell so machen könnte wie ich es im Ansatz versucht habe, kann mir jemande einen hinweis geben wie ich es richtig machen muss?



  • ich würde erstmal festlegen, was 'leer' bedeutet. angenommen es heisst 'kein progname', dann könnte man z.b. mit if (utools[i].progname == 0) testen, ob das element frei ist.
    🙂



  • Warum sollte ein Member-Array NULL sein? Wenn du wie beschrieben alle Member 0 setzt, dann kannst du auf Inhalt so prüfen: if (*utools[i].prog_name == 0). @fricky: Hast wohl nur das Sternchen vergessen.



  • Big Brother schrieb:

    @fricky: Hast wohl nur das Sternchen vergessen.

    stimmt.
    🙂



  • Ich habe mich vieleicht undeutlich ausgedrückt, daher nochmals kurze Erklärung. Bei Programmstart wird die komplette Struktur per memset mit Nullen gefülllt. Wären der Laufzeit kann der User die Struktur teilweise füllen indem er Einstellungen vornimmt. So, bei Programmende sollen jetzt die Arrays in die Registry geschrieben werden, die Daten enthalten, d.h. sobald in einem "utools[i]" eines der Elemente ein anderes zeichen als '\0' enthält gilt die Struktur nicht als leer. Lange Rede kurzer Sinn meine funktionierende Lösung sieht jetzt so aus:

    char	*position;
    :
    :
    :
    :
    		position = (char *)&utools[i];
    		for(j = 0; j < sizeof(utools[0]); j++){
    			if(*(position + j) != '\0'){
    				write_registry = TRUE;
    				break;
    			}
    		}
    

    Keine Fehlermeldungen mehr vom Compiler



  • Achso, die ICH-SCHREIB-FLEISSIG-CODE-UND-PRÜFE-JEDES-ELEMENT Variante war mir schon klar. Sinn und Zweck meiner Frage war, die Arrays in einem Rutsch zu prüfen.



  • Rüüdiger schrieb:

    Achso, die ICH-SCHREIB-FLEISSIG-CODE-UND-PRÜFE-JEDES-ELEMENT Variante war mir schon klar. Sinn und Zweck meiner Frage war, die Arrays in einem Rutsch zu prüfen.

    sind denn die anderen einträge gültig, wenn kein 'prog_name' existiert? wenn nicht, kannstes dir, wie schon gesagt, einfacher machen.
    🙂



  • +fricky schrieb:

    sind denn die anderen einträge gültig, wenn kein 'prog_name' existiert? wenn nicht, kannstes dir, wie schon gesagt, einfacher machen.
    🙂

    Ah jetzt weiss ich worauf du hinaus willst, der Eintrag kann auch gültig sein, wenn nur ein Icon angegeben ist.



  • Rüüdiger schrieb:

    Ich habe mich vieleicht undeutlich ausgedrückt, daher nochmals kurze Erklärung. Bei Programmstart wird die komplette Struktur per memset mit Nullen gefülllt. Wären der Laufzeit kann der User die Struktur teilweise füllen indem er Einstellungen vornimmt....
    Achso, die ICH-SCHREIB-FLEISSIG-CODE-UND-PRÜFE-JEDES-ELEMENT Variante war mir schon klar. Sinn und Zweck meiner Frage war, die Arrays in einem Rutsch zu prüfen....

    Wenns meherere Strukturen sind, indem du die Zeiger der benutzten speicherst.
    Was versprichst du dir davon, Laufzeitvorteile? Kannst du vernachlässigen.


Anmelden zum Antworten