atof und strings zerlegen...



  • @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 gehts

    DANKE!
    ---> Ü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


Anmelden zum Antworten