ошибка во время выполнения в vc

#c #visual-c

#c #visual-c

Вопрос:

мой проект содержит несколько классов (1 из них — Point3D) и cpp (CreatePoint.cpp ) и заголовочный файл (CreatePoint.h).

мой файл stdafx.h

 // stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>


// TODO: reference additional headers your program requires here

#include "CreatePoint.h"
#include "Point3D.h"
#include "Vector3D.h"
#include "Sys.h"
  

мой файл CreatePoint.h

 #include "stdafx.h"
#pragma once
#include "Point3D.h"


//*******************************************************************
void initialise();

//*******************************************************************
Point3D *get_point(int);

//*******************************************************************
int get_index(Point3D *);

//*******************************************************************
Point3D *create_point();

//*******************************************************************
void del_point(Point3D *);

//*******************************************************************
void destruct_point();
  

мой CreatePoint.cpp файл является

 #include "stdafx.h"
#include "CreatePoint.h"

int counter;
int size = 50;
Point3D *point[];
//*******************************************************************
void initialise()//run this func each time point[] is created
{
    counter = 0;
    for(int i = 0; i<size; i  )
    {
    point[i] = '';
}
}

//*******************************************************************
Point3D *get_point(int index)
{
    return point[index];
}

//*******************************************************************
int get_index(Point3D *p)
{
    for(int i = 0; i<size; i  )
{
    if(point[i] == p)
        return i;
}
}

//*******************************************************************
Point3D *create_point()
{
point[counter] = new Point3D;
counter  ;
return point[counter];
}

//*******************************************************************
void del_point(Point3D *p)
{
int d = get_index(p);
delete point[d];
}

//*******************************************************************
void destruct_point()
{
delete [] point;
}
  

я получаю ошибку во время выполнения :

 CreatePoint.obj : error LNK2001: unresolved external symbol "class Point3D * * point" (?point@@3PAPAVPoint3D@@A)
1>C:Documents and Settingsmy documentsvisual studio 2010ProjectsMathsDebugMaths.exe : fatal error LNK1120: 1 unresolved externals
  

я искал в Интернете, и в основном причиной такого сбоя является отсутствие stdafx.h в 1-й строке каждого файла… но я уже включил ее.
я также получаю некоторое предупреждение для последней функции destruct_point() ->

 mathsmathscreatepoint.cpp(51): warning C4154: deletion of an array expression; conversion to pointer supplied
  

Комментарии:

1. LNK2001 это ошибка компоновщика, а не ошибка времени выполнения.

Ответ №1:

LNK2001 это ошибка компоновщика, а не ошибка времени выполнения.

Point3D *point[]; похоже, это объявление, но не создание экземпляра. То есть эта строка сообщает компилятору, что эта переменная будет существовать где-то позже. Потому что массивы должны иметь размер для создания экземпляра. (Я даже не знал, что [] без размера разрешен в этой области)

Измените это на Point3D *point[size]; , и это фактически создаст массив. Кроме того, size должно быть a const int .

[Править]
destruct_point() пытается удалить весь массив точек. Поскольку массив распределен статически, это недопустимо. Поскольку у вас уже есть функция для удаления отдельных точек, я не могу себе представить, почему эта функция существует. Поскольку массив не был объявлен с new[] помощью, вы НЕ должны использовать delete[] его.

Комментарии:

1. …большое спасибо, это сработало… но как насчет предупреждения, которое я упомянул в конце?

2. Вы не выделили массив с new[] помощью, поэтому он вам не нужен delete[] . Вам не нужна эта функция.

3. я узнал в msdn, что это должно быть delete [] amp;point; msdn.microsoft.com/en-us/library/f7h7y2d3.aspx еще раз большое спасибо..

4. @CAD_coding: НЕТ. Массив в их демонстрации выделяется new[] в седьмой строке. У вас нет. Вы не должны использовать delete[] или delete на нем ни один из них.