C - Memcpy无效

时间:2015-05-11 11:27:52

标签: c memcpy

首先,知道memcpy如何工作:第三个参数是复制的字节数,但是,我仍然有问题......

这是我的结构:

#define ARRONDI(X, Y) 1 + (X / (Y + 1))
#define Taille ARRONDI(Max_Length, 64)
#define Max_D 7
typedef unsigned long long ull;

typedef struct{
    ull List[Taille];
    ull best_solution[Taille];
    ull Dist[Taille];
    int borne;
    int Length[Max_D-1];
    int nb_mark;
}tache_t;

Taille和Max_D都是之前定义的宏。 当我有2个tache_t,a和b时,我想要复制" best_solution"数组从一个到另一个,所以我输入

#include <string.h>
int main(){
int i;

tache_t t;
t.best_solution[0] = 52461701;
t.best_solution[1] = 0;

ull T[Taille];
memcpy(T, t.best_solution, sizeof(ull) * Taille);

for(i=0; i<Taille; i++)
    printf("%Lu vs %Lu\n", T[i], t.best_solution[i]);

    return 0;
}

但是当我检查数值时,两个阵列都有点不同...... 怎么可能?

我想知道这是否是填充问题......但显然它不是,对吧?

2 个答案:

答案 0 :(得分:3)

啊哈!如果您只通过预处理器运行代码(使用gcc&#39; -E选项),您会看到memcpy行被解析为:

memcpy(T, b.best_solution, sizeof(ull) * 1 + (Max_Length / (64 + 1)));

宏是文本替代品。在您的情况下,您可以通过将整个表达式括在括号中来防止错误的替换:

#define ARRONDI(X, Y) (1 + (X / (Y + 1)))

如果您希望宏在所有情况下都有效,请在参数周围放置括号:

#define ARRONDI(X, Y) (1 + ((X) / ((Y) + 1)))

答案 1 :(得分:2)

这部分源代码:

private void showPopup(final Activity context, Point p) {

        // Inflate the popup_layout.xml
        LinearLayout viewGroup = (LinearLayout)context.findViewById(R.id.layoutPopup);
        LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View layout = layoutInflater.inflate(R.layout.popup_layout, viewGroup);

        holder.popupText = (TextView) layout.findViewById(R.id.showPopUp);
        // Creating the PopupWindow
        final PopupWindow popup = new PopupWindow(context);
        popup.setContentView(layout);
        popup.setWidth(LinearLayout.LayoutParams.WRAP_CONTENT);
        popup.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT);
        popup.setFocusable(true);

        int OFFSET_X = 30;
        int OFFSET_Y = 30;

        popup.setBackgroundDrawable(new BitmapDrawable());
        popup.showAtLocation(layout.findViewById(R.id.showPopUp), Gravity.NO_GRAVITY, p.x + OFFSET_X, p.y + OFFSET_Y);

    }

变为:

sizeof(ull) * Taille

sizeof(ull) * ARRONDI(Max_Length, 64) 宏扩展之后,后者又变为:

Taille
替换sizeof(ull) * 1 + (Max_Length / (64 + 1)) 后的

这就是你想要的......?