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
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.
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?...)
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
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.