Virtuelles File System in C schreiben
-
Du zeigst nicht den ganzen Code.
Außerdem kannst du auch nicht rechnen, +10 ist zu klein.
-
Es sollen auch 64Bit lange Datentypen verwendet werden, weil das Programm auch mit Gigabyte bzw. Terrabyte großen Dateien klar kommen soll.
-
Wutz schrieb:
Außerdem kannst du auch nicht rechnen, +10 ist zu klein.
Ahh, ich kann doch noch zählen :p . Ich hatte schon gedacht, so ein dummer Fehler kann's nicht sein.
Daher benutzt man besser eine narrensichere Methode, die die nötige Größe bestimmt, anstatt dass man selber zählt. Dann kann man das Literal später auch noch ändern und es funktioniert trotzdem noch.
-
Wutz schrieb:
Du zeigst nicht den ganzen Code.
Außerdem kannst du auch nicht rechnen, +10 ist zu klein.Aha "structure" = 9 + 1 für das Ende-Zeichen = 10
Was ist daran falsch?
-
SeppJ schrieb:
Viele Pfade führen aus deiner Funktion, bei denen der Speicher nicht korrekt freigegeben wird. Weiterhin schreibst du irgendwo hinter ein von dir reserviertes Feld, was ebenfalls ein sehr ernstes Problem ist. Die Zeilennummern sagen dir, wo.
Wie meinst du das? Ich reserviere mir doch direkt den ganzen Speicher den ich brauche...und ich habe überprüft ob die Pfade richtig zusammengebaut werden.
-
C_Mond schrieb:
Wutz schrieb:
Du zeigst nicht den ganzen Code.
Außerdem kannst du auch nicht rechnen, +10 ist zu klein.Aha "structure" = 9 + 1 für das Ende-Zeichen = 10
Was ist daran falsch?Aber da steht nicht "structure". Guck noch mal genau hin. Und bevor du das jetzt einfach zu 11 änderst, denkst du mal daêüber nach, wie du das besser machen könntest, ohne magic numbers. Und damit meine ich nicht
const int length = 11;
.
-
C_Mond schrieb:
SeppJ schrieb:
Viele Pfade führen aus deiner Funktion, bei denen der Speicher nicht korrekt freigegeben wird. Weiterhin schreibst du irgendwo hinter ein von dir reserviertes Feld, was ebenfalls ein sehr ernstes Problem ist. Die Zeilennummern sagen dir, wo.
Wie meinst du das? Ich reserviere mir doch direkt den ganzen Speicher den ich brauche...und ich habe überprüft ob die Pfade richtig zusammengebaut werden.
Ja, du reservierst den Speicher. Das ist ja das Problem, denn er wird nicht mehr unbedingt frei gegeben. Bloß in einem von vier Fällen, die ich sehe. Und da zähle ich mögliche, mir unbekannte, Nebeneffekte von storeDateiErzeugen nicht mit.
Ich glaube, dir täte mal etwas Strukturierung gut:
http://en.wikipedia.org/wiki/Structured_programming
Dogmatisches Anhängen an strukturierter Programmierung ist zwar etwas aus der Mode, aber das liegt nicht da dran, dass es schlecht wäre, sondern da dran, dass es praktisch jeder so beigebracht bekommen hat und ohnehin immerzu benutzt und man dadurch die paar Ausnahmen deutlich sieht, in denen es nicht die beste Vorgehensweise ist.
Du hast derzeit sehr viele verschiedene Ausführungspfade und scheinst selber total den Überblick verloren zu haben, wenn du mit meinem Hinweis nichts anfangen konntest.
-
Okay ich bin nun mal ein Neuling sonst wäre ich ja nicht hier um Hilfe zu suchen.
Den Code fand ich bis jetzt eigentlich übersichtlich.Könntest du mir einfach mal die 4 Fälle nennen die du siehst?
-
Alle return, die vor den free stehen.
-
Dankeschön euch allen damit kann ich weiterarbeiten.
-
Ich komm mit der defragmentierung einfach nicht zurecht, bzw. eine Vorgehensweise/Algorithmus hätte ich schon, aber programmiert bekomme ich es nicht.
Meine "FAT"
Datei1,1,3,6,7
Datei2,2
Datei3,8,9,10
Datei4,4,11,12So sieht die Datei aus. Neue Dateien werden schon automatisch in aufsteigender Reihenfolge geschrieben. Dazwischen können natürlich lücken entstehen, wenn Dateien gelöscht werden.
Nun meine Überlegung.... Ich weiss das die Dateien in der FAT 11 Blöcke belegen. Also brauche ich, um eine defragmentierte FAT zu erhalten, die Blöcke 0-10.
Ich fange mit dem niedrigsten Block an (also 0). Dabei schaue ich, ob der aktuell bearbeitete Block der Block 0 ist oder ob dieser Block bereits bei einer anderen Datei in Benutzung ist. Daraus ergibt sich folgendes Bild...
Datei1,0,3,6,7
....
Problematisch wird es dann erst bei Block 2, da der schon vergeben ist. Dafür muss aber einfach, das ganze Szenario 2 mal durchlaufen werden.
Erster durchgang ergibt dann:
Datei1,0,1,3,5
Datei2,6
Datei3,7,8,9
Datei4,10,11,12
Zweiter Durchgang (Nun ist block 2 frei):
Datei1,0,1,2,3
Datei2,4
Datei3,5,6,7
Datei4,8,9,10Eigentlich relativ simpel. Aber jetzt in der Datei hin und her zu springen, mit 3 oder 4 verschachtelten Schleifen, mit fgets, strtok, ftell und was man noch alles braucht wird es mir einfach zu viel.
Übersehe ich vielleicht einen einfachen weg die Datei auseinander zu nehmen um meine Bedingungen zu prüfen?
-
Gerade kam mir noch ein guter Einfall....ohne die Datei müsig auseinander zunehmen mit strtok, müste es ja reichen jede zeile mit strstr(Buffer,",3,") zu durchsuchen, um festzustellen ob ein Block in Benutzung ist....
-
Hallo, ich denke ich konnte bis jetzt alle Speicherleckfehler erfolgreich beheben. Dankeschön.
Im Moment habe ich folgendes Problem. An einigen Stellen überprüfe ich, ob es eine Datei schon gibt mit folgendem code
FILE *datei; String* pfad; datei = fopen(pfad, "r+"); if(datei == NULL) { printf("Datei ist NULL"); } else { print("Die Datei ist nicht NULL"); }
Bei mir auf dem PC (Windows oder Linux) funktioniert das auch. Habe es auch schon gedebuggt. Aber sobald ich die Datei an das automatische Prüfsystem schicke ist die Datei nicht NULL. Leider kann ich dort nicht debuggen aber meine Logausgaben sagen, dass er auch in die falsche Bedingung läuft.
Das verstehe ich einfach nicht. Kann es sein, dass das Programm auf einer anderen Linuxmaschine anders reagiert???
-
Äh natürlich nicht String* sondern char*
-
Das ist eine Programmieraufgabe für Informatik aus dem aktuellen Sommersemester der Heinrich Heine Universität Düsseldorf Sommersemester2013. Es scheint du hast in den Vorlesungen nicht aufgepasst.
-
Rechnen Sie damit, dass ein unge¨ ubter C-Programmierer zwei bis drei Wochen Vollzeit zur
L¨osung der Aufgabenstellung ben¨ otigt. Fangen Sie rechtzeitig an!Wenn Sie es nicht schaffen werden Sie nicht zur Klausur zugelassen
Plagiate f ¨ uhren zum Auschluss von der Veranstaltung.
-
C_Mond schrieb:
Hallo, ich denke ich konnte bis jetzt alle Speicherleckfehler erfolgreich beheben. Dankeschön.
Im Moment habe ich folgendes Problem. An einigen Stellen überprüfe ich, ob es eine Datei schon gibt mit folgendem code
FILE *datei; String* pfad; datei = fopen(pfad, "r+"); if(datei == NULL) { printf("Datei ist NULL"); } else { print("Die Datei ist nicht NULL"); }
Ich will mal nicht so sein also wenn die Datei NULL ist sollte sich dein Programm auch beenden und mit einem bestimmten return wert rausspringen laut aufgabenstellung. So zum Pfad da muss auch ein string sein der ist noch undefiniert das kriegst du im übergabeparameter mitgeliefert also für pfad dynamisch speicher reservieren undzwar die länge des Dateinamen + strlen("store") oder strlen("structure") + 1 für die Terminierung dann mit strcpy und strcat erstellen. Z.b ./vfs myVFS create 10 10 dann muss in pfad auf einen string verweisen z.b myVFS.store bzw myVFS.structure. es klappt wahrscheinlich bei dir weil die datei die du öffnen willst vorher schon erstellt hast lösche sie mit rm oder mit der GUI.
meine persönliche meinung arbeite dich gründlich ein und gib das projekt nächstes mal ab dann wirst du auch die klausur gut bestehen weil so seh ich höhstens nur ne 4. Nicht als Beleidigung nehmen ist nur ein Ratschlag.
-
Wie wäre es wenn du dich in Zukunft einfach nur auf die Beantwortung meiner Frage konzentrierst anstatt irgendwelche Mutmaßungen anzustellen?
Wenn du außerdem meinen Post richtig gelesen hättest dann wüsstest du dass keine deiner Mutmaßungen auch nur annähernd zutrifft.
-
C_Mond schrieb:
Wie wäre es wenn du dich in Zukunft einfach nur auf die Beantwortung meiner Frage konzentrierst anstatt irgendwelche Mutmaßungen anzustellen?
Wenn du außerdem meinen Post richtig gelesen hättest dann wüsstest du dass keine deiner Mutmaßungen auch nur annähernd zutrifft.erzähl das dem weihnachtsmann soll ich die aufgabenstellung hochladen die übereinstimmt genau mit deinen forderungen naja ich denke das du es sowieso innerhalb der Zeit nicht schaffen wirst. Tja selber schuld
-
blub121312 schrieb:
Plagiate f ¨ uhren zum Auschluss von der Veranstaltung.
Ahh, jetzt verstehe ich, wieso manche der Beteiligten an diesem Thread mich privat per PM angeschrieben haben, ob ich ihnen die Aufgabe gegen Geld lösen kann