【问题标题】:How to fix "error:expected primary-expression before ‘,’ token"如何修复“错误:','标记之前的预期主表达式”
【发布时间】:2022-01-05 15:17:30
【问题描述】:

我正在尝试制作第一个适合的内存管理代码,但每次我尝试运行它时,我都会在输出中得到不完整的结果和这些错误

error:expected primary-expression before ‘,’ token

我不知道在代码中添加什么来解决这个错误

#include"stdafx.h"
#include<stdio.h> 
#include<conio.h> 
#include<string.h> 
#include<stdlib.h> 
#include<iostream>
#include<memory.h>
#include <cstdlib>

using namespace std;

struct allocList
{
    char* startAlloc;
    char* endAlloc;
    int fk_pid;
    allocList *nxt;
};

struct procList
{
    int pid;
    int jobstatus;
    char *startProc;
    char *endProc;
    procList *nxt;
};

bool initProc(procList*&, int*, int);
bool initAlloc(allocList*&, int*, int);
int doFirstFit(procList*, allocList*);
int cmptFragmentation(procList*, allocList*);
int search(procList*, int);
bool reset(procList*, allocList*);

int main()
{
    int arrMemory[] = { 100, 500, 200, 300, 600 };
    int arrJobs[] = { 212, 17, 112, 426, 500 };

    allocList *ptrAllocStart = NULL;
    procList *ptrProcStart = NULL;
    initAlloc(ptrAllocStart, arrMemory, (sizeof(arrMemory) / sizeof(int)));
    initProc(ptrProcStart, arrJobs, (sizeof(arrJobs) / sizeof(int)));
    cout << "Memory Block: " << endl << "Block\tSpace" << endl;

    for (int i = 0; i < sizeof(arrMemory) / sizeof(int); i++)
    {
        cout << i + 1 << "\t" << arrMemory[i] << endl;
    }

    cout << "\nJobs:" << endl << "Job\tSize" << endl;

    for (int i = 0; i < sizeof(arrJobs) / sizeof(int); i++)
    {
        cout << i + 1 << "\t" << arrJobs[i] << endl;
    }
    int jobLoaded = 0;
    int fragmentation = 0;

    jobLoaded = doFirstFit(ptrProcStart, ptrAllocStart);
    fragmentation = cmptFragmentation(ptrProcStart, ptrAllocStart);
    allocList* memtrav = ptrAllocStart;
    getch();

    return 0;
}

bool initProc(procList*& ptrProcStart, int* ptrArrProc, int length){
int i; 
procList *ptrProc=ptrProcStart; 

for(i=0; i<length; i++){
if(ptrProc != NULL){
ptrProc->nxt=new procList; 
ptrProc = ptrProc->nxt; ptrProc->startProc=(char*)malloc(*(ptrArrProc+i)); 
ptrProc->endProc=ptrProc->startProc + *(ptrArrProc+i); 
memset(ptrProc->startProc,'a'+i,*(ptrArrProc+i)); 
ptrProc->jobstatus=0;
ptrProc->pid=i; 
ptrProc->nxt=NULL;
}
else
{
ptrProc=new procList; 
ptrProc->startProc=(char*)malloc(*(ptrArrProc+i)); 
ptrProc->endProc=ptrProc->startProc + *(ptrArrProc+i);
memset(ptrProc->startProc, 'a'+i, *(ptrArrProc+i));
ptrProc->jobstatus=0;
ptrProc->pid=i;
ptrProc->nxt=NULL;
ptrProcStart = ptrProc;}}
return true; }



bool initAlloc(allocList*& ptrAllocstart, int* ptrArrAlloc, int length)
{
//cout << "loading function initAlloc"<< "\t" << length << endl;
    int i;
    allocList* ptrAlloc = ptrAllocstart;

    for (i = 0; i < length; i++)
    {
        //cout << "running loop 1st"<< "\t" << i << endl;
        if (ptrAlloc != NULL)
{
        ptrAlloc -> nxt = new allocList; 
        ptrAlloc = ptrAlloc->nxt;
        //cout << "after new ptrAlloc" << endl;
        ptrAlloc->startAlloc=(char*)malloc(*(ptrArrAlloc+i)); 
        ptrAlloc->endAlloc=ptrAlloc->startAlloc + *(ptrArrAlloc+i); 
        memset(ptrAlloc->startAlloc,'a'+i,*(ptrArrAlloc+i)); 
        ptrAlloc->nxt=NULL;
    }
    else
    {   //cout << "inside else"<< "\t" << i << endl;
        ptrAlloc= new allocList;
        ptrAlloc->startAlloc-(char*)malloc(*(ptrArrAlloc+i)); 
        ptrAlloc->endAlloc-ptrAlloc->startAlloc + *(ptrArrAlloc+i); 
        memset(ptrAlloc->startAlloc, 'a'+i, *(ptrArrAlloc+i));
        ptrAlloc->nxt=NULL; 
        ptrAllocstart=ptrAlloc;
        }

    }
return true;
}

int doFirstFit(procList*, allocList*){
    //cout lang ng UI
    cout << "\n\nFirst Fit:\nMemory Block\tSize\tJob\tInternal " << " Fragmentation\n" << endl;
    //declaration ng variable
    int i = 0;
    allocList* memory;
    //mag do while sa memory n walang laman?
    while (memory != NULL)
        i++;
        cout << "\t" << i << "\t" << memory->endAlloc - memory->startAlloc << "\t"
    << memory->fk_pid << "\t" 
    //<< memory->endAlloc - memory->startAlloc - search(procList,memory->fk_pid - 1)
    << endl; 
   memory = memory->nxt;

    return 0;
}

int search(procList* job, int id)
{
    int size = 0;

    while (job != NULL)
    {
        if (job->pid == id)
        {
            size =atoi(job->endProc) - atoi(job->startProc);
            break;
        }

        job = job->nxt;
    }
    return size;
}

int cmptFragmentation(procList * jobs, allocList * mem)
    {
    allocList* memtrav, * temp;
    procList* jobtrav;
    jobtrav = jobs;
    memtrav = mem;
    int freespace = 0, memsize, jobsize;
    int i = 0;

    while (memtrav->nxt != NULL)
    {
        if (memtrav->nxt->fk_pid == 0)
        {
            freespace += (memtrav->nxt->endAlloc - memtrav->nxt->startAlloc);
            temp = memtrav->nxt;
            memtrav->nxt = memtrav->nxt->nxt; delete temp;
        }

        memtrav = memtrav->nxt;
    }

    if (memtrav->fk_pid == 0)
    {
        freespace += (memtrav->endAlloc - memtrav->startAlloc);
        memtrav = memtrav->nxt;
    }
    memtrav = mem;

    while (memtrav != NULL)
    {
        jobsize = search(jobs, memtrav->fk_pid - 1);
        memsize = memtrav->endAlloc - memtrav->startAlloc;

        if (memtrav->fk_pid != 0)
        {
            memtrav->endAlloc = memtrav->startAlloc + jobsize;
        }
        freespace += (memsize - jobsize);
        memtrav = memtrav->nxt;
    }
    memtrav = mem;

    while (memtrav != NULL)
    {
        if (memtrav->nxt == NULL)
        {
            memtrav->nxt = new allocList;
            memtrav = memtrav->nxt;
            memtrav->startAlloc = (char*)malloc(freespace);
            memtrav->endAlloc = memtrav->startAlloc + freespace;
            memset(memtrav->startAlloc, 0, freespace);
            memtrav->fk_pid = 0;
            memtrav->nxt = NULL;
            break;
        }
        memtrav = memtrav->nxt;
    }
    memtrav = mem;

    cout << endl << endl << "Defragmentation\nMemory " << "Block\tSize\tJob\tFreeSpace\n";

    while (memtrav != NULL)
    {
        i++;

        cout << "\t" << i << "\t" << memtrav->endAlloc - memtrav->startAlloc << "\t" << memtrav->fk_pid
            << "\t" << memtrav->endAlloc - memtrav->startAlloc - search(jobs, memtrav->fk_pid - 1) << endl;

        memtrav = memtrav->nxt;
    }

    while (jobtrav != NULL)
    {
        if (jobtrav->jobstatus == 0)
        {
            doFirstFit(jobs, mem);
            cmptFragmentation(jobs, mem);
        }

        jobtrav = jobtrav->nxt;
    }
    return 0;
}

bool reset(procList* jobs, allocList* mem)
{
    procList* tempj = jobs;
    allocList* tempa = mem;
    while (jobs->nxt != NULL)
    {
        jobs = jobs->nxt;
        free(tempj);
        tempj = jobs;
    }

    free(tempj);

    while (mem->nxt != NULL)
    {
        mem = mem->nxt;
        free(tempa);
        tempa = mem;
    }
    free(tempa);
    return true;
}

这是我评论错误有问题的部分,我不知道我做错了什么

<< memory->endAlloc - memory->startAlloc - search(procList,memory->fk_pid - 1)

请帮忙,非常感谢!

【问题讨论】:

  • 请在问题中包含错误信息。在.... memory-&gt;startAlloc - search(procList, ... 行中,procList 是一个类型,是不是拼写错误? (尽管目前还不清楚这条线应该实现什么)
  • 是的,我打算这样做,但如果这也是一个问题,我也会改变它,谢谢你指出!

标签: c++ compiler-errors function-definition unused-variables


【解决方案1】:

在这个函数调用中

search(procList,memory->fk_pid - 1)

这里使用了类型说明符procList 而不是表达式。

注意这样的函数定义,没有使用它的参数

int doFirstFit(procList*, allocList*){
    //cout lang ng UI
    cout << "\n\nFirst Fit:\nMemory Block\tSize\tJob\tInternal " << " Fragmentation\n" << endl;
    //declaration ng variable
    int i = 0;
    allocList* memory;
    //..

没有意义。

另外还有未初始化的指针

allocList* memory;

在诸如 this 的表达式中

memory = memory->nxt;

调用未定义的行为。

函数被调用,参数为

 doFirstFit(jobs, mem);

所以你需要在函数中使用传递的参数,而不是像这样声明局部变量

allocList* memory;

【讨论】:

    【解决方案2】:

    在我所做的分析中,错误是这样的

    memory->endAlloc - memory->startAlloc - search(procList,memory->fk_pid - 1)
    

    否则直接传递 proclist,你必须声明它的指针变量,就像你为 Alloclist 内存所做的那样; 以同样的方式解决这个问题

    #include<stdio.h> 
    #include<conio.h> 
    #include<string.h> 
    #include<stdlib.h> 
    #include<iostream>
    #include<memory.h>
    #include <cstdlib>
    
    using namespace std;
    
    struct allocList
    {
        char* startAlloc;
        char* endAlloc;
        int fk_pid;
        allocList *nxt;
    };
    
    struct procList
    {
        int pid;
        int jobstatus;
        char *startProc;
        char *endProc;
        procList *nxt;
    };
    
    bool initProc(procList*&, int*, int);
    bool initAlloc(allocList*&, int*, int);
    int doFirstFit(procList*, allocList*);
    int cmptFragmentation(procList*, allocList*);
    int search(procList*, int);
    bool reset(procList*, allocList*);
    
    int main()
    {
        int arrMemory[] = { 100, 500, 200, 300, 600 };
        int arrJobs[] = { 212, 17, 112, 426, 500 };
    
        allocList *ptrAllocStart = NULL;
        procList *ptrProcStart = NULL;
        initAlloc(ptrAllocStart, arrMemory, (sizeof(arrMemory) / sizeof(int)));
        initProc(ptrProcStart, arrJobs, (sizeof(arrJobs) / sizeof(int)));
        cout << "Memory Block: " << endl << "Block\tSpace" << endl;
    
        for (int i = 0; i < sizeof(arrMemory) / sizeof(int); i++)
        {
            cout << i + 1 << "\t" << arrMemory[i] << endl;
        }
    
        cout << "\nJobs:" << endl << "Job\tSize" << endl;
    
        for (int i = 0; i < sizeof(arrJobs) / sizeof(int); i++)
        {
            cout << i + 1 << "\t" << arrJobs[i] << endl;
        }
        int jobLoaded = 0;
        int fragmentation = 0;
    
        jobLoaded = doFirstFit(ptrProcStart, ptrAllocStart);
        fragmentation = cmptFragmentation(ptrProcStart, ptrAllocStart);
        allocList* memtrav = ptrAllocStart;
        getch();
    
        return 0;
    }
    
    bool initProc(procList*& ptrProcStart, int* ptrArrProc, int length){
    int i; 
    procList *ptrProc=ptrProcStart; 
    
    for(i=0; i<length; i++){
    if(ptrProc != NULL){
    ptrProc->nxt=new procList; 
    ptrProc = ptrProc->nxt; ptrProc->startProc=(char*)malloc(*(ptrArrProc+i)); 
    ptrProc->endProc=ptrProc->startProc + *(ptrArrProc+i); 
    memset(ptrProc->startProc,'a'+i,*(ptrArrProc+i)); 
    ptrProc->jobstatus=0;
    ptrProc->pid=i; 
    ptrProc->nxt=NULL;
    }
    else
    {
    ptrProc=new procList; 
    ptrProc->startProc=(char*)malloc(*(ptrArrProc+i)); 
    ptrProc->endProc=ptrProc->startProc + *(ptrArrProc+i);
    memset(ptrProc->startProc, 'a'+i, *(ptrArrProc+i));
    ptrProc->jobstatus=0;
    ptrProc->pid=i;
    ptrProc->nxt=NULL;
    ptrProcStart = ptrProc;}}
    return true; }
    
    
    
    bool initAlloc(allocList*& ptrAllocstart, int* ptrArrAlloc, int length)
    {
    //cout << "loading function initAlloc"<< "\t" << length << endl;
        int i;
        allocList* ptrAlloc = ptrAllocstart;
    
        for (i = 0; i < length; i++)
        {
            //cout << "running loop 1st"<< "\t" << i << endl;
            if (ptrAlloc != NULL)
    {
            ptrAlloc -> nxt = new allocList; 
            ptrAlloc = ptrAlloc->nxt;
            //cout << "after new ptrAlloc" << endl;
            ptrAlloc->startAlloc=(char*)malloc(*(ptrArrAlloc+i)); 
            ptrAlloc->endAlloc=ptrAlloc->startAlloc + *(ptrArrAlloc+i); 
            memset(ptrAlloc->startAlloc,'a'+i,*(ptrArrAlloc+i)); 
            ptrAlloc->nxt=NULL;
        }
        else
        {   //cout << "inside else"<< "\t" << i << endl;
            ptrAlloc= new allocList;
            ptrAlloc->startAlloc-(char*)malloc(*(ptrArrAlloc+i)); 
            ptrAlloc->endAlloc-ptrAlloc->startAlloc + *(ptrArrAlloc+i); 
            memset(ptrAlloc->startAlloc, 'a'+i, *(ptrArrAlloc+i));
            ptrAlloc->nxt=NULL; 
            ptrAllocstart=ptrAlloc;
            }
    
        }
    return true;
    }
    
    int doFirstFit(procList*, allocList*){
        //cout lang ng UI
        cout << "\n\nFirst Fit:\nMemory Block\tSize\tJob\tInternal " << " Fragmentation\n" << endl;
        //declaration ng variable
        int i = 0;
        allocList* memory;
        procList*ab;
        //mag do while sa memory n walang laman?
        while (memory != NULL)
            i++;
            int mem=memory->fk_pid - 1;
            cout << "\t" << i << "\t" << memory->endAlloc - memory->startAlloc << "\t"<< memory->fk_pid << "\t"<< memory->endAlloc - memory->startAlloc - search(ab,mem)<< endl; 
       memory = memory->nxt;
    
        return 0;
    }
    
    int search(procList* job, int id)
    {
        int size = 0;
    
        while (job != NULL)
        {
            if (job->pid == id)
            {
                size =atoi(job->endProc) - atoi(job->startProc);
                break;
            }
    
            job = job->nxt;
        }
        return size;
    }
    
    int cmptFragmentation(procList * jobs, allocList * mem)
        {
        allocList* memtrav, * temp;
        procList* jobtrav;
        jobtrav = jobs;
        memtrav = mem;
        int freespace = 0, memsize, jobsize;
        int i = 0;
    
        while (memtrav->nxt != NULL)
        {
            if (memtrav->nxt->fk_pid == 0)
            {
                freespace += (memtrav->nxt->endAlloc - memtrav->nxt->startAlloc);
                temp = memtrav->nxt;
                memtrav->nxt = memtrav->nxt->nxt; delete temp;
            }
    
            memtrav = memtrav->nxt;
        }
    
        if (memtrav->fk_pid == 0)
        {
            freespace += (memtrav->endAlloc - memtrav->startAlloc);
            memtrav = memtrav->nxt;
        }
        memtrav = mem;
    
        while (memtrav != NULL)
        {
            jobsize = search(jobs, memtrav->fk_pid - 1);
            memsize = memtrav->endAlloc - memtrav->startAlloc;
    
            if (memtrav->fk_pid != 0)
            {
                memtrav->endAlloc = memtrav->startAlloc + jobsize;
            }
            freespace += (memsize - jobsize);
            memtrav = memtrav->nxt;
        }
        memtrav = mem;
    
        while (memtrav != NULL)
        {
            if (memtrav->nxt == NULL)
            {
                memtrav->nxt = new allocList;
                memtrav = memtrav->nxt;
                memtrav->startAlloc = (char*)malloc(freespace);
                memtrav->endAlloc = memtrav->startAlloc + freespace;
                memset(memtrav->startAlloc, 0, freespace);
                memtrav->fk_pid = 0;
                memtrav->nxt = NULL;
                break;
            }
            memtrav = memtrav->nxt;
        }
        memtrav = mem;
    
        cout << endl << endl << "Defragmentation\nMemory " << "Block\tSize\tJob\tFreeSpace\n";
    
        while (memtrav != NULL)
        {
            i++;
    
            cout << "\t" << i << "\t" << memtrav->endAlloc - memtrav->startAlloc << "\t" << memtrav->fk_pid
                << "\t" << memtrav->endAlloc - memtrav->startAlloc - search(jobs, memtrav->fk_pid - 1) << endl;
    
            memtrav = memtrav->nxt;
        }
    
        while (jobtrav != NULL)
        {
            if (jobtrav->jobstatus == 0)
            {
                doFirstFit(jobs, mem);
                cmptFragmentation(jobs, mem);
            }
    
            jobtrav = jobtrav->nxt;
        }
        return 0;
    }
    
    bool reset(procList* jobs, allocList* mem)
    {
        procList* tempj = jobs;
        allocList* tempa = mem;
        while (jobs->nxt != NULL)
        {
            jobs = jobs->nxt;
            free(tempj);
            tempj = jobs;
        }
    
        free(tempj);
    
        while (mem->nxt != NULL)
        {
            mem = mem->nxt;
            free(tempa);
            tempa = mem;
        }
        free(tempa);
        return true;
    }
    

    以上工作正常。

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 1970-01-01
      • 2013-01-13
      • 2017-09-24
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多