sur5al
Anmeldungsdatum: 11. Mai 2010
Beiträge: 12
Wohnort: Goslar
|
Hallo zusammen.
Soweit bin ich jetzt und es klappt auch ganz gut.
Habe nur ein Problem. Bis um die Eingabe von knapp über 65000 geht alles gut. Bei 70000 bekomme ich eine Minuszahl. Der rechnet also falsch. Hat ja was mit int, long long long etc zu tun. Weiß aber nicht wo mir da was fehlt. Bin schon betriebsblind. Hat da wer n Tipp ? Das ist der Syscall:
#include <linux/linkage.h>
asmlinkage long sys_prosys(int n)
{
long ergebnis=0;
int i;
for (i=1;i<=n;i++)
{
ergebnis +=i;
}
return ergebnis;
} Das ist der Header: #include <unistd.h>
#define __NR_prosys 337
long long prosys (int n)
{
return syscall(__NR_prosys,n);
} .... und das ist die .C
#include <sys/syscall.h>
#include <stdio.h>
#include <errno.h>
#include „gauss.h“
int wert;
int main(void)
{
printf(„Bitte geben Sie eine Zahl ein \n“);
fflush(stdin);
scanf(„%d“; &wert)
if(wert>70001)
{
printf(„Ihr eingegebener Wert ist zu groß – nur bis 70000 \n“);
}
else
{
printf("Berechnung nach der Gauss-Formel \n");
printf("Die Summe ist: %ld \n", prosys(wert));
}
return 0;
} Und genau da ist irgendwas falsch dran.... Liebe Grüße und Dank Euch
|
uname
Anmeldungsdatum: 28. März 2007
Beiträge: 6030
Wohnort: 127.0.0.1
|
Kannst du nicht alles was "int" heißt durch "long" ersetzen? Zudem kannst du natürlich die Gauß-Summe einfacher berechnen: Summe(n) = n (n +1) / 2 http://de.wikipedia.org/wiki/Gau%C3%9Fsche_Summenformel
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
sur5al schrieb:
Das ist der Syscall:
Du beschäftigst Dich mit Syscalls, aber kennst keine Integerüberläufe?
|
sur5al
(Themenstarter)
Anmeldungsdatum: 11. Mai 2010
Beiträge: 12
Wohnort: Goslar
|
Doch doch.... genau da ist mein Problem. Mir ist klar dass int "zu klein" ist. Ich weiß nur nicht wo ich da den Bock drin habe ☺
|
sur5al
(Themenstarter)
Anmeldungsdatum: 11. Mai 2010
Beiträge: 12
Wohnort: Goslar
|
uname schrieb: Kannst du nicht alles was "int" heißt durch "long" ersetzen? Zudem kannst du natürlich die Gauß-Summe einfacher berechnen: Summe(n) = n (n +1) / 2 http://de.wikipedia.org/wiki/Gau%C3%9Fsche_Summenformel
Stimmt. geht einfacher.. ist aber leider nicht meine Aufgabenstellung.. ☺
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
erstens solltest Du den Code einrücken. Dann in die Header schauen, oder - vielleicht einfacher - mit einem Debugger durchgehen. In C ist die Größe eines int nicht definiert - das kann von Plattform zu Plattform unterschiedlich sein. Je nach dem, wozu sich Deine includes auflösen, ist da eine Plattform dabei, die einen int auf 16 bit beschränkt. Und dann hilft es nicht auf der nächsten Ebene long long superlong zu rufen - wenn da nur 16 bit waren werden es nicht mehr. Was aber definiert ist, ist, daß ein long nicht kleiner als ein int ist, ein int nicht kleiner als ein short usw.
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4563
Wohnort: Berlin
|
Es könnte auch helfen stdint.h einzubinden und die Typen darin zu verwenden, also zum Beispiel uint32_t wenn man eine vorzeichenlose 32-Bit-Ganzahl haben möchte. Sollte die Zielplattform so etwas nicht bieten, würde ich vom Compiler bzw. Präprozessor an der Stelle dann eine Fehlermeldung erwarten.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Dein Code compiliert ja von vorne bis hinten nicht. #include „gauss.h“
Du brauchst richtige Anführungszeichen (zig mal) - ist das mit OpenOffice-Writer programmiert? // nicht so:
scanf(„%d“; &wert)
// so:
scanf ("%d", &wert);
|
uname
Anmeldungsdatum: 28. März 2007
Beiträge: 6030
Wohnort: 127.0.0.1
|
ist das mit OpenOffice-Writer programmiert?
Der Profi editiert nur mit dem Vim , natürlich mit der Textversion.
|
sur5al
(Themenstarter)
Anmeldungsdatum: 11. Mai 2010
Beiträge: 12
Wohnort: Goslar
|
Ich habe da ganz simpel irgendeinen Überlauf drin.....
Alle Eingaben von "wert" bis 65535 gehen ja tadellos. Also funktioniert das Ding ja. Anführungszeichen stimmen auch. Hatte das nur aus meinen "Aufzeichnungen" rauskopiert.
Ist mit vi gemacht. Das passt schon.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
sur5al schrieb: Anführungszeichen stimmen auch. Hatte das nur aus meinen "Aufzeichnungen" rauskopiert.
Ist mit vi gemacht. Das passt schon.
Da gehen die Meinungen aber auseinander:
gcc gauss.c
gauss.c:4:10: error: #include expects "FILENAME" or <FILENAME>
gauss.c: In function ‘main’:
gauss.c:9: error: stray ‘\342’ in program
gauss.c:9: error: stray ‘\200’ in program
gauss.c:9: error: stray ‘\236’ in program
gauss.c:9: error: ‘Bitte’ undeclared (first use in this function)
gauss.c:9: error: (Each undeclared identifier is reported only once
gauss.c:9: error: for each function it appears in.)
gauss.c:9: error: expected ‘)’ before ‘geben’
gauss.c:9: error: stray ‘\’ in program
gauss.c:9: error: stray ‘\342’ in program
gauss.c:9: error: stray ‘\200’ in program
gauss.c:9: error: stray ‘\234’ in program
gauss.c:9: warning: format not a string literal and no format arguments
gauss.c:11: error: stray ‘\342’ in program
gauss.c:11: error: stray ‘\200’ in program
gauss.c:11: error: stray ‘\236’ in program
gauss.c:11: error: expected expression before ‘%’ token
gauss.c:11: error: stray ‘\342’ in program
gauss.c:11: error: stray ‘\200’ in program
gauss.c:11: error: stray ‘\234’ in program
gauss.c:11: warning: format not a string literal and no format arguments
gauss.c:13: error: expected ‘;’ before ‘if’
gauss.c:15: error: stray ‘\342’ in program
gauss.c:15: error: stray ‘\200’ in program
gauss.c:15: error: stray ‘\236’ in program
gauss.c:15: error: stray ‘\303’ in program
gauss.c:15: error: stray ‘\237’ in program
gauss.c:15: error: stray ‘\342’ in program
gauss.c:15: error: stray ‘\200’ in program
gauss.c:15: error: stray ‘\223’ in program
gauss.c:15: error: stray ‘\’ in program
gauss.c:15: error: stray ‘\342’ in program
gauss.c:15: error: stray ‘\200’ in program
gauss.c:15: error: stray ‘\234’ in program
|
sur5al
(Themenstarter)
Anmeldungsdatum: 11. Mai 2010
Beiträge: 12
Wohnort: Goslar
|
Ja doch... ☺ in dem Code von mir da oben stimmen die nicht....
In meiner gauss.c stimmen die und sind richtig. So OK ? ☺ Sonst reden wir aneinander vorbei ☺
Also das ist schon so ok.
Die stimmen alle.
|
YEPHENAS
Anmeldungsdatum: 8. Juni 2009
Beiträge: Zähle...
|
sur5al schrieb: Ich habe da ganz simpel irgendeinen Überlauf drin.....
Alle Eingaben von "wert" bis 65535 gehen ja tadellos. Also funktioniert das Ding ja.
Rechne doch mal nach: ergebnis hat Typ long Ein long mit 32 Bit hat einen Wertebereich von −2.147.483.648 bis 2.147.483.647 Das Ergebnis für 65536 wäre nach der gaußschen Summenformel (65536 * 65537) / 2 = 2.147.516.416 2.147.516.416 > 2.147.483.647 ⇒ Überlauf
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
sur5al schrieb: Ja doch... ☺ in dem Code von mir da oben stimmen die nicht....
In meiner gauss.c stimmen die und sind richtig. So OK ? ☺ Sonst reden wir aneinander vorbei ☺
Das ist mir schon klar, sonst würdest Du bis 2^16-1 ja nicht richtige Ergebnisse bekommen. Die Frage ist aber auch, was sonst noch abweicht. Das Komma beim scanf war ja auch falsch - das kommt ja nicht durch ungeeignete Editoren. Hauptfrage ist aber, auf welcher Plattform das mit welchen Befehlen gebaut wird, Da hörst Du aber wohl besser auf Marc und uname.
|
sur5al
(Themenstarter)
Anmeldungsdatum: 11. Mai 2010
Beiträge: 12
Wohnort: Goslar
|
Genau.... da ist mein Problem. Selbst wenn mein syscal long long hat, also
#include <linux/linkage.h>
asmlinkage long sys_prosys(int n)
{
long long ergebnis=0;
int i;
for (i=1;i<=n;i++)
{
ergebnis +=i;
}
return ergebnis;
} haut das nicht hin. Ich sags ja..bin zu blöd dazu.
Theoretisch ist mir das allso klar. Ich weiß wie groß int ist ich weiß auch long etc. ich weiß auch dass er überläuft und dann eben über die 2,1 Mio Grenze geht.... nur eben..... wo kann ich da flicken ?
|