对于在学校的作业,我们必须使用结构来制作矩阵,这些矩阵可以为无限量的矩阵存储无限量的点。 (理论无限)
对于作业,我决定使用calloc和realloc。矩阵的大小如何变化:每当它的点被限制时它的大小就会翻倍(因此它从1开始,然后变为2,然后变为4,依此类推)。每次添加矩阵时,它的大小也会增加一倍。
这就是我的问题所在。添加初始矩阵后,它将添加第二个矩阵名称和点,它给出了以下内容:
B???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
B是我想要的部分(因为我之后使用strcmp),但是?标记不应该在那里。 (显然)
我不确定为什么会这样做。由于代码是模块化的,因此很难获得部分代码以准确显示它的实现方式。
注意:我可以通过以下方法访问矩阵的点:MyMatrix[1].points[0].x_cord;
(这只是一个例子)
产生问题的示例代码:
结构:
struct matrice {
char M_name[256];
int num_points[128];
int set_points[128];
int hasValues[1];
struct matrice_points * points;
} * MyMatrix;
struct matrice_points {
int set[1];
double cord_x;
double cord_y;
};
设置矩阵功能:
void setupMatrix(){
MyMatrix = calloc(1, sizeof(*MyMatrix));
numMatrix = 1;
}
成长矩阵功能:
void growMatrix(){
MyMatrix = realloc(MyMatrix, numMatrix * 2 * sizeof(*MyMatrix));
numMatrix = numMatrix * 2;
}
添加矩阵函数,在生成矩阵一次后输出此问题。
void addMatrix(char Name, int Location){
int exists = 0;
int existsLocation = 0;
for (int i = 0; i < numMatrix; i++){
if (strcmp(MyMatrix[i].M_name, &Name) == 0){
exists = 1;
existsLocation = i;
}
}
*MyMatrix[Location].M_name = Name;
printf("Stored Name: %s\n", MyMatrix[Location].M_name);
*MyMatrix[Location].num_points = 1;
*MyMatrix[Location].set_points = 0;
*MyMatrix[Location].hasValues = 1;
MyMatrix[Location].points = calloc(1, sizeof(*MyMatrix[Location].points));
}
答案 0 :(得分:0)
尝试在数据末尾添加'\ 0'。
答案 1 :(得分:0)
*MyMatrix[Location].M_name = Name;
您在这里复制一个字符,而不是字符串。如果您需要字符串,Name
应定义为char *
,您应该使用strcpy
。
答案 2 :(得分:0)
void addMatrix(char Name, int Location)
char Name
表示单个char
,即整数类型的数量。 char
只是一个数字,它根本不是字符串。
执行此操作时:
strcmp(..., &Name)
您假设存储该一个字符的位置表示有效的C字符串。这是错误的,没有理由为什么会这样。如果要将C字符串传递给此函数,则需要将其声明为:
void addMatrix(char *Name, int Location)
然后,您需要将该C字符串复制到矩阵结构中的适当位置。它应该看起来像:
strncpy(... .M_name, Name, max_number_of_chars_you_can_store_in_M_Name);
这些字段定义在您的结构中也很奇怪:
int num_points[128];
int set_points[128];
int hasValues[1];
这意味着你的struct将包含一个名为num_points的128个int的数组,另一个128个int调用set_points的数组,以及一个名为hasValues的int(奇怪)数组。如果您只需要存储总点数和设定点数,以及指示是否存储值的标志,则定义应为:
int num_points;
int set_points;
int hasValues;
并更正addMatrix
功能中的作业。
如果您确实需要这些阵列,那么您的分配也是错误的。
请打开编译器中的所有警告。