首先,知道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;
}
但是当我检查数值时,两个阵列都有点不同...... 怎么可能?
我想知道这是否是填充问题......但显然它不是,对吧?
答案 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))
后的这就是你想要的......?