double-konvertierung von 2d Feld

Gast #652140
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
    }
Gast #652164
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 !
Gast #652184
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 !
Moderator Persönliche Seite #652193
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren