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?)
{
}
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?)
{
}
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);
}
}
o mejor aún use 'std :: vector
@Naveen: Me gustaría decir que si el OP utiliza std :: string –
void FillThisArray(CString* pstrArray)
No U puede hacer esto?
No, ¿cómo debe saber el OP el número de artículos válidos? –
lo necesario para pasar el puntero al primer elemento, y el número de elementos disponibles:
void FillThisArray(CString* strings, size_t num)
{
}
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
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:
CString
s predeterminado-construido será asignado por esa única declaración nuevastd::vector<std::string>
std::vector
porque:
push_back()
, y en tal uso puede crecer más allá del tamaño inicial sin ningún trabajo especial de su partevector
si realmente quiere que el comportamientostd::string
porque:
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");
}
}
}
+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. –
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
¿En qué sentido es esta una C pregunta? esto no parece válido C ... – SingleNegationElimination