C 将值设置为特定地址

c++ set the value to specific address

本文关键字:地址 设置      更新时间:2023-10-16

我想通过将变量值设置为特定地址之间在两个程序之间进行数据交换。数据可以分配到地址中,但是当我更改程序中的一个值时另一个仍然没有得到值

program1.cpp将值设置为特定地址和program2.cpp以获取该地址的数据,这两个都包括一个标题文件" dataexchange.h"

program1.cpp

#include <iostream>
#include <windows.h>
#include "DataExchange.h"
using namespace std;
int main(int argc, char** argv) {
    double val2 = 0;
    double spd = 1; 
    double* ptr2 = (double*)speed_address; 
    cout << "Program1" << endl;

    while(1){
        DXSetvalue (Speed, spd);
        val2 = DXGetvalue (Speed);
        cout << "[speed] = " << spd++ << " [get speed] = " << val2 << " [address] = " << ptr2 << "r" ; 
        Sleep(2000); // 2sec
    }
    return 0;
}

program2.cpp

#include <iostream>
#include <windows.h>
#include "DataExchange.h"
using namespace std;
int main(int argc, char** argv) {
    double t = 0;
    double val = 0;
    int* ptr = (int*)speed_address;
    cout << "Program1 Node" <<endl;
    init();
    while(1){
        t += 2;
        val = DXGetvalue (Speed);
        cout << "(" << t << "sec) " <<"[Speed] = " << val << " [blackboard address] = " << ptr << "r";
        Sleep(2000); 
    } 
}

dataexchange.h

#include "stdio.h"

// The macro of the value ID
#define Speed 1

// Define of the address of the value
//#define speed_address 0x4a8048
//#define speed_address 0x00CFFB3C
#define speed_address 0x7ffef8
// Declaration
void setaddressValue (double* address, double d);
double getaddressValue (int name);
double* addressID (int name);
void DXSetvalue (int name, double d);
double DXGetvalue (int name);
void init();

// Definition
void setaddressValue (double* address, double d){   
    double* p = (double*)address;
    *p = d;
    //printf("p = 0x%x *p = %lfn", p, *p);
}
double getaddressValue (int name){
    double* pGet = addressID(name);
    double value = *pGet;
    //printf("pGet = 0x%x *pGet = %lfn", pGet, *pGet);
    return value;
}

double* addressID (int name){
    switch (name){
        case 1:
            return (double*)speed_address;
        default:
            //cout << "not set the address" << endl;
            printf("not set the address!!!n");
    }
}

/*program data*/
void DXSetvalue (int name, double d){
    setaddressValue(addressID(name), d);
}

double DXGetvalue (int name){
    return getaddressValue (name);
}

void init(){
    double* p = (double*)speed_address;
    *p = 0.5;
}

在内核上运行的程序使用虚拟地址,这意味着给定的程序无法访问另一个程序的地址空间。如果您想促进进程通信考虑UNIX插座。