2011-02-18 146 views
0

我有一个3x3的矩阵,它没有排序。将2d矩阵的值赋给变量

按照升序或降序对3x3矩阵进行排序后,我希望将中值存储在整型变量中(int med)。

由于我的基质为奇数的元素,我知道每一次的中位值将是matrix[1][1],所以我基本上是这样写的:

int med = matrix[1][1]; 

虽然我得到在Visual Studio中没有编译时错误而运行位数的应用,我得到了这个以下运行时错误:

"#2 run time check failure..the stack around variable matrix[][] is corrupted.. 

下面是代码:

#include "stdafx.h" 
#include <math.h> 
#include <mtip.h> 
#define MAX 3 

int medianfilter_MIF(HMTIPMOD hMod ,Dataset_byte *in,Dataset_byte **out,int th) 
{ 
    if(!in) 
    { 
     mmsg_ReportError("Missing input!"); 
     return MRV_FAILURE; 
    } 

    *out = (Dataset_byte*)md_DatasetClone((Dataset*)in, DST_SAME); 
    if(!*out) 
    { 
     mmsg_ReportError("Could not clone image!"); 
     return MRV_FAILURE; 
    } 


    BYTE *pin = DATA_PTR(in); 
    BYTE *pout = DATA_PTR(*out); 
    int d_w = NX(in); 
    int d_h = NY(in); 
    int mask2d_int[MAX][MAX]; 
    int *element; 
    int temp; 

    for (int i = 1; i < d_w - 1; i++){ 
     for (int j = 1; j < d_h - 1; j++){ 
      int temp = VAL2(in,i,j); 
      mmsg_ReportError("the value of temp is: %d ",temp); 
      for (int p = i - 1; p < i + 2; p++){ 
       for (int q = j - 1; q < j + 2; q++){ 
        mask2d_int[p][q]=VAL2(in,p,q); 
        mmsg_ReportError("the value of mask2d_int[p][q] : %d ",mask2d_int[p][q]); 
       } 
      } 


    for (element = &mask2d_int[0][0]; element <= &mask2d_int[MAX-1][MAX-1]; element ++) { 
       if (*element > *(element + 1)) { 
       *element ^= *(element + 1); /* exclusive or swap */ 
       *(element + 1) ^= *element; 
       *element ^= *(element + 1); 
       } 
     msg_ReportError("the value of element after swapping is %d ",element); 
      } 
      int med = mask2d_int[1][1]; 
      mmsg_ReportError("the value of median is: %d ",med); 
      if ((temp - med) < th){ 
       *pout = temp; 
       mmsg_ReportError("the value of *pout before is %d ",*pout); 
       } 
      else{ 
       *pout = med; 
       mmsg_ReportError("the value of *pout after is %d ",*pout); 
       } 
      ++pout; 
      } 
     } 
    return MRV_SUCCESS; 
} 


int medianfilter_MDF(HMTIPMOD hMod) 
{ 
    INPUT_DATASET("Input image", 0, 0, DST_BYTE, CONN_REQUIRED); 
    OUTPUT_DATASET("Output image", 0, 0, DST_BYTE, 0); 
    CONTROL_INT_SLIDER("threshold:",30,0,255); 
    return MRV_SUCCESS; 
} 

REGISTER_MTIP_MODULE("Median Filter", medianfilter_MDF, medianfilter_MIF, 0, 0, 0); 
+1

请发布整个功能的代码。这个问题可能不在这条线上。 – 2011-02-18 13:32:55

回答

1

看看

for (element = &mask2d_int[0][0]; element <= &mask2d_int[MAX-1][MAX-1]; element ++) { 
              ^^ 
       if (*element > *(element + 1)) { 
            ^^^^^^^^^^^ 

你循环而element <= &mask2d_int[MAX-1][MAX-1]这意味着元素运行直到并包括最后的INT,然后您可以用“下一个”整数比较(不存在),并可能交换。

多维数组之后的字节包含一个由您的编译器(可能会生成调试版本)放置它们的“魔术值”。在数组抛出此值后,将数组中的最后一个int与字节交换,导致出现错误。

改变for循环

for (element = &mask2d_int[0][0]; element < &mask2d_int[MAX-1][MAX-1]; element ++) { 
             ^

应该做的伎俩。

如果你只想让它工作 - 然后我说了我的话 - 但我注意到你排序矩阵的唯一原因是得到中位数,并且你已经标记了这个问题“C++”这意味着如果您有兴趣,有一些更简单的方法可以做到这一点。