我正在制作一个简单的肥皂应用程序。我有两个功能,一个在服务器上,另一个在客户端上。但是我一直在客户端上遇到分段错误。我做错了什么?
这是客户
#include "soapTempConvertSoapProxy.h"
#include "soapTempConvertSoapService.h"
#include "TempConvertSoap.nsmap"
#include <iostream>
using namespace std;
#include <string>
#include <sstream>
std::string s = std::string();
const char server[] = "http://localhost:8000";
int main(int argc, char **argv)
{
TempConvertSoapProxy temp;
//mudar endpoint se necessario
temp.soap_endpoint = server;
_ns1__FahrenheitToCelsius *ns1__FahrenheitToCelsius;
_ns1__FahrenheitToCelsiusResponse *ns1__FahrenheitToCelsiusResponse;
_ns1__CelsiusToFahrenheit *ns1__CelsiusToFahrenheit;
_ns1__CelsiusToFahrenheitResponse *ns1__CelsiusToFahrenheitResponse;
int ope = 1;
while(ope)
{
std::cout << "Por favor entre com o codigo da operacao:" << '\n';
std::cout << "1 = Fahrenheit para Celsius, 2 = Celsius para Fahrenheit, 0 = terminar" << '\n';
std::cin >> ope;
std::cout << "Por favor entre com a temperatura" << '\n';
if(ope == 1 || ope == 3)
{
std::cin >> s;
ns1__FahrenheitToCelsius->Fahrenheit = &s;
}
else
{
if(ope == 2 || ope == 4)
{
std::cin >> s;
ns1__CelsiusToFahrenheit->Celsius = &s;
}
}
switch(ope)
{
case 0: break;
case 1: if(temp.FahrenheitToCelsius(ns1__FahrenheitToCelsius, ns1__FahrenheitToCelsiusResponse) == SOAP_OK)
{
std::string z = *(ns1__FahrenheitToCelsiusResponse->FahrenheitToCelsiusResult);
std::cout << z << '\n';
}
else
{
temp.soap_stream_fault(std::cerr);
}
break;
case 2: if(temp.CelsiusToFahrenheit(ns1__CelsiusToFahrenheit, ns1__CelsiusToFahrenheitResponse) == SOAP_OK)
{
std::string z = ns1__FahrenheitToCelsiusResponse->FahrenheitToCelsiusResult->c_str();
std::cout << z << '\n';
}
else
{
temp.soap_stream_fault(std::cerr);
}
break;
case 3: if(temp.FahrenheitToCelsius_(ns1__FahrenheitToCelsius, ns1__FahrenheitToCelsiusResponse) == SOAP_OK)
{
std::string z = ns1__FahrenheitToCelsiusResponse->FahrenheitToCelsiusResult->c_str();
std::cout << z << '\n';
}
else
{
temp.soap_stream_fault(std::cerr);
}
break;
case 4: if(temp.CelsiusToFahrenheit_(ns1__CelsiusToFahrenheit, ns1__CelsiusToFahrenheitResponse) == SOAP_OK)
{
std::string z = ns1__FahrenheitToCelsiusResponse->FahrenheitToCelsiusResult->c_str();
std::cout << z << '\n';
}
else
{
temp.soap_stream_fault(std::cerr);
}
break;
default: std::cout << "Erro! Codigo de operação desconhecido!" << '\n' << "Por favor, tente novamente!" << '\n';
break;
}
}
return 0;
}
这是服务器
#include "soapTempConvertSoapService.h"
#include "TempConvertSoap.nsmap"
#include <iostream>
#include <stdlib.h>
using namespace std;
#include <string>
#include <sstream>
#include <utility>
std::string s = std::string();
std::string str = std::string();
int demp;
int main(int argc, char **argv)
{
TempConvertSoapService temp;
if (argc < 2)
{
temp.serve(); /* serve as CGI application */
}
else
{
int port = atoi(argv[1]);
if (!port)
{
fprintf(stderr, "Usage: tempserver++ <port>\n");
exit(0);
}
/* run iterative server on port until fatal error */
if (temp.run(port))
{
temp.soap_stream_fault(std::cerr);
exit(-1);
}
}
return 0;
}
int TempConvertSoapService::FahrenheitToCelsius(_ns1__FahrenheitToCelsius *ns1__FahrenheitToCelsius, _ns1__FahrenheitToCelsiusResponse *ns1__FahrenheitToCelsiusResponse)
{
str = (*ns1__FahrenheitToCelsius->Fahrenheit);
istringstream convert(str);
stringstream konvert;
if ( !(convert >> demp) )
{
demp = 0;
}
else
{
demp = (demp - 32) * 5/9;
konvert << demp;
s = konvert.str();
ns1__FahrenheitToCelsiusResponse->FahrenheitToCelsiusResult = &s;
}
return SOAP_OK;
}
int TempConvertSoapService::CelsiusToFahrenheit(_ns1__CelsiusToFahrenheit *ns1__CelsiusToFahrenheit, _ns1__CelsiusToFahrenheitResponse *ns1__CelsiusToFahrenheitResponse)
{
str = (*ns1__CelsiusToFahrenheit->Celsius);
istringstream convert(str);
stringstream konvert;
demp;
if ( !(convert >> demp) )
{
demp = 0;
}
else
{
demp = demp * 9/5 + 32;
konvert << demp;
s = konvert.str();
ns1__CelsiusToFahrenheitResponse->CelsiusToFahrenheitResult = &s;
}
return SOAP_OK;
}
int TempConvertSoapService::FahrenheitToCelsius_(_ns1__FahrenheitToCelsius *ns1__FahrenheitToCelsius, _ns1__FahrenheitToCelsiusResponse *ns1__FahrenheitToCelsiusResponse)
{
str = (*ns1__FahrenheitToCelsius->Fahrenheit);
istringstream convert(str);
stringstream konvert;
demp;
if ( !(convert >> demp) )
{
demp = 0;
}
else
{
demp = (demp - 32) * 5/9;
konvert << demp;
s = konvert.str();
ns1__FahrenheitToCelsiusResponse->FahrenheitToCelsiusResult = &s;
}
return SOAP_OK;
}
int TempConvertSoapService::CelsiusToFahrenheit_(_ns1__CelsiusToFahrenheit *ns1__CelsiusToFahrenheit, _ns1__CelsiusToFahrenheitResponse *ns1__CelsiusToFahrenheitResponse)
{
str = (*ns1__CelsiusToFahrenheit->Celsius);
istringstream convert(str);
stringstream konvert;
demp;
if ( !(convert >> demp) )
{
demp = 0;
}
else
{
demp = demp * 9/5 + 32;
konvert << demp;
s = konvert.str();
ns1__CelsiusToFahrenheitResponse->CelsiusToFahrenheitResult = &s;
}
return SOAP_OK;
}
谢谢!
答案 0 :(得分:2)
您永远不会初始化_ns1__FahrenheitToCelsius *ns1__FahrenheitToCelsius
和类似变量,但会尝试访问其数据成员(例如ns1__FahrenheitToCelsius->Fahrenheit = &s;
)。看起来这些只是对象本身而不是指针。