Funktion und Argument als anderer Datentyp



  • 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