| 

.NET C# Java Javascript Exception

4
Hallo zusammen!

Wie oben schon beschrieben beschäftige ich mich gerade mit C!
Hierbei speziell mit ADT's mittels denen ich eine OOP "simmulieren" möchte!

Bei einem etwas leichterem Einstieg hatte alles soweit funktioniert.
Nun habe ich jedoch Probleme mit meinen, durch meine Struckturen verschachtelten, Funktionpointern.

Ich erhalte immer eine: _cygtls::handle_exceptions: Exception: STATUS_ACCESS_VIOLATION!
Ich habe die Stelle einmal Fett und Kursiv im Quelltext markiert!

Wäre schön wenn mir jemand einen Tip geben könnte wieso das so nicht funktioniert und auch wie ich es richtig anwenden müßte!

(Ich schätze das der Fehler hierbei liegt:
#define Shape()\
int x,y;\
NewShapeClass *xclass;//Reserviere ja keinen Speicher für die Methoden!

jedoch bin ich mir unsicher! Daher würde ich mich über eure Hilfe freuen)

MFG
cyby

Main Aufruf:
/* newShape git ein shape zurueck*/
NewShape Shape = newShape(Shape, 50, 50);

Shape->xclass->draw(Shape);
Shape->xclass->moveTo(Shape,100,100);
Shape->xclass->erase(Shape);

free(Shape);


Meine C-Datei:
#include "Shape.h"

static void drawShape(NewShape aShape){
printf("Shape wurde gezeichnet!\n");
}

static void moveToShape(NewShape aShape, int x, int y){
printf("Shape wurde bewegt!\n");
}

static void eraseShape(NewShape aShape){
printf("Shape wurde geloescht!\n");
}

NewShape newShape(NewShape aShape, int x ,int y){

aShape = (NewShape) malloc(sizeof(struct shape));

aShape->x = x;
aShape->y = y;

/* Hier steigt er mir mit einer Exception aus! */
aShape->xclass->draw = drawShape;
aShape->xclass->erase = eraseShape;
aShape->xclass->moveTo = moveToShape;


return aShape;
}


Meine Header Datei:
#define Shape()\
int x,y;\
NewShapeClass *xclass;

#define Rectangle()\
Shape()\
int w,h;

#define Circle()\
Shape()\
int r;

#define TestArea()\
Shape()\
char* string;

/* Typedef's */
typedef struct shape *NewShape; /* Type by Reference */
typedef struct shapeClass NewShapeClass; /* Type by Value */
typedef struct rectangle *NewRect; /* Type by Reference */
typedef struct circle *NewCircle; /* Type by Reference */
typedef struct textArea *NewTArea; /* Type by Reference */

/* Struckturen */
struct shape{
Shape()
};

/* Die Funktionen erhalten eine eigene Strucktur so koennen diese besser zugewiesen werden! (Speicherschonend) */
struct shapeClass{
void (*draw)(NewShape aShape);
void (*moveTo)(NewShape aShape, int x, int y);
void (*erase)(NewShape aShape);
};

struct rectangle{
Rectangle()
};
struct circle{
Circle()
};
struct textArea{
TestArea()
};

NewShape newShape(NewShape aShape, int x ,int y);
News:
02.03.2011
cyby 152 1 6
So - ich habe selbst eine mögliche Lösung gefunden!
Jedoch finde ich die nicht so optimal!

[code]
/* Globale Variabel*/
NewShapeClass yclass;

NewShape newShape(NewShape aShape, int x ,int y){

yclass.draw = &drawShape;
yclass.moveTo = &moveToShape;
yclass.erase = &eraseShape;

aShape = (NewShape) malloc(sizeof(struct shape));

aShape->x = x;
aShape->y = y;

aShape->xclass = &yclass;

return aShape;
}

[/code]

Und schon klappts - naja habe gestern auch die "&" Symbole vergessen, war schon spät! Jedoch klappt es auf der vorherig versuchten Art und Weise nicht!
cyby 02.03.2011

Kann mir jemand beide "Programm-Verhalten" erläutern ?
cyby 02.03.2011
2 Antworten
2
Hallo,
das Problem liegt in der Definition der struct shape:
Sie besteht gemäß Deinem Header aus zwei ints und einem Zeiger auf NewShapeClass. Das malloc alloziert folgerichtig Platz für einen Zeiger und nicht für eine ganze Struktur. Ergo kannst Du über den Zeiger xclass nicht auf eine Struktur zugreifen - es gibt schlicht und ergreifend keine.

- Uwe
07.03.2011
usander 21 1
0
Hi Uwe,

vielen Dank für die Antwort :)
Das bestätigt meine Annahme!

MFG
09.03.2011
cyby 152 1 6

Stelle deine C-Frage jetzt!