Globales array in C++ bleibt einfach leer?

Graf-Porno

Ensign
Registriert
Okt. 2004
Beiträge
238
Hi Leute mein Array scheint einfach leer zu bleiben hab schon mehrer Versuche gestartet mein array zu befüllen mal meckert er das er keine const überschreiben kann (was ja auch Sinn macht :D) mal bleibts leer.
:D

PHP:
char* Grid [10][10];



class schiff 
{
public:
	int länge;
	char xy[2];
	int ausrichtung;
	int treffer;
};


void gridzeichnen ()
{
	
 for (int i=0;i==9;i++)
 {
	 for (int k=0;i==9;k++)
	 {
		 Grid[i][k] = "~";
	 }
 }
}
int main (void) {
	gridzeichnen ();
	printf ("Feld %c",Grid[1][1]);
	
}

Danke fürs lesen und helfen in Vorraus!
 
Mach aus dem Feld von "Zeigern auf char" ein Feld von char.
Falsch: char* Grid[5][5];
Richtiger: char Grid [5][5];
 
Ok sry^^ das sollte da auch nicht wirklich stehen nur jetz heult er rum:
'=' : cannot convert from 'const char [2]' to 'char'
 
Grid[k] = "~"; ist falsch!

"x" ist ein konstanter String, der mit '\0' abgeschlossen ist (als unsichtbares zweites Stringendezeichen).
Ein einzelnes Zeichen umschließt man deshalb nicht mit ", sondern mit '.

Grid[k] = '~'; ist richtig.
 
Genau so hatte ich es auch zuerst nur gibt mir dann halt einfach nichts aus, anstelle einer Tilde.
PHP:
char Grid [10][10];




void gridzeichnen ()
{
	
 for (int i=0;i==9;i++)
 {
	 for (int k=0;i==9;k++)
	 {
		 Grid[i][k] = '~';
	 }
 }
}





int main (void) {
	gridzeichnen ();
	printf ("%c",Grid[1][1]);
	
}

Irgendwie schein ich mich ziemlich doof anzustellen, ist auch nicht das erste c++ Programm aber trotzdem werd ich diesem erbärlichen Fehler nicht her, aber schonmal Danke für die Hilfe !
 
Zuletzt bearbeitet:
Was sind denn das für merkwürdige Bedingungen in deinen for-Schleifen?
Sollte das nicht
Code:
for (int i=0;i<=9;i++)
    for (int k=0;k<=9;k++)
        Grid[i][k] = '~';
lauten?
 
Ok zugegeben, aber macht hier doch keinen unterschied da ich ja ganzzahling inkrementiere, aber jetzt wo dus sagst ich mach das einentlich auch nie so... Bin wohl heute etwas verstrahlt löst das problem aber immer noch nicht.
Am besten einfach mal den Quellcode nehmen und selber probieren.
 
Es geht doch so?
Code:
#include<stdio.h>

char Grid [10][10];

void gridzeichnen ()
{
	for (int i=0;i<=9;i++)
		for (int k=0;k<=9;k++)
			Grid[i][k] = '~';
}
int main (void) 
{
    gridzeichnen ();
    printf ("%c",Grid[1][1]);
    return 0;
}
 
Ich verstehs nicht habs eins zu eins so im kompletten Projekt aber da macht ers nicht und Seiteneffekte schließ ich aus... was dann für kack ist, aber Danke komische Welt
 
Ich war leider zu langsam, aber zu deinem Fehler:

Du hast ne Endlosschleife programmiert. Schau nochmal in deinen Code, dort steht in deiner zweiten Schleife:
Code:
for (int k=0;i==9;k++)

Du musst aber auf "k" prüfen, also:
Code:
for (int k=0;[b]k[/b]<=9;k++)

Habe mir auch mal die Freiheit genommen deinen Code etwas aufzuräumen, Ergebnis:
Code:
#ifndef SCHIFF_H_
#define SCHIFF_H_

#include <iostream>
using namespace std;

class Schiff
{
private:
    int laenge;
    char xy[2];
    int ausrichtung;
    int treffer;

public:
	Schiff();
	virtual ~Schiff();
};

#endif /*SCHIFF_H_*/

char GRID[10][10];

void gridzeichnen (){
	int i;
	int k;
	
	for (i=0; i<=9; i++){
		for(k=0; k<=9; k++){
			GRID[i][k] = '~';
                }
	}
}

int main (){
	gridzeichnen();
	cout << "Feld " << GRID[1][1] << endl;
	return 0;
}

Wir sind hier in C++, da sollte man schon eher auf std::cout und cin zugreifen. Darüberhinaus werden Klassennamen nach Konvention großgeschrieben und return 0 in der main nicht vergessen :)

Nicht bös gemeint, nur als Tipp. Und wie gesagt, Problem lag an der Endlosschleife.

Schöne Grüße,
Sam
 
Zuletzt bearbeitet:
Ui ganz übersehen, danke ich hab gar nicht gemerkt das ich im zweiten for nen i benutzt habe.
Danke fürs aufräumen sieht jetzt echt besser aus, problem war ich hab auch nicht allen code reingepostet weils sonst etwas unübersichtlich geworden wäre.
Also vielen Danke an alle und Gruß!
 
Noch zur Schleife: i==9 wäre vollkommen unsinnig, da es so keinen einzigen Durchlauf gibt. Denn das ist ja die Bedingung die erfüllt sein muss, dass der Inhalt der Schleife durchgeführt wird. Und der Index wird so nie 9.
 
Ich sehs ja ein, war extrem unnsinnig hab irgendwie abgeschaltet! :)

P.S Ich hab noch nicht so den Peil von Klassen bei C wie ist das eigentlich samotyr, du initialiserst ja vorm destruktor Schiff(); damit ist dieses ja auch schon in meiner main intialisiert.
Ist es eigentlich in C++ möglich ähnlich wie in Java oder As dynamische Variabel bzw Klassen zu Konstruiern.
D.h ich hab z.b ein Array in dem ich mir je nach länge das arrays mein Objekte ablege um dann z.b durch Array.Schiff().länge auf 3 z.b setzte?
Wie müsste ich sowas initialisieren oder andere Idee sowas mit einer Liste?

Auf die Idee komm ich weil ich es ziemlich lästig finde alles immer einzeln und per hand zu initialisieren.

Gruß
 
Zuletzt bearbeitet:
Also, das oben von mir war kein vollständiger Code. Es fehlt ja eigentlich noch die .cpp Datei mit der Implementierung von z.B. dem dir aufgeführten Konstruktor ( Schiff(); ). Schiff() ist nur eine Deklaration, keine Initialisierung.

In C gibt's keine Klassen. Das da oben ist ein abgehackter C++ Code.

Darüberhinaus verbietet es die Datenkapsulierung direkt auf Objektvariablen zuzugreifen, dafür sollte man getter und setter benutzen und die Variablen entsprechen als private (bzw. protected) deklarieren.

Zu deiner Frage:
Ich hoffe ich habe das richtig verstanden. Du würdest gerne ein Array benutzen das aus Objekten des Typs Schiff besteht?
Das geht natürlich, als Array wäre das aber nicht dynamisch. Besser du benutzt eine std::list, die Klasse kannste in der Standard Template Library (= STL) finden, u.a. hier gibt's eine Beschreibung davon:
http://www.sgi.com/tech/stl/List.html
oder hier:
http://www.inf.uos.de/prakt/pers/dipl/doc/gcwilhel/node43.html

Um dann die länge eines Schiffs zu ändern würdest du in etwas sowas schreiben:
Code:
#include <list>

/*
    (...)
    hier fehlt noch Programmcode
    (...)
*/
int main(){
     std::list<Schiff*> liste;
     
     //4 = Länge als Initialisierungswert für einen Konstruktor der Form: Schiff(int länge);
     list.push_back( new Schiff(4) );     
     
     // in der Schiff.cpp: void Schiff::setLaenge(int i){ this->laenge = i;  }
     list.getAt( 0 ).setLaenge(3);
     
     //oder gleich mehrere Objekte bearbeiten:
     int i=0;
     for(i=0; i<3; i++){
          list.getAt( i ).setLaenge( 1 );
     }
     return 0;
}

Da können jetzt recht viele Fehler drin sein, weil ich seit längeren in Java programmiere. Ich bitte das zu entschuldigen, ich hoffe die Idee kommt trotzdem rüber. Bin mir sicher es gibt hier viele, die es besser als ich erklären können :)

Um Listen durchzugehen benutzt man iteratoren. Die findest du auch in der STL. Verwendung in etwa so:

Code:
     std::list<Schiff*> liste;
     std::list<Schiff*>::iterator it;

     for(it=liste.begin(); it!=liste.end(); ++it){
          // tue etwas
     }

Gute Nacht,
Sam
 
So hab mal ein wenig rumprobiert nur er meckert das er kein getAt kennen würde obwphl es ja ausdrücklich drin sein sollte laut der geposteten links.

PHP:
char Grid [10][10];
int Längen[6]={2,4,1,3,4,2};

class ship {

private:
	int länge;
	int xy[2];

public:
	ship (){};
	void zw (int a[],int ausrichtung,int id);
};


void ship::zw(int a[],int ausrichtung,int id)
{   
	int posX= xy[1];
	int posY= xy[2];
	länge = a[id];
	if (ausrichtung == 90) 
	{
		Grid[posX][posY]='X';
		for (int i=0;i<=länge;i++)
		{
			Grid[posX+=1][posY] = 'X';
		}
	}

		if (ausrichtung == 180) 
	{
		Grid[posX][posY]='X';
		for (int i=0;i<=länge;i++)
		{
			Grid[posX][posY+=1] = 'X';
		}
	}

			if (ausrichtung == 270) 
	{
		Grid[posX][posY]='X';
		for (int i=0;i<=länge;i++)
		{
			Grid[posX=-1][posY] = 'X';
		}
	}

				if (ausrichtung == 0) 
	{
		Grid[posX][posY]='X';
		for (int i=0;i<=länge;i++)
		{
			Grid[posX][posY=-1] = 'X';
		}
	}



};

void schifflist (int anzahl)
{

	std::list<ship*> liste;

	for (int i=0;i<=anzahl;i++)
	{
		liste.push_back(new ship());
		liste.getAt(i).zw(Längen,90,i);
		//Wenn ich hier etwas einfügen möchte z.b liste.push_back(new ship().zw(Längen,90,i)); mag er das auch nicht ich bin für jede Hilfe dankbar!
		

	}
	
}


void gridzeichnend () 
{
	for (int i=0;i<=9;i++)
	{
		for(int k=0;k<=9;k++)
		{
			Grid[i][k] = '~';
		}
	}
}


int main (void) 
{
gridzeichnend ();


}
 
Sorry getAt(int) ist gar nicht in der STL drin. Das musste dir wohl selber programmieren. Am besten machste ne neue Klasse die als Variable eine Liste hat und erweiterst dort deine Methoden um die Dinge, die du für die Liste brauchst.

Code:
liste.push_back(new ship().zw(Längen,90,i));
Ich glaube nicht, dass das so geht. Du musst erst erstmal ein Objekt des Typen Schiff machen und die Methode drauf anwenden, bevor du ein push_back vornimmst. Meines Erachtens geht das nur in dieser Form direkt: liste.push_back( new ship("bla",90,i) ); .

Wenn ein Objekt bereits existiert ginge auch liste.push_back( objekt.zw(Längen,90,i));

Kann mich irren, hab grad keinen Compiler zur Hand.

Schöne Grüße,
Sam
 
Hm das natürlich blöd.. tja werd mal schauen wie ichs dann mache. Ansonsten muss ich das wirklich statisch machen, aber es kann doch nicht sein, dass man in c++ keine dynamischen Klassen oder zur Not structs nehmen kann.
Also habs mal soweit geändert er scheint die angepasste Klasse soweit schon zu nehmen, jetzt müsste ich die Elemnte nur noch aus der Liste bekommen und anpassen können:D.

PHP:
// ship.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <list>
#include <iostream>
using namespace std;

#define xG 10
#define yG 10

char Grid [10][10];
int Längen[6]={2,4,1,3,4,2};

class ship {

private:
	int länge;
	int xy[2];

public:
	ship (){}
	ship (int a[],int ausrichtung,int id);
	//void zw (int a[],int ausrichtung,int id);
};


ship::ship(int a[],int ausrichtung,int id)
{   
	int posX= xy[1];
	int posY= xy[2];
	länge = a[id];
	if (ausrichtung == 90) 
	{
		Grid[posX][posY]='X';
		for (int i=0;i<=länge;i++)
		{
			Grid[posX+=1][posY] = 'X';
		}
	}

		if (ausrichtung == 180) 
	{
		Grid[posX][posY]='X';
		for (int i=0;i<=länge;i++)
		{
			Grid[posX][posY+=1] = 'X';
		}
	}

			if (ausrichtung == 270) 
	{
		Grid[posX][posY]='X';
		for (int i=0;i<=länge;i++)
		{
			Grid[posX=-1][posY] = 'X';
		}
	}

				if (ausrichtung == 0) 
	{
		Grid[posX][posY]='X';
		for (int i=0;i<=länge;i++)
		{
			Grid[posX][posY=-1] = 'X';
		}
	}



};

void schifflist (int anzahl)
{

	std::list<ship*> liste;

	for (int i=0;i<=anzahl;i++)
	{
		liste.push_back(new ship(Längen,90,i));
//		liste.getAt(i).zw(Längen,90,i);
		
		

	}
	
}


void gridzeichnend () 
{
	for (int i=0;i<=9;i++)
	{   
		
		for(int k=0;k<=9;k++)
		{
			Grid[i][k] = '~';
			
		}
	}
}

void gridausgabe () 
{
	for (int i=0;i<=9;i++)
	{   
		printf ("\n");
		for(int k=0;k<=9;k++)
		{
			printf("%c", Grid[i][k]);
			
		}
	}
}



int main (void) 
{
gridzeichnend ();
gridausgabe ();


}









//Vereinbarung
//1. Es werden immer die Koordinaten des Bugs angeben, anschließend die Gradzalh in die das Heck zeigt
 
Zuletzt bearbeitet:
So schwierig ist das mit dem getAt doch nicht.

Bsp:
Code:
// NeueTolleListenKlasse.cpp

Schiff* NeueTolleListenKlasse::getAt(int pos){
     int count = 0;
     std::list<Schiff*>::iterator it;

     for(it=meineListe.begin(); it!=meineListe.end(); ++it){
          if(pos == count){
               return it;
          } else {
               count++;
          }
     }
     return NULL; //hier Code für Fehlerbehandlung falls int pos ins "Leere" zeigt
}

Wie gesagt, hab keinen Compiler zur Hand, aber so in etwa ginge das.
 
Zuletzt bearbeitet:
Hm k stimmt hast recht sieht echt nicht so wild aus.. werds mal probieren.

Und Danke für deine Geduld ist das zweite mal das ich mich an KLassen in C probieren und Listen noch nie :D.

hm wer ne Idee warum das Programm jetzt auf einmal abkackt?

PHP:
// ship.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <list>
#include <iostream>
using namespace std;

#define xG 10
#define yG 10

char Grid [10][10];
int Längen[6]={2,4,1,3,4,2};



class ship {

private:
	int länge;
	int xy[2];

public:
	ship (){}
	ship (int a[],int ausrichtung,int id);
	void zw (int a[],int ausrichtung,int id);
};


ship::ship(int a[],int ausrichtung,int id)
{   
	int posX= xy[1];
	int posY= xy[2];
	länge = a[id];
	if (ausrichtung == 90) 
	{
		Grid[posX][posY]='X';
		for (int i=0;i<=länge;i++)
		{
			Grid[posX+=1][posY] = 'X';
		}
	}

		if (ausrichtung == 180) 
	{
		Grid[posX][posY]='X';
		for (int i=0;i<=länge;i++)
		{
			Grid[posX][posY+=1] = 'X';
		}
	}

			if (ausrichtung == 270) 
	{
		Grid[posX][posY]='X';
		for (int i=0;i<=länge;i++)
		{
			Grid[posX=-1][posY] = 'X';
		}
	}

				if (ausrichtung == 0) 
	{
		Grid[posX][posY]='X';
		for (int i=0;i<=länge;i++)
		{
			Grid[posX][posY=-1] = 'X';
		}
	}



};

void schifflist (int anzahl)
{
	
	std::list<ship*> liste;

	for (int i=0;i<=anzahl;i++)
	{
		liste.push_back(new ship(Längen,90,i));
//		liste.getAt(i).zw(Längen,90,i);
		
		

	}
	
}


void gridzeichnend () 
{
	for (int i=0;i<=9;i++)
	{   
		
		for(int k=0;k<=9;k++)
		{
			Grid[i][k] = '~';
			
		}
	}
}

void gridausgabe () 
{
	for (int i=0;i<=9;i++)
	{   
		printf ("\n");
		for(int k=0;k<=9;k++)
		{
			printf("%c", Grid[i][k]);
			
		}
	}
  printf ("\n");
}



int main (void) 
{

gridzeichnend ();
schifflist(6);
gridausgabe ();



}









//Vereinbarung
//1. Es werden immer die Koordinaten des Bugs angeben, anschließend die Gradzalh in die das Heck zeigt

Gruß
 
Zuletzt bearbeitet:
Zurück
Oben