atof und strings zerlegen...
-
ok muss
adresse=strstr(deinstring_1, 'D');
heissen
-
@u: Nein: Entweder
strstr(deinstring_1,"D")
(sucht nach einer Zeichenkette) oderstrchr(deinstring_1,'D')
(sucht nach einem einzelnen Zeichen).@McKris: Du kannst auch strtod() verwenden, der liefert dir zusätzlich einen Zeiger auf das erste Zeichen, das er nicht mehr lesen konnte (also das 'D').
(oder du ersetzt das 'D' durch ein 'E' - dann erkennt atof() es auch als Exponent-Kennung an)
-
Hallo läuft die Steuerung nur über G-codes?
das heißt wenn ich einen string an die steuerung übermittel z.b.G80
fürt diese dann den aus ???
gruß
tim
-
Erstmal: Danke für die Resonanz...
HALT. Falscher Ansatz.
Es ist nicht (kaum) vorhersehbar, ob in dem String ein D vorhanden ist oder nicht. Das regelt die Programmiersoftware in Verbindung mit dem was der NC-Programmierer will.Grundsätzlich möchte ich jeden Wert auf diese Weise auslesen können.
mein Ansatz:
ich möchte den Wert hinter dem X auslesen, dazu brauche ich die Position vom X:
//X ptr_quelle=strstr(kopie_zeile,"X");//gibt pointer oder NULL-p. zurueck if(ptr_quelle!=0) {//habe string gefunden :-) ptr_quelle=ptr_quelle+strlen("X");//hinter gefundenem String pos pos=ptr_quelle - kopie_zeile ; //errechne pointerpos
also: ich weiß jetzt ab wo ich lesen kann.
Aber: das Problem liegt hier:if( (kopie_zeile[pos] == '.') || (kopie_zeile[pos] == '-') ||\ ( (kopie_zeile[pos] >= '0')&&(kopie_zeile[pos] <= '9') ) ) { dX_Start = atof(ptr_quelle); if(debug) printf("dX_Start=%.3f\n",dX_Start); }
Das funktioniert also nicht.
=> Wie bekomme ich alle Zeichen, die zu meiner Zahl gehören in einen extra
String, bzw. wie bekomme ich atof dazu, aus diesem neuen String zu lesen???THX
Krishna
-
@Tim:
Ja, die Maschine führt alles (sofort) aus was Du ihr sagst.
Angenommen Du sagst ihr G80, dann führt sie das (sofort) aus.
Hier in dem Fall wird das komplette programm in ein TXT-File geschrieben, welches die Maschine von Anfang bis Ende liest.Warum?
-
@CStoll:
Das ist es ja eben...
atof liest das D mit und interprtiert es als Exponent.
Außerdem weiß ich nicht, ob tatsächlich ein D in dem String vorkommt, hier war es eben Zufall.Es könnte genausogut ein Y sein...
-
#include <stdio.h> #include <ctype.h> double get_X_value (char *in) { // Suche nach dem X while (*in) { // X gefunden? if (*in++ == 'X') { // Sind 32 Zeichen genug? char string[32]; double value; char *p = string; // Extrahiere die zahl nach dem X // bis keine Ziffer mehr kommt while (isdigit (*in) || *in == '.') *p++ = *in++; // Wandle die Ziffern in einen double-Wert um // und gebe diesen dann zurück an den Aufrufer *p = 0; sscanf (string, "%lf", &value); return value; } } // Nichts gefunden? return 0.0; } int main() { printf ("%lf\n", get_X_value ("N72G41X34.876D600")); }
-
Dankeschööön!
Hab die Funktion noch nicht ganz durchschaut...
...die Zeiger sind's...Muß mir das noch in Ruhe zu Gemüte führen...
Nochmals Danke
Krishna
-
Hallo,
...irgendwie funktioniert's nicht...Der Compiler (Dev-C++ 4.9.9.2) meckert:
8 K:\Krishna\prog\test\string_to_double.c conflicting types for 'string_to_double'
44 K:\Krishna\prog\test\tausche_Werte_G2_G3.c previous implicit declaration of 'string_to_double' was here
kann jemand was damit anfangen?
in der Funktion selbst klappts, aber wenn ich die Funktion aus einem anderen Programm aufrufe nicht.mein Aufruf aus dem Programm:
dJ = string_to_double(kopie_zeile,"J");
dJ ist vom Typ double
in kopie_zeile ist eine Zeichenkette gespeichert: z.B.N63G41X-3.065F200D600//usage: string_to_double(ganzer_string, suchstring) #include <stdio.h> #include <ctype.h> double string_to_double(char *in, char *suchstring) { char *ptr_quelle; int pos=0 , i=0; char string[32]; //es kann eine Zahl mit 32 stellen ausgelesen werden char *p = string; double value; ptr_quelle=strstr(in, suchstring); if(ptr_quelle!=0) {//habe string gefunden :-) //pos hinter gefundenem String ptr_quelle=ptr_quelle+strlen(suchstring); //blende Leerzeichen aus while (*ptr_quelle == ' ') *ptr_quelle++; // Extrahiere die zahl nach dem suchstring // bis keine Ziffer mehr kommt while (isdigit (*ptr_quelle) || *ptr_quelle == '.'\ || *ptr_quelle == '+'|| *ptr_quelle == '-') //kopiere chars nach string *p++ = *ptr_quelle++; // Wandle string in einen double-Wert um // und gebe diesen dann zurück an den Aufrufer sscanf (string, "%lf", &value); return value; } // Nichts gefunden? return 0.0; } /* int main() { FILE *pfile_src; char orig_zeile[80], kopie_zeile[80]; double d=0.0; //oeffne Quelldatei zum Lesen pfile_src = fopen("str_d600.tap","r"); if (!pfile_src) { printf("konnte %s nicht oeffnen!!!\n","d600.tap"); printf("Programm wird beendet\n"); system("PAUSE"); exit(0); } fgets(orig_zeile,80,pfile_src); //lese neue Zeile strcpy(kopie_zeile,orig_zeile); //Originalzeile sichern //printf ("%.3lf\n", string_to_double("N72G41ZI+334.991D600","X")); printf ("%.3lf\n", string_to_double(kopie_zeile,"X")); d= string_to_float(kopie_zeile,"X"); printf("%.3lf\n",d); system("Pause"); } */
Wo liegt mein Problem?
Danke Euch
Krishna
-
Wenn der C-Compiler über eine Funktion stolpert, die er nicht kennt, nimmt er an, daß das eine int-Funktion mit beliebigen Parametern ist - und das passt in deinem Fall nicht zu der Definition "double string_to_double(...)". Also mußt du, bevor du die Funktion verwenden willst, einen korrekten Prototyp angeben (am besten in einen Header, den sowohl die "string_to_double.c" als auch das Hauptprogramm einbinden).
-
das sieht dann so aus, oder?
double string_to_double(char *in, char *suchstring);--> ergibt die gleiche Meldung
-
Ja, so wäre es richtig - jetzt mußt du nur noch dafür sorgen, daß diese Zeile an der richtigen Stelle landet (vor die main()-Funktion).
-
Ja...
Hatte einen Fehler eingebaut...
Jetzt gehtsDANKE!
---> Übrigens: Ein frohes neues Jahr alle!
-
Hallo!
Dankeschön Euch allen!
Hier ist mal meine Lösung:
(Vielleicht kann's mal einer nutzen...)//usage: string_to_double(ganzer_string, suchstring) #include <stdio.h> #include <ctype.h> #include "header.h" //double string_to_double(char *in, char *suchstring); double string_to_double(char *in, char *suchstring) { char *ptr_quelle; int pos=0 , i=0; char string[32]; //es kann eine Zahl mit 32 stellen ausgelesen werden char *p = string; double value; ptr_quelle=strstr(in, suchstring); if(ptr_quelle!=0) {//habe string gefunden :-) //pos hinter gefundenem String ptr_quelle=ptr_quelle+strlen(suchstring); //blende Leerzeichen aus while (*ptr_quelle == ' ') *ptr_quelle++; // Extrahiere die zahl nach dem suchstring // bis keine Ziffer mehr kommt while (isdigit (*ptr_quelle) || *ptr_quelle == '.'\ || *ptr_quelle == '+'|| *ptr_quelle == '-') //kopiere chars nach string *p++ = *ptr_quelle++; // Wandle string in einen double-Wert um // und gebe diesen dann zurück an den Aufrufer sscanf (string, "%lf", &value); return value; } // Nichts gefunden? return 0.0; } /* int main() { FILE *pfile_src; char orig_zeile[80], kopie_zeile[80]; double d=0.0; //oeffne Quelldatei zum Lesen pfile_src = fopen("str_d600.tap","r"); if (!pfile_src) { printf("konnte %s nicht oeffnen!!!\n","d600.tap"); printf("Programm wird beendet\n"); system("PAUSE"); exit(0); } fgets(orig_zeile,80,pfile_src); //lese neue Zeile strcpy(kopie_zeile,orig_zeile); //Originalzeile sichern //printf ("%.3lf\n", string_to_double("N72G41ZI+334.991D600","X")); printf ("%.3lf\n", string_to_double(kopie_zeile,"X")); d= string_to_float(kopie_zeile,"X"); printf("%.3lf\n",d); system("Pause"); } */
Bis demnächst
Krishna