C Funktion Rückgabewert Objectarray



  • Hallo,

    ich habe eine Funktion und lese dort aus einer datenbank einen Record
    aus...

    Record* record = tbFahrzeug.getRecord(index);
    

    es sind mehrere Felder, natürlich unterschiedlicher Art.

    Ich möchte nun das Ergebnis dieser Funktion an eine andere Funktion übergeben...
    also in einer anderen Funktion mit den gerade ausgelesenen Werten weiterarbeiten.

    Wie kann ich nun so einen Record übergeben?

    Muss ich ein Objectarray erzeugen und dieses "Recordset" dort hineinschreiben?
    Wie behandel ich dieses Übergabeproblem?
    Mir fällt es schwer die Übergabe zu definieren.

    Weiss jemand wie ich das machen kann?

    Bin dadrin neuling und jeder Hinweis wäre hilfreich....



  • sorry, es ist c++


  • Mod

    Deine Frage enthält nicht genügend Informationen um dir zu antworten. Es ist mir noch nicht einmal klar, was überhaupt dein Problem ist. Ist dir Unklar, wie Objektübergabe zwischen Funktionen funktioniert? Falls dies dein Problem ist ➡ Anfängerbuch schnappen und die Kapitel ganz am Anfang lesen.



  • Grundsätzlich wohl so:

    void DoSomething(Record* record)
    {
      int i = record->GetIntValue();
      //...
    }
    

    wobei mir Sorgen bereiten würde, dass von diesem Record-Objekt nur eine Adresse bekannt ist und gewährleistet sein muss, dass dieses Objekt auch während der Verarbeitung existiert.



  • Neuling007 schrieb:

    Hallo,

    ich habe eine Funktion und lese dort aus einer datenbank einen Record
    aus...

    Record* record = tbFahrzeug.getRecord(index);
    

    es sind mehrere Felder, natürlich unterschiedlicher Art.

    Ich möchte nun das Ergebnis dieser Funktion an eine andere Funktion übergeben...
    also in einer anderen Funktion mit den gerade ausgelesenen Werten weiterarbeiten.

    Wie kann ich nun so einen Record übergeben?

    Muss ich ein Objectarray erzeugen und dieses "Recordset" dort hineinschreiben?
    Wie behandel ich dieses Übergabeproblem?
    Mir fällt es schwer die Übergabe zu definieren.

    Weiss jemand wie ich das machen kann?

    Bin dadrin neuling und jeder Hinweis wäre hilfreich....

    Folgerungen:
    - Also es gibt 2 Funktionen, z.B. f() und g().
    - Nehmen wir an, das Stückchen Quellcode, das Du gepostet hast, steht in g().
    - g() wurde zuvor von f() aufgerufen, und soll also das Resultat der vielen
    tbFahrzeug.getRecord()-Anweisungen zurückgeben (in Deinem Fall also ein
    Array aus Elementen vom Typ 'Record' (oder womöglich 'Record*')

    --> 🙂
    Idee/'Hinweis'/Vorschlag:

    Übergib einfach einen zusätzlichen Parameter an die Funktion g(),
    z.B. sowas von dieser Art:

    typedef struct{
     Record* element[];
     unsigned size;
    }ReturnValueForF;
    
    /* ... */
    
    void g(ReturnValueForF* RVFF); /* über den Zeiger 'erreicht'
     g() direkt eine Variable von diesem Typ, die in f() bekannt ist
     (oder gar dort erzeugt wurde),
     und kann auf diese Weise die Ergebnisse von tbFahrzeug.getRecord()
     direkt dort reinschreiben, wo die Daten benötigt werden, also 'nach' f().
     ('Kurzschluss-'Optimierung), wo sie ja dann von f() offenbar
     auch weiterverarbeitet werden sollen. */
    

    ... und dann wäre es optimal, wenn f() zuerst mal so eine Variable von diesem
    ReturnValueForF-Datensack*Typ anlegt, und dann einen Zeiger (oder Referenz)
    darauf an g() übergibt, damit auch g() d'rauf zugreifen kann.
    Dann könnte g() die vielen Record() Dingsbums direkt in diesen Parameter
    reinschreiben (sogar mit der Fleißaufgabe, wieviele Datensätze
    eingelesen wurden, also über RVFF->size ... das wär doch schön, wenn
    g() das gleich miterledigt, wenn man's in f() ohnehin benötigt ... 😡 ).

    Und wenn dann g() mit der Arbeit fertig ist und wieder f() weiter arbeitet,
    dann stehen f() sofort alle Datensätze (bzw. Zeiger darauf, warum
    auch immer?) sofort zur weiteren Bearbeitung zur Verfügung.
    Generell sollte man derartige, dynamisch wachsende, Datensäcke
    ('Verpackungs-Struktur' für das Array), indirekt und über einen
    zusätzlichen Parameter an den Aufrufer zurückgeben, also z.B. so wie
    hier skizziert.
    Das ist die performanteste und zugleich fehler-vorbeugendste Weise,
    wenn man's so macht (andernfalls würden nämlich gigantische Datenblöcke
    im Speicher herumverschoben, wenn man das Array (oder gar <vector>)
    z.B. 'direkt' zurückgäbe)

    mfg



  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ (auch C++0x) in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Neuling007 schrieb:

    Ich möchte nun das Ergebnis dieser Funktion an eine andere Funktion übergeben...
    also in einer anderen Funktion mit den gerade ausgelesenen Werten weiterarbeiten.

    Wo ist da Problem?

    Record *uebergeber() { Record *r = calloc( anzahl, sizeof(Record) ); ... return r; }
    void uebernehmer( Record *r ) { /* mache hier was mit r */ free(r); }
    ...
    uebernehmer( uebergeber() );
    

    Ein Problem was du mit dieser einfachen Übergabe bekommen könntest, ist die Anzahl der Records im übernehmenden Kontext zu bestimmen.


Anmelden zum Antworten