2013-06-28 47 views
4

沒有人有一個想法,如果有可能有原始類型作爲一般的參數。指針作爲泛型C#

注意,你開始談論我如何不應該使用指針之前。

圖像是使用IPP分配的原始數據數組,大多數情況下我將使用IPP,此部分是以非首選格式從非託管數據到受管數據的轉換,此時需要以非IPP支持方式單獨處理數據或者首選。

我需要以下功能字節,浮點型,短的組合,並且,而不是寫所有組合明確,我寧願一些通用/模板的東西在

private static unsafe List<PixelF> GetPixels<Timg,Tmask>(
    VMImage img, 
    int band, 
    VMImage imgMask, 
    int bandMask) 

風格,其中TIMG和TMask可一個(字節,短期或浮動)

現在,一個函數如下所示。

private static unsafe List<PixelF> GetPixels_FloatImg_ByteMask(
    VMImage img, 
    int band, 
    VMImage imgMask, 
    int bandMask) 
{ 
    List<PixelF> pixValues = new List<PixelF>(); 
    int r, c; 
    int imgSrcOffset = img.LineLength - img.Width; 
    int imgMaskOffset = imgMask.LineLength - imgMask.Width; 
    float* pf_imgSrc = (float*)img.GetRoiPointer(band); 
    byte* pb_imgMask = (byte*)imgMask.GetRoiPointer(bandMask); 
    for (r = 0; r < img.Height; r++) // Loop over rows 
    { 
    for (c = 0; c < img.Width; c++) // Loop over columns 
    { 
     if (*pb_imgMask > 0) 
     { 
     pixValues.Add(new PixelF(c, r, (float)*pf_imgSrc)); 
     } 
     ++pf_imgSrc; 
     ++pb_imgMask; 
    } 
    pf_imgSrc += imgSrcOffset; 
    pb_imgMask += imgMaskOffset; 
    } 
    return pixValues; 
} 

編輯** 下面是我想怎麼做:

private static unsafe List<PixelF> GetPixels<Timg, Tmask>(
    VMImage img, 
    int band, 
    VMImage imgMask, 
    int bandMask) 
{ 
    List<PixelF> pixValues = new List<PixelF>(); 
    int r, c; 
    int imgSrcOffset = img.LineLength - img.Width; 
    int imgMaskOffset = imgMask.LineLength - imgMask.Width; 
    Timg* pf_imgSrc = (Timg*)img.GetRoiPointer(band); 
    Tmask* pb_imgMask = (Tmask*)imgMask.GetRoiPointer(bandMask); 
    for (r = 0; r < img.Height; r++) // Loop over rows 
    { 
    for (c = 0; c < img.Width; c++) // Loop over columns 
    { 
     if (*pb_imgMask > 0) 
     { 
     pixValues.Add(new PixelF(c, r, (float)*pf_imgSrc)); 
     } 
     ++pf_imgSrc; 
     ++pb_imgMask; 
    } 
    pf_imgSrc += imgSrcOffset; 
    pb_imgMask += imgMaskOffset; 
    } 
    return pixValues; 
} 

我希望我能做到這一點在C++作爲模板,但有可能在C#中

編輯***

正如發明者指出的,只是試圖做

private static unsafe GetPixels_ByteImg_FloatMask<TImg, TMask>(
    VMImage img, 
    int band, 
    VMImage imgMask, 
    int bandMask) 
    where TImg : struct where TMask : struct 
    { 
     TImg* pb_imgSrc = (TImg*)img.GetRoiPointer(band); 
    } 

給出了錯誤 (不能走的地址,獲取的大小,或指針聲明爲管理型)。

編輯* * Basicaly,我需要知道的是大小指針(字節,短,浮點數)和當然,它必須正確地轉換爲浮動後,

+1

是,原始類型可以用作通用的類型的參數。例如列表是常見的。 –

+0

這聽起來像是當你說「原始類型」時,你的意思是價值類型。如果是這樣,那麼你遇到了什麼問題?泛型適用於值類型和引用類型(你甚至可以將泛型限制在它只能是一個或另一個的地方)。 –

+0

但是,你想要做的不是通用的。當然,泛型類型可以是原始值類型,除非您應用約束,它們也可以是任何其他類型。 – Jodrell

回答

2

我的建議是在一個單獨的託管C++程序集,也就是C++/CLI,這是公共的。 .NET API暴露了您的一般類型接口,並且「不安全」指針相關的東西發生在本機代碼中。

+0

它是一個好主意,我擔心我不能在我的公司銷售它,因爲我們對於將所有東西都轉換爲c#而不是C++非常保守。 是否有可能在任何CPU有這個託管的C++包裝?如果可能的話,這將是一個很好的賣點。 – buildcomplete

+0

不,但您可以按照http://scottbilas.com/blog/automatically-choose-32-or-64-bit-mixed-mode-dlls/中列出的步驟自動加載正確的本機庫。我想你不能有兩種方法:不安全的指針使用和只有C#... –

+0

非常感謝,我認爲這是一種溶劑。 – buildcomplete