• Aktualisierte Forenregeln

    Eine kleine Änderung hat es im Bereich Forenregeln unter Abschnitt 2 gegeben, wo wir nun explizit darauf verweisen, dass Forenkommentare in unserer Heftrubrik Leserbriefe landen können.

    Forenregeln


    Vielen Dank

hilfe bei C-Programm

Max_Power

Hobby-Spieler/in
Registriert
22.03.2001
Beiträge
670
Reaktionspunkte
0
ich muß diesen quelltext kompilieren und rausfinden, was das programm macht. dummerweise sagt Miracle C da immer
c:\downloads\asm.c: line 8: Parse Error, expecting `')'' or `',''
'void insert(long long count) { int i'
aborting compile
und ich versteh nicht warum, denn der code sollte eigentlich stimmen wie er ist. hat hier einer ne ahnung?
 
Max_Power am 19.10.2004 23:11 schrieb:
ich muß diesen quelltext kompilieren und rausfinden, was das programm macht. dummerweise sagt Miracle C da immer
c:\downloads\asm.c: line 8: Parse Error, expecting `')'' or `',''
'void insert(long long count) { int i'
aborting compile
und ich versteh nicht warum, denn der code sollte eigentlich stimmen wie er ist. hat hier einer ne ahnung?

Also bei dem Kompilierproblem werde ich dir wohl nicht herfen können
(Aber ich als quasi Informatikstudent hab noch nie long long count gesehen in C... nur 'long, long count', obwohl das an dieser Stelle auch nicht geht, versuchs einfach mal alle 'long long' zu ersetzen durch 'long', aber wie gesagt, ich hab das nie gesehen und nie benutzt, vielleicht hat es ja Sinn)

Was das Programm angeht, hab ich mir das angesehen und kann dir wohl helfen. Die rdtsc() Funktion (Wird in diesem Fall vor dem Kompilieren durch den Sums oben ersetzt, erfüllt aber die seleb Funktion) tut eigentlich nichts anderes als den CPU-Counter der die Clocks seit dem letzten Reset des CPU zu zählen auszulesen. Abhängig von der Prozessorgeschwindigkeit, sagen wir 100 MHz zählt dieser Counter 100 Millionen mal in der Sekunde rauf. rdtsc() liesst den aktuellen Wert aus.

Das Programm selbst speichert 0x10000 mal einfach die Counts die dein Rechner für die Abarbeitung der zwei rdtsc()Funktionen braucht ab.
for (i=0; i<0x100000; i++) {
rdtsc(start);
rdtsc(stop);
insert(stop-start);
}


Und zwar wie folgt: Das counts-Array besteht aus 1000mal 2 Elementen.
Element Eins ist ein Zähler der misst wie oft ein >Count-Wert vorgekommen ist, Element Zwei ist der Count-Wert selbst.
int counts[2][1000];


Immer wenn das Hauptprogramm einen Countwert speichern will überprüft die insert()Funktion erst ob dieser Countwert schon einmal übergeben wurde
for (i=0; i<index; i++)
if (counts[1]==count)
break;


(übergebene Countwerte sind in counts[1][beliebig] gespeichert), stimmt das, dann zählt die Funktion die Häufigkeit (Den Zähler wie oft exakt dieser CPU-Countwert vorgekommen ist um eins hoch counts[0][beliebig]++). Ist dieser Countwert vorher noch nicht in counts[][] übergeben worden, dann überprüft die insert()Funktion ob noch Platz im Array ist für einen neuen Wert,

wenn ja wird dieser erstellt, wenn nicht wird das einfach nicht gewertet und die Funktion wird returned. Ganz am Ende des Programms gibt es eine Liste aus Countwerten und wie oft diese vorgekommen sind aus.
for (i=0; i<index; i++)
printf("%10d %10d\n", counts[1], counts[0]);


Wie gesagt, was die Funktion des Programms angeht bin ich mir sicher, ich glaube auch, dass 'long long' wirklich nötig ist, das der CPU-Count einem internen 64 Bit Zähler entspricht. Allerdings würde ich das IntegerArray count etwas optimistisch bezeichnen, falls der Rechner sehr ausgelastet ist könnte da der übergebene Wert aus dem Wertebereich für int laufen. Und nochmal, weil es so ungewöhnlich ist:

Ausgelesen wird der CPU-Zähler mit der Anweisung rdtsc. Die höherwertigen 32 Bit befinden sich daraufhin in edx, die niederwertigen in eax. Manche Assembler kennen die Anweisung vielleicht nicht weil sie eine zeitlang mehr oder weniger undokumentiert war. In diesem Fall kann man sie als dw 310Fh umschreiben.

Und weil ich so in fahrt bin: die rdtsc Funktion wird vor Kompilierung genau deswegen ersetzt durch ein Stück Assembler. Aber darauf geh ich jetzt nicht ein, sonst reicht die 10000 Zeichen Begrenzung nicht :ugly:

Alle Angaben ohne Gewähr, aber es müsste passen. Hatte hier leider keine Asm Bücher oder ähnliches da, musste also aus Gedächtnis ergänzen.
 
hm, danke... darüber denk ich mal nach. die übung, die zu der aufgabe war, hab ich verpasst. die war heut morgen halb 8. da hab ich mich grad nochmal im bett umgedreht *G*
ich frag mich halt immer noch, warum das ding nicht kompiliert... aber ich finds schon raus. ich versuchs mal mit nur einem long, mal sehen was passiert

edit: hab mal rumgespielt, jetz kompilierts wenigstens. ich hab die 2. zeile mal so
#define rdtsc(X) //asm volatile("rdtsc":"=A" (X))
verändert, fragt sich ob das sinn macht...
na ja, jetz weiß ich nur noch nicht, wie ich die ausgabe interpretieren soll... aber das find ich schon raus
 
Max_Power am 20.10.2004 12:50 schrieb:
hm, danke... darüber denk ich mal nach. die übung, die zu der aufgabe war, hab ich verpasst. die war heut morgen halb 8. da hab ich mich grad nochmal im bett umgedreht *G*
ich frag mich halt immer noch, warum das ding nicht kompiliert... aber ich finds schon raus. ich versuchs mal mit nur einem long, mal sehen was passiert

edit: hab mal rumgespielt, jetz kompilierts wenigstens. ich hab die 2. zeile mal so
#define rdtsc(X) //asm volatile("rdtsc":"=A" (X))
verändert, fragt sich ob das sinn macht...
na ja, jetz weiß ich nur noch nicht, wie ich die ausgabe interpretieren soll... aber das find ich schon raus

Hi,
mit "long long x" wird x als 64Bit Zahl definiert. Das ist also OK, ersetzt Du das durch "long x" arbeitet Dein Programm nur mit 32Bit Werten - letztendlich hängt die zu verwendende Definiton vom Datenbereich ab, in dem ein Programm arbeitet.
Deine Änderung
"#define rdtsc(X) //asm volatile("rdtsc":"=A" (X))"
ist auf jeden Fall Schwachsinn, denn der Präprozessor ersetzt vor dem Kompilieren das rdtsc(X) durch die gegebene Definition, also sieht Dein Code, wenn ihn der Compiler verarbeitet, so aus:
...
for (i=0; i<0x100000; i++) {
//asm volatile("rdtsc":"=A" (start))
//asm volatile("rdtsc":"=A" (stop))
insert(stop-start);
...
Da Du die Variablen start und stop vor der Verwendung nicht initialisierst, ist deren Inhalt einfach zufällig. Damit ist auch das Ergebnis zufällig und eine Interpretation nicht wirklich möglich.

Der Fehler liegt in Deiner Assembler Anweisung!

Bye,
Olaf
 
thehero am 22.10.2004 10:17 schrieb:
Max_Power am 20.10.2004 12:50 schrieb:
hm, danke... darüber denk ich mal nach. die übung, die zu der aufgabe war, hab ich verpasst. die war heut morgen halb 8. da hab ich mich grad nochmal im bett umgedreht *G*
ich frag mich halt immer noch, warum das ding nicht kompiliert... aber ich finds schon raus. ich versuchs mal mit nur einem long, mal sehen was passiert

edit: hab mal rumgespielt, jetz kompilierts wenigstens. ich hab die 2. zeile mal so
#define rdtsc(X) //asm volatile("rdtsc":"=A" (X))
verändert, fragt sich ob das sinn macht...
na ja, jetz weiß ich nur noch nicht, wie ich die ausgabe interpretieren soll... aber das find ich schon raus

Hi,
mit "long long x" wird x als 64Bit Zahl definiert. Das ist also OK, ersetzt Du das durch "long x" arbeitet Dein Programm nur mit 32Bit Werten - letztendlich hängt die zu verwendende Definiton vom Datenbereich ab, in dem ein Programm arbeitet.
Deine Änderung
"#define rdtsc(X) //asm volatile("rdtsc":"=A" (X))"
ist auf jeden Fall Schwachsinn, denn der Präprozessor ersetzt vor dem Kompilieren das rdtsc(X) durch die gegebene Definition, also sieht Dein Code, wenn ihn der Compiler verarbeitet, so aus:
...
for (i=0; i<0x100000; i++) {
//asm volatile("rdtsc":"=A" (start))
//asm volatile("rdtsc":"=A" (stop))
insert(stop-start);
...
Da Du die Variablen start und stop vor der Verwendung nicht initialisierst, ist deren Inhalt einfach zufällig. Damit ist auch das Ergebnis zufällig und eine Interpretation nicht wirklich möglich.

Der Fehler liegt in Deiner Assembler Anweisung!

Bye,
Olaf

na ja, inzwischen hat sich das problem geklärt... die idioten in der Info-Fak gehen mal rotzfrech davon aus, das man Linux drauf hat, aber gerade bei Laptops macht sich das ja recht schlecht wegen dem platz... meist braucht man ja doch Windows... jedenfalls kompiliert der mist unter Windows absolut nicht, aber im Linux spuckt gcc keinen einzigen fehler aus...
 
Max_Power am 22.10.2004 14:53 schrieb:
thehero am 22.10.2004 10:17 schrieb:
Max_Power am 20.10.2004 12:50 schrieb:
hm, danke... darüber denk ich mal nach. die übung, die zu der aufgabe war, hab ich verpasst. die war heut morgen halb 8. da hab ich mich grad nochmal im bett umgedreht *G*
ich frag mich halt immer noch, warum das ding nicht kompiliert... aber ich finds schon raus. ich versuchs mal mit nur einem long, mal sehen was passiert

edit: hab mal rumgespielt, jetz kompilierts wenigstens. ich hab die 2. zeile mal so
#define rdtsc(X) //asm volatile("rdtsc":"=A" (X))
verändert, fragt sich ob das sinn macht...
na ja, jetz weiß ich nur noch nicht, wie ich die ausgabe interpretieren soll... aber das find ich schon raus

Hi,
mit "long long x" wird x als 64Bit Zahl definiert. Das ist also OK, ersetzt Du das durch "long x" arbeitet Dein Programm nur mit 32Bit Werten - letztendlich hängt die zu verwendende Definiton vom Datenbereich ab, in dem ein Programm arbeitet.
Deine Änderung
"#define rdtsc(X) //asm volatile("rdtsc":"=A" (X))"
ist auf jeden Fall Schwachsinn, denn der Präprozessor ersetzt vor dem Kompilieren das rdtsc(X) durch die gegebene Definition, also sieht Dein Code, wenn ihn der Compiler verarbeitet, so aus:
...
for (i=0; i<0x100000; i++) {
//asm volatile("rdtsc":"=A" (start))
//asm volatile("rdtsc":"=A" (stop))
insert(stop-start);
...
Da Du die Variablen start und stop vor der Verwendung nicht initialisierst, ist deren Inhalt einfach zufällig. Damit ist auch das Ergebnis zufällig und eine Interpretation nicht wirklich möglich.

Der Fehler liegt in Deiner Assembler Anweisung!

Bye,
Olaf

na ja, inzwischen hat sich das problem geklärt... die idioten in der Info-Fak gehen mal rotzfrech davon aus, das man Linux drauf hat, aber gerade bei Laptops macht sich das ja recht schlecht wegen dem platz... meist braucht man ja doch Windows... jedenfalls kompiliert der mist unter Windows absolut nicht, aber im Linux spuckt gcc keinen einzigen fehler aus...

Hab's unter Windows kompiliert, und es geht einwandfrei. :P
 
Max_Power am 22.10.2004 14:53 schrieb:
thehero am 22.10.2004 10:17 schrieb:
Max_Power am 20.10.2004 12:50 schrieb:
hm, danke... darüber denk ich mal nach. die übung, die zu der aufgabe war, hab ich verpasst. die war heut morgen halb 8. da hab ich mich grad nochmal im bett umgedreht *G*
ich frag mich halt immer noch, warum das ding nicht kompiliert... aber ich finds schon raus. ich versuchs mal mit nur einem long, mal sehen was passiert

edit: hab mal rumgespielt, jetz kompilierts wenigstens. ich hab die 2. zeile mal so
#define rdtsc(X) //asm volatile("rdtsc":"=A" (X))
verändert, fragt sich ob das sinn macht...
na ja, jetz weiß ich nur noch nicht, wie ich die ausgabe interpretieren soll... aber das find ich schon raus

Hi,
mit "long long x" wird x als 64Bit Zahl definiert. Das ist also OK, ersetzt Du das durch "long x" arbeitet Dein Programm nur mit 32Bit Werten - letztendlich hängt die zu verwendende Definiton vom Datenbereich ab, in dem ein Programm arbeitet.
Deine Änderung
"#define rdtsc(X) //asm volatile("rdtsc":"=A" (X))"
ist auf jeden Fall Schwachsinn, denn der Präprozessor ersetzt vor dem Kompilieren das rdtsc(X) durch die gegebene Definition, also sieht Dein Code, wenn ihn der Compiler verarbeitet, so aus:
...
for (i=0; i<0x100000; i++) {
//asm volatile("rdtsc":"=A" (start))
//asm volatile("rdtsc":"=A" (stop))
insert(stop-start);
...
Da Du die Variablen start und stop vor der Verwendung nicht initialisierst, ist deren Inhalt einfach zufällig. Damit ist auch das Ergebnis zufällig und eine Interpretation nicht wirklich möglich.

Der Fehler liegt in Deiner Assembler Anweisung!

Bye,
Olaf

na ja, inzwischen hat sich das problem geklärt... die idioten in der Info-Fak gehen mal rotzfrech davon aus, das man Linux drauf hat, aber gerade bei Laptops macht sich das ja recht schlecht wegen dem platz... meist braucht man ja doch Windows... jedenfalls kompiliert der mist unter Windows absolut nicht, aber im Linux spuckt gcc keinen einzigen fehler aus...
Gibt's eine korrigierte version?
Wenn ja kanst du die mal hier rein posten?
Würd mich interressiern.
 
Zurück