2011-01-31 56 views
3

好吧,這是我的第一個C程序,因爲「hello wolrd」,我需要一些幫助realloc。我有一個動態數組定義爲全局變量。如何動態重新分配一個全局變量C

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <errno.h> 

double *close = NULL; 
unsigned int closesize = 0; 

我想增加一個方法中的數組。但我得到一個seg故障錯誤。我已經嘗試過這樣的:

void addInputParamReal(
    OCIExtProcContext *ctx 
    //,unsigned int paramIndex 
    //,OCINumber *value 
    ,double value 
) 
    { 
    double dtemp; 
    double **myclose = &close; // last try, make a pointer to my outside array 
    //OCINumberToDouble(ctx,value,&dtemp); 
    dtemp = 12.4; //just now 

    //Not good 
    *myclose = (double *) realloc (*myclose,(closesize+1) * sizeof(double)); 
    close[closesize++] = dtemp; 
    } 

你能幫我嗎? 謝謝 克里斯

+3

注:1增加你的數組大小每次都是令人難以置信效率低下。典型的方法是例如當流量超過時,將尺寸加倍。 – 2011-01-31 16:28:25

+1

Your code * looks * ok;雙指針是不必要的。但是,ti在很大程度上取決於`closesize`是否受到此函數的影響。 – 2011-01-31 16:30:32

+0

問題是,我從oracles extproc接口調用這個方法。我不知道運行時的大小,我不能指定一個數組。所以我必須逐個添加元素。每次調用後局部變量都會消失(是的,應該是這樣),所以我必須「記住」外部的值。 closesize不會受到「addInputParamReal」之外的其他方法的影響。 – christian 2011-01-31 16:43:31

回答

1

每次擴展1會有點低效。通常情況下,你會由一個塊(或者是固定的大小或電流大小的百分比)分別從數組索引延伸,然後跟蹤的物理尺寸(closesize)的(稱之爲closeindex):

if (closeindex == closesize) 
{ 
    double *tmp = realloc(close, sizeof *tmp * (closesize + EXTENT)); 
    if (tmp) 
    { 
    close = tmp; 
    closesize += EXTENT; 
    } 
    else 
    { 
    // panic 
    } 
} 
close[closeindex++] = ...; 

我敢肯定,你可以想出一種方法讓這個閱讀更優雅一點。

0

一些reallocs實現可能讓你傳入一個初始的NULL,有些可能不傳遞。例如,在Linux上,應該允許NULL,但我不認爲這是一個絕對的真理。您應該在程序開始時嘗試使用正常的malloc()調用來初始化它。

雖然其他人都是正確的,但調整大小1是非常低效的。瞭解你的數據將如何增長,大致是非常重要的。如果沒有其他事情,每次增加一倍而不是增加一倍。

0

弗雷德Nurk在上述評論sugessted,我將其添加爲答案:

變量不得接近命名...現在我改名爲它和它工作正常。 ......但我的VI不突出「關閉」 :-)

--edit1:
我現在所做的就是:

void addInputParamReal(
    OCIExtProcContext *ctx 
    ,OCINumber *value 
) 
    { 
    // do we need more mem? 
    if (bar1size==0) 
    { 
     bar1close = (TA_Real *) malloc(initsize * sizeof(TA_Real)); 
     bar1size=initsize; 
    } 
    else if (bar1size<bar1idx || bar1size == 65536) 
    { 
     raise_exception(ctx,__LINE__,"addInputParamReal,memory allocation failed"); 
     return; 
    } 
    else if (bar1size==bar1idx) 
    { 
     bar1close = (TA_Real *) realloc (bar1close, (bar1idx*2) * sizeof(TA_Real)); 
     bar1size = bar1idx*2; 
    } 

    //assign value 
    double dtemp; 
    OCINumberToDouble(ctx,value,&dtemp); 
    bar1close[bar1idx++] = (TA_Real) dtemp; 
    } 
相關問題