1

整数を32ビットマシンと64ビットマシンの両方で動作する必要のあるポインターに変換するFlexLMの継承コードがいくつかあります。整数は、scanfを使用して整数値を読み取るプログラムへの引数のargcから入力されています。

32ビットマシンと64ビットマシンの両方で機能するように、ポインターへの割り当てに適した値を取得するためにargc文字列を確実に読み取るにはどうすればよいですか?

現在、コードは次のようになっています。

// FlexLM includes this:
typedef char * LM_A_VAL_TYPE; /* so that it will be big enough for */
                              /* any data type on any system */

// My main() includes this:
[...]
if (!strcmp(argv[i], "-maxlen")) {
  int max = 0;
  i++;

  if (i >= argc) {
    break;
  }
  sscanf(argv[i], "%d", &max);
  if (!max) {
    fprintf(stderr, "Error: -maxlen %s Invalid line length\n", argv[i]);
  } else {
    lc_set_attr(lm_job, LM_A_MAX_LICENSE_LEN, (LM_A_VAL_TYPE)max);
  }
}
[...]

最初は使えると思っていたのですが、それに応じてuintptr_tどうやっscanfてサイズを知ることができるのでしょうか?おそらく、を使用してポインタ値として読み取る必要%pがありますが、マニュアルページには、確実に機能するかどうかについて疑問があります。

   p      Matches an implementation-defined set of sequences, which shall be the
          same as the set of sequences that is produced by the %p  conversion
          specification  of  the  corresponding fprintf()  functions.  The
          application  shall  ensure that the corresponding argument is a pointer
          to a pointer to void. The interpretation of the input item is
          implementation-defined. If the input item is a value converted earlier
          during the same program execution, the pointer that results shall
          compare equal to that value; otherwise, the behavior of the %p
          conversion specification is undefined.

#ifdefを使用して、ポインターのサイズに基づいて2つの別々のバージョンを作成するのは、コードに対する醜い疣贅のように思われるため、使用したくありません。

4

2 に答える 2

5

C99は、プラットフォームのuintptr_t引数に使用する正しいscanf形式指定子でinttypes.hあるマクロを定義することになっています。SCNuPTR

uintptr_t intptr = 0;
sscanf(argv[i], SCNuPTR, &intptr);
于 2012-09-01T14:03:21.050 に答える
0

32ビットプログラムは64ビットアーキテクチャで問題なく動作します。

int address = 0x743358;
int *foo = reinterpret_cast<int*>( address );

これがあなたが探しているものだと思います。

于 2012-09-01T13:50:31.503 に答える