copy von array (unsigned short nach signed short)
-
Hallo,
ich habe einen array der den kompletten range verwendet.
unsigned short* a1;
und möchte die Werte in einen signed short* a2 übertragen, da ich mit einer lib arbeite die nur einen signed short array akzeptiert. Die absoluten Werte sind mir egal,
d.h. wie folgt funktioniert dafür ja:a2[i]=a1[i]+SHRT_MIN;
Frage: Ist memcpy nicht schneller als eine Schleife über alle Werte? Gibt es einen Weg die Werte in den signed array mit memcpy zu übertragen? Wäre ziemlich wichtig, dass es zügig geht!!!
Danke schonmal
Michael
-
Klar, du kannst einfach mit memcpy alles in einem Rutsch rüberschieben. Aber ob das in optimiertem Code wirklich schneller ist, weiß ich nicht (ich denke, es ist fraglich). Miss einfach mal die Zeit.
-
mir ist schon klar, dass ich das einfach rüberschieben kann. Das will ich aber doch gerade nicht. Ich häte im Speicher gerne signed shorts liegen., so dass die werte zwischen SHRT_MIN und SHRT_MAX liegen, um den Range von USHRT_MAX abzubilden.
-
^^ deine unsigned-werte dürfen nur den halben wertebereich von short belegen (z.b. 0... 0x7fff), dann geht's mit memcpy. sind aber werte grösser, dann werden sie fälschlicherweise als negativ interpretiert.
-
;fricky schrieb:
^^ deine unsigned-werte dürfen nur den halben wertebereich von short belegen (z.b. 0... 0x7fff), dann geht's mit memcpy. sind aber werte grösser, dann werden sie fälschlicherweise als negativ interpretiert.
Sieh dir mal an, was er da macht. Ich hab's mir am Anfang auch nicht richtig angesehen. Er will die 'Sortierung' der Werte nicht ändern. Vielleicht will er eine Kurve darstellen o.ä., und da soll ein Wert 65535 nicht plötzlich größer sein als 65800. Daher verschiebt er seine Werte um SHRT_MAX nach links.
Jedenfalls wüsste ich keinen Weg, um das irgendwie mit memcpy hinzubiegen. Hast du denn wirklich Bedarf für eine schnellere Methode? Ist dein (optimierter!) Code zu langsam?
-
Ja so ähnlich. Sind Bilddaten, die ich möglichst schnell von nem Framegrabber abgreifen will. Ich brauche für später signed shorts und verschiebe den Wertebereich von unsigned nach signed, damit ich die volle Bildinformation behalte... Ich dachte ich könnte einfach was mit reinterpret_cast oder so in memcpy übergeben, aber da wird ja einfach nur der Speicher kopiert. Schade.
Ich habe jetzt einfach mal eine Loop über die Werte gemacht. Ich verschiebe um SHRT_MIN, damit 0 auf SHRT_MIN abgebildet wird! Ich dachte ich achte einfach von Anfang an darauf ne möglichst schnelle Methode zu nehmen. Ich glaube ich bleibe aber erst mal dabei und schaue, wo ich sonst noch Zeit verbrate
Danke euch beiden!
-
Bist du sicher, dass du die Bilddaten damit nicht verhuddelst? Also wenn ich typische 32-Bit-Bilddaten habe, dann ist die Interpretation (signed oder unsigned) natürlich völlig egal, hauptsache ich habe B-G-R-A im Speicher liegen (z.B. 0x0a15ff00). Und da würde ich doch mit deiner Methode die Farbinformationen verändern. Ich würde vermuten, du kannst dein Array einfach rüberkopieren (korrigier mich, wenn ich falsch liege).
-
Ich bekomme nur Grauwerte, von dem her habe ich auch keine RGB-Werte. Die Werte können den ganzen Wertebereich ausnutzen, sonst würde mir memcpy auch reichen, sonst würde es gehen wie ;fricke meinte.
-
mike123 schrieb:
Ich bekomme nur Grauwerte, von dem her habe ich auch keine RGB-Werte. Die Werte können den ganzen Wertebereich ausnutzen, sonst würde mir memcpy auch reichen, sonst würde es gehen wie ;fricke meinte.
teil doch beim einfügen der werte ins array durch 2 (einmal rechts-shift), dann haste immer noch 2^15 graustufen. vielleicht reicht das ja.