FB18 - Das Forum für Informatik

fb18.de / Diplom Informatik / Unterbereich Grundstudium / Technische Informatik

T3 Aufgabe 7

T3 Aufgabe 7 2004-12-05 16:59
Anonymer User
moin moin

da ich mir meiner menschlickeit und somit auch meiner fehlbarkeit bewusst bin wuerde ich mich freuen wenn jemand mit ahnung mal ein beispiel fuer eine pruefsumme (adler32) posten koennte.

z.B. ein array der laenge 100 mit je einem 'b' gefuellt ergibt bei mir ap=0x8e012649 oder auch -1912527287

bleibt die frage ob das nu richtig, falsch oder ein bischen von beidem ist.

Re: T3 Aufgabe 7 2004-12-05 17:10
UncleOwen
Die Zahl krieg ich mit meinem quick'n'dirty-Programm auch raus.

Re: T3 Aufgabe 7 2004-12-05 18:11
Fred
z.B. ein array der laenge 100 mit je einem 'b' gefuellt ergibt bei mir ap=0x8e012649 oder auch -1912527287
Kann ich bestätigen. Interessant wird es natürlich erst bei sehr langen Arrays, weil dann die 32-Bit-Register überlaufen können (wenn man das nicht entsprechend behandelt).

Bei einem 1.000.000 Byte grossen Array mit a = i & 0xFF erhalte ich 0e27d8d8 als Prüfsumme.

(Im Array steht also 0, 1, 2, 3, …, 253, 254, 255, 0, 1, 2, 3, …)

Re: T3 Aufgabe 7 2004-12-06 16:36
d-fence
habt dank nun kann ich wieder beruhigt schlafen…

Re: T3 Aufgabe 7 2004-12-07 17:50
Anonymer User
Hmmm,

wir bekommen mit 100 'b' das gleiche wie im ersten Post heraus. Also scheint unsere Adlerfunktion ja zu laufen. Aber mit Freds Beispiel bekommen wir was anderes heraus.

Unser Code fuer Freds Beispiel:

char a; for(int i=0;i<1000000;i++) { a[i] = i & 0xFF; } int n = 1000000; result = adler32(a, n); printf("Result: %x\n", result); Unser Ergebnis: 0x5bea6678

Bist Du sicher, dass dein Programm richtig ist, Fred? :)

Robert, Jan und David

Re: T3 Aufgabe 7 2004-12-07 17:57
Fred
wir bekommen mit 100 'b' das gleiche wie im ersten Post heraus. Also scheint unsere Adlerfunktion ja zu laufen.
Anhand eines Beispiels soll die Korrektheit bewiesen sein? Gewagte These [img]http://www.fb18.de/gfx/25.gif[/img]

char a;
Scheiss Forum [img]http://www.fb18.de/gfx/20.gif[/img]
Das ist ein Array mit 1000000 Elementen, also char a[ 1000000 ]

Aber mit Freds Beispiel bekommen wir was anderes heraus.
Wie lautet der Befehl in Eurem Programm, mit dem Ihr immer ein Byte aus dem Array ladet?

Bist Du sicher, dass dein Programm richtig ist, Fred? :)
Ich habs von Rosenlecher absegnen lassen, das will schon was heissen [img]http://www.fb18.de/gfx/17.gif[/img]

Re: T3 Aufgabe 7 2004-12-07 17:57
UncleOwen
Bist Du sicher, dass dein Programm richtig ist, Fred? :)

Ich hab das gleiche raus wie Fred.

Re: T3 Aufgabe 7 2004-12-07 19:14
Anonymer User
Ja, das Forum hat unser Array abgeschnitten :-)
Der Rest unser Funktion siet folgendermassen aus:

EditTri: Auch wenn leicht zu finden bitte (noch) keine Kompletten Codelösungen [img]http://www.fb18.de/gfx/25.gif[/img]

Re: T3 Aufgabe 7 2004-12-07 19:21
Anonymer User
AAaaah, wir haben 2 mal unsigned vergessen (wo da wohl der unterschied ist [img]http://www.fb18.de/gfx/12.gif[/img])

Jedenfalls laeufts nun :)

Re: T3 Aufgabe 7 2004-12-08 00:42
Brokkoli
bei signed füllt der beim load-befehl bis zum integer (also die oberen 24 bit) mit einsen auf, wenn das byte "negativ" war, also das oberste bit vom byte = 1 war…

Re: T3 Aufgabe 7 2004-12-09 15:32
Fred
z.B. ein array der laenge 100 mit je einem 'b' gefuellt ergibt bei mir ap=0x8e012649 oder auch -1912527287
Hab diesbezüglich noch eine eMail erhalten, meine Antwort interessiert vielleicht auch andere:

> wie kann eine negative Zahl als AP rauskommen.
Es kommt keine negative Zahl raus [img]http://www.fb18.de/gfx/25.gif[/img]

Was rauskommt ist eine Zahl zwischen 0 und 2^32… und wenn das oberste Bit gesetzt ist und man die Zahl negativ INTERPRETIERT (und genau das tut %i bei printf), dann wird sie natürlich auch negativ ausgegeben.

Noch ein Beispiel:

printf("Nanu: %i\n", 4294967295);Da kommt nicht (wie vielleicht zunächst erwartet) 4294967295 raus sondern -1.


Re: T3 Aufgabe 7 2004-12-09 16:40
Brokkoli
weshalb man %u oder %x nehmen sollte… ;)

Re: T3 Aufgabe 7 2004-12-09 18:32
Fred
weshalb man %u oder %x nehmen sollte… ;)
Ja… wobei es im Grunde genommen aber egal ist. Wir wissen, dass die Adler32 Funktion eine 32 Bit Zahl berechnet, und diese wird zur Fehlererkennung genutzt (indem die gespeicherte mit der berechneten verglichen wird). Die Darstellung der Zahl ist daher bedeutungslos. 0xFFFFFFFF und -1 und 4294967295 sind eben alle gleich.

Re: T3 Aufgabe 7 2004-12-10 14:36
Anonymer User
Hallo

Ich habe da ein Problem. Ich hab mir die RFC1950 durchgelesen. Man braucht ja offensichtlich zur Implementierung Modulodivisionen. Einen Modulo Befehl kennt die SPARC ja nicht. Kann mir jemand mal einen Tip geben, wie ich Modlo in SARC implementiere

Dankeschön

Re: T3 Aufgabe 7 2004-12-10 15:05
Dennis-
was ja auf jedenfall geht ist das ganze in c schreiben und sich das ergebnis in asm angucken indem man mit dem -S parameter compiliert

Re: T3 Aufgabe 7 2004-12-10 15:58
TriPhoenix
Ich habe da ein Problem. Ich hab mir die RFC1950 durchgelesen. Man braucht ja offensichtlich zur Implementierung Modulodivisionen. Einen Modulo Befehl kennt die SPARC ja nicht. Kann mir jemand mal einen Tip geben, wie ich Modlo in SARC implementiere

Du kannst ja zumindest multiplizieren und Dividieren. Wenn du nun zwei Zahlen a und b hast und willst den Rest von a geteilt durch b kriegen, wie würdest du das mit den Grundrechenarten (sagen wir ruhig mal mit so einem 2,50 Euro Taschenrechner) machen? (Genauso machts der Suncompiler nämlich)

Re: T3 Aufgabe 7 2004-12-11 15:25
Anonymer User
Bei einem 1.000.000 Byte grossen Array mit a = i & 0xFF erhalte ich 0e27d8d8 als Prüfsumme.
Wenn ich das selbe Ergebnis habe, liege ich damit nun falsch oder richtig?

Re: T3 Aufgabe 7 2004-12-11 16:18
Fred
Bei einem 1.000.000 Byte grossen Array mit a = i & 0xFF erhalte ich 0e27d8d8 als Prüfsumme.
Wenn ich das selbe Ergebnis habe, liege ich damit nun falsch oder richtig?
Das Ergebnis ist richtig. Das heisst natürlich nicht, dass der Algorithmus korrekt ist, aber es ist schon ziemlich wahrscheinlich.

Re: T3 Aufgabe 7 2004-12-11 17:15
Anonymer User
Im RFC1950 ist die adlerfunktion fogendermaßen spezifiziert:

ulong adler32 (ulong old, nchar *buf, int len)

Wir sollen sie unsigned adler(char *buf, in len) implementieren.

Da fehlt ja der alte adlerwert als parameter. Sollen wir den trotzdem inern verarbeiten, also alles in assembler, auch die umgebende schleife die dn buffer durchgeht, oder sollen wir den aus der Berechnung weglassen, also s1 immer 1 am Anfang?

Re: T3 Aufgabe 7 2004-12-11 17:25
Fred
Im RFC1950 ist die adlerfunktion fogendermaßen spezifiziert:

ulong adler32 (ulong old, nchar *buf, int len)
[img]http://www.fb18.de/gfx/5.gif[/img]

Also in dem Dokument, in welchem ich nachgeschaut habe, steht:
unsigned long adler32(unsigned char *buf, int len)

Re: T3 Aufgabe 7 2004-12-11 18:07
Anonymer User
Wir sollen also eigentlich die update_adler32 implementieren, oder?

Re: T3 Aufgabe 7 2004-12-11 18:32
Fred
Wir sollen also eigentlich die update_adler32 implementieren, oder?
So, hab jetzt noch mal ein bischen gelesen. Die Zweiteilung update_adler32 und adler32 ist nur dann notwendig, wenn Du eine Datei häppchenweise einliest und diese Happen einzeln verarbeitest. Das ist ja in der Aufgabenstellung gar nicht gefordert. Es ist ein Array gegeben, über welches die Prüfsumme errechnet werden soll.

Wenn es Dich glücklich macht, implementiere die update_adler32 und rufe sie dann so auf:
unsigned long adler32(unsigned char *buf, int len) { return update_adler32(1L, buf, len); } Aber ich sehe da ehrlich gesagt keinen Vorteil gegenüber einer Lösung, die s1 auf 1 und s2 auf 0 initialisiert.

Re: T3 Aufgabe 7 2004-12-11 21:50
DJ-SilVerStaR
"main.c", line 6: parameter not in identifier list: main
"main.c", line 6: syntax error before or at: {
"main.c", line 15: syntax error before or at: "100 b's (-1912527287)\n"
"main.c", line 15: parameter not in identifier list: printf
"main.c", line 17: syntax error before or at: "%d"
"main.c", line 17: parameter redeclared: printf
"main.c", line 17: warning: syntax error: empty declaration
cc: acomp failed for main.c

Re: T3 Aufgabe 7 2004-12-11 22:20
georg
Wenn du die main.c mal posten würdest, wäre das sehr hilfreich
[img]http://www.fb18.de/gfx/24.gif[/img] Ansonsten können wir nur die COmpiler-Meldungen
wiederholen.

Re: T3 Aufgabe 7 2004-12-11 22:31
DJ-SilVerStaR
georg komm mal icq, das is einfacher ;)

#include <stdio.h>


unsigned adler32(char a[], int n)

void main()
{


char temp[ 100];
for (int i = 0; i < 100; i++)
{
temp = 'b';
}

printf("100 b's (-1912527287)\n");

printf("%d", adler32(temp, 100));

}

Re: T3 Aufgabe 7 2004-12-11 22:44
asdf
#include <stdio.h> unsigned adler32(char a[], int n) ^^^^ Hier fehlt ein ``;''

Re: T3 Aufgabe 7 2004-12-11 22:56
DJ-SilVerStaR
jau. danke

Re: T3 Aufgabe 7 2004-12-11 23:04
Anonymer User
wenn ihr grad am "entfehlern" seid:
das ist mein Problem:
rzdspc3$ cc main.c adler32.s
main.c:
"main.c", line 1: warning: invalid white space character in directive
adler32.s:
Undefined first referenced
symbol in file
adler32 main.o
ld: fatal: Symbol referencing errors. No output written to a.out

Re: T3 Aufgabe 7 2004-12-11 23:23
georg
Also der erste Fehler scheint darin zu bestehen, dass
im "#include" irgendwo ein Leerzeichen steckt. Beim zweiten
Fehler würde ich darauf tippen, dass du irgendeinen
Funktionsnamen falsch geschrieben hast. Für weitere
Informationen bräuchte ich wieder die (oft zitierte)
Kristallkugel (oder den Quellcode [img]http://www.fb18.de/gfx/24.gif[/img]).

Re: T3 Aufgabe 7 2004-12-12 00:34
Fred
"main.c", line 1: warning: invalid white space character in directive
Mal mit dos2unix die Zeilenumbrüche konvertiert?
Obwohl der cc die eigentlich schlucken müsste… benutzt Du einen anderen Compiler?

Re: T3 Aufgabe 7 2004-12-13 00:23
DJ-SilVerStaR
adler32.s:
Undefined first referenced
symbol in file
adler32 main.o
ld: fatal: Symbol referencing errors. No output written to a.out

wie erstellst du die .s dateien?
wenn du die unter Windows erstellst, achte darauf dass du sie in ANSI und ned in UNICODE Format speicherst.

dann müsste das eigentlich gehn.