Fehlersuche ???
-
In der Funktion ausgabe benutzt du len, ohne es initialisiert zu haben. Außerdem gibst du nichts zurück.
Was 2. angeht: Du könntest eine verkette Liste von punkt-Strukturen anlegen.
-
[quote="MFK"]In der Funktion ausgabe benutzt du len, ohne es initialisiert zu haben. Außerdem gibst du nichts zurück.
Was 2. angeht: Du könntest eine verkette Liste von punkt-Strukturen anlegen.[/quote]
Ich danke dir fuer deine schnel Antwort.
Das Problem ist, wenn ich verstehen wuerde, was du damit meinst, ich gebe nicht zurueck, koennte ich auch was am Programm aendern.
Also.Wieso gebe ich nichts zurueck ? Was muss ich zurueck geben?
Und wie meinst du das mit der Verketten Liste ?
-
1. Benutze Codetags!
2. Schau dir mal die Grundlagen zu Funktionen an....Verkettete Listen gibts hier:
http://www.pronix.de/C/standard_C/c_programmierung_24.shtml
-
Es wäre schon interessant zu wissen was du vorhast, damit könnt man die auch beim Design deines Programmes helfen.
Verkette Listen wären prinzipiell eine sinnvolle Lösung, allerdings schätze ich, das diese über seinem Wissensniveau liegen.
- Woher weiss len in dieser Funktion wieviele Elemete es sind?
- Wieso definierst du den Rückgabe wert con ausgabe als short, und nirgendwo ist ein return Statement. Von Funktionalität würde hier eher ein "void ausgabe" Sinn machenshort ausgabe (struct punkt *pt) { short index,len; for (index=0; index<len;index++) { printf("1: %f\n 2: %f\n 3: %f\n",&pt[index].x,&pt[index].y,&pt[index].z); } }
- Wie kommst du in deinem Programm an anzahl? Wenn du die Größe von anzahl kennst bevor du die Werte einliest, könnte ein sinnvolles malloc, free weiterhelfen.
- Wofür benutzt du struct punkt *ptr;
Für die lesbarkeit wäre ein
typedef struct { double x; double y; double z; }punkt;
sehr hilfreich.
Eine kleine Empfehlung noch es gibt hier im Forum gute Tutorials zur Einführung, und es gibt gute Anfängerbücher. Erarbeite dir damit
etwas mehr Basiswissen.
-
Also. Hier mal eine Uebersicht, was ich ueberhaupt machen soll.
Ich bekomme eine Datei. Ich soll Sie einlesen und bestimmte Dinge in eine andere Datei schreiben. Die Dinge sind Punkte.
Und das hat immer eine solche folgende Form.0
SECTION
2
ENTITIES
0
INSERT
8
Top
2
UNIT_DISC
10 x Koordinate
187.9600000 Punkt
20 y Koordinate
187.9600000 PunktDann bla bla
und es folgt wieder so etwas
0
INSERT
8
Top
2
UNIT_DISC
10 x Koordinate
187.9600000 Punkt
20 y Koordinate
157.4800000 Punktund so weiter..
ich muss die angestrichenen schluesselworte finden, in Dynamische Felder schreiben und dann spaeter bearbeiten und wieder in eine andere Datei schreiben.Nun, da ich eine Link schon bekommen habe ueber einfach Verkettete Listen habe ich das auch schon mit den Dynamischen Felder hin bekommen.
Code..
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 20struct punkt {
char name[MAX];
double x;
double y;
double z;
struct punkt *next;};struct punkt *next = NULL;
struct punkt *anfang=NULL;/Wir hängen einen Datensatz an oder geben einen neuen ein
n=name,x=x-koordinate,y=y-koordinate,z=z-koordinate/void anhaengen(char n[],double x,double y,double z)
{
/* Zeiger zum Zugriff auf die einzelnen Elemente der Struktur*/struct punkt *zeiger;
/* Wir fragen ab, ob es schon ein Element in der Liste gibt.
Wir suchen das Element, auf das unser Zeiger *anfang
zeigt. Falls anfang immer noch auf NULL zeigt, bekommt
anfang die Adresse unseres 1. Elements und ist somit der
Kopf (Anfang) unserer Liste/
if(anfang == NULL)
{
/* Wir reservieren Speicherplatz für unsere Struktur für das erste Element der Liste/
if((anfang =(struct punkt
malloc(sizeof(struct punkt))) == NULL)
fprintf(stderr,"Kein Speicherplatz vorhanden für anfang\n");
strcpy(anfang->name,strtok(n,"\n"));
anfang->x=x;
anfang->y=y;
anfang->z=z;/* Somit haben wir unseren Anfang der Liste. Von nun an
zeigt der Zeiger anfang immer auf das Element vor ihm.
Da dies aber jetzt das 1. Element der Liste war, zeigt
der Zeiger anfang auf den Zeiger next. next zeigt
am Ende immer wieder NULL*/anfang->next=NULL;
}/*Es scheint schon mindestens ein Element in der Liste
vorhanden zu sein, da der Anfang nicht == NULL ist.
Jetzt suchen wir so lange nach dem nächsten Element, bis
der next-Zeiger auf NULL zeigt. Somit haben wir das
Ende der Liste gefunden und können einen neuen Datensatz anhängen/
else
{
zeiger=anfang; /*Wir zeigen auf das 1. Element*/
while(zeiger->next != NULL)
zeiger=zeiger->next;/*Wir reservieren einen Speicherplatz für das letzte Element der Liste und hängen es an.*/
if((zeiger->next =(struct punkt
malloc(sizeof(struct punkt))) == NULL)
fprintf(stderr,"Kein Speicherplatz für letztes Element\n");zeiger=zeiger->next; /*zeiger auf neuen Speicherplatz*/
strcpy(zeiger->name,strtok(n, "\n"));
zeiger->x=x;
zeiger->y=y;
zeiger->z=z;
zeiger->next=NULL;
}
}/*Funktion zum Löschen einer Datei*/
void loesche(char wen[])
{
struct punkt *zeiger ,*zeiger1;/*Ist überhaupt ein Element vorhanden?*/
if(anfang != NULL)
{
/*Ist unser 1. Element das von uns gesuchte (wen[])?*/
if(strcmp(anfang->name,wen) == 0)
{
zeiger=anfang->next;
free(anfang);
anfang=zeiger;
}
else
{
/Es ist nicht das 1. Element zu löschen.Wir suchen in der weiteren Kette,
ob das zu löschende Element vorhanden ist/zeiger=anfang;
while(zeiger->next != NULL)
{
zeiger1=zeiger->next;
/*Ist die Adresse von zeiger1 der gesuchte Name?*/if(strcmp(zeiger1->name,wen) == 0)
{
/*Falls ja dann.....*/
zeiger->next=zeiger1->next;
free(zeiger1);
break;
}
zeiger=zeiger1;
}/*Ende while*/
} /*Ende else*/
} /*Ende if(anfang != NULL)*/else
printf("Es sind keine Daten zum Löschen vorhanden!!!\n");
}/*Funktion zum Ausgeben der Dateien*/
void ausgabe()
{
struct punkt *zeiger;
zeiger=anfang;
printf("||=======================================================||\n");
printf("|%10cName%10c | x | y | z |\n",' ',' ');
printf("||=======================================================||\n");while(zeiger != NULL)
{
printf("|%12s| %lf | %lf | %lf |\n",zeiger->name,zeiger->x,zeiger->y,zeiger->z);
printf("|---------------------------------------------------------|\n");zeiger=zeiger->next;
}
}/*Funktion zur Eingabe der Daten*/
void eingabe()
{
char nam[MAX];
double x,y,z;
printf("Punkt - nummer: ");
fgets(nam, MAX, stdin);
printf("X Y Z : ");
scanf("%lf %lf %lf",&x,&y,&z);
getchar();
anhaengen(nam,x,y,z);
}
int main()
{do{
printf("\n1 : Eingabe\n");
printf("2 : Ausgabe\n");
printf("3 : Punkt löschen\n");
printf("9 : Ende\n");
printf("Ihre Wahl : ");
scanf("%d",&wahl);
getchar();
switch(wahl)
{
case 1 : eingabe();
break;
case 2 : ausgabe();
break;
case 3 : printf("Punkt zum loeschen eingeben ");
fgets(dname, MAX, stdin);
loesche(strtok(dname, "\n"));
break;
case 9 : break;
default: printf("Falsche Eingabe!!!\n");
}
}while(wahl != 9);
return 0;
}Das geht auch.
Jetzt muss ich nur noch Dateiarbeit damit verbinden.
Habe auch schon den Code extra.#include <stdio.h>
#define input 20
#define enti "ENTITIES"
int main(int anzahl , char *argumente[] )
{char buf[input];
int i;
if ( argumente[1] == 0 )
{ printf("\nSo eingeben\n \? \n");
printf("Beispiel dxf2inp bild.dxf ausgabe.inp 444 555 666 777 888 999\n");
printf("\n444 = Startwinkel.\n");
printf("555 in soviel schritten wird gedreht.\n");
printf("666 der endwinkel Endwinkel.\n");
printf("777 um soviel wird in x richtung verschoben.\n");
printf("888 um soviel wird in y richtung verschoben.\n");
printf("999 um soviel wird in z richtung verschoben.\n");}
else/* spaeter mal entfernen --------------------------------------------*/
for ( i=1; i < anzahl;i++)
printf("%d %s ", i, argumente[i]);/* bis hier her unwichtig -------------------------------------------*/
/* Input Datei oeffnen */
FILE *datei_ptr;
char *name=argumente[1];datei_ptr=fopen(name,"r");
if (datei_ptr==NULL)
{
printf("FEHLER BEI OEFFNEN DER DATEI %s\n",name);
printf("(DATEI GGF. NICHT VORHANDEN) \n");
return(-1);
}else
{
printf("datei erfolgreich geoeffnet %s\n",name);/* Input Datei geoeffnet */
/* Output Datei oeffnen */
FILE *datei_pt;
char *nam=argumente[2];
char c,a=0,f;
char *swort[]={"ENTITIES","VERTEX"};
int swortm;datei_pt=fopen(nam,"w");
if (datei_pt==NULL)
{
printf("FEHLER BEI OEFFNEN DER DATEI %s\n",nam);
printf("(DATEI GGF. NICHT VORHANDEN) \n");
return(-2);
}else
{ /*Output Datei geoeffnet*/
printf("datei erfolgreich geoeffnet %s\n",nam);/*---------------- hauptteil ------------*/
while((c=fgetc(datei_ptr))!=EOF)
/* schleife gehts so lange bis EOF erreicht ist */
{
fscanf(datei_ptr,"%s",buf);while (0<fscanf(datei_ptr,"%s",buf)==0){
for (i=0;i<(int)strlen(buf);i++){
if (buf[i]>96 && buf[i]< 126)
buf[i]-=32;
}
f=-1;for (i=0;i<swortm;i++){
if (strcmp(swort[i],buf)==0) f=i;
}switch (f)
{ case 0:printf("%s\n",buf);
break;case 1: printf("%s\n",buf);
break;default: printf("nix");
break;}
}}
ende:
fclose(datei_pt);
return(-1);
}
fclose(datei_ptr);
return(0);
}
}und nun brauche ich nur noch die schlusselwort abfrage. Nur das ist noch ein Problem.
Wenn jemand einen schnellen oder besseren weg kennt, ich bin ganz Ohr.
Also PAD, jetzt weisst, du, was ich machen muss. Kannst du mir Helfen?
-
Prinzipiell könnte ich helfen.
Aber zumindest muß ich dazu eine lesbare Version des Codes haben. Hier im Forum gibt es TAGSSchließe deinen Code in in die c/c++ Code Tags ein und formatiere ihn vernünftig.
Und bevor du ihn postest, bitte compiliere ihn durch so daß er fehlerferei compiliert.
Falls dabei Fehler auftreten, hilft man hier ebenfalls.Wenn diese Voraussetzungen gegeben sind helfe ich gerne.
-
Du meinst sicher die Symbole wie Java oder Code oder die Smilies.
Da gibts aber ein Problem, da ich an einer Sun-Workstation sitzen und nur Netscape zur verfuegung habe, gibts da ein paar unerwuenschte Nebeneffekte.
Ich brauche nur ein Symbol anklicken und mein ganzer Text, den ich geschrieben habe, ist einfach weg !!!Und nun weiss ich nicht weiter.
Soll ich dir die Datein per Email schicken ?
-
Schreib einfach vor den Code "[ c p p ]"
und nach dem Code "[ / c p p ]"
abr lass bitte bei den beiden Tags die Leerzeichen weg wenn du sie schreibst, Ich mußte sie einfügen damit er sie nicht interpretiert
Ein Vorschlag wäre editiere dein Code und ergänze ihn um diese beiden TagsDa bei dir Probleme an der Technik liegen. Entschuldigung für die deutlichen Worte.
-
Der erste Teil sieht insgesammt vernünftig aus. Ich habe ein paar kleinigkeitn korrigiert.
z.B. Bevor n in die Struktur kopiert wird wird die Länge sicher auf 20 zeichen gekürztBei den Abfragen habe ich die Konstanten teile nach vorne genommen (hoffentlich alle) damit
Schreibfehler vom Compiler erkannt werden und nicht irgendwelche Seiteneffekt auftreten
Es ist besser zu schreiben if (NULL==peter) als if (peter==NULL) falls man sich verschreibt
wird im zweiten Falle aus dem Vergleich eine zuläössige Zuweisung im ersten Falle eine Fehlermeldung
des Compilers, das er einer Konstanten nicht zuweisen kannHinzugekommen ist ein besseres Fehlerhandling bei malloc Fehlern.
Ich bin aber noch damit beschäftigt.
-
Die Reaktion im Hauptprogramm auf Fehler in eingabe must du noch definieren, sinnvoll wäre z.B. abbau der listen und verlassend des Programms.
Hier nun die zwei SourceCodes
Teil 1 File scannen. Was du machen willst wenn du eins deiner Code Wörter gefunden hast, weis ich nicht, beschreibs mal
Habe die Commandlienparameter auf die de facto Standardnamen umgeändert, das Programm ist dann für andere leichter zu lesen.
durch die returns bei fehlern, habe die Schachtelungstiefe reduziert, dadurch wird das programm lesbarer
Ein Konstructif (a!=b) { printf ("Mist\n") return (1); } ist IMHO besser zu handeln als if (a!=b) { printf ("Mist\n") } else { // Tu irgendwas, spezielle wenn es mehrere Ebenen gibt }
#include <stdio.h> #define input 129 void help(void) { printf("\nSo eingeben\n \? \n"); printf("Beispiel dxf2inp bild.dxf ausgabe.inp 444 555 666 777 888 999\n"); printf("\n444 = Startwinkel.\n"); printf("555 in soviel schritten wird gedreht.\n"); printf("666 der endwinkel Endwinkel.\n"); printf("777 um soviel wird in x richtung verschoben.\n"); printf("888 um soviel wird in y richtung verschoben.\n"); printf("999 um soviel wird in z richtung verschoben.\n"); } int main(int argc, char *argv[ ]) { char buf[input]; FILE *In_datei_ptr; FILE *Out_datei_ptr; char line[128+1]; int i; char a=0,f; char *swort[]={{"ENTITIES"},{"VERTEX"}}; int swortm=2; if (9 != argc) /* argc enthält die Anzahl der Argumente argv[0] ist der programmname dehalb 9*/ { help(); return(1); } /* spaeter mal entfernen --------------------------------------------*/ for ( i=1; i < argc;i++) printf("%d %s ", i, argv[i]); /* bis hier her unwichtig -------------------------------------------*/ /* Input Datei oeffnen */ if (!(In_datei_ptr = fopen(argv[1], "r"))) /* Öffnen mit dem auf der Kommandozeile angegebenen Namen */ { printf("FEHLER BEI OEFFNEN DER INPUT DATEI %s\n",argv[1]); printf("(DATEI GGF. NICHT VORHANDEN) \n\n"); help(); return (2); } printf("Input datei erfolgreich geoeffnet %s\n",argv[1]); /* Output Datei oeffnen */ if (!( Out_datei_ptr = fopen(argv[2], "w") ) ) /* Öffnen mit dem auf der Kommandozeile angegebenen Namen */ { printf("FEHLER BEI OEFFNEN DER OUTPUT DATEI %s\n",argv[2]); printf("(DATEI GGF. NICHT VORHANDEN) \n\n"); help(); return (3); } printf("Output datei erfolgreich geoeffnet %s\n",argv[2]); /* File verarbeiten */ while (NULL!=fgets(line,128,In_datei_ptr)) /* lese Datei bis zum Ende */ { // Bearbeiten der Datei f=-1; for (i=0;i<swortm;i++) { if (0==(_strnicmp(swort[i],buf,strlen(swort[i])))) /* Es wird nur bis zur Länge des SwortEintrags getestet*/ { f=i; break; // bricht die Suche ab sobald gefunden } } switch (f) { case 0: printf("%s\n",buf); break; case 1: printf("%s\n",buf); break; default: printf("nix"); } }; /* Clean Up*/ fclose(In_datei_ptr); fclose(Out_datei_ptr); return(0); }
Teil 2 Hauptprogramm
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 20 struct punkt { char name[MAX]; double x; double y; double z; struct punkt *next;}; struct punkt *next = NULL; struct punkt *anfang=NULL; /*Wir hängen einen Datensatz an oder geben einen neuen ein n=name,x=x-koordinate,y=y-koordinate,z=z-koordinate*/ int anhaengen(char n[],double x,double y,double z) { /* Zeiger zum Zugriff auf die einzelnen Elemente der Struktur*/ struct punkt *zeiger; /* Wir fragen ab, ob es schon ein Element in der Liste gibt. Wir suchen das Element, auf das unser Zeiger *anfang zeigt. Falls *anfang immer noch auf NULL zeigt, bekommt *anfang die Adresse unseres 1. Elements und ist somit der Kopf (Anfang) unserer Liste*/ if(NULL == anfang) { /* Wir reservieren Speicherplatz für unsere Struktur für das erste Element der Liste*/ if(NULL==(anfang =(struct punkt *) malloc(sizeof(struct punkt)))) { fprintf(stderr,"Kein Speicherplatz vorhanden für anfang\n"); return (1); //Fehler } n[MAX-1]=0x00; strcpy(anfang->name,strtok(n,"\n")); anfang->x=x; anfang->y=y; anfang->z=z; /* Somit haben wir unseren Anfang der Liste. Von nun an zeigt der Zeiger anfang immer auf das Element vor ihm. Da dies aber jetzt das 1. Element der Liste war, zeigt der Zeiger anfang auf den Zeiger next. next zeigt am Ende immer wieder NULL*/ anfang->next=NULL; } /*Es scheint schon mindestens ein Element in der Liste vorhanden zu sein, da der Anfang nicht == NULL ist. Jetzt suchen wir so lange nach dem nächsten Element, bis der *next-Zeiger auf NULL zeigt. Somit haben wir das Ende der Liste gefunden und können einen neuen Datensatz anhängen*/ else { zeiger=anfang; /*Wir zeigen auf das 1. Element*/ while(NULL != zeiger->next) zeiger=zeiger->next; /*Wir reservieren einen Speicherplatz für das letzte Element der Liste und hängen es an.*/ if(NULL==(zeiger->next =(struct punkt *) malloc(sizeof(struct punkt)))) { fprintf(stderr,"Kein Speicherplatz für aktuellesElement\n"); /*Fehlerhandling */ return (2); //Fehler } zeiger=zeiger->next; /*zeiger auf neuen Speicherplatz*/ n[MAX-1]=0x00; strcpy(zeiger->name,strtok(n, "\n")); zeiger->x=x; zeiger->y=y; zeiger->z=z; zeiger->next=NULL; } return 0; } /*Funktion zum Löschen einer Datei*/ void loesche(char *wen) { struct punkt *zeiger ,*zeiger1; /*Ist überhaupt ein Element vorhanden?*/ if(NULL != anfang ) { /*Ist unser 1. Element das von uns gesuchte (wen[])?*/ if(0==strcmp(anfang->name,wen)) { zeiger=anfang->next; free(anfang); anfang=zeiger; } else { /*Es ist nicht das 1. Element zu löschen.Wir suchen in der weiteren Kette, ob das zu löschende Element vorhanden ist*/ zeiger=anfang; while(zeiger->next != NULL) { zeiger1=zeiger->next; /*Ist die Adresse von zeiger1 der gesuchte Name?*/ if(strcmp(zeiger1->name,wen) == 0) { /*Falls ja dann.....*/ zeiger->next=zeiger1->next; free(zeiger1); break; } zeiger=zeiger1; }/*Ende while*/ } /*Ende else*/ } /*Ende if(anfang != NULL)*/ else printf("Es sind keine Daten zum Löschen vorhanden!!!\n"); } /*Funktion zum Ausgeben der Dateien*/ void ausgabe() { struct punkt *zeiger; zeiger=anfang; printf("||=======================================================||\n"); printf("|%10cName%10c | x | y | z |\n",' ',' '); printf("||=======================================================||\n"); while(zeiger != NULL) { printf("|%12s| %10.6lf | %10.6lf | %10.6lf |\n",zeiger->name,zeiger->x,zeiger->y,zeiger->z); /* Formatierung damit die Spalten übereinander stehen */ printf("|---------------------------------------------------------|\n"); zeiger=zeiger->next; } } /*Funktion zur Eingabe der Daten*/ void eingabe() { char nam[MAX]; double x,y,z; printf("Punkt - nummer: "); fgets(nam, MAX, stdin); printf("X Y Z : "); scanf("%lf %lf %lf",&x,&y,&z); getchar(); anhaengen(nam,x,y,z); } int main() { char wahl=0; char dname[128+1]; do{ printf("\n1 : Eingabe\n"); printf("2 : Ausgabe\n"); printf("3 : Punkt löschen\n"); printf("9 : Ende\n"); printf("Ihre Wahl : "); scanf("%d",&wahl); getchar(); switch(wahl) { case 1 : if (0!=eingabe()) { /*Fehlerhandling*/ } break; case 2 : ausgabe(); break; case 3 : printf("Punkt zum loeschen eingeben "); fgets(dname, MAX, stdin); loesche(strtok(dname, "\n")); break; case 9 : break; default: printf("Falsche Eingabe!!!\n"); } } while(wahl != 9); return 0; }
-
Danke fuer die schnelle Antwort.
Also, ich hatte das so vor.
Ich lese die Datei ein. Dazu steht das hauptprogramm ja langsam. Ich wollte einfach eine kurze Struktur schreiben und die dann nur aufrufen.
Dann suchen ich nach den worten, die ich brauche. Hier eine uebersicht.0
SECTION
2
ENTITIES Das wort ist wichtig, denn alle Punkte folgen
0 erst danach.
INSERT
...
...
...
8
UNIT_DISC Das Wort muss ich finden. Es bestimmt, in
welcher Ebene der Punkt liegt. Dazu kommt,
dass das Wort anders sein kann. Aber zum
Glueck gibts eine Zeile hoeher die 8 !!!
Die gibts immer und muss davor stehen.
10 <-- Sagt das danach der X-Punkt kommt
187.960000 <-- ist der punkt
20 <-- Sagt das danach der Y-Punkt kommt
187.960000 <-- ist der punktUnd eigentlich muss noch ein Z-Punkt noch kommen. den muss ich aber dann spaeter im Programm mit eine ARG von INT MAIN einfuegen. oder mit einer Printf und scanf eingabe. das weiss ich noch nicht genau, was besser ist.
Das Problem ist, das ich auch steichern muss, wie die Reihenfolge der Punkte ist. Denn du weisst ja, das normaler weisse eine Linie aus zwei Punkten besteht. Doch wenn es ich zwei Punkte eingelesen habe und bis die DIE ABFRAGE NACH ..
ENQEND .. kommt ( Ist das schluesselwort, das die punkte zwischen SECTION und ENQEND alle zusammen gehoeren. ) Die Reichenfolge ist billig, erster Punkt -> Start-punkt, zweiter punkt -> Linie zwischen eins und zwei, dritter punkt
-> Linie zwischen zwei und drei usw. Es kann leicht sein, da da 5 Punkte zusammen kommen.
Und dann kommt wieder eine neue SECTION.
Und der Spass geht von vorn los.
Ich muss spaeter auch noch die Punkte vergleichen, ob es da gleiche Punkte gibt. Das hat den Grund, da ich ja die Punkte in eine andere Dateischreiben muss und die Datei in einem anderen Programm weiter verarbeitet wird.
Dies braucht die Verbindung, wenn Punkte gleich sind.Ich hoffe das reicht als Erklaerung.
PS. Es tut mir leid.
ich bekomme das mit der Formatierung nicht hin. Er loescht mir immer wieder den Text. du musst da leider durch.
-
Mit deiner Information über Entities würde ich das programm wie folgt modifizieren
/* File Kopf verarbeiten */ flag=0; while (NULL!=fgets(line,128,In_datei_ptr)) /* lese Datei bis zum Ende */ { // Suchen des realen Anfangs if (0==(_strnicmp("ENTITIES",buf,8))) { flag=1; break; // bricht die Suche ab sobald gefunden } } if (0==flag) { /*errorhandling*/} printf("Ungültiges Datenfile ENTITEIES nicht gefunden") return(1); }
Diese Gruppe würde ich unmittelbar vor dem while einschieben.
Ich habe jetz noch ein paar Vermutungen zu dem Datenformat, bitte bestätige diese.ein Datensatz in diesem File besteht aus zwei Zeilen
-die erste Zeile ist eine Kennziffer.
-die zweite Zeile ist eine Information.Beispiel 1
Kennziffer: 2 Information: Typus Typ String Besispiel ENTITIES
Kennziffer: 8 Information: Name Typ String Besispiel UNIT_DISC
Kennziffer: 10 Information: X-Koordinate Typ double Beispiel 1.234
Kennziffer: 20 Information: Y-Koordinate Typ double Beispiel 1.234
Kennziffer: ?? Information: Z-Koordinate Typ double Beispiel 1.234 /* In diesem Datenfile nicht vorhanden.ein Datenrecord in diesem File besteht aus mehreren Datensätzen.
Beispiel
Satz 1: Kennziffer 2 Data: UNIT_DISC
Satz 2: Kennziffer 10 Data: 187.9600000 Punkt
Satz 3: Kennziffer 20 Data: 157.4800000 PunktFalls ich Recht haben sollte bring bitte eine Aufstellung von Datenrecords die wir bearbeiten müssen.
Ich würde dann gerne die zweite while Schleife abändern in dem wir den Begin eines Datenrecords suchen.
und dann diesen bearbeiten. Da wir das dann separaten in C-funktionen machen Wird das programm übersichtlich.Bitte überlege ob mir noch andere Informationen fehlen könnten.
Langsam wird interssant
P.S. Trage deine email Adresse in dein Profil ein. Du kannst dann angemailt werden, die email-Adresse ist dabei glücklicherweise nicht sichtbar. Ich bin ab Sonntag morgen für 1 Woche nicht erreichbar.
-
Hier mein Vorschlag, falls meine Annahmen richtig sind. (Da wir uns für eine Woche nicht sprechen können)
Wir definieren eine Funktion die einen Datensatz liest
int GetDatenSatz(int *Kennziffer,char *Data, int LineLen, FILE *file) { if (NULL==fgets(Data,128,In_datei_ptr)) return NULL; // Datei zu Énde *Kennziffer=atoi(Data); if (NULL==fgets(Data,128,In_datei_ptr)) return NULL; // Hier könnte eine Fehlerbehandlung sinnvoll sein kennziffer gefuden aber keine Datem return 1; }
Die Funktion hat dieselbe Logik wie fgets, so das wir sie im while auf dieselbe Art nutzen können (meine normalen return werte sind
0 OK, !=0 Fehler).
Sie liefert aber sowohl die Kennziffer als auch die Daten aus der nächsten Zeile als String.Die while Schleife im Hauptprogramm ändert sich dann wie folgt:
int Kennziffer; // Speicher für die Kennziffer mit der das switch arbeitet double Value; // Beispielvariable hier sollte die Zuweisung an die richtige Stelle erfolgen while (NULL!=GetDatenSatzt(&Kennziffer,line,128,In_datei_ptr)) /* lese Datei bis zum Ende */ { // Bearbeiten der Datei switch (Kennziffer) // Bearbeiten der Kennziffer hier sollten alle bekannten Kennziffern bearbeitet werden { // Schechte Schreibweise, besser 1 Statement pro Zeile beginned in der nächsten Zeile nach case (Spart hier aber Platz) case 2: printf("%s\n",line); break; case 8: printf("%s\n",line); break; case 10: value=atof(line); break; case 20: value=atof(line); break; default: printf("unknowm Kennziffer"); } };// End while // Man sollte vielleicht überlegen das atof durch strtod zu ersetzen, wegen der möglichen Fehlererkennung
Viel Erfolg
-
Hallo PAD,
wenn du wieder da bist, schreib ich wieder.
Ich habe auch den Teil zum einlesen geaendert. Bisher geht es beinahne richtig.
Ein paar kleine Fehler muss ich noch aendern.
Ach so und schreib mir am besten eine Email, damit ich dir die vollstaendigen Dateien schicken kann.
-
Hi I'm back again. Eine Woche Märkische Heide hat richtig Spaß gemacht.
-
Na das ist doch schön, das du wieder da bist.
Ich habe dir letzte Woche eine Email geschrieben.
Du hast bis jetzt nicht geantwortet.
Ich habe weitergearbeitet und bin auf viele LustigeProbleme gestoßen.
Alles andere morgen, auf ArbeitBis dann
Schönes Wochenende
-
Kann erst am 20. meine Mail bearbeiten, weil sie leider an meinen Büroaccount gingen
-
Ich habe eine Gleichung
(x-c)^2 + (y-d)^2 = r^2
und
(x_eins -c)^2 +(y_eins-d)^2 =r^2
ich habe alles ausser c und d
und die muss ich ausrechnen.
Wie kann ich das per C programmieren?