PDA

View Full Version : [FRAGE] - Tar-Programm- bitte Hilfe!


Usagi
26-12-2004, 13:07
Würde mich noch kurz interessieren, ob ich mein Eprog-Abgabebeispiel als

> Tar.rar- oder einfach nur als rar abschicken kann. Hab sehr wohl dieses tar

> mir downgeloaded. Und wenn ich versuche mein Eprog-Abgabebeispiel-Verzeichnis

> in dieses Tar-Archiv abzuspeichern, dann kann ich die entsprechenden Files im

> Verzeichnis durch Anklicken nicht mehr öffnen. Und wenn ich mein Verzeichnis

> in diesem Tar-Archiv

> versuche über den Explorer aufzurufen, dann komme ich sowieso nicht zu meinen

> DAteien. Muss das immer direkt über >>Open Remote Archiv<< machen, das ich

> meine Sachen sehen kann. Übrigens ein neues Tar-Archiv erstelle ich mit >>New

> Remote Archiv<<.


> Überhaupt stellt sich mir die Frage, wie verwendet man dieses Tar. Ich bin da

> glaube ich zu "patschert". Dar Tar ist doch so etwas wie WinZip?

>
> Hoffe ihr könnt mir weiterhelfen.

Lg.,

Silvia

Wings-of-Glory
26-12-2004, 13:27
:confused: *grübel*

tar ist ein format. es gibt aber ein programm namens tar, welches tar dateien erzeugt.
winzip ist nicht sowas wie tar, oder umgekehrt. winzip ist ein programm, dass dateien komprimiert und mehrere formate zum komprimieren beherrscht.. unter anderem das format zip.

zum tar problem. einfachste methode für windows user.
winace installieren und damit tar dateien erzeugen.
http://www.winace.de/

solltest du das echte tar programm verwenden.. z.b. unter linux oder in der commandline von windows...

packen geht so
tar -cvf NameDesArchives.tar [datei1, datei2, datei3, ....]

entpacken geht so
tar -xvf NameDesArchives.tar

mehr dazu: http://www.rt.com/man/tar.1.html


zur abgabe:
nein, umbenennen hilft nichts. wenn ein tar verlangt wird, kannst du nicht einfach ein rar file machen, und es dann in tar umbenennen, denn es bleibt trotzdem ein rar.
das verhält sich so, als würdest du auf den mit salz gefüllten salzstreuer "pfeffer" drauf schreiben. ;)

Usagi
27-12-2004, 11:43
zum tar problem. einfachste methode für windows user.
winace installieren und damit tar dateien erzeugen.
http://www.winace.de/ (http://www.winace.de/)

Habe mir nun dieses Winace downgeloaded und mit dessen Hilfe ein Tar-Archiv erstellt. Anschließend habe ich in dieses Tar-Archiv mein
Abgabe-Verzeichnis hineinkopiert. Habe das Resultat als Attachment hier an diesem Post hinzugefügt, um zu erfahren, ob ich es auch richtig verpackt habe und ob ich es so abgeben kann.

Wenn ich jetzt dieses Tar-Archiv abgebe, dann muss doch mein Empfänger auch WinAce haben, oder?

Paulchen
27-12-2004, 12:51
Wenn ich jetzt dieses Tar-Archiv abgebe, dann muss doch mein Empfänger auch WinAce haben, oder?Nun, wenn du es mit WinAce im richtigen Format gespeichert hast, dann kann dein Empfänger diese Datei mit jedem Programm öffnen, die TAR-Archive lesen können. Der klassische TAR-Archivierer, WinZip und WinRAR haben jedenfalls keine Probleme mit diesem Archiv, also scheint es ein TAR-Archiv zu sein.
Das EPROG-Abgabesystem kontrolliert übrigens, ob in dem abgegebenen Archiv die richtigen Dateien enthalten sind. Wenn also falsche Dateien enthalten sind und/oder das Archiv in einem falschen Format vorliegt, sollte ein Fehler auftreten und du wirst aufgefordert, das Hochladen des Archivs nochmals durchzuführen.
An dem, was du da abgeben willst, sind mir innerhalb von fünf Minuten zwei Dinge aufgefallen:


Sollen die Ausgabedateien zu deinen Eingabedateien Testen.out1, Testen.out2, ... heißen oder nicht Testen.o1, Testen.o2, ...?
Das Ein-/Ausgabepaar 1 stimmt nicht (Komma in der Eingabe statt Strichpunkt)


Du kannst eine Datei Testen.o1 übrigens leicht erzeugen, wenn du zunächst eine Datei Testen.i1 mit der entsprechenden Eingabe erzeugst und danach eingibst:
java Main<Testen.i1>Testen.o1
Dadurch stellst du sicher, dass jede Ausgabedatei zur entsprechenden Eingabedatei gehört.

Wings-of-Glory
27-12-2004, 13:37
unter linux konnte ich dein file mit dem befehl "tar" auch entpacken, also format passt.

Usagi
27-12-2004, 14:17
An dem, was du da abgeben willst, sind mir innerhalb von fünf Minuten zwei Dinge aufgefallen:



Sollen die Ausgabedateien zu deinen Eingabedateien Testen.out1, Testen.out2, ... heißen oder nicht Testen.o1, Testen.o2, ...?


Das Ein-/Ausgabepaar 1 stimmt nicht (Komma in der Eingabe statt Strichpunkt)
Die Menschheit lebt von aufmerksamen und wachen Menschen
Danke nochmals
Habe das jetzt ausgebessert.

Da du ja auch das Silbenprogramm hattest, wenn auch in der ersten Runde, würde mich interessieren ob dir da zufällig etwas einfällt, was ich da machen kann, dass ich am Ende des Eingabe-Strings einen Strichpunkt setzen kann. Das Problem, an dem Programm ist, dass wenn ich am Ende des STrings einen STrichpunkt eingebe, kommt diese blöde Fehlermeldung Falsche Eingabe. Das darf aber laut der Spezi nicht sein.

Da steht in der Spezi drin, es kann am Ende des Strings ein Strichpunkt stehen, muss also nicht. Daraus folgere ich dass wenn ein Strichpunkt kommt, keine Fehlermeldung ausgespuckt werden darf.

Der Fehler muss meiner Meinung irgendwo in diesem Bereich liegen.

for (i=0;i<length;i++) {
buffer[i] = Character.toLowerCase(silbe.charAt(i));
if (buffer[i]==';')
anzahlstrichpunkt++;
}
for (i=0;i<length;i++) {
//hier wird jeder eintrag vom buffer array mit den 5 vokalen und mit ';' verglichen
//und bei uebereinstimmen im control array vermerkt
//dies wird benoetigt um spaeter korrekt die Silben zu trennen
for (c=0;c<5;c++) {
if ( buffer[i] == vergleich[c]) {
control[i]= 1;
}
if (buffer[i] == ';') {
control[i]=2;
}
}
//hier wird ueberprueft ob 4 mal hintereinander im array der selbe buchstabe steht
if ((buffer[i] == buffer[i+1])&&(buffer[i+1] == buffer[i+2])&&(buffer[i+2] == buffer[i+3])) {
gultig=false;
}
//hier wird ueberprueft ob die Wortlaenge max. 20 zeichen lang ist
laststrichpunkt++;
if (control[i] == 2) {
if (laststrichpunkt > 21) {
gultig=false;
}
laststrichpunkt=0;
}
if (laststrichpunkt > 20) {
gultig=false;
}

//hier wird ueberprueft ob nur die buchstaben von a bis z und ';' im buffer vorhanden sind
if ((buffer[i] != ';')&&((buffer[i] < 'a')||(buffer[i] > 'z'))){
gultig=false;
}
//hier wird ueberprueft ob max. 5 Woerter im array sind
if ((anzahlstrichpunkt > 5)||((anzahlstrichpunkt == 5)&&(i+1 != length))) {
gultig=false;

Hab mal herumprobiert: anstelle von

anzahlstrichpunkt == 5 anzahlstrichpunkt == 6 einzugeben.

Funktioniert nur dahingehend, dass ich dann plötzlich 6 Wörter eingeben kann. Ich glaube, dass die Abfrage nach der Überprüfung der maximalen Wortanzahl nicht mit anzahlstrichpunkt geschehen soll, sondern eher mit anzahlwoerter, d.h man müsste dann in der Methode string einlesen() anzahlwoerter deklarieren und dann einzeln in ein Array schreiben...

Sollte dir da etwas einfallen, bitte mir antworten, sonst gebe ich es einfach ab.

Lg.,

Silvia

Paulchen
27-12-2004, 15:18
nachdem ich zu faul bin, den code zu verstehen (zumal er wegen fehlender einrückungen leicht unlesbar ist [vielleicht CODE statt QUOTE verwenden...]), hier eine kurzfassung, wie man das notfalls machen kann, wenn einem nichts besseres einfällt

.
.
.
boolean StrichpunktAmEnde=false;
if(buffer[length-1]==';') {
StrichpunktAmEnde=true;
length--;
}


.
.
.

// bei der Ausgabe
if(StrichpunktAmEnde) EprogIO.print(';');



oder


.
.
.

// bei der Ausgabe
if(StrichpunktAmEnde) Ausgabe+=';';

Usagi
27-12-2004, 15:45
Das überfordert meine Kapazitäten. :(
Bin ja noch Anfänger.

Moment wo soll ich das hinschreiben
Den Code habe ich aus der Testen.java genommen.
Das File hast du ja auch, weil du dir ja mein Tar-Archiv geöffnet hast.

Also bitte, kannst das mal kurz anschauen, und dann sagst mir wo ich das
hinschreiben muss.
Hab dir auch extra nochmal das Main.java mitgeliefert. Ist besser, wenn du das Testen.java von dem Archiv, das ich in diesem Attachment gegeben habe, verwendest.

Übrigens wenn ich etwas mit den Befehlen [QUOTE] und [/QOUTE] zitiere, dann wird es nicht zitiert. Es wird dann zitiert, wenn ich bei einem Post auf Qoute drücke. Dann erscheint das ganze Post in einem Feld, das von [OUOTE] und [/QOUTE] umgeben ist. Wenn ich darin Sachen zitieren will, dann muss ich mir immer diese Befehle kopieren. Dann funktioniert es.
Aber nur sehr umständlich. Wie gehst du vor, wenn du zitierst?

Paulchen
27-12-2004, 17:17
Also, ich hab mir das jetzt genauer angesehen, und festgestellt, dass der gwünschte Effekt (Strichpunkt am Schluss) eintritt, wenn man

anzahlstrichpunkt++;

(Zeile 62) durch

if(i<length-1)
anzahlstrichpunkt++;

ersetzt.
Was mir sonst noch so aufgefallen ist:

Einrückungen: Immer alles, was zwischen { und } steht, konsequent um eine Ebene einrücken (erhöht die Lesbarkeit enorm).
Warum werden in den Zeilen 7-13 alle Variablen public deklariert? Da man von keiner anderen Klasse auf diese Variablen zugreift und dies darüber hinaus gar nicht erwünscht ist, würde ich alle Variablen private deklarieren.
Verstehst du eigentlich, was die Methode beistrich_setzen_wo() (Zeilen 109-174) macht? Ich weiß nicht, ob im Originalprogramm auch so spärliche Kommentare zu finden waren, aber ich würde diesen Algorithmus so nicht verstehen.
Deine Klasse Testen gibt im Fall, dass die Eingabe ungültig ist, die Zeichenkette "FALSCHE EINGABE\n" aus. Das bedeutet, dass an "FALSCHE EINGABE" ein Zeilenumbruch angefügt wird. Wenn du dir aber Main.java ansiehst, wirst du feststellen, dass dort jene Zeichenkette, die von perform() in der Klasse Testen zurückgeliefert wird, mit EprogIO.println(), also mit abschließendem Zeilenumbruch, ausgegeben wird, d. h. im Falle einer ungültigen Eingabe wird "FALSCHE EINGABE", gefolgt von zwei Zeilenumbrüchen ausgegeben.
Warum werden in den Zeilen 11 und 12 Arrays mit einer Größe von 150 Elementen deklariert, wenn die Eingabezeichenkette nicht länger als 105 Zeichen sein darf (Zeile 55)?
Warum steht ein Großteil der Methode perform() in einem try-catch-Block (Zeilen 17-34)? In welchem Fall wird denn eine Exception geworfen, sodass "?" ausgegeben wird? Steht die Ausgabe "?" überhaupt in der Spezifikation? Welche Methode, welche in dem try-Block aufgerufen wird, wirft eine Exception?


Übrigens: Dass du mit [QOUTE] oder [OUOTE] oder [OOUTE] oder sonst irgendwas nicht zitieren kannst, wundert mich nicht, der Befehl lautet nämlich QUOTE. Wenn ich folgenden Code in den Editor eingebe (ohne Leerzeichen zwischen [ und QUOTE):

[ QUOTE=irgendwer]Wer hat an der Uhr gedreht
Ist es wirklich schon so spät?[/QUOTE]

kommt das heraus:
Wer hat an der Uhr gedreht
Ist es wirklich schon so spät?
schreibe ich nur

[ QUOTE]Wer hat an der Uhr gedreht
Ist es wirklich schon so spät?[/QUOTE]

so erhalte ich
Wer hat an der Uhr gedreht
Ist es wirklich schon so spät?
Das ist eigentlich dafür gedacht, dass du etwas wiedergibst, was jemand anders gesagt, geschrieben etc. hat. Möchtest du Programmcode wiedergeben, so verwende das CODE-Tag und nicht das QUOTE-Tag, damit die Einrückungen erhalten bleiben.

Usagi
27-12-2004, 20:14
Ich frage, den Administrator, ob er mir dieses Post nicht löschen kann.
Kann sich nur um Minuten handeln, hoffe nicht um STunden

Usagi
27-12-2004, 20:31
anzahlstrichpunkt++;

(Zeile 62) durch

if(i<length-1)
anzahlstrichpunkt++;

ersetzt.

Warum " length - 1", Paul?

Versuche dir mal zu erklären, wie ich das verstehe

for (i=0;i<length;i++) {
buffer[i] = Character.toLowerCase(silbe.charAt(i));
if (buffer[i]==';')
if(i<length-1)
anzahlstrichpunkt++;
Hier in dieser For-Schleife wird der String in ein Array namens buffer[i]
gespeichert. Das geschiet über die Methode Character.toLowerCase() oder besser gesagt über den Parameter silbe.charAt(i), wo nacheinander die Characters des Strings gelesen und in Kleinbuchstaben verwandelt werden.

Selbstverständlich gehört auch ein Semikolon zum String, d.h. es muss auch in ein Array gespeichert werden. Das geschieht hier mit
if (buffer[i]==';')
Also immer, wenn die Schleife auf ein Semikolon trifft, dann bitte lese es
mir in ein Array ein. Na klar die Anzahl der Strichpunkte erhöht sich, je mehr Strichpunkte eingelesen werden.

Aber warum dann dieses if(i<length-1): Hat das vielleicht die Bedeutung, ich
kann anzahlstrichpunkt nur so lange wiederholen, bis die Stringlänge kleiner
ist als minus eins. Warum bitte dieses ominöse minus 1?

QOUTE Was mir sonst noch so aufgefallen ist.


Einrückungen: Immer alles, was zwischen { und } steht, konsequent um eine Ebene einrücken (erhöht die Lesbarkeit enorm). /QOUTE
Entschuldige Paulchen, aber als ich mir den Sourcecode nochmals
angeschaut habe sind alle Befehle, die zwischen { und } stehen !!konsequent!! eingerückt. Habe keine Probleme mit dem Lesen.

Verstehst du eigentlich, was die Methode beistrich_setzen_wo() (Zeilen 109-174) macht?
Mensch, wie kannst du fragen, ob ich den verstehe, wenn du ihn nicht einmal verstehst.:ahhh: Hab eh schon in der Bewertung reingeschrieben, dass er, also der Verfasser, mir das und viele andere Sachen erklären soll.

Deine Klasse Testen gibt im Fall, dass die Eingabe ungültig ist, die Zeichenkette "FALSCHE EINGABE\n" aus... Wenn du dir aber Main.java ansiehst, wirst du feststellen, dass dort jene Zeichenkette, ... mit EprogIO.println(), d. h. im Falle einer ungültigen Eingabe wird "FALSCHE EINGABE", gefolgt von zwei Zeilenumbrüchen ausgegeben. Bist wirklich unheimlich pedantisch. Ist das so eine Notwendigkeit, dass das korrigiert wird. Könnte ja auch egal sein. Aber trotzdem habe ich es ausgebessert.

Warum werden in den Zeilen 11 und 12 Arrays mit einer Größe von 150 Elementen deklariert, wenn die Eingabezeichenkette nicht länger als 105 Zeichen sein darf (Zeile 55)? Das habe ich mich auch gefragt. Die Frage steht schon ausformuliert in der Bewertung drin. Warte nur noch bis er mir das beantwortet hat. Eigentlich müsste es ja gar nicht so ganz passen.

Warum steht ein Großteil der Methode perform() in einem try-catch-Block (Zeilen 17-34)? In welchem Fall wird denn eine Exception geworfen, sodass "?" ausgegeben wird? Steht die Ausgabe "?" überhaupt in der Spezifikation? Welche Methode, welche in dem try-Block aufgerufen wird, wirft eine Exception? Na vorher ist die Methode main in einem try-catch- Block gestanden.
Habe das bei der Methode perform () beibehalten. Wenn ich richtig der Meinung bin, dann steht die ganze Eingabe und Ausgabeim try-catch- Block.


Ausgabe "?" steht nicht in der Spezi. Vorher ist anstelle von return"?"; EprogIO.println(e); gestanden.

public static void main(String[] args){

try{

//hier wird ueberprueft ob der eingelesene String gueltig ist
if (gultig == true ) {

beistrich_setzen_wo();

beistriche_setzen();

EprogIO.println("" + silbe);

}
else {
EprogIO.println("FALSCHE EINGABE\n");
}
}catch(Exception e){ EprogIO.println;}
}
Ein jemand hat mir gesagt, ich muss im Perform-Programm alle EprogIO.println im Main-Programm mit return auswechseln.

public static String perform (){

try{

string_einlesen();

//hier wird ueberprueft ob der eingelesene String gueltig ist
if (gultig == true ) {

beistrich_setzen_wo();

beistriche_setzen();

return( silbe);

}
else {
return("FALSCHE EINGABE\n");
}
}catch(Exception e){ return"?";}
}
Na gut, als ich das auch bei EprogIO.println(e) gemacht habe, also return (e) ist dann nach dem Compilieren folgende Fehlermeldung gekommen:

javac Testen.java
Testen.java:34: incompatible types
found : java.lang.Exception
required: java.lang.String
}catch(Exception e){ return(e);}
^
1 error

Compilation exited abnormally with code 1 at Mon Dec 27 19:08:28
<
Na gut, und als ich return "e" eingebe, dann wird es sehr wohl compiliert, aber bei der Ausführung erscheint dieser eigenartige NoClassDefFoundError daher. Ein jemand hat mir dann gesagt, dass ich bei return " " ein Fragezeichen eingeben muss. Hab, was sehr ungewöhnlich für mich ist, nicht einmal nach den Grund gefragt.

Man muss wirklich alles hinterfragen, sonst wird man an der Nase rumgeführt.

Usagi
27-12-2004, 20:40
QOUTE Was mir sonst noch so aufgefallen ist:





Einrückungen: Immer alles, was zwischen { und } steht, konsequent um eine Ebene einrücken (erhöht die Lesbarkeit enorm). /QOUTE
Also Paul, irgendwie war dein so supergenialer Befehl ein Schuss in die Hose.
Wie du oben siehst, nichts, aber rein gar nichts hat sich getan.
Mich würde mal interessieren, wie du vorgehst. Verwendest du diese Befehle /QUOTE und QOUTE, wenn du auf das Tab " New Post" gehst oder wenn du innerhalb des Posts, auf das du antworten willst, auf das Tab "QOUTE" gehst. Ich gehe immer auf das Tab "QOUTE".

Poppe
27-12-2004, 20:56
Mich würde mal interessieren, wie du vorgehst.Ist es ein kleines, kurzes Post, oder will ich nur EINE Stelle zitieren, dann nehm ich den "Quote" - Button und lösche eventuell die Textpassagen, die ich nicht brauche.

Will ich jedoch aus einem Post mehrere Teile separat zitieren, nehm ich den "Post Reply" - Button, und dann ist der gesamte Thread unterhalb des WYSIWIG-Editors zu sehen, das letzte Post steht an erster Stelle, und von dort kopiere ich mir die entsprechenden Teile nacheinander zusammen, versehe sie mit den Quote-Tags und was man machen sollte: VORSCHAU BENUTZEN!! dazu ist die doch da, dass man wirklich nur ein sauberes Post abliefert. Eventuelle Änerungen nachher: "Edit" - Button!

Paulchen
28-12-2004, 11:39
Warum " length - 1", Paul?
Würde ich "length" schreiben, so würde auch der Strichpunkt mitgezählt, der sich ganz am Ende der Eingabe befindet. An Hand dieser Anzahl der Strichpunkte wird festgestellt, ob sich höchstens fünf Worte in der Eingabe befinden, also höchstens vier Strichpunkte. Ein fünfter Strichpunkt, und sei er auch am Ende der Eingabe, führt zur Ausgabe "FALSCHE EINGABE". Also zähle ich einen Strichpunkt, wenn er am Ende der Eingabe steht, nicht mit, höre also ein Zeichen vor dem Ende mit der Überprüfung, ob Strichpunkte vorliegen, auf. Daher nicht "length", sondern "length -1".