Funktion und Argument als anderer Datentyp



  • Hallo,

    ich bin recht neu im Bereich programmierung will jedoch gerade folgendes umsetzen:

    also ich arbeite mit einer Bibliothek bei der ich nicht im Quellcode rumfuschen will!

    nun ist es so ich will eine funktion diese Bib aufrufe und dieser dann einen anderen Datentyp übergeben.

    Eigentlich geht das auch, es gibt eben ein warning aber die funktion arbeitet trozdem korekt. Nur dieses wsarning stört mich, gibt es also irgendeinen weg es schöner zu lösen ????

    mein Bsp:

    rufe funktion "tu_was" auf ➡ erwartet einen datentyp von long unsigned int

    folgendes (wie oben beschrieben) mache ich dann

    unsigned short action[];
    tu_was(action);
    

    die funktion funktioniert korrekt nur beim compilieren bekomm ich eben die warnung:
    warning: passing arg 1 of `tu_was' from incompatible pointer type

    dies meldung kommt eben doch dann weil der datentyp falsch ist...

    btw übergeben wird ein array

    weiss jemand rat?



  • Das soll korrekt funktionieren? Unwahrscheinlich, weil short und long unterschiedliche Größen haben. Die Funktion wird dann immer zwei shorts zusammen als ein long auffassen.



  • ja also recht hast ganz richtig funktioniert sie nicht, aber auch egal geht es irgendwie der funktion den datentyp unsigned short zu übergeben so das sie diesen einfach akzeptiert und mit diesem dann arbeitet?? ohne die funktion selber zu ändern.. irgendwie casten oder sowas?



  • wenn die funktion einen 'unsigned long' erwartet, dann wir sie mit ziemlicher sicherheit keine kompletten arrays verarbeiten können. andere variablen, wie z.b. char, int, float kannst du mit einem type-cast syntax (beachte die klammern):

    typ b=(typ)x;
    

    in das gewünschte format quetschen.
    bei variablen, die aus mehr bits bestehen, als der umwandlungstyp, besteht dann aber die gefahr des datenverlusts.
    🙂



  • Nein, in diesem Fall nicht. Bei einem Pointer-Cast wird ja nur der Pointer umgewandelt, d.h. die Daten bleiben unverändert, werden bloß anders interpretiert. Das Array als ganzes kann man nicht casten. Du müsstest das Array schon in ein unsigned long Array umkopieren und dabei elementweise casten.

    Edit: Ich hatte die Frage so verstanden, dass die Funktion ein unsigned long Array erwartet, keinen einfachen unsigned long. Kannst du das bitte klären?



  • die funktion erwartet ein long unsigned int array und ich will ihr ein unsigned short array übergeben



  • alfredo78 schrieb:

    die funktion erwartet ein long unsigned int array und ich will ihr ein unsigned short array übergeben

    dann trifft das zu, was Bashar geschrieben hat. mit 'nem cast alleine wird das nix.
    🙂



  • ja ich zweifel auch an ob es überhaupt möglich ist 😕

    aber wollt halt mal nachfragen 🙂



  • alfredo78 schrieb:

    ja ich zweifel auch an ob es überhaupt möglich ist 😕

    geht ja auch. ein (temporäres) 'unsigned long'-array anlegen, alles rüberkopieren und dann die funktion aufrufen. ich weiss, das ist nicht sehr elegant. besser du arbeitest von vorn herein mit einem 'unsigned long' array, wenn du vorhast diese funktion aufzurufen.
    🙂



  • #define ANZ 1000
        int i;
        unsigned short a[ANZ];
        unsigned long  b[ANZ];
    
        for (i = 0; i < ANZ; i++)
        {
            b[i] = (unsigned long)a[i]; // casten und kopieren! 
        }
    

    🕶



  • hm ja nur ist ein einfaches kopieren in diesem fall schwer.

    ._. schrieb:

    #define ANZ 1000
        int i;
        unsigned short a[ANZ];
        unsigned long  b[ANZ];
    
        for (i = 0; i < ANZ; i++)
        {
            b[i] = (unsigned long)a[i]; // casten und kopieren! 
        }
    

    🕶

    denn mein problem ist das ich am nach dem funktions aufruf von long auf short casten muss und dabei eben daten verloren gehen ...

    was mir noch einfällt unzwar:

    long unsigned int wird bei der funktion per typedef definiert, also z.b.

    typedef long unsigned int lui;
    

    jetzt habe ich einfach mal probiert das bei mir im programm neu auf unsigned short zu definieren also

    typedef unsigned short lui;
    

    naja aber compiler mekkert 😞

    kann man vielleicht dort ansetzt???



  • alfredo78 schrieb:

    er mekkert zwar nicht aber funktionieren tut das auch nicht 😞

    du musst natürlich deine funktion auch neu compilieren, nachdem das typedef geändert wurde. eine andere, aber eher seltene, möglichkeit: wenn du deinem compiler sagen kannst, wie breit ein 'short' sein soll, dann mach 'short' genau so breit wie 'long'.
    🙂



  • faule-tricks-fan schrieb:

    alfredo78 schrieb:

    er mekkert zwar nicht aber funktionieren tut das auch nicht 😞

    du musst natürlich deine funktion auch neu compilieren, nachdem das typedef geändert wurde. eine andere, aber eher seltene, möglichkeit: wenn du deinem compiler sagen kannst, wie breit ein 'short' sein soll, dann mach 'short' genau so breit wie 'long'.
    🙂

    hm recht hast :p hm dem compiler sagen wie breit ein short/long ist wie geht das? hab den normalen gcc unter cygwin



  • alfredo78 schrieb:

    dem compiler sagen wie breit ein short/long ist wie geht das? hab den normalen gcc unter cygwin

    ich weiss nicht, ob's mit dem gcc geht. es gibt da gewisse festlegungen im c-standard wie z.b. int8_t <= char <= int16_t <= short <= int <= long, d.h. theoretisch dürfen alle gleich gross sein. wenn nicht, dann änder doch das typedef und übersetz die lib neu. wieso willst du überhaupt mit einem 'unsigned short' array arbeiten? hast du andere funktionen, die einen solchen arraytyp erwarten?
    🙂



  • alfredo78 schrieb:

    denn mein problem ist das ich am nach dem funktions aufruf von long auf short casten muss und dabei eben daten verloren gehen ...

    Wieso arbeitest du denn dann überhaupt mit short, wenn du damit die Ergebnisse gar nicht festhalten kannst?


Anmelden zum Antworten