www.mikrocontroller.net

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


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht 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))
// Example for 1)
uint8_t getValues(uint16_t *buf, uint16_t buf_size)
{
  uint8_t value_count, i;
  value_count = complicatedWayToGetNumberOfValues();
  for (i=0; i < buf_size && i < value_count; i++)
  {
    // Example
    buf[i] = usart_getc();
  }
  return i;
}
/* Aufruf*/
int main(void)
{
  //...
  uint16_t buffer[100], number;
  //...
  number = getValues[buffer, 100);
  // ...
}

hth, Jörg

Autor: Panikplauze (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?...)

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ();

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast im Grunde die Wahl zwischen 2 sinnvollen Möglichkeiten:

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

void pinpruefer (void) {
    Werte[0] = ...
    Werte[1] = ...
    ...
}

pinpruefer();

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

uint8_t Werte[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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.