2017-11-08 7 views
0

関数の引数として(ARM上のインテル上で動作し、奇数実行結果):パッシング「typedefの文字IPString [17]」私が問題に遭遇してきた

typedef char IPString[17]; 
... 
IPString ipStr; 
extractIPfromURL("https://192.168.0.1:80", ipStr); 

注:私は使用できません。 std :: stringは、GCCとIARでコードをコンパイルする必要があるためです。 IARはstd :: stringをサポートしていますが、ルールは使用しません。

extractIPfromURLの署名がある場合:

void extractIPfromURL(const char* url, IPString *ipStr); 

と実装が使用しています:ポインタのための

const char* ep; 
... 
strncpy(ipStr[0], &ep[start], end-start+1); 
*ipStr[end+1] = '\0'; 

、発信者:

IPString ipStr; 
extractIPfromURL("https://192.168.0.1:80", &ipStr); 

をすべての作品。

しかし、私は署名を使用した場合:

void extractIPfromURL(const char* url, IPString &ipStr); 

と実装:

const char* ep; 
... 
strncpy(&ipStr[0], &ep[start], end-start+1); 
ipStr[end+1] = '\0'; 

参照の発信者:

IPString ipStr; 
extractIPfromURL("https://192.168.0.1:80", ipStr); 

にARM上のコードは、私が書き直しとして動作するように見えますいくつかのスタックと私のループは、2つのアイテムを繰り返して2つのアイテムを永遠に繰り返します:0,1、 0、1、0、1、等

Iは、明示的な参照宣言試み:

typedef char (&IPStringRef)[17]; 

がなくARM(ラズベリーPI)上の同じループを得ました。

私はここでtypedefを正しく使用していないと確信していますが、間違っていることは正確に分かりません。

+1

std :: stringを使用してください –

+1

「すべて動作しますか?この場合、 '* ipStr [end + 1] = '\ 0';' extractIPfromURL'の内側が間違っているので、これは意味をなさないようです。その場合、 '(* ipStr)[end + 1] = '\ 0';が必要です。かっこは絶対に必要です。さもなければ、コードはそれがあなたが思うものをしません。 – AnT

+1

配列を参照渡しするのは本当に意味がありますか? 'void extractIPfromURL(const char * url、IPString ipStr);'を直接使わないのはなぜですか? (配列は最初の要素へのポインタにとにかく減衰します。) – Cameron

答えて

0

あなたの質問はむしろ不明です。途中で質問をすると、「もし私がこれをすれば、すべてがうまくいく」と言います。だから明らかな解決策は、そうすることです。

質問の最初に投稿したコードがうまくいかない理由を尋ねていると仮定しています。そのコードを仮定し

は次のとおりです。

typedef char IPString[17]; 
void extractIPfromURL(const char* url, IPString *ipStr); 

void some_function(void) 
{ 
    IPString ipStr; 
    extractIPfromURL("https://192.168.0.1:80", ipStr); 
} 

あなたはコンパイルエラーを取得する必要があります。エラーメッセージが表示されない場合は、コンパイラに渡すフラグを調整する必要があります。引数タイプchar *がパラメータタイプchar (*)[17]と一致しないため、コードは制約違反です。

引数はパラメータの型と一致する必要があります。引数には、少なくとも3つの異なるオプションがあります(IPstringIPstring *IPstring &)。一致する引数フォームを渡していれば、関数内でこのパラメータを正しく使用することができます(コードにはもちろん、他のバグは含まれていません)。

まだ問題が解決しない場合は、MCVEを投稿してください。現時点では、ビットとピースだけを投稿して以来、ARMで見られる問題の原因は何かを推測しています。

また、typedefをまったく使用しないことも考えられます。


このコードは疑わしいです:

strncpy(&ipStr[0], &ep[start], end-start+1); 
ipStr[end+1] = '\0'; 

startがゼロでない場合、あなたはあなたが実際に文字をコピーし終えたところの終わりを越え\0ある程度の距離を置いています。 strncpyを避けることをお勧めします。これは、正しく使用することと、後でコードを確認するときの正しい使用方法を確認することの両方が比較的困難なことです。

関連する問題