problema con array de punteros a cadenas

Iniciado por MessageBoxA, 10 Julio 2014, 23:27 PM

0 Miembros y 1 Visitante están viendo este tema.

MessageBoxA

tengo el problema con esta linea
char *paises_miembros[] = {"Argentina","Belgica","Estados Unidos","Francia","Reino Unido",
"Grecia","Hungria","Italia","Nueva Zelanda","Rusia","Suecia","Japon"};

y es que el compilador me da un error


9 77 C:\Users\Nerys\Desktop\main.cpp [Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]
SI LA MATRIX FUERA PERFECTA.... ESTARÍA ESCRITA EN C++

eferion

el array así declarado apunta a cadenas que se encuentran en una zona de la memoria que es de solo lectura... te está diciendo que tienes que poner el modificador const a paises_miembros.

const char *paises_miembros[] = {"Argentina","Belgica","Estados Unidos","Francia","Reino Unido",
"Grecia","Hungria","Italia","Nueva Zelanda","Rusia","Suecia","Japon"};


MessageBoxA

#2
entiendo ya hice la modificacion pero tengo otro problema y no hayo la solucion y es que cuando llamo a la funcion mayor_menor el programa se me congela, dejo lo que llevo hecho

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <conio.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

const char *paises_miembros[] = {"Argentina","Belgica","Estados Unidos","Francia","Reino Unido",
"Grecia","Hungria","Italia","Nueva Zelanda","Rusia","Suecia","Japon"};

const char *paises_postulados[] = {"Japon","Brasil","Suecia","Mexico"};

int contador=0;

void mayor_menor(int array[]);

int main() {



int votos[]={0,0,0,0};

printf("BIENVENIDO AL SISTEMA DE VOTACION PARA LA ELECCION DE LA SEDE DE LOS JUEGOS OLIMPICOS\n");

printf("\npara iniciar las votaciones presiones cualquier tecla...");

getch();


printf("\n\nlos paises miembros del comite son los siguientes: ");



for(contador=0;contador<12;contador++)
{
printf(" %s ",paises_miembros[contador]);
}

getch();

printf("\n\nlos paises postulados son los siguientes: ");

for(contador=0;contador<4;contador++)
{
printf(" %s ",paises_postulados[contador]);
}

getch();


printf("\n\n \t\t\t INICIA PROCESO DE VOTACION");

getch();
contador=0;
int opcion=0;

while(contador<10)
{
opcion=0;
printf("\n\n %s cual de las siguientes opciones elige para que sea la sede de los proximos juegos olimpicos?",paises_miembros[contador]);
printf ("\n\n 1.%s 2.%s 3.%s 4.%s",paises_postulados[0],paises_postulados[1],paises_postulados[2],paises_postulados[3]);
printf("\n elija una opcion del 1 al 4: ");
scanf("%d",&opcion);
if(opcion>0 && opcion<5)
{
votos[opcion-1]=votos[opcion-1]+1;
contador++;
}
else
{
printf("\n\nOPCION INVALIDA!!!");
}

}

  mayor_menor(votos);
 
return 0;
}


void mayor_menor(int array[])
{

  int  mayor,menor,*posicion1=0, *posicion2=0;

mayor=votos[0];

for(contador=1;contador<4;contador++)
{
if (votos[contador]>mayor)
{
mayor=votos[contador];
*posicion1=contador;
}
}

menor=votos[0];

for(contador=1;contador<4;contador++)
{
if (votos[contador]<menor)
{
menor=votos[contador];
*posicion2=contador;
}
}  
  printf("\n\nEL PAIS GANADOR ES %s con %d votos",paises_postulados[*posicion1], mayor);
 
 
      printf("\n\nEL PAIS CON MENOS VOTOS ES %s con %d votos",paises_postulados[*posicion2],menor);

}
SI LA MATRIX FUERA PERFECTA.... ESTARÍA ESCRITA EN C++

CalgaryCorpus

Quitale el * a las variables posicion1 y posicion2. Las usas como indices, asi que son enteros, no punteros.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

leosansan

Antes que nada debes cambiar la función mayor_menor a algo como esto:

Código (cpp) [Seleccionar]
void mayor_menor(int votos[])

ya que haces uso del array votos en ella.

Y el array votos lo puedes inicializar de forma más simple:

Código (cpp) [Seleccionar]
int votos[10]={0};

Si quieres usar punteros, por lo que sea, en lugar de :

Código (cpp) [Seleccionar]
*posicion1=contador;

deberías hacer:

Código (cpp) [Seleccionar]
posicion1 = &mayor_;

Pero ello se traduce en un error lógico y es que el puntero posicion1 apuntaría siempre a contador, con lo que su valor sería siempre 4.

En su lugar habría que usar unas nuevas variables donde guardar el mayor valor de contador y hacer que el puntero apunte a esa variable. Y lo mismo con la posicion2.

Algo como, y aprovecha el for para calcular tanto el mayor como el menor, en lugar de dos for:

Código (cpp) [Seleccionar]

****************************************
  int mayor_= 0, menor_= 0;
  mayor = votos[0];
  menor = votos[0];
  posicion1 = &mayor_, posicion2 = &menor_;
  for( contador = 1 ; contador < 4 ; contador++ ){
    if ( votos[contador] > mayor){
mayor_= contador ;
mayor = votos[mayor_];
posicion1 = &mayor_;
    }
    else{
menor_= contador ;
menor = votos[menor_];
posicion2 = &menor_;
    }
}
***************************


Pero doctores tiene el foro en punteros y yo no soy uno de ellos, así que es muy posible que lo que propongo sea mejorable.

En cualquier caso la propuesta de CalgaryCorpus es la más razonable, sólo pongo lo anterior si es que sí o sí debes  usar punteros.

¡¡¡¡ Saluditos! ..... !!!!



CalgaryCorpus

Es superfluo asignar los punteros en cada vuelta.
Si se eliminan esas asignaciones el resultado será el mismo.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

MessageBoxA

#6
ok me quedo mejor con la segunda sugerencia. ahora como para imprimir el pais que esta en la posicion del mayor y menor??

e intentado de varias formas pero nada

Código (cpp) [Seleccionar]
printf("\n\nEL PAIS GANADOR ES %s con %d votos",paises_postulados[(int)posicion1], mayor);
printf("\n\nEL PAIS GANADOR ES %s con %d votos",paises_postulados[posicion1], mayor);
printf("\n\nEL PAIS GANADOR ES %s con %d votos",paises_postulados[*posicion1], mayor);





Cita de: CalgaryCorpus en 11 Julio 2014, 16:30 PM
Es superfluo asignar los punteros en cada vuelta.
Si se eliminan esas asignaciones el resultado será el mismo.


si eso lo acabo de notar, donde me dices que quite los asteriscos? en la declaracion o en la asignacion dentro del for??
SI LA MATRIX FUERA PERFECTA.... ESTARÍA ESCRITA EN C++

leosansan

Cita de: CalgaryCorpus en 11 Julio 2014, 16:30 PM
Es superfluo asignar los punteros en cada vuelta.
Si se eliminan esas asignaciones el resultado será el mismo.


Ya, estoy "totalmente" de acuerdo contigo. Sólo era una opción por si "sí o sí" tenía que usar punteros. No sé, a lo mejor era una tarea en la que obligaban a hacer uso de los mismos.

Si no es así es una redundancia su uso y tu propuesta es más que suficiente.

Cita de: MessageBoxA en 11 Julio 2014, 16:38 PM
ok me quedo mejor con la segunda sugerencia. ahora como para imprimir el pais que esta en la posicion del mayor y menor??

e intentado de varias formas pero nada

Código (cpp) [Seleccionar]
printf("\n\nEL PAIS GANADOR ES %s con %d votos",paises_postulados[(int)posicion1], mayor);
printf("\n\nEL PAIS GANADOR ES %s con %d votos",paises_postulados[posicion1], mayor);
printf("\n\nEL PAIS GANADOR ES %s con %d votos",paises_postulados[*posicion1], mayor);


Sería:

Código (cpp) [Seleccionar]
printf("\n\nEL PAIS GANADOR ES %s con %d votos",paises_postulados[*posicion1], mayor);
  printf("\n\nEL PAIS CON MENOS VOTOS ES %s con %d votos",paises_postulados[*posicion2],menor);


Cita de: MessageBoxA en 11 Julio 2014, 16:40 PM
si eso lo acabo de notar, donde me dices que quite los asteriscos? en la declaracion o en la asignacion dentro del for??

En ese caso de todos los lados.


¡¡¡¡ Saluditos! ..... !!!!




MessageBoxA

agradecido por su colaboracion, ahora piensen en eso... creo que en el segundo for para evaluar el menor tiene un error y es que de manera premeditada asigne votacion de la siguiente manera. japon =7  brazil=2 suecia=1 mexico=0
y me sale bien el del mayor pero en el menor me imprime que el de menor votos es suecia con 1 voto cuando en realidad es mexico
SI LA MATRIX FUERA PERFECTA.... ESTARÍA ESCRITA EN C++

leosansan

#9
Cita de: MessageBoxA en 11 Julio 2014, 16:56 PM
............................................
y es que de manera premeditada asigne votacion de la siguiente manera. japon =7  brazil=2 suecia=1 mexico=0
y me sale bien el del mayor pero en el menor me imprime que el de menor votos es suecia con 1 voto cuando en realidad es mexico

Pues a mi con:

Código (cpp) [Seleccionar]
for( contador = 1 ; contador < 4 ; contador++ ){
   if ( votos[contador] > mayor){
     mayor=votos[contador];
    posicion1=contador;
   }
  if ( votos[contador] < menor){
     menor=votos[contador];
     posicion2=contador;
   }
}


me da una solución correcta:

Código (cpp) [Seleccionar]

votos[0]=7
votos[1]=2
votos[2]=1
votos[3]=0

EL PAIS GANADOR ES Japon con 7 votos

EL PAIS CON MENOS VOTOS ES Mexico con 0 votos


¡¡¡¡ Saluditos! ..... !!!!



EDITADO: Con la perspicaz observación de CalgaryCorpus. ;)