2016-09-07 5 views
-1

ポストに申し訳ありません。私はこれを研究しましたが、まだこれを稼働させることに喜びはありません。質問には2つの部分もあります。コードのTWI Regコードをアプリケーション固有のものとして無視してください。ナットとボルトのCの問題に関するヘルプが必要です。Cが配列を返す関数

プロジェクトのメモリ使用量を減らすために、私は自分のTWI(wire.h lib)をATMEL328p用に書き始めました。それはまだlibに入れられていませんでしたが、私はそれをどうやってやったらいいのかわかりません...後でそれを知り、2は進行中の作業を続けていきます。

私が抱えている問題は、複数のバイトを読み取ることです。私は私が理解してどのようなアレイ

byte *i2cBuff1[16]; 

void setup() { 
    i2cBuff1 = i2cReadBytes(mpuAdd, 0x6F, 16); 
} 

/////////////////////READ BYTES//////////////////// 
byte* i2cReadBytes(byte i2cAdd, byte i2cReg, byte i2cNumBytes) { 
    static byte result[i2cNumBytes]; 
    for (byte i = 0; i < i2cNumBytes; i ++) { 
     result[i] += i2cAdd + i2cReg; 
    } 

    return result; 
} 

を返す必要が機能してい

問題1 :O)を、私はその機能がI 時点で静的バイト配列を宣言していますさからの戻り値を返します。 関数呼び出しは、ポインタの値が、指定されたバイト配列の戻り値として要求します。

うーん....それは動作しません....私は複数のサイトをチェックして、これは動作すると思います。私が取得エラーメッセージは次のとおりです。

MPU6050_I2C_rev1:232: error: incompatible types in assignment of 'byte* {aka unsigned char*}' to 'byte* [16] {aka unsigned char* [16]}' 
i2cBuff1 = i2cReadBytes(mpuAdd, 0x6F, 16); 

上記のコードサンプルが働いた場合に、問題2 [OK]を言います。スケッチで使用するメモリ量を減らそうとしています。関数呼び出し後にメモリー(必要)が解放されても、関数内の任意のメモリーを使用することによって、関数は呼び出されるときに何らかの方法で「スペース」の量を予約する必要があります。理想的には、メインプログラム内で重複している関数内の静的変数の使用を避けたいと考えています。

誰かが繰り返される関数呼び出しとのトレードオフを知っていますか?つまり、ビットシフト演算子を使用して関数呼び出しをループすることは、一度関数を呼び出してプロセスを完了し、戻ります。それとも、これは、Cが本当に最初にArrayの復帰をサポートしていないという点です。

これは意味があったと思って、ちょうど私が得た小さなものから最高を得たいと思っています。

BRダニー

+0

デバッグヘルプ(「なぜこのコードは動作しませんか?)」には、問題の内容、エラー、および問題の内容を再現するのに必要な最短コードが含まれている必要があります。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:最小、完全、および検証可能な例を作成する方法。 – Olaf

+0

@Olaf、今回はリンクを追加するのを忘れました。 Asker、please [look here!] –

+0

ありがとうOlaf .....質問を編集します。 – hoboBob

答えて

1

この行:

byte *i2cBuff1[16]; 

16のbyte*ポインタの配列としてi2cBuff1を宣言する。しかし、i2cReadBytesはポインタの配列を返しません。バイトの配列を返します。宣言は次のようになります。

byte *i2cBuff1; 

別の問題は、静的配列は、動的サイズを持つことができないということです。可変長配列は、関数が呼び出されるたびにサイズが変更できるように、自動配列でなければなりません。 malloc()で動的割り当てを使用する必要があります(代わりに、自動的にメモリをゼロにするため、calloc()を使用しました)。

byte* i2cReadBytes(byte i2cAdd, byte i2cReg, byte i2cNumBytes) { 
    byte *result = calloc(i2cNumBytes, sizeof(byte)); 
    for (byte i = 0; i < i2cNumBytes; i ++) { 
     result[i] += i2cAdd + i2cReg; 
    } 

    return result; 
} 
+0

こんにちは、バマー、返答をありがとう、私はあなたのソリューションを試みたが、結果を得た...... MPU6050_I2C_rev1:361:エラー: 'result'のストレージサイズは一定ではない 静的バイト結果[i2cNumBytes]; .....遅くなり、明日は再び入力をお願いします ^ – hoboBob

+0

解決策を回答に追加しました。 – Barmar

+0

Ok .... mallocは... hmmのような(x、y)m – hoboBob

関連する問題