C语言 尝试将一个结构的内容复制到另一个结构

dxxyhpgq  于 2023-03-01  发布在  其他
关注(0)|答案(2)|浏览(151)

所以我在头文件中定义了一个struct,用于在程序中访问。然后我在. c文件中定义了一个单独的struct,目的是将一个struct的内容复制到另一个struct。然而,当我尝试这样做时,我得到了错误:"错误:'pcb'未声明(第一次在此函数中使用)reg. pc = pcb. pc;"

/* header file */

struct Registers {

  int PC;
  int IR0;
  int IR1;
  int AC;
  int MAR;
  int MBR;
  int Base;

}; struct Registers reg = {0, 0, 0, 0, 0, 0, 0};
/* computer.c */

#include <stdio.h>
#include "computer.h"

void process_init_PCB() {
  
  struct PCB {

  int PC;
  int IR0;
  int IR1;
  int AC;
  int MAR;
  int MBR;
  int Base;

  }; struct PCB pcb = {0, 0, 0, 0, 0, 0, 0};
  
}

void process_set_registers() {
  
  reg.PC = pcb.PC;
  reg.IR0 = pcb.IR0;
  reg.IR1 = pcb.IR1;
  reg.AC = pcb.AC;
  reg.MAR = pcb.MAR;
  reg.MBR = pcb.MBR;
  reg.Base = pcb.Base;

}

我试过在set registers函数中插入外部结构标记,但它也给了我错误。
就像这样:

void process_set_registers() {
  
  extern struct pcb;

  reg.PC = pcb.PC;
  reg.IR0 = pcb.IR0;
  reg.IR1 = pcb.IR1;
  reg.AC = pcb.AC;
  reg.MAR = pcb.MAR;
  reg.MBR = pcb.MBR;
  reg.Base = pcb.Base;

}
egdjgwm8

egdjgwm81#

正如注解中提到的,您的变量'pcb'是局部变量,无法在函数'process_set_registers'中访问。
在你的代码中,你声明了结构并赋值,你可能需要一个函数来帮你做这些,有时候,指针会帮你做这些。
你可以用指针和内存分配来创建类结构。下面是使用指针来实现你的目标的可能实现。
我不明白你为什么在代码中两次使用相同的结构。(寄存器和PCB)你能解释一下为什么吗?

// main.c

#include <stdio.h>

#include "computer.h"

int main(void)
{
    printf("Global REG\n");
    registers_print(REG);
    printf("\n");

    Registers* temp = create_registers_with_values(1, 2, 3, 4, 5, 6, 7);
    printf("Temp REG\n");
    registers_print(temp);
    printf("\n");

    printf("Copy Temp REG to Global REG\n");
    registers_copy(REG, temp);
    printf("\n");

    printf("Global REG\n");
    registers_print(REG);

    return 0;
}
// computer.h

#include <stdlib.h>
#include <string.h>

typedef struct Registers {
  int PC;
  int IR0;
  int IR1;
  int AC;
  int MAR;
  int MBR;
  int Base;
} Registers;

// Global register.
Registers REG_ =
{
    .PC = 0,
    .IR0 = 0,
    .IR1 = 0,
    .AC = 0,
    .MAR = 0,
    .MBR = 0,
    .Base = 0
};
Registers* REG = (Registers*)&REG_;

Registers* create_registers()
{
    // calloc allocates mems and init them to 0.
    Registers* ths = (Registers*)calloc(1, sizeof(Registers));

    return ths;
}

Registers* create_registers_with_values(int PC, int IR0, int IR1, int AC, int MAR, int MBR, int Base)
{
    Registers* ths = (Registers*)calloc(1, sizeof(Registers));

    ths->PC = PC;
    ths->IR0 = IR0;
    ths->IR1 = IR1;
    ths->AC = AC;
    ths->MAR = MAR;
    ths->MBR = MBR;
    ths->Base = Base;

    return ths;
}

void registers_print(Registers* ths)
{
    printf("PC: %d\n", ths->PC);
    printf("IR0: %d\n", ths->IR0);
    printf("IR1: %d\n", ths->IR1);
    printf("AC: %d\n", ths->AC);
    printf("MAR: %d\n", ths->MAR);
    printf("MBR: %d\n", ths->MBR);
    printf("Base: %d\n", ths->Base);
}

void registers_copy(Registers* dest, Registers* src)
{
    memcpy(dest, src, sizeof(Registers));
}

[编辑]
computer. h可以通过声明和实现来拆分。
一个二个一个一个
【注】
C语言中的函数声明不要求包含其参数名。
代码如下,

extern Registers* create_registers_with_values(int PC, int IR0, int IR1, int AC, int MAR, int MBR, int Base);

会变成这样。

extern Registers* create_registers_with_values(int, int, int, int, int, int, int);
bvjxkvbb

bvjxkvbb2#

你不能直接从另一个函数的语言环境中访问一个局部变量。为此你必须以某种方式提取变量。这些路径可以是通过return、Reference参数或指针。但是这里你还需要考虑变量的生存期。
没有其他方法可以在全局域中定义这个变量。这样做的缺点是它可能会一直保留在内存中直到程序结束。这取决于你在做什么。

相关问题