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<T_point> pointList;了
后面没必要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/c++ 数据库连接时编译出错

c语言编程,请大神告诉哪里出错了 void menu()/* 界面 */ #include<std

C#/VB.NET中 UDP协议连接服务器问题...运行没出错..但是收不到信息.

Linux编译C语言时出错 /home/zwlong/222/LESduct2.c:323: undefined reference to `sqrt'

电脑开机出现加载C:/WINDOW/system32/jtsjv.dll出错找不到指定模块的原因

无法从 Objective C 插件返回到 Ionic/Cordova 应用程序时出错