too many data types in declaration

0

Witam,
wziąłem się za napisanie klasy do obsługi transferu po porcie com

i wywala mi dwa błędy, nie zabardzo wiem co z nimi zrobić, ponad to potrzebowałbym drobnej pomocy w sprawie dostępu z zewnątrz do prywatnej tablicy. chcę ją pobierać z obiektu za pomocą getBuffer(); - jak zwrócić całą tablicę tak żebym mógł w programie się odnosić do poszczególnych jej komórek?
np:

transmisja = new RS232;
char bufor = transmisja->getBuffer();
cout << bufor[3]; //na przykład
 

błędy:

C:\Users\user\Desktop\Piotr-Placzek\INNE\commPort_Terminal\nienazwany\main.cpp:12: błąd:new types may not be defined in a return type
C:\Users\user\Desktop\Piotr-Placzek\INNE\commPort_Terminal\nienazwany\main.cpp:12: (perhaps a semicolon is missing after the definition of 'RS232')
C:\Users\user\Desktop\Piotr-Placzek\INNE\commPort_Terminal\nienazwany\main.cpp:37: błąd:two or more data types in declaration of 'comPortOpen'

moja klasa:

#include <iostream>
#include <string>
#include <windows.h>

using namespace std;

#define FRAME_SIZE 8

class RS232{
private:
	static DCB dcb;
	static HANDLE hNumPort;
	static char lpBuffor_read[FRAME_SIZE], lpBuffor_write[FRAME_SIZE];
	static DWORD RS_ile;

public:
	bool comPortOpen(wstring ComID);
	bool comPortConfig(int BR, bool fparity, int parity, int stopbits);
    void comPortClose();
	bool comPortWrite();
	bool comPortRead();	
	bool setBuffer(char *buff);
	char getBuffer();

}

bool RS232::comPortOpen(wstring ComID){
    hNumPort = CreateFile(ComID.c_str(), GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    if(hNumPort){
        return true;
    }else{
        return false;
    }
}

bool RS232::comPortConfig(int BR, bool fparity, int parity, int stopbits){
    dcb.DCBlength = sizeof(dcb);
    dcb.BaudRate = BR;
    dcb.fParity = fparity; //TRUE
    dcb.Parity = parity; //
    dcb.StopBits = stopbits; //ONESTOPBIT
    dcb.ByteSize = 7; //od 5 do 7
    dcb.fDtrControl = DTR_CONTROL_ENABLE;
    dcb.fRtsControl = RTS_CONTROL_ENABLE;
    dcb.fOutxCtsFlow = FALSE;
    dcb.fOutxDsrFlow = FALSE;
    dcb.fDsrSensitivity = FALSE;
    dcb.fAbortOnError = FALSE;
    dcb.fOutX = FALSE;
    dcb.fInX = FALSE;
    dcb.fErrorChar = FALSE;
    dcb.fNull = FALSE;

    return SetCommState(hNumPort, &dcb);
}

void RS232::comPortClose(){
    CloseHandle(hNumPort);
}

bool RS232::comPortWrite(){
    return WriteFile(hNumPort, &lpBuffor_write, strlen(lpBuffor_write), &RS_ile, 0);
}

bool RS232::comPortRead(){
    return ReadFile(hNumPort, lpBuffor_read, FRAME_SIZE, &RS_ile, 0);
}

bool RS232::setBuffer(char *buff){
    if(sizeof(buff)>FRAME_SIZE){
        return false;
    }
    else{
        for(int i=0;i<FRAME_SIZE;++i){
            lpBuffor_write[i] = buff[i];
        }
        return true;
    }
}

char RS232::getBuffer(){
}
1

Po deklaracji klasy za zamykającym } postaw średnik.

0

Teraz mam 20 błędów typu
C:\Users\user\Desktop\Piotr-Placzek\INNE\commPort_Terminal\nienazwany\main.cpp:42: błąd:undefined reference to RS232::dcb'`
i dotyczą każdej prywatenej zmiennej użytej w metodach ;/

1

Zmienne statyczne musisz inicjalizować, np.

class A {
    static int x;
};
int A::x = 0;
0

DZIĘKI na razie zrobiłem je jako zwykłe zmienne i ruszyło.
zastanawiam sie jeszcze nad char RS232::getBuffer(); żeby zwracała całą tablicę..
Ale może zrobię tak żeby zwracała tylko konkretny bajt... chyba, że znajdzie się jakieś rozwiązanie, wolałbym jednak zwracać całą tablicę char.

@Edit
może tak awaryjnie to zostawić:

char RS232::getBuffer(int bufByte){
    if(bufByte>FRAME_SIZE && bufByte<1){
        return (char)-1;
    }
    else{
        return lpBuffor_read[(bufByte-1)];
    }
}
0
size_t RS232::copyBuffer(char Buffer[],size_t BufferSize){ ...
0
char bufor = transmisja->getBuffer();
cout << bufor[3]; //na przykład

Odwołujesz się do zwykłego chara jak do tablicy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1