Forum: PC-Programmierung Debugging Hilfe


von Daniel S. (dani2304)


Angehängte Dateien:

Lesenswert?

Hallo,
könnte jemand von euch mir meinen Code über Valgrind oder Splint oder 
ähnliches laufen lassen und mir die Fehlermeldungen ausgeben?
Weiß nicht so recht wie das geht... Bei meinem Code stürzt das Programm 
nämlich dann ab, wenn es return 0; erreicht. Ich weiß ist im Moment echt 
schlecht geschrieben, ist eher nur zu Testzwecken programmiert.

MfG

: Bearbeitet durch User
von Nop (Gast)


Lesenswert?

Also wenn ich schon Code sehe, der "goto" für was anderes als 
Fehlerbehandlung verwendet, und wo nichtmal die Einrückungen sinnvoll 
gesetzt sind, und wo bei calloc nicht auf Nullpointer gecheckt wird, 
dann wundert mich ein Crash nicht.

Das ist selbst zu "Testzwecken" dermaßen schlecht geschrieben, daß hier 
ursächlich ein Layer-8-Problem vorliegt. Kein Wunder, daß Du Dich in 
Deinem chaotischen Spaghettizeug nicht zurechtfindest.

Davon ab meldet CppCheck für Zeile 40:
fflush() called on input stream 'stdin' may result in undefined 
behaviour on non-linux systems.

von S. R. (svenska)


Lesenswert?

Erstens: Valgrind funktioniert so, dass man statt "./programm" einfach 
"valgrind ./programm" startet. Splint lässt man eher auf den Quelltext 
los.

Zweitens: Wenn du Scheiße programmieren möchtest, dann musst du auch 
Scheiße debuggen können. Mach es lieber gleich richtig, dann hast du 
später weniger Stress.

Drittens: Wenn du viel mit Strings hantierst und Geschwindigkeit eher 
nebensächlich ist, dann sind Scriptsprachen evtl. besser geeignet als C.

von Nop (Gast)


Lesenswert?

S. R. schrieb:
> Drittens: Wenn du viel mit Strings hantierst und Geschwindigkeit eher
> nebensächlich ist, dann sind Scriptsprachen evtl. besser geeignet als C.

Ich würde auch Pascal empfehlen. Zwar ist das wie Radfahren mit 
Stützrädern, aber es läßt ziemlich viel Unsinn gar nicht erst zu, was 
bei dem unterirdischen Codingniveau eine große Hilfe wäre.

von PittyJ (Gast)


Lesenswert?

pz = Primzahl?
Also ein Sieb des Eratosthenes? Dafür gibt es doch schon unzählige 
Lösungen im Web.


Ne, mal ehrlich. Vielleicht sollte man den Variablen vernünftige Namen 
geben. Und auch mal kommentieren was Zeilen wie
  if(strlen(BN)<=9 && strlen(BN)>=7) strcpy(Benutzername[j],BN);
bezwecken sollen.

Normalerweise werden Grossbuchstaben-Identifier wie BN für Makros und 
defines benutzt.

Debug einfach dein Programm mal selber. Dann ist der Lerneffekt am 
höchsten.

von Nop (Gast)


Lesenswert?

PittyJ schrieb:
> Debug einfach dein Programm mal selber. Dann ist der Lerneffekt am
> höchsten.

Der Lerneffekt dürfte dann auch zum Verständnis eines bekannten Zitats 
von  Kerninghan beitragen:

Es ist allgemein bekannt, daß Debuggen doppelt so schwierig ist wie ein 
Programm überhaupt zu schreiben. Wenn man also den Code so clever 
schreibt, wie man kann, wie soll man das jemals debuggen?

von Kaj (Gast)


Lesenswert?

Du solltest damit anfangen die Rueckgabewerte von calloc zu pruefen...
Von deiner verwendung von goto reden wir erst gar nicht...

von Stefan S. (Gast)


Lesenswert?

Nop schrieb:
> Der Lerneffekt

Ich frage mich zunächst, was sich der Lehrer bei der Aufgabe gedacht 
hat.

So eine Anwendung in C zu schreiben ist doch nun wirklich kein Vergnügen 
-- und damit ist der ausbleibende Lerneffekt doch schon programmiert. C 
mag auch für Anfänger ein sinnvoller Einstieg sein, aber dann muss man 
sich eben auf den Algorithmus als solchen konzentrieren, und sich nicht 
zunächt mit Trivalitäten wie Speicher-Allozierung konzentrieren. So ist 
doch klar, dass die Kinder C gleich als eklig empfinden werden und sich 
dann auf Webdesign mit Java-Script freuen, oder eben von Informatik ganz 
die Finger lassen.

(Und klar ist Speicher-Allozierung und Debugging extrem wichtig, wenn 
man dann tatsächlich später beruflich mit C arbeitet.)

von Jim M. (turboj)


Lesenswert?

Der code ist ja so richtig sch....

Fängt auch schon gut an:
1
char **Benutzername,
2
char **Passwort;
3
4
Benutzername=calloc(100,1);
5
Passwort=calloc(100,1);

Meep, falsch. Sollte nämlich besser calloc(100, sizeof(char*)) heissen,
so wird nur 1/4 oder 1/8 des benötigten Speichers allokiert.

Damit hast Du hier:
1
for(i=0;i<100;i++){
2
    Benutzername[i]=calloc(20,1);
3
    Passwort[i]=calloc(20,1);
4
}

einen fiesen Heap-überlauf. Der knallt hier nicht sofort, sondern erst 
unten beim free() Aufruf.

Den Rest schenke ich mir, da werden sicher noch mehr Fehler drin sein.

von Nop (Gast)


Lesenswert?

Stefan S. schrieb:
> Ich frage mich zunächst, was sich der Lehrer bei der Aufgabe gedacht
> hat.

Ja, daß es sich dabei um den Versuch einer Hausaufgabe handelt, die mit 
"Testzwecken" nichts zu tun hat, ist offensichtlich. Angesichts dessen, 
wie das runtergerotzt ist, bezweifle ich, daß das so gefordert war.

Sieht mir eher aus, als sei das Semester fortgeschritten, der TO hat den 
Anschluß verloren, und jetzt funktioniert "es irgendwie halbverstanden 
runterhacken" nicht mehr.

Wenn ich mich an meinen C-Kurs in der Uni entsinne, die Vorlesung fand 
ich dermaßen schlecht, daß ich mir nur die Übungsblätter für den 
Hausaufgabenschein rausgeholt habe und dann eigenständig mit nem 
C-Lehrbuch gearbeitet habe.

> So ist
> doch klar, dass die Kinder C gleich als eklig empfinden werden

Falls es sich um einen Programmierkurs an der Uni handelt, kann das 
durchaus Absicht sein, und zurecht:

https://www.joelonsoftware.com/2005/12/29/the-perils-of-javaschools-2/

"All the kids who did great in high school writing pong games in BASIC 
for their Apple II would get to college, take CompSci 101, a data 
structures course, and when they hit the pointers business their brains 
would just totally explode, and the next thing you knew, they were 
majoring in Political Science because law school seemed like a better 
idea. I’ve seen all kinds of figures for drop-out rates in CS and 
they’re usually between 40% and 70%. The universities tend to see this 
as a waste; I think it’s just a necessary culling of the people who 
aren’t going to be happy or successful in programming careers."

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.