Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema Con "access Violation"...

Iniciado por Douch, 03 de Mayo de 2004, 09:16:11 PM

« anterior - próximo »

Douch

 Saludos.

Escribo este post con la esperanda de que me podais ayudar y poder decirme que narices estoy haciendo mal. Uso el Visual Studio 6, y el programa compila perféctamente, pero cuando llego a la línea que os indico más abajo, en tiempo de ejecución me produce el siguiente fallo:

Unhandled exception in : 0xC000..: Access Violation.


El significado del código no es relevante, sino el porqué de este error. Mira que he repasado el código, pero nah!, no hay manera.

#include <stdio.h>
#include <conio.h>

int nOrdenar_Tren (char *cTren , int nNumVagones )
{
bool bSalir = false;
bool bMayor = false;
char nComp;
int nCambios = 0;
int i = 0;
 
while (!bSalir)
{    

 nComp = cTren[i];

 i++;

 if ((nNumVagones == 1) || (i==nNumVagones)) bSalir = true;
 else
 {
  if(nComp > cTren[i])//atoi(cTren[i]))
  {
   
   cTren[i-1] = cTren[i];    //<------ ### AQUI ME DA EL ERROR ###
   cTren[i] = nComp;

   i = 1;

   nCambios++;
   bMayor = true;

  }

  if ((!bMayor) && (i == nNumVagones)) bSalir = true; else bMayor = false;

 }

}

return (nCambios);

}

int main()
{

int nVag = 4;
char *c = "4321";

printf("Numero de cambios: %d",nOrdenar_Tren (c,nVag));

return (0);

}




En fin, gracias de antemano.

Douch.

AlexHdez

 Pues esto me va a ayudar pq yo tengo exactamente el mismo error, un codigo que compila perfectamente y peta ahi, pero no tiene nada que ver, lo mio son unas funciones de sdl con ttf, :S

A ver si le podeis ayudar y de paso a mi  (ole)

Un saludo

DraKKaR

 No he leido todo el código, he parado cuando he visto esta barbaridad:


char *c = "4321";


Supongo que lo que querias poner es algo asi:

char c[]="4321";


Hay, si todos los errores de ejecución fueran asi...

jpastor

Cita de: "DraKKaR"No he leido todo el código, he parado cuando he visto esta barbaridad:


char *c = "4321";


¿Eso es una barbaridad? Yo a veces lo pongo asi y no he tenido problemas. Bueno, si alguien sabe si esta mal seguro que avise. Mirando el código el error puede estar por ahi.

tamat

 Drakkar, eso no es ninguna barbaridad, segun el compilador cualquier cadena que tu pongas dentro del codigo consta como una const char* por lo tanto como mucho corre el riesgo de que le de un error por pasar un const a no const pero ya está.

Además que cualquier array no es más que un puntero al primer elemento.
Por un stratos menos tenso

DraKKaR

 Bueno, creo que merezco morir. Yo siempre habia creido que eso estaba mal. Pero pensandolo detenidamente parece ke esa bien. Nunca te acostarás sin aprender una cosa mas.

ShAq

 buenas, pues he decidido probarlo y poniendo
char c[]="4321";
ya no peta,

aunque si alguien sabe la razon, que lo diga ahora
o calle para siempre  :ph34r:

un punto para DraKKar,  (ole)  

rihk_ito

 mm en visual c++ eso siempre ha dado error

Douch

 Hum... lo he probado como DraKKaR comenta y al igual que a ShAq, el programa no peta.

Jejeje... lo más extraño es que el uso del char* lo saqué de un libro que precisamente te enseñaba como aprender a manejar el C/C++ del Visual Studio 6.

Citar"Nunca te acostarás sin aprender una cosa más".
En eso estoy contigo...

En fin, "cenquiu berimach" a todos por haberme ayudado.

Douch.

DraKKaR

 Vaya, esto es algo que convendría aclarar. Puede que sea una de esas cosas que según qué compilador, las autocorrija y las interprete bien. Esto me recuerda a aquel post donde descubrimos que en VisualC estaba permitido hacer esta reserva de memoria.


int foo(int i)
{
 int pi[i];
}


Te diré una cosa que leí en una web que enseñaba a como programar C++ seguro: el primer consejo era olvidarse de las cadenas de caracteres de C de toda la vida y usar la clase std::string, ya que es la fuente de innumerables errores.

sés

 
Cita de: "tamat"Además que cualquier array no es más que un puntero al primer elemento.
No es del todo cierto.

Aunque a la hora de programar no importe, realmente no es así.

Si tenemos esto:
char str[] = "hola";
char pstr = str;


La memoria sería algo así:
0x00001000 = "hola\0" (variable 'str')
0x00001005 = 0x00001000 (variable 'pstr', que apunta a 'str')


La variable 'str' no es un puntero como tal. 'pstr' sí lo es.
Soy indeciso... ¿o no?

Douch

 
CitarTe diré una cosa que leí en una web que enseñaba a como programar C++ seguro: el primer consejo era olvidarse de las cadenas de caracteres de C de toda la vida y usar la clase std::string, ya que es la fuente de innumerables errores.
Pues ese consejo no me gusta nada (esto va para la web, no para DraKKaR). Es como si a un diseñador web le dices que use un programa para crear las páginas, en vez de aprender el lenguaje HTML (bueno, esto es un poco extremo, pero más o menos cogeis la idea).

Está bien la ayuda que puede aportar la clase string, solo te digo que yo vengo de Visual Basic y ahí si que es fácil tratar con cadenas. Pero creo que esa no es la solución. Yo prefiero aprender a tratar con lo básico, y estoy dispuesto a pelearme con las cadenas, con los punteros y con tó lo que se me ponga por delante :D con tal de obtener una base sólida que me permita enfrentarme a cualquier problema. Ya tendré tiempo más adelante, cuando realmente aprenda a programar, para comenzar con el uso herramientas (clases o funciones) que me resuelvan la vida.


Douch.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.