empujando una matriz a una función en c ++?
Frecuentes
Visto 113 equipos
0
{
int a[3];
mainClassStack.pushNumber(a[1,2,3]);
break;
}
void stack_class::pushNumber(int numberFunc)
{
if(head==NULL)
{
head = new stack_struct;
head->number = numberFunc;
head->next_number = NULL;
tailPointer=head;
}
else
{
pointerFunc = new stack_struct;
pointerFunc->number=numberFunc;
pointerFunc->next_number=NULL;
head->next_number=pointerFunc;
head=pointerFunc;
}
}
void stack_class::pushNumber(char charFunc)
{
int a=0;
a=charFunc;
if(head==NULL)
{
head = new stack_struct;
head->number = a;
head->next_number = NULL;
tailPointer=head;
}
else
{
pointerFunc = new stack_struct;
pointerFunc->number=a;
pointerFunc->next_number=NULL;
head->next_number=pointerFunc;
head=pointerFunc;
}
}
void stack_class::pushNumber(int arrayFunc[3])
{
if(head==NULL)
{
for(int i=0;i<3;i++)
{
head = new stack_struct;
head->number = arrayFunc[i];
head->next_number = NULL;
tailPointer=head;
}
}
else
{
for(int i=0;i<3;i++)
{
pointerFunc = new stack_struct;
pointerFunc->number=arrayFunc[i];
pointerFunc->next_number=NULL;
head->next_number=pointerFunc;
head=pointerFunc;
}
}
}
Estoy sobrecargando funciones e insertando una matriz en la función adecuada que luego agregará los valores de las matrices a una lista vinculada dinámica. Hasta ahora he escrito esto, pero cuando trato de imprimir la lista enlazada, muestra basura. ¿Qué estoy haciendo mal aquí?
3 Respuestas
1
¿Tiene esto más sentido para ti?
void Foo(int arg[])
{
printf("%i\n", arg[0]);
printf("%i\n", arg[1]);
printf("%i\n", arg[2]);
}
int main()
{
int a[3] = {1,2,3};
Foo(a);
return 0;
}
La salida es:
1
2
3
Respondido 11 Abr '13, 04:04
sí, ahora tiene sentido. Curiosamente, probé exactamente lo mismo unos minutos antes de publicar esta pregunta y no funcionó, pero ahora está funcionando. - usuario2155612
0
Para dejar más claro lo que otros señalan, el operador de coma devuelve el último valor de la serie. El valor de la expresión (1, 2, 3)
es, por lo tanto 3
, y entonces la expresión a[1, 2, 3]
no es más que una forma larga de decir a[3]
.
Pero hay algo más que parece tonto de inmediato, que es este ciclo aquí:
if(head==NULL)
{
for(int i=0;i<3;i++)
{
head = new stack_struct;
head->number = arrayFunc[i];
head->next_number = NULL;
tailPointer=head;
}
}
tu apuntas head
a algo nuevo, coloque un par de cosas dentro de él, y luego configure tailPointer para que apunte a lo mismo nuevo... pero luego haga lo mismo inmediatamente dos veces más. ¿Ves el problema? Al final del bucle, ha creado tres elementos cuyos next_number
los valores son todos NULL
y head
y tailPointer
ambos apuntan a lo mismo: el último creado. No tiene nada que apunte a los dos primeros elementos que creó, y ninguno de ellos se apunta entre sí. En otras palabras, no hay ninguna lista enlazada al final de esta operación (aunque hay algunos objetos nuevos en algún lugar de la memoria sin forma de acceder a ellos o desasignarlos).
Probablemente quiera tener su declaración if dentro de su bucle, en lugar de al revés, pero necesita cambiar más que eso, porque el código en el otro bucle for también podría ser un poco problemático. Crea un nuevo elemento, luego configura un vínculo desde el elemento principal al nuevo, pero luego mueve el elemento principal para apuntar al nuevo, por lo que está agregando con éxito un elemento al final de la lista, pero dejándose con un head
variable que en realidad está apuntando a la cola.
Sugiero que la mejor manera de ver lo que está pasando es tomar un lápiz y papel, escribir sus variables y dibujar cuadros para representar sus objetos, con sus variables miembro adentro, luego siga su código paso a paso, escribiendo valores de variables o borrando y dibujando flechas desde los punteros para mostrar dónde aterriza cada uno. Creo que inmediatamente verá dónde falla su algoritmo.
Respondido 11 Abr '13, 05:04
0
C++ no permite pasar una matriz completa como argumento a una función. Sin embargo, puede pasar un puntero a una matriz especificando el nombre de la matriz sin un índice.
Si desea pasar una matriz de una sola dimensión como argumento en una función, debe declarar el parámetro formal de la función de una de las siguientes tres formas y los tres métodos de declaración producen resultados similares porque cada uno le dice al compilador que un puntero entero va para ser recibido.
Camino-1
Parámetros formales como un puntero de la siguiente manera:
void myFunction(int *param) { . . . }
Camino-2
Parámetros formales como una matriz de tamaño de la siguiente manera:
void myFunction(int param[10]) { . . . }
Camino-3
Parámetros formales como una matriz sin tamaño de la siguiente manera:
void myFunction(int param[]) { . . . }
Respondido 11 Abr '13, 06:04
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c++ class or haz tu propia pregunta.
a[1,2,3]
no significa lo que crees que significa. es lo mismo quea[3]
. - BarmarEl código que pegaste está incompleto, comienza en medio de algo (un bucle, supongo, ya que tienes un
break
declaración). - Barmar@Barmar sí, el código es parte de un enorme
switch
declaración, tengo todas las otras partes cubiertas a excepción de esto. - user2155612@Barmar pero no
a[1,2,3]
Significa quea[0]=1
,a[1]=1
etc. - user2155612¿De dónde sacaste esa idea?
a[anything]
es la sintaxis para acceder a un elemento dea
.anything
es una expresión que se utiliza como índice de matriz. - Barmar