- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我编写了一个程序来接收两个多项式并计算它们的和乘法。
程序以这种形式得到一个多项式
"2 4 -5 1 0 6 6 4 -8 0 7 3"
并将其转化为多项式形式:“8x^4+7x^3-5x-8”
我想我对多项式求和函数有问题,因为它确实显示了乘法结果。
这是我得到的错误:
*** Error in `./vpl_execution': realloc(): invalid next size: 0x000000000070c210
***
/home/p18206/.vpl_launcher.sh: line 9: 25054 Aborted (core dumpe
d) ./vpl_execution
还有另一个错误:
ome/p13634/.vpl_launcher.sh: line 9: 25304 Segmentation fault (core dumpe
d) ./vpl_execution
我真的尝试了一切,我知道这是一个分配问题,但我就是不明白为什么。
所以在下面的代码中,请检查函数“print polySum”。也有可能是函数“sum same power poly”或者“print polynom”有问题
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct monom {
int coefficient;
int power;
}Monom;
//defining bool data type
typedef int bool;
#define TRUE 1
#define FALSE 0
#define MEMORY_ERROR_EXIT -1
void polyMerge(Monom* arr1, unsigned int size1, Monom* arr2, unsigned int size2, Monom* res);
void polySort(Monom* polynom, unsigned int size);
void removeElement(Monom* polynomArr, unsigned int size);
Monom* sumSamePowerPoly(Monom* polynomArr, unsigned int* size);
Monom* getPolynom(unsigned int* size);
void printPolynom(Monom* polynom, unsigned int size);
void printPolySum(Monom* polynom1, unsigned int size1, Monom* polynom2, unsigned int size2);
void printPolyMul(Monom* polynom1, unsigned int size1, Monom* polynom2, unsigned int size2);
void checkMemoryAllocation(void *ptr);
void main()
{
Monom *polynom1, *polynom2; // The input polynoms
unsigned int polynom1Size, polynom2Size; // The size of each polynom
printf("Please enter the first polynom:\n");
polynom1 = getPolynom(&polynom1Size); // get polynom 1
printf("Please enter the second polynom:\n");
polynom2 = getPolynom(&polynom2Size); // get polynom 2
printf("The multiplication of the polynoms is:\n"); // print the multiplication
printPolyMul(polynom1, polynom1Size, polynom2, polynom2Size);
printf("\n");
printf("The sum of the polynoms is:\n"); // print the sum
printPolySum(polynom1, polynom1Size, polynom2, polynom2Size);
printf("\n");
free(polynom1); // releasing all memory allocations
free(polynom2);
}
Monom* getPolynom(unsigned int* size) {
/*This function recieve data from user*/
unsigned int phySize = 1, logSize = 0;
int currCofficient, currPower;
bool lContinue = TRUE; // a flag that keeps that signal if we should keep recieving input
Monom* polyArr;
polyArr = (Monom*)malloc(sizeof(Monom)*phySize);
checkMemoryAllocation(polyArr);
while (lContinue) { //while the user didn't press enter we keep on recieving input
scanf("%d%d", &currCofficient, &currPower);
if (currCofficient != 0) { //if the current cofficient is 0 we do nothing. Else we insert the input to the array
//if the logic size equal to the physical size we double the phySize and reallocate array with the new size
if (logSize == phySize) {
phySize *= 2;
polyArr = (Monom*)realloc(polyArr, sizeof(Monom)*phySize);
checkMemoryAllocation(polyArr);;
}
polyArr[logSize].coefficient = currCofficient; //we locate the input on the current position (logical size)
polyArr[logSize].power = currPower;
logSize++; //we increment logical size of the array
}
if (getchar() == '\n') // the user pressed enter - the flag is "turned off", and we stop receiving input
lContinue = FALSE;
}
*size = logSize; //size recieve the value "log size" which is the actual size of the array
polySort(polyArr, *size); //we sort the array based on power sizes
polyArr = sumSamePowerPoly(polyArr, size); //we unite Monoms that has the same power
return polyArr;
}
void polyMerge(Monom* arr1, unsigned int size1, Monom* arr2, unsigned int size2, Monom* res) {
/*This function merges two Monom arrays into one monom array sorted by powers from the biggest power to the smallest one*/
unsigned int i = 0, j = 0, k = 0;
while (i < size1 && j < size2) {
if (arr1[i].power > arr2[j].power)
res[k++] = arr1[i++];
else
res[k++] = arr2[j++];
}
while (i < size1) //While i<size1 keep copying values from array 1 to result array
res[k++] = arr1[i++];
while (j < size2) //While j<size2 keep copying values from array 2 to result array
res[k++] = arr2[j++];
}
void polySort(Monom* polynom, unsigned int size) {
/*This function sort a Monom array from the biggest power to the smalles one*/
Monom* temp;
unsigned int i;
if (size == 1)
return;
else {
polySort(polynom, size / 2);
polySort(polynom + size / 2, size - size / 2);
temp = (Monom*)malloc(sizeof(Monom)*size); //We temporary allocate an array that will keep the result of the merge
checkMemoryAllocation(temp);
polyMerge(polynom, size / 2, polynom + size / 2, size - size / 2, temp);
for (i = 0; i < size; i++) //We copy the temporary array into our data array
polynom[i] = temp[i];
free(temp); //We delete the allocated memory for the temporary array
}
}
Monom* sumSamePowerPoly(Monom* polynomArr, unsigned int* size) {
/*This function sum polynoms from the same degree to one polynom*/
unsigned int i;
for (i = 0; i < *size - 1; i++) { //We check for each Monom in the array if there are other monoms with the same power
while (polynomArr[i].power == polynomArr[i + 1].power) { //while power of a monom is eqaul to the power of other monoms
polynomArr[i].coefficient += polynomArr[i + 1].coefficient; //we add the next monom to the first one
removeElement(polynomArr + i + 1, *size - i); //and remove the monom we just united into another cell
*size -= 1;
}
}
polynomArr = (Monom*)realloc(polynomArr, sizeof(Monom)*(*size));
return polynomArr;
}
void removeElement(Monom* polynomArr, unsigned int size) {
/*This function removes an element from array*/
unsigned int i;
for (i = 0; i < size; i++) { //We copy each cell into the prior one
polynomArr[i] = polynomArr[i + 1];
}
}
void printPolynom(Monom* polynom, unsigned int size) {
/*This function prints polynom*/
unsigned int i;
for (i = 0; i < size; i++) {
if (polynom[i].power > 1) //if the power is bigger than one that print this form: coffx^power
printf("%dx^%d", polynom[i].coefficient, polynom[i].power);
else if (polynom[i].power == 1) //else if the power is one than print this form: coffx
printf("%dx", polynom[i].coefficient);
else //else print this form: coff
printf("%d", polynom[i].coefficient);
if (i < size - 1 && polynom[i + 1].coefficient > 0) //if there is another element after the current element and its
//cofficient is larger than 0 - print "+"
printf("+");
}
}
void printPolySum(Monom* polynom1, unsigned int size1, Monom* polynom2, unsigned int size2) {
/*This function print the sum of two polynoms*/
unsigned int i, j;
unsigned int size;
size = size1 + size2; //We set the size of sum result to be size of both of the polynoms
Monom* sumRes; //We create a sum result array
sumRes = (Monom*)malloc(sizeof(Monom)*size);
checkMemoryAllocation(sumRes);
//We copy each element from both of the polynoms array into the result array
for (i = 0; i < size1; i++)
sumRes[i] = polynom1[i];
for (i = size1, j = 0; i < size && j < size2; j++, i++) {
sumRes[i] = polynom2[j];
}
polySort(sumRes, size); //We sort all of the elements by power size
//We unite all of the cells who has the same power. This action actually sums both of the polynoms to one poly sum.
sumRes = sumSamePowerPoly(sumRes, &size);
printPolynom(sumRes, size); //We print sum reault
free(sumRes); //We free the sum result array after printing it
}
void printPolyMul(Monom* polynom1, unsigned int size1, Monom* polynom2, unsigned int size2) {
/*This function prints the multiplication of two polynoms*/
unsigned int i, j, k, size;
i = 0;
Monom* mulRes;
size = size1 * size2; //We set the size of sum result to be the multiplication of both of the polynoms size
mulRes = (Monom*)malloc(sizeof(Monom)*size); //We create a multiplication result array in which we will store the result of multiplying polynoms
checkMemoryAllocation(mulRes);
Monom temp; //We creat a temporary data type monom in which we will save the calculation of each multiplication
//We multiply the polynoms and keep the multiplication result in the mulRes array
for (j = 0; j < size1; j++) {
for (k = 0; k < size2; k++) {
temp.coefficient = polynom1[j].coefficient*polynom2[k].coefficient;
temp.power = polynom1[j].power + polynom2[k].power;
mulRes[i++] = temp;
}
}
polySort(mulRes, size); //We sort all of the elements by power size
mulRes = sumSamePowerPoly(mulRes, &size); //We unite all of the cells who has the same power
printPolynom(mulRes, size); //We print the multiplication result
free(mulRes); //We free the multiply result array after printing it
}
void checkMemoryAllocation(void *ptr)
/*This function check if the dynmic allocation we did has succseeded */
{
if (ptr == NULL)
{
printf("Memory allocation error\n");
exit(MEMORY_ERROR_EXIT);
}
}
这是预期的结果:多项式的乘法是:64x^8+112x^7+49x^6-80x^5-198x^4-112x^3+25x^2+80x+64多项式之和为:16x^4+14x^3-10x-16
非常感谢您抽出宝贵时间!
最佳答案
在函数 GetPolynom 中我发现了这个:
if (logSize == phySize) {
phySize *= 2;
polyArr = (Monom*)realloc(polyArr, sizeof(Monom)*phySize);
checkMemoryAllocation(polyArr);;
}
这意味着您正在重新分配以指数形式增长的大小sizeof(Monom) * 2^(n-1)n 是“while”构造中当前循环的数量。
我认为你应该改变
phySize *= 2;
对于
phySize += 1;
希望这对您有所帮助。
关于c - 我该如何解决这个分配问题(核心转储)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57358014/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!