c/c++这程序哪出错了
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c/c++这程序哪出错了相关的知识,希望对你有一定的参考价值。
读取数据
其中定义有
vector<T_point> pointList;
class T_point
public:
double x;
double y;
T_point();
virtual ~T_point();
;
开始读数据
float xmin,xmax,ymin,ymax;
while(file.ReadString(strLine))
float x,y;
sscanf(strLine,"%f %f",&x,&y);
T_point point;
point.x = x;
point.y = y;
pointList.push_back(point);
xmin=pointList[0].x;
xmax=pointList[0].x;
ymin=pointList[0].y;
ymax=pointList[0].y;
找最大最小值
vector<pointList>pot;
for(vector<pointList>::iterator iter=pot.begin();iter!=pot.end();++iter)
if(xmin>pointList[0].x) xmin=pointList[0].x;
if(xmax<pointList[0].x) xmax=pointList[0].x;
if(ymin>pointList[0].y) ymin=pointList[0].y;
if(ymax<pointList[0].y) ymax=pointList[0].y;
编译时报错
error C2974: 'std::vector' : 模板 对于 '_Ty'是无效参数,应为类型
这要怎么改?
要是改成
for(int j=0;j<pointlist.size();j++)
if(xmin>pointList[0].x) xmin=pointList[0].x;
if(xmax<pointList[0].x) xmax=pointList[0].x;
if(ymin>pointList[0].y) ymin=pointList[0].y;
if(ymax<pointList[0].y) ymax=pointList[0].y;
呢?
最大最小值怎么都是第一个数呢。。
后面没必要vector<pointList>pot; 而且你这里模板实例化需要的是类型名,你写入一个变量名是不对的,至少也得vector<T_point>pot;
for(vector<pointList>::iterator iter=pot.begin();iter!=pot.end();++iter)
if(xmin>pointList[0].x) xmin=pointList[0].x;
if(xmax<pointList[0].x) xmax=pointList[0].x;
if(ymin>pointList[0].y) ymin=pointList[0].y;
if(ymax<pointList[0].y) ymax=pointList[0].y;
使用迭代器的话,循环中你得用上iter啊,不然你的比较不是和当前元素比较了
for(vector<pointList>::iterator iter=pointList.begin();iter!=pointList.end();++iter)
if(xmin>iter->x) xmin=iter->x;
if(xmax<iter->x) xmax=iter->x;
if(ymin>iter->y) ymin=iter->y;
if(ymax<iter->y) ymax=iter->y;
for(int j=0;j<pointlist.size();j++)
if(xmin>pointList[0].x) xmin=pointList[0].x;
if(xmax<pointList[0].x) xmax=pointList[0].x;
if(ymin>pointList[0].y) ymin=pointList[0].y;
if(ymax<pointList[0].y) ymax=pointList[0].y;
这里也是pointList[0]改成pointList[j]来自:求助得到的回答 参考技术A vector<pointList>pot;
pointList不是类型啊!不能这样定义的。
vector<T_point> pot才对。
比较那个段也有问题啊!你的元素都没有移动的,改成下面这样吧!
for(int j=0;j<pointlist.size();j++)
if(xmin>pointList[j].x) xmin=pointList[j].x;
if(xmax<pointList[j].x) xmax=pointList[j].x;
if(ymin>pointList[j].y) ymin=pointList[j].y;
if(ymax<pointList[j].y) ymax=pointList[j].y;
参考技术B ~泛型,vector<pointList>pot;pointList不是类型,所以才会有erro C2974. 参考技术C pointList[0].x 这里都是0,改成j才行吧。
核心转储,如何增加矩阵维度(可用),在 C 中释放 2d 指针时出错
【中文标题】核心转储,如何增加矩阵维度(可用),在 C 中释放 2d 指针时出错【英文标题】:Core dumped, how to increase matrix dimension(usable), error in freeing 2d pointer in C 【发布时间】:2017-08-26 16:00:41 【问题描述】:这是一个简单的程序。目标是,
-
删除核心转储错误或以某种方式处理更大维度的矩阵。虽然,我使用了动态内存分配。
在这个程序中,我为释放指针做了一个注释,如果我不做注释就会出错。但据我所知,列应该比指针行首先空闲,这不是在这里发生的,为什么会这样?
如果有任何方法可以优化此代码或建议或改进或编程的好习惯,欢迎您
程序在这里,
#include <stdio.h>
#include <math.h>
#include <complex.h>
#include <stdlib.h>
int main ()
int i,j,N=724; // core dumped start from 724 (least) on my laptop
double complex var[N][N], **array;//, **var1, **var2,;
// ALLOCATIONG 2D ARRAY
array = malloc(N * sizeof *array + (N * (N * sizeof **array)));
// SOMETHING WITH "var" AND ASSIGN TO 2D POINTER "array"
for ( i = 0; i < N; i++)
for ( j = 0; j < N; j++)
var[i][j] = (i+j)+((i+50)*j)*I;// SOMETHING WITH "var"
printf("Value of var 1st time[%i,%i] = %f\t%f\n", i,j, var[i][j], cimag(var[i][j]));
for ( j = 0; j < N; j++)
*(array+j)=&var[j][0];//ASSIGNING TO POINTER
printf("\n\n\n\n");
for ( i = 0; i < N; i++)
for ( j = 0; j < N; j++)
printf("Value of array[%i,%i] = %f\t%0f\n", i,j, creal(*(*(array+i)+j)),cimag(*(*(array+i)+j)) );
/* // BLOW LOOP FOR FREEING, GIVES ERROR
for (int i=0; i<N; i++)
free(array[i]);
*/
free(array); // THIS IS (MAY BE, I DON'T KNOW) FOR ONLY FREEING ROW POINTERS
return 0;
【问题讨论】:
你有足够大的堆栈来容纳 524176 个数组元素吗? 我不知道如何检查堆栈内存。但是我的内存(RAM)在运行时大约有 5.8 GB(大约 8 GB)是可用的。 程序栈不会得到所有这些,它被分配了一个特定的数量,而且不是很多。程序堆栈不会从可用资源中动态增长。我不明白为什么代码定义了这个大型本地数组,然后分配内存以指向其元素。为什么不只为数据本身分配内存? 对不起,但我的(核心)领域不是计算机科学,所以我可能无法理解。但最终我想让事情正常工作,所以我问了。感谢您推荐类似“Valgrind”的工具。我不知道这些工具。 你的意思是 var[N][N] 吗?而不是我将其值分配给数组,而不是直接?实际上我已经这样做了,但是即使在那之后 N=724 也是极限。所以我认为可能还有其他错误,因为限制应该上升。 【参考方案1】:错误原因是释放未动态分配的内存。
这里
double ** array = malloc(X * sizeof(double *));
您已为指向 double 的 X
指针分配了空间,但没有为任何这些指针分配空间。
对于每个指针/行,您必须分别分配空间,否则取消引用它们会导致未定义的行为。
Here is example how to work with array of pointers which you should apply on your usecase.
也不是这种语义
*(array+j)
你应该使用(为了更好的可读性)
array[j]
【讨论】:
谢谢,菲利普。我的动态分配方法错了吗?有没有其他方法可以按照我定义的方式释放内存?核心转储呢? 不是我的 DV,但double ** array = malloc(N * sizeof *array + (N * (N * sizeof **array)));
的整个想法很奇怪。
当然这很奇怪,但它的 OP 代码。 @STRANGE 请看一下HERE(click),希望您了解如何分配/释放指针数组。
我很高兴它对您有所帮助,我(可能还有其他人)可以建议您以更小的步骤创建程序。创建一个大程序然后调试它不是最好的方法,即使对于没有经验的人也是如此。制作小而清晰且正确的步骤 :-) 更容易理解和发现错误。
@STRANGE 在这里查看 -- ideone.com/xuq0dG。我不得不删除这些复杂的东西,因为我没有那个库,但它现在可以编译,所以只需添加“复杂”和这些函数,它应该运行良好:-)以上是关于c/c++这程序哪出错了的主要内容,如果未能解决你的问题,请参考以下文章
c语言编程,请大神告诉哪里出错了 void menu()/* 界面 */ #include<std
C#/VB.NET中 UDP协议连接服务器问题...运行没出错..但是收不到信息.
Linux编译C语言时出错 /home/zwlong/222/LESduct2.c:323: undefined reference to `sqrt'