Hallo Ali,
Aber bitte nicht lachen… ist mein erster Versuch…
Jeder hat einmal angefangen und hoffentlich aus den Fehlern gelernt !!!
Ich habe zwei Grundsätzliche Fehler entdeckt.
Zuerst zu der Fehlermeldung des Compilers:
int seq[20];
long *z_seq;
z_seq = seq; /*Zeile 48*/ Hier hast du die Fehlermeldung
int und long sind nicht das Gleiche !
z_seq ist ein Zeiger auf LONG.
seq ist ein Zeiger auf INT.
Da ein Zeiger einfach nur auf eine Speicheraddresse zeigt gibt es dann ganz lustige Resultate wenn dort ein 16-Bit-Wert abgelegt ist (z.B. int) und dann aber ein 32-Bit-Wert gelesen wird (z.B. long).
Werte kann der Compiler selber anpassen. Also bei „long = int“ kann der Compiler den „int“ einfach auf „long“ erweitern, aber bei Zeigern geht das nicht !
Das zweite, grundsätzliche Problem liegt in der Konstruktion:
long *dateieinlesen(char dname[20])
{
long *z_seq;
…
return z_seq;
}
long *z_seq; ist eine Auto-Variable und wird mit return ZERSTÖRT.
Also hier eine kleine einführung wie die Variablen in C verwaltet werden:
Allen Variablen welche AUSSERHALB einer Funktion deklariert werden wird ein fester Platz (Adresse) im Datensegment zugewiesen. Sie sind deshalb während der ganzen Laufzeit des Programms existent.
Alle Variablen welche INNERHALB einer Funktion deklariert werden werden auf dem Stack abgelegt. Der Speicher für diese Auto-Variablen wird erst festgelegt wenn diese Funktion aufgerufen wird und mit verlassen der Funktion wird dieser Speicherplatz wieder freigegeben. Ein Zeiger auf eine Auto-Variable zeigt nach dem verlassen der Funktion auf einen Speicherplatz welcher whrscheinlich schon wieder für eine andere Auto-Variable vergeben wurde. Das kann dann zu sehr „lustigen“ Fehlern im Programm führen.
Mit dem Schlüsselwort „static“ kann man dem Compiler mitteilen, dass er die Variable anders behandeln soll. Dabei hat „static“ drei verschiedene Auswirkungen, je nachdem wo es eingesetzt wird.
z.B.:
static char dateiname[20];
Eine Kleinigkeit habe ich noch vergessen zu erwähnen:
Ein Programm kann aus mehreren Modulen bestehen, welche getrennt compiliert werden und dan vom Linker zusammengesetzt werden. Du kannst also jede Funktion in eine Datei schreiben und jede Datei einzeln übersetzten, die Laufzeit-Bibliothek ist eigentlicht nichts Anderes.
-
Also eine Variable welche ausserhalb einer Funktion deklariert wurde ist automatisch GLOBAL, d.h. ein anderes Modul kann auf diese Variable zugreifen.
Wird eine solche Variable „static“ deklariert, so kann nur noch aus demjenigen Modul darauf zugegriffen werden in welchem sie deklariert wurde. Eine Variable in einem anderen Modul, mit dem gleichen Namen ist dann eine zweite Variable und bekommt ihren eigen Platz im Speicher. z.B.:
static char dateiname[20];
-
Für Funktionen gilt das selbe wie für globale Variablen und auch sie können mit „static“ vor anderen Modulen versteckt werden z.B.:
static long *dateieinlesen(char dname[20])
{
}
-
Wird eine Variable innerhalb einer Funktion als „static“ deklariert, dann wird sie nicht mehr auf dem Stack abgelegt, sondern wie eine gloabale Variable abgespeichert. Allerdings ist sie nur innerhalb der Funktion „sichtbar“. Beispiel:
long *dateieinlesen(char dname[20])
{
static long seq[20];
…
return seq;
}
MfG Peter(TOO)