标签: openvms

如何安全地在unsigned int和int之间进行static_cast?

我有一个8个字符string代表一个十六进制数字,我需要将其转换为int.这种转换必须保留字符串"80000000"和更高的位模式,即这些数字应该是负数.不幸的是,天真的解决方案:

int hex_str_to_int(const string hexStr)
{    
    stringstream strm;
    strm << hex << hexStr;
    unsigned int val = 0;
    strm >> val;
    return static_cast<int>(val);
}
Run Code Online (Sandbox Code Playgroud)

如果val > MAX_INT(返回值为0),则对我的编译器不起作用.更改val的类型int也会导致较大的数字为0.我在SO上尝试了几种不同的解决方案,但尚未成功.

这就是我所知道的:

  • 我在OpenVMS上使用HP的C++编译器(我相信,使用安腾处理器).
  • sizeof(int) 我的代码将在每个架构上运行至少4个.
  • 从数字> INT_MAX到int的转换是实现定义的.在我的机器,它通常会导致0但有趣的是铸造longint的结果INT_MAX,当值过大.

这是非常难以正确地做到,或者至少它已经适合我.有谁知道这个便携式解决方案?

更新:

更改static_castreinterpret_cast导致编译器错误.评论促使我尝试C风格的演员:return (int)val在上面的代码中,它工作. 在这台机器上. 在其他架构上,这仍然是安全的吗?

c++ casting integer-overflow openvms

11
推荐指数
3
解决办法
2万
查看次数

OpenVMS下SAS中套接字的错误处理

我在OpenVMS上使用SAS 9.2通过一个用filename语句指定的套接字连接到外部数据源:

filename extsrc SOCKET "extserver:port" recfm=v;

data foo;
infile extsrc;
input;
.... some statements to read stuff ...;
run;
Run Code Online (Sandbox Code Playgroud)

99%的情况下(这应该)有效.但是,偶尔应该在远程端口上侦听的程序不是.目前,这会导致程序退出并显示错误:

Error: Connection refused.
Run Code Online (Sandbox Code Playgroud)

之后我们再试一次,它通常有效.然而,这变得乏味,所以我想在程序中检测到这个错误并在那里处理它.有人知道在SAS中检测此类错误的方法吗?

我已经尝试使用fileref()函数检查fileref extsrc的有效性,但这只返回-20005,这意味着fileref已分配但未指向本地文件(这是真的).当我在datastep中使用fileref时,错误才会变得明显,所以我想做的事情是:

data _null_;
rc=infile extsrc;
if rc=0 then do;
  //whatever I want to do;
end;
else do;
  //throw some error and try again later;
end;
run;
Run Code Online (Sandbox Code Playgroud)

[update1]我正在尝试下面的建议,但是在真正的heisenbug方式中,问题在过去几天没有出现,所以我不确定最终的解决方案是什么.[/ UPDATE1]

[update2]错误终于再次出现.根据cmjohns的回答,发生此错误后,syserr的值为1012.我现在将观察syserr的值,如果失败则再次尝试固定次数.[/ UPDATE2]

[update3]我已经有一些代码运行了几天,现在有效.另外一个问题是(当然)如果&syserr得到一个高于6的值,则出现错误情况,因此根据您的errorabend/noerrorabend设置,这会导致程序完全结束,或者导致程序继续obs=0处于syntaxchek模式.两者都不可取.解决方案是options noerrorabend nosyntaxcheck在产生此错误的datastep之前设置.此外,如果发生错误,我必须清除文件名extsrc并重新分配它.最后,一旦完成这段代码,我就恢复了errorabend.如果我恢复nosyntaxcheck,这会导致SAS检测到先前的错误情况并在该点切换到语法检查模式,这也是不合需要的.[/ UPDATE3]

sockets error-handling sas openvms

7
推荐指数
1
解决办法
1041
查看次数

远离安腾

我们目前有一个用COBOL编写的大型业务关键型应用程序,运行在OpenVMS(Integrity/Itanium)上.

随着时间的推移,人们越来越多地猜测Itanium架构的生命周期.在开放,当然,但就像文章没有提到了这个这个画一个令人担忧的画面.虽然我找不到任何支持这一点的官方消息,但我们惠普公司的走廊甚至还有嘀咕着OpenVMS和HP COBOL.

我无法相信我们是孤身一人.

我看到它的方式,有几个选择:

  1. 模拟一些旧硬件并使用CHARON-VAXCHARON-AXP等产品运行应用程序.我看到它的方式,优点是该过程应该相对无痛,特别是如果使用64位(AXP)选项.潜在的缺点是性能下降(尽管这应该被越来越快的硬件所抵消);
  2. 将基于HP COBOL的应用程序移植到更现代的COBOL方言,例如Visual COBOL.那么,专业人员的事实是移植工作量相对较低(它仍然是COBOL)以及可以在Unix或Windows平台上运行应用程序的事实.缺点是虽然您正在移植COBOL,但是您移植到不同的操作系统这一事实可能会使事情变得棘手(特别是如果存在特定于OpenVMS的依赖项);
  3. 自动将COBOL转换为更现代的语言,如Java.这有一个明显的好处,即可以立即从一个遗留问题中解放出来:硬件支持,操作系统支持,尤其是查找管理员和程序员.除了这是一项大工作之外,一个显而易见的缺点是,最终会得到非惯用的Java(或最终选择的任何目标语言); 可以说,这可以随着时间的推移而得到改善.
  4. 从头开始重写(当然,使用现代技术).任何做过此事的人都知道这是多么昂贵和耗时.我只是把它包括在内以使列表完整:)

请注意,不依赖于专有DBMS; 数据库是基于ISAM文件的.

所以...我的问题是:

当他们选择的平台是OpenVMS和COBOL时,Itanium即将淘汰以保持业务连续性的其他人面临着什么?

更新:

我们已经得到当地惠普代表的官方保证,至少在2022年之前我们将支持Integrity/Itanium/OpenVMS.我想这意味着整个问题不仅仅是关于平台,还有更多关于语言(COBOL)的问题.

cobol itanium openvms

6
推荐指数
1
解决办法
838
查看次数

在C++中获取JPEG的尺寸

我需要在C++中获得JPEG的图像尺寸.我正在寻找一种相当简单的方法来实现它,或者是一个提供该功能的小型库.我在OpenVMS上使用C++,所以任何外部库都可能需要适应我们系统上的编译 - 所以请不要发布给大型,封闭源库的链接!

有没有人遇到任何可能做到这一点的事情,或者理解JPEG文件格式(我想我可能在这里指的是JFIF文件格式)告诉我如何开始自己的解决方案呢?

c++ jpeg openvms

5
推荐指数
1
解决办法
7404
查看次数

OpenVMS上的Java?

我们在OpenVMS Alpha和Integrity服务器上运行批处理文件.到目前为止,它们都是用COBOL编写的.您可以想象,有很多原因导致无法维持该过程.

与此同时,我们拥有一支使用Eclipse并且非常了解Java的开发人员团队.是否可以将Eclipse与OpenVMS一起使用?

java eclipse vms openvms

5
推荐指数
1
解决办法
2200
查看次数

在OpenVMS上创建线程转储

如何从OpenVMS上正在运行的Java进程中检索线程转储?该过程不支持JMX.我正在寻找类似kill -QUITUnix或Ctrl+BreakWindows的东西.

编辑:我在这里找到了答案:http: //h18012.www1.hp.com/java/documentation/1.6.0/ivms/docs/user_guide.html#javaenable_sigquit_mailbox

java thread-dump openvms

5
推荐指数
1
解决办法
335
查看次数

C++中的信号处理

类型的void (*)(int)参数与类型的参数不兼容__sighnd64_t

下面是我的简单代码:

#include <iostream>
#include <string>
#include <signal.h>
#include <ctype>
#include <stdlib.h>
#include <stdio.h>
typedef struct mystrcut
{

  int a;
  char *b;

} mystr;

void set_string ( char **, const char * );
void my_handler(int s)
{
    printf("Caught signal %d\n",s);
    exit(1);

}

int main()
{
    const std::string str1[] = {"hello1", "hello2"};
    char str2[50];
    size_t size1 = str1[1].size();
    cout << size1;
    memcpy (str2, str1[1].c_str(), size1);

    cout << str2;
    mystr *m = NULL;
    m = new mystrcut;
    m->a …
Run Code Online (Sandbox Code Playgroud)

c++ signal-handling openvms

5
推荐指数
1
解决办法
1239
查看次数

OpenVMS定时器精度,优于毫秒精度.

我想知道哪个函数在C语言中为OpenVMS提供最佳的精度/准确度.

我们有一台运行OpenVMS V8.3-1H1的HP Integrity rx2660服务器.

到目前为止,我的搜索指向$ GETTIM_PREC,它提供100纳米分辨率但毫秒精度.它比这更好吗?

问候

c performance benchmarking openvms

5
推荐指数
1
解决办法
339
查看次数

什么是VMS中unix的等效命令

我在vms中有一个工具xyz.我想获取安装它的位置.例如在unix中我们可以通过使用哪个命令来实现这一点.所以请帮我vms相当于这个命令.

unix vms openvms

3
推荐指数
1
解决办法
556
查看次数

当用作大小初始值设定项时,OpenVMS Pascal常量不是常量

我认为演示问题的最简单方法是举个例子.代码:

PROGRAM CONSTANTSTRING(OUTPUT);

CONST
    C_MaxLength = 30;

VAR
    small_string : VARYING[5] OF CHAR VALUE 'alpha';

PROCEDURE LocalProc(
    localstring : VARYING[C_MaxLength] of CHAR
);
BEGIN
    writeln('localstring length: ', localstring.LENGTH);
    writeln('localstring size: ', SIZE(localstring.BODY));
    writeln('C_MaxLength: ', C_MaxLength);
END;

BEGIN
    writeln('small_string length: ', small_string.LENGTH);
    writeln('small_string size: ', SIZE(small_string.BODY));
    writeln('C_MaxLength: ', C_MaxLength);

    LocalProc(small_string);
END.
Run Code Online (Sandbox Code Playgroud)

编译:

>pascal /version
HP Pascal I64 V6.1-116 on OpenVMS I64 V8.4
>pascal constantstringinit
>link constantstringinit
>run constantstringinit
Run Code Online (Sandbox Code Playgroud)

并输出:

small_string length:          5
small_string size:          5
C_MaxLength:         30
localstring length:          5
localstring …
Run Code Online (Sandbox Code Playgroud)

pascal openvms

3
推荐指数
1
解决办法
64
查看次数