¿Cómo actualizar el compilador MinGW en wxDev-C++?

Hola gente, pues como algunos de por aquí ya sabéis, ando aprendiendo a programar desde hace unos meses.

Quería solicitaros ayuda porque tengo cierto problema y es que parece que mi actual versión de compilador me da un error al tratar de declarar variables estáticas o constantes al tratar de definir un struct. Hemos mirado y parece que el tema se solventa actualizando la versión del compilador, pero no sé cómo se hace...

Es decir, me he bajado e instalado el MinGW (espero al menos haber elegido los archivos bien [carcajad] ), pero a la hora de especificar los paths en el dev-c++ viene el problema, ya que por ejemplo no entiendo la diferencia entre MinGW y MinGW32, y además las rutas, al no haber exactamente las mismas carpetas en la versión actual del compilador que en la versión antigua, pues no sé cuál especificar sin liarla...

¿Alguien que pueda echar un cable?

Mi versión del IDE es 7.4.2.569 y la del compilador incluido en el IDE (gcc) debe ser la 4.6 o por ahí... mientras que la nueva es la 4.8.1-4, que hasta encontrar eso me ha costado XD.

Un saludo y si no es el subforo adecuado pueden moverlo :)

Gracias.
¿Has probado el editor Codeblocks?. Es muy fácil de usar porque te encuentra los compiladores instalados.

-Si buscas una versión moderna de GCC para windows Aquí encontrarás lo que buscas. Eso es una distro de MinGW con las librerias más populares. No olvides incluir la bandera "-std=c++11" cuando compiles pues GCC funciona con C++03 por defecto.
También te puedes bajar el MinGW aquí.

-Segunda opción (recomendada):
https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx
Ahí tienes el compilador de Microsoft totalmente gratis que es compatible también con C++11.
Mucho mejor Codeblocks que mierdi-Dev-C++ XD :
http://www.codeblocks.org/downloads/26

El segundo link de descarga (codeblocks-13.12mingw-setup.exe) incluye Codeblocks + Mingw. La tercera descarga es otro compilador (TDM-GCC), yo usaría el segundo.

Y si tienes la oportunidad, ponte Linux. Para el tema de programar y de instalar las herramientas es mucho más comodo.
Trabis escribió:Has ignorado la solución más sencilla:

Cambia 'struct' por 'class' y te compilará sin problemas.

Y ahora te respondo a tu pregunta:

¿Has probado el editor Codeblocks?. Es muy fácil de usar porque te encuentra los compiladores instalados.

-Si buscas una versión moderna de GCC para windows Aquí encontrarás lo que buscas. Eso es una distro de MinGW con las librerias más populares. No olvides incluir la bandera "-std=c++11" cuando compiles pues GCC funciona con C++03 por defecto.
También te puedes bajar el MinGW aquí.

-Segunda opción (recomendada):
https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx
Ahí tienes el compilador de Microsoft totalmente gratis que es compatible también con C++11.


Gracias por tu respuesta!

Como he dicho, el tema es que estoy empezando a programar y aún no he llegado a las clases. De hecho acabo de empezar a ver las structs y hasta ahora he practicado lo más basico nada más: decisiones, bucles, vectores y matrices estáticos...

Así que me pierdo mucho con esto de los standards, compiladores...



De hecho sí, he probado con codeblocks y me ha costado un poquillo que tire el compilador (tras un error muy común por lo que he visto), pero lo he conseguido. Ahora he conseguido que la struct funcione con const, pero si pruebo con static me da errores del tipo:

error: local class 'struct main()::registro' shall not have static data member 'int main()::registro::edad' [-fpermissive]|

error: ISO C++ forbids in-class initialization of non-const static member 'main()::registro::edad'|


Claro, aquí el problema es básicamente que no tengo ni puta idea [carcajad]

Por ejemplo, aún no entiendo bien lo de static y qué significa, o las diferencias entre eso y const.Tampoco logro entender por qué dicen que las struct deben usarse para valores sin modificar, y resulta que yo puedo hacer esto y no veo donde esta el problema:




struct registro
{

    char nombre[5];
    int edad;
    int dinero;   
   
};



int main()
{




registro juan;

strcpy(juan.nombre, "juan");
juan.edad=28;
juan.dinero=26000;

cout<<juan.nombre<<endl;
cout<<juan.edad<<endl;
cout<<juan.dinero<<endl;

registro pepe;

strcpy(pepe.nombre, "pepe");
pepe.edad=31;
pepe.dinero=36000;

cout<<pepe.nombre<<endl;
cout<<pepe.edad<<endl;
cout<<pepe.dinero<<endl;


Yo esto parece que funciona, pero eso, como dicen que deben usarse para valores sin modificar... (osea, con valores estáticos, o eso he entendido yo).

hay muchas cosas que se me escapan... tened en cuenta que llevo con las struct dos o tres días :)

Por otro lado, el compilador de code-blocks también es MinGW. ¿Me recomiendas cambiarlo por el de Microsoft?

amchacon escribió:Mucho mejor Codeblocks que mierdi-Dev-C++ XD :
http://www.codeblocks.org/downloads/26

El segundo link de descarga (codeblocks-13.12mingw-setup.exe) incluye Codeblocks + Mingw. La tercera descarga es otro compilador (TDM-GCC), yo usaría el segundo.

Y si tienes la oportunidad, ponte Linux. Para el tema de programar y de instalar las herramientas es mucho más comodo.


Ya me he pasado al code-blocks, ya que no es la primera vez que lo oigo. Muchas gracias!

Lo de Linux ya se verá, las cosas poco a poco :)
Red Ninja Wonder escribió:Ahora he conseguido que la struct funcione con const, pero si pruebo con static me da errores del tipo:

error: local class 'struct main()::registro' shall not have static data member 'int main()::registro::edad' [-fpermissive]|

error: ISO C++ forbids in-class initialization of non-const static member 'main()::registro::edad'|

Pues sin ver el código a saber.
amchacon escribió:Pues sin ver el código a saber.


Hola! Aquí lo tienes. Es igual que el que compila bien pero añadiendo static a la hora de declarar la variable.

int main()
{

struct registro
{

    static char nombre[5]="pepe";;
    static int edad=30;
    static int dinero=20000;

};


registro juan;



cout<<juan.nombre<<endl;
cout<<juan.edad<<endl;
cout<<juan.dinero<<endl;


Ya digo que el principal problema mío creo que es no entender aún bien lo que expuse en mi anterior post.
No puedes inicializar una variable estática de esa forma, salvo que esta sea constante.
amchacon escribió:No puedes inicializar una variable estática de esa forma, salvo que esta sea constante.


ok, miraré diferencias y eso a ver, entre estática y constante. Gracias!
#include <iostream>
using namespace std;

struct registro
{
   char* nombre;
   int edad;
   int dinero;

};

int main()
{
   registro juan;
   juan.nombre= "pepe";
   juan.edad = 30;
   juan.dinero = 20000;

   cout<< juan.dinero <<endl;
   cout<< juan.edad << endl;
   cout<< juan.nombre << endl;
   
}


Y con miembros static:
#include <iostream>
using namespace std;

struct registro
{
   static const char* nombre;
   static const int edad=30;
   static const int dinero=20000;

};
const char *registro::nombre = "pepe";

int main()
{

   cout<< registro::dinero <<endl;
   cout<< registro::edad << endl;
   cout<< registro::nombre << endl;
   
}

A ver como lo escribo sin decir ninguna estupidez xD

El primer patrón es muy común y se suele utilizar cuando quieres guardar multiples instancias de lo que sea.

El segundo patrón es sin instanciar (en el ejemplo anterior no se ha creado ningún registro), y se utiliza cuando queremos que haya sólo 1 de lo que sea.
Trabis escribió:A ver como lo escribo sin decir ninguna estupidez xD

El primer patrón es muy común y se suele utilizar cuando quieres guardar multiples instancias de lo que sea.

El segundo patrón es sin instanciar (en el ejemplo anterior no se ha creado ningún registro), y se utiliza cuando queremos que haya sólo 1 de lo que sea.


Oye, muchas gracias por la explicación!

Tranquilo, que aunque la digas yo no me voy a dar cuenta y no serán por supuesto peores que las que suelte yo al explicarme XD

Entonces, a ver si lo he entendido:

En el primer caso puedo usarlo para después definir diferentes registros o instancias de esa estructura o como se diga, ¿no? O sea registro pepe, registro juan... etc, y cada uno con sus propios valores en las variables.

En el segundo, simplemente tengo una estructura de datos que uso en un caso y pista, ¿no? (tú lo has hecho usando punteros, que aún no los entiendo bien y menos para esto, pero las cosas poco a poco). Y si lo usara en más casos, no me dejaría cambiar los valores porque son constantes.

¿En cuál dices que no se ha creado ningún registro, en el primer o el segundo caso? Entiendo que en el segundo, ya que lo previsto es que solo uses los datos una vez , o que quieres usarlos como "tabla" fija para aplicar en diferentes casos.
Crear distintos registros o instancias de esta estructura implicaría que quieres utilizar los datos pero cambiar de valor alguno de ellos (para diferentes usuarios, modelos, etc), ¿no?

Por otro lado, ¿cuál sería la diferencia entre tu segundo ejemplo y si yo declaro todos los datos miembro como
simples constantes?

const char nombre;
const int edad;
const int dinero;


Entiendo que en ambos casos el valor no puede cambiar.
Red Ninja Wonder escribió:
En el primer caso puedo usarlo para después definir diferentes registros o instancias de esa estructura o como se diga, ¿no? O sea registro pepe, registro juan... etc, y cada uno con sus propios valores en las variables.

Si, en el código de debajo lo hacemos así.
En el segundo, simplemente tengo una estructura de datos que uso en un caso y pista, ¿no? (tú lo has hecho usando punteros, que aún no los entiendo bien y menos para esto, pero las cosas poco a poco). Y si lo usara en más casos, no me dejaría cambiar los valores porque son constantes.

¿En cuál dices que no se ha creado ningún registro, en el primer o el segundo caso? Entiendo que en el segundo, ya que lo previsto es que solo uses los datos una vez , o que quieres usarlos como "tabla" fija para aplicar en diferentes casos.
Crear distintos registros o instancias de esta estructura implicaría que quieres utilizar los datos pero cambiar de valor alguno de ellos (para diferentes usuarios, modelos, etc), ¿no?

Si, en el segundo.
Esa es la idea, que cada objeto "registro" o cada instancia de "registro" tenga sus propios valores, sin embargo al ser static ese valor es compartido para todos.

Red Ninja Wonder escribió:Por otro lado, ¿cuál sería la diferencia entre tu segundo ejemplo y si yo declaro todos los datos miembro como
simples constantes?

const char nombre;
const int edad;
const int dinero;


Entiendo que en ambos casos el valor no puede cambiar.

La diferencia es que al no ser static cada uno de las instancias tiene sus propios valores, pero dado que son constantes pues al final no importa porque no puedes cambiarlos.

No olvides darle un valor a las constantes. Podemos hacerlo como hicimos ayer, o usando un constructor. Aquí lo hecho con un constructor:

#include <iostream>
using namespace std;

struct registro
{
   const int edad;
   const int dinero;
   registro() :edad(30), dinero(20000){}  //<-- constructor
};

int main()
{
   registro juan, pepe;  //<-- Dos variables distintas: juan y pepe.
   
   cout << "juan" << endl;
   cout << juan.dinero << endl;
   cout << juan.edad << endl;

   cout << "pepe" << endl;
   cout<< pepe.dinero <<endl;
   cout<< pepe.edad << endl;

}
Joder pues muchísimas gracias @Trabis, creo que lo tengo ya medio pillado y además me has entroncado con lo de constructores y destructores que también quiero entenderlos :)
11 respuestas