inhoud array meegeven in een functie ?

trix

Golden Member

in main.C heb ik een array gemaakt uint8_t Rx_Data[6]; waarin de data komt afkomstig van een touchscreen.
die data wil ik ook in stepper_manual.C kunnen gebruiken.
deze bestaat uit een functie:
void stepper_manual( LY_to_top, LY_to_below )
met gewone variabele krijg ik het wel voor mekaar,
alleen hoe gaat dit met de inhoud van een array ?

eigenwijs = ook wijs

c code:



#include <stdio.h>
float calculateSum(float num[]);

int main() {
  float result, num[] = {23.4, 55, 22.6, 3, 40.5, 18};

  // num array is passed to calculateSum()
  result = calculateSum(num); 
  printf("Result = %.2f", result);
  return 0;
}

float calculateSum(float num[]) {
  float sum = 0.0;

  for (int i = 0; i < 6; ++i) {
    sum += num[i];
  }

  return sum;
}

uint8_t in plaats van float in jouw geval natuurlijk

KGE

Golden Member

Je geeft dus niet de array inhoud mee maar alleen de pointer naar je array.

Inderdaad. De [] notatie geeft aan dat het een pointer is naar een array. Om het netjes te doen zou je ook de array size mee moeten geven.

Maar eerlijk gezegd denk ik dat je ipv een array in jouw geval beter een struct kunt maken met de "functionele" inhoud wat er in staat.

Geef eens wat meer info over wat je precies door wilt geven van de ene naar de andere functie?

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
trix

Golden Member

in main.C
lees ik b.v. van de touchscreen: manual geselecteerd.
hierdoor spring ik naar stepper_manual.c met de functie: void stepper_manual( LX_to_front, LX_to_back, LY_to_top, LY_to_below )
en hierin wil ik dus v/d touchscreen: LX-as naar voren, LX-as naar achter lezen.

(aantal parameters in de functie worden er later natuurlijk meer)

eigenwijs = ook wijs

Waar heb je dat array dan voor nodig? Meerdere punten/posities?

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
trix

Golden Member

daar gaat de data in afkomstig v/d touchscreen. ieder button geeft een eigen code die 6x8 bits lang zijn b.v.:
&0403& (kan ik zelf bepalen wat het touchscreen stuurt)
dan weet ik pagina 4 button 3 is gedrukt.
aan de hand hiervan bepaal ik de actie.

[Bericht gewijzigd door trix op zondag 20 maart 2022 10:32:46 (10%)

eigenwijs = ook wijs

Dus je drukt meerdere knoppen in (achter elkaar) en slaat de coordinaten/posities op in een array als ik het begrijp?

Wat je dus eigenlijk wilt is een "compositie" variable die 2 dingen bevat: page nummer en button nummer.

Dat doe je dus typisch in een struct definitie in C:

code:


typedef struct {
    int page;
    int button;
} but_press_t;

In dit geval ook nog een typedef ervan gemaakt zodat je niet elke keer struct ervoor hoeft te zetten.

Dan kun je een array maken met dat type erin en die pass je dan door aan je functie, bijvoorbeeld zo:

code:


#include <stdio.h>
#include <stdint.h>

typedef struct {
    int page;
    int button;
} but_press_t;

// Prototypes
void printButtons(but_press_t buttons[], size_t presses);

#define COUNT 3
but_press_t buttons[COUNT] = {
    { 0, 0 },
    { 1, 2 },
    { 3, 4 }
};

int main() {

  printButtons(buttons, COUNT); 
  return 0;
}

void printButtons(but_press_t buttons[], size_t presses) {

  for (size_t i = 0; i < presses; i++) {
    printf("page=%d, button=%d\n", buttons[i].page, buttons[i].button);
  }
}

Ik weet niet of je dat bedoeld?

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
elmowww

Golden Member

Op 20 maart 2022 09:52:13 schreef K7Jz:

c code:



#include <stdio.h>
float calculateSum(float num[]);

int main() {
  float result, num[] = {23.4, 55, 22.6, 3, 40.5, 18};

  // num array is passed to calculateSum()
  result = calculateSum(num); 
  printf("Result = %.2f", result);
  return 0;
}

float calculateSum(float num[]) {
  float sum = 0.0;

  for (int i = 0; i < 6; ++i) {
    sum += num[i];
  }

  return sum;
}

Er zit wel wat lelijkheid in deze functie, je geeft een pointer naar een array mee, maar gaat er vervolgens van uit dat de grootte 6 elementen is. Ik zou een grootte als tweede argument toevoegen om het wat minder lelijk te maken:

c code:


  [...]  // num array is passed to calculateSum()
  result = calculateSum(num, sizeof(num)/sizeof(num[0])); 
  [...]

float calculateSum(float num[]) {
  float sum = 0.0;

  for (size_t i = 0; i < sz; ++i) {
    sum += num[i];
  }

  return sum;
}

Daarnaast heb ik het itereer type veranderd naar een size_t. Je geeft dan als grootte mee het aantal elementen: grootte van de array deken door de grootte van één element.

PA0EJE - www.eje-electronics.nl - e.jongerius[aapje]eje-electronics.nl - EJE Electronics - Elektronica/firmware ontwikkeling
trix

Golden Member

@henri62.....ik kom er zo wel uit denk ik, ik moet het nog zien te implementeren in mijn code.
tnx.

eigenwijs = ook wijs
trix

Golden Member

ik heb het achteraf toch anders opgelost. ik was van plan om in in iedere source (waar nodig) het touchscreen uit te lezen. en daarom moest ik de array waar de data van het touchscreen op binnenkomt ook in de desbetreffende source kunnen uitlezen.
maar toch besloten om de array alleen in main.c uit te lezen, en dan een variabele "1" of "0" maken b.v. X_as_to_back = 1, en deze als parameter aan de funtie mee te geven.
zo blijft het hele touchscreen gebeuren in 1 source, dit lijkt mij het meest overzichtelijk.

bedankt voor de reacties, leerzaam is het altijd en wellicht heb ik dit straks toch nog ergens nodig.

eigenwijs = ook wijs