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.
-
-
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.