Newbie Problem: Segmentation Fault

So, ich hab mal wieder als Newbie ein blödes Problem, durch das ich nicht durchsteige - irgendwann lerne auch ichs noch.

Das Programm erzeugt bei mir einen „Segmentation Fault“ unter Linux.

Hier der Source:

/*
* Dieses kleine Testprogramm soll Kommazahlen runden können und bei 9 nicht
* runden-einfach aufhören
*/

#include
#include

//Deklarationen

int runde(char *toround);

int main()
{
char *krummerwert = „1.23456“;
// printf(„Vor runde(): %s\n“, *krummerwert);
runde(krummerwert);
// printf(„Nach runde(): %s“, *krummerwert);

return 0;
}

int runde(char *toround)
{
int fourtoright;

while(*toround =! ‚.‘)
{
toround++;
}

for(fourtoright=0;fourtoright

Hallo leon,

> int runde(char \*toround)  
> {  
> int fourtoright;  
>   
>   
> while(\*toround =! '.')

// Was paassiert wenn toround keinen '.' enthält ???
// --\> Segment Error


> {  
> toround++;  
> }  
>   
> for(fourtoright=0;fourtoright

MfG Peter(TOO)
P.S. schau dir mal das -Tag an.

Hallo leon,

int runde(char *toround)
{
int fourtoright;

while(*toround =! ‚.‘)

// Was paassiert wenn toround keinen ‚.‘ enthält ???
// --> Segment Error

–>Mhmm, das ist aber ne Funktion, die in jedem FAll einen Wert mit einem Punkt bekommen wird(Messgerät), d.h. diese Gefahr hätte ich jetzt als nicht zu hoch eingeschätzt. Zumal in der Mainfunktion ja schon die zahl 1.2345 der Funktion übergeben wurde…

{
toround++;
}

for(fourtoright=0;fourtoright Und wie kann ich diesen Speicher auf „nichtschreibgeschützt“ setzen? Was kann ich dann der Funktion für Werte übergeben?
toround–;
if(*toround =! ‚9‘)
*toround++;
}

return 0;
}

Vielen Dank Peter, der Hinweis auf die Stringkonstante hat mir was gebracht, ich weiss wo ich jetzt weiter forschen muss…vielleicht kommt ja noch ein Tipp dazu von euch…

mfg
leon

Hallo leon,

int runde(char *toround)
{
int fourtoright;

while(*toround =! ‚.‘)

// Was paassiert wenn toround keinen ‚.‘ enthält ???
// --> Segment Error

–>Mhmm, das ist aber ne Funktion, die in jedem FAll einen
Wert mit einem Punkt bekommen wird(Messgerät), d.h. diese
Gefahr hätte ich jetzt als nicht zu hoch eingeschätzt. Zumal
in der Mainfunktion ja schon die zahl 1.2345 der Funktion
übergeben wurde…

Per Datenübertragung ?
Da können auch mal Fehler auftreten.
Was ist bei Overflow ??

{

if (*toround == ‚/0‘)
{
// Fehler behandeln
return 0;
}

toround++;
}

for(fourtoright=0;fourtoright Und wie kann ich diesen Speicher auf

„nichtschreibgeschützt“ setzen? Was kann ich dann der Funktion
für Werte übergeben?

In main() statt
char *krummerwert = „1.23456“; // in main()
musst du
char krummerwert[10];
srcpy(&krummerwert[0], „1.23456“);

toround–;
if(*toround =! ‚9‘)
*toround++;
}

return 0;
}

Vielen Dank Peter, der Hinweis auf die Stringkonstante hat mir
was gebracht, ich weiss wo ich jetzt weiter forschen
muss…vielleicht kommt ja noch ein Tipp dazu von euch…

MfG Peter(TOO)

int runde(char *toround)
{
int fourtoright;

while(*toround =! ‚.‘)

// Was paassiert wenn toround keinen ‚.‘ enthält ???
// --> Segment Error

–>Mhmm, das ist aber ne Funktion, die in jedem FAll einen
Wert mit einem Punkt bekommen wird(Messgerät), d.h. diese
Gefahr hätte ich jetzt als nicht zu hoch eingeschätzt. Zumal
in der Mainfunktion ja schon die zahl 1.2345 der Funktion
übergeben wurde…

Per Datenübertragung ?
Da können auch mal Fehler auftreten.
Was ist bei Overflow ??

->Wie, was ist bei Overflow? Meinst du was ist, wenn ich über den Speicher hinausschieße? Bis jetzt noch gar nix. Ist ja alles noch noch nichtmal Alpha Stadium: Viele Ideen, wenig Zeit und oft Probleme.

So, vielen Dank, damit lässt sich mal wieder produktiv weiterarbeiten. Wenns immer noch abstürzt melde ich mich noch einmal.

bis denne,
leon

->Wie, was ist bei Overflow? Meinst du was ist, wenn ich
über den Speicher hinausschieße? Bis jetzt noch gar nix.

Nein, Was zeigt das Messgerät an, wenn der Messbereich überschritten wird ?
Manche zeigen dann z.B „Err“ oder „OL“, damit sollte dein Prog auch zurechtkommen und nicht den Speicher „zerschiessen“.

MfG Peter(TOO)

->Wie, was ist bei Overflow? Meinst du was ist, wenn ich
über den Speicher hinausschieße? Bis jetzt noch gar nix.

Nein, Was zeigt das Messgerät an, wenn der Messbereich
überschritten wird ?

Noch nix, wir haben es noch nicht bekommen.

Manche zeigen dann z.B „Err“ oder „OL“, damit sollte dein Prog
auch zurechtkommen und nicht den Speicher „zerschiessen“.

Dafür wirds wieder andere Funktionen geben. Meine Aufgabe in dieser Jahresarbeit ist es, die Programmierarbeit zu erledigen(und bei der Gelegenheit praktische C-Erfahrung unter Linux zu sammeln).

mfg
leon

Ps: das mit dem messbereich überschreiten werde ich weitersagen, damit auch in die richtung nix passieren kann.

Hallo leon,

Aus meiner Erfahrung gibt es 3 Grund-Charaktere von Programmen:

  1. Robuste Programme, welche nur auf dem Computer des Entwicklers funktionieren, Sobald man es auf einem anderen Computer installiert passieren die Wundersamsten Dinge.

  2. „Schönwetter-Programme“: funktionieren bestens mit den mitgelieferten Beispielen. Sobald du aber nur eine Ziffer an einem Beispiel änderst, hast du Abstürze oder andere Wundersame ergebnisse.

  3. Robuste Programme: Bezogen auf dein Beispiel, könnte man da die Online-Ausgabe der Bildzeitung als Input verwenden, Als Resultat gäbe es zwar eine eine Rechte Anzahl von Fehlermeldungen, aber sobald wieder gültige Daten „gefüttert“ werden stimmt auch die Ausgabe.

Die meisten realen Programme sind irgendwo zwischen 2 und 3 angesiedelt.

Insbesonders Wenn daten von Ausserhalb eines Programmes kommen, musst du damit rechnen, dass sie nicht im erwarteten Format vorliegen und entsprechende Abfragen in deinem Programm vornehmen.
Ganz wichtig in deinem Beispiel ist, dass du abbrichst wenn der String zu Ende ist (Also die Abfrage auf ‚/0‘), sonnst wurstelst du plötzlich in fremden Variablen rum, was dann zu zu enormen Problemen führt.

Ein weiteres Problem ist z.B. dass das Messgerät im Betrieb an- oder abgesteckt oder ein-/aus-geschaltet wird. Dadurch wirst du mindestens einen verstümmelten Datensatzt erhalten, welcher das Programm nicht zum Absturz bringen sollte.

MfG Peter(TOO)