• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Ошибка Линкера

  • Автор темы DenisNN
  • Дата начала
D

DenisNN

Здравствуйте! Подскажите пожалуйста в чем здесь дело? Объявил extern указатели в файле .h, а использую в main.cpp, и компилятор постоянно выдает LINK ошибки.
parser.h
C++:
/*
parser.h
vc_size - variables & constants buffer.

token - external representation of token. Остается всегда в верху - не изменяется в функциях, изменяется по средствам временных указателей temp.
prog  - main external program. 

temp  - internal function point. Временных указателей в функциях который изменяет token. 
tokenT - internal representation of token 

*/

#pragma once

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <conio.h>
#include <cctype>

using namespace std;

///// Is alpha token ////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////

const int vc_size = 20;
const int PROG_SIZE = 10000;



enum tokenT {UNDEFTOK, NUMBER, OPERATOR}; // The internal representation of token

extern char token[80];	// External representation.
extern char *prog;		// External program.
extern char *p_buff; 

extern tokenT token_type; // Internal oken type

class parser
{

public:
///// variables /////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
bool is_sp_tab(char*);  // Пробел или табуляция
bool is_delimiter(char*); // Разделитель
};

tokenT get_token();

parser.cpp
C++:
#include "parser.h"
/*
tokenT get_token()
{
register char *temp;

token_type = UNDEFTOK;
temp = token;

if(*prog == '\0')
*token = '\0';
return(token_type = OPERATOR);


}
*/

///// Пробел или табуляция //////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////

bool parser::is_sp_tab(char *prg)	
{
if(*prg == ' ' || *prg == '\t')
{ cout << "Space" << endl;
return true;
}
cout << "No space" << endl;
return false;
}

main.cpp
C++:
#include "parser.h"

int main()
{
parser ob;
prog = new char[PROG_SIZE];

cin >> prog;

p_buff = prog;

ob.is_sp_tab(p_buff);

//get_token();

return 0;
}
 
R

rrrFer

extern используется для объявления (это не то же что определение)
впишите ИЛИ в main.cpp ИЛИ в parser.cpp
Код:
char token[80];	// External representation.
char *prog;		// External program.
char *p_buff;
и заработает.
Хотя, я бы не советовал использовать extern, поддерживать такой код не приятно, возможны разные головные боли )
Вообще в С++ есть тьма всяких штук, которые не стоит использовать (ну или хотя бы стоит стараться обходить стороной)
 
R

rrrFer

Пожалсто, спрашивай еще :)
По коду, у тебя еще память вытекает, походу. из под массива "prog"
 
R

rrrFer

утечки в твоей программе. Если память выделяется new - то должна быть освобождена delete или delete[]
а delete[] где? -МБ и есть, но мне не по глазам? )
 
D

DenisNN

Ааа!!! Понятно!! Ну забыл я, забыл!)))
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!