Вызов функции / переменных из отдельных файлов CPP - PullRequest
0 голосов
/ 09 апреля 2011

У меня есть разные CPP-файлы в программе, которую я пишу для удовольствия, и в своем основном файле я вызываю алгоритм из моего cv-файла IsValid.Моему алгоритму IsValid также нужно получить переменную из моего основного файла, электронной почты, а затем я проведу ее через цикл, который я написал.

Мне было интересно, как это сделать, поскольку, если я слышал, что это плохое кодированиеПрактика для включения файлов cpp, и если бы я это сделал, это все равно вызвало бы цикл включения.Есть ли какие-либо предложения по решению этой проблемы.

Код ниже:

#include <iostream>
#include <fstream>
#include "Validation.h"

using namespace std;

#define MAX_SIZE 260
#define NOT_FOUND -1


void main()
{
    //High level alg

    // O) Open input file and output file
    ifstream input("Email.txt");
    ofstream output("Result.txt");

    // Oa) While not at the end of input
    while(!input.eof())
    {
        char email[MAX_SIZE];
        Validation A(email);
        // Ob)Read email input
        input.getline(email, MAX_SIZE);

        // Validat email
        if (A.Valid(email))

        // Write results to output file
        output<< "1" << endl;
        else
        output << "0" << endl;
    }

    system("pause");
}

Второй файл:

#include <iostream>
#include <string>
#include "Validation.h"

using namespace std;

#define NOT_FOUND -1

bool IsValid(char* email)
{
    int Length, atIndex, LocalLength, DomainLength, aCheck = 0;
    char* Invalid = "()[]\\;:,<>";

    // Searches for the NULL terminator at the end of the char array and returns Length of the arry
             Validation a(email);
    Length = a.GetLength;

    if(Length <= 256)
    {
        // Finds the @ char and returns an int variable labeling its position
        Validation b(email, Length);

        atIndex = b.Find;

        aCheck++;

        if(atIndex != NOT_FOUND)
        {
            Validation c(email, atIndex);

            LocalLength = c.CheckLengthLocal;
            DomainLength = c.CheckLengthDomain;

            aCheck++;

            if(LocalLength <= 64 && DomainLength <= 253)
            {
                aCheck++;
                Validation d(email, Invalid, atIndex);

                if(d.ValidCharsL == true && d.ValidCharsD == true)
                {
                    aCheck++;
                    Validation e(email, atIndex, Length);

                    if(c.CheckRuleLocal== true && e.CheckRuleDomain == true)
                    {
                        aCheck++;

                        return true;
                    }
                }
            }
        }
    }
    if(aCheck != 5)
        return false;
}

Третий файл:

#define MAX_SIZE 260
#define NOT_FOUND -1

#include <iostream>

#pragma once

using namespace std;

struct Validation
{
    //Returns the length of text by scanning for null-term
int GetLength(char* text)
{
    int i;
    for(i = 0; text[i] != '\0'; i++)
    {

    }
    return i;
}

Validation::Validation(char* email)
{
    char* emailC = email;

}

Validation::Validation(char* email, int Length)
{
    char* emailC = email;
    int Size = Length;
}

Validation::Validation(char* email, int atIndex, int Length)
{
    char* emailC = email;
    int Size = Length;
    int IndA = atIndex;
}

Validation::Validation(char* email, char* Invalid, int atIndex)
{
    char* emailC = email;
    char* InNum = Invalid;
    int IndA = atIndex;
}

bool Valid(char * email)
{
    char* emailT = email;
}

bool CheckRuleLocal(char* text, int Achar)
{
    int invalid = 0;
    if(text[0] == '.'|| text[Achar - 1] == '.')
        invalid++;
    if(text[0] == '-'|| text[Achar - 1] == '-')
        invalid++;
    for(int i = 0; i < Achar && invalid == 0; i++)
    {
        if(text[i] == '.' && text[i + 1] == '.')
            invalid++;
        if(text[i] == '-' && text[i + 1] == '-')
            invalid++;
    }

    if(invalid > 0)
        return false;
    else
        return true;
}

bool CheckRuleDomain(char* text, int Achar, int length)
{
    int invalid = 0;
    if(text[Achar + 1] == '.'|| text[length - 1] == '.')
        invalid++;
    if(text[Achar + 1] == '-'|| text[length - 1] == '-')
        invalid++;
    for(int i = Achar + 1; i < MAX_SIZE && invalid == 0; i++)
    {
        if(text[i] == '.' && text[i + 1] == '.')
            invalid++;
        if(text[i] == '-' && text[i + 1] == '-')
            invalid++;
    }

    if(invalid > 0)
        return false;
    else
        return true;
}


bool ValidCharsL(char* text, char* invalidCharacters, int Achar)
{
    int invalid = 0;

    for(int i = 0; i < Achar && invalid == 0; i++)
    {
        for(int t = 0; t < GetLength(invalidCharacters); t++)
        {
            if(text[i] == invalidCharacters[t])
                invalid++;
        }
    }
    if(invalid > 0)
        return false;
    else
        return true;
}

bool ValidCharsD(char* text, char* invalidCharacters, int Achar)
{
    int invalid = 0;

    for(int i = Achar + 1; text[i] != '\0'; i++)
    {
        for(int t = 0; t < GetLength(invalidCharacters); t++)
        {
            if(text[i] == invalidCharacters[t])
                invalid++;
        }
    }
    if(invalid > 0)
        return false;
    else
        return true;
}

//Finds the position of @ and returns an int  that will store value if not found returns -1
int Find(char* text, int arraySize)
{
    int AIndex = 0;
    for(int i = 0; i <= arraySize; i++)
    {
        if(text[i] == '@')
            AIndex = i;
    }
        if(AIndex > 0)
            return AIndex;
        else
            return NOT_FOUND;

}


int CheckLengthLocal(char* text, int Achar)
{
    int count = 0;
    for(int i = 0; i != Achar; i++)
    {
        count ++;
    }
    return count;
}

int CheckLengthDomain(char* text, int Achar)
{
    int count = 0;
    for(int i = Achar + 1; text[i] != '\0'; i++)
    {
        count ++;
    }
    return count;
}
};

Ответы [ 2 ]

0 голосов
/ 09 апреля 2011

Создайте заголовочные файлы для ваших cpp-файлов и поместите в них прототипы функций, которые вы хотите представить другим модулям.Вы можете оставить фактические реализации в файлах cpp.Включите заголовки в модули cpp, для компиляции которых нужны заголовки.

Я не просмотрел весь ваш код, но, похоже, у вас нет отдельной переменной, как вы думаете.Переменная, которую вы передаете от main, является реальной переменной.Имя, используемое в прототипе, является просто заполнителем, который заменяется.Модули должны быть скомпилированы, и компоновщик будет их разбирать.

Может быть, начнем с чего-то более простого, с одной или двумя функциями в отдельном модуле, пока вы не освоитесь?

0 голосов
/ 09 апреля 2011

Обычно не принято связывать отдельные модули и функции вместе с глобальными переменными. Но если вы сделаете один из способов, используйте декларацию extern в заголовочном файле с фактической переменной, объявленной в одном из ваших файлов cpp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...