0

私は本当に古くて大きなx86プロジェクトを持っているので、それをx64アーキテクチャに移植する必要があります。残念ながら、int/memsize型の混合に関連するエラーは非常に多くあります。例えば:

std::vector<T> vec;
for(int i = 0; i < vec.size(); ++i) // error, i must be size_t
{
}

したがって、私が欲しいのは、そのようなすべての文字列をintをsize_tに変更することで置き換えることです。正式には、問題は次のように述べることができます。

次の条件に一致する文字列を検索します。

for(int [var name] = 0; [var name] < [container name].size(); [any expression]) 

次のように置き換えます。

for(size_t [var name] = 0; [var name] < [container name].size(); [any expression])

VisualStudio2008を使用しています。この問題に対する最も正しい解決策を探しています。ありがとうございました。

4

2 に答える 2

1

何を見つけるための正規表現:for[:b\n]*\([:b\n]*int[:b\n]+{:i}[:b\n]*=[:b\n]*0[:b\n]*;[:b\n]*{:i}[:b\n]*\<[:b\n]*{:i}\.size[:b\n]*\([:b\n]*\);[:b\n]*

次のように置き換えます:(for(size_t \1 = 0; \2 < \3.size();終了スペースに注意してください)

于 2012-08-23T11:55:36.450 に答える
0

「最も正しい解決策」には、C ++文法を理解するパーサーを使用し、解析ツリーを操作した後、そのパーサーを使用してコードを書き直すことが含まれる可能性があります。C ++の文法は単純ではなく、このようなタスクの場合、プロジェクトが非常に大きい場合を除いて、技術的に正しいというよりも、ほとんどの場合に機能するものを使用するように戻す必要があります。

最も簡単な方法は、この作業を行う一連の検索/置換正規表現を作成することです。正規表現は、ありそうなユースケースに近いものですが、次の例からわかるように、正規表現は読みにくい可能性があります。 。

これがPythonで書かれたユーティリティで、あなたがやろうとしていることを近似しています。stdinまたはコマンドラインでファイルを取得し、stdoutで変換されたテキストを生成します。正規表現は、同じ識別子との一致に厳密です。

#!/usr/bin/env python

import fileinput
import sys
import re

regex = re.compile(
    r"""(?P<start>^\s*for\s*\(  # Leading for construct
      )(?P<type>int)(?P<remainder>\s+(?P<identifier>[A-Za-z_][0-9A-Za-z]*)  # int type followed by identifier
      \s*=\s*0\s*;  # Matches '= 0;'
      \s*(?P=identifier)\s*<\s*(?P<container>[A-Za-z_][0-9A-Za-z]*)\.size\(\); # ident < container.size();
      [^)]*\).*$)""",
      re.VERBOSE)

for line in fileinput.input():
    line = line.rstrip()
    match_object = regex.match(line)
    if match_object is not None:
        line = match_object.expand('\g<start>size_t\g<remainder>')
    print line
于 2012-08-23T12:39:14.003 に答える