Я пытаюсь вызвать пустую функцию с именем correction(original,corrected)
и когда я пытаюсь скомпилировать его, я получаю пару ошибок вида:
ошибка: ожидаемое первичное выражение перед токеном ‘}
Вот мой полный код:
#include <cstdio>
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
using namespace std;
void correction(ifstream& original,ofstream& corrected);
int main ()
{
ifstream original;
ofstream corrected;
char filename[16];
cout<<"Enter filename:\n";
cin>>filename;
original.open(filename);
corrected.open("corrected.txt");
if (original.fail( ))
{
cout << "Input file opening failed.\n";
exit(1);
}
if (corrected.fail( ))
{
cout << "Input file opening failed.\n";
exit(1);
}
else
{
correction(original,corrected);
}
return 0;
}
void correction(ifstream& original,ofstream& corrected)
{
char symbol;
while(! original.eof())
{
original.get(symbol);
if (symbol== 'c')
{
corrected.put(symbol);
original.get(symbol);
if (symbol=='i')
{
corrected.put(symbol);
original.get(symbol);
if (symbol=='n')
{
corrected.put(symbol);
original.get(symbol);
while (symbol==' ')
{
original.get(symbol);
}
for (symbol=='<')
{
corrected.put('>');
original.get(symbol);
}
corrected.put(symbol);
}
}
if (symbol=='o')
{
corrected.put(symbol);
original.get(symbol);
if (symbol=='u')
{
corrected.put(symbol);
original.get(symbol);
if (symbol=='t')
{
corrected.put(symbol);
original.get(symbol);
while (symbol==' ')
{
original.get(symbol);
}
for (symbol=='>')
{
corrected.put('<');
original.get(symbol);
}
corrected.put(symbol);
}
}
}
}
else
corrected.put(symbol);
}
return;
}
Когда я пытаюсь скомпилировать этот код, я получаю следующие ошибки:
operator.cpp: 59: 23: ошибка: ожидается токен ‘;’ before ‘) ‘
для (символ == ‘<«)
^ operator.cpp: 65: 5: ошибка: ожидаемое первичное выражение перед токеном ‘}’
}
^ operator.cpp: 65: 5: ошибка: ожидается ‘)’ до ‘}’ token>> operator.cpp: 65: 5: ошибка: ожидается основное выражение до ‘}’
знак
operator.cpp: 65: 5: ошибка: ожидается токен ‘;’ before ‘}’
operator.cpp: 83: 20: ошибка: ожидается токен ‘;’ before ‘)’
для (символ == ‘>’)
^ operator.cpp: 89: 9: ошибка: ожидаемое первичное выражение перед токеном ‘}’
}
^ operator.cpp: 89: 9: ошибка: ожидается ‘)’ до ‘}’ token operator.cpp: 89: 9: ошибка: ожидается основное выражение до ‘}’
token operator.cpp: 89: 9: ошибка: ожидается ‘;’ перед ‘}’ токеном
Я новичок в программировании и потратил пару часов, пытаясь это исправить, но я не понимаю, в чем проблема.
Любая помощь очень ценится!
-4
Решение
Добавил позже, внимательно изучив ответ @ liup:
О, мой плохой, ОП, вероятно, действительно имел в виду использовать цикл здесь! Затем вы можете использовать цикл while следующим образом:
while (symbol=='<')
а также
while (symbol=='>')
Старый ответ:
Вот:
if (symbol=='<')
и здесь:
if (symbol=='>')
Вместо for (symbol=='<')
а также for (symbol=='>')
,
Ошибка связана с тем, что в for
цикл, вы должны иметь все три предложения, даже если они пусты, следовательно, две точки с запятой ;
обязательны Вы только при условии один не предоставил ни одной точки с запятой в каждом из двух неправильных for
заявления.
Для справки см. для описания цикла в cppreference
1
Другие решения
И то и другое for (symbol=='<')
а также for (symbol=='>')
неправильный синтаксис цикла. В этом сценарии вы можете использовать для цикла следующим образом.
for (; symbol == '<';)
{
corrected.put('>');
original.get(symbol);
}
for (; symbol == '>';)
{
corrected.put('<');
original.get(symbol);
}
ИЛИ ЖЕ
for (; symbol == '<';original.get(symbol))
{
corrected.put('>');
}
for (; symbol == '>';original.get(symbol))
{
corrected.put('<');
}
1
I have tried many times to solve this problem but i got nothing.
The main purpose of this code is saving pair keys (Public and Private) in nested class NslObject::KeyK
or NewKeyPair1
.
.cpp file
unsigned long int keyLength = 10;
//KeyPair ADD(RSA::GenerateKeyPair(keyLength));
NslObject::KeyK(RSA::GenerateKeyPair(keyLength));
typedef NslObject::KeyK NewKeyPair1;
NewKeyPair1(RSA::GenerateKeyPair(keyLength));
//NslObject::
Key OtmanK(NslObject::Get_PublicKey(NewKeyPair1));
.h file:
#ifndef __NCTUNS_nslobject_h__
#define __NCTUNS_nslobject_h__
#include <stdio.h>
#include <event.h>
//---------------------------------------------------
#include <cstdlib> //srand()
#include <iostream> //cout
#include <ctime> //time()
#include <cstring> //strcmp()
//#include "test.h" //testing functions
#include "RSA.h" //GenerateKeyPair()
#include "PrimeGenerator.h" //Generate()
//#include <stdio.h>
#include <stdlib.h>
#include <sstream>
#include <string>
//---------------------------------------------------
class MBinder;
struct plist {
u_int8_t pid;
struct plist *next;
};
struct MBlist {
u_int8_t portnum;
MBinder *sendt;
struct MBlist *next;
};
/*=========================================================================
Define Macros
=========================================================================*/
#define DISABLED 0x00
#define ENABLED 0x01
/*=========================================================================
Define Class ProtoType
=========================================================================*/
class NslObject {
private:
char *name_; /* Instance name */
const u_int32_t nodeID_; /* Node Id */
const u_int32_t nodeType_; /* Node type, eg: SWITCH, HOST.. */
u_int32_t portid_; /* port Id */
struct plist *MPlist_;
// static KeyPair NewKeyPair;
public :
/* add for new structure engine*/
u_int32_t pdepth;
struct MBlist *BinderList;
u_int8_t PortNum;
//------------------------------------------------
class KeyK {
private :
KeyPair Kk;
public:
KeyK( KeyPair D1): Kk(D1)
{}
const Key &GetPrivateKey() const
{
return Kk.GetPrivateKey();
}
const Key &GetPublicKey() const
{
return Kk.GetPublicKey();
}
//KeyK NewKeyPair ;
};
Key Get_PrivateKey(KeyK &K){
return K.GetPrivateKey();
}
Key Get_PublicKey(KeyK &K){
return K.GetPublicKey();
}
//static KeyPair *KeyPtr1 ;//= new KeyPair;
//------------------------------------------------
u_char s_flowctl; /* flow control for sending pkt */
u_char r_flowctl; /* flow control for receiving pkt */
MBinder *recvtarget_; /* to upper component */
MBinder *sendtarget_; /* to lower component */
NslObject(u_int32_t, u_int32_t, struct plist*, const char *);
NslObject();
virtual ~NslObject();
virtual int init();
virtual int recv(ePacket_ *);
virtual int send(ePacket_ *);
virtual int get(ePacket_ *, MBinder *);
virtual int put(ePacket_ *, MBinder *);
virtual ePacket_ *put1(ePacket_ *, MBinder *);
virtual int command(int argc, const char *argv[]);
virtual int Debugger();
inline void set_port(u_int32_t portid) {
portid_ = portid;
};
inline u_int32_t get_port() const {
return(portid_);
};
inline struct plist* get_portls() const {
return(MPlist_);
};
inline const char * get_name() const {
return(name_);
}
inline u_int32_t get_nid() const {
return(nodeID_);
}
inline u_int32_t get_type() const {
return(nodeType_);
}
//--------------------------------------------------------
};
so, the problem in this line in cpp file :
Key OtmanK(NslObject::Get_PublicKey(NewKeyPair1));
when i tried to compile this project, i got this Error message:
object.cc:87: error: expected primary-expression before ‘)’ token
please, help me.
when i tried to make a directed call for key class, the other problem was appeared such as :
unsigned long int keyLength = 10;
//KeyPair ADD(RSA::GenerateKeyPair(keyLength));
NslObject::KeyK(RSA::GenerateKeyPair(keyLength));
typedef NslObject::KeyK NewKeyPair1;
NewKeyPair1(RSA::GenerateKeyPair(keyLength));
//NslObject::
//Key OtmanK(NewKeyPair1.GetPublicKey());
std::string message = "othman Alkilany";
// NslObject::NewKeyPair.GetPrivateKey()
std::string cypherText = RSA::Encrypt( message, NewKeyPair1.GetPublicKey());
the Error Message is :
error: expected primary-expression before ‘.’ token
proposed code corrections:
search for: ‘<<—‘ to find corrections
#define lefttrig 13
#define leftecho 12
#define righttrig 9
#define rightecho 8
int leftred = 4;
int leftgreen = 5;
int rightred = 6;
int rightgreen = 7;
#include <SoftwareSerial.h> //эту библиотеку надо скачать
#include <TinyGPS.h> //эту библиотеку надо скачать
SoftwareSerial mySerial(2, 3); // RX, TX от модуля
TinyGPS gps;
void gpsdump(TinyGPS gps);
void printFloat(double f, int digits = 2);
void setup()
{
mySerial.begin(9600);
pinMode(lefttrig, OUTPUT); //инициируем как выход
pinMode(leftecho, INPUT); //инициируем как вход
pinMode(righttrig, OUTPUT); //инициируем как выход
pinMode(rightecho, INPUT); //инициируем как вход
pinMode(leftred, OUTPUT);
pinMode(leftgreen, OUTPUT);
pinMode(rightred, OUTPUT);
pinMode(rightgreen, OUTPUT);
digitalWrite(leftgreen, HIGH) ; // led system diagnostic
digitalWrite(leftred, HIGH) ; // led system diagnostic
digitalWrite(rightgreen, HIGH) ; // led system diagnostic
digitalWrite(rightred, HIGH) ; // led system diagnostic
delay(2000);
digitalWrite(leftgreen, LOW) ; // led system diagnostic
digitalWrite(rightgreen, LOW) ; // led system diagnostic
delay(2000);
digitalWrite(leftred, LOW) ; // led diagnostic ok
digitalWrite(rightred, LOW) ; // led diagnostic ok
}
unsigned int impulseTimeleft =0;
unsigned int distanceleft =0;
unsigned int impulseTimeright=0;
unsigned int distanceright =0;
void loop()
{
bool newdata = false;
unsigned long start = millis();
if (mySerial.available())
{
char c = mySerial.read();
if (gps.encode(c))
{
newdata = true;
}
}
if (newdata) // <<-- removed: '= true'
{ //если спутники доступны
workonspeed(); //запуск программы чтения скорости
}
if (!newdata) // <<-- replaced: '(newdata) = false'
{ //если спутники недоступны, движение в тоннеле например
sonarleft (); //запуск программы левого сонара
sonarright ();
}
} // <<-- inserted missing close brace '}'
void workonspeed()
{
if (gps.f_speed_kmph()>10)
{ //если скорость по спутнику более 10кмч
sonarleft (); //запуск программы левого сонара
sonarright ();
}
}
void sonarleft ()
{ //левый сонар, чтение дистанции
digitalWrite(lefttrig, HIGH);
delayMicroseconds(10); // равный 10 микросекундам
digitalWrite(lefttrig, LOW);
impulseTimeleft=pulseIn(leftecho, HIGH); // Замеряем длину импульса
distanceleft=impulseTimeleft/58; // Пересчитываем в сантиметры
if (distanceleft<=150)
{
digitalWrite(leftred, HIGH) ; // red left led on
delay(2000);
}
else
{
digitalWrite(leftred, LOW) ; // red left led off
}
if ((distanceleft>=150) && (distanceleft<350 ))
{
digitalWrite(leftred, HIGH) ; // red left led on
digitalWrite(leftgreen, HIGH) ; // green left led on
}
else
{
digitalWrite(leftgreen, LOW) ; // green left led off
}
delay(100);
}
void sonarright()
{ //правый сонар, чтение данных
digitalWrite(righttrig, HIGH);
delayMicroseconds(10); // равный 10 микросекундам
digitalWrite(righttrig, LOW);// Отключаем
impulseTimeright=pulseIn(rightecho, HIGH); // Замеряем длину импульса
distanceright=impulseTimeright/58; // Пересчитываем в сантиметры
if (distanceright<=150) // right distance closer 60 cm
{
digitalWrite(rightred, HIGH) ; // red right led on
delay(2000);
}
else
{
digitalWrite(rightred, LOW) ; // red right led on
}
if ((distanceright>=150) && (distanceright<350 ))
{
digitalWrite(rightred, HIGH) ; // red right led on
digitalWrite(rightgreen, HIGH) ; // green right led on
}
else
{
digitalWrite(rightgreen, LOW) ; // green right led on
}
delay(100);
}
Ошибка компиляции C++: expected primary-expression before ‘)’ token
В процессе разработки приложений на C++ вы наверняка столкнулись с ошибками компиляции. Одной из таких ошибок является «expected primary-expression before ‘)’ token» или «ожидается первичное выражение перед токеном ‘)'».
Эта ошибка указывает на то, что в вашем коде компилятор ожидал обнаружить первичное выражение (такое как переменная, литерал или вызов функции) перед символом ‘)’ (закрывающая круглая скобка), но не смог найти его.
Давайте рассмотрим несколько распространенных причин возникновения этой ошибки и способы ее исправления.
1. Неправильное использование функции или оператора
Одним из наиболее частых источников ошибки является неправильное использование функций или операторов. Например:
int sum = (3 + 5);) // ошибка
В этом примере после закрывающей скобки ‘)’ намеренно добавлен лишний символ ‘)’, что приводит к ошибке компиляции. Для исправления достаточно удалить этот символ:
int sum = (3 + 5); // исправлено
Также может возникнуть ошибка, если вы вызываете функцию с неверным числом аргументов или передаете неверные аргументы. Например:
int add(int a, int b) { return a + b; } int result = add(5); // ошибка: недостаточно аргументов
В этом примере функции «add» требуется два аргумента, но в вызове передается только один аргумент. Чтобы исправить ошибку, убедитесь, что все аргументы переданы правильно:
int result = add(5, 10); // исправлено
2. Ошибки в синтаксисе
Еще одной распространенной причиной ошибки «expected primary-expression before ‘)’ token» являются ошибки в синтаксисе. Например:
if (x > 5); { // ошибка // код }
В этом примере точка с запятой после условия if создает пустой оператор, из-за чего компилятор ожидает первичное выражение вместо закрывающей скобки. Чтобы исправить ошибку, удалите эту точку с запятой:
if (x > 5) { // исправлено // код }
Также убедитесь, что вы правильно используете скобки в выражениях, чтобы указать приоритет операций. Например:
int result = (2 + 3) * 4); // ошибка: лишний символ ')'
В этом примере после закрывающей скобки ожидается оператор, но вместо этого присутствует символ ‘)’. Для исправления удалите этот символ:
int result = (2 + 3) * 4; // исправлено
3. Пропущенные точки с запятой
Еще одной возможной причиной ошибки «expected primary-expression before ‘)’ token» могут быть пропущенные точки с запятой в вашем коде. Например:
int a = 5 // ошибка: пропущена точка с запятой int b = 10;
В этом примере после инициализации переменной «a» пропущена точка с запятой, что приводит к ошибке компиляции. Чтобы исправить ошибку, добавьте пропущенную точку с запятой:
int a = 5; // исправлено int b = 10;
Убедитесь, что точки с запятой присутствуют после каждого оператора или объявления переменной.
В заключение, ошибка компиляции «expected primary-expression before ‘)’ token» может возникать по разным причинам: неправильное использование функций или операторов, ошибки в синтаксисе или пропущенные точки с запятой. Найдите причину, исправьте ее и перекомпилируйте ваш код.
Вопрос:
Я получаю много ошибок в строках “ошибка: ожидаемое первичное выражение перед”, “токен”, где я использую функцию getline в своем коде. Я посмотрел на некоторые примеры людей, использующих getline в ifstreams, и я подумал, что, возможно, мне пришлось поставить “std ::” перед вызовом функции (не совсем уверен, что это будет делать?), Но это тоже не сработало.
Вот первый бит моего кода; Я предполагаю, что любая ошибка, которую я делаю, одинакова во всем.
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct ListNode{
string user;
string salt;
string encrypted;
string password;
ListNode* next;
};
int main(){
/* Initializes singly linked list to hold user data */
ListNode *root;
ListNode *conductor;
root = new ListNode;
conductor = root;
string temp;
//creates and opens filestream to password file
ifstream psswdFile ("example.txt");
if(psswdFile.is_open()){
//we assume there is at least one line, and initialize the head of
//the list
std::getline(psswdFile&, (conductor->user)&, ':');
std::getline(psswdFile&, (conductor->salt)&, ':');
std::getline(psswdFile&, (conductor->encrypted)&);
Лучший ответ:
Похоже, вы неправильно поняли, как передаете ссылки на параметры C++. В отличие от указателей, которые обычно вам нужны, чтобы получить адрес с помощью оператора &
, функции, которые берут ссылки, вам не нужны: просто передайте присваиваемое выражение:
std::getline(psswdFile, conductor->user, ':');
Компилятор имеет прямое объявление вашей функции, поэтому он знает, как передавать все, что вы передаете по ссылке.