Unbekannte Anzahl Hex-Werte zurück geben

Gast #1147771
Lesenswert?

Ich habe eine Funktion die eine erst zur Laufzeit bekannte Anzahl 
Hexwerte erzeugt. Das kann von gar keinem Wert bis zu 8 sein.

Habe bisher noch keine gute, einfache Lösung gefunden, alle einzelnen 
Werte ans Hauptprogramm zurück zu geben. Arrays sind mir mit den Zeigern 
da nicht so klar. In PHP geht das einfach :-) Und ob es so sinnvoll ist, 
aus den einzelnen Werten eine große Variable zu basteln und die zurück 
zu geben, glaube ich nicht.

Am besten wäre es natürlich, das Programm würde nur soviel Speicher 
benötigen, wie auch wirklich Werte vorhanden sind.

Allerdings kenne ich mich mit der Speicherverwaltung noch nicht wirklich 
gut aus. Notfalls lege ich einfach für alle 8 möglichen Werten die 
Variablen an und schreibe in die nicht vorhandenen 0x00.

Mein größtes Problem ist aber die Rückgabe mehrerer Werte. Hoffe mal ihr 
wisst eine gute Möglichkeit :-)

Thx.
#1147872
Lesenswert?

Vorgehensweise (ohne malloc):
- passenden Buffer anlegen
- Pointer auf den Buffer an die Funktion übergeben
- die Funktion kann jetzt zurückgeben, entweder:
  - die Anzahl der Werte, oder
  - einen Pointer auf den letzten belegten/nächsten freien Platz, oder
  - immer eine feste Anzahl an Werten (Falls das Auffüllen geht (z.B. 
bei strings))
1
// Example for 1)
2
uint8_t getValues(uint16_t *buf, uint16_t buf_size)
3
{
4
  uint8_t value_count, i;
5
  value_count = complicatedWayToGetNumberOfValues();
6
  for (i=0; i < buf_size && i < value_count; i++)
7
  {
8
    // Example
9
    buf[i] = usart_getc();
10
  }
11
  return i;
12
}
13
/* Aufruf*/
14
int main(void)
15
{
16
  //...
17
  uint16_t buffer[100], number;
18
  //...
19
  number = getValues[buffer, 100);
20
  // ...
21
}

hth, Jörg
Gast #1147913
Lesenswert?

Möglichkeiten:

 - struct zurückgeben. Diese enthält zwei Einträge:
   1.) Pointer zu deinem dynamisch allokierten Array
   2.) Anzahl der Einträge

 - Pointer auf das dynamisch allokierte Array zurückgeben.
   Erster Eintrag im Array enthält die Anzahl der
   übrigen/folgenden Einträge.

Besorg' dir Lektüre zu C.
Gast #1149962
Lesenswert?

War doch für längere Zeit nicht da :-(

Es ist für einen ATmega32, also ein kleines Ding mit sehr begrenztem 
Speicher. Sprache ist C.

Mein größtes Problem sind die Zeiger. Da fehlt mir noch der Sinn.
@Jörg Wie bekomme ich nur mit dem Zählwert die einzelnen Werte? Verstehe 
dein Beispiel nicht ganz.

Die Hex-Werte werden erst in Abhängigkeit von max. 8 Pins bestimmt und 
der Funktion selbst keine Werte übergeben.

Sowas in der Art:
int pinpruefer (void) {
...
return WERTE;
}

WERTE = pinpruefer ();
#1150004
Lesenswert?

Du hast im Grunde die Wahl zwischen 2 sinnvollen Möglichkeiten:

Die Funktion arbeitet direkt mit einer globalen Variable.
(einfach aber unflexibel)
1
uint8_t Werte[8];
2

3
void pinpruefer (void) {
4
    Werte[0] = ...
5
    Werte[1] = ...
6
    ...
7
}
8

9
pinpruefer();

Die Funktion arbeitet mit einem übergebenen Pointer:
1
void pinpruefer ( uint8_t werte[] ) {
2
    werte[0] = ...
3
    werte[1] = ...
4
    ...
5
}
6

7
uint8_t Werte[8];
8
pinpruefer(Werte);

Zusätzlich kannst du die Funktion die Anzahl der eingetragenen Werte 
zurückgeben lassen, falls das für die aufrufende Funktion von Interesse 
ist.
#1150065
Lesenswert?

Gast wrote:

> Sowas in der Art:
> int pinpruefer (void) {
> ...
> return WERTE;
> }
>
> WERTE = pinpruefer ();

Das solltest du dir gleich wieder abgewöhnen. Arrays sind in C keine 
vollwertigen Datentypen. Man kann sie nicht vernünftig als Returnwert 
zurückgeben.

(Das war die Kurzform. Die Langform der Antwort findest du in jedem 
C-Buch)

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