Forum: Compiler & IDEs Unbekannte Anzahl Hex-Werte zurück geben


von Gast (Gast)


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.

von Jörg G. (joergderxte)


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

von Panikplauze (Gast)


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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Hilfreich wäre es, zu wissen um welche Archtiektur (AVR? PIC? 386? PPC? 
ARM? ...) es geht und um welche Sprache es geht (C? C++? Java? Ada? 
Fortran?...)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Hintergrund der Frage: Falls es sich um einen kleinen µC wie einen AVR 
handelt, ist malloc (also ein dynamisch allokiertes Array zu verwenden) 
so ziemlich der übelste Tipp, den man geben kann...

Johann

von Gast (Gast)


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 ();

von Stefan E. (sternst)


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.

von Karl H. (kbuchegg)


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)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.