首页 > 解决方案 > c ++将值设置为特定地址

问题描述

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

Program1.cpp 将值设置为特定地址,Program2.cpp 从该地址获取数据,两者都包含头文件“DataExchange.h”

程序1.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;
}

程序2.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); 
    } 
}

数据交换.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 = %lf\n", p, *p);
}

double getaddressValue (int name){
    double* pGet = addressID(name);
    double value = *pGet;
    //printf("pGet = 0x%x *pGet = %lf\n", 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;
}

标签: c++pointersmemory-address

解决方案


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


推荐阅读