direkte Übergabe in struct
-
DirkB schrieb:
Da fehlt der Adressoperator. Du hast schließlich Zeiger in deiner Funktion.
Read_NODE(Copy, &Grid[(*AnzGrid)].ID, &Grid[(*AnzGrid)].XYZ[0], &Grid[(*AnzGrid)].XYZ[1], &Grid[(*AnzGrid)].XYZ[2], 1);
Bei deinem kopieren ins Entry fehlt jedesmal die '\0' am Ende.
Dasstrcpy(Entry,"\0");
schreibt nur die '\0' an die erste Stelle.
Ist also wieEntry[0] = 0;
Sind die vier Zahlen ohne Trennzeichenin dem String (Line)?
Hmmm, war wahrscheinlich zu einfach für mich
Und ja, der Input ist spaltenorientiert, d.h. es kann vorkommen, daß es kein Trennzeichen zwischen den einträgen gibt.
-
DirkB schrieb:
Wird bei der Initialisierung mit Stringlitralen der nicht angegebene Bereich mit '\0' beschrieben?
Wird hier
char Entry[17] = "";
das ganze Array auf 0 gesetzt?
Oder nur bei
char Entry[17] = { 0 };
?
Arrays werden doch immer mit 0 initialisiert. Oder?
Beichar x[20]=""/*(0 oder '\0')*/
weißt du halt explizit das erste Byte auf 0. Und alles andere ist halt implizit 0.
-
Ah nee, ist Blödsinn. Nur bei globalen und statischen Arrays (letztere in Funktionen). Völliger Schwachsinn. Hatte ich falsch in Erinnerung. Und
x=""
ist äquivalent zux={0}
.#include <stdio.h> int main(void) { char x[10]="";/*{0}*/ int i; for(i=0;i<10;i++) { printf("%i\n",x[i]); } return 0; }
Kann aber auch am Compiler liegen, weil schon eine Zuweisung von "foo" die restlichen Elemente 0 setzt.
-
OkkaPapa schrieb:
Und ja, der Input ist spaltenorientiert, d.h. es kann vorkommen, daß es kein Trennzeichen zwischen den einträgen gibt.
Geht auch mit sscanf:
int Read_NODE( char* Line, int* ID, double* X, double* Y, double* Z, int Debug ){ int err = 4; err -= sscanf(Line+9, "%8i", ID); err -= sscanf(Line+17, "%16lf", X); err -= sscanf(Line+33, "%16lf", Y); err -= sscanf(Line+49, "%16lf", Z); return err // 0 im Erfolgsfall sonst Fehler; }
-
DirkB schrieb:
OkkaPapa schrieb:
Und ja, der Input ist spaltenorientiert, d.h. es kann vorkommen, daß es kein Trennzeichen zwischen den einträgen gibt.
Geht auch mit sscanf:
int Read_NODE( char* Line, int* ID, double* X, double* Y, double* Z, int Debug ){ int err = 4; err -= sscanf(Line+9, "%8i", ID); err -= sscanf(Line+17, "%16lf", X); err -= sscanf(Line+33, "%16lf", Y); err -= sscanf(Line+49, "%16lf", Z); return err // 0 im Erfolgsfall sonst Fehler; }
... und ist viiiiieeeeeell eleganter! Thanx!
-
Noch ne Frage dazu: wie mache ich das, wenn ich strings übergeben will?
Bsp.:
typedef struct{ int ID; int Include; int Module; char Type[9]; int MatID; } Type_Part; Type_Part* Part;
void Read_PART( char* Line, int* ID, char* Type, int* MechMatID ){ int Error=3; Error -= sscanf(Line+9, "%8i" , ID ); Error -= sscanf(Line+17, "%8s" , Type); Error -= sscanf(Line+25, "%8i" , MechMatID ); if (Error != 0) printf("Error %i in %s\n Line: %s\n", Error,__FUNCTION__,Line); return; }
Read_PART(Line, &Part[(*AnzPart)].ID, &Part[(*AnzPart)].Type, &Part[(*AnzPart)].MatID );
Der Compiler "sagt" expected »char « but argument is of type »char ()[9]«
Ciao
OkkaPapa
-
Read_PART(Line, &Part[(*AnzPart)].ID, Part[(*AnzPart)].Type, &Part[(*AnzPart)].MatID );
-
Wutz schrieb:
Read_PART(Line, &Part[(*AnzPart)].ID, Part[(*AnzPart)].Type, &Part[(*AnzPart)].MatID );
Ich muß mal ein WE in pointer investieren... auf youtube soll es ja was dazu geben...
Danke und Schönes WE!
-
OkkaPapa schrieb:
void Read_PART(
Du solltest der rufenden Funktion auch die Chance geben, auf den Fehler zu reagieren.
Sei es durch eine Meldung, verwerfen der Daten oder Programmende.Mit void als Rückgabetyp klappt das aber nicht.
Im Augenblick hast du eine Textausgabe (die wohl nicht gelesen wird) und arbeitest mit fehlerhaften Daten weiter.
-
OkkaPapa schrieb:
Ich muß mal ein WE in pointer investieren...
Du hast da aber ein Array.
Ok, in diesem Fall macht es beim Funktionsaufruf keinen Unterschied.
Trotzdem sind Pointer und Arrays verschiedene Sachen.
-
DirkB schrieb:
OkkaPapa schrieb:
Und ja, der Input ist spaltenorientiert, d.h. es kann vorkommen, daß es kein Trennzeichen zwischen den einträgen gibt.
Geht auch mit sscanf:
int Read_NODE( char* Line, int* ID, double* X, double* Y, double* Z, int Debug ){ int err = 4; err -= sscanf(Line+9, "%8i", ID); err -= sscanf(Line+17, "%16lf", X); err -= sscanf(Line+33, "%16lf", Y); err -= sscanf(Line+49, "%16lf", Z); return err // 0 im Erfolgsfall sonst Fehler; }
Nun gibt es aber leider doch einen Fehler...
Die Zeile lautet
NODE / 5000497875.694688229174-707.84635224314 552.44729377789Die ID des Knotens ist laut "spaltenzählen" 5000497.
Meine Funktion mit oben liest aber 50004978 und schon gibts Probleme...auch mit
err -= sscanf(Line+8, "%8i", ID);
ist das Ergebnis identisch... wo habe ich den Knoten (im code)?
-
Dein Problem ist, dass du nicht richtig zählen kannst, der Compiler jedenfalls verzählt sich nie.
-
Wutz schrieb:
Dein Problem ist, dass du nicht richtig zählen kannst, der Compiler jedenfalls verzählt sich nie.
Weiterhelfen tut mir Dein Kommentar nicht... Das ich da falsch zähle weiß ich, aber wo zähl' ich falsch und warum?
Wie mans dreht und wendet: die ID ist eine max. 8stellige Integer-Zahl, die von der 9. bis zu 16. Spalte reicht, daher sollte i8 korrekt sein.
Zweite Fehlerquelle: Ich fange an der der falschen Stelle an zu zählen.
Daher habe ich mal folgendes gemacht:
printf("1234567812345678123456781234567812345678123456781234567812345678\n"); printf("< KEY >< ID >< X >< Y >< Z >\n"); printf("%s\n",Line); Error -= sscanf(Line+9, "%8i", ID); printf("ID 9 %i\n",(*ID)); Error -= sscanf(Line+8, "%8i", ID); printf("ID 8 %i\n",(*ID)); Error -= sscanf(Line+7, "%8i", ID); printf("ID 7 %i\n",(*ID));
... und das kommt raus:
1234567812345678123456781234567812345678123456781234567812345678 < KEY >< ID >< X >< Y >< Z > NODE / 5000506881.315141569998-708.93758905492546.939696295506 ID 9 50005068 ID 8 50005068 ID 7 50005068 1234567812345678123456781234567812345678123456781234567812345678 < KEY >< ID >< X >< Y >< Z > NODE / 5000507 875.7085 -709.828 543.9399 ID 9 5000507 ID 8 5000507 ID 7 5000507 1234567812345678123456781234567812345678123456781234567812345678 < KEY >< ID >< X >< Y >< Z > NODE / 5000508875.696021113641-710.03140979639541.451424039574 ID 9 50005088 ID 8 50005088 ID 7 50005088 1234567812345678123456781234567812345678123456781234567812345678 < KEY >< ID >< X >< Y >< Z > NODE / 5000509875.697204436492-711.94436679355541.817120829625 ID 9 50005098 ID 8 50005098 ID 7 50005098 1234567812345678123456781234567812345678123456781234567812345678 < KEY >< ID >< X >< Y >< Z > NODE / 5000510875.819979032197-711.56479395172 543.90863009065 ID 9 50005108 ID 8 50005108 ID 7 50005108
Egal, ob ich 7, 8 oder 9 auf Line addiere, die ID ist falsch, wenn kein Leerzeichen als Trenner drin ist.
Das peil' ich nicht, denn eigentlich sollte das so nicht seinHabe den alten Code rekativiert, der zählt korrekt und das Ergebnis stimmt...
-
**
Input white-space characters (as specified by the isspace function) are skipped, unless the specification includes a [, c, or n specifier.
**
-
Angesichts der Leerzeichen würde ich ganz stumpf chars einlesen.
#include <stdio.h> #include <string.h> #include <stdlib.h> const char *test[] = { "NODE / 5000506881.315141569998-708.93758905492546.939696295506", "NODE / 5000507 875.7085 -709.828 543.9399", "NODE / 5000508875.696021113641-710.03140979639541.451424039574", "NODE / 5000509875.697204436492-711.94436679355541.817120829625", "NODE / 5000510875.819979032197-711.56479395172 543.90863009065", "" }; int main(void){ const char **t=test; char id[9]={0}; char x[17]={0}, y[17]={0}, z[17]={0}; while(**t) { if(sscanf(*t, "%*8c%8c%16c%16c%16c", id, x, y, z)==4) printf("%d: (%.12f, %.12f, %.12f)\n", atoi(id), atof(x), atof(y), atof(z)); ++t; } }