CnC Foren

CnC Foren (http://www.cncforen.de/index.php)
-   Tech-Support / Tech-Talk (http://www.cncforen.de/forumdisplay.php?f=26)
-   -   C++ - Probleme (http://www.cncforen.de/showthread.php?t=74525)

Der_Mosch 07-01-2008 17:54

C++ - Probleme
 
Hier ist mein Code:

Code:

#include <iostream>
#include <windows.h>
#include <conio.h>

int KeyInput (int SleepTime)
{
    _getch ();

    if (GetAsyncKeyState (VK_UP))    return  1;
    if (GetAsyncKeyState (VK_DOWN))  return  2;
    if (GetAsyncKeyState (VK_LEFT))  return  3;
    if (GetAsyncKeyState (VK_RIGHT))  return  4;
    if (GetAsyncKeyState (VK_RETURN)) return  5;
    if (GetAsyncKeyState (VK_SPACE))  return  6;
    if (GetAsyncKeyState (VK_ESCAPE)) return  7;

    Sleep (SleepTime);
    return 0;
}


int main()
{

const int GAME_ARRAY_WIDTH = 9; //Jeweils +1, da es sich um
const int GAME_ARRAY_HEIGTH = 6;//Angaben für ein Array handelt

int gameArray[GAME_ARRAY_WIDTH][GAME_ARRAY_HEIGTH];

for (int y = 0; y <= GAME_ARRAY_HEIGTH; ++y)
        for (int x = 0; x <= GAME_ARRAY_WIDTH; ++x)
                gameArray[x][y] = 0;

for (int y = 0; y<= GAME_ARRAY_HEIGTH; ++y)
{
        for (int x = 0; x <= GAME_ARRAY_WIDTH; ++x)
                std::cout << gameArray[x][y];
        std::cout << "\n";
}


        return 0;
}

Hier ist mein Problem:

Code:

"1.exe": "D:\Users\Mosch\Documents\Visual Studio 2005\Projects\1\debug\1.exe" geladen, Die Binärdaten wurden nicht mit Debuginformationen erstellt.
"1.exe": "D:\Windows\System32\ntdll.dll" geladen, Keine Symbole geladen.
"1.exe": "D:\Windows\System32\kernel32.dll" geladen, Keine Symbole geladen.
"1.exe": "D:\Windows\System32\apphelp.dll" geladen, Keine Symbole geladen.
Eine Ausnahme (erste Chance) bei 0x00000000 in 1.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.

STATUS_STACK_BUFFER_OVERRUN encountered
Windows hat einen Haltepunkt in 1.exe ausgelöst.

Dies kann auf eine Beschädigung des Heaps zurückzuführen sein und weist auf ein Problem in 1.exe oder in einer der geladenen DLLs hin.

Weitere Analyseinformationen finden Sie möglicherweise im Ausgabefenster.
Das Programm "[464] 1.exe: Systemeigen" wurde mit Code 0 (0x0) beendet.

Irgendwelche Vorschläge? Das ist ja nun wirklich ein extrem simpler Code und ich weiss nicht, was da solche Probleme verursacht.

Gonzo 07-01-2008 23:33

Du darfst die for-Schleifen nicht <= sondern nur < ausführen ;)
gameArray[9][6] = 0; // ist ungültig und gibt ne Zugriffsverletzung
Ein Array fängt halt bei 0 an und hat x Elemente -> [x] ist ausserhalb des Arrays

Der_Mosch 08-01-2008 00:01

Ich Idiot hab meine Konstanten falsch initialisiert. Ich kanns nicht glauben, dass mir diese diese OFFENSICHTLICHE SCHEISSE nicht aufgefallen ist. Und ich hab mir das extra noch danebenkommentiert!

Kann den Thread mal einer löschen, ist ja peinlich :D

Gonzo 08-01-2008 00:24

lol, mach dir nix draus, passiert jedem mal ;)

MyersGer 08-01-2008 00:27

Nur wegen offensichtlicher Peinlichkeiten, die der Unterhaltung der Allgemeinheit dienen, werden keine Threads gelöscht. Sonst müsste man hier ja viel zu viel löschen :D :D ;)

Außerdem hast du deine Konstanten nicht falsch initialisiert. ;) Man sollte einfach nur < statt <= verwenden. Dann muss man weniger nachdenken :) Sonst muss du bei der Array Definition immer noch +1 rechnen. Sieht auch doof aus und man weiß unten nicht, was man oben geschrieben hat.

AMD-Powered 08-01-2008 00:30

Zitat:

Zitat von Der_Mosch (Beitrag 1500593)
Kann den Thread mal einer löschen, ist ja peinlich :D

NÖ!!! :D

Will ich doch nicht dafür verantwortlich sein, dass du nochmal nach der Lösung suchst und nen Thread erstellst...

ergo:

... er bleibt.

Hier sind schon ganz andere Fragen gestellt worden und peinlich brauchts dir auch nicht sein. ;) Zudem waren bestimmt schon 150.000 Google Bots :scan: da und haben alles gespeichert. :D


EDIT: MyersGer auch mal im Lande? Schon lange nichts mehr von dir gelesen. :(

MyersGer 08-01-2008 00:41

Kommt drauf an, wo man liest. :D Allgemein habe ich allerdings eher eine lesende Rolle eingenommen. Und Aceton und was sonst so abgeht verschlingt auch einiges an Zeit. Da bleibt halt zum Schreiben nicht mehr viel Zeit.

AMD-Powered 08-01-2008 00:50

Ist schon ok, hat mich ja auch nur so gefreut mal wieder was von dir zu lesen, dass ich dich irgendwie aus der Reserve locken musste um dir noch nen Post zu entlocken.

Hat ja auch geklappt. :p ^^


Ich lese im Moment auch mehr als ich schreibe. ;)

Der_Mosch 08-01-2008 03:09

Zitat:

Zitat von MyersGer (Beitrag 1500600)
Außerdem hast du deine Konstanten nicht falsch initialisiert. ;) Man sollte einfach nur < statt <= verwenden. Dann muss man weniger nachdenken :)

Ich weiss, dass das ne Alternative wäre, nur stört es mich, dass die Spielfeldgrösse dann ein Punkt niedriger aussieht, als sie es eigentlich ist (äh... du weisst, was ich meine).

MyersGer 08-01-2008 09:20

Ähm ne nicht ganz :D Auf jeden Fall würde das Programm genauso abstürzen, wenn du das machst, was du in deinem vorherigen Post geschrieben hast, also das Ändern der Konstanten.

Du müssteste ja
Code:

const int GAME_ARRAY_WIDTH = 8;
const int GAME_ARRAY_HEIGTH = 5;

int gameArray[GAME_ARRAY_WIDTH+1][GAME_ARRAY_HEIGTH+1];

for (int y = 0; y <= GAME_ARRAY_HEIGTH; ++y)

oder

Code:

const int GAME_ARRAY_WIDTH = 9; //Jeweils +1, da es sich um
const int GAME_ARRAY_HEIGTH = 6;//Angaben für ein Array handelt

int gameArray[GAME_ARRAY_WIDTH][GAME_ARRAY_HEIGTH];

for (int y = 0; y <= GAME_ARRAY_HEIGTH-1; ++y)

(hier haben die beiden Kommentare dann den Sinn, den sie eigentlich beinhalten)
schreiben, damit es zu keinem Speicherzugriffsfehler kommt.

Da sieht

Code:

const int GAME_ARRAY_WIDTH = 8;
const int GAME_ARRAY_HEIGTH = 5;

int gameArray[GAME_ARRAY_WIDTH][GAME_ARRAY_HEIGTH];

for (int y = 0; y < GAME_ARRAY_HEIGTH; ++y)

irgendwie am sinnvollsten aus. Oben schreibt man hin, wie groß das Spielfeld sein soll und so groß isses dann auch. Quasi WYSIWYG :D


Oder ist es gerade einfach noch zu früh für mich und ich habe deinen Post nicht ganz verstanden?! :shy:

Der_Mosch 08-01-2008 11:26

Äh... nein. Das Spielfeld ist 10*7 Felder gross ;) Ich glaube, dass dich mein Kommentar verwirrt hat.

Und ich arbeite nicht in Wysiwyg. Ich arbeite mit Wygiwyd.

Gonzo 08-01-2008 13:50

Wenn es 10*7 sein soll, dann sollte man auch 10*7 benutzen
Code:

const int GAME_ARRAY_WIDTH = 10;
const int GAME_ARRAY_HEIGTH = 7;

int gameArray[GAME_ARRAY_WIDTH][GAME_ARRAY_HEIGTH];

for (int y = 0; y < GAME_ARRAY_HEIGTH; ++y)
...

einfach und sauber und letztendlich nicht verwirrend wenn du dass in nen halben Jahr noch mal liest ;)
Warum benutzt du eigentlich const int ? Wäre ein #define GAME_ARRAY_WIDTH 10 im Headerfile nicht praktischer ? Ist dann global bekannt und lässt sich dann auch in anderen Projektdateien leichter weiterverwenden ( z.B. #include "main.h" )
Nebenbei gesagt finde ich die Schreibweise ++y blöd, y++ liest sich irgendwie besser :p

MyersGer 08-01-2008 14:50

In diesem Fall ja, bei überladenen Operatoren nicht. Da gibt es dann sogar Performance Unterschiede. Mit dem Postfix-Operator kann man aber bei Rechenoperationen auf die Nase fallen.
Bei For-Schleifen liest sich ein Postfix-Operator aber sicherlich besser, gerade wenn man an seine Mitmenschen denkt :D. Ansonsten: klarer Fall von Geschmackssache.

gersultan 08-01-2008 14:55

in den Thread husch und einen Link hinterlass: Programmierer gesucht

MyersGer 08-01-2008 15:45

Den Wunsc ich doch schon aus dem anderen Thread :p
Ich kann aber nichts ins Board einbinden. Zuviel Fummelarbeit. Das Replay auslesen usw. ist kein Ding aber der Rest... hmmm.

Der_Mosch 08-01-2008 17:44

Zitat:

Zitat von Gonzo (Beitrag 1500651)
Warum benutzt du eigentlich const int ? Wäre ein #define GAME_ARRAY_WIDTH 10 im Headerfile nicht praktischer ? Ist dann global bekannt und lässt sich dann auch in anderen Projektdateien leichter weiterverwenden ( z.B. #include "main.h" )

Erstens kommt mir das nicht wie guter Stil vor, zweitens ist das keine Konstante, sondern, wie du sicherlich weisst, eine Compilerdirektive.

Zitat:

Zitat von Gonzo (Beitrag 1500651)
Nebenbei gesagt finde ich die Schreibweise ++y blöd, y++ liest sich irgendwie besser :p

Macht in diesem Fall keinen Unterschied.

gers, schöne Werbung. Hat funktioniert :D

MyersGer 08-01-2008 21:06

Zitat:

Zitat von Der_Mosch (Beitrag 1500713)
Erstens kommt mir das nicht wie guter Stil vor, zweitens ist das keine Konstante, sondern, wie du sicherlich weisst, eine Compilerdirektive.

Genau genommen eine Präprozessordirektive :D :bunker:

Der_Mosch 08-01-2008 22:45

:bang: Wie gesagt, nicht meine Woche.

Der_Mosch 14-01-2008 13:02

Ich benutz den Thread noch mal... hier mein Code:

Code:

        cout << "Anzahl der Agenten: ";
        cin >> agentsCount;
        int *agentx, *agenty;
        agentx = new int [agentsCount];
        agenty = new int [agentsCount];

        for (int a = 0; a < agentsCount; ++a)
                {
                        agentx[a] = 0;
                        agenty[a] = 0;
                }

Nach Ausführung des Codes existiert agenty, agentx hingegen nicht. Irgendwelche Vorschläge?

klaus52 14-01-2008 18:30

Was heißt agenty existiert nicht? Fehlermeldung, wenn du drauf zugreifen willst?

Ich habe das jedenfalls eben bei mir ausgeführt... und der gdb kann mir zum Inhalt beider Arrays Werte - sprich 0 - ausspucken...



Sofern du nicht woanders in deinem Code den Speicher überschreibst ... :ka: Bin allerdings auch noch "relativ" C (von c++ gar nicht zu reden :D) unerfahren... (und grad selber auf Fehlersuche... und such grad innerhalb von 600 Zeilen Code nach der Nadel im ... äh, meinem Fehler ... in Java hab ich nicht mal eben meinen Speicher überschrieben... verdammt! [edit]Zu meinem "Problem": was ist schlimmer, als einen Fehler zu suchen, und man hat keine Arnung, wo er verursacht wird? Wenn der vermeintliche Fehler gar kein Fehler ist... da kann dan suchen lange dauern. [/edit.] ;))

Gonzo 14-01-2008 19:57

Denke auch, dass das Problem woanders liegt
Code:

#include <iostream>

using namespace System;
using namespace std;

int main(array<System::String ^> ^args)
{
        int agentsCount;
        int *agentx, *agenty;

        cout << "Anzahl der Agenten: ";
        cin >> agentsCount;

        agentx = new int [agentsCount];
        agenty = new int [agentsCount];

        for (int a = 0; a < agentsCount; ++a)
        {
                agentx[a] = a;
                agenty[a] = a;
        }
        for (int i=0 ; i < agentsCount ; i++)
        {
                cout <<        "x:" << agentx[i] << endl;
                cout <<        "y:" << agenty[i] << endl;
        }
        char text[4];
        while(strcmp(text, "q"))
        {
                gets(text);
        }
        return 0;
}

funktioniert einwandfrei ;)

klaus52 22-01-2008 08:25

Ich hab da grad auch mal ein C-Problem... ich denke mal das passt hier rein, auch wenns kein C++ ist ... vermutlich ists für den Ausschnitt eh wurscht ;)

Code:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main (void) {

        char *instructions[1];
        int n;

        for(n=0;n<1;n++) {
                instructions[n]=(char*) malloc(sizeof(char)*70);  //malloc size for chars of maximum length 70
      }

        instructions[0] = "Welcome to...";
       
       
        free(instructions[0]);
}

Tja, das free klappt nicht, sondern verursacht böse Fehlermeldungen, beim ausführen... :
Code:

klaus52@klaus52-lap:~/workspace/cs349-ui$ ./free
*** glibc detected *** /home/klaus52/workspace/cs349-ui/free: free(): invalid pointer: 0x0804859c ***

+ Backtrace und Memory Map...

Tja, bis jetzt hatte ich meine Anwendung munter for mich her gespielt, ohne auf Speicher zu achten... dachte aber, dass das vielleicht doch nciht die beste Idee iist, aber ich bekomm das free einfach nicht hin, und bin gerade eigentlich nur noch am blöd rumprobieren - was ein Zeichen dafür ist, dass ich wohl besser ins Bett sollte... falls mir trotzdem jemand weiterhelfen könnte, wär das toll! ;)

P.S.: Da mach ich die ganzen letzten Stunden rum, und finde gerade nach dem abschicken per Zufall die Lösung...
strcpy(instructions[0], "Welcome to..." );
statt
instructions[0] = "Welc..."

Ich hab jetzt zwar noch nicht geschaut, was strcpy wirklich macht, und wieso das dann klappt, und anders ist... aber immerhin: Es klappt ... warum les ich bei gelegenheit nach... falls jemand dei Muße hat es zu erklären, hab ich aber auch nichts gegen :D ;)
P.P.S: Okay, durch die direkte uweisung veränder ich die Adresse auf die instruction[0] zeigt, durch strcpy, kopier ich den String dahin wohin instruction[0] vorher zeigt ... den Platz, den ich mit kmalloc reserviert habe... klingt soweit logisch ;)

Gonzo 22-01-2008 17:12

Richtig :) In c darf man strings nicht durch = zuweisen sondern immer durch irgendwelche string-Functionen ( Ausnahme ist direkt bei der Declaration, siehe unten ). Bei einzelnen Zeichen geht das aber, da muss man dann nur darauf achten am Schluss eine 0 zu setzen. z.B.
instructions[0][0] = 'W';
instructions[0][1] = 0;
und schon gibs bei der Ausgabe nen W.
Ansonsten ist dein Beispiel aber ziemlich unsinnig, denke aber mal es ist nur ein Beispiel für das Problem als solches.
Ein einfaches
char instructions[] = {"Welcome ..."};
hätte den selben Effekt und du brauchst kein free().
Genau betrachtet gibt es gar keine strings, sondern nur char-Arrays ;)

klaus52 23-01-2008 07:33

Schöne Erklärung, danke! :)

Und ja, dass beispiel war etwas verkürzt... vorher wurde die Schleife häufiger durchlaufen, sprich ich hatte neben instructions[0] noch einige andere Char-Arrays "instructons[n]" ;)


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:44 Uhr.

Powered by vBulletin Version 3.7.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.