9

静的配列を返すように作成した関数がありますが、効率を上げるために動的配列を返すようにする方法はありますか?

#include <stdio.h>
#include <stdlib.h>
#include "header.h"

int *charpos(char *str, char ch)
{
    int *bff, bc, ec, i, strln;
    static int ret[255];
    bc = 0;
    ec = 0;

    for(i = 0; str[i] != '\0'; i++)
        ;

    strln = i;
    for(i = 0; i <= strln; i++)
    {
        if(str[i] == ch)
            ec++;
    }

    bff = malloc(sizeof(int)*ec);
    if(sizeof(bff) > sizeof(ret))
    {
        free(bff);
        return 0;
    }

    for(i = 0; i <= 255; i++) ret[i] = '\0';
    for(i = 0; i <= strln; i++)
    {
        if(str[i] == ch)
        {
            ret[bc] = i;
            bc++;
        }
    }

    free(bff);
    return ret;
}
4

2 に答える 2

6

関数は配列、期間を返すことができません。もちろん、呼び出し元によって割り当てられたメモリのブロックへのポインタまたはポインタを取ることができます。だから、あなたの場合...

int *ret = malloc(255 * sizeof int);  // caller must deallocate!

ただし、これによりコードのセマンティクスが変更されます。これで、関数の呼び出し元はfree()、返されたポインターを呼び出す責任があります。そうしないと、メモリリークが発生するため、これまで存在しなかった複雑さが追加されます。私は代わりにこのようなものを好むでしょう:

void charpos(int *p, size_t size, const char *str, char ch) {
    // initialize the memory 
    memset(p, 0, size * sizeof int);
    
    // your other code here...

    size_t len = strlen(str);
    // fill the caller's memory
    for(i = 0; i < len; ++i)
    {
        if(str[i] == ch)
            p[bc++] = i;
    }
}

int静的に割り当てられた配列の最初の要素を参照するポインタを返しています。

于 2012-07-31T22:39:43.633 に答える
0

static intを使用すると、必要以上のスペースを実際に割り当てることができ、ダイナミクスについて心配する必要はありません。これが私がそれを解決した方法です:

//indefinite reads, actually only up to 20
int * readDataAD7142(int addr, int numRegs){
  static int data[20];
  int i = 0;

  //Do something with this data array. Something that requires less then 20 elements

  return data;  
}

これがそれを呼び出すコードです

 int *p;
 int i;
 p = readDataAD7142(0x0000, 6);

 for(i=0; i<6; i++){
  Serial.println(p[i], HEX);
 }

あなたが必要とするより多くのメモリと少しの時間があるなら完璧で簡単です(あなたも少し怠惰である必要があります)。

于 2017-01-30T16:47:04.440 に答える