Hilfe bei C - Datenbank Aufgabe - Checken von Programm



  • IchBraucheHilfe schrieb:

    Also ich habe mir das so vorgestellt:

    Anzeige eines vorhandenen Datensatzes und Suche eines vorhandenen Datensatzes gehört für mich in einen Unterpunkt. Ich suche und gebe das gefundene aus.
    Und bei der Ausgabe von listen werden ja auch die vorhandenen Datensätze ausgegeben.

    Bei den sortierten Listen habe ich noch nix, da ich mit Sortierfunktion noch kämpfe.

    Das ist jetzt nur die main Datei. die Struktur habe ich in einer headerdatei definiert.

    Vieeel Code
    

    Da ist aber keine Frage. Wenn Du eine konkrete Frage hast: stell sie.

    Aber was nutzt es überhaupt hier zu diskutieren, wenn Dein Kollege das gesamte Herzstück geschrieben hat?
    Wenn wir Dir sagen: Du könntest das so und so machen, kracht es ja an allen Ecken und Enden in seinem Code.
    Eigentlich würde ich sagen wegschmeissen und neu machen - evtl. schaffst Du dann nicht mehr die gesamte Aufgabe aber den Teil den Du hast verstehst Du auch.



  • Oh, Microsoft-C.

    case'1':
    
                memset(&EinEintrag,'\0',sizeof(datensatz));
    
                printf("\n\t*** Hinzufuegen eines neuen Datensatzes ***\n\n");
    
                printf("\nBitte den Namen eingeben:");         
                memset(&TempInput,'\0',sizeof(TempInput));
                scanf("%s",&TempInput);                    //Hier unbedingt noch mal sehen ob das so soll?
                fflush (stdin) ;                           //Der Microsoft-Weg
    

    Musst du alles in die Main packen?
    Wenn du den Quelltext in kleine Funktionen aufteilst, kann man das besser lesen, testen und du hast schneller kleine Erfolgserlebnisse. Dann kannst du dich besser auf deine Problem-Baustellen im Quellcode konzentrieren.



  • scanf("%s",&TempInput);  //Hier unbedingt noch mal sehen ob das so soll?
    

    Was ist daran falsch?.

    So wie ich das verstehe:

    Es wird ein Zwischenspeicher "TempInput" erstellt. Dieser wird Anfangs gelernt. Nach Aufforderung einen
    Namen einzugeben wird der eingegebene String in den Zwischenspeicher kopiert und von dort an den datensatz -> Name übergeben.
    Oder sehe ich das falsch?

    Meine Fragen hierzu:

    Was bedeutet die -1 beim Ausdruck -> "NAMEFIELDLEN-1"?!

    Das Eintragen in die Datenbank funktioniert soweit ganz gut.

    char TempInput[255]; // Zwischenspeicher erstellen
    datensatz EinEintrag;
    
    case'1':
    
    			memset(&EinEintrag,'\0',sizeof(datensatz));
    
    			printf("\n\t*** Hinzufuegen eines neuen Datensatzes ***\n\n");
    
    			printf("\nBitte den Namen eingeben:");			
    			memset(&TempInput,'\0',sizeof(TempInput)); //Zwischenspeicher leeren
    			scanf("%s",&TempInput);					   //Eingabe in Zwischenspeicher scannen
    			fflush (stdin) ;						   //Puffer leeren
    			strncpy_s(EinEintrag.name,TempInput,NAMEFIELDLEN-1); //Kopiert von TempInput in Datensatz Name
    
                // Hinzufügen
    			ret = DB_Add(&EinEintrag);
    
    extern int DB_Add(datensatz *entry);  //steht im Header
    

    Und die Funktion für das Hinzufügen von Datensätzen:

    int DB_Add(datensatz *entry)
    {
    	int i;
    	if (entry == NULL) return DB_PARAM_NULL;
    
    	for (i = 0; i < MAXENTRYS; i++)
    	{
    		//Wenn Bedingung erfüllt: Datensatz ist frei
    		if ((DBBelegt[(i/8)] & (0x01 << (i % 8))) == 0) break; //Abbruch der Suchschleife nach freiem Datensatz
    	}
    
    	if (i == MAXENTRYS) return DB_FULL; //Datenbank voll. Keinen freien Eintrag gefunden.
    
    	//Eintragen:
    	memcpy(&Datenbank[i],entry,sizeof(datensatz));
    	DBBelegt[(i/8)] |= (0x01 << (i % 8));  //Als belegt markieren
    
    	//Sortieren:
    	//sortbyName();
    	//sortbyNr();
    
    	return DBOK;
    }
    

    Was hat es mit dem Merker auf sich?

    char DBBelegt[(MAXENTRYS/8)+1]; //Merker belegte Datensätze: (Bitcodiert)
    

    Kann mir hier einer diese Bedingung erklären?:

    if ((DBBelegt[(i/8)] & (0x01 << (i % 8))) == 0) break;
    


  • IchBraucheHilfe schrieb:

    f.-th. schrieb:

    scanf("%s",&TempInput);  //Hier unbedingt noch mal sehen ob das so soll?
    

    Was ist daran falsch?.

    So wie ich das verstehe: ......

    Du beschreibst was passieren soll, nicht was passiert.

    Hier nochmal die Definition von TempInput

    char TempInput[20]; // Zwischenspeicher erstellen
    

    Jetzt schaust du nochmal in deinen Unterlagen nach, wie das mit scanf, %s, Arrays und dem & ist.

    IchBraucheHilfe schrieb:

    Was bedeutet die -1 beim Ausdruck -> "NAMEFIELDLEN-1"?!

    Einen Weniger.

    Da du die Definition von NAMEFIELDLEN nicht mitgeliefert hast. kann ich dir den genauen Wert nicht sagen.
    Entweder ist NAMEFIELDLEN ein Makro (#define), eine Variable oder Konstate.
    Zumindest steht es für einen Zahlenwert.
    In einem C-String ist das letzte Zeichen '\0'. Und dafür muss halt Platz übrig sein.



  • IchBraucheHilfe schrieb:

    char DBBelegt[(MAXENTRYS/8)+1]; //Merker belegte Datensätze: (Bitcodiert)
    

    Kann mir hier einer diese Bedingung erklären?:

    if ((DBBelegt[(i/8)] & (0x01 << (i % 8))) == 0) break;
    

    Das ist ein Array von char, und jeweils ein char besitzt 8 bits, die für jeweils einen "slot" in Deiner Datenbank stehen(*). Wenn da was drin steht wird das Bit gesetzt sonst genullt.

    Die Bedingung ist ein wenig Bitfriemelei, damit ein Bit ausgelesen wird.

    Schau Dir die "bitwise" Operatoren an, wenn Du mehr wissen willst.

    Zur veranschaulichung:

    #include <stdio.h>
    
    #define MAX 20
    
    char markers[(MAX+7)/8] = { 0 };
    
    void print(){
      for(size_t i=0; i<sizeof(markers)*8; ++i)
        printf("%i", markers[i/8] & 0x01<<i%8 ? 1 : 0);
      puts("");
    }
    
    void mark_slot(int i){
      markers[i/8] |= 0x001<<i%8;
    }
    
    int main(){
      print();
      mark_slot(7);
      mark_slot(9);
      mark_slot(11);
      print();
    }
    

    So setzt Dein Kollege die Bedingung "keine Datensätze sind zu verschieben" um.

    (*) Das array ist u.U. einen char zu lang, aber das ist egal.


Anmelden zum Antworten