2010-11-26 18 views
6

He creado una matriz:matriz como parámetro

CString* pstrArray = new CString[nMySize]; 

Ahora, ¿cómo puedo pasar a una función para ser llenado? ¿Cuál es el parámetro real?

void FillThisArray(what goes here?) 
{ 
} 
+3

¿En qué sentido es esta una C pregunta? esto no parece válido C ... – SingleNegationElimination

Respuesta

4

se debe utilizar una clase de contenedor: CStringArray

void FillThisArray(CStringArray & rMyStrings) 

Si no desea esto (no veo ninguna razón posible, pero de todos modos):

void FillThisArray(CString* strings, size_t num) 
{ 
    // example 
    for(size_t s=0; s<num; s++) 
    { 
    strings[s].Format(_T("This is the %d. string"), s+1); 
    } 
} 
+3

o mejor aún use 'std :: vector ' – Naveen

+0

@Naveen: Me gustaría decir que si el OP utiliza std :: string –

-1
void FillThisArray(CString* pstrArray) 

No U puede hacer esto?

+0

No, ¿cómo debe saber el OP el número de artículos válidos? –

1

lo necesario para pasar el puntero al primer elemento, y el número de elementos disponibles:

void FillThisArray(CString* strings, size_t num) 
{ 
} 
0

Debes pasar un dyma matriz asignada de forma electrónica como un puntero a su primer elemento. Hay dos sintaxis para que, ambos son equivalentes:

void FillThisArray(CString* strArray) 
{ 
} 

o

void FillThisArray(CString strArray[]) 
{ 
} 

puede utilizar el parámetro strArray como una matriz dentro de la función. Tenga en cuenta que el puntero no contiene información sobre el tamaño real de su matriz, por lo que si el tamaño no está disponible en todo el mundo, debe pasar el tamaño como el segundo parámetro. hth

4

CString * pstrArray = NULL; pstrArray = new CString [nMySize];

Por simplicidad:

CString* pstrArray = new CString[nMySize]; 

Ahora cómo puedo pasarlo a una función para ser llenado? ¿Cuál es el parámetro real?
void FillThisArray (????) {}

la interfaz más obvia es:

void FillThisArray(CString* pstrArray, size_t n) 

dando un paso atrás:

  • tenga en cuenta que toda la memoria para nMySize el CString s predeterminado-construido será asignado por esa única declaración nueva
  • debe considerar usar un std::vector<std::string>
    • std::vector porque:
      • elimina automáticamente la memoria para todas las cuerdas cuando se sale del ámbito
      • por defecto el uso de la memoria aumentará más gradualmente a medida que se añaden cadenas usando, por ejemplopush_back(), y en tal uso puede crecer más allá del tamaño inicial sin ningún trabajo especial de su parte
      • puede espacio de forma proactiva reserva para cuerdas nMySize, y/o crearlos, al construir el vector si realmente quiere que el comportamiento
    • std::string porque:
      • es la portátil tipo de cadena definido por el estándar de C++, y reduce el bloqueo a sus dependencias
      • que dijo, puede ser impracticable o ineficaz para evitar de alguna ci rcumstances
3

Si hay una muy buena razón por la que no se puede utilizar una clase de contenedor estándar, considerar la adopción de un enfoque de estilo iterador. Esto ahorraría tener que preocuparse del tamaño de la matriz es en su función:

void FillThisArray(CString* begin, CString* end) 
{ 
    for (CString* iter = begin; iter != end; ++iter) 
    { 
     *iter = "Some text"; 
    } 
} 

int main() 
{ 
    CString* pstrArray = new CString[nMySize]; 
    FillThisArray(&pstrArray[0], &pstrArray[nMySize]); 

    for (int i = 0; i < nMySize; ++i) 
    { 
     assert(pstrArray[i] == "Some_text"); 
    } 

    delete[] pstrArray; 
} 

usted podría incluso la plantilla de su función de manera que no está ligada a la aplicación (cuestionable) del pstrArray:

template <typename T> 
void FillThisArray(T begin, T end) 
{ 
    for (T iter = begin; iter != end; ++iter) 
    { 
     *iter = "Some text"; 
    } 
} 

int main() 
{ 
    { 
     CString* pstrArray = new CString[nMySize]; 
     FillThisArray(&pstrArray[0], &pstrArray[nMySize]); 

     for (int i = 0; i < nMySize; ++i) 
     { 
      assert(pstrArray[i] == "Some text"); 
     } 

     delete[] pstrArray; 
    } 
    { 
     std::vector<std::string> better(nMySize); 
     FillThisArray(better.begin(), better.end()); 
     for (int i = 0; i < nMySize; ++i) 
     { 
      assert(better[i] == "Some text"); 
     } 
    } 
} 
+0

+1 para un agradable estilo de iterador "C++ - y" - aunque no tiene ningún beneficio práctico aquí, desalienta la presunción de que la función es necesaria para llenar toda la matriz. Las plantillas son una buena idea, aunque si el tipo de datos que se asignan a los elementos es demasiado específico, se vuelven menos útiles sin mayor flexibilidad para el generador. "Esto le ahorrará tener que preocuparse de qué tan grande es la matriz en su función" - no es cierto porque pasar '& array [n]' contra 'n' claramente no ahorra mucho ;-P. No tener que pasar tampoco sería un salvamento. –

+0

Gracias Tony. Buen punto sobre '& array [n]', lo que quise decir es que esto elimina el tamaño de la implementación de la función. Los iteradores tienen muchos otros beneficios que yo no tuve en cuenta (considere invertir el orden, predicados selectivos, etc.). – Johnsyweb