Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Douch en 03 de Mayo de 2004, 09:16:11 PM

Título: Problema Con "access Violation"...
Publicado por: Douch en 03 de Mayo de 2004, 09:16:11 PM
 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.
Título: Problema Con "access Violation"...
Publicado por: AlexHdez en 03 de Mayo de 2004, 09:44:28 PM
 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
Título: Problema Con "access Violation"...
Publicado por: DraKKaR en 03 de Mayo de 2004, 09:46:44 PM
 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...
Título: Problema Con "access Violation"...
Publicado por: jpastor en 03 de Mayo de 2004, 10:03:33 PM
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.
Título: Problema Con "access Violation"...
Publicado por: tamat en 03 de Mayo de 2004, 10:14:53 PM
 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.
Título: Problema Con "access Violation"...
Publicado por: DraKKaR en 03 de Mayo de 2004, 11:58:34 PM
 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.
Título: Problema Con "access Violation"...
Publicado por: ShAq en 04 de Mayo de 2004, 12:32:56 AM
 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)  
Título: Problema Con "access Violation"...
Publicado por: rihk_ito en 04 de Mayo de 2004, 01:32:25 AM
 mm en visual c++ eso siempre ha dado error
Título: Problema Con "access Violation"...
Publicado por: Douch en 04 de Mayo de 2004, 01:58:33 AM
 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.
Título: Problema Con "access Violation"...
Publicado por: DraKKaR en 04 de Mayo de 2004, 02:01:02 AM
 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.
Título: Problema Con "access Violation"...
Publicado por: sés en 04 de Mayo de 2004, 09:28:45 AM
 
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.
Título: Problema Con "access Violation"...
Publicado por: Douch en 04 de Mayo de 2004, 09:27:34 PM
 
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.