Forum: Compiler & IDEs double-konvertierung von 2d Feld


von dom (Gast)


Lesenswert?

Hallo Leute!

Folgendes:

Schicke aus MATLAB einen String (mit RS232) an einen Mega32 in der Form: 
A1.23455"2.34565"3.45678"3.67988"9.34827"3.23478"Z.
Die Zahlen sind nur Beispiele, ihr seht es sollen also 6 double Werte 
interpretiert werden. 'A' und 'Z' fungieren als "Erkennungszeichen" 
(Anfang, Ende) das '"' dient als Trennungszeichen.

Unten also der Code (klappt alles) aber hier kurz das Problem (ohne 
Bezug zum Code) formuliert:

Ich habe ein 2d Feld z.B
1
char array[10][10].
ich möchte nun dieses in das Array
1
double werte[10]
 wandeln.

Hätte ich folgendes
1
char array = "1.23456"
 geht die problemlos mit
1
*tempPtr = array;
2
double wert;
3
wert = atof(tempPtr);

Aber wie mit einem [m]x[n] array ?

Nach langem Lesen und rumprobieren hab ich nichts gefunden, deshalb 
dacht ich, ich frag mal.....
Alternativ könnte ich im Code (in der Interrupt Funktion oder auch in 
Main) ein switch case Geschichte schreiben und jeden einzelnen double 
Wert dann in eine eingene Variable konvertieren, da ich aber in 
Anschluss noch ne Menge Code brauche möchte ich so speichersparsam wie 
möglich schreiben.
(Wie es einem Anfänger wie mir nur eben möglich ist) ;)

Also schon mal danke fürs anlesen und

viele Grüße !



Realisiert habe ich das folgendermaßen:

(stelle nur den für das Problem wesentlichen Code hinein...)

UDR RX Complete IR Funktion:
1
//Uart Empfang abgeschlossen. Interrupt Funktion. Wird jedes mal aufgerufen, wenn Zeichen empfangen....
2
ISR(USART_RXC_vect)
3
{
4
  //udr schützt/speichert den aktuellen Inhalt des Empfangsregisters UDR... 
5
  udr = UDR;
6
  puffer[i] = udr;
7
  i=i+1;
8
}

der Inhalt von puffer[i] wird in main dann folgendermaßen verarbeitet:
1
//Falls "Abschlusszeichen"
2
if(udr=='Z')
3
    {
4
      //...wird dies durch die entsprechenden LED signalisiert...
5
      PORTC=0b11111111;
6
      //...leeren des Empfangsregisters
7
      UDR = 0;
8
      //...Interrupts aus (nicht unterbrechen !)
9
      cli();
10
      //...bis ende des Empfangspuffers puffer erreicht..
11
      for(j=0;j<i;j++)
12
      {        
13
        //Zwischenspeichern..
14
        buffer=puffer[j];      
15
        char_senden(buffer);
16
        //...und das entsprechende Zeichen senden
17
      }
18
      o=l=m=n=0;
19
      //puffer durchzählen...
20
      for(j=0;j<i;j++)
21
      {
22
        //zwischenspeichern...
23
        buffer=puffer[j];
24
        //falls eine Zahl oder Punkt in die entsprechende Zeile packen        
25
        if ( isdigit(buffer)|| (buffer == '.'))
26
        {
27
          val_puffer[o][l] = buffer;
28
          l = l+1;
29
                
30
        }
31
        //falls "Trennungszeichen" (") nächste Zeile im Feld
32
        if (buffer == '"')
33
        {
34
          //hier der Knackpunkt...
35
          //ich kann die erste "Zeile" des Arrays konvertieren, bei den weiteren scheitert es...
36
          const char *tempPtr = double_puffer;
37
          //konvertierung in double...
38
39
          val[o] = atof(tempPtr);
40
          o=o+1;
41
          k=l+1;
42
          l=0;
43
        }      
44
      }
45
      j=0;
46
      //Zum debuggen: Inhalt von val_puffer[][] ausgeben zum Überprüfen..
47
      //Das hie ist UNWESENTLICH
48
      chars_senden("####");      
49
      for(m=0;m<o;m++)
50
      {
51
        for(n=0;n<k;n++)
52
        {
53
          char_senden('{');
54
          int_senden(m);
55
          char_senden(';');
56
          int_senden(n);
57
          char_senden('}');
58
          buffer = val_puffer[m][n];
59
          char_senden(buffer);                 
60
        }          
61
      }  
62
      double_senden(val[0]);
63
      //den Zähler wieder auf Null setzen (kein Überlauf)
64
      i=0;
65
      m=0;        
66
      //globale Interrupts wieder zulassen
67
      sei();
68
      udr=0;  
69
      PORTC=0x00;        
70
    }

von dom (Gast)


Lesenswert?

Hallo!

Mal ein Update von mir:

Das klappt (sieht aber unmöglich aus) val[] ist double:
1
      char *tempPtr = val_puffer[0]; 
2
      val[0] = atof(tempPtr);
3
4
      char *tempPtr1 = val_puffer[1];
5
      val[1] = atof(tempPtr1);
6
7
      char *tempPtr2 = val_puffer[2];
8
      val[2] = atof(tempPtr2);
9
10
      char *tempPtr3 = val_puffer[3]; 
11
      val[3] = atof(tempPtr3);
12
13
      char *tempPtr4 = val_puffer[4];
14
      val[4] = atof(tempPtr4);
15
16
      char *tempPtr5 = val_puffer[5];
17
      val[5] = atof(tempPtr5);

das hier jedoch nicht :
1
      char *ptr;
2
      u08 feld_counter;
3
4
      for(feld_counter=0;feld_counter<6;feld_counter++)
5
      {
6
        *ptr  = val_puffer[feld_counter];
7
        val[feld_counter] = atof(ptr);
8
      }

Beides gibt eine (bzw sechs) Warnungen und das kanns doch nicht 
sein...oder?

Beste Grüße !

von Karl H. (kbuchegg)


Lesenswert?

Was hast du nur immer mit deinem Zwischenpointer?

      for(feld_counter=0;feld_counter<6;feld_counter++)
      {
        val[feld_counter] = atof(val_puffer[feld_counter]);
      }

von dom (Gast)


Lesenswert?

Hallo Karl Heinz!

Weils so nicht klappt (leider)...

Compiler:

../I2CMASTER.c:123: warning: passing arg 1 of `atof' discards qualifiers 
from pointer target type

Ich bekomm nur Unsinn wenn ich den Wert dann über Usart raushaue....

Viele Grüße !

von dom (Gast)


Lesenswert?

Nochmal Update:

Wie Karl-Heinz es postet klappt es doch.
Hab da wohl etwas falsch gemacht. Die Compilerwarnung bleibt jedoch.

Was meint der Compiler damit denn?

Danke für die Hilfe!

Gruß!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ein `type qualifier' ist eins der Schlüsselworte "const", "volatile"
oder "restricted".  (Letzteres kommt erst mit C99 hinzu und hat nur
für Zeigerargumente in Funktionsdeklarationen Sinn.)

Du hast also einen Datentyp, der entweder "const" oder "volatile"
deklariert ist und übergibst diesen an atof(), das von dieser
Besonderheit nichts weiß.  Der Compiler teilt dir daraufhin mit,
dass letztlich atof() diese Tatsache aus Unkenntnis ignorieren
wird.

Wenn's trotzdem geht, ist es ein gutes Anzeichen, dass es des
type qualifiers wohl auch gar nicht erst bedurft hätte.

von dom (Gast)


Lesenswert?

Hallo Jörg!

Verstanden.

val[] hatte ich unnötigerweise als volatile deklariert.
Muss aber nicht da nur in main verwendet.

Danke! Wieder mal was dazu gelernt!

Tolles Forum hier!

Viele Grüße!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.