Gedankenspiele mit *.ini



  • Moin liebe Forummitglider

    Wie ihr ja vieleicht aus einem meiner beiträge aus dem Spieleprogrammierung
    Bereich entnommen habt, arbeite ich an einem eigenen Spiel. Mitlerweile bin
    ich so weit, dass das spiel sauber läuft, nur möchte ich jetzt nur noch einige
    unschöne dinge wegmachen und code vereinfachen.

    Daher habe ich jetzt mal einige dinge überlegt, so zum beispiel: eintragung von
    Spieleinstellungen in *.ini dateien. Was jetzt die Frage aufbringt (rein vom
    Aufbau des Programmes her) wie ich das ganze jetzt mache. Sprich: soll ich für
    die Werte (Hintergrundfarbe, Steuerung, Dateipfade etc.) structuren anlegen oder
    bei Globalen Variablen bleiben?

    Hier meine ersten Spielereien mit *.ini dateien:

    #include <windows.h> 
    #include <stdio.h>
    
    int main() 
    {  
    	char theme[3][100]={
    		{"Namen"},
    		{"Vornamen"},
    		{"Telefonnummer"}
    	};
    	char schluessel[3][3][100]={
    		{{"Name1"}, {"Name2"}, {"Name3"}},
    		{{"Vorname1"}, {"Vorname2"}, {"Vorname3"}},
    		{{"Telefonnummer1"}, {"Telefonnummer2"}, {"Telefonnummer3"}}
    	};
    	char werte[3][3][100]={
    		{{"Bauer"}, {"Sommer"}, {"Kraller"}},
    		{{"Daniel"}, {"Marcel"}, {"Philipp"}},
    		{{"0664 413 50 92"}, {"0664 387 17 98"}, {"0664 249 24 49"}}
    	};
    
    	char werte2[3][3][100];
    
    	int i=0, j=0;
    	char pfad[100];
    
    	DWORD destSize;
    
    	destSize=100;
    
    	for(i=0; i<3; i++){
    		for(j=0; j<3; j++){
    			WritePrivateProfileString(theme[i],schluessel[i][j], werte[i][j],"setting/test.ini"); 
    
    			GetPrivateProfileString(theme[i], schluessel[i][j], "NULL", werte2[i][j], destSize, "setting/test.ini");
    		}
    	}
    
    	for(i=0; i<3; i++){
    		printf("\n[%s]\n\n", theme[i]);
    		for(j=0; j<3; j++){
    			printf("%s = ", schluessel[i][j]);
    			printf("%s\n", werte2[i][j]);
    		}
    	}
    
    	system("PAUSE");
    
    	return 0; 
    }
    

    Ich lese also die Daten aus der Ini datei, doch für die übersicht: globale
    variablen vs. structuren... was ist hier (bedenket es ist ein Spiel mit ungefär
    6´000 zeilen, wenig im vergleich zu manch anderen dingen, doch würde eine
    Structur zeilen verringern, oder vermehren?) besser?

    Gruß
    ITEDVO



  • Globale Variablen sind immer zu vermeiden, solange es geht. Und wenn es nicht geht, sucht man sich einen Weg globale Variablen zu vermeiden.
    Der Übersichtlichkeit für deinen Quellcode schadet das auch nicht. Eher im Gegenteil, du bekommst viel einfacher mit, wo deine Daten herkommen. Die Frage ob globale Variablen oder Strukturen verstehe ich aber nicht, dass ein ein Vergleich von Äpfeln mit Birnen.



  • was ich damit meine ist, zum beispiel, das SDL_Surface *screen... dieser
    wird in so gut wie jedem unterprogramm verwendet.. ob es jetzt nun damit zu tun
    hat, dass ein Pixel gezeichnet wird, oder ein Bild gezeigt wird. oder bei
    verwendung von Threads, wenn dabei "screen" verändert wird (darstellung von
    Feuer, die Animation zum beispiel)... Das meine ich mit Globale Variablen.

    und wenn ich

    struct anschrift{
         char name[10][20];
         char vorname[10][20];
         char telefonnummer[10][20];
    } anschrift;
    

    verwende, so ist diese etwa nicht auch global? denn es wird nicht mehr erwartet,
    dass in einer funktion bzw. im main() folgendes geschieht:

    struct anschrift Block_a;
    


  • itedvo schrieb:

    was ich damit meine ist, zum beispiel, das SDL_Surface *screen... dieser
    wird in so gut wie jedem unterprogramm verwendet..

    Dann übergibst du eben jedesmal den Zeiger. Den screen global zu machen, würde maximal funktionieren, wenn es nur einen einzigen screen gibt.
    Hast du schon mal über eine Art Singleton nachgedacht?

    itedvo schrieb:

    verwende, so ist diese etwa nicht auch global? denn es wird nicht mehr erwartet,
    dass in einer funktion bzw. im main() folgendes geschieht:

    Das wären aber zwei verschiedene Instanzen. Eine globale und eine lokale in main. Ich würde das nicht in einen Topf werfen.



  • so, ich habe jetzt mal den gesamten code überarbeitet und wäre über verbesserungs
    vorschläge sehr froh...

    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    #include <Windows.h>
    #include "DEF.H"
    
    struct Settings{
    
    	char theme[3][100];
    	char key[3][9][100];
    	char StdValue[3][9][100];
    	char werte[3][9][100];
    	int AnzSV[3][1];
    
    } Settings;
    
    void FillIniStructST(void);
    void FillStdValue(void);
    void WriteStdIni(void);
    void ReadIni(void);
    
    int main(void){
    
    	int i, j;
    	char pfad[100];
    
    	FillIniStructST();
    	FillStdValue();
    	ReadIni();
    
    	for(i=0; i<3; i++){
    		printf("\n[%s]\n\n", Settings.theme[i]);
    		for(j=0; j < Settings.AnzSV[i][0]; j++){
    			printf("%s = ", Settings.key[i][j]);
    			printf("%s\n", Settings.werte[i][j]);
    		}
    	}
    
    	getch();
    
    	return 0;
    }
    
    void FillIniStructST(void){
    
    	int i, j, z=0;
    	char string[100];
    	char help;
    
    	Settings.AnzSV[0][0]=3;
    	Settings.AnzSV[1][0]=2;
    	Settings.AnzSV[2][0]=9;
    
    	FILE *dat;
    
    	dat=fopen("StdIni.bcs","r+");
    
    	if(dat == NULL)
    		return;
    
    	for(i=0; i<3; i++){
    		z=0;
    		do{
    			help=fgetc(dat);
    			if(help != ';' && help != '\n')
    				string[z++]=help;
    		}while(help != ';');
    		string[z]='\0';
    		strcpy(Settings.theme[i], (const char *) string);
    	}
    
    	for(i=0; i<3; i++){
    		for(j=0; j < Settings.AnzSV[i][0]; j++){
    			z=0;
    			do{
    				help=fgetc(dat);
    				if(help != ';' && help != '\n')
    					string[z++]=help;
    			}while(help != ';');
    			string[z]='\0';
    			strcpy(Settings.key[i][j], (const char *) string);
    		}
    	}
    
    	fclose(dat);
    
    }
    
    void FillStdValue(void){
    
    	FILE* dat;
    	int i, j, z;
    	char help;
    
    	dat=fopen("StdValue.bcs", "r");
    
    	if(dat==NULL)
    		return;
    
    	for(i=0; i<3; i++){
    		for(j=0; j<Settings.AnzSV[i][0]; j++){
    			z=0;
    			do{
    				help=fgetc(dat);
    				if(help != ';' && help != '\n'){
    
    					switch(help){
    						case 'ä': help = ae;
    							break;
    						case 'Ä': help = AE;
    							break;
    						case 'ö': help = oe;
    							break;
    						case 'Ö': help = OE;
    							break;
    						case 'ü': help = ue;
    							break;
    						case 'Ü': help = UE;
    							break;
    						case 'ß': help = ss;
    							break;
    					}
    
    					Settings.StdValue[i][j][z++]=help;
    				}
    			}while(help != ';');
    			Settings.StdValue[i][j][z]='\0';
    		}
    	}
    
    }
    
    void WriteStdIni(void){
    
    	int i, j;
    
    	for(i=0; i<3; i++){
    		for(j=0; j < Settings.AnzSV[i][0]; j++){
    			WritePrivateProfileString(Settings.theme[i], Settings.key[i][j], Settings.StdValue[i][j],"setting/test.ini"); 
    		}
    	}
    
    }
    
    void ReadIni(void){
    
    	int i, j;
    	char pfad[100];
    	DWORD destSize=100;
    
    	FILE *IniError;
    	IniError = fopen("setting/test.ini", "r");
    
             // if(GetPrivateProfileString(Settings.theme[0], Settings.key[0][0],"", pfad,"setting/test.ini") == 0x2) funktioniert nicht, wenn file nicht vorhanden, laut msdn sollte der wert 0x2 zurück geliefert werden.
    
    	if(IniError == NULL)
    		WriteStdIni();
    	fclose(IniError);
    
    	for(i=0; i<3; i++){
    		for(j=0; j < Settings.AnzSV[i][0]; j++){
    			GetPrivateProfileString(Settings.theme[i], Settings.key[i][j], "", pfad, destSize, "setting/test.ini");
    
    			strcpy(Settings.werte[i][j], (const char *) pfad);
    		}
    	}
    }
    

    was sagt ihr so dazu?


Anmelden zum Antworten