Archief - [PROG]C++ new 2dim array probleem

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Marbug

Legacy Member
Code:
#include <iostream>
#include <string>
using namespace std;

//special chars
const char PERSON1 = 1;
const char PERSON2 = 2;
const char HEAR = 3;
const char SQUR = 4;
const char TREE = 5;
const char KLVR = 6;
const char SND1 = 7;

const char END1 = '-';
const char END2 = '|';
const char OBJ_FLOOR = ' ';

class map
{
private:
	char *mapchr;
public:
	string mapname;
	map(string map_name,size_t MAP_ROW,size_t MAP_COLOMS);
	map & operator=(const char & map_self);
};
map::map(string map_name,size_t MAP_ROW,size_t MAP_COLOMS)
{
	mapname = map_name;
	mapchr = new char[MAP_ROW][MAP_COLOMS];
}
map & map::operator=(const char & map_self)
{
	*mapchr = map_self;
	return *this;
}
inline void maps(void)
{
map map1("1st map",50,50);
//map1={OBJ_FLOOR}

}
compiler error:
d:\documents\c++\game v1\map.h(30) : error C2540: non-constant expression as array bound
d:\documents\c++\game v1\map.h(30) : error C2440: '=' : cannot convert from 'char (*)[1]' to 'char *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
wanneer ik die 2dimensionele array wil aanmaken lukt het niet en geeft hij de volgende errors, iemand dat mij daar ff mee kan helpen?
ik heb al vele combinaties enzo geprobeerd, maar het lukte mar ni :(
alvast bedankt

killgore

Legacy Member
Code:
#include <iostream>
#include <string>
using namespace std;

//special chars
const char PERSON1 = 1;
const char PERSON2 = 2;
const char HEAR = 3;
const char SQUR = 4;
const char TREE = 5;
const char KLVR = 6;
const char SND1 = 7;

const char END1 = '-';
const char END2 = '|';
const char OBJ_FLOOR = ' ';

class map
{
private:
	char **mapchr;
public:
	string mapname;
	map(string map_name,size_t MAP_ROW,size_t MAP_COLOMS);
	map & operator=(const char & map_self);
};
map::map(string map_name,size_t MAP_ROW,size_t MAP_COLOMS)
{
	mapname = map_name;
	mapchr = new char*[MAP_ROW];
	for(size_t i =0; i<MAP_ROW;i++)
		mapchr[i] = new char[MAP_COLOMS];
}
map & map::operator=(const char & map_self)
{
	**mapchr = map_self;
	return *this;
}
inline void maps(void)
{
map map1("1st map",50,50);
//map1={OBJ_FLOOR}

}

edit: vo uitleg hierover: zie ergens hieronder die topic over meerdimensionale arrays alloceren in C, is zelfde principe ;), ier gebruikte gewoon new ipv malloc.

Marbug

Legacy Member
bedankt voor de grote hulp :), maar ik heb namelijk nog een probleem en dat is dat die zegt dat die mapchr geen array is :s
hoe kan ik die dan als array gebruike?
ik heb de code namelijk al wat aangepast:
Code:
#ifndef _MAP_H
#define _MAP_H

#include <iostream>
#include <string>
using namespace std;

//special chars
const char PERSON1 = 1;
const char PERSON2 = 2;
const char HEAR = 3;
const char SQUR = 4;
const char TREE = 5;
const char KLVR = 6;
const char SND1 = 7;

const char END1 = '-';
const char END2 = '|';
const char OBJ_FLOOR = ' ';

class map
{
private:
	char **mapchr;
	size_t MAP_ROW;
	size_t MAP_COLOMS;
	string mapname;
public:
	map(string map_name,size_t MAP_ROW,size_t MAP_COLOMS);
	map & operator=(const char & map_self);
	int map_rows(){return MAP_ROW;}
	int map_coloms(){return MAP_COLOMS;}
	char map_self(){return **mapchr;}
	string map_name(){return mapname;}
};
map::map(string map_name,size_t ROWS,size_t COLOMS)
{
	mapname = map_name;
	MAP_ROW = ROWS;
	MAP_COLOMS = COLOMS;
	mapchr = new char*[ROWS];
	for(size_t i =0; i<ROWS;i++)
		mapchr[i] = new char[COLOMS];
}
map & map::operator=(const char & map_self)
{
	**mapchr = map_self;
	return *this;
}
#endif
nu staat er momentel dit in een .cpp bestandmaar die moet ik nog aanpassen
Code:
#include "map.h"
//#include "ldsts.h"
/*
inline void maps(void)
{
map map1("1st map",50,50);
map1= TREE;
}
*/
void show_map(void)
{
	map map1("1st map",50,50);
	map1= TREE;
	map *map_use = &map1;
	size_t m_rows = map_use->map_rows();
	size_t m_coloms = map_use->map_coloms();
	char temp_map = map_use->map_self();

	for(int l=0;l<m_rows+2;l++){cout << "=";}
	cout << endl;
	for(int i=0;i<m_coloms;i++)
	{
		cout << "|";
		for(int o=0;o<m_coloms;o++)
		{
			cout << temp_map[i][o];
		}
	cout << "|" << endl;
	}
	for(int k=0;k<m_coloms+2;k++){cout << "=";}
	cout << endl;
}
maar zoals ik dus zei werkt die array niet :s
dit was al vanaf mijn eeste post daarom staaner // voor de map1={OBJ_FLOOR};
dit komtzeker door die pointer?

killgore

Legacy Member
char **temp_map = map_use->map_self();

en map_self:
char** map_self(){return mapchr;}

anders geefde gewoon het eerste karakter (dus op [0][0]) terug van die 2D array.

Marbug

Legacy Member
ik kan u rg bedanken voor de hulp :) alles werkt nu zoals ik wou :)
alleen heb ik nog 1 probleem :(, das wanneer ik aan de array tekens wil geven lu het niet en werkt dat alleen voor de eerste karakter, ik heb met behulp van de aanpassingskes die ik heb kunnen doen door u geprobeerd om het op te lossen, maar het lukt niet:
Code:
map & map::operator=(const char & map_self)
{
	**mapchr = map_self;
	return *this;
}
volgens mij zit het probleem hier ergens.
Maar als het rechstreeks oproep uit mapchr, wanneer ik hem natuurlijk uit private zet dan lukt et ook niet. is daar soms een oplossng voor ? anders probeer ik een nieuw scriptje te maken zonder new en zonder pointers

error:
D:\Documents\C++\game v1\map.cpp(13) : error C2059: syntax error : '{'
D:\Documents\C++\game v1\map.cpp(13) : error C2143: syntax error : missing ';' before '{'
D:\Documents\C++\game v1\map.cpp(13) : error C2143: syntax error : missing ';' before '}'
bij:
map1={TREE};

als er geen makkelijke en/of snelle oplossing is gaik een simpele klasse maken waar ik de array aanmaak zonder new (maar dit zou ik dus niet willen doen)

killgore

Legacy Member
Wa wilde juist doen met die = operator :s?
edit: nvm, zie het al

da gaat dus niet :)

Marbug

Legacy Member
in die 2D array tekens insteken, zonder die mapchr na die map1 (object) te plakken, maar dat lukt dus ook niet
edit nooooo :(
:D maar is er dan enige oplossing om iets in die array te steken? :o want ik zou het raar vinden als ge wel een array kunt aanmaken maar niet kunt insteken :s

killgore

Legacy Member
Marbug zei:
:D maar is er dan enige oplossing om iets in die array te steken? :o want ik zou het raar vinden als ge wel een array kunt aanmaken maar niet kunt insteken :s
ja, ma ge kunt niet met {} werken:

Code:
map & map::operator=(const char **map_self)
{
	//**mapchr = map_self;
	if(sizeof(map_self)!=MAP_ROW*MAP_COLOMS) return *this;
	if(sizeof(map_self[0])!=MAP_COLOMS) return *this;
	for(size_t i =0; i<MAP_ROW;i++)
	{
		for(size_t j = 0; j<MAP_ROW;j++)
		{
			mapchr[i][j]=map_self[i][j];
		}
	}
	return *this;
}

code-vb dan:
Code:
char test[2][5] = {{'a','b'},{'c','d'}};
map1=(const char**)(test);

edit: nvm, er is iet fout met die sizeofs, zal prolly nie werken (zijn pointers, dus zal altijd 4 geven).

Marbug

Legacy Member
ik denk da'k da scriptje helemaal ga hermaken met makkelijker dingens, het is gewoon een heel geknoei tot hietoe, maar toch bedankt voor de hulp ik heb er wat mee geleerd :)

Hale

Legacy Member
:offtopic:

kleine opmerking trouwens : ik zie da ge ergens een functie specifiek inline maakt... ik raad aan van da ni te doen.
Het is nl. moeilijk te voorspellen of iets inline definiëren wel degelijk snelheidswinst oplevert. ( er kan bv geheugen trashing optreden als die functie vaak wordt aangeroepen en uw programma daardoor ni meer in het geheugen zou passen in zijn geheel => veel page faults => veel geswap => trager ).
Het beste is nog zo een optimalisaties over te laten aan de compiler, die zal meer dan waarschijnlijk een betere inschatting maken of een functie al dan niet inline gecompiled moet worden.

killgore

Legacy Member
ansi/iso standaard heeft hij 5 inline functies (4 in de klasse, 1 gewone :p).

Visual c++ werkt daar vrij vlot mee eigenlijk, ge moet al hun eigen operator (__forceinline) gebruiken om het 100% zeker inline te zijn, en dan nog gaan bv. recursieve methoden/functies vrij zeker geweigerd worden (tenzij ze 100% zeker niet dieper gaan dan een vooringesteld getal :p). Kweet niet hoe het met andere compilers zit.

Voor de rest is geheugentrashing een vrij onwaarschijnlijke gebeurtenis die vaak eerder te maken heeft met slechte programmatie en het inline maken van zeer complexe methoden die dus nooit inline mogen zijn.

Ma ge zijt wel juist om zeker niet te veel inline te maken. Goeie zaken om bv. inline te maken zijn formule-functies (bv. voor vectorieel product, absolute waarde, ...). Andere goeie inline methoden zijn setters (zowel van klassen als iets uitgebreidere variabele initialisatie) en getters van klassen :). Dit zijn allemaal vrij simpele zaken die het zeker waard zijn voor inline te komen. 90% v/d mensen programmeren vele van die zaken (in OOP) dan ook inline :). kortweg, eigenlijk alles wa ge ook in een macro zou kunnen steken maar de macro-functionaliteit niet nodig heeft :).
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan