Unbekannte Anzahl Hex-Werte zurück geben

Gast #1147771
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.
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
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
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 ();
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.
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.