[C/Arduino]probleem met meegeven char array aan functie

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 16-09 20:58

Guldan

Thee-Nerd

Topicstarter
Ik ben recent begonnen het het arduino programmeren en ik loop tegen een probleem aan waar ik niet uitkom.

Ik heb een functie die seriele gegeven omzet naar een character array. Deze gegevens worden naar een andere functie gezet welke ze omzet naar een decimaal getal.

Vb: Als ik 255123 stuur dan moet ik de losse nummers eruit halen (255 and 123). De functie die dit doet is hieronder beschreven:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int GetColorInfo(char data[128],int start,int end)
{
 
  int output =0;
 
  for(int i=start; i <= end; i++)
  {
    int color = data[i];
    int number = color -48;
    //ga van ascii naar numeriek
    if(number >= 0 && number <=9)
    {

       switch (i)
       {
          case 0:
         
          output += (number * 100);
          break;
          case 1:
          output += (number * 10);
          break;
          case 2:
           output += number;
          break;
       }

    }

return output;
     
  }

Om deze functie te gebruiken doe ik het volgende: (buffer is de array met de seriële gegevens)
C:
1
2
3
4
5
6
7
void loop()
{
  int firstColor = GetColorInfo(buffer,0,2);
  Serial.println(firstColor);
  int secondColor = GetColorInfo(buffer,1,3);
  Serial.println(secondColor);
}

Wanneer ik via de seriele poort 123456 verstuur dan wordt firstcolor netjes 123 (wat goed is) echter wanneer ik de tweede functie aanroep (welke 234 zou moeten geven) dan wordt er echter alleen '23' getoond. Verander ik het voorbeeld naar onderstaande:

C:
1
2
3
4
int firstColor = GetColorInfo(buffer,0,2);
  Serial.println(firstColor);
  int secondColor = GetColorInfo(buffer,0,2);
  Serial.println(secondColor);


Dan wordt er netjes tweemaal 123 geprint. Ik zou denken dat het zit in de manier van meegeven echter zou de array binnen de functie alleen lokaal gebruikt moeten worden. En dan kan ik nog niet verklaren waarom er 23 wordt geprint.

Ik heb wel lopen googlen maar met mijn verstand kom ik er nog niet uit. Nu hoop ik dat iemand mij wil uitleggen waarom ik deze gegevens krijg.

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 12:45

Reptile209

- gers -

Met step-by-step debuggen was je er achter gekomen dat het mis gaat in je switch bij '4' (hint: i = start+2 = 3, wat doet je switch dan?)

[ Voor 4% gewijzigd door Reptile209 op 27-09-2009 16:07 ]

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 16-09 20:58

Guldan

Thee-Nerd

Topicstarter
ow god... wil iemand mij alsjeblieft wat koffie geven 8)7 8)7 . Sorry domme fout aargh wat ben ik stom. Ik heb blijkbaar een hele zware week gehad :P. Merci

edit: de oplossing nog ff gegeven:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 for(int i=start; i <= end; i++)
   {
     int color = data[i];
     int number = color -48;
     if(number >= 0 && number <=9)
     {
 
        switch (teller) 
        {
           case 0:
          
           output += (number * 100);
           break;
           case 1:
           output += (number * 10);
           break;
           case 2:
            output += number;
           break;
        }

     }
     teller++;
       
   }

[ Voor 73% gewijzigd door Guldan op 27-09-2009 16:14 ]

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 12:45

Reptile209

- gers -

Pak maar wat caffeïne uit mijn icon :). Kan de beste overkomen, maar wat ik zeg: step-by-step debuggen had dit meteen aan het licht gebracht!

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 16-09 20:58

Guldan

Thee-Nerd

Topicstarter
Ik heb in de arduino IDE nog geen step by step debugging kunnen vinden. Aangezien het een embedded platform is vermoed ik ook dat dit niet kan.

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


Acties:
  • 0 Henk 'm!

  • NC83
  • Registratie: Juni 2007
  • Laatst online: 21-08 21:44
Guldan schreef op zondag 27 september 2009 @ 16:16:
Ik heb in de arduino IDE nog geen step by step debugging kunnen vinden. Aangezien het een embedded platform is vermoed ik ook dat dit niet kan.
een kleine performance boost kun je krijgen door ipv teller++, ++teller te doen, dit zal voornamelijk gaan helpen als je een overloaded ++ operator gebruikt.

ex-FE Programmer: CMR:DiRT2,DiRT 3, DiRT Showdown, GRID 2, Mad Max


Acties:
  • 0 Henk 'm!

  • _Erikje_
  • Registratie: Januari 2005
  • Laatst online: 17-09 12:57

_Erikje_

Tweaker in Spanje

met avr studio kan je gewoon debuggen.

daarnaast: ga je verdiepen in de pointers. de array die je nu de functie geeft wordt bij elke aanroep in zijn geheel op de heap gezet, wat veel tijd kost. een pointer naar de zelfde array werkt veel sneller.

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 07:06
NC83 schreef op zondag 27 september 2009 @ 16:42:
[...]

een kleine performance boost kun je krijgen door ipv teller++, ++teller te doen, dit zal voornamelijk gaan helpen als je een overloaded ++ operator gebruikt.
C kent helemaal geen operator overloading, of bedoel je wat anders?

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • NC83
  • Registratie: Juni 2007
  • Laatst online: 21-08 21:44
Jaap-Jan schreef op zondag 27 september 2009 @ 17:37:
[...]

C kent helemaal geen operator overloading, of bedoel je wat anders?
een pre increment in dit geval zal een assignment instructie minder zijn. Ik programmeer voornamelijk in C++ en daar maakt het heel erg veel uit zodoende.

ex-FE Programmer: CMR:DiRT2,DiRT 3, DiRT Showdown, GRID 2, Mad Max


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

NC83 schreef op zondag 27 september 2009 @ 20:40:
[...]


een pre increment in dit geval zal een assignment instructie minder zijn.
Voor built-in types is dit onzin, en voor simpele custom types ook. 't Wordt pas duur als het maken van een kopie van het object duur is. En idd, aangezien het hier om C gaat maakt het dus al helemaal niet uit.
_Erikje_ schreef op zondag 27 september 2009 @ 17:32:
daarnaast: ga je verdiepen in de pointers. de array die je nu de functie geeft wordt bij elke aanroep in zijn geheel op de heap gezet, wat veel tijd kost. een pointer naar de zelfde array werkt veel sneller.
Misschien moet je je zelf eens gaan verdiepen in arrays? foo(int data[10]) is namelijk equivalent aan foo(int * data). Er wordt dus gewoon een pointer doorgegeven. Daarnaast bedoelde je natuurlijk stack, niet heap.
Guldan schreef op zondag 27 september 2009 @ 16:16:
Ik heb in de arduino IDE nog geen step by step debugging kunnen vinden. Aangezien het een embedded platform is vermoed ik ook dat dit niet kan.
Da's nog geen reden om GoT als debugger te gebruiken ;). Je kunt het stukje code ook gewoon even isoleren en op een PC runnen onder een fatsoenlijke debugger. Zeker in dit geval, waar het probleem zich in 1 functie concentreert, had je dat natuurlijk makkelijk kunnen doen.

[ Voor 67% gewijzigd door .oisyn op 27-09-2009 23:52 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 16-09 20:58

Guldan

Thee-Nerd

Topicstarter
Da's nog geen reden om GoT als debugger te gebruiken ;). Je kunt het stukje code ook gewoon even isoleren en op een PC runnen onder een fatsoenlijke debugger. Zeker in dit geval, waar het probleem zich in 1 functie concentreert, had je dat natuurlijk makkelijk kunnen doen.
@.oisyn:

Nee dat was ook eigenlijk niet de bedoeling. Daarvoor ook mijn excuses

Ik zal avr studio ook eens proberen, zien of mij dat beter bevalt.

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

offtopic:
Je hebt het probleem nu opgelost, maar je had die switch volgens mij niet eens nodig.
Als je de output eerst met 10 vermenigvuldigt en dan steeds number erbij optelt heb je hetzelfde resultaat.
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
  int output = 0;
  for(int i=start; i <= end; i++) 
  { 
    int color = data[i]; 
    int number = color - 48; 
    //ga van ascii naar numeriek 
    output *= 10; // tot nu toe berekende output vermenigvuldigen met 10
    if(number >= 0 && number <= 9) 
    { 
      output += number; 
    } 
  }
  return output;
offtopic:
Zo werkt het ook mocht de end - start > 2 zijn.

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 22:43
_Erikje_ schreef op zondag 27 september 2009 @ 17:32:
met avr studio kan je gewoon debuggen.
Mja, sta er alleen niet van te kijken al hij een breakpoint niet wil raken of bij een watch de verkeerde waarde weergeeft :X

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1